3 #ifndef LALA_PC_TERMS_HPP
4 #define LALA_PC_TERMS_HPP
6 #include "battery/vector.hpp"
7 #include "lala/universes/arith_bound.hpp"
12 template <
class AD,
class Allocator>
15 template <
class AD,
class Allocator>
22 using U =
typename A::local_universe;
31 template <
class A2,
class Alloc>
34 CUDA
bool embed(
A&,
const U&)
const {
return false; }
35 CUDA
void project(
const A&,
U& r)
const { r.meet(k); }
36 CUDA
void print(
const A&)
const { ::battery::print(k); }
37 template <
class Env,
class Allocator =
typename Env::allocator_type>
38 CUDA TFormula<Allocator>
deinterpret(
const A&,
const Env&, AType, Allocator allocator = Allocator())
const {
39 return k.template deinterpret<TFormula<Allocator>>();
41 CUDA
size_t length()
const {
return 1; }
51 using U =
typename A::local_universe;
62 template <
class A2,
class Alloc>
66 return a.embed(avar, u);
70 return a.project(avar, r);
73 CUDA
void print(
const A& a)
const { printf(
"(%d,%d)", avar.aty(), avar.vid()); }
75 template <
class Env,
class Allocator =
typename Env::allocator_type>
76 CUDA TFormula<Allocator>
deinterpret(
const A&,
const Env& env, AType, Allocator allocator = Allocator())
const {
77 using F = TFormula<Allocator>;
78 return F::make_lvar(avar.aty(), LVar<Allocator>(env.name_of(avar), allocator));
81 CUDA
size_t length()
const {
return 1; }
87 template<
class Universe>
100 CUDA
static const char*
symbol() {
return "-"; }
101 CUDA
static Sig
sig() {
return NEG; }
104 template<
class Universe>
113 r.meet(fjoin(a, project_fun(NEG, a)));
117 CUDA
static const char*
symbol() {
return "abs"; }
118 CUDA
static Sig
sig() {
return ABS; }
121 template <
class AD,
class UnaryOp,
class Allocator>
126 using U =
typename A::local_universe;
129 template <
class A2,
class UnaryOp2,
class Alloc2>
134 battery::unique_ptr<sub_type, allocator_type> x_term;
136 CUDA INLINE
const sub_type& x()
const {
141 CUDA
Unary(battery::unique_ptr<sub_type, allocator_type>&& x_term): x_term(std::move(x_term)) {}
144 template <
class A2,
class UnaryOp2,
class Alloc2>
146 x_term(battery::allocate_unique<
sub_type>(allocator, *other.x_term))
151 UnaryOp::residual(u, tmp);
152 return x().
embed(a, tmp);
158 UnaryOp::project(tmp, r);
162 printf(
"%s", UnaryOp::symbol());
163 if constexpr(UnaryOp::function_symbol) { printf(
"("); }
165 if constexpr(UnaryOp::function_symbol) { printf(
")"); }
168 template <
class Env,
class Allocator2 =
typename Env::allocator_type>
169 CUDA TFormula<Allocator2>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator2 allocator = Allocator2())
const {
170 using F = TFormula<Allocator2>;
171 return F::make_unary(UnaryOp::sig(), x().
deinterpret(a, env, apc, allocator), apc, allocator);
177 template<
class Universe>
183 r.project(ADD, a, b);
192 tmp.additive_inverse(b);
197 r.project(SUB, a, b);
205 CUDA
static char symbol() {
return '+'; }
206 CUDA
static Sig
sig() {
return ADD; }
209 template<
class Universe>
215 return r.project(SUB, a, b);
219 return r.project(ADD, a, b);
223 return r.project(SUB, b, a);
227 CUDA
static char symbol() {
return '-'; }
228 CUDA
static Sig
sig() {
return SUB; }
231 template<
class Universe, Sig divsig>
236 r.project(MUL, a, b);
240 return a == U::eq_zero();
245 return r.project(divsig, a, b);
250 if(!(a >= U::eq_zero() && b >= U::eq_zero())) {
251 r.project(divsig, a, b);
260 CUDA
static char symbol() {
return '*'; }
261 CUDA
static Sig
sig() {
return MUL; }
264 template<
class Universe, Sig divsig>
269 return r.project(divsig, a, b);
273 return r.project(MUL, a, b);
277 if(!(b >= U::eq_zero())) {
278 r.project(divsig, b, a);
283 CUDA
static char symbol() {
return '/'; }
284 CUDA
static Sig
sig() {
return divsig; }
287 template<
class Universe, Sig msig>
289 static_assert(msig == MIN || msig == MAX);
293 return r.project(msig, a, b);
297 if(fmeet(a, b).is_bot()) {
301 if constexpr(msig == MIN) {
315 CUDA
static const char*
symbol() {
return msig == MIN ?
"min" :
"max"; }
316 CUDA
static Sig
sig() {
return msig; }
319 template <
class AD,
class Group,
class Allocator>
324 using U =
typename Group::U;
328 template <
class A2,
class Group2,
class Alloc2>
332 using sub_ptr = battery::unique_ptr<sub_type, allocator_type>;
338 CUDA INLINE
const sub_type& x()
const {
342 CUDA INLINE
const sub_type& y()
const {
348 : x_term(std::move(x_term))
349 , y_term(std::move(y_term)) {}
352 :
Binary(std::move(other.x_term), std::move(other.y_term)) {}
354 template <
class A2,
class Group2,
class Alloc2>
356 : x_term(battery::allocate_unique<
sub_type>(allocator, *other.x_term))
357 , y_term(battery::allocate_unique<
sub_type>(allocator, *other.y_term))
366 bool has_changed =
false;
369 G::left_residual(u, yt, residual);
370 has_changed |= x().
embed(a, residual);
375 G::right_residual(u, xt, residual);
376 has_changed |= y().
embed(a, residual);
386 G::project(xt, yt, r);
390 if constexpr(G::prefix_symbol) {
391 printf(
"%s(", G::symbol());
399 printf(
" %c ", G::symbol());
404 template <
class Env,
class Allocator2 =
typename Env::allocator_type>
405 CUDA NI TFormula<Allocator2>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator2 allocator = Allocator2())
const {
406 using F = TFormula<Allocator2>;
407 return F::make_binary(
419 template <
class Combinator>
424 using A =
typename Combinator::A;
425 using U =
typename Combinator::U;
426 using G =
typename Combinator::G;
428 template <
class Combinator2>
432 battery::vector<sub_type, allocator_type> terms;
434 CUDA INLINE
const sub_type& t(
size_t i)
const {
439 CUDA
Nary(battery::vector<sub_type, allocator_type>&& terms): terms(std::move(terms)) {}
442 template <
class Combinator2>
444 : terms(other.terms, allocator)
452 for(
int i = 1; i < terms.size(); ++i) {
454 G::project(accu, tmp, tmp2);
467 bool has_changed =
false;
469 if(!G::is_absorbing(all)) {
470 for(
int i = 0; i < terms.size(); ++i) {
472 G::rev_op(all, tmp, tmp2);
473 G::left_residual(u, tmp2, residual);
474 has_changed |= t(i).
embed(a, residual);
485 for(
int i = 1; i < terms.size(); ++i) {
486 printf(
" %c ", G::symbol());
491 template <
class Env,
class Allocator =
typename Env::allocator_type>
492 CUDA NI TFormula<Allocator>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator allocator = Allocator())
const {
493 using F = TFormula<Allocator>;
494 typename F::Sequence seq =
typename F::Sequence(allocator);
495 for(
int i = 0; i < terms.size(); ++i) {
496 seq.push_back(t(i).
deinterpret(a, env, apc, allocator));
498 return F::make_nary(G::sig(), std::move(seq), apc);
503 for(
int i = 0; i < terms.size(); ++i) {
510 template <
class AD,
class Allocator>
514 using U =
typename A::local_universe;
533 static constexpr
size_t IVar = 0;
550 template <
class A2,
class Alloc2>
554 using VTerm = battery::variant<
575 template <
size_t I,
class TermType,
class A2,
class Alloc2>
577 return VTerm::template create<I>(TermType(battery::get<I>(other.term), allocator));
580 template <
class A2,
class Alloc2>
582 switch(other.term.index()) {
583 case IVar:
return create_one<IVar, Variable<A>>(other, allocator);
584 case IConstant:
return create_one<IConstant, Constant<A>>(other, allocator);
587 allocator, *battery::get<IFormula>(other.term)));
588 case INeg:
return create_one<INeg, Neg>(other, allocator);
589 case IAbs:
return create_one<IAbs, Abs>(other, allocator);
590 case IAdd:
return create_one<IAdd, Add>(other, allocator);
591 case ISub:
return create_one<ISub, Sub>(other, allocator);
592 case IMul:
return create_one<IMul, Mul>(other, allocator);
593 case ITDiv:
return create_one<ITDiv, TDiv>(other, allocator);
594 case IFDiv:
return create_one<IFDiv, FDiv>(other, allocator);
595 case ICDiv:
return create_one<ICDiv, CDiv>(other, allocator);
596 case IEDiv:
return create_one<IEDiv, EDiv>(other, allocator);
597 case IMin:
return create_one<IMin, Min>(other, allocator);
598 case IMax:
return create_one<IMax, Max>(other, allocator);
599 case INaryAdd:
return create_one<INaryAdd, NaryAdd>(other, allocator);
600 case INaryMul:
return create_one<INaryMul, NaryMul>(other, allocator);
602 printf(
"BUG: term not handled.\n");
604 return VTerm::template create<IVar>(
Variable<A>());
608 CUDA
Term(VTerm&& term): term(std::move(term)) {}
611 CUDA NI
auto forward(F&& f)
const {
612 switch(term.index()) {
613 case IVar:
return f(battery::get<IVar>(term));
614 case IConstant:
return f(battery::get<IConstant>(term));
615 case IFormula:
return f(*battery::get<IFormula>(term));
616 case INeg:
return f(battery::get<INeg>(term));
617 case IAbs:
return f(battery::get<IAbs>(term));
618 case IAdd:
return f(battery::get<IAdd>(term));
619 case ISub:
return f(battery::get<ISub>(term));
620 case IMul:
return f(battery::get<IMul>(term));
621 case ITDiv:
return f(battery::get<ITDiv>(term));
622 case IFDiv:
return f(battery::get<IFDiv>(term));
623 case ICDiv:
return f(battery::get<ICDiv>(term));
624 case IEDiv:
return f(battery::get<IEDiv>(term));
625 case IMin:
return f(battery::get<IMin>(term));
626 case IMax:
return f(battery::get<IMax>(term));
627 case INaryAdd:
return f(battery::get<INaryAdd>(term));
628 case INaryMul:
return f(battery::get<INaryMul>(term));
630 printf(
"BUG: term not handled.\n");
632 return f(Variable<A>());
641 template <
class A2,
class Alloc2>
643 : term(create(other, allocator))
646 CUDA
bool is(
size_t kind)
const {
647 return term.index() == kind;
650 template <
size_t I,
class SubTerm>
652 return Term(VTerm::template create<I>(std::move(sub_term)));
660 return make<IConstant>(
Constant<A>(std::move(sub_term)));
664 return make<IFormula>(std::move(sub_term));
668 return make<INeg>(
Neg(std::move(sub_term)));
672 return make<IAbs>(
Abs(std::move(sub_term)));
676 return make<IAdd>(
Add(std::move(left), std::move(right)));
680 return make<ISub>(
Sub(std::move(left), std::move(right)));
684 return make<IMul>(
Mul(std::move(left), std::move(right)));
688 return make<ITDiv>(
TDiv(std::move(left), std::move(right)));
692 return make<IFDiv>(
FDiv(std::move(left), std::move(right)));
696 return make<ICDiv>(
CDiv(std::move(left), std::move(right)));
700 return make<IEDiv>(
EDiv(std::move(left), std::move(right)));
704 return make<IMin>(
Min(std::move(left), std::move(right)));
708 return make<IMax>(
Max(std::move(left), std::move(right)));
712 return make<INaryAdd>(
NaryAdd(std::move(sub_terms)));
716 return make<INaryMul>(
NaryMul(std::move(sub_terms)));
720 return forward([&](
const auto& t) {
return t.embed(a, u); });
724 return forward([&](
const auto& t) { t.project(a, r); });
728 forward([&](
const auto& t) { t.print(a); });
731 template <
class Env,
class Allocator2 =
typename Env::allocator_type>
732 CUDA TFormula<Allocator2>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator2 allocator = Allocator2())
const {
733 return forward([&](
const auto& t) {
return t.deinterpret(a, env, apc, allocator); });
737 return forward([&](
const auto& t) {
return t.length(); });
Definition: terms.hpp:320
CUDA bool embed(A &a, const U &u) const
Definition: terms.hpp:362
CUDA void project(const A &a, U &r) const
Definition: terms.hpp:381
CUDA size_t length() const
Definition: terms.hpp:415
CUDA Binary(const Binary< A2, Group2, Alloc2 > &other, const allocator_type &allocator)
Definition: terms.hpp:355
CUDA NI TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition: terms.hpp:405
CUDA Binary(sub_ptr &&x_term, sub_ptr &&y_term)
Definition: terms.hpp:347
AD A
Definition: terms.hpp:322
battery::unique_ptr< sub_type, allocator_type > sub_ptr
Definition: terms.hpp:332
CUDA Binary(this_type &&other)
Definition: terms.hpp:351
Allocator allocator_type
Definition: terms.hpp:323
Group G
Definition: terms.hpp:325
Term< A, allocator_type > sub_type
Definition: terms.hpp:331
typename Group::U U
Definition: terms.hpp:324
CUDA NI void print(const A &a) const
Definition: terms.hpp:389
CUDA TFormula< Allocator > deinterpret(const A &, const Env &, AType, Allocator allocator=Allocator()) const
Definition: terms.hpp:38
CUDA bool embed(A &, const U &) const
Definition: terms.hpp:34
CUDA Constant(const Constant< A2 > &other, const Alloc &)
Definition: terms.hpp:32
CUDA void project(const A &, U &r) const
Definition: terms.hpp:35
CUDA size_t length() const
Definition: terms.hpp:41
CUDA void print(const A &) const
Definition: terms.hpp:36
Constant(Constant< A > &&other)=default
AD A
Definition: terms.hpp:21
typename A::local_universe U
Definition: terms.hpp:22
CUDA Constant(U &&k)
Definition: terms.hpp:28
Definition: terms.hpp:420
CUDA size_t length() const
Definition: terms.hpp:501
CUDA Nary(this_type &&other)
Definition: terms.hpp:440
CUDA Nary(const Nary< Combinator2 > &other, const allocator_type &allocator)
Definition: terms.hpp:443
CUDA NI TFormula< Allocator > deinterpret(const A &a, const Env &env, AType apc, Allocator allocator=Allocator()) const
Definition: terms.hpp:492
CUDA NI void print(const A &a) const
Definition: terms.hpp:483
typename Combinator::G G
Definition: terms.hpp:426
CUDA bool embed(A &a, const U &u) const
Definition: terms.hpp:462
typename Combinator::A A
Definition: terms.hpp:424
typename Combinator::U U
Definition: terms.hpp:425
CUDA Nary(battery::vector< sub_type, allocator_type > &&terms)
Definition: terms.hpp:439
typename Combinator::allocator_type allocator_type
Definition: terms.hpp:423
CUDA void project(const A &a, U &r) const
Definition: terms.hpp:447
Binary< A, GroupDiv< U, FDIV >, allocator_type > FDiv
Definition: terms.hpp:525
static CUDA this_type make_constant(U &&sub_term)
Definition: terms.hpp:659
battery::unique_ptr< Formula< A, allocator_type >, allocator_type > formula_ptr
Definition: terms.hpp:518
static constexpr size_t IEDiv
Definition: terms.hpp:544
Binary< A, GroupDiv< U, EDIV >, allocator_type > EDiv
Definition: terms.hpp:527
static constexpr size_t IFDiv
Definition: terms.hpp:542
static CUDA this_type make_abs(this_ptr &&sub_term)
Definition: terms.hpp:671
Term(this_type &&)=default
static constexpr size_t INaryMul
Definition: terms.hpp:548
static CUDA this_type make_max(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:707
Binary< A, GroupAdd< U >, allocator_type > Add
Definition: terms.hpp:521
static constexpr size_t IMax
Definition: terms.hpp:546
Nary< Mul > NaryMul
Definition: terms.hpp:531
Binary< A, GroupMinMax< U, MIN >, allocator_type > Min
Definition: terms.hpp:528
static constexpr size_t ISub
Definition: terms.hpp:539
CUDA Term(const Term< A2, Alloc2 > &other, const allocator_type &allocator=allocator_type())
Definition: terms.hpp:642
static constexpr size_t INeg
Definition: terms.hpp:536
CUDA void print(const A &a) const
Definition: terms.hpp:727
Binary< A, GroupMinMax< U, MAX >, allocator_type > Max
Definition: terms.hpp:529
static CUDA this_type make_mul(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:683
friend class Term
Definition: terms.hpp:551
static CUDA this_type make_min(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:703
CUDA bool embed(A &a, const U &u) const
Definition: terms.hpp:719
static constexpr size_t ITDiv
Definition: terms.hpp:541
static CUDA this_type make(SubTerm &&sub_term)
Definition: terms.hpp:651
battery::unique_ptr< Term< A, allocator_type >, allocator_type > this_ptr
Definition: terms.hpp:517
static CUDA this_type make_cdiv(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:695
static CUDA this_type make_neg(this_ptr &&sub_term)
Definition: terms.hpp:667
static constexpr size_t INaryAdd
Definition: terms.hpp:547
Binary< A, GroupSub< U >, allocator_type > Sub
Definition: terms.hpp:522
static CUDA this_type make_tdiv(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:687
static constexpr size_t IMin
Definition: terms.hpp:545
static CUDA this_type make_naryadd(battery::vector< this_type, allocator_type > &&sub_terms)
Definition: terms.hpp:711
Binary< A, GroupMul< U, EDIV >, allocator_type > Mul
Definition: terms.hpp:523
CUDA TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition: terms.hpp:732
Binary< A, GroupDiv< U, CDIV >, allocator_type > CDiv
Definition: terms.hpp:526
Nary< Add > NaryAdd
Definition: terms.hpp:530
static CUDA this_type make_ediv(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:699
CUDA void project(const A &a, U &r) const
Definition: terms.hpp:723
static CUDA this_type make_fdiv(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:691
CUDA bool is(size_t kind) const
Definition: terms.hpp:646
static CUDA this_type make_sub(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:679
static constexpr size_t ICDiv
Definition: terms.hpp:543
static constexpr size_t IAdd
Definition: terms.hpp:538
CUDA size_t length() const
Definition: terms.hpp:736
static constexpr size_t IVar
Definition: terms.hpp:533
static CUDA this_type make_formula(formula_ptr &&sub_term)
Definition: terms.hpp:663
static constexpr size_t IFormula
Definition: terms.hpp:535
AD A
Definition: terms.hpp:513
Unary< A, NegOp< U >, allocator_type > Neg
Definition: terms.hpp:519
static constexpr size_t IAbs
Definition: terms.hpp:537
Unary< A, AbsOp< U >, allocator_type > Abs
Definition: terms.hpp:520
static CUDA this_type make_var(const AVar &avar)
Definition: terms.hpp:655
static constexpr size_t IMul
Definition: terms.hpp:540
this_type & operator=(this_type &&)=default
static CUDA this_type make_add(this_ptr &&left, this_ptr &&right)
Definition: terms.hpp:675
static constexpr size_t IConstant
Definition: terms.hpp:534
typename A::local_universe U
Definition: terms.hpp:514
Allocator allocator_type
Definition: terms.hpp:515
static CUDA this_type make_narymul(battery::vector< this_type, allocator_type > &&sub_terms)
Definition: terms.hpp:715
Binary< A, GroupDiv< U, TDIV >, allocator_type > TDiv
Definition: terms.hpp:524
Definition: terms.hpp:122
CUDA Unary(this_type &&other)
Definition: terms.hpp:142
typename A::local_universe U
Definition: terms.hpp:126
CUDA TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition: terms.hpp:169
CUDA Unary(const Unary< A2, UnaryOp2, Alloc2 > &other, const allocator_type &allocator)
Definition: terms.hpp:145
CUDA bool embed(A &a, const U &u) const
Definition: terms.hpp:149
CUDA NI void print(const A &a) const
Definition: terms.hpp:161
Allocator allocator_type
Definition: terms.hpp:124
CUDA void project(const A &a, U &r) const
Definition: terms.hpp:155
CUDA Unary(battery::unique_ptr< sub_type, allocator_type > &&x_term)
Definition: terms.hpp:141
AD A
Definition: terms.hpp:125
CUDA size_t length() const
Definition: terms.hpp:174
CUDA Variable(AVar avar)
Definition: terms.hpp:58
CUDA Variable(const Variable< A2 > &other, const Alloc &)
Definition: terms.hpp:63
CUDA bool embed(A &a, const U &u) const
Definition: terms.hpp:65
CUDA TFormula< Allocator > deinterpret(const A &, const Env &env, AType, Allocator allocator=Allocator()) const
Definition: terms.hpp:76
AD A
Definition: terms.hpp:50
CUDA Variable()
Definition: terms.hpp:57
CUDA void project(const A &a, U &r) const
Definition: terms.hpp:69
CUDA size_t length() const
Definition: terms.hpp:81
CUDA void print(const A &a) const
Definition: terms.hpp:73
typename A::local_universe U
Definition: terms.hpp:51
Variable< A > & operator=(Variable< A > &&other)=default
Variable(Variable< A > &&other)=default
Definition: formula.hpp:8
Definition: terms.hpp:105
static CUDA void project(const U &a, U &r)
Definition: terms.hpp:108
static constexpr bool function_symbol
Definition: terms.hpp:116
Universe U
Definition: terms.hpp:106
static CUDA Sig sig()
Definition: terms.hpp:118
static CUDA const char * symbol()
Definition: terms.hpp:117
static CUDA void residual(const U &a, U &r)
Definition: terms.hpp:112
Definition: terms.hpp:178
static CUDA Sig sig()
Definition: terms.hpp:206
static CUDA char symbol()
Definition: terms.hpp:205
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:196
static CUDA void rev_op(const U &a, const U &b, U &r)
Definition: terms.hpp:190
Universe U
Definition: terms.hpp:179
static CUDA void project(const U &a, const U &b, U &r)
Definition: terms.hpp:182
static constexpr bool has_absorbing_element
Definition: terms.hpp:180
static CUDA bool is_absorbing(const U &a)
Definition: terms.hpp:186
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:200
static constexpr bool prefix_symbol
Definition: terms.hpp:204
Definition: terms.hpp:265
static CUDA void project(const U &a, const U &b, U &r)
Definition: terms.hpp:268
Universe U
Definition: terms.hpp:266
static constexpr bool prefix_symbol
Definition: terms.hpp:282
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:272
static CUDA char symbol()
Definition: terms.hpp:283
static CUDA Sig sig()
Definition: terms.hpp:284
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:276
Definition: terms.hpp:288
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:310
static CUDA Sig sig()
Definition: terms.hpp:316
Universe U
Definition: terms.hpp:291
static CUDA void project(const U &a, const U &b, U &r)
Definition: terms.hpp:292
static constexpr bool prefix_symbol
Definition: terms.hpp:314
static CUDA const char * symbol()
Definition: terms.hpp:315
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:296
Definition: terms.hpp:232
Universe U
Definition: terms.hpp:233
static CUDA void rev_op(const U &a, const U &b, U &r)
Definition: terms.hpp:244
static CUDA bool is_absorbing(const U &a)
Definition: terms.hpp:239
static CUDA void project(const U &a, const U &b, U &r)
Definition: terms.hpp:235
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:255
static CUDA char symbol()
Definition: terms.hpp:260
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:249
static CUDA Sig sig()
Definition: terms.hpp:261
static constexpr bool prefix_symbol
Definition: terms.hpp:259
Definition: terms.hpp:210
static CUDA Sig sig()
Definition: terms.hpp:228
static constexpr bool prefix_symbol
Definition: terms.hpp:226
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:218
static constexpr bool has_absorbing_element
Definition: terms.hpp:212
static CUDA char symbol()
Definition: terms.hpp:227
static CUDA void project(const U &a, const U &b, U &r)
Definition: terms.hpp:214
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition: terms.hpp:222
Universe U
Definition: terms.hpp:211
static CUDA void project(const U &a, U &r)
Definition: terms.hpp:91
static CUDA Sig sig()
Definition: terms.hpp:101
static CUDA const char * symbol()
Definition: terms.hpp:100
static CUDA void residual(const U &a, U &r)
Definition: terms.hpp:95
static constexpr bool function_symbol
Definition: terms.hpp:99
Universe U
Definition: terms.hpp:89