@@ -387,6 +387,13 @@ def get_dict(*args):
387
387
return D
388
388
389
389
390
+ cdef tuple vec_basic_to_tuple(symengine.vec_basic& vec):
391
+ result = []
392
+ for i in range (vec.size()):
393
+ result.append(c2py(< RCP[const symengine.Basic]> (vec[i])))
394
+ return tuple (result)
395
+
396
+
390
397
cdef class Basic(object ):
391
398
392
399
def __str__ (self ):
@@ -514,11 +521,8 @@ cdef class Basic(object):
514
521
515
522
@property
516
523
def args (self ):
517
- cdef symengine.vec_basic Y = deref(self .thisptr).get_args()
518
- s = []
519
- for i in range (Y.size()):
520
- s.append(c2py(< RCP[const symengine.Basic]> (Y[i])))
521
- return tuple (s)
524
+ cdef symengine.vec_basic args = deref(self .thisptr).get_args()
525
+ return vec_basic_to_tuple(args)
522
526
523
527
@property
524
528
def free_symbols (self ):
@@ -657,9 +661,14 @@ cdef class Symbol(Basic):
657
661
import sage.all as sage
658
662
return sage.SR.symbol(str (deref(X).get_name().decode(" utf-8" )))
659
663
664
+ @property
660
665
def name (self ):
661
666
return self .__str__ ()
662
667
668
+ @property
669
+ def is_Atom (self ):
670
+ return True
671
+
663
672
@property
664
673
def is_Symbol (self ):
665
674
return True
@@ -837,6 +846,14 @@ cdef class Integer(Number):
837
846
def __float__ (self ):
838
847
return float (str (self ))
839
848
849
+ @property
850
+ def p (self ):
851
+ return int (self )
852
+
853
+ @property
854
+ def q (self ):
855
+ return 1
856
+
840
857
841
858
cdef class RealDouble(Number):
842
859
@@ -956,6 +973,14 @@ cdef class Rational(Number):
956
973
def is_Rational (self ):
957
974
return True
958
975
976
+ @property
977
+ def p (self ):
978
+ return self .get_num_den()[0 ]
979
+
980
+ @property
981
+ def q (self ):
982
+ return self .get_num_den()[1 ]
983
+
959
984
def get_num_den (self ):
960
985
cdef RCP[const symengine.Integer] _num, _den
961
986
symengine.get_num_den(deref(symengine.rcp_static_cast_Rational(self .thisptr)),
@@ -1302,6 +1327,15 @@ cdef class Derivative(Basic):
1302
1327
def is_Derivative (self ):
1303
1328
return True
1304
1329
1330
+ @property
1331
+ def expr (self ):
1332
+ cdef RCP[const symengine.Derivative] X = symengine.rcp_static_cast_Derivative(self .thisptr)
1333
+ return c2py(deref(X).get_arg())
1334
+
1335
+ @property
1336
+ def variables (self ):
1337
+ return self .args[1 :]
1338
+
1305
1339
def __cinit__ (self , expr = None , symbols = None ):
1306
1340
if expr is None or symbols is None :
1307
1341
return
@@ -1349,6 +1383,23 @@ cdef class Subs(Basic):
1349
1383
m[v_.thisptr] = p_.thisptr
1350
1384
self .thisptr = symengine.make_rcp_Subs(expr_.thisptr, m)
1351
1385
1386
+ @property
1387
+ def expr (self ):
1388
+ cdef RCP[const symengine.Subs] me = symengine.rcp_static_cast_Subs(self .thisptr)
1389
+ return c2py(deref(me).get_arg())
1390
+
1391
+ @property
1392
+ def variables (self ):
1393
+ cdef RCP[const symengine.Subs] me = symengine.rcp_static_cast_Subs(self .thisptr)
1394
+ cdef symengine.vec_basic variables = deref(me).get_variables()
1395
+ return vec_basic_to_tuple(variables)
1396
+
1397
+ @property
1398
+ def point (self ):
1399
+ cdef RCP[const symengine.Subs] me = symengine.rcp_static_cast_Subs(self .thisptr)
1400
+ cdef symengine.vec_basic point = deref(me).get_point()
1401
+ return vec_basic_to_tuple(point)
1402
+
1352
1403
def _sympy_ (self ):
1353
1404
cdef RCP[const symengine.Subs] X = symengine.rcp_static_cast_Subs(self .thisptr)
1354
1405
arg = c2py(deref(X).get_arg())._sympy_()
0 commit comments