Hi,
I want to clarify a confusion regarding the uniqueness of MPS truncation with maxdim
set, and if not unique, how to know which convention is employed when. First, I’ll explain and then share full working code at the bottom.
Given a pure state |\phi \rangle as a vector phi
, I constructed its full MPS and a truncated MPS using
psi = MPS(phi, sites)
psi_trunc1 = MPS(phi,sites;maxdim=1)
Out of curiosity, I then tried truncating differently using
psi_trunc2 = truncate(psi; maxdim=1)
psi_trunc3 = truncate(psi_trunc1; maxdim=1)
which yields
norm(psi_trunc1 - psi_trunc2) == 0.16173304677093372 # true
norm(normalize(psi_trunc1) - normalize(psi_trunc2)) == 0.2795589946197962 # true
showing they are different. They are still different when compared to original psi
as we see here
norm(psi - normalize(psi_trunc1)) == 0.920470267476006 # true
norm(psi - normalize(psi_trunc2)) == 0.9161358132015018 # true
Showing that—in this sense— psi_trunc2
is a better truncated approximation of psi
then psi_trunc1
. At the same time,
norm(psi_trun1 - psi_trunc3) == 2.31492981972618e-16 # true
so truncate
does not improve any pre-truncated MPS.
My questions are as follows
- Is this non-uniqueness intended? My guess is that
psi_trunc1
is truncated “on the fly” as MPS is being built whereaspsi_trunc2
has a different convention since its pre-built. It’s not totally obvious these should be different, but it is believable. - If (1) is true, how do I know which convention is being employed when I call truncate?
Thanks for any help! I will continue to investigate, but I wanted to go ahead and ask a question in case diving into source code gets my head spinning.
Full code now shared
using RandomMatrices, ITensors
# form random pure state
n = 5
d = 2^n
u = rand(Haar(2), d)
phi = zeros(d)
phi[1] = 1.0
phi = u * phi
# for reproroducibility, just hard-code phi as mine like this
phi = ComplexF64[0.02082573551834055 - 0.011486940165270298im, -0.2209176466147129 + 0.14816797059292863im, 0.1904930195782806 + 0.20009461043825688im, -0.03695721322295389 - 0.12055214694742081im, 0.11413886371841545 + 0.22280207052268539im, -0.07005961574810946 - 0.12168592757238036im, 0.0782150912211017 + 0.07564564577407752im, -0.014237075147016814 + 0.0332819161182519im, -0.020029723418169963 - 0.03126543581612971im, 0.05916327854104368 - 0.12211287691683469im, -0.11449570927724294 + 0.0770756665654759im, -0.3443895945692257 - 0.12475781451160668im, -0.0007183900070949906 - 0.04456470829809399im, -0.0594125322384794 - 0.1165167655251047im, 0.07203368525918435 + 0.16017081679131456im, -0.03898051396853872 - 0.06801691967269073im, -0.17641138849666008 - 0.11775259193972928im, -0.03716007094152457 + 0.3109832551976374im, -0.03335159670380818 - 0.011845017761382111im, -0.14999890976471794 + 0.03660844117005592im, 0.1500551129063466 - 0.006042945034976571im, 0.10527627885655418 - 0.05181822327637im, 0.1280788988900208 + 0.061264981456989415im, 0.035503129122248164 - 0.03382504210110942im, 0.0959318299558157 + 0.031605012897989386im, 0.1668068223126639 + 0.12579753067096974im, -0.03888604840428345 + 0.13506435105185532im, -0.28933580176893675 + 0.043137765686808924im, -0.1009587769017696 - 0.09855299909683869im, 0.02905982650685869 + 0.16738610563855635im, -0.12115355412340761 + 0.19409738468496976im, -0.12080327793602866 - 0.09938303044950068im]
# get matrix product state representation from above
sites = siteinds(2, n)
psi = MPS(phi, sites)
psi_trunc1 = MPS(phi,sites;maxdim=1)
psi_trunc2 = truncate(psi; maxdim=1)
psi_trunc3 = truncate(psi_trunc1; maxdim=1)