Skip to content

Commit f5f5525

Browse files
committed
Use symengine in series
1 parent 4230938 commit f5f5525

File tree

4 files changed

+34
-37
lines changed

4 files changed

+34
-37
lines changed

symengine/lib/symengine.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ cdef extern from "<symengine/ntheory.h>" namespace "SymEngine":
690690

691691
cdef extern from "<symengine/visitor.h>" namespace "SymEngine":
692692
bool has_symbol(const Basic &b, const Symbol &x) nogil except +
693+
RCP[const Basic] coeff(const Basic &b, const Basic &x, const Basic &n) nogil except +
693694
set_basic free_symbols(const Basic &b) nogil except +
694695

695696
cdef extern from "<utility>" namespace "std":

symengine/lib/symengine_wrapper.pyx

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,15 @@ cdef class Basic(object):
592592
d[self] = 1
593593
return d
594594

595-
def series(ex, x=None, x0=0, n=6, method='sympy', removeO=False):
595+
def coeff(self, x, n=1):
596+
cdef Symbol _x = sympify(x)
597+
cdef Basic _n = sympify(n)
598+
return c2py(symengine.coeff(deref(self.thisptr), deref(_x.thisptr), deref(_n.thisptr)))
599+
600+
def has(self, *symbols):
601+
return any([has_symbol(self, symbol) for symbol in symbols])
602+
603+
def series(ex, x=None, x0=0, n=6, as_deg_coef_pair=False):
596604
# TODO: check for x0 an infinity, see sympy/core/expr.py
597605
# TODO: nonzero x0
598606
# underscored local vars are of symengine.py type
@@ -609,35 +617,31 @@ def series(ex, x=None, x0=0, n=6, method='sympy', removeO=False):
609617
if not _x in syms:
610618
return _ex
611619

612-
if len(syms) > 1 or method == 'sympy':
613-
from sympy import series as sy_series
614-
return sy_series(_ex._sympy_(), _x._sympy_(), x0, n)
615-
elif method == 'ring_series':
616-
from sympy.polys.ring_series import rs_series
617-
return rs_series(_ex._sympy_(), _x._sympy_(), n).as_expr().subs(x,x-x0)
618-
elif method != 'symengine':
619-
raise ValueError('unknown method in series()')
620+
if x0 != 0:
621+
_ex = _ex.subs({_x: _x + x0})
620622

621623
cdef RCP[const symengine.Symbol] X = symengine.rcp_static_cast_Symbol(_x.thisptr)
622-
cdef unsigned int N = n
623624
cdef umap_int_basic umap
624625
cdef umap_int_basic_iterator iter, iterend
625-
cdef Basic coef
626626

627-
umap = deref(symengine.series(_ex.thisptr, X, N)).as_dict()
627+
if not as_deg_coef_pair:
628+
b = c2py(<symengine.RCP[const symengine.Basic]>deref(symengine.series(_ex.thisptr, X, n)).as_basic())
629+
if x0 != 0:
630+
b = b.subs({_x: _x - x0})
631+
return b
632+
633+
umap = deref(symengine.series(_ex.thisptr, X, n)).as_dict()
628634

629-
from sympy import Add as sAdd, Pow as sPow, O as sO
630635
iter = umap.begin()
631636
iterend = umap.end()
632637
poly = 0
633638
l = []
634639
while iter != iterend:
635-
coef = c2py(<symengine.RCP[const symengine.Basic]>(deref(iter).second))
636-
l.append(sPow(_x,(deref(iter).first)) * coef)
640+
l.append([deref(iter).first, c2py(<symengine.RCP[const symengine.Basic]>(deref(iter).second))])
637641
inc(iter)
638-
if removeO is False:
639-
l.append(sO(sPow(_x, n)))
640-
return sAdd(*l)
642+
if as_deg_coef_pair:
643+
return l
644+
return add(*l)
641645

642646

643647
cdef class Symbol(Basic):
Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,22 @@
11
from symengine.utilities import raises
2-
3-
from sympy import Symbol, Integer, sin, cos, exp, sqrt, E
4-
from symengine.lib.symengine_wrapper import series, have_piranha, have_flint, Symbol as SESymbol
2+
from symengine.lib.symengine_wrapper import (series, have_piranha, have_flint,
3+
Symbol, Integer, sin, cos, exp, sqrt, E)
54

65
def test_series_expansion():
7-
if have_piranha:
8-
x = SESymbol('x')
9-
ex = series(sin(1+x), x, n=10, method='symengine')
10-
assert ex.coeff(x,7) == -cos(1)/5040
11-
12-
if not have_flint and not have_piranha:
13-
return
6+
x = Symbol('x')
7+
ex = series(sin(1+x), x, n=10)
8+
assert ex.coeff(x,7) == -cos(1)/5040
149

1510
x = Symbol('x')
16-
ex = series(1/(1-x), x, n=10, method='symengine')
17-
assert ex.coeff(x,9) == 1
18-
x = SESymbol('x')
19-
ex = series(1/(1-x), x, n=10, method='symengine')
11+
ex = series(1/(1-x), x, n=10)
2012
assert ex.coeff(x,9) == 1
21-
ex = series(sin(x)*cos(x), x, n=10, method='symengine')
13+
ex = series(sin(x)*cos(x), x, n=10)
2214
assert ex.coeff(x,8) == 0
2315
assert ex.coeff(x,9) == Integer(2)/Integer(2835)
2416

25-
ex = series(E**x, x, n=10, method='symengine')
17+
ex = series(E**x, x, n=10)
2618
assert ex.coeff(x,9) == Integer(1)/Integer(362880)
27-
ex1 = series(1/sqrt(4-x), x, n=50, method='symengine')
28-
ex2 = series((4-x)**(Integer(-1)/Integer(2)), x, n=50, method='symengine')
19+
ex1 = series(1/sqrt(4-x), x, n=50)
20+
ex2 = series((4-x)**(Integer(-1)/Integer(2)), x, n=50)
2921
assert ex1.coeff(x,49) == ex2.coeff(x,49)
3022

symengine_version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
d44e20c7437f6c6795a97354a213983abc77c9fe
1+
0172e47349b7d158ee8a7186eb0a19a7f155a225

0 commit comments

Comments
 (0)