From 1a0347d2310e8d6fce86af6247832ddb86998a77 Mon Sep 17 00:00:00 2001 From: 40% Date: Sun, 3 Aug 2025 09:29:14 +0800 Subject: [PATCH 1/4] to support ExprCons --- src/pyscipopt/scip.pxi | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index fa33be017..647566903 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: Unino[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 From 43d54a8f3f02f38aa1e0a46c6c6c2fa07aed23b2 Mon Sep 17 00:00:00 2001 From: 40% Date: Sun, 3 Aug 2025 09:45:54 +0800 Subject: [PATCH 2/4] Add tests for MatrixConsIndicator input types Expanded test_matrix_cons_indicator to check TypeError for invalid input types and added tests for MatrixExprCons and ExprCons cases. Also updated objective and assertions to include new binary variable. --- tests/test_matrix_variable.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 From 5680e38201ad620294495d20f7d23f6508e2e780 Mon Sep 17 00:00:00 2001 From: 40% Date: Sun, 3 Aug 2025 09:48:19 +0800 Subject: [PATCH 3/4] Fix typo in type annotation for addMatrixConsIndicator --- src/pyscipopt/scip.pxi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index 647566903..1d14f0568 100644 --- a/src/pyscipopt/scip.pxi +++ b/src/pyscipopt/scip.pxi @@ -6946,7 +6946,7 @@ cdef class Model: return pyCons - def addMatrixConsIndicator(self, cons: Unino[MatrixExprCons], binvar: Union[Variable, MatrixVariable] = None, + def addMatrixConsIndicator(self, cons: Union[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, From 95ae48e1f3afce691ef6bc4660444cba016a3e24 Mon Sep 17 00:00:00 2001 From: 40% Date: Sun, 3 Aug 2025 09:48:50 +0800 Subject: [PATCH 4/4] Expand addMatrixConsIndicator to support ExprCons --- src/pyscipopt/scip.pxi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index 1d14f0568..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: Union[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,