@@ -47,15 +47,42 @@ struct CView{S,E,N} <: AbstractArray{E,N}
4747end
4848
4949function Base. getindex(v:: CView{<:FiniteMPS,E} , i:: Int ):: E where {E}
50- if ismissing(v. parent. Cs[i + 1 ])
51- if i == 0 || ! ismissing(v. parent. ALs[i])
52- (v. parent. Cs[i + 1 ], temp) = rightorth(_transpose_tail(v. parent. AC[i + 1 ]);
53- alg= LQpos())
54- v. parent. ARs[i + 1 ] = _transpose_front(temp)
55- else
56- (v. parent. ALs[i], v. parent. Cs[i + 1 ]) = leftorth(v. parent. AC[i]; alg= QRpos())
50+ ismissing(v. parent. Cs[i + 1 ]) || return v. parent. Cs[i + 1 ]
51+
52+ if i == 0 || ! ismissing(v. parent. ALs[i]) # center is too far right
53+ center = findfirst(! ismissing, v. parent. ACs)
54+ if isnothing(center)
55+ center = findfirst(! ismissing, v. parent. Cs)
56+ @assert ! isnothing(center) " Invalid state"
57+ center -= 1 # offset in Cs vs C
58+ @assert ! ismissing(v. parent. ALs[center]) " Invalid state"
59+ v. parent. ACs[center] = _mul_tail(v. parent. ALs[center], v. parent. Cs[center + 1 ])
60+ end
61+
62+ for j in Iterators. reverse((i + 1 ): center)
63+ v. parent. Cs[j], tmp = rightorth(_transpose_tail(v. parent. ACs[j]); alg= LQpos())
64+ v. parent. ARs[j] = _transpose_front(tmp)
65+ if j != i + 1 # last AC not needed
66+ v. parent. ACs[j - 1 ] = _mul_tail(v. parent. ALs[j - 1 ], v. parent. Cs[j])
67+ end
68+ end
69+ else # center is too far left
70+ center = findlast(! ismissing, v. parent. ACs)
71+ if isnothing(center)
72+ center = findlast(! ismissing, v. parent. Cs)
73+ @assert ! isnothing(center) " Invalid state"
74+ @assert ! ismissing(v. parent. ARs[center]) " Invalid state"
75+ v. parent. ACs[center] = _mul_front(v. parent. Cs[center], v. parent. ARs[center])
76+ end
77+
78+ for j in center: i
79+ v. parent. ALs[j], v. parent. Cs[j + 1 ] = leftorth(v. parent. ACs[j]; alg= QRpos())
80+ if j != i # last AC not needed
81+ v. parent. ACs[j + 1 ] = _mul_front(v. parent. Cs[j + 1 ], v. parent. ARs[j + 1 ])
82+ end
5783 end
5884 end
85+
5986 return v. parent. Cs[i + 1 ]
6087end
6188
@@ -93,15 +120,16 @@ struct ACView{S,E,N} <: AbstractArray{E,N}
93120end
94121
95122function Base. getindex(v:: ACView{<:FiniteMPS,E} , i:: Int ):: E where {E}
96- if ismissing(v. parent. ACs[i]) && ! ismissing( v. parent. ARs [i])
97- c = v . parent . C[i - 1 ]
98- ar = v. parent. ARs[i]
99- v. parent. ACs[i] = _transpose_front(c * _transpose_tail(ar) )
100- elseif ismissing(v . parent . ACs[i]) && ! ismissing(v. parent. ALs[i])
101- c = v. parent. C[i]
102- al = v . parent . ALs[i]
103- v . parent . ACs[i] = al * c
123+ ismissing(v. parent. ACs[i]) || return v. parent. ACs [i]
124+
125+ if ! ismissing( v. parent. ARs[i]) # center is too far left
126+ v. parent. ACs[i] = _mul_front(v . parent . C[i - 1 ], v . parent . ARs[i] )
127+ elseif ! ismissing(v. parent. ALs[i])
128+ v . parent . ACs[i] = _mul_tail( v. parent. ALs[i], v . parent . C[i])
129+ else
130+ error( " Invalid state " )
104131 end
132+
105133 return v. parent. ACs[i]
106134end
107135
0 commit comments