Skip to content

Commit ae87458

Browse files
committed
leading_boundary cleanup
1 parent a102f9c commit ae87458

File tree

5 files changed

+42
-11
lines changed

5 files changed

+42
-11
lines changed

src/MPSKit.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ include("algorithms/excitation/dmrgexcitation.jl")
147147
include("algorithms/excitation/chepigaansatz.jl")
148148
include("algorithms/excitation/exci_transfer_system.jl")
149149

150+
include("algorithms/statmech/leading_boundary.jl")
150151
include("algorithms/statmech/vumps.jl")
151152
include("algorithms/statmech/vomps.jl")
152153
include("algorithms/statmech/gradient_grassmann.jl")

src/algorithms/statmech/gradient_grassmann.jl

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
function leading_boundary(state::InfiniteMPS, H::DenseMPO, alg::GradientGrassmann,
2-
envs=environments(state, H))
3-
(multi, envs, err) = leading_boundary(convert(MultilineMPS, state),
4-
convert(MultilineMPO, H), alg, envs)
5-
state = convert(InfiniteMPS, multi)
6-
return (state, envs, err)
7-
end
8-
9-
function leading_boundary(state::MultilineMPS, H, alg::GradientGrassmann,
10-
envs=environments(state, H))
11-
fg(x) = GrassmannMPS.fg(x, H, envs)
1+
function leading_boundary(state::MultilineMPS,
2+
operator::MultilineMPO,
3+
alg::GradientGrassmann,
4+
envs::MultilineEnvironments=environments(state, H))
5+
fg(x) = GrassmannMPS.fg(x, operator, envs)
126
x, _, _, _, normgradhistory = optimize(fg, state,
137
alg.method;
148
(transport!)=GrassmannMPS.transport!,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
@doc """
3+
leading_boundary(ψ, O, [environments]; kwargs...)
4+
leading_boundary(ψ, O, algorithm, environments)
5+
6+
Compute the leading boundary MPS for operator `O` with initial guess `ψ`. If not specified, an
7+
optimization algorithm will be attempted based on the supplied keywords.
8+
9+
## Arguments
10+
- `ψ::AbstractMPS`: initial guess
11+
- `O::AbstractMPO`: operator for which to find the leading_boundary
12+
- `[environments]`: MPS environment manager
13+
- `algorithm`: optimization algorithm
14+
15+
## Keywords
16+
- `tol::Float64`: tolerance for convergence criterium
17+
- `maxiter::Int`: maximum amount of iterations
18+
- `verbosity::Int`: display progress information
19+
""" leading_boundary
20+
21+
# TODO: alg selector
22+
23+
# implementation always in terms of Multiline objects
24+
function leading_boundary(state::InfiniteMPS, operator::InfiniteMPO, alg,
25+
envs=environments(state, operator))
26+
state_multi = convert(MultilineMPS, state)
27+
operator_multi = convert(MultilineMPO, operator)
28+
envs_multi = Multiline([envs])
29+
state_multi′, envs_multi′, err = leading_boundary(state_multi, operator_multi, alg,
30+
envs_multi)
31+
state′ = convert(InfiniteMPS, state_multi′)
32+
return state′, envs, err
33+
end

src/environments/infinite_envs.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ struct InfiniteEnvironments{V<:GenericMPSTensor} <: AbstractMPSEnvironments
1313
GRs::PeriodicVector{V}
1414
end
1515

16+
Base.length(envs::InfiniteEnvironments) = length(envs.GLs)
17+
1618
function environments(above::InfiniteMPS,
1719
operator::Union{InfiniteMPO,InfiniteMPOHamiltonian},
1820
below::InfiniteMPS=above;

src/utility/multiline.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function Base.axes(m::Multiline, i::Int)
2828
return i == 1 ? axes(parent(m), 1) :
2929
i == 2 ? axes(parent(m)[1], 1) : throw(ArgumentError("Invalid index $i"))
3030
end
31+
Base.eachindex(m::Multiline) = CartesianIndices(size(m))
3132

3233
Base.getindex(m::Multiline, i::Int) = getindex(parent(m), i)
3334
Base.setindex!(m::Multiline, v, i::Int) = (setindex!(parent(m), v, i); m)

0 commit comments

Comments
 (0)