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>();
54 auto z = round<ZRanks>(
74 reshape<1, 1>(std::get<0>(psiphiA)) =
76 reshape<1, 1>(std::get<D>(psiphiA)) =
91 reshape<1, 1>(std::get<0>(psiphib)) =
93 reshape<1, 1>(std::get<D>(psiphib)) =
111 reshape<1, 1>(std::get<0>(psiphihatA)) =
113 reshape<1, 1>(std::get<D>(psiphihatA)) =
118 [](
auto const... seq)
128 reshape<1, 1>(std::get<0>(psiphihatb)) =
130 reshape<1, 1>(std::get<D>(psiphihatb)) =
139 orthogonalize<pRC::Position::Right>(
x.template core<k>());
141 x.template core<k>() = q;
142 x.template core<k - 1>() =
143 contract<2, 0>(
x.template core<k - 1>(), l);
146 auto const [l, q] = orthogonalize<pRC::Position::Right>(
147 z.template core<k>());
148 z.template core<k>() = q;
149 z.template core<k - 1>() =
150 contract<2, 0>(
z.template core<k - 1>(), l);
154 std::get<k>(psiphiA) =
155 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
156 contract<2, 3, 1, 3>(op.template core<k>(),
157 eval(contract<2, 2>(
x.template core<k>(),
158 std::get<k + 1>(psiphiA)))));
160 std::get<k>(psiphib) =
161 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
162 eval(contract<2, 1>(b.template core<k>(),
163 std::get<k + 1>(psiphib))));
165 std::get<k>(psiphihatA) =
166 contract<1, 2, 1, 3>(conj(
z.template core<k>()),
167 contract<2, 3, 1, 3>(op.template core<k>(),
168 eval(contract<2, 2>(
x.template core<k>(),
169 get<k + 1>(psiphihatA)))));
171 std::get<k>(psiphihatb) =
172 contract<1, 2, 1, 2>(conj(
z.template core<k>()),
173 eval(contract<2, 1>(b.template core<k>(),
174 get<k + 1>(psiphihatb))));
185 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
186 contract<1, 0>(get<k>(psiphiA),
187 eval(contract<3, 1>(op.template core<k>(),
188 get<k + 1>(psiphiA))))));
190 auto const bk = linearize(contract<1, 0>(get<k>(psiphib),
191 eval(contract<2, 1>(b.template core<k>(),
192 get<k + 1>(psiphib)))));
194 auto const hatAk = matricize(permute<0, 2, 4, 1, 3, 5>(
195 contract<1, 0>(get<k>(psiphihatA),
196 eval(contract<3, 1>(op.template core<k>(),
197 get<k + 1>(psiphihatA))))));
200 linearize(contract<1, 0>(get<k>(psiphihatb),
201 eval(contract<2, 1>(b.template core<k>(),
202 get<k + 1>(psiphihatb)))));
204 auto const rAk = matricize(permute<0, 2, 4, 1, 3, 5>(
205 contract<1, 0>(get<k>(psiphiA),
206 eval(contract<3, 1>(op.template core<k>(),
207 get<k + 1>(psiphihatA))))));
209 auto const rbk = linearize(contract<1, 0>(get<k>(psiphib),
210 eval(contract<2, 1>(b.template core<k>(),
211 get<k + 1>(psiphihatb)))));
217 linearize(
x.template core<k>()), tolerance);
221 truncate<Ranks::size(k), pRC::Position::Right>(sol);
226 decltype(
x.template core<k>())>::size(0),
230 decltype(
x.template core<k>())>::size(0),
231 2, Ranks::size(k)>(ex, 0, 0, 0) = q;
233 if constexpr(ERanks::size(k) - Ranks::size(k) > 0)
236 decltype(
x.template core<k>())>::size(0);
238 auto const tt = eval(rbk - rAk * linearize(sol));
241 auto const [zl, zr] =
242 truncate<ERanks::size(k) - Ranks::size(k),
246 decltype(
x.template core<k>())>::size(0),
247 2, ERanks::size(k) - Ranks::size(k)>(ex, 0, 0,
248 Ranks::size(k)) = zl;
252 linearize(
z.template core<k>()) =
253 hatbk - hatAk * linearize(sol);
254 auto const [rqq, rrr] = orthogonalize<pRC::Position::Left>(
255 z.template core<k>());
256 z.template core<k>() = rqq;
259 auto tNext = contract<1, 0>(r,
x.template core<k + 1>());
262 decltype(
x.template core<k + 1>())>::size(2)>
264 slice<Ranks::size(k), 2,
266 decltype(
x.template core<k + 1>())>::size(2)>(enext,
268 slice<ERanks::size(k) - Ranks::size(k), 2,
270 decltype(
x.template core<k + 1>())>::size(2)>(enext,
274 auto const [qq, rr] =
275 orthogonalize<pRC::Position::Left>(ex);
276 x.template core<k>() = qq;
277 x.template core<k + 1>() = contract<1, 0>(rr, enext);
280 get<k + 1>(psiphiA) =
281 contract<1, 0, 0, 3>(conj(
x.template core<k>()),
282 contract<2, 0, 0, 3>(op.template core<k>(),
283 eval(contract<0, 2>(
x.template core<k>(),
286 get<k + 1>(psiphib) =
287 contract<0, 1, 2, 0>(conj(
x.template core<k>()),
288 eval(contract<0, 1>(b.template core<k>(),
291 get<k + 1>(psiphihatA) =
292 contract<1, 0, 0, 3>(conj(
z.template core<k>()),
293 contract<2, 0, 0, 3>(op.template core<k>(),
294 eval(contract<0, 2>(
x.template core<k>(),
295 get<k>(psiphihatA)))));
297 get<k + 1>(psiphihatb) =
298 contract<0, 1, 2, 0>(conj(
z.template core<k>()),
299 eval(contract<0, 1>(b.template core<k>(),
300 get<k>(psiphihatb))));
309 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
310 contract<1, 0>(get<k>(psiphiA),
311 eval(contract<3, 1>(op.template core<k>(),
312 get<k + 1>(psiphiA))))));
314 auto const bk = linearize(contract<1, 0>(get<k>(psiphib),
315 eval(contract<2, 1>(b.template core<k>(),
316 get<k + 1>(psiphib)))));
318 auto const hatAk = matricize(permute<0, 2, 4, 1, 3, 5>(
319 contract<1, 0>(get<k>(psiphihatA),
320 eval(contract<3, 1>(op.template core<k>(),
321 get<k + 1>(psiphihatA))))));
324 linearize(contract<1, 0>(get<k>(psiphihatb),
325 eval(contract<2, 1>(b.template core<k>(),
326 get<k + 1>(psiphihatb)))));
328 auto const rAk = matricize(permute<0, 2, 4, 1, 3, 5>(
329 contract<1, 0>(get<k>(psiphihatA),
330 eval(contract<3, 1>(op.template core<k>(),
331 get<k + 1>(psiphiA))))));
334 linearize(contract<1, 0>(get<k>(psiphihatb),
335 eval(contract<2, 1>(b.template core<k>(),
336 get<k + 1>(psiphib)))));
342 linearize(
x.template core<k>()), tolerance);
351 decltype(
x.template core<k>())>::size(2)>
353 slice<Ranks::size(k - 1), 2,
355 decltype(
x.template core<k>())>::size(2)>(ex, 0, 0,
358 if constexpr(ERanks::size(k - 1) - Ranks::size(k - 1) > 0)
361 decltype(
x.template core<k>())>::size(2);
363 auto const tt = eval(rbk - rAk * linearize(sol));
366 auto const [zl, zr] =
367 truncate<ERanks::size(k - 1) - Ranks::size(k - 1),
370 slice<ERanks::size(k - 1) - Ranks::size(k - 1), 2,
372 decltype(
x.template core<k>())>::size(2)>(ex,
373 Ranks::size(k - 1), 0, 0) = zr;
377 linearize(
z.template core<k>()) =
378 hatbk - hatAk * linearize(sol);
379 auto const [rll, rqq] = orthogonalize<pRC::Position::Right>(
380 z.template core<k>());
381 z.template core<k>() = rqq;
384 auto tNext = contract<2, 0>(
x.template core<k - 1>(), l);
387 decltype(
x.template core<k - 1>())>::size(0),
388 2, ERanks::size(k - 1)>
391 decltype(
x.template core<k - 1>())>::size(0),
392 2, Ranks::size(k - 1)>(enext, 0, 0, 0) = tNext;
395 decltype(
x.template core<k - 1>())>::size(0),
396 2, ERanks::size(k - 1) - Ranks::size(k - 1)>(enext,
397 0, 0, Ranks::size(k - 1))) =
pRC::zero();
400 auto const [ll, qq] =
401 orthogonalize<pRC::Position::Right>(ex);
402 x.template core<k>() = qq;
403 x.template core<k - 1>() = contract<2, 0>(enext, ll);
408 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
409 contract<2, 3, 1, 3>(op.template core<k>(),
410 eval(contract<2, 2>(
x.template core<k>(),
411 get<k + 1>(psiphiA)))));
414 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
415 eval(contract<2, 1>(b.template core<k>(),
416 get<k + 1>(psiphib))));
419 contract<1, 2, 1, 3>(conj(
z.template core<k>()),
420 contract<2, 3, 1, 3>(op.template core<k>(),
421 eval(contract<2, 2>(
x.template core<k>(),
422 get<k + 1>(psiphihatA)))));
425 contract<1, 2, 1, 2>(conj(
z.template core<k>()),
426 eval(contract<2, 1>(b.template core<k>(),
427 get<k + 1>(psiphihatb))));
430 return round<Ranks>(
x);