Skip to content

Commit 9de498e

Browse files
committed
upgrades and consistently using itensormps
1 parent fa7ed21 commit 9de498e

File tree

4 files changed

+114
-103
lines changed

4 files changed

+114
-103
lines changed

Project.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "QuantumDynamics"
22
uuid = "5a40c529-53c2-4483-a223-e00c1cee8134"
33
authors = ["Amartya Bose <[email protected]> and contributors"]
4-
version = "0.2.27"
4+
version = "0.2.28"
55

66
[deps]
77
AtomsIO = "1692102d-eeb4-4df9-807b-c9517f998d44"
@@ -34,8 +34,8 @@ DelimitedFiles = "1"
3434
Distributions = "0.25"
3535
FLoops = "0.2"
3636
HDF5 = "0.17"
37-
ITensorMPS = "0.2.1"
38-
ITensors = "0.6"
37+
ITensorMPS = "0.3"
38+
ITensors = "0.7"
3939
Interpolations = "0.15"
4040
JSON3 = "1"
4141
OrdinaryDiffEq = "6"

docs/src/documentation/Utilities.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Utilities.MPS_to_MPO
2121
```
2222

2323
```@docs
24-
ITensors.expect
24+
ITensorMPS.expect
2525
```
2626

2727
## HDF5 Utilities

src/PathIntegral/PCTNPI.jl

+101-90
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module PCTNPI
22

33
using LinearAlgebra
44
using HDF5
5-
using ITensors
5+
using ITensors, ITensorMPS
66
using FLoops
77
using ..EtaCoefficients, ..Propagators, ..SpectralDensities, ..Blip, ..Utilities, ..TTM
88

@@ -12,15 +12,15 @@ const references = """
1212
const PCTNPIArgs = Utilities.TensorNetworkArgs
1313

1414
function generate_bottom_right_tensor(ηs, sites, blip_sites, state_to_blip, fbU, k::Int, Δs, sbar)
15-
ind1 = sites[k-1]
16-
ind2 = sites[k]
17-
ind3 = blip_sites[k]'
18-
η11 =.η00 for η in ηs]
19-
η10 =.η0m[1] for η in ηs]
15+
@inbounds ind1 = sites[k-1]
16+
@inbounds ind2 = sites[k]
17+
@inbounds ind3 = blip_sites[k]'
18+
@inbounds η11 =.η00 for η in ηs]
19+
@inbounds η10 =.η0m[1] for η in ηs]
2020
tens = ITensor(ind1, ind2, ind3)
2121
for skp = 1:dim(ind1)
2222
for sk = 1:dim(ind2)
23-
tens[ind1=>skp, ind2=>sk, ind3=>state_to_blip[sk]] = fbU[sk, skp] *
23+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>state_to_blip[sk]] = fbU[sk, skp] *
2424
exp.(-sum(Δs[:, sk] .* (real(η11) .* Δs[:, sk] + 2im * imag(η11) .* sbar[:, sk]))) *
2525
exp.(-sum(Δs[:, sk] .* (real(η10) .* Δs[:, skp] + 2im * imag(η10) .* sbar[:, skp])))
2626
end
@@ -29,16 +29,16 @@ function generate_bottom_right_tensor(ηs, sites, blip_sites, state_to_blip, fbU
2929
end
3030

3131
function generate_bottom_left_tensor(ηs, sites, fbU, k::Int, Δs, sbar)
32-
ind1 = sites[k-1]
33-
ind2 = sites[k]
34-
ind3 = sites[k-1]'
35-
η00 =.η00 for η in ηs]
36-
η11 =.ηmm for η in ηs]
37-
η10 =.η0m[1] for η in ηs]
32+
@inbounds ind1 = sites[k-1]
33+
@inbounds ind2 = sites[k]
34+
@inbounds ind3 = sites[k-1]'
35+
@inbounds η00 =.η00 for η in ηs]
36+
@inbounds η11 =.ηmm for η in ηs]
37+
@inbounds η10 =.η0m[1] for η in ηs]
3838
tens = ITensor(ind1, ind2, ind3)
3939
for skp = 1:dim(ind1)
4040
for sk = 1:dim(ind2)
41-
tens[ind1=>skp, ind2=>sk, ind3=>skp] = fbU[sk, skp] *
41+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>skp] = fbU[sk, skp] *
4242
exp.(-sum(Δs[:, skp] .* (real(η00) .* Δs[:, skp] + 2im * imag(η00) .* sbar[:, skp]))) *
4343
exp.(-sum(Δs[:, sk] .* (real(η11) .* Δs[:, sk] + 2im * imag(η11) .* sbar[:, sk]))) *
4444
exp.(-sum(Δs[:, sk] .* (real(η10) .* Δs[:, skp] + 2im * imag(η10) .* sbar[:, skp])))
@@ -48,16 +48,16 @@ function generate_bottom_left_tensor(ηs, sites, fbU, k::Int, Δs, sbar)
4848
end
4949

5050
function generate_bottom_center_tensor(ηs, sites, blip_sites, state_to_blip, fbU, k::Int, Δs, sbar)
51-
ind1 = sites[k-1]
52-
ind2 = sites[k]
53-
ind3 = sites[k-1]'
54-
ind4 = blip_sites[k]'
55-
η11 =.ηmm for η in ηs]
56-
η10 =.ηmn[1] for η in ηs]
51+
@inbounds ind1 = sites[k-1]
52+
@inbounds ind2 = sites[k]
53+
@inbounds ind3 = sites[k-1]'
54+
@inbounds ind4 = blip_sites[k]'
55+
@inbounds η11 =.ηmm for η in ηs]
56+
@inbounds η10 =.ηmn[1] for η in ηs]
5757
tens = ITensor(ind1, ind2, ind3, ind4)
5858
for skp = 1:dim(ind1)
5959
for sk = 1:dim(ind2)
60-
tens[ind1=>skp, ind2=>sk, ind3=>skp, ind4=>state_to_blip[sk]] = fbU[sk, skp] *
60+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>skp, ind4=>state_to_blip[sk]] = fbU[sk, skp] *
6161
exp.(-sum(Δs[:, sk] .* (real(η11) .* Δs[:, sk] + 2im * imag(η11) .* sbar[:, sk]))) *
6262
exp.(-sum(Δs[:, sk] .* (real(η10) .* Δs[:, skp] + 2im * imag(η10) .* sbar[:, skp])))
6363
end
@@ -67,59 +67,59 @@ end
6767

6868
function generate_center_tensor(ηs, sites, blip_sites, k::Int, kp::Int, group_Δs, Δs, sbar)
6969
kkp = k - kp
70-
ind1 = prime(sites[kp], kkp - 1)
71-
ind2 = prime(blip_sites[k], kkp - 1)
72-
ind3 = prime(sites[kp], kkp)
73-
ind4 = prime(blip_sites[k], kkp)
74-
η =.ηmn[kkp] for η in ηs]
70+
@inbounds ind1 = prime(sites[kp], kkp - 1)
71+
@inbounds ind2 = prime(blip_sites[k], kkp - 1)
72+
@inbounds ind3 = prime(sites[kp], kkp)
73+
@inbounds ind4 = prime(blip_sites[k], kkp)
74+
@inbounds η =.ηmn[kkp] for η in ηs]
7575
tens = ITensor(ind1, ind2, ind3, ind4)
7676
for skp = 1:dim(ind1)
7777
for sk = 1:dim(ind2)
78-
tens[ind1=>skp, ind2=>sk, ind3=>skp, ind4=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
78+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>skp, ind4=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
7979
end
8080
end
8181
tens
8282
end
8383

8484
function generate_left_tensor(ηs, sites, blip_sites, k::Int, kp::Int, group_Δs, Δs, sbar)
8585
kkp = k - kp
86-
ind1 = prime(sites[kp], kkp - 1)
87-
ind2 = prime(blip_sites[k], kkp - 1)
88-
ind3 = prime(sites[kp], kkp)
89-
η =.η0m[kkp] for η in ηs]
86+
@inbounds ind1 = prime(sites[kp], kkp - 1)
87+
@inbounds ind2 = prime(blip_sites[k], kkp - 1)
88+
@inbounds ind3 = prime(sites[kp], kkp)
89+
@inbounds η =.η0m[kkp] for η in ηs]
9090
tens = ITensor(ind1, ind2, ind3)
9191
for skp = 1:dim(ind1)
9292
for sk = 1:dim(ind2)
93-
tens[ind1=>skp, ind2=>sk, ind3=>skp] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
93+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>skp] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
9494
end
9595
end
9696
tens
9797
end
9898

9999
function generate_right_tensor(ηs, sites, blip_sites, k::Int, kp::Int, group_Δs, Δs, sbar)
100100
kkp = k - kp
101-
ind1 = prime(sites[kp], kkp - 1)
102-
ind2 = prime(blip_sites[k], kkp - 1)
103-
ind3 = prime(blip_sites[k], kkp)
104-
η =.η0m[kkp] for η in ηs]
101+
@inbounds ind1 = prime(sites[kp], kkp - 1)
102+
@inbounds ind2 = prime(blip_sites[k], kkp - 1)
103+
@inbounds ind3 = prime(blip_sites[k], kkp)
104+
@inbounds η =.η0m[kkp] for η in ηs]
105105
tens = ITensor(ind1, ind2, ind3)
106106
for skp = 1:dim(ind1)
107107
for sk = 1:dim(ind2)
108-
tens[ind1=>skp, ind2=>sk, ind3=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
108+
@inbounds tens[ind1=>skp, ind2=>sk, ind3=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
109109
end
110110
end
111111
tens
112112
end
113113

114114
function generate_top_tensor(ηs, sites, blip_sites, k::Int, kp::Int, group_Δs, Δs, sbar)
115115
kkp = k - kp
116-
ind1 = prime(sites[kp], kkp - 1)
117-
ind2 = prime(blip_sites[k], kkp - 1)
118-
η =.η0e[kkp] for η in ηs]
116+
@inbounds ind1 = prime(sites[kp], kkp - 1)
117+
@inbounds ind2 = prime(blip_sites[k], kkp - 1)
118+
@inbounds η =.η0e[kkp] for η in ηs]
119119
tens = ITensor(ind1, ind2)
120120
for skp = 1:dim(ind1)
121121
for sk = 1:dim(ind2)
122-
tens[ind1=>skp, ind2=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
122+
@inbounds tens[ind1=>skp, ind2=>sk] = exp.(-sum(group_Δs[:, sk] .* (real(η) .* Δs[:, skp] + 2im * imag(η) .* sbar[:, skp])))
123123
end
124124
end
125125
tens
@@ -151,63 +151,74 @@ function build_augmented_propagator(; fbU::AbstractArray{ComplexF64,3}, Jw::Abst
151151
U0e = zeros(ComplexF64, ntimes, sdim2, sdim2)
152152
T0e = zero(U0e)
153153

154-
# calculate for the first time step separately, s1->s2
155-
U0e[1, :, :] = fbU[1, :, :]
156-
for (bn, η) in enumerate(ηs)
157-
infl = exp.(-Δs[bn, :] .* (real.η00) * Δs[bn, :] + 2im * imag.η00) * sbar[bn, :]))
158-
for t = 1:sdim2
159-
U0e[1, t, :] .*= infl
160-
U0e[1, :, t] .*= infl
161-
infl1 = exp.(-Δs[bn, t] .* (real.η0e[1]) * Δs[bn, :] + 2im * imag.η0e[1]) * sbar[bn, :]))
162-
U0e[1, t, :] .*= infl1
154+
@inbounds begin
155+
# calculate for the first time step separately, s1->s2
156+
U0e[1, :, :] = fbU[1, :, :]
157+
for (bn, η) in enumerate(ηs)
158+
infl = exp.(-Δs[bn, :] .* (real.η00) * Δs[bn, :] + 2im * imag.η00) * sbar[bn, :]))
159+
for t = 1:sdim2
160+
U0e[1, t, :] .*= infl
161+
U0e[1, :, t] .*= infl
162+
infl1 = exp.(-Δs[bn, t] .* (real.η0e[1]) * Δs[bn, :] + 2im * imag.η0e[1]) * sbar[bn, :]))
163+
U0e[1, t, :] .*= infl1
164+
end
163165
end
164-
end
165-
TTM.update_Ts!(T0e, U0e, 1)
166-
if !isnothing(output)
167-
if !from_TTM
168-
Utilities.check_or_insert_value(output, "U0e", U0e)
166+
TTM.update_Ts!(T0e, U0e, 1)
167+
if !isnothing(output)
168+
if !from_TTM
169+
Utilities.check_or_insert_value(output, "U0e", U0e)
170+
end
171+
Utilities.check_or_insert_value(output, "T0e", T0e)
172+
output["U0e"][1, :, :] = U0e[1, :, :]
173+
output["T0e"][1, :, :] = T0e[1, :, :]
174+
flush(output)
169175
end
170-
Utilities.check_or_insert_value(output, "T0e", T0e)
171-
output["U0e"][1, :, :] = U0e[1, :, :]
172-
output["T0e"][1, :, :] = T0e[1, :, :]
173-
flush(output)
174-
end
175176

176-
sites = siteinds(sdim2, ntimes + 1)
177-
blip_sites = siteinds(size(group_Δs, 2), ntimes + 1; add_tags="blip_sites")
178-
for j = 2:ntimes
179-
if verbose
180-
@info "Step = $(j)"
181-
end
182-
# calculation for s1->s_{j+1}
183-
tens = [generate_top_tensor(ηs, sites, blip_sites, j + 1, 1, group_Δs, Δs, sbar)]
184-
for l = j:-1:3
185-
push!(tens, generate_left_tensor(ηs, sites, blip_sites, l, 1, group_Δs, Δs, sbar))
186-
end
187-
push!(tens, generate_bottom_left_tensor(ηs, sites, fbU[1, :, :], 2, Δs, sbar))
177+
sites = siteinds(sdim2, ntimes + 1)
178+
blip_sites = siteinds(size(group_Δs, 2), ntimes + 1; add_tags="blip_sites")
179+
for j = 2:ntimes
180+
if verbose
181+
@info "Step = $(j)"
182+
end
183+
tens = Vector{ITensor}(undef, j * (j+1) ÷ 2)
184+
# calculation for s1->s_{j+1}
185+
k = 1
186+
tens[k] = generate_top_tensor(ηs, sites, blip_sites, j + 1, 1, group_Δs, Δs, sbar)
187+
k += 1
188+
for l = j:-1:3
189+
tens[k] = generate_left_tensor(ηs, sites, blip_sites, l, 1, group_Δs, Δs, sbar)
190+
k += 1
191+
end
192+
tens[k] = generate_bottom_left_tensor(ηs, sites, fbU[1, :, :], 2, Δs, sbar)
193+
k += 1
188194

189-
for p = 3:j
190-
push!(tens, generate_bottom_center_tensor(ηs, sites, blip_sites, state_to_blip, fbU[p-1, :, :], p, Δs, sbar))
195+
for p = 3:j
196+
tens[k] = generate_bottom_center_tensor(ηs, sites, blip_sites, state_to_blip, fbU[p-1, :, :], p, Δs, sbar)
197+
k += 1
191198

192-
for h = 1:j-p
193-
push!(tens, generate_center_tensor(ηs, sites, blip_sites, p + h, p - 1, group_Δs, Δs, sbar))
194-
end
199+
for h = 1:j-p
200+
tens[k] = generate_center_tensor(ηs, sites, blip_sites, p + h, p - 1, group_Δs, Δs, sbar)
201+
k += 1
202+
end
195203

196-
push!(tens, generate_right_tensor(ηs, sites, blip_sites, j + 1, p - 1, group_Δs, Δs, sbar))
197-
end
204+
tens[k] = generate_right_tensor(ηs, sites, blip_sites, j + 1, p - 1, group_Δs, Δs, sbar)
205+
k += 1
206+
end
198207

199-
push!(tens, generate_bottom_right_tensor(ηs, sites, blip_sites, state_to_blip, fbU[j, :, :], j + 1, Δs, sbar))
208+
tens[k] = generate_bottom_right_tensor(ηs, sites, blip_sites, state_to_blip, fbU[j, :, :], j + 1, Δs, sbar)
209+
k += 1
200210

201-
prop = deepcopy(tens[1])
202-
for tensor in tens[2:end]
203-
prop *= tensor
204-
end
205-
U0e[j, :, :] = Utilities.convert_ITensor_to_matrix(prop, sites[1], sites[j+1])
206-
TTM.update_Ts!(T0e, U0e, j)
207-
if !isnothing(output)
208-
output["U0e"][j, :, :] = U0e[j, :, :]
209-
output["T0e"][j, :, :] = T0e[j, :, :]
210-
flush(output)
211+
prop = deepcopy(tens[1])
212+
for tensor in tens[2:end]
213+
prop *= tensor
214+
end
215+
U0e[j, :, :] = Utilities.convert_ITensor_to_matrix(prop, sites[1], sites[j+1])
216+
TTM.update_Ts!(T0e, U0e, j)
217+
if !isnothing(output)
218+
output["U0e"][j, :, :] = U0e[j, :, :]
219+
output["T0e"][j, :, :] = T0e[j, :, :]
220+
flush(output)
221+
end
211222
end
212223
end
213224
U0e

src/Utilities/ITensorUtils.jl

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using LinearAlgebra
2-
using ITensors
2+
using ITensors, ITensorMPS
33

44
"""
55
calculate_Liouvillian(H::OpSum, sites)
@@ -72,10 +72,10 @@ function MPS_to_MPO(ρ::MPS, fbcombiner)
7272
end
7373

7474
"""
75-
ITensors.expect(ρ::MPO, ops; kwargs...)
76-
Extends ITensors' `expect` function to handle density matrices in the form of MPOs.
75+
ITensorMPS.expect(ρ::MPO, ops; kwargs...)
76+
Extends the ITensorMPS `expect` function to handle density matrices in the form of MPOs.
7777
"""
78-
function ITensors.expect::MPO, ops::Tuple; kwargs...)
78+
function ITensorMPS.expect::MPO, ops::Tuple; kwargs...)
7979
ρtmp = deepcopy(ρ)
8080
N = length(ρ)
8181
s = Vector{Index{Int64}}()
@@ -134,19 +134,19 @@ function ITensors.expect(ρ::MPO, ops::Tuple; kwargs...)
134134
return ex
135135
end
136136

137-
function ITensors.expect(psi::MPO, op::AbstractString; kwargs...)
137+
function ITensorMPS.expect(psi::MPO, op::AbstractString; kwargs...)
138138
return first(expect(psi, (op,); kwargs...))
139139
end
140140

141-
function ITensors.expect(psi::MPO, op::Matrix{<:Number}; kwargs...)
141+
function ITensorMPS.expect(psi::MPO, op::Matrix{<:Number}; kwargs...)
142142
return first(expect(psi, (op,); kwargs...))
143143
end
144144

145-
function ITensors.expect(psi::MPO, op1::AbstractString, ops::AbstractString...; kwargs...)
145+
function ITensorMPS.expect(psi::MPO, op1::AbstractString, ops::AbstractString...; kwargs...)
146146
return expect(psi, (op1, ops...); kwargs...)
147147
end
148148

149-
function ITensors.expect(psi::MPO, op1::Matrix{<:Number}, ops::Matrix{<:Number}...; kwargs...)
149+
function ITensorMPS.expect(psi::MPO, op1::Matrix{<:Number}, ops::Matrix{<:Number}...; kwargs...)
150150
return expect(psi, (op1, ops...); kwargs...)
151151
end
152152

@@ -255,7 +255,7 @@ function convert_ITensor_to_matrix(tens, sinit, sterm)
255255
matrix
256256
end
257257

258-
function ITensors.:+(::ITensors.Algorithm"approx", ψ::MPST...; cutoff::Float64, maxdim::Int64) where {MPST<:ITensors.AbstractMPS}
258+
function ITensors.:+(::ITensors.Algorithm"approx", ψ::MPST...; cutoff::Float64, maxdim::Int64) where {MPST<:ITensorMPS.AbstractMPS}
259259
@error "This approximate function needs to be implemented"
260260
n = length(first(ψ))
261261
@assert all(ψᵢ -> length(first(ψ)) == length(ψᵢ), ψ)

0 commit comments

Comments
 (0)