diff --git a/ilpy/decl.pxd b/ilpy/decl.pxd index afe640d..381d994 100644 --- a/ilpy/decl.pxd +++ b/ilpy/decl.pxd @@ -2,6 +2,7 @@ from libcpp cimport bool from libcpp.string cimport string from libcpp.memory cimport shared_ptr from libcpp.map cimport map +from libcpp.pair cimport pair from libcpp.vector cimport vector cdef extern from 'impl/solvers/Relation.h': @@ -52,6 +53,7 @@ cdef extern from 'impl/solvers/QuadraticObjective.h': void setCoefficient(unsigned int, double) const vector[double]& getCoefficients() void setQuadraticCoefficient(unsigned int, unsigned int, double) + const map[pair[unsigned int, unsigned int], double]& getQuadraticCoefficients() void setSense(Sense) Sense getSense() void resize(unsigned int) diff --git a/ilpy/wrapper.pyi b/ilpy/wrapper.pyi index cf25785..c2800e7 100644 --- a/ilpy/wrapper.pyi +++ b/ilpy/wrapper.pyi @@ -73,6 +73,7 @@ class LinearObjective(_Objective): ... class QuadraticObjective(_Objective): def set_quadratic_coefficient(self, i: int, j: int, value: float) -> None: ... + def get_quadratic_coefficients(self) -> dict[tuple[int, int], float]: ... class _Solver: def __init__( diff --git a/ilpy/wrapper.pyx b/ilpy/wrapper.pyx index f07eb79..4be83ea 100644 --- a/ilpy/wrapper.pyx +++ b/ilpy/wrapper.pyx @@ -92,6 +92,9 @@ cdef class QuadraticObjective: def set_quadratic_coefficient(self, i, j, value): self.p.setQuadraticCoefficient(i, j, value) + def get_quadratic_coefficients(self): + return self.p.getQuadraticCoefficients() + def set_sense(self, sense): self.p.setSense(sense) @@ -167,6 +170,9 @@ cdef class LinearConstraint: return self.p.getValue() def is_violated(self, Solution solution): + # avoid segfault in some cases of wrong type + if not isinstance(solution, Solution): + raise TypeError('solution must be of type Solution') return self.p.isViolated(solution.p[0]) cdef class LinearConstraints: