20 using BRanks =
typename Tb::Ranks;
22 auto const toleranceLocal =
27 [&](
auto const... seq)
30 MHNop.template core<seq>()...);
50 reshape<1, 1>(std::get<0>(psiphiA)) =
52 reshape<1, 1>(std::get<D>(psiphiA)) =
67 reshape<1, 1>(std::get<0>(psiphib)) =
69 reshape<1, 1>(std::get<D>(psiphib)) =
77 orthogonalize<pRC::Position::Right>(
x.template core<k>());
79 x.template core<k>() = q;
80 x.template core<k - 1>() =
81 contract<2, 0>(
x.template core<k - 1>(), l);
84 std::get<k>(psiphiA) =
85 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
86 contract<2, 3, 1, 3>(op.template core<k>(),
87 eval(contract<2, 2>(
x.template core<k>(),
88 std::get<k + 1>(psiphiA)))));
90 std::get<k>(psiphib) =
91 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
92 eval(contract<2, 1>(b.template core<k>(),
93 std::get<k + 1>(psiphib))));
106 decltype(op.template core<k>())>::size(0),
109 decltype(op.template core<k + 1>())>::size(3)>(
110 permute<0, 1, 3, 2, 4, 5>(
111 contract<3, 0>(op.template core<k>(),
112 op.template core<k + 1>())));
115 decltype(b.template core<k>())>::size(0),
118 decltype(b.template core<k + 1>())>::size(2)>(
119 contract<2, 0>(b.template core<k>(),
120 b.template core<k + 1>()));
123 decltype(
x.template core<k>())>::size(0),
126 decltype(
x.template core<k + 1>())>::size(2)>(
127 contract<2, 0>(
x.template core<k>(),
128 x.template core<k + 1>()));
131 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
132 contract<1, 0>(get<k>(psiphiA),
133 eval(contract<3, 1>(sA, get<k + 2>(psiphiA))))));
134 auto const bk = linearize(contract<1, 0>(get<k>(psiphib),
135 eval(contract<2, 1>(sB, get<k + 2>(psiphib)))));
140 decltype(
x.template core<k>())>::size(0),
143 decltype(
x.template core<k + 1>())>::size(2)>
146 linearize(sX), tolerance);
149 auto const [u, s, v] = svd<Ranks::size(k)>(matricize(sol));
150 folding<pRC::Position::Left>(
x.template core<k>()) = u;
151 folding<pRC::Position::Right>(
x.template core<k + 1>()) =
152 fromDiagonal(s) * adjoint(v);
155 get<k + 1>(psiphiA) =
156 contract<1, 0, 0, 3>(conj(
x.template core<k>()),
157 contract<2, 0, 0, 3>(op.template core<k>(),
158 eval(contract<0, 2>(
x.template core<k>(),
162 get<k + 1>(psiphib) =
163 contract<0, 1, 2, 0>(conj(
x.template core<k>()),
164 eval(contract<0, 1>(b.template core<k>(),
174 auto const sA = reshape<
176 decltype(op.template core<k - 1>())>::size(0),
179 decltype(op.template core<k>())>::size(3)>(
180 permute<0, 1, 3, 2, 4, 5>(contract<3, 0>(
181 op.template core<k - 1>(), op.template core<k>())));
182 auto const sB = reshape<
184 decltype(b.template core<k - 1>())>::size(0),
187 decltype(b.template core<k>())>::size(2)>(
188 contract<2, 0>(b.template core<k - 1>(),
189 b.template core<k>()));
190 auto const sX = reshape<
192 decltype(
x.template core<k - 1>())>::size(0),
195 decltype(
x.template core<k>())>::size(2)>(
196 contract<2, 0>(
x.template core<k - 1>(),
197 x.template core<k>()));
200 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
201 contract<1, 0>(get<k - 1>(psiphiA),
202 eval(contract<3, 1>(sA, get<k + 1>(psiphiA))))));
204 linearize(contract<1, 0>(get<k - 1>(psiphib),
205 eval(contract<2, 1>(sB, get<k + 1>(psiphib)))));
210 decltype(
x.template core<k - 1>())>::size(0),
213 decltype(
x.template core<k>())>::size(2)>
216 linearize(sX), tolerance);
219 auto const [u, s, v] =
220 svd<Ranks::size(k - 1)>(matricize(sol));
221 folding<pRC::Position::Right>(
x.template core<k>()) =
223 folding<pRC::Position::Left>(
x.template core<k - 1>()) =
229 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
230 contract<2, 3, 1, 3>(op.template core<k>(),
231 eval(contract<2, 2>(
x.template core<k>(),
232 get<k + 1>(psiphiA)))));
236 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
237 eval(contract<2, 1>(b.template core<k>(),
238 get<k + 1>(psiphib))));