Skip to content

Commit 92bdf4e

Browse files
committed
Wrapped specific functions and constants
1 parent 05cc34e commit 92bdf4e

File tree

6 files changed

+494
-15
lines changed

6 files changed

+494
-15
lines changed

symengine/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
UndefFunction, Function, FunctionSymbol as AppliedUndef,
1010
have_numpy, true, false, Equality, Unequality, GreaterThan,
1111
LessThan, StrictGreaterThan, StrictLessThan, Eq, Ne, Ge, Le,
12-
Gt, Lt)
12+
Gt, Lt, GoldenRatio, Catalan, EulerGamma)
1313
from .utilities import var, symbols
1414
from .functions import *
1515

symengine/lib/symengine.pxd

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
274274
bool is_a_StrictLessThan "SymEngine::is_a<SymEngine::StrictLessThan>"(const Basic &b) nogil
275275
bool is_a_PyNumber "SymEngine::is_a<SymEngine::PyNumber>"(const Basic &b) nogil
276276
bool is_a_ATan2 "SymEngine::is_a<SymEngine::ATan2>"(const Basic &b) nogil
277+
bool is_a_LambertW "SymEngine::is_a<SymEngine::LambertW>"(const Basic &b) nogil
278+
bool is_a_Zeta "SymEngine::is_a<SymEngine::Zeta>"(const Basic &b) nogil
279+
bool is_a_DirichletEta "SymEngine::is_a<SymEngine::Dirichlet_eta>"(const Basic &b) nogil
280+
bool is_a_KroneckerDelta "SymEngine::is_a<SymEngine::KroneckerDelta>"(const Basic &b) nogil
281+
bool is_a_LeviCivita "SymEngine::is_a<SymEngine::LeviCivita>"(const Basic &b) nogil
282+
bool is_a_Erf "SymEngine::is_a<SymEngine::Erf>"(const Basic &b) nogil
283+
bool is_a_Erfc "SymEngine::is_a<SymEngine::Erfc>"(const Basic &b) nogil
284+
bool is_a_LowerGamma "SymEngine::is_a<SymEngine::LowerGamma>"(const Basic &b) nogil
285+
bool is_a_UpperGamma "SymEngine::is_a<SymEngine::UpperGamma>"(const Basic &b) nogil
286+
bool is_a_LogGamma "SymEngine::is_a<SymEngine::LogGamma>"(const Basic &b) nogil
287+
bool is_a_Beta "SymEngine::is_a<SymEngine::Beta>"(const Basic &b) nogil
288+
bool is_a_PolyGamma "SymEngine::is_a<SymEngine::PolyGamma>"(const Basic &b) nogil
277289
bool is_a_PySymbol "SymEngine::is_a_sub<SymEngine::PySymbol>"(const Basic &b) nogil
278290

279291
RCP[const Basic] expand(RCP[const Basic] &o) nogil except +
@@ -357,6 +369,9 @@ cdef extern from "<symengine/constants.h>" namespace "SymEngine":
357369
RCP[const Basic] I
358370
RCP[const Basic] E
359371
RCP[const Basic] pi
372+
RCP[const Basic] GoldenRatio
373+
RCP[const Basic] Catalan
374+
RCP[const Basic] EulerGamma
360375
RCP[const Basic] Inf
361376
RCP[const Basic] ComplexInf
362377
RCP[const Basic] Nan
@@ -461,6 +476,22 @@ cdef extern from "<symengine/functions.h>" namespace "SymEngine":
461476
cdef RCP[const Basic] min(const vec_basic &arg) nogil except+
462477
cdef RCP[const Basic] gamma(RCP[const Basic] &arg) nogil except+
463478
cdef RCP[const Basic] atan2(RCP[const Basic] &num, RCP[const Basic] &den) nogil except+
479+
cdef RCP[const Basic] lambertw(RCP[const Basic] &arg) nogil except+
480+
cdef RCP[const Basic] zeta(RCP[const Basic] &s) nogil except+
481+
cdef RCP[const Basic] zeta(RCP[const Basic] &s, RCP[const Basic] &a) nogil except+
482+
cdef RCP[const Basic] dirichlet_eta(RCP[const Basic] &s) nogil except+
483+
cdef RCP[const Basic] kronecker_delta(RCP[const Basic] &i, RCP[const Basic] &j) nogil except+
484+
cdef RCP[const Basic] levi_civita(const vec_basic &arg) nogil except+
485+
cdef RCP[const Basic] erf(RCP[const Basic] &arg) nogil except+
486+
cdef RCP[const Basic] erfc(RCP[const Basic] &arg) nogil except+
487+
cdef RCP[const Basic] lowergamma(RCP[const Basic] &s, RCP[const Basic] &x) nogil except+
488+
cdef RCP[const Basic] uppergamma(RCP[const Basic] &s, RCP[const Basic] &x) nogil except+
489+
cdef RCP[const Basic] loggamma(RCP[const Basic] &arg) nogil except+
490+
cdef RCP[const Basic] beta(RCP[const Basic] &x, RCP[const Basic] &y) nogil except+
491+
cdef RCP[const Basic] polygamma(RCP[const Basic] &n, RCP[const Basic] &x) nogil except+
492+
cdef RCP[const Basic] digamma(RCP[const Basic] &x) nogil except+
493+
cdef RCP[const Basic] trigamma(RCP[const Basic] &x) nogil except+
494+
464495

465496
cdef cppclass Function(Basic):
466497
pass
@@ -580,6 +611,43 @@ cdef extern from "<symengine/functions.h>" namespace "SymEngine":
580611
cdef cppclass ATan2(Function):
581612
pass
582613

614+
cdef cppclass LambertW(OneArgFunction):
615+
pass
616+
617+
cdef cppclass Zeta(Function):
618+
pass
619+
620+
cdef cppclass Dirichlet_eta(OneArgFunction):
621+
pass
622+
623+
cdef cppclass KroneckerDelta(Function):
624+
pass
625+
626+
cdef cppclass LeviCivita(Function):
627+
pass
628+
629+
cdef cppclass Erf(OneArgFunction):
630+
pass
631+
632+
cdef cppclass Erfc(OneArgFunction):
633+
pass
634+
635+
cdef cppclass LowerGamma(Function):
636+
pass
637+
638+
cdef cppclass UpperGamma(Function):
639+
pass
640+
641+
cdef cppclass LogGamma(OneArgFunction):
642+
pass
643+
644+
cdef cppclass Beta(Function):
645+
pass
646+
647+
cdef cppclass PolyGamma(Function):
648+
pass
649+
650+
583651
IF HAVE_SYMENGINE_MPFR:
584652
cdef extern from "mpfr.h":
585653
ctypedef struct __mpfr_struct:

symengine/lib/symengine_wrapper.pyx

Lines changed: 204 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,30 @@ cdef c2py(RCP[const symengine.Basic] o):
146146
r = Function.__new__(ASech)
147147
elif (symengine.is_a_ATan2(deref(o))):
148148
r = Function.__new__(ATan2)
149+
elif (symengine.is_a_LambertW(deref(o))):
150+
r = Function.__new__(LambertW)
151+
elif (symengine.is_a_Zeta(deref(o))):
152+
r = Function.__new__(zeta)
153+
elif (symengine.is_a_DirichletEta(deref(o))):
154+
r = Function.__new__(dirichlet_eta)
155+
elif (symengine.is_a_KroneckerDelta(deref(o))):
156+
r = Function.__new__(KroneckerDelta)
157+
elif (symengine.is_a_LeviCivita(deref(o))):
158+
r = Function.__new__(LeviCivita)
159+
elif (symengine.is_a_Erf(deref(o))):
160+
r = Function.__new__(erf)
161+
elif (symengine.is_a_Erfc(deref(o))):
162+
r = Function.__new__(erfc)
163+
elif (symengine.is_a_LowerGamma(deref(o))):
164+
r = Function.__new__(lowergamma)
165+
elif (symengine.is_a_UpperGamma(deref(o))):
166+
r = Function.__new__(uppergamma)
167+
elif (symengine.is_a_LogGamma(deref(o))):
168+
r = Function.__new__(loggamma)
169+
elif (symengine.is_a_Beta(deref(o))):
170+
r = Function.__new__(beta)
171+
elif (symengine.is_a_PolyGamma(deref(o))):
172+
r = Function.__new__(polygamma)
149173
elif (symengine.is_a_PyNumber(deref(o))):
150174
r = PyNumber.__new__(PyNumber)
151175
else:
@@ -190,6 +214,12 @@ def sympy2symengine(a, raise_error=False):
190214
return E
191215
elif a is sympy.pi:
192216
return pi
217+
elif a is sympy.GoldenRatio:
218+
return GoldenRatio
219+
elif a is sympy.Catalan:
220+
return Catalan
221+
elif a is sympy.EulerGamma:
222+
return EulerGamma
193223
elif a is sympy.S.NegativeInfinity:
194224
return -oo
195225
elif a is sympy.S.Infinity:
@@ -271,6 +301,30 @@ def sympy2symengine(a, raise_error=False):
271301
return le(*a.args)
272302
elif isinstance(a, sympy.StrictLessThan):
273303
return lt(*a.args)
304+
elif isinstance(a, sympy.LambertW):
305+
return LambertW(a.args[0])
306+
elif isinstance(a, sympy.zeta):
307+
return zeta(*a.args)
308+
elif isinstance(a, sympy.dirichlet_eta):
309+
return dirichlet_eta(a.args[0])
310+
elif isinstance(a, sympy.KroneckerDelta):
311+
return KroneckerDelta(*a.args)
312+
elif isinstance(a, sympy.LeviCivita):
313+
return LeviCivita(*a.args)
314+
elif isinstance(a, sympy.erf):
315+
return erf(a.args[0])
316+
elif isinstance(a, sympy.erfc):
317+
return erfc(a.args[0])
318+
elif isinstance(a, sympy.lowergamma):
319+
return lowergamma(*a.args)
320+
elif isinstance(a, sympy.uppergamma):
321+
return uppergamma(*a.args)
322+
elif isinstance(a, sympy.loggamma):
323+
return loggamma(a.args[0])
324+
elif isinstance(a, sympy.beta):
325+
return beta(*a.args)
326+
elif isinstance(a, sympy.polygamma):
327+
return polygamma(*a.args)
274328
elif isinstance(a, sympy.gamma):
275329
return gamma(a.args[0])
276330
elif isinstance(a, sympy.Derivative):
@@ -860,6 +914,12 @@ cdef class Constant(Basic):
860914
return sympy.E
861915
elif self == pi:
862916
return sympy.pi
917+
elif self == GoldenRatio:
918+
return sympy.GoldenRatio
919+
elif self == Catalan:
920+
return sympy.Catalan
921+
elif self == EulerGamma:
922+
return sympy.EulerGamma
863923
else:
864924
raise Exception("Unknown Constant")
865925

@@ -869,6 +929,12 @@ cdef class Constant(Basic):
869929
return sage.e
870930
elif self == pi:
871931
return sage.pi
932+
elif self == GoldenRatio:
933+
return sage.golden_ratio
934+
elif self == Catalan:
935+
return sage.catalan
936+
elif self == EulerGamma:
937+
return sage.euler_gamma
872938
else:
873939
raise Exception("Unknown Constant")
874940

@@ -1521,7 +1587,7 @@ class OneArgFunction(Function):
15211587

15221588
def _sympy_(self):
15231589
import sympy
1524-
return getattr(sympy, self.__class__.__name__.lower())(self.get_arg()._sympy_())
1590+
return getattr(sympy, self.__class__.__name__)(self.get_arg()._sympy_())
15251591

15261592
def _sage_(self):
15271593
import sage.all as sage
@@ -1539,6 +1605,130 @@ class gamma(OneArgFunction):
15391605
cdef Basic X = sympify(x)
15401606
return c2py(symengine.gamma(X.thisptr))
15411607

1608+
class LambertW(OneArgFunction):
1609+
def __new__(cls, x):
1610+
cdef Basic X = sympify(x)
1611+
return c2py(symengine.lambertw(X.thisptr))
1612+
1613+
def _sage_(self):
1614+
import sage.all as sage
1615+
return sage.lambert_w(self.get_arg()._sage_())
1616+
1617+
class zeta(Function):
1618+
def __new__(cls, s, a = None):
1619+
cdef Basic S = sympify(s)
1620+
if a == None:
1621+
return c2py(symengine.zeta(S.thisptr))
1622+
cdef Basic A = sympify(a)
1623+
return c2py(symengine.zeta(S.thisptr, A.thisptr))
1624+
1625+
def _sympy_(self):
1626+
import sympy
1627+
return sympy.zeta(*self.args_as_sympy())
1628+
1629+
class dirichlet_eta(OneArgFunction):
1630+
def __new__(cls, x):
1631+
cdef Basic X = sympify(x)
1632+
return c2py(symengine.dirichlet_eta(X.thisptr))
1633+
1634+
class KroneckerDelta(Function):
1635+
def __new__(cls, x, y):
1636+
cdef Basic X = sympify(x)
1637+
cdef Basic Y = sympify(y)
1638+
return c2py(symengine.kronecker_delta(X.thisptr, Y.thisptr))
1639+
1640+
def _sympy_(self):
1641+
import sympy
1642+
return sympy.KroneckerDelta(*self.args_as_sympy())
1643+
1644+
def _sage_(self):
1645+
import sage.all as sage
1646+
return sage.kronecker_delta(*self.args_as_sage())
1647+
1648+
class LeviCivita(Function):
1649+
def __new__(cls, *args):
1650+
cdef symengine.vec_basic v
1651+
cdef Basic e_
1652+
for e in args:
1653+
e_ = sympify(e)
1654+
v.push_back(e_.thisptr)
1655+
return c2py(symengine.levi_civita(v))
1656+
1657+
def _sympy_(self):
1658+
import sympy
1659+
return sympy.LeviCivita(*self.args_as_sympy())
1660+
1661+
class erf(OneArgFunction):
1662+
def __new__(cls, x):
1663+
cdef Basic X = sympify(x)
1664+
return c2py(symengine.erf(X.thisptr))
1665+
1666+
class erfc(OneArgFunction):
1667+
def __new__(cls, x):
1668+
cdef Basic X = sympify(x)
1669+
return c2py(symengine.erfc(X.thisptr))
1670+
1671+
class lowergamma(Function):
1672+
def __new__(cls, x, y):
1673+
cdef Basic X = sympify(x)
1674+
cdef Basic Y = sympify(y)
1675+
return c2py(symengine.lowergamma(X.thisptr, Y.thisptr))
1676+
1677+
def _sympy_(self):
1678+
import sympy
1679+
return sympy.lowergamma(*self.args_as_sympy())
1680+
1681+
def _sage_(self):
1682+
import sage.all as sage
1683+
return sage.gamma_inc_lower(*self.args_as_sage())
1684+
1685+
class uppergamma(Function):
1686+
def __new__(cls, x, y):
1687+
cdef Basic X = sympify(x)
1688+
cdef Basic Y = sympify(y)
1689+
return c2py(symengine.uppergamma(X.thisptr, Y.thisptr))
1690+
1691+
def _sympy_(self):
1692+
import sympy
1693+
return sympy.uppergamma(*self.args_as_sympy())
1694+
1695+
def _sage_(self):
1696+
import sage.all as sage
1697+
return sage.gamma_inc(*self.args_as_sage())
1698+
1699+
class loggamma(OneArgFunction):
1700+
def __new__(cls, x):
1701+
cdef Basic X = sympify(x)
1702+
return c2py(symengine.loggamma(X.thisptr))
1703+
1704+
def _sage_(self):
1705+
import sage.all as sage
1706+
return sage.log_gamma(self.get_arg()._sage_())
1707+
1708+
class beta(Function):
1709+
def __new__(cls, x, y):
1710+
cdef Basic X = sympify(x)
1711+
cdef Basic Y = sympify(y)
1712+
return c2py(symengine.beta(X.thisptr, Y.thisptr))
1713+
1714+
def _sympy_(self):
1715+
import sympy
1716+
return sympy.beta(*self.args_as_sympy())
1717+
1718+
def _sage_(self):
1719+
import sage.all as sage
1720+
return sage.beta(*self.args_as_sage())
1721+
1722+
class polygamma(Function):
1723+
def __new__(cls, x, y):
1724+
cdef Basic X = sympify(x)
1725+
cdef Basic Y = sympify(y)
1726+
return c2py(symengine.polygamma(X.thisptr, Y.thisptr))
1727+
1728+
def _sympy_(self):
1729+
import sympy
1730+
return sympy.polygamma(*self.args_as_sympy())
1731+
15421732
class log(OneArgFunction):
15431733
def __new__(cls, x, y=None):
15441734
cdef Basic X = sympify(x)
@@ -2701,15 +2891,18 @@ cdef class Sieve_iterator:
27012891
I = c2py(symengine.I)
27022892
E = c2py(symengine.E)
27032893
pi = c2py(symengine.pi)
2894+
GoldenRatio = c2py(symengine.GoldenRatio)
2895+
Catalan = c2py(symengine.Catalan)
2896+
EulerGamma = c2py(symengine.EulerGamma)
27042897
oo = c2py(symengine.Inf)
27052898
zoo = c2py(symengine.ComplexInf)
27062899
nan = c2py(symengine.Nan)
27072900
true = c2py(symengine.boolTrue)
27082901
false = c2py(symengine.boolFalse)
27092902

27102903
def module_cleanup():
2711-
global I, E, pi, oo, zoo, nan, true, false, sympy_module, sage_module
2712-
del I, E, pi, oo, zoo, nan, true, false, sympy_module, sage_module
2904+
global I, E, pi, oo, zoo, nan, true, false, GoldenRatio, Catalan, EulerGamma, sympy_module, sage_module
2905+
del I, E, pi, oo, zoo, nan, true, false, GoldenRatio, Catalan, EulerGamma, sympy_module, sage_module
27132906

27142907
import atexit
27152908
atexit.register(module_cleanup)
@@ -2796,6 +2989,14 @@ def lt(lhs, rhs):
27962989
cdef Basic Y = sympify(rhs)
27972990
return c2py(<RCP[const symengine.Basic]>(symengine.Lt(X.thisptr, Y.thisptr)))
27982991

2992+
def digamma(x):
2993+
cdef Basic X = sympify(x)
2994+
return c2py(symengine.digamma(X.thisptr))
2995+
2996+
def trigamma(x):
2997+
cdef Basic X = sympify(x)
2998+
return c2py(symengine.trigamma(X.thisptr))
2999+
27993000
def eval_double(x):
28003001
cdef Basic X = sympify(x)
28013002
return c2py(<RCP[const symengine.Basic]>(symengine.real_double(symengine.eval_double(deref(X.thisptr)))))

0 commit comments

Comments
 (0)