Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions examples/boundary_mps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ T = InfiniteTransferPEPS(peps, 1, 1)
# encodes the norm of the state

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

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

mps2 = PEPSKit.initializeMPS(T2, fill(ComplexSpace(20), 2, 2))
mps2 = initialize_mps(T2, fill(ComplexSpace(20), 2, 2))
mps2, env2, ϵ = leading_boundary(mps2, T2, VUMPS())
N2 = abs(prod(expectation_value(mps2, T2)))

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

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

Expand Down
2 changes: 1 addition & 1 deletion src/PEPSKit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export InfinitePartitionFunction
export InfinitePEPS, InfiniteTransferPEPS
export SUWeight, InfiniteWeightPEPS
export InfinitePEPO, InfiniteTransferPEPO
export initializeMPS, initializePEPS
export initialize_mps, initializePEPS
export ReflectDepth, ReflectWidth, Rotate, RotateReflect
export symmetrize!, symmetrize_retract_and_finalize!
export showtypeofgrad
Expand Down
44 changes: 25 additions & 19 deletions src/operators/transfermatrix.jl
Original file line number Diff line number Diff line change
Expand Up @@ -125,53 +125,59 @@ const MultilineTransferMatrix = Union{MultilineTransferPEPS,MultilineTransferPEP
virtualspace(O::InfiniteTransferMatrix, i, dir) = virtualspace(O[i], dir)

"""
initializeMPS(
initialize_mps(
f=randn,
T=scalartype(O),
O::Union{InfiniteTransferPEPS,InfiniteTransferPEPO},
virtualspaces::AbstractArray{<:ElementarySpace,1}
)
initializeMPS(
initialize_mps(
f=randn,
T=scalartype(O),
O::Union{MultilineTransferPEPS,MultilineTransferPEPO},
virtualspaces::AbstractArray{<:ElementarySpace,2}
)

Inialize a boundary MPS for the transfer operator `O` by specifying an array of virtual
spaces consistent with the unit cell.
"""
function initializeMPS(
O::InfiniteTransferMatrix, virtualspaces::AbstractArray{S,1}
function initialize_mps(O::Union{InfiniteTransferMatrix,MultilineTransferMatrix}, arg) # initialize(f=randn, T=scalartype(O), O, ...)
return initialize_mps(randn, scalartype(O), O, arg)
end
function initialize_mps(
f, T, O::InfiniteTransferMatrix, virtualspaces::AbstractArray{S,1}
) where {S}
return InfiniteMPS([
randn(
scalartype(O),
f(
T,
virtualspaces[_prev(i, end)] * _elementwise_dual(north_virtualspace(O, i)),
virtualspaces[mod1(i, end)],
) for i in 1:length(O)
])
end
function initializeMPS(O::InfiniteTransferMatrix, χ::Int)
function initialize_mps(f, T, O::InfiniteTransferMatrix, χ::Int)
return InfiniteMPS([
randn(calartype(O), ℂ^χ * _elementwise_dual(north_virtualspace(O, i)), ℂ^χ) for
i in 1:length(O)
f(T, ℂ^χ * _elementwise_dual(north_virtualspace(O, i)), ℂ^χ) for i in 1:length(O)
])
end
function initializeMPS(
O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,2}
function initialize_mps(
f, T, O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,2}
) where {S}
mpss = map(1:size(O, 1)) do r
return initializeMPS(O[r], virtualspaces[r, :])
return initialize_mps(f, T, O[r], virtualspaces[r, :])
end
return MPSKit.Multiline(mpss)
end
function initializeMPS(
O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,1}
function initialize_mps(
f, T, O::MultilineTransferMatrix, virtualspaces::AbstractArray{S,1}
) where {S}
return initializeMPS(O, repeat(virtualspaces, length(O), 1))
return initialize_mps(f, T, O, repeat(virtualspaces, length(O), 1))
end
function initializeMPS(O::MultilineTransferMatrix, V::ElementarySpace)
return initializeMPS(O, repeat([V], length(O), length(O[1])))
function initialize_mps(f, T, O::MultilineTransferMatrix, V::ElementarySpace)
return initialize_mps(f, T, O, repeat([V], length(O), length(O[1])))
end
function initializeMPS(O::MultilineTransferMatrix, χ::Int)
return initializeMPS(O, repeat([ℂ^χ], length(O), length(O[1])))
function initialize_mps(f, T, O::MultilineTransferMatrix, χ::Int)
return initialize_mps(f, T, O, repeat([ℂ^χ], length(O), length(O[1])))
end

@doc """
Expand Down
17 changes: 9 additions & 8 deletions test/boundarymps/vumps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ using LinearAlgebra

Random.seed!(29384293742893)

const vumps_alg = VUMPS(; alg_eigsolve=MPSKit.Defaults.alg_eigsolve(; ishermitian=false))

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

T = PEPSKit.InfiniteTransferPEPS(psi, 1, 1)
mps = PEPSKit.initializeMPS(T, [ComplexSpace(20)])
mps = initialize_mps(T, [ComplexSpace(20)])

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

mps = PEPSKit.initializeMPS(T, fill(ComplexSpace(20), 2, 2))
mps = initialize_mps(rand, scalartype(T), T, fill(ComplexSpace(20), 2, 2))
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
N = abs(prod(expectation_value(mps, T)))

Expand All @@ -45,10 +46,10 @@ end

psi = InfinitePEPS(D, d; unitcell=(1, 1))
n = InfiniteSquareNetwork(psi)
T = PEPSKit.InfiniteTransferPEPS(psi, 1, 1)
T = InfiniteTransferPEPS(psi, 1, 1)

# compare boundary MPS contraction to CTMRG contraction
mps = PEPSKit.initializeMPS(T, [χ])
mps = initialize_mps(T, [χ])
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
N_vumps = abs(prod(expectation_value(mps, T)))

Expand Down Expand Up @@ -100,7 +101,7 @@ end
psi = PEPSKit.initializePEPS(O, ComplexSpace(2))
T = InfiniteTransferPEPO(psi, O, 1, 1)

mps = PEPSKit.initializeMPS(T, [ComplexSpace(10)])
mps = initialize_mps(rand, scalartype(T), T, [ComplexSpace(10)])
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
f = abs(prod(expectation_value(mps, T)))

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

mps = PEPSKit.initializeMPS(T, [ComplexSpace(8)])
mps = initialize_mps(rand, scalartype(T), T, [ComplexSpace(8)])
mps, env, ϵ = leading_boundary(mps, T, vumps_alg)
f = abs(prod(expectation_value(mps, T)))
end