3#ifndef LALA_PC_TERMS_HPP
4#define LALA_PC_TERMS_HPP
6#include "battery/vector.hpp"
7#include "lala/universes/arith_bound.hpp"
12template <
class AD,
class Allocator>
15template <
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; }
87template<
class Universe>
100 CUDA
static const char*
symbol() {
return "-"; }
101 CUDA
static Sig
sig() {
return NEG; }
104template<
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; }
121template <
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);
177template<
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 constexpr Sig
sig() {
return ADD; }
209template<
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 constexpr Sig
sig() {
return SUB; }
231template<
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 constexpr Sig
sig() {
return MUL; }
264template<
class Universe, Sig divsig>
269 r.project(divsig, a, b);
273 r.project(MUL, a, b);
274 if constexpr(U::preserve_concrete_covers) {
275 r.join_ub(U::UB::prev(b.ub()));
281 if constexpr(U::preserve_concrete_covers) {
282 if(r.lb().value() == 0) { r.meet_lb(
typename U::LB::local_type(1)); }
283 if(r.ub().value() == 0) { r.meet_ub(
typename U::UB::local_type(-1)); }
285 else if(r.lb().value() == 0 && r.ub().value() == 0) {
291 if(!(b >= U::eq_zero()) && !(a.lb().value() == 0 && a.ub().value() == 0)) {
292 r.project(divsig, b, a);
297 CUDA
static char symbol() {
return '/'; }
298 CUDA
static constexpr Sig
sig() {
return divsig; }
301template<
class Universe, Sig msig>
303 static_assert(msig == MIN || msig == MAX);
307 return r.project(msig, a, b);
311 if(fmeet(a, b).is_bot()) {
315 if constexpr(msig == MIN) {
329 CUDA
static const char*
symbol() {
return msig == MIN ?
"min" :
"max"; }
330 CUDA
static constexpr Sig
sig() {
return msig; }
333template <
class AD,
class Group,
class Allocator>
338 using U =
typename Group::U;
342 template <
class A2,
class Group2,
class Alloc2>
346 using sub_ptr = battery::unique_ptr<sub_type, allocator_type>;
352 CUDA INLINE
const sub_type& x()
const {
356 CUDA INLINE
const sub_type& y()
const {
362 : x_term(std::move(x_term))
363 , y_term(std::move(y_term)) {}
366 :
Binary(std::move(other.x_term), std::move(other.y_term)) {}
368 template <
class A2,
class Group2,
class Alloc2>
370 : x_term(battery::allocate_unique<
sub_type>(allocator, *other.x_term))
371 , y_term(battery::allocate_unique<
sub_type>(allocator, *other.y_term))
380 bool has_changed =
false;
383 G::left_residual(u, yt, residual);
384 has_changed |= x().
embed(a, residual);
390 if(is_division(G::sig())) {
393 G::right_residual(u, xt, residual);
394 has_changed |= y().
embed(a, residual);
404 G::project(xt, yt, r);
408 if constexpr(G::prefix_symbol) {
409 printf(
"%s(", G::symbol());
417 printf(
" %c ", G::symbol());
422 template <
class Env,
class Allocator2 =
typename Env::allocator_type>
423 CUDA NI TFormula<Allocator2>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator2 allocator = Allocator2())
const {
424 using F = TFormula<Allocator2>;
425 return F::make_binary(
437template <
class Combinator>
442 using A =
typename Combinator::A;
443 using U =
typename Combinator::U;
444 using G =
typename Combinator::G;
446 template <
class Combinator2>
450 battery::vector<sub_type, allocator_type> terms;
452 CUDA INLINE
const sub_type& t(
size_t i)
const {
457 CUDA
Nary(battery::vector<sub_type, allocator_type>&& terms): terms(std::move(terms)) {}
460 template <
class Combinator2>
462 : terms(other.terms, allocator)
470 for(
int i = 1; i < terms.size(); ++i) {
472 G::project(accu, tmp, tmp2);
485 bool has_changed =
false;
487 if(!G::is_absorbing(all)) {
488 for(
int i = 0; i < terms.size(); ++i) {
490 G::rev_op(all, tmp, tmp2);
491 G::left_residual(u, tmp2, residual);
492 has_changed |= t(i).
embed(a, residual);
503 for(
int i = 1; i < terms.size(); ++i) {
504 printf(
" %c ", G::symbol());
509 template <
class Env,
class Allocator =
typename Env::allocator_type>
510 CUDA NI TFormula<Allocator>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator allocator = Allocator())
const {
511 using F = TFormula<Allocator>;
512 typename F::Sequence seq =
typename F::Sequence(allocator);
513 for(
int i = 0; i < terms.size(); ++i) {
514 seq.push_back(t(i).
deinterpret(a, env, apc, allocator));
516 return F::make_nary(G::sig(), std::move(seq), apc);
521 for(
int i = 0; i < terms.size(); ++i) {
528template <
class AD,
class Allocator>
532 using U =
typename A::local_universe;
551 static constexpr size_t IVar = 0;
568 template <
class A2,
class Alloc2>
572 using VTerm = battery::variant<
593 template <
size_t I,
class TermType,
class A2,
class Alloc2>
595 return VTerm::template create<I>(TermType(battery::get<I>(other.term), allocator));
598 template <
class A2,
class Alloc2>
600 switch(other.term.index()) {
601 case IVar:
return create_one<IVar, Variable<A>>(other, allocator);
602 case IConstant:
return create_one<IConstant, Constant<A>>(other, allocator);
605 allocator, *battery::get<IFormula>(other.term)));
606 case INeg:
return create_one<INeg, Neg>(other, allocator);
607 case IAbs:
return create_one<IAbs, Abs>(other, allocator);
608 case IAdd:
return create_one<IAdd, Add>(other, allocator);
609 case ISub:
return create_one<ISub, Sub>(other, allocator);
610 case IMul:
return create_one<IMul, Mul>(other, allocator);
611 case ITDiv:
return create_one<ITDiv, TDiv>(other, allocator);
612 case IFDiv:
return create_one<IFDiv, FDiv>(other, allocator);
613 case ICDiv:
return create_one<ICDiv, CDiv>(other, allocator);
614 case IEDiv:
return create_one<IEDiv, EDiv>(other, allocator);
615 case IMin:
return create_one<IMin, Min>(other, allocator);
616 case IMax:
return create_one<IMax, Max>(other, allocator);
617 case INaryAdd:
return create_one<INaryAdd, NaryAdd>(other, allocator);
618 case INaryMul:
return create_one<INaryMul, NaryMul>(other, allocator);
620 printf(
"BUG: term not handled.\n");
622 return VTerm::template create<IVar>(
Variable<A>());
626 CUDA
Term(VTerm&& term): term(std::move(term)) {}
629 CUDA NI
auto forward(F&& f)
const {
630 switch(term.index()) {
631 case IVar:
return f(battery::get<IVar>(term));
632 case IConstant:
return f(battery::get<IConstant>(term));
633 case IFormula:
return f(*battery::get<IFormula>(term));
634 case INeg:
return f(battery::get<INeg>(term));
635 case IAbs:
return f(battery::get<IAbs>(term));
636 case IAdd:
return f(battery::get<IAdd>(term));
637 case ISub:
return f(battery::get<ISub>(term));
638 case IMul:
return f(battery::get<IMul>(term));
639 case ITDiv:
return f(battery::get<ITDiv>(term));
640 case IFDiv:
return f(battery::get<IFDiv>(term));
641 case ICDiv:
return f(battery::get<ICDiv>(term));
642 case IEDiv:
return f(battery::get<IEDiv>(term));
643 case IMin:
return f(battery::get<IMin>(term));
644 case IMax:
return f(battery::get<IMax>(term));
645 case INaryAdd:
return f(battery::get<INaryAdd>(term));
646 case INaryMul:
return f(battery::get<INaryMul>(term));
648 printf(
"BUG: term not handled.\n");
650 return f(Variable<A>());
659 template <
class A2,
class Alloc2>
661 : term(create(other, allocator))
664 CUDA
bool is(
size_t kind)
const {
665 return term.index() == kind;
668 template <
size_t I,
class SubTerm>
670 return Term(VTerm::template create<I>(std::move(sub_term)));
678 return make<IConstant>(
Constant<A>(std::move(sub_term)));
682 return make<IFormula>(std::move(sub_term));
686 return make<INeg>(
Neg(std::move(sub_term)));
690 return make<IAbs>(
Abs(std::move(sub_term)));
694 return make<IAdd>(
Add(std::move(left), std::move(right)));
698 return make<ISub>(
Sub(std::move(left), std::move(right)));
702 return make<IMul>(
Mul(std::move(left), std::move(right)));
706 return make<ITDiv>(
TDiv(std::move(left), std::move(right)));
710 return make<IFDiv>(
FDiv(std::move(left), std::move(right)));
714 return make<ICDiv>(
CDiv(std::move(left), std::move(right)));
718 return make<IEDiv>(
EDiv(std::move(left), std::move(right)));
722 return make<IMin>(
Min(std::move(left), std::move(right)));
726 return make<IMax>(
Max(std::move(left), std::move(right)));
730 return make<INaryAdd>(
NaryAdd(std::move(sub_terms)));
734 return make<INaryMul>(
NaryMul(std::move(sub_terms)));
738 return forward([&](
const auto& t) {
return t.embed(a, u); });
742 return forward([&](
const auto& t) { t.project(a, r); });
746 forward([&](
const auto& t) { t.print(a); });
749 template <
class Env,
class Allocator2 =
typename Env::allocator_type>
750 CUDA TFormula<Allocator2>
deinterpret(
const A& a,
const Env& env, AType apc, Allocator2 allocator = Allocator2())
const {
751 return forward([&](
const auto& t) {
return t.deinterpret(a, env, apc, allocator); });
755 return forward([&](
const auto& t) {
return t.length(); });
CUDA NI TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition terms.hpp:423
CUDA bool embed(A &a, const U &u) const
Definition terms.hpp:376
CUDA void project(const A &a, U &r) const
Definition terms.hpp:399
CUDA size_t length() const
Definition terms.hpp:433
CUDA Binary(const Binary< A2, Group2, Alloc2 > &other, const allocator_type &allocator)
Definition terms.hpp:369
CUDA Binary(sub_ptr &&x_term, sub_ptr &&y_term)
Definition terms.hpp:361
AD A
Definition terms.hpp:336
battery::unique_ptr< sub_type, allocator_type > sub_ptr
Definition terms.hpp:346
CUDA Binary(this_type &&other)
Definition terms.hpp:365
Allocator allocator_type
Definition terms.hpp:337
Group G
Definition terms.hpp:339
Term< A, allocator_type > sub_type
Definition terms.hpp:345
typename Group::U U
Definition terms.hpp:338
CUDA NI void print(const A &a) const
Definition terms.hpp:407
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 TFormula< Allocator > deinterpret(const A &, const Env &, AType, Allocator allocator=Allocator()) const
Definition terms.hpp:38
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
CUDA size_t length() const
Definition terms.hpp:519
CUDA Nary(this_type &&other)
Definition terms.hpp:458
CUDA Nary(const Nary< Combinator2 > &other, const allocator_type &allocator)
Definition terms.hpp:461
CUDA NI void print(const A &a) const
Definition terms.hpp:501
typename Combinator::G G
Definition terms.hpp:444
CUDA bool embed(A &a, const U &u) const
Definition terms.hpp:480
typename Combinator::A A
Definition terms.hpp:442
typename Combinator::U U
Definition terms.hpp:443
CUDA NI TFormula< Allocator > deinterpret(const A &a, const Env &env, AType apc, Allocator allocator=Allocator()) const
Definition terms.hpp:510
CUDA Nary(battery::vector< sub_type, allocator_type > &&terms)
Definition terms.hpp:457
typename Combinator::allocator_type allocator_type
Definition terms.hpp:441
CUDA void project(const A &a, U &r) const
Definition terms.hpp:465
Binary< A, GroupDiv< U, FDIV >, allocator_type > FDiv
Definition terms.hpp:543
static CUDA this_type make_constant(U &&sub_term)
Definition terms.hpp:677
battery::unique_ptr< Formula< A, allocator_type >, allocator_type > formula_ptr
Definition terms.hpp:536
static constexpr size_t IEDiv
Definition terms.hpp:562
Binary< A, GroupDiv< U, EDIV >, allocator_type > EDiv
Definition terms.hpp:545
static constexpr size_t IFDiv
Definition terms.hpp:560
static CUDA this_type make_abs(this_ptr &&sub_term)
Definition terms.hpp:689
CUDA TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition terms.hpp:750
Term(this_type &&)=default
static constexpr size_t INaryMul
Definition terms.hpp:566
static CUDA this_type make_max(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:725
Binary< A, GroupAdd< U >, allocator_type > Add
Definition terms.hpp:539
static constexpr size_t IMax
Definition terms.hpp:564
Nary< Mul > NaryMul
Definition terms.hpp:549
Binary< A, GroupMinMax< U, MIN >, allocator_type > Min
Definition terms.hpp:546
static constexpr size_t ISub
Definition terms.hpp:557
CUDA Term(const Term< A2, Alloc2 > &other, const allocator_type &allocator=allocator_type())
Definition terms.hpp:660
static constexpr size_t INeg
Definition terms.hpp:554
CUDA void print(const A &a) const
Definition terms.hpp:745
Binary< A, GroupMinMax< U, MAX >, allocator_type > Max
Definition terms.hpp:547
static CUDA this_type make_mul(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:701
friend class Term
Definition terms.hpp:569
static CUDA this_type make_min(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:721
CUDA bool embed(A &a, const U &u) const
Definition terms.hpp:737
static constexpr size_t ITDiv
Definition terms.hpp:559
static CUDA this_type make(SubTerm &&sub_term)
Definition terms.hpp:669
battery::unique_ptr< Term< A, allocator_type >, allocator_type > this_ptr
Definition terms.hpp:535
static CUDA this_type make_cdiv(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:713
static CUDA this_type make_neg(this_ptr &&sub_term)
Definition terms.hpp:685
static constexpr size_t INaryAdd
Definition terms.hpp:565
Binary< A, GroupSub< U >, allocator_type > Sub
Definition terms.hpp:540
static CUDA this_type make_tdiv(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:705
static constexpr size_t IMin
Definition terms.hpp:563
static CUDA this_type make_naryadd(battery::vector< this_type, allocator_type > &&sub_terms)
Definition terms.hpp:729
Binary< A, GroupMul< U, EDIV >, allocator_type > Mul
Definition terms.hpp:541
Binary< A, GroupDiv< U, CDIV >, allocator_type > CDiv
Definition terms.hpp:544
Nary< Add > NaryAdd
Definition terms.hpp:548
static CUDA this_type make_ediv(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:717
CUDA void project(const A &a, U &r) const
Definition terms.hpp:741
this_type & operator=(this_type &&)=default
static CUDA this_type make_fdiv(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:709
CUDA bool is(size_t kind) const
Definition terms.hpp:664
static CUDA this_type make_sub(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:697
static constexpr size_t ICDiv
Definition terms.hpp:561
static constexpr size_t IAdd
Definition terms.hpp:556
CUDA size_t length() const
Definition terms.hpp:754
static constexpr size_t IVar
Definition terms.hpp:551
static CUDA this_type make_formula(formula_ptr &&sub_term)
Definition terms.hpp:681
static constexpr size_t IFormula
Definition terms.hpp:553
AD A
Definition terms.hpp:531
Unary< A, NegOp< U >, allocator_type > Neg
Definition terms.hpp:537
static constexpr size_t IAbs
Definition terms.hpp:555
Unary< A, AbsOp< U >, allocator_type > Abs
Definition terms.hpp:538
static CUDA this_type make_var(const AVar &avar)
Definition terms.hpp:673
static constexpr size_t IMul
Definition terms.hpp:558
static CUDA this_type make_add(this_ptr &&left, this_ptr &&right)
Definition terms.hpp:693
static constexpr size_t IConstant
Definition terms.hpp:552
typename A::local_universe U
Definition terms.hpp:532
Allocator allocator_type
Definition terms.hpp:533
static CUDA this_type make_narymul(battery::vector< this_type, allocator_type > &&sub_terms)
Definition terms.hpp:733
Binary< A, GroupDiv< U, TDIV >, allocator_type > TDiv
Definition terms.hpp:542
CUDA Unary(this_type &&other)
Definition terms.hpp:142
typename A::local_universe U
Definition terms.hpp:126
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 TFormula< Allocator2 > deinterpret(const A &a, const Env &env, AType apc, Allocator2 allocator=Allocator2()) const
Definition terms.hpp:169
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
AD A
Definition terms.hpp:50
Variable< A > & operator=(Variable< A > &&other)=default
CUDA Variable()
Definition terms.hpp:57
CUDA void project(const A &a, U &r) const
Definition terms.hpp:69
CUDA TFormula< Allocator > deinterpret(const A &, const Env &env, AType, Allocator allocator=Allocator()) const
Definition terms.hpp:76
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(Variable< A > &&other)=default
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 const char * symbol()
Definition terms.hpp:117
static CUDA Sig sig()
Definition terms.hpp:118
static CUDA void residual(const U &a, U &r)
Definition terms.hpp:112
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
static CUDA constexpr Sig sig()
Definition terms.hpp:206
static CUDA void project(const U &a, const U &b, U &r)
Definition terms.hpp:268
Universe U
Definition terms.hpp:266
static CUDA constexpr Sig sig()
Definition terms.hpp:298
static constexpr bool prefix_symbol
Definition terms.hpp:296
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition terms.hpp:272
static CUDA char symbol()
Definition terms.hpp:297
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition terms.hpp:279
static CUDA void right_residual(const U &a, const U &b, U &r)
Definition terms.hpp:324
Universe U
Definition terms.hpp:305
static CUDA const char * symbol()
Definition terms.hpp:329
static CUDA void project(const U &a, const U &b, U &r)
Definition terms.hpp:306
static constexpr bool prefix_symbol
Definition terms.hpp:328
static CUDA constexpr Sig sig()
Definition terms.hpp:330
static CUDA void left_residual(const U &a, const U &b, U &r)
Definition terms.hpp:310
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 constexpr Sig sig()
Definition terms.hpp:261
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 constexpr bool prefix_symbol
Definition terms.hpp:259
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 constexpr Sig sig()
Definition terms.hpp:228
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