-
Notifications
You must be signed in to change notification settings - Fork 25
[WIP] Environment initialization for CTMRG #264
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
base: master
Are you sure you want to change the base?
Changes from all commits
cb6b2a3
2b32182
c1216f4
2a6f121
78cef7c
c20aab3
11d8535
10ea2ef
991ecc7
707728d
4996e1b
c5855c0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| abstract type InitializationStyle end | ||
| struct ProductStateInitialization <: InitializationStyle end | ||
| struct RandomInitialization{F} <: InitializationStyle | ||
| f::F | ||
| RandomInitialization(f::F = randn) where {F} = new{F}(f) | ||
| end | ||
| struct ApplicationInitialization <: InitializationStyle end | ||
|
|
||
| function initialize_environment( | ||
Yue-Zhengyuan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| elt::Type{<:Number}, | ||
| n::InfiniteSquareNetwork, | ||
| alg::RandomInitialization, | ||
| virtual_spaces... = oneunit(spacetype(n)), | ||
| ) | ||
| return CTMRGEnv(alg.f, elt, n, virtual_spaces...) | ||
| end | ||
|
|
||
| function initialize_environment( | ||
| elt::Type{<:Number}, | ||
| n::InfiniteSquareNetwork, | ||
| ::ProductStateInitialization, | ||
Yue-Zhengyuan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| virtual_spaces... = oneunit(spacetype(n)), | ||
| ) | ||
| i = one(sectortype(n)) | ||
| env = CTMRGEnv(ones, elt, n, virtual_spaces...) | ||
| for (dir, r, c) in Iterators.product(axes(env)...) | ||
| @assert i in blocksectors(env.corners[dir, r, c]) | ||
| for (c, b) in blocks(env.corners[dir, r, c]) | ||
| b .= 0 | ||
| c == i && (b[1, 1] = 1) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We definitely need a test with fermionic iPEPS on this, in case parity-odd elements become -1 due to twists. |
||
| end | ||
| end | ||
| return env | ||
| end | ||
|
|
||
| function initialize_environment( | ||
| elt::Type{<:Number}, | ||
| n::InfiniteSquareNetwork, | ||
| ::ApplicationInitialization, | ||
| trscheme::TruncationScheme; | ||
| boundary_alg = (; | ||
| alg = :sequential, tol = 1.0e-5, maxiter = 10, verbosity = -1, | ||
| ) | ||
|
Comment on lines
+41
to
+43
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I would imagine this being a part of the
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the For the algorithm being part of the If we make the algorithm a part of the struct, struct ApplicationInitialization{A} <: InitializationStyle
alg::A
endwe could get in the algorithm based on the object here through something like function ApplicationInitialization(network::InfiniteSquareNetwork; kwargs...)
return ApplicationIntialization(CTMRGAlgorithm(; kwargs...))
endThen I just move the defaults there, and it cleans up the |
||
| ) | ||
| boundary_alg = (; boundary_alg..., trscheme) # merge trscheme with optional alg definition | ||
| env = initialize_environment(elt, n, ProductStateInitialization()) | ||
| env, = leading_boundary(env, n; boundary_alg...) | ||
| return env | ||
| end | ||
|
|
||
| function initialize_environment(n::InfiniteSquareNetwork, args...; kwargs...) | ||
| return initialize_environment(scalartype(n), n, args...; kwargs...) | ||
| end | ||
| function initialize_environment(A::Union{InfinitePEPS, InfinitePartitionFunction}, args...; kwargs...) | ||
| return initialize_environment(scalartype(A), A, args...; kwargs...) | ||
| end | ||
| function initialize_environment(elt::Type{<:Number}, A::Union{InfinitePEPS, InfinitePartitionFunction}, args...; kwargs...) | ||
| return initialize_environment(elt, InfiniteSquareNetwork(A), args...; kwargs...) | ||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| using Test | ||
| using TensorKit | ||
| using PEPSKit | ||
| using Random | ||
|
|
||
| using MPSKitModels: classical_ising | ||
|
|
||
| sd = 12345 | ||
|
|
||
| # toggle symmetry, but same issue for both | ||
| symmetries = [Z2Irrep, Trivial] | ||
|
|
||
| χ = 20 | ||
| tol = 1.0e-4 | ||
| maxiter = 1000 | ||
| verbosity = 2 | ||
| trscheme = FixedSpaceTruncation() | ||
| boundary_alg = (; | ||
| alg = :simultaneous, | ||
| tol, | ||
| verbosity, | ||
| trscheme, | ||
| maxiter, | ||
| ) | ||
|
|
||
| @testset "CTMRG environment initialization for critical ising with $S symmetry (#255)" for S in symmetries | ||
| # initialize | ||
| T = classical_ising(S) | ||
| O = T[1] | ||
| n = InfinitePartitionFunction([O O; O O]) | ||
| Venv = S == Z2Irrep ? Z2Space(0 => χ / 2, 1 => χ / 2) : ℂ^χ | ||
| P = space(O, 2) | ||
|
|
||
| # random, doesn't converge | ||
| Random.seed!(sd) | ||
| env0_rand = initialize_environment(n, RandomInitialization(), Venv) | ||
| env_rand, info = leading_boundary(env0_rand, n; boundary_alg...) | ||
| @test_broken info.convergence_error ≤ tol | ||
|
|
||
| # embedded product state, converges | ||
| Random.seed!(sd) | ||
| env0_prod = initialize_environment(n, ProductStateInitialization(), Venv) | ||
| env_prod, info = leading_boundary(env0_prod, n; boundary_alg...) | ||
| @test info.convergence_error ≤ tol | ||
|
|
||
| # grown product state, converges | ||
| Random.seed!(sd) | ||
| env0_appl = initialize_environment(InfiniteSquareNetwork(n), ApplicationInitialization(), truncdim(χ)) | ||
| env_appl, info = leading_boundary(env0_appl, n; boundary_alg...) | ||
| @test info.convergence_error ≤ tol | ||
| end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having a look at the argument order, I think something feels a little off with the
virtual_spacesas final argument to me.(Disclaimer that everything that follows is subjective and therefore please do tell me to shut up if you disagree)
In general, most of our "algorithm functions" actually follow a very similar type of interface, based on the purpose of the arguments:
algorithm_function(init, operator, algorithm, [additional_optional_structures])With this in mind, I think I would try to make something like this work:
but I wonder if there is a more elegant solution for the
T, possibly just putting it in the keyword arguments. I don't think there are many occasions whereT != scalartype(network)is desired, and we can try to make this at least@constinferred?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't mind changing
Tto a keyword argument, the only reason I added it like this was to stay closer to the environment and state constructor signatures.The choice of position for the
virtual_spacesargument was purely pragmatic, as this is basically the only way I could make it compatible with the way the space specification in theCTMRGEnvconstructor works. Since the virtual space specification for the different directions works with optional positional arguments, puttingvirtual_spacesas the last positional argument was the only way to allow for more elaborate virtual space specifications as far as I could tell.If we want to move it, we would probably need some kind of
CTMRGEnvSpacesstructure which contains all the information on the virtual spaces in a single object that we can then put wherever we want. This is anyway something we might want to get rid of signatures likeCTMRGEnv(ComplexF64, randn, network, virtual_spaces...)in favor of something likerandn(ComplexF64, spaces::CTMRGEnvSpaces). That's also part of the reason I introduced these_fill_environment_virtual_spacesmethods in #266, since these would come in handy when definingCTMRGEnvSpaces(network, virtual_spaces...). We can decide to do this first, and at the same time change how we internally specify all other space specification.Starting from the assumption that
virtual_spacesneeds (at least right now) to be the last positional argument, my reasoning for the argument order was to have something likeinitialize_environment([T,] network, alg, virtual_space_specification)The way you would specify a space depends on the algorithm. For product state or random initialization, the virtual space specification is just an actual space specification as it would be passed to the constructor, hence the whole reason the space specification is positioned last. For an
ApplicationInitialization, a full space specification doesn't really make sense, what matters then is how the virtual spaces are truncated during the application iterations. That's why I chose to specify spaces here using aTruncationScheme, and also why thetrschemewas the last positional argument in theinitialize_environmentsignature forApplicationInitialization.