@@ -23,12 +23,12 @@ For a full description, see [`leading_boundary`](@ref). The supported keywords a
2323* `svd_alg::Union{<:SVDAdjoint,NamedTuple}`
2424* `projector_alg::Symbol=:$(Defaults. projector_alg) `
2525"""
26- struct SimultaneousCTMRG <: CTMRGAlgorithm
26+ struct SimultaneousCTMRG{P <: ProjectorAlgorithm } <: CTMRGAlgorithm
2727 tol:: Float64
2828 maxiter:: Int
2929 miniter:: Int
3030 verbosity:: Int
31- projector_alg:: ProjectorAlgorithm
31+ projector_alg:: P
3232end
3333function SimultaneousCTMRG(; kwargs... )
3434 return CTMRGAlgorithm(; alg= :simultaneous, kwargs... )
3737CTMRG_SYMBOLS[:simultaneous] = SimultaneousCTMRG
3838
3939function ctmrg_iteration(network, env:: CTMRGEnv , alg:: SimultaneousCTMRG )
40- enlarged_corners = dtmap(eachcoordinate(network, 1 : 4 )) do idx
41- return TensorMap(EnlargedCorner(network, env, idx))
42- end # expand environment
40+ coordinates = eachcoordinate(network, 1 : 4 )
41+ T_corners = Base. promote_op(
42+ TensorMap ∘ EnlargedCorner, typeof(network), typeof(env), eltype(coordinates)
43+ )
44+ enlarged_corners′ = similar(coordinates, T_corners)
45+ enlarged_corners:: typeof (enlarged_corners′) =
46+ dtmap!!(enlarged_corners′, eachcoordinate(network, 1 : 4 )) do idx
47+ return TensorMap(EnlargedCorner(network, env, idx))
48+ end # expand environment
4349 projectors, info = simultaneous_projectors(enlarged_corners, env, alg. projector_alg) # compute projectors on all coordinates
4450 env′ = renormalize_simultaneously(enlarged_corners, projectors, network, env) # renormalize enlarged corners
4551 return env′, info
@@ -72,25 +78,36 @@ enlarged corners or on a specific `coordinate`.
7278function simultaneous_projectors(
7379 enlarged_corners:: Array{E,3} , env:: CTMRGEnv , alg:: ProjectorAlgorithm
7480) where {E}
75- proj_and_info = dtmap(eachcoordinate(env, 1 : 4 )) do coordinate
76- coordinate′ = _next_coordinate(coordinate, size(env)[2 : 3 ]. .. )
77- trscheme = truncation_scheme(alg, env. edges[coordinate[1 ], coordinate′[2 : 3 ]. .. ])
78- return simultaneous_projectors(
79- coordinate, enlarged_corners, @set(alg. trscheme = trscheme)
80- )
81- end
81+ coordinates = eachcoordinate(env, 1 : 4 )
82+ T_dst = Base. promote_op(
83+ simultaneous_projectors,
84+ NTuple{3 ,Int},
85+ typeof(enlarged_corners),
86+ typeof(env),
87+ typeof(alg),
88+ )
89+ proj_and_info′ = similar(coordinates, T_dst)
90+ proj_and_info:: typeof (proj_and_info′) =
91+ dtmap!!(proj_and_info′, coordinates) do coordinate
92+ return simultaneous_projectors(coordinate, enlarged_corners, env, alg)
93+ end
8294 return _split_proj_and_info(proj_and_info)
8395end
8496function simultaneous_projectors(
85- coordinate, enlarged_corners:: Array{E,3} , alg:: HalfInfiniteProjector
97+ coordinate, enlarged_corners:: Array{E,3} , env, alg:: HalfInfiniteProjector
8698) where {E}
87- coordinate′ = _next_coordinate(coordinate, size(enlarged_corners)[2 : 3 ]. .. )
99+ coordinate′ = _next_coordinate(coordinate, size(env)[2 : 3 ]. .. )
100+ trscheme = truncation_scheme(alg, env. edges[coordinate[1 ], coordinate′[2 : 3 ]. .. ])
101+ alg′ = @set alg. trscheme = trscheme
88102 ec = (enlarged_corners[coordinate... ], enlarged_corners[coordinate′... ])
89- return compute_projector(ec, coordinate, alg)
103+ return compute_projector(ec, coordinate, alg′ )
90104end
91105function simultaneous_projectors(
92- coordinate, enlarged_corners:: Array{E,3} , alg:: FullInfiniteProjector
106+ coordinate, enlarged_corners:: Array{E,3} , env, alg:: FullInfiniteProjector
93107) where {E}
108+ coordinate′ = _next_coordinate(coordinate, size(env)[2 : 3 ]. .. )
109+ trscheme = truncation_scheme(alg, env. edges[coordinate[1 ], coordinate′[2 : 3 ]. .. ])
110+ alg′ = @set alg. trscheme = trscheme
94111 rowsize, colsize = size(enlarged_corners)[2 : 3 ]
95112 coordinate2 = _next_coordinate(coordinate, rowsize, colsize)
96113 coordinate3 = _next_coordinate(coordinate2, rowsize, colsize)
@@ -101,7 +118,7 @@ function simultaneous_projectors(
101118 enlarged_corners[coordinate2... ],
102119 enlarged_corners[coordinate3... ],
103120 )
104- return compute_projector(ec, coordinate, alg)
121+ return compute_projector(ec, coordinate, alg′ )
105122end
106123
107124"""
@@ -112,22 +129,33 @@ Renormalize all enlarged corners and edges simultaneously.
112129function renormalize_simultaneously(enlarged_corners, projectors, network, env)
113130 P_left, P_right = projectors
114131 coordinates = eachcoordinate(env, 1 : 4 )
115- corners_edges = dtmap(coordinates) do (dir, r, c)
116- if dir == NORTH
117- corner = renormalize_northwest_corner((r, c), enlarged_corners, P_left, P_right)
118- edge = renormalize_north_edge((r, c), env, P_left, P_right, network)
119- elseif dir == EAST
120- corner = renormalize_northeast_corner((r, c), enlarged_corners, P_left, P_right)
121- edge = renormalize_east_edge((r, c), env, P_left, P_right, network)
122- elseif dir == SOUTH
123- corner = renormalize_southeast_corner((r, c), enlarged_corners, P_left, P_right)
124- edge = renormalize_south_edge((r, c), env, P_left, P_right, network)
125- elseif dir == WEST
126- corner = renormalize_southwest_corner((r, c), enlarged_corners, P_left, P_right)
127- edge = renormalize_west_edge((r, c), env, P_left, P_right, network)
132+ T_CE = Tuple{cornertype(env),edgetype(env)}
133+ corners_edges′ = similar(coordinates, T_CE)
134+ corners_edges:: typeof (corners_edges′) =
135+ dtmap!!(corners_edges′, coordinates) do (dir, r, c)
136+ if dir == NORTH
137+ corner = renormalize_northwest_corner(
138+ (r, c), enlarged_corners, P_left, P_right
139+ )
140+ edge = renormalize_north_edge((r, c), env, P_left, P_right, network)
141+ elseif dir == EAST
142+ corner = renormalize_northeast_corner(
143+ (r, c), enlarged_corners, P_left, P_right
144+ )
145+ edge = renormalize_east_edge((r, c), env, P_left, P_right, network)
146+ elseif dir == SOUTH
147+ corner = renormalize_southeast_corner(
148+ (r, c), enlarged_corners, P_left, P_right
149+ )
150+ edge = renormalize_south_edge((r, c), env, P_left, P_right, network)
151+ elseif dir == WEST
152+ corner = renormalize_southwest_corner(
153+ (r, c), enlarged_corners, P_left, P_right
154+ )
155+ edge = renormalize_west_edge((r, c), env, P_left, P_right, network)
156+ end
157+ return corner / norm(corner), edge / norm(edge)
128158 end
129- return corner / norm(corner), edge / norm(edge)
130- end
131159
132160 return CTMRGEnv(map(first, corners_edges), map(last, corners_edges))
133161end
0 commit comments