Skip to content

Commit df48df0

Browse files
authored
Merge pull request #263 from isuruf/evalf
wrap new evalf with symbols
2 parents 2ca28c1 + b2823dc commit df48df0

File tree

4 files changed

+50
-50
lines changed

4 files changed

+50
-50
lines changed

symengine/lib/symengine.pxd

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
182182
unsigned int hash() nogil except +
183183
vec_basic get_args() nogil
184184
int __cmp__(const Basic &o) nogil
185-
ctypedef rcp_const_basic rcp_const_basic "SymEngine::RCP<const SymEngine::Basic>"
186185
ctypedef RCP[const Number] rcp_const_number "SymEngine::RCP<const SymEngine::Number>"
187186
ctypedef unordered_map[int, rcp_const_basic] umap_int_basic "SymEngine::umap_int_basic"
188187
ctypedef unordered_map[int, rcp_const_basic].iterator umap_int_basic_iterator "SymEngine::umap_int_basic::iterator"
@@ -958,6 +957,14 @@ cdef extern from "<utility>" namespace "std":
958957
cdef map_basic_basic std_move_map_basic_basic "std::move" (map_basic_basic) nogil
959958
cdef PiecewiseVec std_move_PiecewiseVec "std::move" (PiecewiseVec) nogil
960959

960+
cdef extern from "<symengine/eval.h>" namespace "SymEngine":
961+
cdef cppclass EvalfDomain:
962+
pass
963+
cdef EvalfDomain EvalfComplex "SymEngine::EvalfDomain::Complex"
964+
cdef EvalfDomain EvalfReal "SymEngine::EvalfDomain::Real"
965+
cdef EvalfDomain EvalfSymbolic "SymEngine::EvalfDomain::Symbolic"
966+
rcp_const_basic evalf(const Basic &b, unsigned long bits, EvalfDomain domain) nogil except +
967+
961968
cdef extern from "<symengine/eval_double.h>" namespace "SymEngine":
962969
double eval_double(const Basic &b) nogil except +
963970
double complex eval_complex_double(const Basic &b) nogil except +
@@ -999,9 +1006,6 @@ IF HAVE_SYMENGINE_MPC:
9991006
cdef extern from "<symengine/parser.h>" namespace "SymEngine":
10001007
rcp_const_basic parse(const string &n) nogil except +
10011008

1002-
cdef extern from "<symengine/codegen.h>" namespace "SymEngine":
1003-
string ccode(const Basic &x) nogil except +
1004-
10051009
cdef extern from "<symengine/sets.h>" namespace "SymEngine":
10061010
cdef cppclass Set(Basic):
10071011
RCP[const Set] set_intersection(RCP[const Set] &o) nogil except +
@@ -1040,5 +1044,6 @@ cdef extern from "<symengine/solve.h>" namespace "SymEngine":
10401044
cdef RCP[const Set] solve(rcp_const_basic &f, RCP[const Symbol] &sym) nogil except +
10411045
cdef RCP[const Set] solve(rcp_const_basic &f, RCP[const Symbol] &sym, RCP[const Set] &domain) nogil except +
10421046

1043-
cdef extern from "<symengine/latex.h>" namespace "SymEngine":
1047+
cdef extern from "<symengine/printers.h>" namespace "SymEngine":
1048+
string ccode(const Basic &x) nogil except +
10441049
string latex(const Basic &x) nogil except +

symengine/lib/symengine_wrapper.pyx

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -915,11 +915,8 @@ cdef class Basic(object):
915915
symengine.as_real_imag(self.thisptr, symengine.outArg(_real), symengine.outArg(_imag))
916916
return c2py(<rcp_const_basic>_real), c2py(<rcp_const_basic>_imag)
917917

918-
def n(self, prec = 53, real = False):
919-
if real:
920-
return eval_real(self, prec)
921-
else:
922-
return eval(self, prec)
918+
def n(self, unsigned long prec = 53, real=None):
919+
return evalf(self, prec, real)
923920

924921
evalf = n
925922

@@ -3994,13 +3991,24 @@ def Xnor(*args):
39943991
v.push_back(symengine.rcp_static_cast_Boolean(e_.thisptr))
39953992
return c2py(<rcp_const_basic>(symengine.logical_xnor(v)))
39963993

3997-
def eval_double(x):
3994+
def evalf(x, unsigned long bits=53, real=None):
39983995
cdef Basic X = sympify(x)
3999-
return c2py(<rcp_const_basic>(symengine.real_double(symengine.eval_double(deref(X.thisptr)))))
3996+
cdef symengine.EvalfDomain d
3997+
if real is None:
3998+
d = symengine.EvalfSymbolic
3999+
elif real:
4000+
d = symengine.EvalfReal
4001+
else:
4002+
d = symengine.EvalfComplex
4003+
return c2py(<rcp_const_basic>(symengine.evalf(deref(X.thisptr), bits, d)))
4004+
4005+
def eval_double(x):
4006+
warnings.warn("eval_double is deprecated. Use evalf(..., real=True)", DeprecationWarning)
4007+
return evalf(x, 53, real=True)
40004008

40014009
def eval_complex_double(x):
4002-
cdef Basic X = sympify(x)
4003-
return c2py(<rcp_const_basic>(symengine.complex_double(symengine.eval_complex_double(deref(X.thisptr)))))
4010+
warnings.warn("eval_complex_double is deprecated. Use evalf(..., real=False)", DeprecationWarning)
4011+
return evalf(x, 53, real=False)
40044012

40054013
have_mpfr = False
40064014
have_mpc = False
@@ -4010,19 +4018,15 @@ have_llvm = False
40104018

40114019
IF HAVE_SYMENGINE_MPFR:
40124020
have_mpfr = True
4013-
def eval_mpfr(x, long prec):
4014-
cdef Basic X = sympify(x)
4015-
cdef symengine.mpfr_class a = symengine.mpfr_class(prec)
4016-
symengine.eval_mpfr(a.get_mpfr_t(), deref(X.thisptr), symengine.MPFR_RNDN)
4017-
return c2py(<rcp_const_basic>(symengine.real_mpfr(symengine.std_move_mpfr(a))))
4021+
def eval_mpfr(x, unsigned long prec):
4022+
warnings.warn("eval_mpfr is deprecated. Use evalf(..., real=True)", DeprecationWarning)
4023+
return evalf(x, prec, real=True)
40184024

40194025
IF HAVE_SYMENGINE_MPC:
40204026
have_mpc = True
4021-
def eval_mpc(x, long prec):
4022-
cdef Basic X = sympify(x)
4023-
cdef symengine.mpc_class a = symengine.mpc_class(prec)
4024-
symengine.eval_mpc(a.get_mpc_t(), deref(X.thisptr), symengine.MPFR_RNDN)
4025-
return c2py(<rcp_const_basic>(symengine.complex_mpc(symengine.std_move_mpc(a))))
4027+
def eval_mpc(x, unsigned long prec):
4028+
warnings.warn("eval_mpc is deprecated. Use evalf(..., real=False)", DeprecationWarning)
4029+
return evalf(x, prec, real=True)
40264030

40274031
IF HAVE_SYMENGINE_PIRANHA:
40284032
have_piranha = True
@@ -4038,22 +4042,12 @@ def require(obj, t):
40384042
raise TypeError("{} required. {} is of type {}".format(t, obj, type(obj)))
40394043

40404044
def eval(x, long prec):
4041-
if prec <= 53:
4042-
return eval_complex_double(x)
4043-
else:
4044-
IF HAVE_SYMENGINE_MPC:
4045-
return eval_mpc(x, prec)
4046-
ELSE:
4047-
raise ValueError("Precision %s is only supported with MPC" % prec)
4045+
warnings.warn("eval is deprecated. Use evalf(..., real=False)", DeprecationWarning)
4046+
return evalf(x, prec, real=False)
40484047

40494048
def eval_real(x, long prec):
4050-
if prec <= 53:
4051-
return eval_double(x)
4052-
else:
4053-
IF HAVE_SYMENGINE_MPFR:
4054-
return eval_mpfr(x, prec)
4055-
ELSE:
4056-
raise ValueError("Precision %s is only supported with MPFR" % prec)
4049+
warnings.warn("eval_real is deprecated. Use evalf(..., real=True)", DeprecationWarning)
4050+
return evalf(x, prec, real=True)
40574051

40584052
def probab_prime_p(n, reps = 25):
40594053
cdef Basic _n = sympify(n)

symengine/tests/test_eval.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
from symengine.utilities import raises
22
from symengine import (Symbol, sin, cos, Integer, Add, I, RealDouble, ComplexDouble, sqrt)
33

4-
from symengine.lib.symengine_wrapper import eval_double
54
from unittest.case import SkipTest
65

76
def test_eval_double1():
87
x = Symbol("x")
98
y = Symbol("y")
109
e = sin(x)**2 + cos(x)**2
1110
e = e.subs(x, 7)
12-
assert abs(eval_double(e) - 1) < 1e-9
11+
assert abs(e.n(real=True) - 1) < 1e-9
12+
assert abs(e.n() - 1) < 1e-9
1313

1414

1515
def test_eval_double2():
1616
x = Symbol("x")
17-
y = Symbol("y")
18-
e = sin(x)**2 + cos(x)**2
19-
raises(RuntimeError, lambda: (abs(eval_double(e) - 1) < 1e-9))
20-
17+
e = sin(x)**2 + sqrt(2)
18+
raises(RuntimeError, lambda: e.n(real=True))
19+
assert abs(e.n() - x**2 - 1.414) < 1e-3
2120

2221
def test_n():
2322
x = Symbol("x")
24-
raises(RuntimeError, lambda: (x.n()))
23+
raises(RuntimeError, lambda: x.n(real=True))
24+
assert x.n() == x + 0.0
2525

2626
x = 2 + I
2727
raises(RuntimeError, lambda: (x.n(real=True)))
@@ -36,25 +36,26 @@ def test_n():
3636

3737

3838
def test_n_mpfr():
39+
x = sqrt(Integer(2))
3940
try:
4041
from symengine import RealMPFR
41-
x = sqrt(Integer(2))
4242
y = RealMPFR('1.41421356237309504880169', 75)
4343
assert x.n(75, real=True) == y
4444
except ImportError:
45-
x = sqrt(Integer(2))
4645
raises(ValueError, lambda: (x.n(75, real=True)))
46+
raises(ValueError, lambda: (x.n(75)))
4747
raise SkipTest("No MPFR support")
4848

4949

5050
def test_n_mpc():
51+
x = sqrt(Integer(2)) + 3*I
5152
try:
5253
from symengine import ComplexMPC
53-
x = sqrt(Integer(2)) + 3*I
5454
y = ComplexMPC('1.41421356237309504880169', '3.0', 75)
5555
assert x.n(75) == y
5656
except ImportError:
57-
x = sqrt(Integer(2))
57+
raises(Exception, lambda: (x.n(75, real=True)))
58+
raises(ValueError, lambda: (x.n(75, real=False)))
5859
raises(ValueError, lambda: (x.n(75)))
5960
raise SkipTest("No MPC support")
6061

symengine_version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
85c78dafe7829408f69c3bc0df7408d78ef96298
1+
f62f1931c9d0be28ac03938e3ec2ad33b286727d

0 commit comments

Comments
 (0)