Skip to content

Commit 7feeb45

Browse files
Type Stability and general improvements attempt (#118)
* remove PEPSKit dependency * comment on twistdual * formatting * first experiments * type annotation * changing types * type almost all of the ctm methods * fix bug in in BTRG * use eltype of central tensor for bond tensor initialization * k is a float in BTRG * fix type in HOTRG constructor * fix constructor slooptnr * fix isreal bug * fix order of operations * attempt fix for ImpurityHOTRG * same fix for impurityTRG --------- Co-authored-by: sanderdemeyer <sander.demeyer@ugent.be> Co-authored-by: Sander De Meyer <74001142+sanderdemeyer@users.noreply.github.com>
1 parent 8da83bf commit 7feeb45

23 files changed

Lines changed: 278 additions & 244 deletions

Project.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,17 @@ KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77"
99
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1010
LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36"
1111
OptimKit = "77e91f04-9b3b-57a6-a776-40b61faaebe0"
12-
PEPSKit = "52969e89-939e-4361-9b68-9bc7cde4bdeb"
1312
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1413
TensorKit = "07d1fe3e-3e46-537d-9eac-e9e13d0d4cec"
1514
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
1615

1716
[compat]
1817
DocStringExtensions = "0.9.4"
19-
KrylovKit = "0.9.5"
2018
LoggingExtras = "~1.0"
2119
OptimKit = "0.4.0"
22-
PEPSKit = "0.6"
23-
TensorKit = "0.14"
2420
Zygote = "0.7.7"
2521
julia = "1.11"
22+
TensorKit = "0.14"
2623

2724
[extras]
2825
QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"

src/TNRKit.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ using TensorKit, LinearAlgebra
33
using LoggingExtras, Printf
44
using KrylovKit
55
using OptimKit, Zygote
6-
using PEPSKit: InfinitePartitionFunction, CTMRGEnv
7-
using PEPSKit: network_value, twistdual, twistdual!
86
using DocStringExtensions
97

108
# stop criteria
@@ -97,4 +95,6 @@ include("utility/projectors.jl")
9795

9896
include("utility/blocking.jl")
9997
export block_tensors
98+
99+
include("utility/network_value.jl")
100100
end

src/schemes/atrg.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ $(TYPEDFIELDS)
2323
### References
2424
* [Adachi et. al. Phys. Rev. B 102 (2020)](@cite adachiAnisotropicTensorRenormalization2020)
2525
"""
26-
mutable struct ATRG <: TNRScheme
27-
T::TensorMap
26+
mutable struct ATRG{E, S, TT <: AbstractTensorMap{E, S, 2, 2}} <: TNRScheme{E, S}
27+
"Central tensor"
28+
T::TT
2829

29-
function ATRG(T::TensorMap{E, S, 2, 2}) where {E, S}
30-
return new(T)
30+
function ATRG(T::TT) where {E, S, TT <: AbstractTensorMap{E, S, 2, 2}}
31+
return new{E, S, TT}(T)
3132
end
3233
end
3334

src/schemes/atrg3d.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ $(TYPEDFIELDS)
2323
### References
2424
* [Adachi et. al. Phys. Rev. B 102 (2020)](@cite adachiAnisotropicTensorRenormalization2020)
2525
"""
26-
mutable struct ATRG_3D <: TNRScheme
27-
T::TensorMap
26+
mutable struct ATRG_3D{E, S, TT <: AbstractTensorMap{E, S, 2, 4}} <: TNRScheme{E, S}
27+
"Central tensor"
28+
T::TT
2829

29-
function ATRG_3D(T::TensorMap{E, S, 2, 4}) where {E, S}
30-
return new(T)
30+
function ATRG_3D(T::TT) where {E, S, TT <: AbstractTensorMap{E, S, 2, 4}}
31+
return new{E, S, TT}(T)
3132
end
3233
end
3334

src/schemes/btrg.jl

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,29 @@ $(TYPEDFIELDS)
2323
### References
2424
* [Adachi et. al. Phys. Rev. B 105 (2022)](@cite adachiBondweightedTensorRenormalization2022)
2525
"""
26-
mutable struct BTRG <: TNRScheme
27-
T::TensorMap
28-
S1::TensorMap
29-
S2::TensorMap
26+
mutable struct BTRG{E, S, TT <: AbstractTensorMap{E, S, 2, 2}, BT <: AbstractTensorMap{E, S, 1, 1}} <: TNRScheme{E, S}
27+
"Central tensor"
28+
T::TT
29+
30+
"Bond tensor on vertical bonds"
31+
S1::BT
32+
33+
"Bond tensor on horizontal bonds"
34+
S2::BT
35+
36+
"Bond weight exponent"
3037
k::Float64
3138

32-
function BTRG(T::TensorMap{E, S, 2, 2}, k::Number) where {E, S}
39+
function BTRG(T::TT, k::Number) where {E, S, TT <: AbstractTensorMap{E, S, 2, 2}}
3340
# Construct S1 and S2 as identity matrices.
34-
return new(T, id(space(T, 2)), id(space(T, 1)), k)
41+
S1 = id(E, space(T, 2))
42+
S2 = id(E, space(T, 1))
43+
return new{E, S, TT, typeof(S1)}(T, S1, S2, k)
3544
end
3645
end
3746

3847
# Default implementation using the optimal value for k
39-
BTRG(T::TensorMap) = BTRG(T, -0.5)
48+
BTRG(T) = BTRG(T, -0.5)
4049

4150
function pseudopow(t::DiagonalTensorMap, a::Real; tol = eps(scalartype(t))^(3 / 4))
4251
t′ = copy(t)

src/schemes/ctm/c4vctm.jl

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,20 @@ The keyword argument symmetrize makes the tensor C4v symmetric when set to true.
2323
2424
$(TYPEDFIELDS)
2525
"""
26-
mutable struct c4vCTM{A, S}
27-
T::TensorMap{A, S, 0, 4}
28-
C::TensorMap{A, S, 1, 1}
29-
E::TensorMap{A, S, 2, 1}
26+
mutable struct c4vCTM{A, S, TT <: AbstractTensorMap{A, S, 0, 4}, TC <: AbstractTensorMap{A, S, 1, 1}, TE <: AbstractTensorMap{A, S, 2, 1}} <: TNRScheme{A, S}
27+
"Central tensor"
28+
T::TT
3029

31-
function c4vCTM(T::TensorMap{A, S, 0, 4}) where {A, S}
30+
"Corner tensor"
31+
C::TC
32+
33+
"Edge tensor"
34+
E::TE
35+
36+
function c4vCTM(T::TT) where {A, S, TT <: AbstractTensorMap{A, S, 0, 4}}
3237
C, E = c4vCTM_init(T)
3338

34-
return new{A, S}(T, C, E)
39+
return new{A, S, TT, typeof(C), typeof(E)}(T, C, E)
3540
end
3641
end
3742

@@ -113,7 +118,7 @@ function step!(scheme::c4vCTM, trunc)
113118
mat, U, S = find_U_sym(scheme, trunc)
114119

115120
@tensor scheme.C[-1; -2] := mat[1 2; 3 4] * U[3 4; -2] * conj(U[1 2; -1])
116-
@tensor scheme.E[-1 -2; -3] := scheme.E[1 5; 3] * flip(scheme.T, (3, 4); inv = true)[5 4 -2 2] *
121+
@tensor scheme.E[-1 -2; -3] := scheme.E[1 5; 3] * flip(scheme.T, (3, 4); inv = false)[5 4 -2 2] *
117122
U[3 4; -3] *
118123
conj(U[1 2; -1])
119124

@@ -123,15 +128,21 @@ function step!(scheme::c4vCTM, trunc)
123128
end
124129

125130
function lnz(scheme::c4vCTM)
126-
Z, env = tensor2env(permute(flip(scheme.T, (3, 4); inv = true), ((4, 3), (1, 2))), scheme.C, scheme.E)
127-
# should be inv = false ??
128-
return real(log(network_value(Z, env)))
131+
T_unflipped = permute(flip(scheme.T, (3, 4); inv = false), ((4, 3), (1, 2)))
132+
133+
corners = fill(scheme.C, 4)
134+
edges = fill(scheme.E, 4)
135+
136+
edges[3] = flip(scheme.E, 2; inv = true)
137+
edges[4] = flip(scheme.E, 2; inv = true)
138+
139+
return real(log(network_value(T_unflipped, corners, edges)))
129140
end
130141

131142
function build_corner_matrix(scheme)
132143
@tensor opt = true mat[-1 -2; -3 -4] := scheme.C[1; 2] * scheme.E[-1 3; 1] *
133144
scheme.E[2 4; -3] *
134-
flip(scheme.T, 3; inv = true)[4 -4 -2 3]
145+
flip(scheme.T, 3; inv = false)[4 -4 -2 3]
135146
return mat
136147
end
137148

@@ -152,20 +163,6 @@ function c4vCTM_init(T::TensorMap{A, S, 0, 4}) where {A, S}
152163
return C, E
153164
end
154165

155-
function tensor2env(O, C, T)
156-
Z = InfinitePartitionFunction(O)
157-
env = CTMRGEnv(Z, space(C)[1])
158-
159-
for i in 1:4
160-
env.corners[i] = C
161-
env.edges[i] = T
162-
end
163-
164-
env.edges[3] = flip(T, 2)
165-
env.edges[4] = flip(T, 2)
166-
return Z, env
167-
end
168-
169166
function Base.show(io::IO, scheme::c4vCTM)
170167
println(io, "c4vCTM - C4v symmetric Corner Transfer Matrix")
171168
println(io, " * T: $(summary(scheme.T))")

src/schemes/ctm/ctm_hotrg.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
mutable struct ctm_HOTRG{A, S} <: TNRScheme
2-
T::TensorMap{A, S, 2, 2}
3-
C2::TensorMap{A, S, 1, 1}
4-
E1::TensorMap{A, S, 2, 1}
5-
E2::TensorMap{A, S, 2, 1}
1+
mutable struct ctm_HOTRG{E, S, TT <: AbstractTensorMap{E, S, 2, 2}, TC <: AbstractTensorMap{E, S, 1, 1}, TE <: AbstractTensorMap{E, S, 2, 1}} <: TNRScheme{E, S}
2+
T::TT
3+
C2::TC
4+
E1::TE
5+
E2::TE
66
χenv::Int64
77
function ctm_HOTRG(
8-
T::TensorMap{A, S, 2, 2},
8+
T::TT,
99
χenv::Int64;
1010
ctm_iter = maxiter(2.0e4),
1111
ctm_tol = trivial_convcrit(1.0e-9),
1212
ctm_obc = false,
1313
χenv_ini = 2,
14-
) where {A, S}
15-
if eltype(T) != Float64
14+
) where {E, S, TT <: AbstractTensorMap{E, S, 2, 2}}
15+
if E != Float64
1616
@error "This scheme only supports tensors with real numbers"
1717
end
1818
scheme_init = TNRKit.rCTM(T)
@@ -27,7 +27,7 @@ mutable struct ctm_HOTRG{A, S} <: TNRScheme
2727
@info "rCTM finished"
2828
C2, E1, E2 = scheme_init.C2, scheme_init.E1, scheme_init.E2
2929
@assert BraidingStyle(sectortype(T)) == Bosonic() "$(summary(BraidingStyle(sectortype(T)))) braiding style is not supported for rCTM"
30-
return new{A, S}(T, C2, E1, E2, χenv)
30+
return new{E, S, TT, typeof(C2), typeof(E1)}(T, C2, E1, E2, χenv)
3131
end
3232
end
3333

src/schemes/ctm/ctm_trg.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
mutable struct ctm_TRG{A, S} <: TNRScheme
2-
T::TensorMap{A, S, 2, 2}
3-
C2::TensorMap{A, S, 1, 1}
4-
E1::TensorMap{A, S, 2, 1}
5-
E2::TensorMap{A, S, 2, 1}
1+
mutable struct ctm_TRG{E, S, TT <: AbstractTensorMap{E, S, 2, 2}, TC <: AbstractTensorMap{E, S, 1, 1}, TE <: AbstractTensorMap{E, S, 2, 1}} <: TNRScheme{E, S}
2+
T::TT
3+
C2::TC
4+
E1::TE
5+
E2::TE
66
χenv::Int64
77
function ctm_TRG(
8-
T::TensorMap{A, S, 2, 2},
8+
T::TT,
99
χenv::Int64;
1010
ctm_iter = 2.0e4,
1111
ctm_tol = 1.0e-9,
12-
) where {A, S}
12+
) where {E, S, TT <: AbstractTensorMap{E, S, 2, 2}}
1313
if eltype(T) != Float64
1414
@error "This scheme only support tensors with real numbers"
1515
end
@@ -24,7 +24,7 @@ mutable struct ctm_TRG{A, S} <: TNRScheme
2424
@info "rCTM finished"
2525
C2, E1, E2 = scheme_init.C2, scheme_init.E1, scheme_init.E2
2626
@assert BraidingStyle(sectortype(T)) == Bosonic() "$(summary(BraidingStyle(sectortype(T)))) braiding style is not supported for rCTM"
27-
return new{A, S}(T, C2, E1, E2, χenv)
27+
return new{E, S, TT, typeof(C2), typeof(E1)}(T, C2, E1, E2, χenv)
2828
end
2929
end
3030

src/schemes/ctm/onesite_ctm.jl

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@
99
│Cbl├─┤Eb├─┤Cbr│
1010
└───┘ └──┘ └───┘
1111
"""
12-
mutable struct CTM
13-
T::AbstractTensorMap
14-
Ctl::AbstractTensorMap
15-
Ctr::AbstractTensorMap
16-
Cbr::AbstractTensorMap
17-
Cbl::AbstractTensorMap
18-
El::AbstractTensorMap
19-
Eb::AbstractTensorMap
20-
Et::AbstractTensorMap
21-
Er::AbstractTensorMap
12+
mutable struct CTM{E, S, TT <: AbstractTensorMap{E, S, 2, 2}, TC <: AbstractTensorMap{E, S, 1, 1}, TE <: AbstractTensorMap{E, S, 2, 1}} <: TNRScheme{E, S}
13+
T::TT
14+
Ctl::TC
15+
Ctr::TC
16+
Cbr::TC
17+
Cbl::TC
18+
El::TE
19+
Eb::TE
20+
Et::TE
21+
Er::TE
2222
end
2323

24+
#TODO: type everything
25+
2426
CTM(T; bc = ones, bc_free = false) = CTM(T, CTM_init(T; bc, bc_free)...)
2527

2628
function lnz(ctm::CTM)
@@ -34,14 +36,17 @@ function lnz(ctm::CTM)
3436
ctm.Eb[6 10; 7] *
3537
ctm.Cbl[7; 8] *
3638
ctm.El[8 9; 1]
39+
3740
B = tr(ρA(ctm))
41+
3842
@tensor opt = true C =
3943
ctm.Ctl[1; 2] *
4044
ctm.Et[2 7; 3] *
4145
ctm.Ctr[3; 4] *
4246
ctm.Cbr[4; 5] *
4347
ctm.Eb[5 7; 6] *
4448
ctm.Cbl[6; 1]
49+
4550
@tensor opt = true D =
4651
ctm.Ctl[1; 2] *
4752
ctm.Ctr[2; 3] *

src/schemes/ctm/rctm.jl

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@ The corner tensors are related by its mirror images.
1515
1616
1717
=#
18-
mutable struct rCTM{A, S}
19-
T::TensorMap{A, S, 2, 2}
20-
C2::TensorMap{A, S, 1, 1}
21-
E1::TensorMap{A, S, 2, 1}
22-
E2::TensorMap{A, S, 2, 1}
23-
24-
function rCTM(T::TensorMap{A, S, 2, 2}) where {A, S}
25-
if typeof(T.data[1]) != Float64
18+
mutable struct rCTM{E, S, TT <: AbstractTensorMap{E, S, 2, 2}, TC <: AbstractTensorMap{E, S, 1, 1}, TE <: AbstractTensorMap{E, S, 2, 1}} <: TNRScheme{E, S}
19+
T::TT
20+
C2::TC
21+
E1::TE
22+
E2::TE
23+
24+
function rCTM(T::TT) where {E, S, TT <: AbstractTensorMap{E, S, 2, 2}}
25+
if !(E <: Real)
2626
@error "This scheme only support tensors with real numbers"
2727
end
2828
C, E1, E2 = rCTM_init(T)
2929
@assert BraidingStyle(sectortype(T)) == Bosonic() "$(summary(BraidingStyle(sectortype(T)))) braiding style is not supported for rCTM"
30-
return new{A, S}(T, C, E1, E2)
30+
return new{E, S, TT, typeof(C), typeof(E1)}(T, C, E1, E2)
3131
end
3232
end
3333

@@ -103,22 +103,10 @@ function run!(
103103
end
104104

105105
function lnz(scheme::rCTM)
106-
Z, env = tensor2env(scheme.T, scheme.C2, scheme.E1, scheme.E2)
107-
return real(log(network_value(Z, env)))
108-
end
106+
corners = [adjoint(scheme.C2), scheme.C2, adjoint(scheme.C2), scheme.C2]
107+
edges = [scheme.E1 scheme.E2 flip(scheme.E1, 2) flip(scheme.E2, 2)]
109108

110-
function tensor2env(T, C2, E1, E2)
111-
Z = InfinitePartitionFunction(T)
112-
env = CTMRGEnv(Z, space(C2)[1])
113-
for i in 1:2
114-
env.corners[2 * i] = C2
115-
env.edges[2 * i] = E2
116-
env.corners[2 * i - 1] = adjoint(C2)
117-
env.edges[2 * i - 1] = E1
118-
end
119-
env.edges[3] = flip(env.edges[3], 2)
120-
env.edges[4] = flip(env.edges[4], 2)
121-
return Z, env
109+
return real(log(network_value(scheme.T, corners, edges)))
122110
end
123111

124112
function Base.show(io::IO, scheme::rCTM)

0 commit comments

Comments
 (0)