@@ -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