@@ -2068,11 +2068,7 @@ class Add(AssocOp):
2068
2068
identity = 0
2069
2069
2070
2070
def __new__ (cls , *args , **kwargs ):
2071
- cdef symengine.vec_basic v_
2072
- cdef Basic e
2073
- for e_ in args:
2074
- e = _sympify(e_)
2075
- v_.push_back(e.thisptr)
2071
+ cdef symengine.vec_basic v_ = iter_to_vec_basic(args)
2076
2072
return c2py(symengine.add(v_))
2077
2073
2078
2074
@classmethod
@@ -2123,11 +2119,7 @@ class Mul(AssocOp):
2123
2119
identity = 1
2124
2120
2125
2121
def __new__ (cls , *args , **kwargs ):
2126
- cdef symengine.vec_basic v_
2127
- cdef Basic e
2128
- for e_ in args:
2129
- e = _sympify(e_)
2130
- v_.push_back(e.thisptr)
2122
+ cdef symengine.vec_basic v_ = iter_to_vec_basic(args)
2131
2123
return c2py(symengine.mul(v_))
2132
2124
2133
2125
@classmethod
@@ -2296,11 +2288,7 @@ class KroneckerDelta(Function):
2296
2288
2297
2289
class LeviCivita (Function ):
2298
2290
def __new__ (cls , *args ):
2299
- cdef symengine.vec_basic v
2300
- cdef Basic e_
2301
- for e in args:
2302
- e_ = sympify(e)
2303
- v.push_back(e_.thisptr)
2291
+ cdef symengine.vec_basic v = iter_to_vec_basic(args)
2304
2292
return c2py(symengine.levi_civita(v))
2305
2293
2306
2294
def _sympy_ (self ):
@@ -2710,11 +2698,7 @@ class PyFunction(FunctionSymbol):
2710
2698
def __init__ (Basic self , pyfunction = None , args = None , pyfunction_class = None , module = None ):
2711
2699
if pyfunction is None :
2712
2700
return
2713
- cdef symengine.vec_basic v
2714
- cdef Basic arg_
2715
- for arg in args:
2716
- arg_ = sympify(arg)
2717
- v.push_back(arg_.thisptr)
2701
+ cdef symengine.vec_basic v = iter_to_vec_basic(args)
2718
2702
cdef PyFunctionClass _pyfunction_class = get_function_class(pyfunction_class, module)
2719
2703
cdef PyObject* _pyfunction = < PyObject* > pyfunction
2720
2704
Py_XINCREF(_pyfunction)
@@ -3785,42 +3769,53 @@ cdef class ImmutableDenseMatrix(DenseMatrixBase):
3785
3769
3786
3770
ImmutableMatrix = ImmutableDenseMatrix
3787
3771
3772
+
3788
3773
cdef matrix_to_vec(DenseMatrixBase d, symengine.vec_basic& v):
3789
3774
cdef Basic e_
3790
3775
for i in range (d.nrows()):
3791
3776
for j in range (d.ncols()):
3792
3777
e_ = d._get(i, j)
3793
3778
v.push_back(e_.thisptr)
3794
3779
3780
+
3795
3781
def eye (n ):
3796
3782
cdef DenseMatrixBase d = DenseMatrix(n, n)
3797
3783
symengine.eye(deref(symengine.static_cast_DenseMatrix(d.thisptr)), 0 )
3798
3784
return d
3799
3785
3800
- def diag (*values ):
3801
- cdef DenseMatrixBase d = DenseMatrix(len (values), len (values))
3802
- cdef symengine.vec_basic V
3786
+
3787
+ cdef symengine.vec_basic iter_to_vec_basic(iter ):
3803
3788
cdef Basic B
3804
- for b in values:
3789
+ cdef symengine.vec_basic V
3790
+ for b in iter :
3805
3791
B = sympify(b)
3806
3792
V.push_back(B.thisptr)
3793
+ return V
3794
+
3795
+
3796
+ def diag (*values ):
3797
+ cdef DenseMatrixBase d = DenseMatrix(len (values), len (values))
3798
+ cdef symengine.vec_basic V = iter_to_vec_basic(values)
3807
3799
symengine.diag(deref(symengine.static_cast_DenseMatrix(d.thisptr)), V, 0 )
3808
3800
return d
3809
3801
3802
+
3810
3803
def ones (r , c = None ):
3811
3804
if c is None :
3812
3805
c = r
3813
3806
cdef DenseMatrixBase d = DenseMatrix(r, c)
3814
3807
symengine.ones(deref(symengine.static_cast_DenseMatrix(d.thisptr)))
3815
3808
return d
3816
3809
3810
+
3817
3811
def zeros (r , c = None ):
3818
3812
if c is None :
3819
3813
c = r
3820
3814
cdef DenseMatrixBase d = DenseMatrix(r, c)
3821
3815
symengine.zeros(deref(symengine.static_cast_DenseMatrix(d.thisptr)))
3822
3816
return d
3823
3817
3818
+
3824
3819
cdef class Sieve:
3825
3820
@staticmethod
3826
3821
def generate_primes (n ):
@@ -3831,6 +3826,7 @@ cdef class Sieve:
3831
3826
s.append(primes[i])
3832
3827
return s
3833
3828
3829
+
3834
3830
cdef class Sieve_iterator:
3835
3831
cdef symengine.sieve_iterator * thisptr
3836
3832
cdef unsigned limit
@@ -5000,6 +4996,25 @@ def solve(f, sym, domain=None):
5000
4996
return c2py(< rcp_const_basic> (symengine.solve(f_.thisptr, x, d)))
5001
4997
5002
4998
4999
+ def linsolve (eqs , syms ):
5000
+ """
5001
+ Solve a set of linear equations given as an iterable `eqs`
5002
+ which are linear w.r.t the symbols given as an iterable `syms`
5003
+ """
5004
+ cdef symengine.vec_basic eqs_ = iter_to_vec_basic(eqs)
5005
+ cdef symengine.vec_sym syms_
5006
+ cdef RCP[const symengine.Symbol] sym_
5007
+ cdef Symbol B
5008
+ for sym in syms:
5009
+ B = sympify(sym)
5010
+ sym_ = symengine.rcp_static_cast_Symbol(B.thisptr)
5011
+ syms_.push_back(sym_)
5012
+ if syms_.size() != eqs_.size():
5013
+ raise RuntimeError (" Number of equations and symbols do not match" )
5014
+ cdef symengine.vec_basic ret = symengine.linsolve(eqs_, syms_)
5015
+ return vec_basic_to_tuple(ret)
5016
+
5017
+
5003
5018
def cse (exprs ):
5004
5019
cdef symengine.vec_basic vec
5005
5020
cdef symengine.vec_pair replacements
0 commit comments