Skip to content

Commit 4a95edf

Browse files
implement scalar multiplication for FiniteMPOHamiltonian and InfiniteMPOHamiltonian
1 parent 2646623 commit 4a95edf

File tree

1 file changed

+21
-26
lines changed

1 file changed

+21
-26
lines changed

src/operators/mpohamiltonian.jl

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -764,36 +764,31 @@ function Base.:+(H₁::MPOH, H₂::MPOH) where {MPOH<:AbstractMPOHamiltonian}
764764
end
765765
Base.:-(H₁::AbstractMPOHamiltonian, H₂::AbstractMPOHamiltonian) = H₁ + (-H₂)
766766
Base.:-(H::AbstractMPOHamiltonian) = -one(scalartype(H)) * H
767-
768-
function Base.:*::Number, H::AbstractMPOHamiltonian)
769-
T = promote_type(scalartype(H), scalartype(λ))
770-
isinf = H isa InfiniteMPOHamiltonian
771-
Otype = jordanmpotensortype(spacetype(H), T)
772-
Ws = map(parent(H)) do h
773-
return Otype(undef, space(h))
767+
Base.:*::Number, H::AbstractMPOHamiltonian) = H * λ
768+
Base.:*(H::AbstractMPOHamiltonian, λ::Number) = scale(H, λ)
769+
770+
function VectorInterface.scale(H::InfiniteMPOHamiltonian, λ::Number)
771+
= copy(H)
772+
foreach(Hλ.data) do h
773+
# multiply scalar with start of every interaction
774+
# this avoids double counting
775+
# 2:end to avoid multiplying the top left and bottom right corners
776+
return rmul!(h[1, 1, 1, 2:end], λ)
774777
end
775-
for i in eachindex(Ws)
776-
for I in eachindex(IndexCartesian(), Ws[i])
777-
if isinf
778-
if I[4] == size(Ws[i], 4) && I[1] != size(Ws[i], 1)
779-
Ws[i][I] = λ * H[i][I]
780-
else
781-
Ws[i][I] = copy(H[i][I])
782-
end
783-
else
784-
if (i == 1 && I[4] == size(Ws[i], 4)) ||
785-
(i != 1 && I[1] != size(Ws[i], 1) && I[4] == size(Ws[i], 4))
786-
Ws[i][I] = λ * H[i][I]
787-
else
788-
Ws[i][I] = copy(H[i][I])
789-
end
790-
end
778+
return
779+
end
780+
781+
function VectorInterface.scale(H::FiniteMPOHamiltonian, λ::Number)
782+
= copy(H)
783+
foreach(enumerate(Hλ.data)) do (i, h)
784+
if i != length(Hλ)
785+
rmul!(h[1, 1, 1, 2:end], λ) # multiply top row (except BraidingTensor)
786+
else
787+
rmul!(h[end, 1, 1, 1:(end-1)], λ) # multiply right column (except BraidingTensor)
791788
end
792789
end
793-
return H isa FiniteMPOHamiltonian ? FiniteMPOHamiltonian(Ws) :
794-
InfiniteMPOHamiltonian(Ws)
790+
return
795791
end
796-
Base.:*(H::AbstractMPOHamiltonian, λ::Number) = λ * H
797792

798793
function Base.:*(H1::FiniteMPOHamiltonian, H2::FiniteMPOHamiltonian)
799794
check_length(H1, H2)

0 commit comments

Comments
 (0)