19 using ModeSizes =
decltype(getModeSizes<D>());
20 using Ranks =
decltype(getRanks<D, R>());
21 using ERanks =
decltype(getRanks<D, R + pRC::Size(4)>());
22 using ZRanks =
decltype(getRanks<D, pRC::Size(4)>());
23 using BRanks =
typename Tb::Ranks;
25 auto const toleranceLocal =
30 [&](
auto const... seq)
33 MHNop.template core<seq>()...);
44 auto z = round<ZRanks>(
64 reshape<1, 1>(std::get<0>(psiphiA)) =
66 reshape<1, 1>(std::get<D>(psiphiA)) =
81 reshape<1, 1>(std::get<0>(psiphib)) =
83 reshape<1, 1>(std::get<D>(psiphib)) =
101 reshape<1, 1>(std::get<0>(psiphihatA)) =
103 reshape<1, 1>(std::get<D>(psiphihatA)) =
108 [](
auto const... seq)
118 reshape<1, 1>(std::get<0>(psiphihatb)) =
120 reshape<1, 1>(std::get<D>(psiphihatb)) =
128 auto const [lambda, l, q] =
129 orthogonalize<pRC::Position::Right>(x.template core<k>());
131 x.template core<k>() = q;
132 x.template core<k - 1>() =
133 lambda * contract<2, 0>(x.template core<k - 1>(), l);
136 auto const [lambda, l, q] =
137 orthogonalize<pRC::Position::Right>(
138 z.template core<k>());
139 z.template core<k>() = q;
140 z.template core<k - 1>() =
141 lambda * contract<2, 0>(z.template core<k - 1>(), l);
145 std::get<k>(psiphiA) =
146 contract<1, 2, 1, 3>(conj(x.template core<k>()),
147 contract<2, 3, 1, 3>(op.template core<k>(),
148 eval(contract<2, 2>(x.template core<k>(),
149 std::get<k + 1>(psiphiA)))));
151 std::get<k>(psiphib) =
152 contract<1, 2, 1, 2>(conj(x.template core<k>()),
153 eval(contract<2, 1>(b.template core<k>(),
154 std::get<k + 1>(psiphib))));
156 std::get<k>(psiphihatA) =
157 contract<1, 2, 1, 3>(conj(z.template core<k>()),
158 contract<2, 3, 1, 3>(op.template core<k>(),
159 eval(contract<2, 2>(x.template core<k>(),
160 get<k + 1>(psiphihatA)))));
162 std::get<k>(psiphihatb) =
163 contract<1, 2, 1, 2>(conj(z.template core<k>()),
164 eval(contract<2, 1>(b.template core<k>(),
165 get<k + 1>(psiphihatb))));
178 decltype(op.template core<k>())>::size(0),
181 decltype(op.template core<k + 1>())>::size(3)>(
182 permute<0, 1, 3, 2, 4, 5>(contract<3, 0>(
183 op.template core<k>(), op.template core<k + 1>())));
187 decltype(b.template core<k>())>::size(0),
190 decltype(b.template core<k + 1>())>::size(2)>(
191 contract<2, 0>(b.template core<k>(),
192 b.template core<k + 1>()));
196 decltype(x.template core<k>())>::size(0),
199 decltype(x.template core<k + 1>())>::size(2)>(
200 contract<2, 0>(x.template core<k>(),
201 x.template core<k + 1>()));
203 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
204 contract<1, 0>(std::get<k>(psiphiA),
205 eval(contract<3, 1>(sA,
206 std::get<k + 2>(psiphiA))))));
208 auto const bk = linearize(contract<1, 0>(
209 std::get<k>(psiphib),
210 eval(contract<2, 1>(sB, std::get<k + 2>(psiphib)))));
212 auto const hatAk = matricize(permute<0, 2, 4, 1, 3, 5>(
213 contract<1, 0>(std::get<k>(psiphihatA),
214 eval(contract<3, 1>(sA,
215 std::get<k + 2>(psiphihatA))))));
217 auto const hatbk = linearize(contract<1, 0>(
218 std::get<k>(psiphihatb),
219 eval(contract<2, 1>(sB, std::get<k + 2>(psiphihatb)))));
221 auto const rAk = matricize(permute<0, 2, 4, 1, 3, 5>(
222 contract<1, 0>(std::get<k>(psiphiA),
223 eval(contract<3, 1>(sA,
224 std::get<k + 2>(psiphihatA))))));
226 auto const rbk = linearize(contract<1, 0>(
227 std::get<k>(psiphib),
228 eval(contract<2, 1>(sB, std::get<k + 2>(psiphihatb)))));
233 decltype(x.template core<k>())>::size(0),
236 decltype(x.template core<k + 1>())>::size(2)>
239 linearize(sX), toleranceLocal);
242 auto const [u, s, v] = svd<Ranks::size(k)>(matricize(sol));
246 decltype(x.template core<k>())>::size(0),
251 decltype(x.template core<k>())>::size(0),
252 2, Ranks::size(k)>(ex, 0, 0, 0)) = linearize(u);
254 if constexpr(ERanks::size(k) - Ranks::size(k) > 0)
257 decltype(x.template core<k>())>::size(0);
259 decltype(z.template core<k + 1>())>::size(2);
261 auto const tt = eval(rbk - rAk * linearize(sol));
264 auto const [zu, zs, zv] =
265 svd<ERanks::size(k) - Ranks::size(k)>(
270 decltype(x.template core<k>())>::size(0),
271 2, ERanks::size(k) - Ranks::size(k)>(ex, 0, 0,
273 linearize(zu * fromDiagonal(zs));
278 decltype(z.template core<k>())>::size(0),
281 decltype(z.template core<k + 1>())>::size(2)>
283 linearize(zz) = hatbk - hatAk * linearize(sol);
285 auto const [zu, zs, zv] =
286 svd<ZRanks::size(k)>(matricize(zz));
288 linearize(z.template core<k>()) = linearize(zu);
292 decltype(x.template core<k + 1>())>::size(2)>
294 folding<pRC::Position::Right>(tNext) =
295 fromDiagonal(s) * adjoint(v);
298 decltype(x.template core<k + 1>())>::size(2)>
300 slice<Ranks::size(k), 2,
302 decltype(x.template core<k + 1>())>::size(2)>(eNext,
304 slice<ERanks::size(k) - Ranks::size(k), 2,
306 decltype(x.template core<k + 1>())>::size(2)>(eNext,
309 auto const [llambda, qq, rr] =
310 orthogonalize<pRC::Position::Left>(ex);
311 x.template core<k>() = qq;
312 x.template core<k + 1>() =
313 llambda * contract<1, 0>(rr, eNext);
316 std::get<k + 1>(psiphiA) =
317 contract<1, 0, 0, 3>(conj(x.template core<k>()),
318 contract<2, 0, 0, 3>(op.template core<k>(),
319 eval(contract<0, 2>(x.template core<k>(),
320 std::get<k>(psiphiA)))));
323 std::get<k + 1>(psiphib) =
324 contract<0, 1, 2, 0>(conj(x.template core<k>()),
325 eval(contract<0, 1>(b.template core<k>(),
326 std::get<k>(psiphib))));
329 std::get<k + 1>(psiphihatA) =
330 contract<1, 0, 0, 3>(conj(z.template core<k>()),
331 contract<2, 0, 0, 3>(op.template core<k>(),
332 eval(contract<0, 2>(x.template core<k>(),
333 std::get<k>(psiphihatA)))));
336 std::get<k + 1>(psiphihatb) =
337 contract<0, 1, 2, 0>(conj(z.template core<k>()),
338 eval(contract<0, 1>(b.template core<k>(),
339 std::get<k>(psiphihatb))));
350 decltype(op.template core<k - 1>())>::size(0),
353 decltype(op.template core<k>())>::size(3)>(
354 permute<0, 1, 3, 2, 4, 5>(contract<3, 0>(
355 op.template core<k - 1>(), op.template core<k>())));
359 decltype(b.template core<k - 1>())>::size(0),
362 decltype(b.template core<k>())>::size(2)>(
363 contract<2, 0>(b.template core<k - 1>(),
364 b.template core<k>()));
368 decltype(x.template core<k - 1>())>::size(0),
371 decltype(x.template core<k>())>::size(2)>(
372 contract<2, 0>(x.template core<k - 1>(),
373 x.template core<k>()));
375 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
376 contract<1, 0>(std::get<k - 1>(psiphiA),
377 eval(contract<3, 1>(sA,
378 std::get<k + 1>(psiphiA))))));
380 auto const bk = linearize(contract<1, 0>(
381 std::get<k - 1>(psiphib),
382 eval(contract<2, 1>(sB, std::get<k + 1>(psiphib)))));
384 auto const hatAk = matricize(permute<0, 2, 4, 1, 3, 5>(
385 contract<1, 0>(std::get<k - 1>(psiphihatA),
386 eval(contract<3, 1>(sA,
387 std::get<k + 1>(psiphihatA))))));
389 auto const hatbk = linearize(contract<1, 0>(
390 std::get<k - 1>(psiphihatb),
391 eval(contract<2, 1>(sB, std::get<k + 1>(psiphihatb)))));
393 auto const rAk = matricize(permute<0, 2, 4, 1, 3, 5>(
394 contract<1, 0>(std::get<k - 1>(psiphihatA),
395 eval(contract<3, 1>(sA,
396 std::get<k + 1>(psiphiA))))));
398 auto const rbk = linearize(contract<1, 0>(
399 std::get<k - 1>(psiphihatb),
400 eval(contract<2, 1>(sB, std::get<k + 1>(psiphib)))));
405 decltype(x.template core<k - 1>())>::size(0),
408 decltype(x.template core<k>())>::size(2)>
411 linearize(sX), tolerance);
414 auto const [u, s, v] =
415 svd<Ranks::size(k - 1)>(matricize(sol));
419 decltype(x.template core<k>())>::size(2)>
421 linearize(slice<Ranks::size(k - 1), 2,
423 decltype(x.template core<k>())>::size(2)>(ex, 0, 0,
424 0)) = linearize(adjoint(v));
426 if constexpr(ERanks::size(k - 1) - Ranks::size(k - 1) > 0)
429 decltype(z.template core<k - 1>())>::size(0);
431 decltype(x.template core<k>())>::size(2);
433 auto const tt = eval(rbk - rAk * linearize(sol));
436 auto const [zu, zs, zv] =
437 svd<ERanks::size(k - 1) - Ranks::size(k - 1)>(
441 slice<ERanks::size(k - 1) - Ranks::size(k - 1), 2,
443 decltype(x.template core<k>())>::size(2)>(
444 ex, Ranks::size(k - 1), 0, 0)) =
445 linearize(fromDiagonal(zs) * adjoint(zv));
450 decltype(z.template core<k - 1>())>::size(0),
453 decltype(z.template core<k>())>::size(2)>
455 linearize(zz) = hatbk - hatAk * linearize(sol);
457 auto const [zu, zs, zv] =
458 svd<ZRanks::size(k - 1)>(matricize(zz));
460 linearize(z.template core<k>()) = linearize(adjoint(zv));
464 decltype(x.template core<k - 1>())>::size(0),
465 2, Ranks::size(k - 1)>
467 folding<pRC::Position::Left>(tNext) = u * fromDiagonal(s);
470 decltype(x.template core<k - 1>())>::size(0),
471 2, ERanks::size(k - 1)>
474 decltype(x.template core<k - 1>())>::size(0),
475 2, Ranks::size(k - 1)>(eNext, 0, 0, 0) = tNext;
478 decltype(x.template core<k - 1>())>::size(0),
479 2, ERanks::size(k - 1) - Ranks::size(k - 1)>(eNext,
480 0, 0, Ranks::size(k - 1))) =
pRC::zero();
482 auto const [llambda, ll, qq] =
483 orthogonalize<pRC::Position::Right>(ex);
484 x.template core<k>() = qq;
485 x.template core<k - 1>() =
486 llambda * contract<2, 0>(eNext, ll);
490 std::get<k>(psiphiA) =
491 contract<1, 2, 1, 3>(conj(x.template core<k>()),
492 contract<2, 3, 1, 3>(op.template core<k>(),
493 eval(contract<2, 2>(x.template core<k>(),
494 std::get<k + 1>(psiphiA)))));
497 std::get<k>(psiphib) =
498 contract<1, 2, 1, 2>(conj(x.template core<k>()),
499 eval(contract<2, 1>(b.template core<k>(),
500 std::get<k + 1>(psiphib))));
503 std::get<k>(psiphihatA) =
504 contract<1, 2, 1, 3>(conj(z.template core<k>()),
505 contract<2, 3, 1, 3>(op.template core<k>(),
506 eval(contract<2, 2>(x.template core<k>(),
507 std::get<k + 1>(psiphihatA)))));
510 std::get<k>(psiphihatb) =
511 contract<1, 2, 1, 2>(conj(z.template core<k>()),
512 eval(contract<2, 1>(b.template core<k>(),
513 std::get<k + 1>(psiphihatb))));