Skip to content

Why using weighted singular values for the truncation? #184

@Phy-David-Zhang

Description

@Phy-David-Zhang

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
end

It 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...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions