Skip to content

Commit 3c7ed46

Browse files
authored
Refactor initializeMPS (#180)
Rename initializeMPS to `initialize_mps` and add optional `f=randn` and `T=ComplexF64` args
1 parent 1d95d57 commit 3c7ed46

4 files changed

Lines changed: 38 additions & 31 deletions

File tree

examples/boundary_mps.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ T = InfiniteTransferPEPS(peps, 1, 1)
2323
# encodes the norm of the state
2424

2525
# Fist we build an initial guess for the boundary MPS, choosing a bond dimension of 20
26-
mps = PEPSKit.initializeMPS(T, [ComplexSpace(20)])
26+
mps = initialize_mps(T, [ComplexSpace(20)])
2727

2828
# We then find the leading boundary MPS fixed point using the VUMPS algorithm
2929
mps, env, ϵ = leading_boundary(mps, T, VUMPS())
@@ -51,7 +51,7 @@ N´ = abs(norm(peps, ctm))
5151
peps2 = InfinitePEPS(ComplexSpace(2), ComplexSpace(2); unitcell=(2, 2))
5252
T2 = PEPSKit.MultilineTransferPEPS(peps2, 1)
5353

54-
mps2 = PEPSKit.initializeMPS(T2, fill(ComplexSpace(20), 2, 2))
54+
mps2 = initialize_mps(T2, fill(ComplexSpace(20), 2, 2))
5555
mps2, env2, ϵ = leading_boundary(mps2, T2, VUMPS())
5656
N2 = abs(prod(expectation_value(mps2, T2)))
5757

@@ -76,7 +76,7 @@ N2´ = abs(norm(peps2, ctm2))
7676
pepo = ising_pepo(1)
7777
T3 = InfiniteTransferPEPO(peps, pepo, 1, 1)
7878

79-
mps3 = PEPSKit.initializeMPS(T3, [ComplexSpace(20)])
79+
mps3 = initialize_mps(T3, [ComplexSpace(20)])
8080
mps3, env3, ϵ = leading_boundary(mps3, T3, VUMPS())
8181
@show N3 = abs(prod(expectation_value(mps3, T3)))
8282

src/PEPSKit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export InfinitePartitionFunction
8989
export InfinitePEPS, InfiniteTransferPEPS
9090
export SUWeight, InfiniteWeightPEPS
9191
export InfinitePEPO, InfiniteTransferPEPO
92-
export initializeMPS, initializePEPS
92+
export initialize_mps, initializePEPS
9393
export ReflectDepth, ReflectWidth, Rotate, RotateReflect
9494
export symmetrize!, symmetrize_retract_and_finalize!
9595
export showtypeofgrad

src/operators/transfermatrix.jl

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -125,53 +125,59 @@ const MultilineTransferMatrix = Union{MultilineTransferPEPS,MultilineTransferPEP
125125
virtualspace(O::InfiniteTransferMatrix, i, dir) = virtualspace(O[i], dir)
126126

127127
"""
128-
initializeMPS(
128+
initialize_mps(
129+
f=randn,
130+
T=scalartype(O),
129131
O::Union{InfiniteTransferPEPS,InfiniteTransferPEPO},
130132
virtualspaces::AbstractArray{<:ElementarySpace,1}
131133
)
132-
initializeMPS(
134+
initialize_mps(
135+
f=randn,
136+
T=scalartype(O),
133137
O::Union{MultilineTransferPEPS,MultilineTransferPEPO},
134138
virtualspaces::AbstractArray{<:ElementarySpace,2}
135139
)
136140
137141
Inialize a boundary MPS for the transfer operator `O` by specifying an array of virtual
138142
spaces consistent with the unit cell.
139143
"""
140-
function initializeMPS(
141-
O::InfiniteTransferMatrix, virtualspaces::AbstractArray{S,1}
144+
function initialize_mps(O::Union{InfiniteTransferMatrix,MultilineTransferMatrix}, arg) # initialize(f=randn, T=scalartype(O), O, ...)
145+
return initialize_mps(randn, scalartype(O), O, arg)
146+
end
147+
function initialize_mps(
148+
f, T, O::InfiniteTransferMatrix, virtualspaces::AbstractArray{S,1}
142149
) where {S}
143150
return InfiniteMPS([
144-
randn(
145-
scalartype(O),
151+
f(
152+
T,
146153
virtualspaces[_prev(i, end)] * _elementwise_dual(north_virtualspace(O, i)),
147154
virtualspaces[mod1(i, end)],
148155
) for i in 1:length(O)
149156
])
150157
end
151-
function initializeMPS(O::InfiniteTransferMatrix, χ::Int)
158+
function initialize_mps(f, T, O::InfiniteTransferMatrix, χ::Int)
152159
return InfiniteMPS([
153-
randn(calartype(O), ℂ^χ * _elementwise_dual(north_virtualspace(O, i)), ℂ^χ) for
154-
i in 1:length(O)
160+
f(T, ℂ^χ * _elementwise_dual(north_virtualspace(O, i)), ℂ^χ) for i in 1:length(O)
155161
])
156162
end
157-
function initializeMPS(
158-
O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,2}
163+
function initialize_mps(
164+
f, T, O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,2}
159165
) where {S}
160166
mpss = map(1:size(O, 1)) do r
161-
return initializeMPS(O[r], virtualspaces[r, :])
167+
return initialize_mps(f, T, O[r], virtualspaces[r, :])
162168
end
163169
return MPSKit.Multiline(mpss)
164170
end
165-
function initializeMPS(
166-
O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,1}
171+
function initialize_mps(
172+
f, T, O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,1}
167173
) where {S}
168-
return initializeMPS(O, repeat(virtualspaces, length(O), 1))
174+
return initialize_mps(f, T, O, repeat(virtualspaces, length(O), 1))
169175
end
170-
function initializeMPS(O::MultilineTransferMatrix, V::ElementarySpace)
171-
return initializeMPS(O, repeat([V], length(O), length(O[1])))
176+
function initialize_mps(f, T, O::MultilineTransferMatrix, V::ElementarySpace)
177+
return initialize_mps(f, T, O, repeat([V], length(O), length(O[1])))
172178
end
173-
function initializeMPS(O::MultilineTransferMatrix, χ::Int)
174-
return initializeMPS(O, repeat([ℂ^χ], length(O), length(O[1])))
179+
function initialize_mps(f, T, O::MultilineTransferMatrix, χ::Int)
180+
return initialize_mps(f, T, O, repeat([ℂ^χ], length(O), length(O[1])))
175181
end
176182

177183
@doc """

test/boundarymps/vumps.jl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ using LinearAlgebra
77

88
Random.seed!(29384293742893)
99

10-
const vumps_alg = VUMPS(; alg_eigsolve=MPSKit.Defaults.alg_eigsolve(; ishermitian=false))
11-
10+
const vumps_alg = VUMPS(;
11+
tol=1e-6, alg_eigsolve=MPSKit.Defaults.alg_eigsolve(; ishermitian=false), verbosity=2
12+
)
1213
@testset "(1, 1) PEPS" begin
1314
psi = InfinitePEPS(ComplexSpace(2), ComplexSpace(2))
1415

1516
T = PEPSKit.InfiniteTransferPEPS(psi, 1, 1)
16-
mps = PEPSKit.initializeMPS(T, [ComplexSpace(20)])
17+
mps = initialize_mps(T, [ComplexSpace(20)])
1718

1819
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
1920
N = abs(sum(expectation_value(mps, T)))
@@ -28,7 +29,7 @@ end
2829
psi = InfinitePEPS(ComplexSpace(2), ComplexSpace(2); unitcell=(2, 2))
2930
T = PEPSKit.MultilineTransferPEPS(psi, 1)
3031

31-
mps = PEPSKit.initializeMPS(T, fill(ComplexSpace(20), 2, 2))
32+
mps = initialize_mps(rand, scalartype(T), T, fill(ComplexSpace(20), 2, 2))
3233
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
3334
N = abs(prod(expectation_value(mps, T)))
3435

@@ -45,10 +46,10 @@ end
4546

4647
psi = InfinitePEPS(D, d; unitcell=(1, 1))
4748
n = InfiniteSquareNetwork(psi)
48-
T = PEPSKit.InfiniteTransferPEPS(psi, 1, 1)
49+
T = InfiniteTransferPEPS(psi, 1, 1)
4950

5051
# compare boundary MPS contraction to CTMRG contraction
51-
mps = PEPSKit.initializeMPS(T, [χ])
52+
mps = initialize_mps(T, [χ])
5253
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
5354
N_vumps = abs(prod(expectation_value(mps, T)))
5455

@@ -100,7 +101,7 @@ end
100101
psi = PEPSKit.initializePEPS(O, ComplexSpace(2))
101102
T = InfiniteTransferPEPO(psi, O, 1, 1)
102103

103-
mps = PEPSKit.initializeMPS(T, [ComplexSpace(10)])
104+
mps = initialize_mps(rand, scalartype(T), T, [ComplexSpace(10)])
104105
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
105106
f = abs(prod(expectation_value(mps, T)))
106107

@@ -109,7 +110,7 @@ end
109110
psi2 = initializePEPS(O, ComplexSpace(2))
110111
T = InfiniteTransferPEPO(psi, O, 1, 1)
111112

112-
mps = PEPSKit.initializeMPS(T, [ComplexSpace(8)])
113+
mps = initialize_mps(rand, scalartype(T), T, [ComplexSpace(8)])
113114
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
114115
f = abs(prod(expectation_value(mps, T)))
115116
end

0 commit comments

Comments
 (0)