Skip to content

Commit 829aabf

Browse files
committed
Merge branch 'fix-Equality-func' into return-int-fraction_free_gauss_jordan_solve
2 parents 4bcebf9 + c6f95e3 commit 829aabf

File tree

6 files changed

+57
-44
lines changed

6 files changed

+57
-44
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,12 @@ jobs:
132132
CC: gcc
133133

134134
- BUILD_TYPE: Release
135-
PYTHON_VERSION: '3.8'
135+
PYTHON_VERSION: '3.11'
136136
OS: ubuntu-20.04
137137
WITH_MPC: yes
138138
WITH_MPFR: yes
139139
WITH_FLINT: yes
140+
WITH_FLINT_PY: yes
140141
WITH_SCIPY: yes
141142
WITH_DOCS: yes
142143
INTEGER_CLASS: flint

bin/install_travis.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ if [[ "${WITH_DOCS}" == "yes" ]]; then
1616
export conda_pkgs="${conda_pkgs} sphinx recommonmark";
1717
fi
1818

19+
if [[ "${WITH_FLINT_PY}" == "yes" ]]; then
20+
export conda_pkgs="${conda_pkgs} python-flint"; # python-flint affects sympy, see e.g. sympy/sympy#26645
21+
fi
22+
1923
if [[ "${WITH_SAGE}" == "yes" ]]; then
2024
# This is split to avoid the 10 minute limit
2125
conda install -q sagelib=8.1

symengine/lib/symengine_wrapper.in.pxd

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
cimport symengine
44
from symengine cimport RCP, map_basic_basic, rcp_const_basic
5+
from libcpp.memory cimport unique_ptr
56
from libcpp.vector cimport vector
67
from libcpp.string cimport string
78
from libcpp cimport bool as cppbool
@@ -44,7 +45,7 @@ cdef class _Lambdify(object):
4445
cpdef unsafe_eval(sef, inp, out, unsigned nbroadcast=*)
4546

4647
cdef class LambdaDouble(_Lambdify):
47-
cdef vector[symengine.LambdaRealDoubleVisitor] lambda_double
48+
cdef unique_ptr[symengine.LambdaRealDoubleVisitor] lambda_visitor
4849
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
4950
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=*, int out_offset=*)
5051
cpdef as_scipy_low_level_callable(self)
@@ -54,7 +55,7 @@ cdef class LambdaDouble(_Lambdify):
5455
int inp_offset=*, int out_offset=*)
5556

5657
cdef class LambdaComplexDouble(_Lambdify):
57-
cdef vector[symengine.LambdaComplexDoubleVisitor] lambda_double
58+
cdef unique_ptr[symengine.LambdaComplexDoubleVisitor] lambda_visitor
5859
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
5960
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out, int inp_offset=*, int out_offset=*)
6061

@@ -63,22 +64,22 @@ IF HAVE_SYMENGINE_LLVM:
6364
cdef int opt_level
6465

6566
cdef class LLVMDouble(_LLVMLambdify):
66-
cdef vector[symengine.LLVMDoubleVisitor] lambda_double
67+
cdef unique_ptr[symengine.LLVMDoubleVisitor] lambda_visitor
6768
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
6869
cdef _load(self, const string &s)
6970
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=*, int out_offset=*)
7071
cpdef as_scipy_low_level_callable(self)
7172
cpdef as_ctypes(self)
7273

7374
cdef class LLVMFloat(_LLVMLambdify):
74-
cdef vector[symengine.LLVMFloatVisitor] lambda_double
75+
cdef unique_ptr[symengine.LLVMFloatVisitor] lambda_visitor
7576
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
7677
cdef _load(self, const string &s)
7778
cpdef unsafe_real(self, float[::1] inp, float[::1] out, int inp_offset=*, int out_offset=*)
7879

7980
IF HAVE_SYMENGINE_LLVM_LONG_DOUBLE:
8081
cdef class LLVMLongDouble(_LLVMLambdify):
81-
cdef vector[symengine.LLVMLongDoubleVisitor] lambda_double
82+
cdef unique_ptr[symengine.LLVMLongDoubleVisitor] lambda_visitor
8283
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
8384
cdef _load(self, const string &s)
8485
cpdef unsafe_real(self, long double[::1] inp, long double[::1] out, int inp_offset=*, int out_offset=*)

symengine/lib/symengine_wrapper.in.pyx

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,7 @@ cdef class Basic(object):
12111211
return int(float(self))
12121212

12131213
def __long__(self):
1214-
return long(float(self))
1214+
return int(float(self))
12151215

12161216
def __complex__(self):
12171217
f = self.n(real=False)
@@ -1627,7 +1627,9 @@ class Equality(Relational):
16271627
def is_Equality(self):
16281628
return True
16291629

1630-
func = __class__
1630+
@property
1631+
def func(self):
1632+
return self.__class__
16311633

16321634

16331635
Eq = Equality
@@ -1648,7 +1650,9 @@ class Unequality(Relational):
16481650
s = self.args_as_sage()
16491651
return sage.ne(*s)
16501652

1651-
func = __class__
1653+
@property
1654+
def func(self):
1655+
return self.__class__
16521656

16531657

16541658
Ne = Unequality
@@ -5157,27 +5161,27 @@ cdef class LambdaDouble(_Lambdify):
51575161
pass
51585162

51595163
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse):
5160-
self.lambda_double.resize(1)
5161-
self.lambda_double[0].init(args_, outs_, cse)
5164+
self.lambda_visitor.reset(new symengine.LambdaRealDoubleVisitor())
5165+
deref(self.lambda_visitor).init(args_, outs_, cse)
51625166

51635167
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=0, int out_offset=0):
5164-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
5168+
deref(self.lambda_visitor).call(&out[out_offset], &inp[inp_offset])
51655169

51665170
cpdef unsafe_eval(self, inp, out, unsigned nbroadcast=1):
51675171
cdef double[::1] c_inp, c_out
51685172
cdef unsigned idx
51695173
c_inp = np.ascontiguousarray(inp.ravel(order=self.order), dtype=self.numpy_dtype)
51705174
c_out = out
51715175
for idx in range(nbroadcast):
5172-
self.lambda_double[0].call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
5176+
deref(self.lambda_visitor).call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
51735177

51745178
cpdef as_scipy_low_level_callable(self):
51755179
from ctypes import c_double, c_void_p, c_int, cast, POINTER, CFUNCTYPE
51765180
if self.tot_out_size > 1:
51775181
raise RuntimeError("SciPy LowLevelCallable supports only functions with 1 output")
51785182
addr1 = cast(<size_t>&_scipy_callback_lambda_real,
51795183
CFUNCTYPE(c_double, c_int, POINTER(c_double), c_void_p))
5180-
addr2 = cast(<size_t>&self.lambda_double[0], c_void_p)
5184+
addr2 = cast(<size_t>self.lambda_visitor.get(), c_void_p)
51815185
return create_low_level_callable(self, addr1, addr2)
51825186

51835187
cpdef as_ctypes(self):
@@ -5192,7 +5196,7 @@ cdef class LambdaDouble(_Lambdify):
51925196
from ctypes import c_double, c_void_p, c_int, cast, POINTER, CFUNCTYPE
51935197
addr1 = cast(<size_t>&_ctypes_callback_lambda_real,
51945198
CFUNCTYPE(c_void_p, POINTER(c_double), POINTER(c_double), c_void_p))
5195-
addr2 = cast(<size_t>&self.lambda_double[0], c_void_p)
5199+
addr2 = cast(<size_t>self.lambda_visitor.get(), c_void_p)
51965200
return addr1, addr2
51975201

51985202

@@ -5202,19 +5206,19 @@ cdef class LambdaComplexDouble(_Lambdify):
52025206
pass
52035207

52045208
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse):
5205-
self.lambda_double.resize(1)
5206-
self.lambda_double[0].init(args_, outs_, cse)
5209+
self.lambda_visitor.reset(new symengine.LambdaComplexDoubleVisitor())
5210+
deref(self.lambda_visitor).init(args_, outs_, cse)
52075211

52085212
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out, int inp_offset=0, int out_offset=0):
5209-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
5213+
deref(self.lambda_visitor).call(&out[out_offset], &inp[inp_offset])
52105214

52115215
cpdef unsafe_eval(self, inp, out, unsigned nbroadcast=1):
52125216
cdef double complex[::1] c_inp, c_out
52135217
cdef unsigned idx
52145218
c_inp = np.ascontiguousarray(inp.ravel(order=self.order), dtype=self.numpy_dtype)
52155219
c_out = out
52165220
for idx in range(nbroadcast):
5217-
self.lambda_double[0].call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
5221+
deref(self.lambda_visitor).call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
52185222

52195223

52205224
IF HAVE_SYMENGINE_LLVM:
@@ -5223,31 +5227,31 @@ IF HAVE_SYMENGINE_LLVM:
52235227
self.opt_level = opt_level
52245228

52255229
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse):
5226-
self.lambda_double.resize(1)
5227-
self.lambda_double[0].init(args_, outs_, cse, self.opt_level)
5230+
self.lambda_visitor.reset(new symengine.LLVMDoubleVisitor())
5231+
deref(self.lambda_visitor).init(args_, outs_, cse, self.opt_level)
52285232

52295233
cdef _load(self, const string &s):
5230-
self.lambda_double.resize(1)
5231-
self.lambda_double[0].loads(s)
5234+
self.lambda_visitor.reset(new symengine.LLVMDoubleVisitor())
5235+
deref(self.lambda_visitor).loads(s)
52325236

52335237
def __reduce__(self):
52345238
"""
52355239
Interface for pickle. Note that the resulting object is platform dependent.
52365240
"""
5237-
cdef bytes s = self.lambda_double[0].dumps()
5241+
cdef bytes s = deref(self.lambda_visitor).dumps()
52385242
return llvm_loading_func, (self.args_size, self.tot_out_size, self.out_shapes, self.real, \
52395243
self.n_exprs, self.order, self.accum_out_sizes, self.numpy_dtype, s)
52405244

52415245
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=0, int out_offset=0):
5242-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
5246+
deref(self.lambda_visitor).call(&out[out_offset], &inp[inp_offset])
52435247

52445248
cpdef unsafe_eval(self, inp, out, unsigned nbroadcast=1):
52455249
cdef double[::1] c_inp, c_out
52465250
cdef unsigned idx
52475251
c_inp = np.ascontiguousarray(inp.ravel(order=self.order), dtype=self.numpy_dtype)
52485252
c_out = out
52495253
for idx in range(nbroadcast):
5250-
self.lambda_double[0].call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
5254+
deref(self.lambda_visitor).call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
52515255

52525256
cpdef as_scipy_low_level_callable(self):
52535257
from ctypes import c_double, c_void_p, c_int, cast, POINTER, CFUNCTYPE
@@ -5257,7 +5261,7 @@ IF HAVE_SYMENGINE_LLVM:
52575261
raise RuntimeError("SciPy LowLevelCallable supports only functions with 1 output")
52585262
addr1 = cast(<size_t>&_scipy_callback_llvm_real,
52595263
CFUNCTYPE(c_double, c_int, POINTER(c_double), c_void_p))
5260-
addr2 = cast(<size_t>&self.lambda_double[0], c_void_p)
5264+
addr2 = cast(<size_t>self.lambda_visitor.get(), c_void_p)
52615265
return create_low_level_callable(self, addr1, addr2)
52625266

52635267
cpdef as_ctypes(self):
@@ -5274,71 +5278,71 @@ IF HAVE_SYMENGINE_LLVM:
52745278
raise RuntimeError("Lambda function has to be real")
52755279
addr1 = cast(<size_t>&_ctypes_callback_llvm_real,
52765280
CFUNCTYPE(c_void_p, POINTER(c_double), POINTER(c_double), c_void_p))
5277-
addr2 = cast(<size_t>&self.lambda_double[0], c_void_p)
5281+
addr2 = cast(<size_t>self.lambda_visitor.get(), c_void_p)
52785282
return addr1, addr2
52795283

52805284
cdef class LLVMFloat(_LLVMLambdify):
52815285
def __cinit__(self, args, *exprs, cppbool real=True, order='C', cppbool cse=False, cppbool _load=False, opt_level=3, dtype=None):
52825286
self.opt_level = opt_level
52835287

52845288
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse):
5285-
self.lambda_double.resize(1)
5286-
self.lambda_double[0].init(args_, outs_, cse, self.opt_level)
5289+
self.lambda_visitor.reset(new symengine.LLVMFloatVisitor())
5290+
deref(self.lambda_visitor).init(args_, outs_, cse, self.opt_level)
52875291

52885292
cdef _load(self, const string &s):
5289-
self.lambda_double.resize(1)
5290-
self.lambda_double[0].loads(s)
5293+
self.lambda_visitor.reset(new symengine.LLVMFloatVisitor())
5294+
deref(self.lambda_visitor).loads(s)
52915295

52925296
def __reduce__(self):
52935297
"""
52945298
Interface for pickle. Note that the resulting object is platform dependent.
52955299
"""
5296-
cdef bytes s = self.lambda_double[0].dumps()
5300+
cdef bytes s = deref(self.lambda_visitor).dumps()
52975301
return llvm_float_loading_func, (self.args_size, self.tot_out_size, self.out_shapes, self.real, \
52985302
self.n_exprs, self.order, self.accum_out_sizes, self.numpy_dtype, s)
52995303

53005304
cpdef unsafe_real(self, float[::1] inp, float[::1] out, int inp_offset=0, int out_offset=0):
5301-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
5305+
deref(self.lambda_visitor).call(&out[out_offset], &inp[inp_offset])
53025306

53035307
cpdef unsafe_eval(self, inp, out, unsigned nbroadcast=1):
53045308
cdef float[::1] c_inp, c_out
53055309
cdef unsigned idx
53065310
c_inp = np.ascontiguousarray(inp.ravel(order=self.order), dtype=self.numpy_dtype)
53075311
c_out = out
53085312
for idx in range(nbroadcast):
5309-
self.lambda_double[0].call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
5313+
deref(self.lambda_visitor).call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
53105314

53115315
IF HAVE_SYMENGINE_LLVM_LONG_DOUBLE:
53125316
cdef class LLVMLongDouble(_LLVMLambdify):
53135317
def __cinit__(self, args, *exprs, cppbool real=True, order='C', cppbool cse=False, cppbool _load=False, opt_level=3, dtype=None):
53145318
self.opt_level = opt_level
53155319

53165320
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse):
5317-
self.lambda_double.resize(1)
5318-
self.lambda_double[0].init(args_, outs_, cse, self.opt_level)
5321+
self.lambda_visitor.reset(new symengine.LLVMLongDoubleVisitor())
5322+
deref(self.lambda_visitor).init(args_, outs_, cse, self.opt_level)
53195323

53205324
cdef _load(self, const string &s):
5321-
self.lambda_double.resize(1)
5322-
self.lambda_double[0].loads(s)
5325+
self.lambda_visitor.reset(new symengine.LLVMLongDoubleVisitor())
5326+
deref(self.lambda_visitor).loads(s)
53235327

53245328
def __reduce__(self):
53255329
"""
53265330
Interface for pickle. Note that the resulting object is platform dependent.
53275331
"""
5328-
cdef bytes s = self.lambda_double[0].dumps()
5332+
cdef bytes s = deref(self.lambda_visitor).dumps()
53295333
return llvm_long_double_loading_func, (self.args_size, self.tot_out_size, self.out_shapes, self.real, \
53305334
self.n_exprs, self.order, self.accum_out_sizes, self.numpy_dtype, s)
53315335

53325336
cpdef unsafe_real(self, long double[::1] inp, long double[::1] out, int inp_offset=0, int out_offset=0):
5333-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
5337+
deref(self.lambda_visitor).call(&out[out_offset], &inp[inp_offset])
53345338

53355339
cpdef unsafe_eval(self, inp, out, unsigned nbroadcast=1):
53365340
cdef long double[::1] c_inp, c_out
53375341
cdef unsigned idx
53385342
c_inp = np.ascontiguousarray(inp.ravel(order=self.order), dtype=self.numpy_dtype)
53395343
c_out = out
53405344
for idx in range(nbroadcast):
5341-
self.lambda_double[0].call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
5345+
deref(self.lambda_visitor).call(&c_out[idx*self.tot_out_size], &c_inp[idx*self.args_size])
53425346

53435347
def llvm_loading_func(*args):
53445348
return LLVMDouble(args, _load=True)

symengine/tests/test_logic.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ def test_relationals():
2727
assert Ge(1, 1) == true
2828
assert Eq(I, 2) == false
2929
assert Ne(I, 2) == true
30+
eq = Eq(x, y)
31+
assert eq.func(*eq.args) == eq
32+
ne = Ne(x, y)
33+
assert ne.func(*ne.args) == ne
3034

3135

3236
def test_rich_cmp():
@@ -118,4 +122,3 @@ def test_Contains():
118122
assert Contains(x, Interval(1, 1)) != false
119123
assert Contains(oo, Interval(-oo, oo)) == false
120124
assert Contains(-oo, Interval(-oo, oo)) == false
121-

symengine_version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v0.11.1
1+
v0.12.0

0 commit comments

Comments
 (0)