@@ -460,6 +460,16 @@ def sympify(a):
460
460
"""
461
461
if isinstance (a, str ):
462
462
return c2py(symengine.parse(a.encode(" utf-8" )))
463
+ elif isinstance (a, tuple ):
464
+ v = []
465
+ for e in a:
466
+ v.append(sympify(e))
467
+ return tuple (v)
468
+ elif isinstance (a, list ):
469
+ v = []
470
+ for e in a:
471
+ v.append(sympify(e))
472
+ return v
463
473
return _sympify(a, True )
464
474
465
475
@@ -494,16 +504,6 @@ def _sympify(a, raise_error=True):
494
504
return RealDouble(a)
495
505
elif isinstance (a, complex ):
496
506
return ComplexDouble(a)
497
- elif isinstance (a, tuple ):
498
- v = []
499
- for e in a:
500
- v.append(_sympify(e, True ))
501
- return tuple (v)
502
- elif isinstance (a, list ):
503
- v = []
504
- for e in a:
505
- v.append(_sympify(e, True ))
506
- return v
507
507
elif hasattr (a, ' _symengine_' ):
508
508
return _sympify(a._symengine_(), raise_error)
509
509
elif hasattr (a, ' _sympy_' ):
@@ -773,12 +773,17 @@ cdef class Basic(object):
773
773
cdef _DictBasic D = get_dict(* args)
774
774
return c2py(symengine.ssubs(self .thisptr, D.c))
775
775
776
- xreplace = subs
776
+ replace = xreplace = subs
777
777
778
778
def msubs (Basic self not None , *args ):
779
779
cdef _DictBasic D = get_dict(* args)
780
780
return c2py(symengine.msubs(self .thisptr, D.c))
781
781
782
+ def as_numer_denom (Basic self not None ):
783
+ cdef RCP[const symengine.Basic] _num, _den
784
+ symengine.as_numer_denom(self .thisptr, symengine.outArg(_num), symengine.outArg(_den))
785
+ return c2py(< RCP[const symengine.Basic]> _num), c2py(< RCP[const symengine.Basic]> _den)
786
+
782
787
def n (self , prec = 53 , real = False ):
783
788
if real:
784
789
return eval_real(self , prec)
@@ -885,6 +890,9 @@ cdef class Basic(object):
885
890
def is_Matrix (self ):
886
891
return False
887
892
893
+ def copy (self ):
894
+ return self
895
+
888
896
def _symbolic_ (self , ring ):
889
897
return ring(self ._sage_())
890
898
@@ -1406,6 +1414,10 @@ class Integer(Rational):
1406
1414
def is_integer (self ):
1407
1415
return True
1408
1416
1417
+ @property
1418
+ def doit (self , **hints ):
1419
+ return self
1420
+
1409
1421
def __hash__ (Basic self ):
1410
1422
return deref(self .thisptr).hash()
1411
1423
@@ -1740,7 +1752,20 @@ class NaN(Number):
1740
1752
import sage.all as sage
1741
1753
return sage.NaN
1742
1754
1743
- class Add (Basic ):
1755
+
1756
+ class AssocOp (Basic ):
1757
+
1758
+ @classmethod
1759
+ def make_args (cls , expr ):
1760
+ if isinstance (expr, cls ):
1761
+ return expr.args
1762
+ else :
1763
+ return (sympify(expr),)
1764
+
1765
+
1766
+ class Add (AssocOp ):
1767
+
1768
+ identity = 0
1744
1769
1745
1770
def __new__ (cls , *args , **kwargs ):
1746
1771
cdef symengine.vec_basic v_
@@ -1750,6 +1775,15 @@ class Add(Basic):
1750
1775
v_.push_back(e.thisptr)
1751
1776
return c2py(symengine.add(v_))
1752
1777
1778
+ @classmethod
1779
+ def _from_args (self , args ):
1780
+ if len (args) == 0 :
1781
+ return self .identity
1782
+ elif len (args) == 1 :
1783
+ return args[0 ]
1784
+
1785
+ return Add(* args)
1786
+
1753
1787
@property
1754
1788
def is_Add (self ):
1755
1789
return True
@@ -1783,7 +1817,9 @@ class Add(Basic):
1783
1817
inc(iter )
1784
1818
return d
1785
1819
1786
- class Mul (Basic ):
1820
+ class Mul (AssocOp ):
1821
+
1822
+ identity = 1
1787
1823
1788
1824
def __new__ (cls , *args , **kwargs ):
1789
1825
cdef symengine.vec_basic v_
@@ -1793,6 +1829,15 @@ class Mul(Basic):
1793
1829
v_.push_back(e.thisptr)
1794
1830
return c2py(symengine.mul(v_))
1795
1831
1832
+ @classmethod
1833
+ def _from_args (self , args ):
1834
+ if len (args) == 0 :
1835
+ return self .identity
1836
+ elif len (args) == 1 :
1837
+ return args[0 ]
1838
+
1839
+ return Mul(* args)
1840
+
1796
1841
@property
1797
1842
def is_Mul (self ):
1798
1843
return True
@@ -1828,6 +1873,19 @@ class Pow(Basic):
1828
1873
def __new__ (cls , a , b ):
1829
1874
return _sympify(a) ** b
1830
1875
1876
+ @property
1877
+ def base (Basic self ):
1878
+ cdef RCP[const symengine.Pow] X = symengine.rcp_static_cast_Pow(self .thisptr)
1879
+ return c2py(deref(X).get_base())
1880
+
1881
+ @property
1882
+ def exp (Basic self ):
1883
+ cdef RCP[const symengine.Pow] X = symengine.rcp_static_cast_Pow(self .thisptr)
1884
+ return c2py(deref(X).get_exp())
1885
+
1886
+ def as_base_exp (self ):
1887
+ return self .base, self .exp
1888
+
1831
1889
@property
1832
1890
def is_Pow (self ):
1833
1891
return True
0 commit comments