diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index fa33be017..ea05b13dd 100644 --- a/src/pyscipopt/scip.pxi +++ b/src/pyscipopt/scip.pxi @@ -6946,7 +6946,7 @@ cdef class Model: return pyCons - def addMatrixConsIndicator(self, cons: MatrixExprCons, binvar: Union[Variable, MatrixVariable] = None, + def addMatrixConsIndicator(self, cons: Union[ExprCons, MatrixExprCons], binvar: Union[Variable, MatrixVariable] = None, activeone: Union[bool, np.ndarray] = True, name: Union[str, np.ndarray] = "", initial: Union[bool, np.ndarray] = True, separate: Union[bool, np.ndarray] = True, enforce: Union[bool, np.ndarray] = True, check: Union[bool, np.ndarray] = True, @@ -6960,7 +6960,7 @@ cdef class Model: Parameters ---------- - cons : MatrixExprCons + cons : ExprCons or MatrixExprCons a linear inequality of the form "<=". binvar : Variable or MatrixVariable, optional binary indicator variable / matrix variable, or None if it should be created. (Default value = None) @@ -6994,9 +6994,14 @@ cdef class Model: The newly created Indicator MatrixConstraint object. """ - assert isinstance(cons, MatrixExprCons), ( - f"given constraint is not MatrixExprCons but {cons.__class__.__name__}" - ) + if not isinstance(cons, (ExprCons, MatrixExprCons)): + raise TypeError("given constraint is not MatrixExprCons nor ExprCons but %s" % cons.__class__.__name__) + + if isinstance(cons, ExprCons): + return self.addConsIndicator(cons, binvar=binvar, activeone=activeone, name=name, + initial=initial, separate=separate, enforce=enforce, check=check, + propagate=propagate, local=local, dynamic=dynamic, removable=removable, + stickingatnode=stickingatnode) shape = cons.shape diff --git a/tests/test_matrix_variable.py b/tests/test_matrix_variable.py index 0308bb694..d9b262737 100644 --- a/tests/test_matrix_variable.py +++ b/tests/test_matrix_variable.py @@ -375,6 +375,11 @@ def test_matrix_cons_indicator(): with pytest.raises(Exception): m.addMatrixConsIndicator(x >= y, is_equal) + # require MatrixExprCons or ExprCons + with pytest.raises(TypeError): + m.addMatrixConsIndicator(x) + + # test MatrixExprCons for i in range(2): m.addMatrixConsIndicator(x[i] >= y[i], is_equal[0, i]) m.addMatrixConsIndicator(x[i] <= y[i], is_equal[0, i]) @@ -386,9 +391,16 @@ def test_matrix_cons_indicator(): m.addMatrixConsIndicator(x[:, i] >= y[:, i], is_equal[0]) m.addMatrixConsIndicator(x[:, i] <= y[:, i], is_equal[0]) - m.setObjective(is_equal.sum(), "maximize") + # test ExprCons + z = m.addVar(vtype="B") + binvar = m.addVar(vtype="B") + m.addMatrixConsIndicator(z >= 1, binvar, activeone=True) + m.addMatrixConsIndicator(z <= 0, binvar, activeone=False) + + m.setObjective(is_equal.sum() + binvar, "maximize") m.optimize() assert m.getVal(is_equal).sum() == 2 assert (m.getVal(x) == m.getVal(y)).all().all() assert (m.getVal(x) == np.array([[5, 5, 5], [5, 5, 5]])).all().all() + assert m.getVal(z) == 1