Skip to content

Commit c288165

Browse files
committed
rework random expansion
1 parent db773fd commit c288165

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed

src/algorithms/changebonds/randexpand.jl

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,31 @@ $(TYPEDFIELDS)
1717
trscheme::TruncationStrategy
1818
end
1919

20-
function changebonds(ψ::InfiniteMPS, alg::RandExpand)
21-
T = eltype(ψ.AL)
22-
AL′ = similar(ψ.AL)
23-
AR′ = similar(ψ.AR, tensormaptype(spacetype(T), 1, numind(T) - 1, storagetype(T)))
24-
for i in 1:length(ψ)
25-
# determine optimal expansion spaces around bond i
26-
AC2 = randomize!(_transpose_front(ψ.AC[i]) * _transpose_tail(ψ.AR[i + 1]))
27-
28-
# Use the nullspaces and SVD decomposition to determine the optimal expansion space
29-
VL = left_null(ψ.AL[i])
30-
VR = right_null!(_transpose_tail(ψ.AR[i + 1]))
31-
intermediate = normalize!(adjoint(VL) * AC2 * adjoint(VR))
32-
U, _, Vᴴ = svd_trunc!(intermediate; trunc = alg.trscheme, alg = alg.alg_svd)
20+
function changebonds!(ψ::InfiniteMPS, alg::RandExpand)
21+
AL′ = map(ψ.AL) do A
22+
# find random orthogonal vectors
23+
A_perp = randn!(similar(A))
24+
add!(A_perp, A * (A' * A_perp), -1)
25+
A′, _, _ = svd_trunc!(A_perp; alg = alg.alg_svd, trunc = alg.trscheme)
26+
return A′
27+
end
3328
34-
AL′[i] = VL * U
35-
AR′[i + 1] = Vᴴ * VR
29+
AR′ = map(ψ.AR) do A
30+
At = _transpose_tail(A)
31+
A_perp = randn!(similar(At))
32+
add!(A_perp, (A_perp * At') * At, -1)
33+
_, _, A′ = svd_trunc!(A_perp; alg = alg.alg_svd, trunc = alg.trscheme)
34+
return A′
3635
end
3736

38-
return _expand(ψ, AL′, AR′)
37+
return _expand!(ψ, AL′, AR′)
3938
end
4039

41-
function changebonds(ψ::MultilineMPS, alg::RandExpand)
42-
return Multiline(map(x -> changebonds(x, alg), ψ.data))
40+
function changebonds!::MultilineMPS, alg::RandExpand)
41+
return Multiline(map(x -> changebonds!(x, alg), ψ.data))
4342
end
4443

45-
changebonds(ψ::AbstractFiniteMPS, alg::RandExpand) = changebonds!(copy(ψ), alg)
44+
changebonds(ψ::AbstractMPS, alg::RandExpand) = changebonds!(copy(ψ), alg)
4645
function changebonds!(ψ::AbstractFiniteMPS, alg::RandExpand)
4746
for i in 1:(length(ψ) - 1)
4847
AC2 = randomize!(_transpose_front(ψ.AC[i]) * _transpose_tail(ψ.AR[i + 1]))

0 commit comments

Comments
 (0)