-
Notifications
You must be signed in to change notification settings - Fork 56
Closed
Description
In the file truncation.jl, I saw the following function:
# auxiliary function
function _findnexttruncvalue(Σdata, truncdim::SectorDict{I,Int}, p::Real) where {I<:Sector}
# early return
(isempty(Σdata) || all(iszero, values(truncdim))) && return nothing
# find some suitable starting candidate
cmin = findfirst(>(0), truncdim)
weightedσmin = dim(cmin)^inv(p) * Σdata[cmin][truncdim[cmin]]
# find the actual minimum singular value
for (c, σs) in Σdata
if truncdim[c] > 0
weightedσ = dim(c)^inv(p) * σs[truncdim[c]]
if weightedσ < weightedσmin
cmin, weightedσmin = c, weightedσ
end
end
end
return cmin
endIt seems to me that the truncation is based on the weighted singluar values, as
weightedσmin = dim(cmin)^inv(p) * Σdata[cmin][truncdim[cmin]]and
weightedσ = dim(c)^inv(p) * σs[truncdim[c]]In the non-Abelian case, singular values are weighted by the square root of the degeneracy of the corresponding sector. I am wondering why the singular values should be weighted in that way? Usually, one only truncates based on the singular values without weights. I ask because in some cases, the spin-0 sectors have the largest singular values, but smallest degeneracy. So sometimes the truncation truncates out the most important spin-0 sector...
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels