Skip to content

Commit d9a2e27

Browse files
committed
Wrapped Infty and NaN classes
1 parent bf388b5 commit d9a2e27

File tree

6 files changed

+124
-18
lines changed

6 files changed

+124
-18
lines changed

symengine/__init__.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from .lib.symengine_wrapper import (Symbol, sympify as S, sympify,
2-
SympifyError, Add, Mul, Pow, function_symbol, I, E, pi,
3-
have_mpfr, have_mpc, have_flint, have_piranha, have_llvm,
4-
Integer, Rational, Float, Number, RealNumber, RealDouble,
5-
ComplexDouble, Max, Min, DenseMatrix, Matrix, ImmutableMatrix,
6-
ImmutableDenseMatrix, MutableDenseMatrix, MatrixBase, Basic,
7-
Lambdify, LambdifyCSE, Lambdify as lambdify, DictBasic, symarray,
8-
series, diff, zeros, eye, diag, ones, Derivative, Subs,
9-
add, expand, has_symbol, UndefFunction, Function,
10-
FunctionSymbol as AppliedUndef)
2+
SympifyError, Add, Mul, Pow, function_symbol, I, E, pi, oo,
3+
zoo, nan, have_mpfr, have_mpc, have_flint, have_piranha,
4+
have_llvm, Integer, Rational, Float, Number, RealNumber,
5+
RealDouble, ComplexDouble, Max, Min, DenseMatrix, Matrix,
6+
ImmutableMatrix, ImmutableDenseMatrix, MutableDenseMatrix,
7+
MatrixBase, Basic, Lambdify, LambdifyCSE, Lambdify as lambdify,
8+
DictBasic, symarray, series, diff, zeros, eye, diag, ones,
9+
Derivative, Subs, add, expand, has_symbol, UndefFunction,
10+
Function, FunctionSymbol as AppliedUndef)
1111
from .utilities import var, symbols
1212
from .functions import *
1313

symengine/lib/symengine.pxd

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ cdef extern from "<symengine/symengine_rcp.h>" namespace "SymEngine":
144144
RCP[const Abs] rcp_static_cast_Abs "SymEngine::rcp_static_cast<const SymEngine::Abs>"(RCP[const Basic] &b) nogil
145145
RCP[const Max] rcp_static_cast_Max "SymEngine::rcp_static_cast<const SymEngine::Max>"(RCP[const Basic] &b) nogil
146146
RCP[const Min] rcp_static_cast_Min "SymEngine::rcp_static_cast<const SymEngine::Min>"(RCP[const Basic] &b) nogil
147+
RCP[const Infty] rcp_static_cast_Infty "SymEngine::rcp_static_cast<const SymEngine::Infty>"(RCP[const Basic] &b) nogil
147148
RCP[const Gamma] rcp_static_cast_Gamma "SymEngine::rcp_static_cast<const SymEngine::Gamma>"(RCP[const Basic] &b) nogil
148149
RCP[const Derivative] rcp_static_cast_Derivative "SymEngine::rcp_static_cast<const SymEngine::Derivative>"(RCP[const Basic] &b) nogil
149150
RCP[const Subs] rcp_static_cast_Subs "SymEngine::rcp_static_cast<const SymEngine::Subs>"(RCP[const Basic] &b) nogil
@@ -226,6 +227,8 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
226227
bool is_a_Complex "SymEngine::is_a<SymEngine::Complex>"(const Basic &b) nogil
227228
bool is_a_Symbol "SymEngine::is_a<SymEngine::Symbol>"(const Basic &b) nogil
228229
bool is_a_Constant "SymEngine::is_a<SymEngine::Constant>"(const Basic &b) nogil
230+
bool is_a_Infty "SymEngine::is_a<SymEngine::Infty>"(const Basic &b) nogil
231+
bool is_a_NaN "SymEngine::is_a<SymEngine::NaN>"(const Basic &b) nogil
229232
bool is_a_Sin "SymEngine::is_a<SymEngine::Sin>"(const Basic &b) nogil
230233
bool is_a_Cos "SymEngine::is_a<SymEngine::Cos>"(const Basic &b) nogil
231234
bool is_a_Tan "SymEngine::is_a<SymEngine::Tan>"(const Basic &b) nogil
@@ -348,7 +351,17 @@ cdef extern from "<symengine/constants.h>" namespace "SymEngine":
348351
RCP[const Basic] I
349352
RCP[const Basic] E
350353
RCP[const Basic] pi
354+
RCP[const Basic] Inf
355+
RCP[const Basic] ComplexInf
356+
RCP[const Basic] Nan
357+
358+
cdef extern from "<symengine/infinity.h>" namespace "SymEngine":
359+
cdef cppclass Infty(Number):
360+
pass
351361

362+
cdef extern from "<symengine/nan.h>" namespace "SymEngine":
363+
cdef cppclass NaN(Number):
364+
pass
352365

353366
cdef extern from "<symengine/add.h>" namespace "SymEngine":
354367
cdef RCP[const Basic] add(RCP[const Basic] &a, RCP[const Basic] &b) nogil except+
@@ -392,6 +405,8 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
392405
RCP[const Basic] make_rcp_Symbol "SymEngine::make_rcp<const SymEngine::Symbol>"(string name) nogil
393406
RCP[const Basic] make_rcp_PySymbol "SymEngine::make_rcp<const SymEngine::PySymbol>"(string name, PyObject * pyobj) nogil
394407
RCP[const Basic] make_rcp_Constant "SymEngine::make_rcp<const SymEngine::Constant>"(string name) nogil
408+
RCP[const Basic] make_rcp_Infty "SymEngine::make_rcp<const SymEngine::Infty>"(RCP[const Number] i) nogil
409+
RCP[const Basic] make_rcp_NaN "SymEngine::make_rcp<const SymEngine::NaN>"() nogil
395410
RCP[const Basic] make_rcp_Integer "SymEngine::make_rcp<const SymEngine::Integer>"(int i) nogil
396411
RCP[const Basic] make_rcp_Integer "SymEngine::make_rcp<const SymEngine::Integer>"(integer_class i) nogil
397412
RCP[const Basic] make_rcp_Subs "SymEngine::make_rcp<const SymEngine::Subs>"(RCP[const Basic] arg, const map_basic_basic &x) nogil

symengine/lib/symengine_wrapper.pyx

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ cdef c2py(RCP[const symengine.Basic] o):
4040
r = Basic.__new__(Symbol)
4141
elif (symengine.is_a_Constant(deref(o))):
4242
r = Constant.__new__(Constant)
43+
elif (symengine.is_a_Infty(deref(o))):
44+
if (deref(symengine.rcp_static_cast_Infty(o)).is_positive()):
45+
r = Number.__new__(Infinity)
46+
elif (deref(symengine.rcp_static_cast_Infty(o)).is_negative()):
47+
r = Number.__new__(NegativeInfinity)
48+
else:
49+
r = Number.__new__(ComplexInfinity)
50+
elif (symengine.is_a_NaN(deref(o))):
51+
r = Number.__new__(NaN)
4352
elif (symengine.is_a_PyFunction(deref(o))):
4453
r = PyFunction.__new__(PyFunction)
4554
elif (symengine.is_a_FunctionSymbol(deref(o))):
@@ -160,6 +169,14 @@ def sympy2symengine(a, raise_error=False):
160169
return E
161170
elif a is sympy.pi:
162171
return pi
172+
elif a is sympy.S.NegativeInfinity:
173+
return -oo
174+
elif a is sympy.S.Infinity:
175+
return oo
176+
elif a is sympy.S.ComplexInfinity:
177+
return zoo
178+
elif a is sympy.nan:
179+
return nan
163180
elif isinstance(a, sympy.functions.elementary.trigonometric.TrigonometricFunction):
164181
if isinstance(a, sympy.sin):
165182
return sin(a.args[0])
@@ -1161,6 +1178,58 @@ cdef class Complex(Number):
11611178
import sage.all as sage
11621179
return self.real_part()._sage_() + sage.I * self.imaginary_part()._sage_()
11631180

1181+
class Infinity(Number):
1182+
1183+
def __new__(cls):
1184+
return oo
1185+
1186+
def _sympy_(self):
1187+
import sympy
1188+
return sympy.oo
1189+
1190+
def _sage_(self):
1191+
import sage.all as sage
1192+
return sage.oo
1193+
1194+
class NegativeInfinity(Number):
1195+
1196+
def __new__(cls):
1197+
return -oo
1198+
1199+
def _sympy_(self):
1200+
import sympy
1201+
return -sympy.oo
1202+
1203+
def _sage_(self):
1204+
import sage.all as sage
1205+
return -sage.oo
1206+
1207+
class ComplexInfinity(Number):
1208+
1209+
def __new__(cls):
1210+
return zoo
1211+
1212+
def _sympy_(self):
1213+
import sympy
1214+
return sympy.zoo
1215+
1216+
def _sage_(self):
1217+
import sage.all as sage
1218+
return sage.unsigned_infinity
1219+
1220+
class NaN(Number):
1221+
1222+
def __new__(cls):
1223+
return nan
1224+
1225+
def _sympy_(self):
1226+
import sympy
1227+
return sympy.nan
1228+
1229+
def _sage_(self):
1230+
import sage.all as sage
1231+
return sage.NaN
1232+
11641233
class Add(Basic):
11651234

11661235
def __new__(cls, *args, **kwargs):
@@ -2456,10 +2525,13 @@ cdef class Sieve_iterator:
24562525
I = c2py(symengine.I)
24572526
E = c2py(symengine.E)
24582527
pi = c2py(symengine.pi)
2528+
oo = c2py(symengine.Inf)
2529+
zoo = c2py(symengine.ComplexInf)
2530+
nan = c2py(symengine.Nan)
24592531

24602532
def module_cleanup():
2461-
global I, E, pi, sympy_module, sage_module
2462-
del I, E, pi, sympy_module, sage_module
2533+
global I, E, pi, oo, zoo, nan, sympy_module, sage_module
2534+
del I, E, pi, oo, zoo, nan, sympy_module, sage_module
24632535

24642536
import atexit
24652537
atexit.register(module_cleanup)

symengine/tests/test_sage.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from symengine import (Integer, symbols, sin, cos, pi, E, I, Add,
2-
function_symbol, DenseMatrix, sympify, log)
1+
from symengine import (Integer, symbols, sin, cos, pi, E, I, oo, zoo,
2+
nan, Add, function_symbol, DenseMatrix, sympify, log)
33
from symengine.lib.symengine_wrapper import (PyNumber, PyFunction,
44
sage_module, wrap_sage_function)
55

@@ -72,9 +72,15 @@ def test_sage_conversions():
7272
assert pi._sage_() == sage.pi
7373
assert E._sage_() == sage.e
7474
assert I._sage_() == sage.I
75+
assert oo._sage_() == sage.oo
76+
assert zoo._sage_() == sage.unsigned_infinity
77+
assert nan._sage_() == sage.NaN
7578

7679
assert pi == sympify(sage.pi)
7780
assert E == sympify(sage.e)
81+
assert oo == sympify(sage.oo)
82+
assert zoo == sympify(sage.unsigned_infinity)
83+
assert nan == sympify(sage.NaN)
7884

7985
# SympyConverter does not support converting the following
8086
# assert I == sympify(sage.I)

symengine/tests/test_sympy_compat.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from symengine.sympy_compat import (Integer, Rational, S, Basic, Add, Mul,
2-
Pow, symbols, Symbol, log, sin, cos, sech, csch, zeros, atan2, Number, Float,
2+
Pow, symbols, Symbol, log, sin, cos, sech, csch, zeros, atan2, nan, Number, Float,
33
Min, Max, RealDouble, have_mpfr, Abs)
44
from symengine.utilities import raises
55

@@ -119,6 +119,10 @@ def test_Min():
119119
assert Min(cos(x), sin(x)) == Min(cos(x), sin(x))
120120

121121

122+
def test_NaN():
123+
type(nan)() == nan
124+
125+
122126
def test_sin():
123127
x = symbols("x")
124128
i = sin(0)

symengine/tests/test_sympy_conv.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from symengine import (Symbol, Integer, sympify, SympifyError, log,
2-
function_symbol, I, E, pi, exp, gamma, have_mpfr, have_mpc,
3-
DenseMatrix, sin, cos, tan, cot, csc, sec, asin, acos, atan,
4-
acot, acsc, asec, sinh, cosh, tanh, coth, asinh, acosh, atanh,
5-
acoth, Add, Mul, Pow, diff)
2+
function_symbol, I, E, pi, oo, zoo, nan, exp, gamma, have_mpfr,
3+
have_mpc, DenseMatrix, sin, cos, tan, cot, csc, sec, asin, acos,
4+
atan, acot, acsc, asec, sinh, cosh, tanh, coth, asinh, acosh,
5+
atanh, acoth, Add, Mul, Pow, diff)
66
from symengine.lib.symengine_wrapper import (Subs, Derivative, RealMPFR,
77
ComplexMPC, PyNumber, Function)
88
import sympy
@@ -370,6 +370,15 @@ def test_constants():
370370
assert sympify(sympy.pi) == pi
371371
assert sympy.pi == pi._sympy_()
372372

373+
assert sympify(sympy.oo) == oo
374+
assert sympy.oo == oo._sympy_()
375+
376+
assert sympify(sympy.zoo) == zoo
377+
assert sympy.zoo == zoo._sympy_()
378+
379+
assert sympify(sympy.nan) == nan
380+
assert sympy.nan == nan._sympy_()
381+
373382

374383
def test_abs():
375384
x = Symbol("x")

0 commit comments

Comments
 (0)