Skip to content

Commit 1f6e94a

Browse files
committed
Wrap EmptySet, UniversalSet and FiniteSet
1 parent b6bf8e1 commit 1f6e94a

File tree

2 files changed

+132
-7
lines changed

2 files changed

+132
-7
lines changed

symengine/lib/symengine.pxd

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,10 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
295295
bool is_a_Ceiling "SymEngine::is_a<SymEngine::Ceiling>"(const Basic &b) nogil
296296
bool is_a_Conjugate "SymEngine::is_a<SymEngine::Conjugate>"(const Basic &b) nogil
297297
bool is_a_Interval "SymEngine::is_a<SymEngine::Interval>"(const Basic &b) nogil
298+
bool is_a_EmptySet "SymEngine::is_a<SymEngine::EmptySet>"(const Basic &b) nogil
299+
bool is_a_UniversalSet "SymEngine::is_a<SymEngine::UniversalSet>"(const Basic &b) nogil
300+
bool is_a_FiniteSet "SymEngine::is_a<SymEngine::FiniteSet>"(const Basic &b) nogil
301+
298302
bool is_a_Piecewise "SymEngine::is_a<SymEngine::Piecewise>"(const Basic &b) nogil
299303
bool is_a_Contains "SymEngine::is_a<SymEngine::Contains>"(const Basic &b) nogil
300304
bool is_a_And "SymEngine::is_a<SymEngine::And>"(const Basic &b) nogil
@@ -878,7 +882,7 @@ cdef extern from "<symengine/visitor.h>" namespace "SymEngine":
878882

879883
cdef extern from "<symengine/logic.h>" namespace "SymEngine":
880884
cdef cppclass Boolean(Basic):
881-
pass
885+
RCP[const Boolean] logical_not() nogil except+
882886
cdef cppclass BooleanAtom(Boolean):
883887
bool get_val() nogil
884888
cdef cppclass Relational(Boolean):
@@ -984,6 +988,17 @@ cdef extern from "<symengine/sets.h>" namespace "SymEngine":
984988
cdef cppclass Set(Basic):
985989
RCP[const Set] set_intersection(RCP[const Set] &o) nogil except +
986990
RCP[const Set] set_union(RCP[const Set] &o) nogil except +
991+
RCP[const Set] set_complement(RCP[const Set] &o) nogil except +
992+
RCP[const Boolean] contains(RCP[const Basic] &a) nogil except +
987993
cdef cppclass Interval(Set):
988994
pass
989-
cdef RCP[const Basic] interval(RCP[const Number] &start, RCP[const Number] &end, bool l, bool r) nogil
995+
cdef cppclass EmptySet(Set):
996+
pass
997+
cdef cppclass UniversalSet(Set):
998+
pass
999+
cdef cppclass FiniteSet(Set):
1000+
pass
1001+
cdef RCP[const Basic] interval(RCP[const Number] &start, RCP[const Number] &end, bool l, bool r) nogil except +
1002+
cdef RCP[const EmptySet] emptyset() nogil except +
1003+
cdef RCP[const UniversalSet] universalset() nogil except +
1004+
cdef RCP[const Set] finiteset(set_basic &container) nogil except +

symengine/lib/symengine_wrapper.pyx

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,12 @@ 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_EmptySet(deref(o))):
196+
r = EmptySet.__new__(EmptySet)
197+
elif (symengine.is_a_UniversalSet(deref(o))):
198+
r = UniversalSet.__new__(UniversalSet)
199+
elif (symengine.is_a_FiniteSet(deref(o))):
200+
r = FiniteSet.__new__(FiniteSet)
195201
elif (symengine.is_a_And(deref(o))):
196202
r = Boolean.__new__(And)
197203
elif (symengine.is_a_Not(deref(o))):
@@ -398,9 +404,15 @@ def sympy2symengine(a, raise_error=False):
398404
return BooleanFalse
399405
elif isinstance(a, (sympy.Piecewise)):
400406
return piecewise(*(a.args))
401-
elif isinstance(a, (sympy.Interval)):
407+
elif isinstance(a, sympy.Interval):
402408
return interval(*(a.args))
403-
elif isinstance(a, (sympy.Contains)):
409+
elif isinstance(a, sympy.S.EmptySet):
410+
return emptyset()
411+
elif isinstance(a, sympy.S.UniversalSet):
412+
return universalset()
413+
elif isinstance(a, sympy.FiniteSet):
414+
return finiteset(*(a.args))
415+
elif isinstance(a, sympy.Contains):
404416
return contains(*(a.args))
405417
elif isinstance(a, sympy.Function):
406418
return PyFunction(a, a.args, a.func, sympy_module)
@@ -1090,7 +1102,9 @@ cdef class Constant(Basic):
10901102

10911103

10921104
cdef class Boolean(Basic):
1093-
pass
1105+
1106+
def logical_not(self):
1107+
return c2py(<RCP[const symengine.Basic]>(deref(symengine.rcp_static_cast_Boolean(self.thisptr)).logical_not()))
10941108

10951109

10961110
class BooleanAtom(Boolean):
@@ -1129,24 +1143,43 @@ class And(Boolean):
11291143
def __new__(cls, *args):
11301144
return logical_and(*args)
11311145

1146+
def _sympy_(self):
1147+
import sympy
1148+
s = self.args_as_sympy()
1149+
return sympy.And(*s)
1150+
11321151

11331152
class Or(Boolean):
11341153

11351154
def __new__(cls, *args):
11361155
return logical_or(*args)
11371156

1157+
def _sympy_(self):
1158+
import sympy
1159+
s = self.args_as_sympy()
1160+
return sympy.Or(*s)
1161+
11381162

11391163
class Not(Boolean):
11401164

11411165
def __new__(cls, x):
11421166
return logical_not(x)
11431167

1168+
def _sympy_(self):
1169+
import sympy
1170+
return sympy.Not(c2py(<RCP[const symengine.Basic]>(self.args[0])._sympy_()))
1171+
11441172

11451173
class Xor(Boolean):
11461174

11471175
def __new__(cls, *args):
11481176
return logical_xor(*args)
11491177

1178+
def _sympy_(self):
1179+
import sympy
1180+
s = self.args_as_sympy()
1181+
return sympy.Xor(*s)
1182+
11501183

11511184
class Relational(Boolean):
11521185

@@ -2482,6 +2515,10 @@ class Subs(Basic):
24822515

24832516

24842517
cdef class Piecewise(Basic):
2518+
2519+
def __new__(self, *args):
2520+
return piecewise(*args)
2521+
24852522
def _sympy_(self):
24862523
import sympy
24872524
a = self.args
@@ -2492,6 +2529,7 @@ cdef class Piecewise(Basic):
24922529

24932530

24942531
cdef class Set(Basic):
2532+
24952533
def intersection(self, a):
24962534
cdef Set other = sympify(a)
24972535
cdef RCP[const symengine.Set] other_ = symengine.rcp_static_cast_Set(other.thisptr)
@@ -2502,16 +2540,65 @@ cdef class Set(Basic):
25022540
cdef Set other = sympify(a)
25032541
cdef RCP[const symengine.Set] other_ = symengine.rcp_static_cast_Set(other.thisptr)
25042542
return c2py(<RCP[const symengine.Basic]>(deref(symengine.rcp_static_cast_Set(self.thisptr))
2505-
.set_intersection(other_)))
2543+
.set_union(other_)))
2544+
2545+
def complement(self, a):
2546+
cdef Set other = sympify(a)
2547+
cdef RCP[const symengine.Set] other_ = symengine.rcp_static_cast_Set(other.thisptr)
2548+
return c2py(<RCP[const symengine.Basic]>(deref(symengine.rcp_static_cast_Set(self.thisptr))
2549+
.set_complement(other_)))
2550+
2551+
def contains(self, a):
2552+
cdef Basic a_ = sympify(a)
2553+
return c2py(<RCP[const symengine.Basic]>(deref(symengine.rcp_static_cast_Set(self.thisptr))
2554+
.contains(a_)))
25062555

25072556

25082557
cdef class Interval(Set):
2558+
2559+
def __new__(self, *args):
2560+
return interval(*args)
2561+
25092562
def _sympy_(self):
25102563
import sympy
25112564
return sympy.Interval(*[arg._sympy_() for arg in self.args])
25122565

25132566

2567+
cdef class EmptySet(Set):
2568+
2569+
def __new__(self):
2570+
return emptyset()
2571+
2572+
def _sympy_(self):
2573+
import sympy
2574+
return sympy.EmptySet()
2575+
2576+
2577+
cdef class UniversalSet(Set):
2578+
2579+
def __new__(self):
2580+
return universalset()
2581+
2582+
def _sympy_(self):
2583+
import sympy
2584+
return sympy.UniversalSet()
2585+
2586+
2587+
cdef class FiniteSet(Set):
2588+
2589+
def __new__(self, *args):
2590+
return finiteset(*args)
2591+
2592+
def _sympy_(self):
2593+
import sympy
2594+
return sympy.FiniteSet(*[arg._sympy_() for arg in self.args])
2595+
2596+
25142597
cdef class Contains(Boolean):
2598+
2599+
def __new__(self, expr, sset):
2600+
return contains(expr, sset)
2601+
25152602
def _sympy_(self):
25162603
import sympy
25172604
return sympy.Contains(*[arg._sympy_() for arg in self.args])
@@ -3433,6 +3520,8 @@ def logical_nor(*args):
34333520
s.insert(e_.thisptr)
34343521
return c2py(<RCP[const symengine.Basic]>(symengine.logical_nor(s)))
34353522

3523+
Nor = logical_nor
3524+
34363525
def logical_nand(*args):
34373526
cdef symengine.set_boolean s
34383527
cdef Boolean e_
@@ -3441,6 +3530,8 @@ def logical_nand(*args):
34413530
s.insert(e_.thisptr)
34423531
return c2py(<RCP[const symengine.Basic]>(symengine.logical_nand(s)))
34433532

3533+
Nand = logical_nand
3534+
34443535
def logical_not(x):
34453536
cdef Boolean X = sympify(x)
34463537
return c2py(<RCP[const symengine.Basic]>(symengine.logical_not(X.thisptr)))
@@ -3461,6 +3552,8 @@ def logical_xnor(*args):
34613552
v.push_back(e_.thisptr)
34623553
return c2py(<RCP[const symengine.Basic]>(symengine.logical_xnor(v)))
34633554

3555+
Xnor = logical_xnor
3556+
34643557
def eval_double(x):
34653558
cdef Basic X = sympify(x)
34663559
return c2py(<RCP[const symengine.Basic]>(symengine.real_double(symengine.eval_double(deref(X.thisptr)))))
@@ -4334,11 +4427,28 @@ def interval(start, end, left_open=False, right_open=False):
43344427
return c2py(symengine.interval(n1, n2, left_open_, right_open_))
43354428

43364429

4430+
def emptyset():
4431+
return c2py(<RCP[const symengine.Basic]>(symengine.emptyset()))
4432+
4433+
4434+
def universalset():
4435+
return c2py(<RCP[const symengine.Basic]>(symengine.universalset()))
4436+
4437+
4438+
def finiteset(*args)
4439+
cdef symengine.set_basic s
4440+
cdef Basic e_
4441+
for e in args:
4442+
e_ = sympify(e)
4443+
s.insert(e_.thisptr)
4444+
return c2py(<RCP[const symengine.Basic]>(symengine.finiteset(s)))
4445+
4446+
43374447
def contains(expr, sset):
43384448
cdef Basic expr_ = sympify(expr)
43394449
cdef Set sset_ = sympify(sset)
43404450
cdef RCP[const symengine.Set] s = symengine.rcp_static_cast_Set(sset_.thisptr)
4341-
return c2py(<RCP[const symengine.Basic]>symengine.contains(expr_.thisptr, s))
4451+
return c2py(<RCP[const symengine.Basic]>(symengine.contains(expr_.thisptr, s)))
43424452

43434453
def ccode(expr):
43444454
cdef Basic expr_ = sympify(expr)

0 commit comments

Comments
 (0)