Skip to content

Commit 7ce3b5a

Browse files
committed
Introduced Min and Max in sympy_compat.py and shifted tests to test_sympy_compat.py
1 parent 032528d commit 7ce3b5a

File tree

4 files changed

+66
-12
lines changed

4 files changed

+66
-12
lines changed

symengine/lib/symengine_wrapper.pxd

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ cdef class PyFunction(FunctionSymbol):
130130
cdef class Abs(Function):
131131
pass
132132

133-
cdef class Max(Function):
133+
cdef class _Max(Function):
134134
pass
135135

136-
cdef class Min(Function):
136+
cdef class _Min(Function):
137137
pass
138138

139139
cdef class Gamma(Function):

symengine/lib/symengine_wrapper.pyx

+16-8
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ cdef c2py(RCP[const symengine.Basic] o):
4646
elif (symengine.is_a_Abs(deref(o))):
4747
r = Abs.__new__(Abs)
4848
elif (symengine.is_a_Max(deref(o))):
49-
r = Max.__new__(Max)
49+
r = _Max.__new__(_Max)
5050
elif (symengine.is_a_Min(deref(o))):
51-
r = Min.__new__(Min)
51+
r = _Min.__new__(_Min)
5252
elif (symengine.is_a_Gamma(deref(o))):
5353
r = Gamma.__new__(Gamma)
5454
elif (symengine.is_a_Derivative(deref(o))):
@@ -213,9 +213,9 @@ def sympy2symengine(a, raise_error=False):
213213
elif isinstance(a, sympy.Abs):
214214
return abs(sympy2symengine(a.args[0], raise_error))
215215
elif isinstance(a, sympy.Max):
216-
return max(*a.args)
216+
return _max(*a.args)
217217
elif isinstance(a, sympy.Min):
218-
return min(*a.args)
218+
return _min(*a.args)
219219
elif isinstance(a, sympy.gamma):
220220
return gamma(a.args[0])
221221
elif isinstance(a, sympy.Derivative):
@@ -1400,7 +1400,11 @@ cdef class Abs(Function):
14001400
arg = c2py(deref(X).get_arg())._sage_()
14011401
return abs(arg)
14021402

1403-
cdef class Max(Function):
1403+
cdef class _Max(Function):
1404+
'''
1405+
Class named as such to prevent namespace issues with
1406+
Python's min. Import as Min for aesthetics.
1407+
'''
14041408

14051409
def _sympy_(self):
14061410
cdef RCP[const symengine.Max] X = \
@@ -1422,7 +1426,11 @@ cdef class Max(Function):
14221426
s.append(c2py(<RCP[const symengine.Basic]>(Y[i]))._sage_())
14231427
return sage.max(*s)
14241428

1425-
cdef class Min(Function):
1429+
cdef class _Min(Function):
1430+
'''
1431+
Class named as such to prevent namespace issues with
1432+
Python's min. Import as Min for aesthetics.
1433+
'''
14261434

14271435
def _sympy_(self):
14281436
cdef RCP[const symengine.Min] X = \
@@ -2355,15 +2363,15 @@ def log(x, y = None):
23552363
cdef Basic Y = _sympify(y)
23562364
return c2py(symengine.log(X.thisptr, Y.thisptr))
23572365

2358-
def max(*args):
2366+
def _max(*args):
23592367
cdef symengine.vec_basic v
23602368
cdef Basic e_
23612369
for e in args:
23622370
e_ = sympify(e)
23632371
v.push_back(e_.thisptr)
23642372
return c2py(symengine.max(v))
23652373

2366-
def min(*args):
2374+
def _min(*args):
23672375
cdef symengine.vec_basic v
23682376
cdef Basic e_
23692377
for e in args:

symengine/sympy_compat.py

+14
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,20 @@ def __new__(cls, a):
151151
return symengine.tan(a)
152152

153153

154+
class Max(Basic):
155+
_classes = (symengine._Max,)
156+
157+
def __new__(cls, *args):
158+
return symengine._max(*args)
159+
160+
161+
class Min(Basic):
162+
_classes = (symengine._Min,)
163+
164+
def __new__(cls, *args):
165+
return symengine._min(*args)
166+
167+
154168
class gamma(_RegisteredFunction):
155169
_classes = (symengine.Gamma,)
156170

symengine/tests/test_sympy_compat.py

+34-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from symengine.sympy_compat import (Integer, Rational, S, Basic, Add, Mul,
2-
Pow, symbols, Symbol, log, sin, sech, csch, zeros, atan2, Number, Float,
3-
symengine)
2+
Pow, symbols, Symbol, log, sin, cos, sech, csch, zeros, atan2, Number, Float,
3+
symengine, Min, Max)
44
from symengine.utilities import raises
55

66

@@ -86,6 +86,38 @@ def test_Pow():
8686
assert isinstance(i, Basic)
8787

8888

89+
def test_Max():
90+
x = Symbol("x")
91+
y = Symbol("y")
92+
z = Symbol("z")
93+
assert Max(Integer(6)/3, 1) == 2
94+
assert Max(-2, 2) == 2
95+
assert Max(2, 2) == 2
96+
assert Max(0.2, 0.3) == 0.3
97+
assert Max(x, x) == x
98+
assert Max(x, y) == Max(y, x)
99+
assert Max(x, y, z) == Max(z, y, x)
100+
assert Max(x, Max(y, z)) == Max(z, y, x)
101+
assert Max(1000, 100, -100, x, y, z) == Max(x, y, z, 1000)
102+
assert Max(cos(x), sin(x)) == Max(sin(x), cos(x))
103+
104+
105+
def test_Min():
106+
x = Symbol("x")
107+
y = Symbol("y")
108+
z = Symbol("z")
109+
assert Min(Integer(6)/3, 1) == 1
110+
assert Min(-2, 2) == -2
111+
assert Min(2, 2) == 2
112+
assert Min(0.2, 0.3) == 0.2
113+
assert Min(x, x) == x
114+
assert Min(x, y) == Min(y, x)
115+
assert Min(x, y, z) == Min(z, y, x)
116+
assert Min(x, Min(y, z)) == Min(z, y, x)
117+
assert Min(1000, 100, -100, x, y, z) == Min(x, y, z, -100)
118+
assert Min(cos(x), sin(x)) == Min(cos(x), sin(x))
119+
120+
89121
def test_sin():
90122
x = symbols("x")
91123
i = sin(0)

0 commit comments

Comments
 (0)