23 using BRanks =
typename Tb::Ranks;
25 auto const toleranceLocal =
30 [&](
auto const... seq)
33 MHNop.template core<seq>()...);
41 decltype(x0.template core<k>())>::size(0),
44 decltype(x0.template core<k>())>::size(2)>(
45 x.template core<k>(), 0, 0, 0) = x0.template core<k>();
68 reshape<1, 1>(std::get<0>(psiphiA)) =
70 reshape<1, 1>(std::get<D>(psiphiA)) =
85 reshape<1, 1>(std::get<0>(psiphib)) =
87 reshape<1, 1>(std::get<D>(psiphib)) =
95 orthogonalize<pRC::Position::Right>(
x.template core<k>());
97 x.template core<k>() = q;
98 x.template core<k - 1>() =
99 contract<2, 0>(
x.template core<k - 1>(), l);
102 std::get<k>(psiphiA) =
103 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
104 contract<2, 3, 1, 3>(op.template core<k>(),
105 eval(contract<2, 2>(
x.template core<k>(),
106 std::get<k + 1>(psiphiA)))));
108 std::get<k>(psiphib) =
109 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
110 eval(contract<2, 1>(b.template core<k>(),
111 std::get<k + 1>(psiphib))));
124 decltype(op.template core<k>())>::size(0),
127 decltype(op.template core<k + 1>())>::size(3)>(
128 permute<0, 1, 3, 2, 4, 5>(
129 contract<3, 0>(op.template core<k>(),
130 op.template core<k + 1>())));
133 decltype(b.template core<k>())>::size(0),
136 decltype(b.template core<k + 1>())>::size(2)>(
137 contract<2, 0>(b.template core<k>(),
138 b.template core<k + 1>()));
141 decltype(
x.template core<k>())>::size(0),
144 decltype(
x.template core<k + 1>())>::size(2)>(
145 contract<2, 0>(
x.template core<k>(),
146 x.template core<k + 1>()));
149 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
150 contract<1, 0>(get<k>(psiphiA),
151 eval(contract<3, 1>(sA, get<k + 2>(psiphiA))))));
152 auto const bk = linearize(contract<1, 0>(get<k>(psiphib),
153 eval(contract<2, 1>(sB, get<k + 2>(psiphib)))));
158 decltype(
x.template core<k>())>::size(0),
161 decltype(
x.template core<k + 1>())>::size(2)>
164 linearize(sX), tolerance);
167 auto const [u, s, v] = svd<Ranks::size(k)>(matricize(sol));
172 decltype(
x.template core<k>())>::size(0),
177 decltype(
x.template core<k>())>::size(0),
178 2, Ranks::size(k)>(ex, 0, 0, 0)) = linearize(u);
180 decltype(
x.template core<k>())>::size(0),
181 2, ERanks::size(k) - Ranks::size(k)>(ex, 0, 0,
184 decltype(
x.template core<k>())>::size(0),
185 2, ERanks::size(k) - Ranks::size(k)>>(rng, dist);
190 decltype(
x.template core<k + 1>())>::size(2)>
192 folding<pRC::Position::Right>(tNext) =
193 fromDiagonal(s) * adjoint(v);
196 decltype(
x.template core<k + 1>())>::size(2)>
198 slice<Ranks::size(k), 2,
200 decltype(
x.template core<k + 1>())>::size(2)>(enext,
202 slice<ERanks::size(k) - Ranks::size(k), 2,
204 decltype(
x.template core<k + 1>())>::size(2)>(enext,
208 auto const [qq, rr] =
209 orthogonalize<pRC::Position::Left>(ex);
210 x.template core<k>() = qq;
211 x.template core<k + 1>() = contract<1, 0>(rr, enext);
214 get<k + 1>(psiphiA) =
215 contract<1, 0, 0, 3>(conj(
x.template core<k>()),
216 contract<2, 0, 0, 3>(op.template core<k>(),
217 eval(contract<0, 2>(
x.template core<k>(),
221 get<k + 1>(psiphib) =
222 contract<0, 1, 2, 0>(conj(
x.template core<k>()),
223 eval(contract<0, 1>(b.template core<k>(),
233 auto const sA = reshape<
235 decltype(op.template core<k - 1>())>::size(0),
238 decltype(op.template core<k>())>::size(3)>(
239 permute<0, 1, 3, 2, 4, 5>(contract<3, 0>(
240 op.template core<k - 1>(), op.template core<k>())));
241 auto const sB = reshape<
243 decltype(b.template core<k - 1>())>::size(0),
246 decltype(b.template core<k>())>::size(2)>(
247 contract<2, 0>(b.template core<k - 1>(),
248 b.template core<k>()));
249 auto const sX = reshape<
251 decltype(
x.template core<k - 1>())>::size(0),
254 decltype(
x.template core<k>())>::size(2)>(
255 contract<2, 0>(
x.template core<k - 1>(),
256 x.template core<k>()));
259 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
260 contract<1, 0>(get<k - 1>(psiphiA),
261 eval(contract<3, 1>(sA, get<k + 1>(psiphiA))))));
263 linearize(contract<1, 0>(get<k - 1>(psiphib),
264 eval(contract<2, 1>(sB, get<k + 1>(psiphib)))));
269 decltype(
x.template core<k - 1>())>::size(0),
272 decltype(
x.template core<k>())>::size(2)>
275 linearize(sX), tolerance);
278 auto const [u, s, v] =
279 svd<Ranks::size(k - 1)>(matricize(sol));
284 decltype(
x.template core<k>())>::size(2)>
286 linearize(slice<Ranks::size(k - 1), 2,
288 decltype(
x.template core<k>())>::size(2)>(ex, 0, 0,
289 0)) = linearize(adjoint(v));
290 slice<ERanks::size(k - 1) - Ranks::size(k - 1), 2,
292 decltype(
x.template core<k>())>::size(2)>(ex,
294 ERanks::size(k - 1) - Ranks::size(k - 1), 2,
296 decltype(
x.template core<k>())>::size(2)>>(rng,
302 decltype(
x.template core<k - 1>())>::size(0),
303 2, Ranks::size(k - 1)>
305 folding<pRC::Position::Left>(tNext) = u * fromDiagonal(s);
308 decltype(
x.template core<k - 1>())>::size(0),
309 2, ERanks::size(k - 1)>
312 decltype(
x.template core<k - 1>())>::size(0),
313 2, Ranks::size(k - 1)>(enext, 0, 0, 0) = tNext;
316 decltype(
x.template core<k - 1>())>::size(0),
317 2, ERanks::size(k - 1) - Ranks::size(k - 1)>(enext,
318 0, 0, Ranks::size(k - 1))) =
pRC::zero();
321 auto const [ll, qq] =
322 orthogonalize<pRC::Position::Right>(ex);
323 x.template core<k>() = qq;
324 x.template core<k - 1>() = contract<2, 0>(enext, ll);
329 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
330 contract<2, 3, 1, 3>(op.template core<k>(),
331 eval(contract<2, 2>(
x.template core<k>(),
332 get<k + 1>(psiphiA)))));
336 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
337 eval(contract<2, 1>(b.template core<k>(),
338 get<k + 1>(psiphib))));
341 return round<Ranks>(
x);