Skip to content

Commit 8d7b827

Browse files
richardotisisuruf
authored andcommitted
ENH: LambdaDouble/LLVMDouble: Add cdef nogil function wrappers for fast calls without exposing libsymengine types
1 parent d21ec88 commit 8d7b827

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

symengine/lib/symengine_wrapper.pxd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ cdef class _Lambdify(object):
3939

4040
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
4141
cdef _load(self, const string &s)
42+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil
4243
cpdef unsafe_real(self,
4344
double[::1] inp, double[::1] out,
4445
int inp_offset=*, int out_offset=*)
46+
cdef void unsafe_complex_ptr(self, double complex *inp, double complex *out) nogil
4547
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out,
4648
int inp_offset=*, int out_offset=*)
4749
cpdef eval_real(self, inp, out)
@@ -51,7 +53,9 @@ cdef class LambdaDouble(_Lambdify):
5153
cdef vector[symengine.LambdaRealDoubleVisitor] lambda_double
5254
cdef vector[symengine.LambdaComplexDoubleVisitor] lambda_double_complex
5355
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
56+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil
5457
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=*, int out_offset=*)
58+
cdef void unsafe_complex_ptr(self, double complex *inp, double complex *out) nogil
5559
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out, int inp_offset=*, int out_offset=*)
5660
cpdef as_scipy_low_level_callable(self)
5761

@@ -60,5 +64,6 @@ IF HAVE_SYMENGINE_LLVM:
6064
cdef vector[symengine.LLVMDoubleVisitor] lambda_double
6165
cdef _init(self, symengine.vec_basic& args_, symengine.vec_basic& outs_, cppbool cse)
6266
cdef _load(self, const string &s)
67+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil
6368
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=*, int out_offset=*)
6469
cpdef as_scipy_low_level_callable(self)

symengine/lib/symengine_wrapper.pyx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4507,11 +4507,17 @@ cdef class _Lambdify(object):
45074507
cdef _load(self, const string &s):
45084508
raise ValueError("Not supported")
45094509

4510+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil:
4511+
raise ValueError("Not supported")
4512+
45104513
cpdef unsafe_real(self,
45114514
double[::1] inp, double[::1] out,
45124515
int inp_offset=0, int out_offset=0):
45134516
raise ValueError("Not supported")
45144517

4518+
cdef void unsafe_complex_ptr(self, double complex *inp, double complex *out) nogil:
4519+
raise ValueError("Not supported")
4520+
45154521
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out,
45164522
int inp_offset=0, int out_offset=0):
45174523
raise ValueError("Not supported")
@@ -4690,11 +4696,17 @@ cdef class LambdaDouble(_Lambdify):
46904696
self.lambda_double_complex.resize(1)
46914697
self.lambda_double_complex[0].init(args_, outs_, cse)
46924698

4699+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil:
4700+
self.lambda_double[0].call(out, inp)
4701+
46934702
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=0, int out_offset=0):
4694-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
4703+
self.unsafe_real_ptr(&inp[inp_offset], &out[out_offset])
4704+
4705+
cdef void unsafe_complex_ptr(self, double complex *inp, double complex *out) nogil:
4706+
self.lambda_double_complex[0].call(out, inp)
46954707

46964708
cpdef unsafe_complex(self, double complex[::1] inp, double complex[::1] out, int inp_offset=0, int out_offset=0):
4697-
self.lambda_double_complex[0].call(&out[out_offset], &inp[inp_offset])
4709+
self.unsafe_complex_ptr(&inp[inp_offset], &out[out_offset])
46984710

46994711
cpdef as_scipy_low_level_callable(self):
47004712
from ctypes import c_double, c_void_p, c_int, cast, POINTER, CFUNCTYPE
@@ -4726,8 +4738,11 @@ IF HAVE_SYMENGINE_LLVM:
47264738
return llvm_loading_func, (self.args_size, self.tot_out_size, self.out_shapes, self.real, \
47274739
self.n_exprs, self.order, self.accum_out_sizes, self.numpy_dtype, s)
47284740

4741+
cdef void unsafe_real_ptr(self, double *inp, double *out) nogil:
4742+
self.lambda_double[0].call(out, inp)
4743+
47294744
cpdef unsafe_real(self, double[::1] inp, double[::1] out, int inp_offset=0, int out_offset=0):
4730-
self.lambda_double[0].call(&out[out_offset], &inp[inp_offset])
4745+
self.unsafe_real_ptr(&inp[inp_offset], &out[out_offset])
47314746

47324747
cpdef as_scipy_low_level_callable(self):
47334748
from ctypes import c_double, c_void_p, c_int, cast, POINTER, CFUNCTYPE

0 commit comments

Comments
 (0)