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_trunc1is truncated “on the fly” as MPS is being built whereaspsi_trunc2has 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)