Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Update SymEngine and fix build issues #45

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Feb 1, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ install:

# Build C++ library
- cd symengine-cpp
- source bin/test_travis.sh
- bin/test_travis.sh

script:
# Build Python wrappers and test
Expand Down
13 changes: 10 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,37 @@ if (MINGW AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
endif()
endif()

if(MPC_LIBRARY)
if(SYMENGINE_MPC_LIBRARIES)
set(HAVE_SYMENGINE_MPC True)
else()
set(HAVE_SYMENGINE_MPC False)
endif()

if(MPFR_LIBRARY)
if(SYMENGINE_MPFR_LIBRARIES)
set(HAVE_SYMENGINE_MPFR True)
else()
set(HAVE_SYMENGINE_MPFR False)
endif()

if(PIRANHA_LIBRARY)
if(SYMENGINE_PIRANHA_LIBRARIES)
set(HAVE_SYMENGINE_PIRANHA True)
else()
set(HAVE_SYMENGINE_PIRANHA False)
endif()

if(SYENGINE_FLINT_LIBRARIES)
set(HAVE_SYMENGINE_FLINT True)
else()
set(HAVE_SYMENGINE_FLINT False)
endif()


message("CMAKE_BUILD_TYPE : ${CMAKE_BUILD_TYPE}")
message("CMAKE_CXX_FLAGS_RELEASE : ${CMAKE_CXX_FLAGS_RELEASE}")
message("CMAKE_CXX_FLAGS_DEBUG : ${CMAKE_CXX_FLAGS_DEBUG}")
message("HAVE_SYMENGINE_MPFR : ${HAVE_SYMENGINE_MPFR}")
message("HAVE_SYMENGINE_MPC : ${HAVE_SYMENGINE_MPC}")
message("HAVE_SYMENGINE_FLINT : ${HAVE_SYMENGINE_FLINT}")

message("Copying source of python wrappers into: ${CMAKE_CURRENT_BINARY_DIR}")
file(COPY symengine/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/symengine)
Expand Down
4 changes: 2 additions & 2 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ install:
- mkdir build
- cd build

- if [%COMPILER%]==[MSVC15] if [%PLATFORM%]==[Win32] cmake -G "Visual Studio 14 2015" -DGMP_DIR=../mpir-2.7.0/lib/%PLATFORM%/%BUILD_TYPE% -DCMAKE_CXX_FLAGS_RELEASE="/MT /W1 /O2 /Ob2 /D NDEBUG" -DCMAKE_CXX_FLAGS_DEBUG="/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1 /W1" ..
- if [%COMPILER%]==[MSVC15] if [%PLATFORM%]==[x64] cmake -G "Visual Studio 14 2015 Win64" -DGMP_DIR=../mpir-2.7.0/lib/%PLATFORM%/%BUILD_TYPE% -DCMAKE_CXX_FLAGS_RELEASE="/MT /W1 /O2 /Ob2 /D NDEBUG" -DCMAKE_CXX_FLAGS_DEBUG="/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1 /W1" ..
- if [%COMPILER%]==[MSVC15] if [%PLATFORM%]==[Win32] cmake -G "Visual Studio 14 2015" -DCMAKE_PREFIX_PATH=../mpir-2.7.0/lib/%PLATFORM%/%BUILD_TYPE% -DCMAKE_CXX_FLAGS_RELEASE="/MT /W1 /O2 /Ob2 /D NDEBUG" -DCMAKE_CXX_FLAGS_DEBUG="/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1 /W1" ..
- if [%COMPILER%]==[MSVC15] if [%PLATFORM%]==[x64] cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_PREFIX_PATH=../mpir-2.7.0/lib/%PLATFORM%/%BUILD_TYPE% -DCMAKE_CXX_FLAGS_RELEASE="/MT /W1 /O2 /Ob2 /D NDEBUG" -DCMAKE_CXX_FLAGS_DEBUG="/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1 /W1" ..

- if [%COMPILER%]==[MinGW] cmake -G "MinGW Makefiles" -DCOMMON_DIR=C:\MinGW -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ..
- if [%COMPILER%]==[MinGW-w64] cmake -G "MinGW Makefiles" -DWITH_MINGW_W64=yes -DCOMMON_DIR=C:\mingw64 -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ..
Expand Down
6 changes: 1 addition & 5 deletions symengine/lib/pywrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,6 @@ RCP<const Number> PyNumber::rpow(const Number &other) const {
}
return make_rcp<PyNumber>(result, pymodule_);
}
//! Differentiation w.r.t Symbol `x`
RCP<const Basic> PyNumber::diff(const RCP<const Symbol> &x) const {
return zero;
}

RCP<const Number> PyNumber::eval(long bits) const {
return pymodule_->eval_(pyobject_, bits);
Expand Down Expand Up @@ -250,7 +246,7 @@ RCP<const Number> PyFunction::eval(long bits) const {
return pyfunction_class_->get_py_module()->eval_(pyobject_, bits);
}

RCP<const Basic> PyFunction::diff(const RCP<const Symbol> &s) const {
RCP<const Basic> PyFunction::diff_impl(const RCP<const Symbol> &s) const {
return pyfunction_class_->get_py_module()->diff_(pyobject_, s);
}

Expand Down
29 changes: 24 additions & 5 deletions symengine/lib/symengine.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,17 @@ cdef extern from "<set>" namespace "std":
iterator begin() nogil
iterator end() nogil

cdef cppclass multiset[T, U]:
cppclass iterator:
T& operator*()
iterator operator++() nogil
iterator operator--() nogil
bint operator==(iterator) nogil
bint operator!=(iterator) nogil
iterator begin() nogil
iterator end() nogil
iterator insert(T&) nogil

cdef extern from "<unordered_map>" namespace "std" nogil:
cdef cppclass unordered_map[T, U]:
cppclass iterator:
Expand Down Expand Up @@ -187,15 +198,16 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
cdef struct RCPIntegerKeyLess
cdef struct RCPBasicKeyLess
ctypedef set[RCP[const_Basic], RCPBasicKeyLess] set_basic "SymEngine::set_basic"
ctypedef multiset[RCP[const_Basic], RCPBasicKeyLess] multiset_basic "SymEngine::multiset_basic"
cdef cppclass Basic:
string __str__() nogil except +
unsigned int hash() nogil except +
RCP[const Basic] diff(RCP[const Symbol] &x) nogil except +
RCP[const Basic] subs(map_basic_basic &x) nogil except +
vec_basic get_args() nogil
ctypedef RCP[const Basic] rcp_const_basic "SymEngine::RCP<const SymEngine::Basic>"
ctypedef unordered_map[short, rcp_const_basic] umap_short_basic "SymEngine::umap_short_basic"
ctypedef unordered_map[short, rcp_const_basic].iterator umap_short_basic_iterator "SymEngine::umap_short_basic::iterator"
ctypedef unordered_map[int, rcp_const_basic] umap_int_basic "SymEngine::umap_int_basic"
ctypedef unordered_map[int, rcp_const_basic].iterator umap_int_basic_iterator "SymEngine::umap_int_basic::iterator"

bool eq(const Basic &a, const Basic &b) nogil except +
bool neq(const Basic &a, const Basic &b) nogil except +
Expand Down Expand Up @@ -241,7 +253,6 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
bool is_a_PyNumber "SymEngine::is_a<SymEngine::PyNumber>"(const Basic &b) nogil

RCP[const Basic] expand(RCP[const Basic] &o) nogil except +
umap_short_basic series "SymEngine::series"(RCP[const Basic] &ex, RCP[const Symbol] &var, unsigned int prec) nogil except +

cdef extern from "<symengine/symbol.h>" namespace "SymEngine":
cdef cppclass Symbol(Basic):
Expand Down Expand Up @@ -345,7 +356,7 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
RCP[const Basic] make_rcp_Integer "SymEngine::make_rcp<const SymEngine::Integer>"(int i) nogil
RCP[const Basic] make_rcp_Integer "SymEngine::make_rcp<const SymEngine::Integer>"(mpz_class i) nogil
RCP[const Basic] make_rcp_Subs "SymEngine::make_rcp<const SymEngine::Subs>"(const RCP[const Basic] &arg, const map_basic_basic &x) nogil
RCP[const Basic] make_rcp_Derivative "SymEngine::make_rcp<const SymEngine::Derivative>"(const RCP[const Basic] &arg, const vec_basic &x) nogil
RCP[const Basic] make_rcp_Derivative "SymEngine::make_rcp<const SymEngine::Derivative>"(const RCP[const Basic] &arg, const multiset_basic &x) nogil
RCP[const Basic] make_rcp_FunctionWrapper "SymEngine::make_rcp<const SymEngine::FunctionWrapper>"(void* obj, string name, string hash_, const vec_basic &arg, \
void (*dec_ref)(void *), int (*comp)(void *, void *)) nogil
RCP[const Basic] make_rcp_RealDouble "SymEngine::make_rcp<const SymEngine::RealDouble>"(double x) nogil
Expand Down Expand Up @@ -463,7 +474,7 @@ cdef extern from "<symengine/functions.h>" namespace "SymEngine":
cdef cppclass Derivative(Basic):
Derivative(const RCP[const Basic] &arg, const vec_basic &x) nogil
RCP[const Basic] get_arg() nogil
vec_basic get_symbols() nogil
multiset_basic get_symbols() nogil

cdef cppclass Subs(Basic):
Subs(const RCP[const Basic] &arg, const map_basic_basic &x) nogil
Expand Down Expand Up @@ -668,6 +679,14 @@ cdef extern from "<symengine/lambda_double.h>" namespace "SymEngine":
void init(const vec_basic &x, const Basic &b) nogil except +
double complex call(const vector[double complex] &x) nogil except +

cdef extern from "<symengine/series.h>" namespace "SymEngine":
cdef cppclass SeriesCoeffInterface:
rcp_const_basic as_basic() nogil except +
umap_int_basic as_dict() nogil except +
rcp_const_basic get_coeff(int) nogil except +
ctypedef RCP[const SeriesCoeffInterface] rcp_const_seriescoeffinterface "SymEngine::RCP<const SymEngine::SeriesCoeffInterface>"
rcp_const_seriescoeffinterface series "SymEngine::series"(RCP[const Basic] &ex, RCP[const Symbol] &var, unsigned int prec) nogil except +

IF HAVE_SYMENGINE_MPFR:
cdef extern from "<symengine/eval_mpfr.h>" namespace "SymEngine":
void eval_mpfr(mpfr_t result, const Basic &b, mpfr_rnd_t rnd) nogil except +
Expand Down
6 changes: 1 addition & 5 deletions symengine/lib/symengine/pywrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ class PyNumber : public NumberWrapper {
//! Python module that this object belongs to
RCP<const PyModule> pymodule_;
public:
IMPLEMENT_TYPEID(NUMBER_WRAPPER)
PyNumber(PyObject* pyobject, const RCP<const PyModule> &pymodule);
~PyNumber() {
Py_DECREF(pyobject_);
Expand Down Expand Up @@ -99,8 +98,6 @@ class PyNumber : public NumberWrapper {
virtual RCP<const Number> pow(const Number &other) const;
virtual RCP<const Number> rpow(const Number &other) const;

//! Differentiation w.r.t Symbol `x`
virtual RCP<const Basic> diff(const RCP<const Symbol> &x) const;
virtual RCP<const Number> eval(long bits) const;
virtual std::string __str__() const;
virtual int compare(const Basic &o) const;
Expand Down Expand Up @@ -148,7 +145,6 @@ class PyFunction : public FunctionWrapper {
PyFunction(const vec_basic &vec, const RCP<const PyFunctionClass> &pyfunc_class,
PyObject *pyobject);
~PyFunction();
IMPLEMENT_TYPEID(FUNCTIONWRAPPER)

PyObject *get_py_object() const;
RCP<const PyFunctionClass> get_pyfunction_class() const;
Expand All @@ -159,7 +155,7 @@ class PyFunction : public FunctionWrapper {
/*! Evaluate the derivative w.r.t. `x` by calling the callback function
* of the module that this function belongs to.
* */
virtual RCP<const Basic> diff(const RCP<const Symbol> &x) const;
virtual RCP<const Basic> diff_impl(const RCP<const Symbol> &x) const;
virtual int compare(const Basic &o) const;
virtual bool __eq__(const Basic &o) const;
virtual std::size_t __hash__() const;
Expand Down
26 changes: 13 additions & 13 deletions symengine/lib/symengine_wrapper.pyx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from cython.operator cimport dereference as deref, preincrement as inc
cimport symengine
from symengine cimport RCP, set, pair, map_basic_basic, umap_short_basic, umap_short_basic_iterator, rcp_const_basic, std_pair_short_rcp_const_basic
from symengine cimport RCP, set, pair, map_basic_basic, umap_int_basic, umap_int_basic_iterator, rcp_const_basic, std_pair_short_rcp_const_basic, rcp_const_seriescoeffinterface
from libcpp cimport bool
from libcpp.string cimport string
from libcpp.vector cimport vector
Expand Down Expand Up @@ -536,12 +536,12 @@ def series(ex, x=None, x0=0, n=6, method='sympy', removeO=False):

cdef RCP[const symengine.Symbol] X = symengine.rcp_static_cast_Symbol(_x.thisptr)
cdef unsigned int N = n
cdef umap_short_basic umap
cdef umap_short_basic_iterator iter, iterend
cdef umap_int_basic umap
cdef umap_int_basic_iterator iter, iterend
cdef Basic coef

try:
umap = symengine.series(_ex.thisptr, X, N)
umap = deref(symengine.series(_ex.thisptr, X, N)).as_dict()
except RuntimeError:
from sympy import series as sy_series
return sy_series(_ex._sympy_(), _x._sympy_(), x0, n)
Expand Down Expand Up @@ -1062,33 +1062,33 @@ cdef class Derivative(Basic):
def __cinit__(self, expr = None, symbols = None):
if expr is None or symbols is None:
return
cdef symengine.vec_basic vec
cdef symengine.multiset_basic m
cdef Basic s_
cdef Basic expr_ = sympify(expr, True)
for s in symbols:
s_ = sympify(s, True)
vec.push_back(s_.thisptr)
self.thisptr = symengine.make_rcp_Derivative(<const RCP[const symengine.Basic]>expr_.thisptr, vec)
m.insert(<RCP[symengine.const_Basic]>(s_.thisptr))
self.thisptr = symengine.make_rcp_Derivative(<const RCP[const symengine.Basic]>expr_.thisptr, m)

def _sympy_(self):
cdef RCP[const symengine.Derivative] X = \
symengine.rcp_static_cast_Derivative(self.thisptr)
arg = c2py(deref(X).get_arg())._sympy_()
cdef symengine.vec_basic Y = deref(X).get_symbols()
cdef symengine.multiset_basic Y = deref(X).get_symbols()
s = []
for i in range(Y.size()):
s.append(c2py(<RCP[const symengine.Basic]>(Y[i]))._sympy_())
for i in Y:
s.append(c2py(<RCP[const symengine.Basic]>(i))._sympy_())
import sympy
return sympy.Derivative(arg, *s)

def _sage_(self):
cdef RCP[const symengine.Derivative] X = \
symengine.rcp_static_cast_Derivative(self.thisptr)
arg = c2py(deref(X).get_arg())._sage_()
cdef symengine.vec_basic Y = deref(X).get_symbols()
cdef symengine.multiset_basic Y = deref(X).get_symbols()
s = []
for i in range(Y.size()):
s.append(c2py(<RCP[const symengine.Basic]>(Y[i]))._sage_())
for i in Y:
s.append(c2py(<RCP[const symengine.Basic]>(i))._sage_())
return arg.diff(*s)

cdef class Subs(Basic):
Expand Down
2 changes: 1 addition & 1 deletion symengine_version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2b7673f448f6f36d5d4adf6b1b94c32aa6dfb05b
ce51ca41a7d48468455a700a78daad9d7544ad0e