-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ENHANCEMENT] Expose truncerr
in calls to truncate!
#96
Comments
I think this is a good feature for us to pursue, in the sense of making this information available through a return value. Probably, though, we should do it by having |
Hey Miles - sounds good. When I originally posted this I also was thinking of For the named tuple approach, were you thinking of something like this? If not, do you have any examples within the current ITensor code I could take a look at for reference? function truncate!(
::Algorithm"frobenius", M::AbstractMPS; site_range=1:length(M), return_spec=false, kwargs...
)
N = length(M)
spec = (;truncerr=zeros(N-1)) # calling it spec to keep it generic? Since other things might be added in the future
# Left-orthogonalize all tensors to make
# truncations controlled
orthogonalize!(M, last(site_range))
# Perform truncations in a right-to-left sweep
for (idx, j) in enumerate(reverse((first(site_range) + 1):last(site_range)))
rinds = uniqueinds(M[j], M[j - 1])
ltags = tags(commonind(M[j], M[j - 1]))
U, S, V, spec = svd(M[j], rinds; lefttags=ltags, kwargs...)
spec.truncerr[idx] = spec.truncerr
M[j] = U
M[j - 1] *= (S * V)
setrightlim!(M, j)
end
if return_spec
return M, spec
else
return M
end
end |
…m (#1516) The purpose of this commit is to allow the truncation error from an operation to be returned. This is the first step envisioned for that functionality. The spectrum and truncation error from calling svd() on ITensors is not accessible from calls to truncate! and truncate. This allows the Spectrum type (which contains the spectrum and the error) to be optionally returned. This required importing RankFactorization.Spectrum in ITensors (so an added import in imports.jl) and then slightly refactoring the definition of truncate! and truncate. This commit makes a named tuple with each element being "bond_n" where n is `1` to `N-1` bonds and each element of the named tuple corresponds to the Spectrum returned from the call to svd as the bonds are swept over during the call to truncate. All tests were run with 92979 passing and 73 broken. Total tests were 93052.
…m (#1516) The purpose of this commit is to allow the truncation error from an operation to be returned. This is the first step envisioned for that functionality. The spectrum and truncation error from calling svd() on ITensors is not accessible from calls to truncate! and truncate. This allows the Spectrum type (which contains the spectrum and the error) to be optionally returned. This required importing RankFactorization.Spectrum in ITensors (so an added import in imports.jl) and then slightly refactoring the definition of truncate! and truncate. This commit makes a named tuple with each element being "bond_n" where n is `1` to `N-1` bonds and each element of the named tuple corresponds to the Spectrum returned from the call to svd as the bonds are swept over during the call to truncate. All tests were run with 92979 passing and 73 broken. Total tests were 93052.
…m (#1516) The purpose of this commit is to allow the truncation error from an operation to be returned. This is the first step envisioned for that functionality. The spectrum and truncation error from calling svd() on ITensors is not accessible from calls to truncate! and truncate. This allows the Spectrum type (which contains the spectrum and the error) to be optionally returned. This required importing RankFactorization.Spectrum in ITensors (so an added import in imports.jl) and then slightly refactoring the definition of truncate! and truncate. This commit makes a named tuple with each element being "bond_n" where n is `1` to `N-1` bonds and each element of the named tuple corresponds to the Spectrum returned from the call to svd as the bonds are swept over during the call to truncate. All tests were run with 92979 passing and 73 broken. Total tests were 93052.
Hello! Has there been any additional thoughts on this, or the interface it should follow? I just came across a situation again where it would have been nice to somehow recover the truncation error computed by I'm happy to develop a PR if we could agree on what this should look like. |
What I would have in mind is: function truncate!(
::Algorithm"frobenius", M::AbstractMPS; site_range=1:length(M), (truncation_error!)=nothing, kwargs...
)
# Code
if !isnothing(truncation_error!)
truncation_error![] = truncerr
end
return M
end So if a user wants the truncation error they can call it like this: truncation_error_ref = Ref{Vector{Float64}}()
truncate!(M; (truncation_error!)= truncation_error_ref)
truncation_error = truncation_error_ref[] Basically, the design is that you pass a reference that is able to store the truncation errors that gets written into so the user can access the truncation errors. |
truncerr
in calls to truncate!
truncerr
in calls to truncate!
Hello,
I'd be interested on thoughts here. I think it would be useful to be able to get the truncation error corresponding to a call to
truncate!
.Currently
truncate!
as defined inabstractmps.jl
only returns the MPS, but each truncation that is performed is a call tosvd
which returns theTruncSVD
type which contains the truncation error.Maybe one solution then would be to allocate a small vector with as many elements as there are bonds of the MPS. Then in the right to left sweep just collect the truncation error into each element and have that be optionally returned (could make it a kwarg).
If this functionality is already available then please just disregard and close this feature request.
Here is some psuedocode for what I had in mind (I've not actually tested this to see if it works, just what I was thinking). If this is something that sounds reasonable, I can prepare the pull request. I can make the corresponding updates to
truncate
as well.The text was updated successfully, but these errors were encountered: