Skip to content

Commit 46509c7

Browse files
authored
Merge pull request #330 from rikardn/posdef
Add Rationals, is_positive_definite and is_negative_definite
2 parents bf602e8 + a3e9f87 commit 46509c7

File tree

7 files changed

+70
-5
lines changed

7 files changed

+70
-5
lines changed

symengine/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
UniversalSet = wrapper.S.UniversalSet
4141
Reals = wrapper.S.Reals
4242
Integers = wrapper.S.Integers
43+
Rationals = wrapper.S.Rationals
4344

4445

4546
if have_mpfr:

symengine/lib/symengine.pxd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ cdef extern from "<symengine/basic.h>" namespace "SymEngine":
302302
bool is_a_Interval "SymEngine::is_a<SymEngine::Interval>"(const Basic &b) nogil
303303
bool is_a_EmptySet "SymEngine::is_a<SymEngine::EmptySet>"(const Basic &b) nogil
304304
bool is_a_Reals "SymEngine::is_a<SymEngine::Reals>"(const Basic &b) nogil
305+
bool is_a_Rationals "SymEngine::is_a<SymEngine::Rationals>"(const Basic &b) nogil
305306
bool is_a_Integers "SymEngine::is_a<SymEngine::Integers>"(const Basic &b) nogil
306307
bool is_a_UniversalSet "SymEngine::is_a<SymEngine::UniversalSet>"(const Basic &b) nogil
307308
bool is_a_FiniteSet "SymEngine::is_a<SymEngine::FiniteSet>"(const Basic &b) nogil
@@ -827,6 +828,8 @@ cdef extern from "<symengine/matrix.h>" namespace "SymEngine":
827828
int is_hermitian() nogil
828829
int is_weakly_diagonally_dominant() nogil
829830
int is_strictly_diagonally_dominant() nogil
831+
int is_positive_definite() nogil
832+
int is_negative_definite() nogil
830833

831834
bool is_a_DenseMatrix "SymEngine::is_a<SymEngine::DenseMatrix>"(const MatrixBase &b) nogil
832835
DenseMatrix* static_cast_DenseMatrix "static_cast<SymEngine::DenseMatrix*>"(const MatrixBase *a)
@@ -1057,6 +1060,8 @@ cdef extern from "<symengine/sets.h>" namespace "SymEngine":
10571060
pass
10581061
cdef cppclass Reals(Set):
10591062
pass
1063+
cdef cppclass Rationals(Set):
1064+
pass
10601065
cdef cppclass Integers(Set):
10611066
pass
10621067
cdef cppclass UniversalSet(Set):
@@ -1075,6 +1080,7 @@ cdef extern from "<symengine/sets.h>" namespace "SymEngine":
10751080
cdef rcp_const_basic interval(RCP[const Number] &start, RCP[const Number] &end, bool l, bool r) nogil except +
10761081
cdef RCP[const EmptySet] emptyset() nogil except +
10771082
cdef RCP[const Reals] reals() nogil except +
1083+
cdef RCP[const Rationals] rationals() nogil except +
10781084
cdef RCP[const Integers] integers() nogil except +
10791085
cdef RCP[const UniversalSet] universalset() nogil except +
10801086
cdef RCP[const Set] finiteset(set_basic &container) nogil except +

symengine/lib/symengine_wrapper.pyx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ cdef object c2py(rcp_const_basic o):
235235
r = Set.__new__(Reals)
236236
elif (symengine.is_a_Integers(deref(o))):
237237
r = Set.__new__(Integers)
238+
elif (symengine.is_a_Rationals(deref(o))):
239+
r = Set.__new__(Rationals)
238240
elif (symengine.is_a_UniversalSet(deref(o))):
239241
r = Set.__new__(UniversalSet)
240242
elif (symengine.is_a_FiniteSet(deref(o))):
@@ -447,6 +449,8 @@ def sympy2symengine(a, raise_error=False):
447449
return S.Reals
448450
elif a is sympy.S.Integers:
449451
return S.Integers
452+
elif a is sympy.S.Rationals:
453+
return S.Rationals
450454
elif isinstance(a, sympy.Interval):
451455
return interval(*(a.args))
452456
elif a is sympy.S.EmptySet:
@@ -667,6 +671,10 @@ class Singleton(object):
667671
def Integers(self):
668672
return integers_singleton
669673

674+
@property
675+
def Rationals(self):
676+
return rationals_singleton
677+
670678
@property
671679
def Reals(self):
672680
return reals_singleton
@@ -3010,6 +3018,20 @@ class Reals(Set):
30103018
return self.__class__
30113019

30123020

3021+
class Rationals(Set):
3022+
3023+
def __new__(self):
3024+
return rationals()
3025+
3026+
def _sympy_(self):
3027+
import sympy
3028+
return sympy.S.Rationals
3029+
3030+
@property
3031+
def func(self):
3032+
return self.__class__
3033+
3034+
30133035
class Integers(Set):
30143036

30153037
def __new__(self):
@@ -3614,6 +3636,14 @@ cdef class DenseMatrixBase(MatrixBase):
36143636
def is_strongly_diagonally_dominant(self):
36153637
return tribool(deref(symengine.static_cast_DenseMatrix(self.thisptr)).is_strictly_diagonally_dominant())
36163638

3639+
@property
3640+
def is_positive_definite(self):
3641+
return tribool(deref(symengine.static_cast_DenseMatrix(self.thisptr)).is_positive_definite())
3642+
3643+
@property
3644+
def is_negative_definite(self):
3645+
return tribool(deref(symengine.static_cast_DenseMatrix(self.thisptr)).is_negative_definite())
3646+
36173647
@property
36183648
def T(self):
36193649
return self.transpose()
@@ -5177,6 +5207,10 @@ def reals():
51775207
return c2py(<rcp_const_basic>(symengine.reals()))
51785208

51795209

5210+
def rationals():
5211+
return c2py(<rcp_const_basic>(symengine.rationals()))
5212+
5213+
51805214
def integers():
51815215
return c2py(<rcp_const_basic>(symengine.integers()))
51825216

@@ -5291,6 +5325,7 @@ def imageset(sym, expr, base):
52915325

52925326
universal_set_singleton = UniversalSet()
52935327
integers_singleton = Integers()
5328+
rationals_singleton = Rationals()
52945329
reals_singleton = Reals()
52955330
empty_set_singleton = EmptySet()
52965331

symengine/tests/test_matrices.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,20 @@ def test_is_strongly_diagonally_dominant():
385385
assert C.is_strongly_diagonally_dominant is None
386386

387387

388+
def test_is_positive_definite():
389+
A = DenseMatrix(2, 2, [2, 1, 1, 2])
390+
assert A.is_positive_definite
391+
C = DenseMatrix(3, 3, [Symbol('x'), 2, 0, 0, 4, 0, 0, 0, 4])
392+
assert C.is_positive_definite is None
393+
394+
395+
def test_is_negative_definite():
396+
A = DenseMatrix(2, 2, [-2, -1, -1, -2])
397+
assert A.is_negative_definite
398+
C = DenseMatrix(3, 3, [Symbol('x'), -2, 0, 0, -4, 0, 0, 0, -4])
399+
assert C.is_negative_definite is None
400+
401+
388402
def test_LU():
389403
A = DenseMatrix(3, 3, [1, 3, 5, 2, 5, 6, 8, 3, 1])
390404
L, U = A.LU()

symengine/tests/test_sets.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from symengine.utilities import raises
22
from symengine.lib.symengine_wrapper import (Interval, EmptySet, UniversalSet,
3-
FiniteSet, Union, Complement, ImageSet, ConditionSet, Reals, Integers,
4-
And, Or, oo, Symbol, true, Ge, Eq, Gt)
3+
FiniteSet, Union, Complement, ImageSet, ConditionSet, Reals, Rationals,
4+
Integers, And, Or, oo, Symbol, true, Ge, Eq, Gt)
55

66

77
def test_Interval():
@@ -38,7 +38,13 @@ def test_Reals():
3838
assert R.contains(0) == true
3939

4040

41-
def test_Reals():
41+
def test_Rationals():
42+
Q = Rationals()
43+
assert Q.union(FiniteSet(2, 3)) == Q
44+
assert Q.contains(0) == true
45+
46+
47+
def test_Integers():
4248
Z = Integers()
4349
assert Z.union(FiniteSet(2, 4)) == Z
4450
assert Z.contains(0) == true

symengine/tests/test_sympy_conv.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
KroneckerDelta, LeviCivita, erf, erfc, lowergamma, uppergamma,
1010
loggamma, beta, polygamma, sign, floor, ceiling, conjugate, And,
1111
Or, Not, Xor, Piecewise, Interval, EmptySet, FiniteSet, Contains,
12-
Union, Complement, UniversalSet, Reals, Integers)
12+
Union, Complement, UniversalSet, Reals, Rationals, Integers)
1313
import unittest
1414

1515
# Note: We test _sympy_() for SymEngine -> SymPy conversion, as those are
@@ -721,6 +721,9 @@ def test_sets():
721721
assert sympify(sympy.S.Reals) == Reals()
722722
assert sympy.S.Reals == Reals()._sympy_()
723723

724+
assert sympify(sympy.S.Rationals) == Rationals()
725+
assert sympy.S.Rationals == Rationals()._sympy_()
726+
724727
assert sympify(sympy.S.Integers) == Integers()
725728
assert sympy.S.Integers == Integers()._sympy_()
726729

symengine_version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
bb386f47369500d76cda07e6e9f014bfe6339f64
1+
bb386f47369500d76cda07e6e9f014bfe6339f64

0 commit comments

Comments
 (0)