6#include <unordered_map>
7#include <unordered_set>
33template<
typename S1_,
typename S2_>
38 typedef typename S1_::Scalar_
Scalar;
47 static std::string
name() {
return S1_::name()+
"⊗"+S2_::name(); }
49 static constexpr std::size_t
Nq=S1_::Nq+S2_::Nq;
52 static constexpr bool NON_ABELIAN = S1_::NON_ABELIAN or S2_::NON_ABELIAN;
53 static constexpr bool ABELIAN = S1_::ABELIAN and S2_::ABELIAN;
54 static constexpr bool IS_TRIVIAL = S1_::IS_TRIVIAL and S2_::IS_TRIVIAL;
55 static constexpr bool IS_MODULAR = S1_::IS_MODULAR and S2_::IS_MODULAR;
56 static constexpr int MOD_N = S1_::MOD_N * S2_::MOD_N;
58 static constexpr bool IS_CHARGE_SU2() {
return S1_::IS_CHARGE_SU2() or S2_::IS_CHARGE_SU2(); }
59 static constexpr bool IS_SPIN_SU2() {
return S1_::IS_SPIN_SU2() or S2_::IS_SPIN_SU2(); }
61 static constexpr bool IS_SPIN_U1() {
return S1_::IS_SPIN_U1() or S2_::IS_SPIN_U1(); }
63 static constexpr bool NO_SPIN_SYM() {
return S1_::NO_SPIN_SYM() and S2_::NO_SPIN_SYM(); }
64 static constexpr bool NO_CHARGE_SYM() {
return S1_::NO_CHARGE_SYM() and S2_::NO_CHARGE_SYM(); }
68 inline static constexpr std::array<KIND,Nq>
kind() {
return thirdparty::join(S1_::kind(),S2_::kind()); }
69 inline static constexpr std::array<int,Nq>
mod() {
return thirdparty::join(S1_::mod(),S2_::mod()); }
71 inline static constexpr qType qvacuum() {
return join(S1_::qvacuum(),S2_::qvacuum()); }
73 inline static constexpr size_t lowest_qs_size = S1_::lowest_qs_size*S2_::lowest_qs_size;
74 inline static constexpr std::array<qType,lowest_qs_size>
lowest_qs()
76 std::array<qType,lowest_qs_size> out;
78 for (
const auto &q1 : S1_::lowest_qs())
79 for (
const auto &q2 : S2_::lowest_qs())
81 out[index] =
join(q1,q2);
87 inline static qType flip(
const qType& q ) {
auto [ql,qr] = disjoin<S1_::Nq,S2_::Nq>(q);
return join(S1_::flip(ql),S2_::flip(qr)); }
88 inline static int degeneracy(
const qType& q ) {
auto [ql,qr] = disjoin<S1_::Nq,S2_::Nq>(q);
return S1_::degeneracy(ql)*S2_::degeneracy(qr); }
90 inline static int spinorFactor() {
return S1_::spinorFactor() * S2_::spinorFactor(); }
106 static std::vector<qType>
reduceSilent(
const std::vector<qType>& ql,
const qType& qr);
112 static std::vector<qType>
reduceSilent(
const std::vector<qType>& ql,
const std::vector<qType>& qr,
bool UNIQUE=
false);
133 int q1_z,
int q2_z,
int q3_z) {
return 1.;}
135 int q1_z,
int q2_z,
int q3_z) {
return 1.;}
177 template<std::
size_t M>
178 static bool compare (
const std::array<qType,M>& q1,
const std::array<qType,M>& q2 );
185 template<std::
size_t M>
186 static bool validate(
const std::array<qType,M>& qs );
188 static bool triangle(
const std::array<qType,3>& qs );
189 static bool pair(
const std::array<qType,2>& qs );
193template<
typename S1_,
typename S2_>
197 auto [ql1,ql2] = disjoin<S1_::Nq,S2_::Nq>(ql);
198 auto [qr1,qr2] = disjoin<S1_::Nq,S2_::Nq>(qr);
199 std::vector<typename S1_::qType> firstSym = S1_::reduceSilent(ql1,qr1);
200 std::vector<typename S2_::qType> secondSym = S2_::reduceSilent(ql2,qr2);
202 std::vector<qType> vout;
203 for(
const auto& q1:firstSym)
204 for(
const auto& q2:secondSym)
206 vout.push_back(
join(q1,q2));
211template<
typename S1_,
typename S2_>
215 return reduceSilent(reduceSilent(ql,qm),qr);
218template<
typename S1_,
typename S2_>
222 std::vector<qType> vout;
224 for (std::size_t q=0; q<ql.size(); q++)
226 auto [ql1,ql2] = disjoin<S1_::Nq,S2_::Nq>(ql[q]);
227 auto [qr1,qr2] = disjoin<S1_::Nq,S2_::Nq>(qr);
229 std::vector<typename S1_::qType> firstSym = S1_::reduceSilent(ql1,qr1);
230 std::vector<typename S2_::qType> secondSym = S2_::reduceSilent(ql2,qr2);
232 for(
const auto& q1:firstSym)
233 for(
const auto& q2:secondSym)
235 vout.push_back(
join(q1,q2));
242template<
typename S1_,
typename S2_>
244reduceSilent(
const std::vector<qType>& ql,
const std::vector<qType>& qr,
bool UNIQUE )
246 std::vector<qType> vout;
247 std::unordered_set<qType> uniqueControl;
249 for (std::size_t q=0; q<ql.size(); q++)
250 for (std::size_t p=0; p<qr.size(); p++)
252 auto [ql1,ql2] = disjoin<S1_::Nq,S2_::Nq>(ql[q]);
253 auto [qr1,qr2] = disjoin<S1_::Nq,S2_::Nq>(qr[p]);
254 std::vector<typename S1_::qType> firstSym = S1_::reduceSilent(ql1,qr1);
255 std::vector<typename S2_::qType> secondSym = S2_::reduceSilent(ql2,qr2);
257 for(
const auto& q1:firstSym)
258 for(
const auto& q2:secondSym)
262 if(
auto it = uniqueControl.find(
join(q1,q2)) == uniqueControl.end() )
264 uniqueControl.insert(
join(q1,q2));
265 vout.push_back(
join(q1,q2));
270 vout.push_back(
join(q1,q2));
277template<
typename S1_,
typename S2_>
279tensorProd (
const std::vector<qType>& ql,
const std::vector<qType>& qr )
282 for (std::size_t q=0; q<ql.size(); q++)
283 for (std::size_t p=0; p<qr.size(); p++)
285 auto [ql1,ql2] = disjoin<S1_::Nq,S2_::Nq>(ql[q]);
286 auto [qr1,qr2] = disjoin<S1_::Nq,S2_::Nq>(qr[p]);
287 std::vector<typename S1_::qType> firstSym = S1_::reduceSilent(ql1,qr1);
288 std::vector<typename S2_::qType> secondSym = S2_::reduceSilent(ql2,qr2);
291 for(
const auto& q1:firstSym)
292 for(
const auto& q2:secondSym)
294 out.push_back(make_tuple(ql[q], q, qr[p], p,
join(q1,q2)));
300template<
typename S1_,
typename S2_>
308template<
typename S1_,
typename S2_>
312 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
313 Scalar out = S1_::coeff_dot(q1l)*S2_::coeff_dot(q1r);
317template<
typename S1_,
typename S2_>
321 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
322 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
323 Scalar out = S1_::coeff_rightOrtho(q1l,q2l)*S2_::coeff_rightOrtho(q1r,q2r);
327template<
typename S1_,
typename S2_>
331 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
332 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
333 Scalar out = S1_::coeff_leftSweep(q1l,q2l)*S2_::coeff_leftSweep(q1r,q2r);
337template<
typename S1_,
typename S2_>
341 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
342 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
343 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
344 Scalar out = S1_::coeff_swapPhase(q1l,q2l,q3l)*S2_::coeff_swapPhase(q1r,q2r,q3r);
348template<
typename S1_,
typename S2_>
352 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
353 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
354 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
355 Scalar out = S1_::coeff_adjoint(q1l,q2l,q3l)*S2_::coeff_adjoint(q1r,q2r,q3r);
359template<
typename S1_,
typename S2_>
363 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
364 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
365 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
366 Scalar out = S1_::coeff_splitAA(q1l,q2l,q3l)*S2_::coeff_splitAA(q1r,q2r,q3r);
370template<
typename S1_,
typename S2_>
374 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
375 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
376 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
377 Scalar out = S1_::coeff_leftSweep2(q1l,q2l,q3l)*S2_::coeff_leftSweep2(q1r,q2r,q3r);
381template<
typename S1_,
typename S2_>
385 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
386 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
387 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
388 Scalar out = S1_::coeff_leftSweep3(q1l,q2l,q3l)*S2_::coeff_leftSweep3(q1r,q2r,q3r);
409template<
typename S1_,
typename S2_>
414 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
415 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
416 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
417 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
418 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
419 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
421 Scalar out=S1_::coeff_6j(q1l,q2l,q3l,
423 S2_::coeff_6j(q1r,q2r,q3r,
428template<
typename S1_,
typename S2_>
433 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
434 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
435 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
436 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
437 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
438 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
440 Scalar out=S1_::coeff_Apair(q1l,q2l,q3l,
442 S2_::coeff_Apair(q1r,q2r,q3r,
447template<
typename S1_,
typename S2_>
452 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
453 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
454 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
455 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
456 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
457 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
459 Scalar out=S1_::coeff_splitAA(q1l,q2l,q3l,
461 S2_::coeff_splitAA(q1r,q2r,q3r,
466template<
typename S1_,
typename S2_>
471 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
472 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
473 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
474 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
475 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
476 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
478 Scalar out=S1_::coeff_prod(q1l,q2l,q3l,
480 S2_::coeff_prod(q1r,q2r,q3r,
485template<
typename S1_,
typename S2_>
490 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
491 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
492 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
493 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
494 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
495 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
497 Scalar out=S1_::coeff_MPOprod6(q1l,q2l,q3l,
499 S2_::coeff_MPOprod6(q1r,q2r,q3r,
504template<
typename S1_,
typename S2_>
509 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
510 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
511 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
512 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
513 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
514 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
516 Scalar out=S1_::coeff_twoSiteGate(q1l,q2l,q3l,
518 S2_::coeff_twoSiteGate(q1r,q2r,q3r,
523template<
typename S1_,
typename S2_>
529 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
530 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
531 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
532 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
533 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
534 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
535 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
536 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
537 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
539 Scalar out=S1_::coeff_9j(q1l,q2l,q3l,
542 S2_::coeff_9j(q1r,q2r,q3r,
548template<
typename S1_,
typename S2_>
554 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
555 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
556 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
557 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
558 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
559 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
560 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
561 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
562 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
564 Scalar out=S1_::coeff_tensorProd(q1l,q2l,q3l,
567 S2_::coeff_tensorProd(q1r,q2r,q3r,
573template<
typename S1_,
typename S2_>
579 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
580 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
581 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
582 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
583 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
584 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
585 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
586 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
587 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
589 Scalar out=S1_::coeff_MPOprod9(q1l,q2l,q3l,
592 S2_::coeff_MPOprod9(q1r,q2r,q3r,
598template<
typename S1_,
typename S2_>
604 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
605 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
606 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
607 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
608 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
609 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
610 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
611 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
612 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
614 Scalar out=S1_::coeff_buildL(q1l,q2l,q3l,
617 S2_::coeff_buildL(q1r,q2r,q3r,
623template<
typename S1_,
typename S2_>
629 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
630 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
631 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
632 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
633 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
634 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
635 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
636 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
637 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
639 Scalar out=S1_::coeff_buildR(q1l,q2l,q3l,
642 S2_::coeff_buildR(q1r,q2r,q3r,
648template<
typename S1_,
typename S2_>
654 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
655 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
656 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
657 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
658 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
659 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
660 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
661 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
662 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
664 Scalar out=S1_::coeff_HPsi(q1l,q2l,q3l,
667 S2_::coeff_HPsi(q1r,q2r,q3r,
673template<
typename S1_,
typename S2_>
679 auto [q1l,q1r] = disjoin<S1_::Nq,S2_::Nq>(q1);
680 auto [q2l,q2r] = disjoin<S1_::Nq,S2_::Nq>(q2);
681 auto [q3l,q3r] = disjoin<S1_::Nq,S2_::Nq>(q3);
682 auto [q4l,q4r] = disjoin<S1_::Nq,S2_::Nq>(q4);
683 auto [q5l,q5r] = disjoin<S1_::Nq,S2_::Nq>(q5);
684 auto [q6l,q6r] = disjoin<S1_::Nq,S2_::Nq>(q6);
685 auto [q7l,q7r] = disjoin<S1_::Nq,S2_::Nq>(q7);
686 auto [q8l,q8r] = disjoin<S1_::Nq,S2_::Nq>(q8);
687 auto [q9l,q9r] = disjoin<S1_::Nq,S2_::Nq>(q9);
689 Scalar out=S1_::coeff_AW(q1l,q2l,q3l,
692 S2_::coeff_AW(q1r,q2r,q3r,
698template<
typename S1_,
typename S2_>
699template<std::
size_t M>
703 for (std::size_t m=0; m<
M; m++)
705 if (q1[m] > q2[m]) {
return false; }
706 else if (q1[m] < q2[m]) {
return true; }
729template<
typename S1_,
typename S2_>
736 for (
size_t q=0; q<3; q++)
738 auto [q1,q2] = disjoin<S1_::Nq,S2_::Nq>(qs[q]);
742 return (S1_::triangle(q_frstSym) and S2_::triangle(q_secdSym));
745template<
typename S1_,
typename S2_>
752 for (
size_t q=0; q<2; q++)
754 auto [q1,q2] = disjoin<S1_::Nq,S2_::Nq>(qs[q]);
758 return (S1_::pair(q_frstSym) and S2_::pair(q_secdSym));
761template<
typename S1_,
typename S2_>
762template<std::
size_t M>
766 if constexpr(
M == 1 ) {
return true; }
769 else { cout <<
"This should not be printed out!" << endl;
return true; }
static vector< tuple< qarray< Nq >, size_t, qarray< Nq >, size_t, qarray< Nq > > > tensorProd(const std::vector< qType > &ql, const std::vector< qType > &qr)
static constexpr std::array< KIND, Nq > kind()
static bool compare(const std::array< qType, M > &q1, const std::array< qType, M > &q2)
static Scalar coeff_buildR(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static constexpr int MOD_N
static Scalar coeff_twoSiteGate(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
static constexpr bool ABELIAN
static constexpr std::size_t Nq
static Scalar coeff_adjoint(const qType &q1, const qType &q2, const qType &q3)
static constexpr std::array< int, Nq > mod()
static constexpr std::array< qType, lowest_qs_size > lowest_qs()
static Scalar coeff_prod(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
static constexpr bool IS_SPIN_U1()
static bool triangle(const std::array< qType, 3 > &qs)
static Scalar coeff_Apair(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
static qType flip(const qType &q)
static Scalar coeff_9j(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static Scalar coeff_leftSweep2(const qType &q1, const qType &q2, const qType &q3)
static Scalar coeff_tensorProd(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static constexpr bool NON_ABELIAN
static Scalar coeff_unity()
static constexpr bool IS_MODULAR
static bool validate(const std::array< qType, M > &qs)
static Scalar coeff_MPOprod6(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
static Scalar coeff_MPOprod9(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static int degeneracy(const qType &q)
static constexpr bool HAS_CGC
static Scalar coeff_AW(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static constexpr bool IS_CHARGE_SU2()
static Scalar coeff_buildL(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static Scalar coeff_leftSweep3(const qType &q1, const qType &q2, const qType &q3)
static Scalar coeff_rightOrtho(const qType &q1, const qType &q2)
static int spinorFactor()
static bool pair(const std::array< qType, 2 > &qs)
static std::vector< qType > reduceSilent(const qType &ql, const qType &qr)
static Scalar coeff_CGC(const qType &q1, const qType &q2, const qType &q3, int q1_z, int q2_z, int q3_z)
static Scalar coeff_dot(const qType &q1)
static constexpr bool IS_TRIVIAL
static Scalar coeff_HPsi(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
static constexpr bool NO_CHARGE_SYM()
static Scalar coeff_splitAA(const qType &q1, const qType &q2, const qType &q3)
static constexpr bool NO_SPIN_SYM()
static constexpr size_t lowest_qs_size
static constexpr qType qvacuum()
static Scalar coeff_leftSweep(const qType &q1, const qType &q2)
static Scalar coeff_swapPhase(const qType &q1, const qType &q2, const qType &q3)
static Scalar coeff_3j(const qType &q1, const qType &q2, const qType &q3, int q1_z, int q2_z, int q3_z)
static constexpr bool IS_SPIN_SU2()
static std::string name()
static Scalar coeff_6j(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
std::array< qarray< Nq >, 2 > qarray2
std::array< qarray< Nq >, 3 > qarray3
constexpr qarray< Nq1+Nq2 > join(qarray< Nq1 > rhs, qarray< Nq2 > lhs)