Skip to content

Commit b6bf8e1

Browse files
committed
Implement Add, Not, Or and Xor
1 parent ffead00 commit b6bf8e1

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

symengine/lib/symengine.pxd

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
297297
bool is_a_Interval "SymEngine::is_a<SymEngine::Interval>"(const Basic &b) nogil
298298
bool is_a_Piecewise "SymEngine::is_a<SymEngine::Piecewise>"(const Basic &b) nogil
299299
bool is_a_Contains "SymEngine::is_a<SymEngine::Contains>"(const Basic &b) nogil
300+
bool is_a_And "SymEngine::is_a<SymEngine::And>"(const Basic &b) nogil
301+
bool is_a_Not "SymEngine::is_a<SymEngine::Not>"(const Basic &b) nogil
302+
bool is_a_Or "SymEngine::is_a<SymEngine::Or>"(const Basic &b) nogil
303+
bool is_a_Xor "SymEngine::is_a<SymEngine::Xor>"(const Basic &b) nogil
300304
RCP[const Basic] expand(RCP[const Basic] &o) nogil except +
301305

302306
cdef extern from "<symengine/subs.h>" namespace "SymEngine":
@@ -891,6 +895,14 @@ cdef extern from "<symengine/logic.h>" namespace "SymEngine":
891895
pass
892896
cdef cppclass Contains(Boolean):
893897
pass
898+
cdef cppclass And(Boolean):
899+
pass
900+
cdef cppclass Or(Boolean):
901+
pass
902+
cdef cppclass Not(Boolean):
903+
pass
904+
cdef cppclass Xor(Boolean):
905+
pass
894906

895907
RCP[const Basic] boolTrue
896908
RCP[const Basic] boolFalse
@@ -904,6 +916,15 @@ cdef extern from "<symengine/logic.h>" namespace "SymEngine":
904916
cdef RCP[const Boolean] Lt(RCP[const Basic] &lhs, RCP[const Basic] &rhs) nogil except+
905917
ctypedef Boolean const_Boolean "const SymEngine::Boolean"
906918
ctypedef vector[pair[RCP[const_Basic], RCP[const_Boolean]]] PiecewiseVec;
919+
ctypedef vector[RCP[const_Boolean]] vec_boolean "SymEngine::vec_boolean"
920+
ctypedef set[RCP[const_Boolean], RCPBasicKeyLess] set_boolean "SymEngine::set_boolean"
921+
cdef RCP[const Boolean] logical_and(set_boolean &s) nogil except+
922+
cdef RCP[const Boolean] logical_nand(set_boolean &s) nogil except+
923+
cdef RCP[const Boolean] logical_or(set_boolean &s) nogil except+
924+
cdef RCP[const Boolean] logical_not(RCP[const Boolean] &s) nogil except+
925+
cdef RCP[const Boolean] logical_nor(set_boolean &s) nogil except+
926+
cdef RCP[const Boolean] logical_xor(vec_boolean &s) nogil except+
927+
cdef RCP[const Boolean] logical_xnor(vec_boolean &s) nogil except+
907928
cdef RCP[const Basic] piecewise(PiecewiseVec vec) nogil except +
908929
cdef RCP[const Boolean] contains(RCP[const Basic] &expr,
909930
RCP[const Set] &set) nogil

symengine/lib/symengine_wrapper.pyx

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,14 @@ cdef c2py(RCP[const symengine.Basic] o):
192192
r = BooleanAtom.__new__(BooleanAtom)
193193
elif (symengine.is_a_Interval(deref(o))):
194194
r = Interval.__new__(Interval)
195+
elif (symengine.is_a_And(deref(o))):
196+
r = Boolean.__new__(And)
197+
elif (symengine.is_a_Not(deref(o))):
198+
r = Boolean.__new__(Not)
199+
elif (symengine.is_a_Or(deref(o))):
200+
r = Boolean.__new__(Or)
201+
elif (symengine.is_a_Xor(deref(o))):
202+
r = Boolean.__new__(Xor)
195203
else:
196204
raise Exception("Unsupported SymEngine class.")
197205
r.thisptr = o
@@ -355,6 +363,20 @@ def sympy2symengine(a, raise_error=False):
355363
return ceiling(a.args[0])
356364
elif isinstance(a, sympy.conjugate):
357365
return conjugate(a.args[0])
366+
elif isinstance(a, sympy.And):
367+
return logical_and(*a.args)
368+
elif isinstance(a, sympy.Or):
369+
return logical_or(*a.args)
370+
elif isinstance(a, sympy.Not):
371+
return logical_not(a.args[0])
372+
elif isinstance(a, sympy.Nor):
373+
return logical_nor(*a.args)
374+
elif isinstance(a, sympy.Nand):
375+
return logical_nand(*a.args)
376+
elif isinstance(a, sympy.Xor):
377+
return logical_xor(*a.args)
378+
elif isinstance(a, sympy.Xnor):
379+
return logical_xnor(*a.args)
358380
elif isinstance(a, sympy.gamma):
359381
return gamma(a.args[0])
360382
elif isinstance(a, sympy.Derivative):
@@ -1067,7 +1089,7 @@ cdef class Constant(Basic):
10671089
raise Exception("Unknown Constant")
10681090

10691091

1070-
class Boolean(Basic):
1092+
cdef class Boolean(Basic):
10711093
pass
10721094

10731095

@@ -1102,6 +1124,30 @@ class BooleanFalse(BooleanAtom):
11021124
return False
11031125

11041126

1127+
class And(Boolean):
1128+
1129+
def __new__(cls, *args):
1130+
return logical_and(*args)
1131+
1132+
1133+
class Or(Boolean):
1134+
1135+
def __new__(cls, *args):
1136+
return logical_or(*args)
1137+
1138+
1139+
class Not(Boolean):
1140+
1141+
def __new__(cls, x):
1142+
return logical_not(x)
1143+
1144+
1145+
class Xor(Boolean):
1146+
1147+
def __new__(cls, *args):
1148+
return logical_xor(*args)
1149+
1150+
11051151
class Relational(Boolean):
11061152

11071153
@property
@@ -3363,6 +3409,58 @@ def trigamma(x):
33633409
cdef Basic X = sympify(x)
33643410
return c2py(symengine.trigamma(X.thisptr))
33653411

3412+
def logical_and(*args):
3413+
cdef symengine.set_boolean s
3414+
cdef Boolean e_
3415+
for e in args:
3416+
e_ = sympify(e)
3417+
s.insert(e_.thisptr)
3418+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_and(s)))
3419+
3420+
def logical_or(*args):
3421+
cdef symengine.set_boolean s
3422+
cdef Boolean e_
3423+
for e in args:
3424+
e_ = sympify(e)
3425+
s.insert(e_.thisptr)
3426+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_or(s)))
3427+
3428+
def logical_nor(*args):
3429+
cdef symengine.set_boolean s
3430+
cdef Boolean e_
3431+
for e in args:
3432+
e_ = sympify(e)
3433+
s.insert(e_.thisptr)
3434+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_nor(s)))
3435+
3436+
def logical_nand(*args):
3437+
cdef symengine.set_boolean s
3438+
cdef Boolean e_
3439+
for e in args:
3440+
e_ = sympify(e)
3441+
s.insert(e_.thisptr)
3442+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_nand(s)))
3443+
3444+
def logical_not(x):
3445+
cdef Boolean X = sympify(x)
3446+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_not(X.thisptr)))
3447+
3448+
def logical_xor(*args):
3449+
cdef symengine.vec_boolean v
3450+
cdef Boolean e_
3451+
for e in args:
3452+
e_ = sympify(e)
3453+
v.push_back(e_.thisptr)
3454+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_xor(v)))
3455+
3456+
def logical_xnor(*args):
3457+
cdef symengine.vec_boolean v
3458+
cdef Boolean e_
3459+
for e in args:
3460+
e_ = sympify(e)
3461+
v.push_back(e_.thisptr)
3462+
return c2py(<RCP[const symengine.Basic]>(symengine.logical_xnor(v)))
3463+
33663464
def eval_double(x):
33673465
cdef Basic X = sympify(x)
33683466
return c2py(<RCP[const symengine.Basic]>(symengine.real_double(symengine.eval_double(deref(X.thisptr)))))

0 commit comments

Comments
 (0)