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))));
122 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
123 contract<1, 0>(std::get<k>(psiphiA),
124 eval(contract<3, 1>(op.template core<k>(),
125 std::get<k + 1>(psiphiA))))));
127 linearize(contract<1, 0>(std::get<k>(psiphib),
128 eval(contract<2, 1>(b.template core<k>(),
129 std::get<k + 1>(psiphib)))));
135 linearize(
x.template core<k>()), toleranceLocal);
139 truncate<Ranks::size(k), pRC::Position::Right>(sol);
144 decltype(
x.template core<k>())>::size(0),
148 decltype(
x.template core<k>())>::size(0),
149 2, Ranks::size(k)>(ex, 0, 0, 0) = q;
151 decltype(
x.template core<k>())>::size(0),
152 2, ERanks::size(k) - Ranks::size(k)>(ex, 0, 0,
155 decltype(
x.template core<k>())>::size(0),
156 2, ERanks::size(k) - Ranks::size(k)>>(rng, dist);
159 auto tNext = contract<1, 0>(r,
x.template core<k + 1>());
162 decltype(
x.template core<k + 1>())>::size(2)>
164 slice<Ranks::size(k), 2,
166 decltype(
x.template core<k + 1>())>::size(2)>(enext,
168 slice<ERanks::size(k) - Ranks::size(k), 2,
170 decltype(
x.template core<k + 1>())>::size(2)>(enext,
174 auto const [qq, rr] =
175 orthogonalize<pRC::Position::Left>(ex);
176 x.template core<k>() = qq;
177 x.template core<k + 1>() = contract<1, 0>(rr, enext);
180 std::get<k + 1>(psiphiA) =
181 contract<1, 0, 0, 3>(conj(
x.template core<k>()),
182 contract<2, 0, 0, 3>(op.template core<k>(),
183 eval(contract<0, 2>(
x.template core<k>(),
184 std::get<k>(psiphiA)))));
187 std::get<k + 1>(psiphib) =
188 contract<0, 1, 2, 0>(conj(
x.template core<k>()),
189 eval(contract<0, 1>(b.template core<k>(),
190 std::get<k>(psiphib))));
199 auto const Ak = matricize(permute<0, 2, 4, 1, 3, 5>(
200 contract<1, 0>(std::get<k>(psiphiA),
201 eval(contract<3, 1>(op.template core<k>(),
202 std::get<k + 1>(psiphiA))))));
204 linearize(contract<1, 0>(std::get<k>(psiphib),
205 eval(contract<2, 1>(b.template core<k>(),
206 std::get<k + 1>(psiphib)))));
212 linearize(
x.template core<k>()), toleranceLocal);
221 decltype(
x.template core<k>())>::size(2)>
223 slice<Ranks::size(k - 1), 2,
225 decltype(
x.template core<k>())>::size(2)>(ex, 0, 0,
227 slice<ERanks::size(k - 1) - Ranks::size(k - 1), 2,
229 decltype(
x.template core<k>())>::size(2)>(ex,
231 ERanks::size(k - 1) - Ranks::size(k - 1), 2,
233 decltype(
x.template core<k>())>::size(2)>>(rng,
237 auto tNext = contract<2, 0>(
x.template core<k - 1>(), l);
240 decltype(
x.template core<k - 1>())>::size(0),
241 2, ERanks::size(k - 1)>
244 decltype(
x.template core<k - 1>())>::size(0),
245 2, Ranks::size(k - 1)>(enext, 0, 0, 0) = tNext;
248 decltype(
x.template core<k - 1>())>::size(0),
249 2, ERanks::size(k - 1) - Ranks::size(k - 1)>(enext,
250 0, 0, Ranks::size(k - 1))) =
pRC::zero();
253 auto const [ll, qq] =
254 orthogonalize<pRC::Position::Right>(ex);
255 x.template core<k>() = qq;
256 x.template core<k - 1>() = contract<2, 0>(enext, ll);
260 std::get<k>(psiphiA) =
261 contract<1, 2, 1, 3>(conj(
x.template core<k>()),
262 contract<2, 3, 1, 3>(op.template core<k>(),
263 eval(contract<2, 2>(
x.template core<k>(),
264 std::get<k + 1>(psiphiA)))));
267 std::get<k>(psiphib) =
268 contract<1, 2, 1, 2>(conj(
x.template core<k>()),
269 eval(contract<2, 1>(b.template core<k>(),
270 std::get<k + 1>(psiphib))));
273 return round<Ranks>(
x);