From c308eb2f0f7f4fbe5c79cec366819662b0f9c99f Mon Sep 17 00:00:00 2001 From: Joao-Dionisio Date: Sat, 30 Nov 2024 09:20:36 +0100 Subject: [PATCH 1/3] Better default name for indicator cons --- CHANGELOG.md | 1 + src/pyscipopt/scip.pxi | 7 +++++-- tests/test_cons.py | 21 +++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21c638d26..1e0ac8c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Added stage checks to presolve, freereoptsolve, freetransform - Added primal_dual_evolution recipe and a plot recipe ### Fixed +- Fixed default name for indicator constraints ### Changed ### Removed diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index e5bea801f..3f8a0d63e 100644 --- a/src/pyscipopt/scip.pxi +++ b/src/pyscipopt/scip.pxi @@ -5330,7 +5330,7 @@ cdef class Model: return pyCons - def addConsIndicator(self, cons, binvar=None, activeone=True, name="IndicatorCons", + def addConsIndicator(self, cons, binvar=None, activeone=True, name="", initial=True, separate=True, enforce=True, check=True, propagate=True, local=False, dynamic=False, removable=False, stickingatnode=False): @@ -5348,7 +5348,7 @@ cdef class Model: activeone : bool, optional constraint should active if binvar is 1 (0 if activeone = False) name : str, optional - name of the constraint (Default value = "IndicatorCons") + name of the constraint (Default value = "") initial : bool, optional should the LP relaxation of constraint be in the initial LP? (Default value = True) separate : bool, optional @@ -5381,6 +5381,9 @@ cdef class Model: if cons._lhs is not None and cons._rhs is not None: raise ValueError("expected inequality that has either only a left or right hand side") + if name == '': + name = 'c'+str(SCIPgetNConss(self._scip)+1) + if cons.expr.degree() > 1: raise ValueError("expected linear inequality, expression has degree %d" % cons.expr.degree()) diff --git a/tests/test_cons.py b/tests/test_cons.py index 8b11250ae..cccd28adc 100644 --- a/tests/test_cons.py +++ b/tests/test_cons.py @@ -101,20 +101,33 @@ def test_SOScons(): def test_cons_indicator(): m = Model() - x = m.addVar(lb=0) + x = m.addVar(lb=0, obj=1) binvar = m.addVar(vtype="B", lb=1) - c = m.addConsIndicator(x >= 1, binvar) + c1 = m.addConsIndicator(x >= 1, binvar) - slack = m.getSlackVarIndicator(c) + assert c1.name == "c1" + + c2 = m.addCons(x <= 3) + + c3 = m.addConsIndicator(x >= 0, binvar) + assert c3.name == "c4" + + # because addConsIndicator actually adds two constraints + assert m.getNConss() == 5 + + slack = m.getSlackVarIndicator(c1) m.optimize() + assert m.getNConss() == 5 assert m.isEQ(m.getVal(slack), 0) assert m.isEQ(m.getVal(binvar), 1) assert m.isEQ(m.getVal(x), 1) - assert c.getConshdlrName() == "indicator" + assert c1.getConshdlrName() == "indicator" + +test_cons_indicator() @pytest.mark.xfail( reason="addConsIndicator doesn't behave as expected when binary variable is False. See Issue #717." From 674fcb06b86758c05ece97c6915b7bd5d4fa110d Mon Sep 17 00:00:00 2001 From: Joao-Dionisio Date: Mon, 2 Dec 2024 10:34:47 +0100 Subject: [PATCH 2/3] Remove forgotten function call --- tests/test_cons.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_cons.py b/tests/test_cons.py index cccd28adc..51077d86b 100644 --- a/tests/test_cons.py +++ b/tests/test_cons.py @@ -126,9 +126,6 @@ def test_cons_indicator(): assert m.isEQ(m.getVal(x), 1) assert c1.getConshdlrName() == "indicator" - -test_cons_indicator() - @pytest.mark.xfail( reason="addConsIndicator doesn't behave as expected when binary variable is False. See Issue #717." ) From 6cc9cccb6680ca1c1b2dbbe5a310ea7ca7679b87 Mon Sep 17 00:00:00 2001 From: Joao-Dionisio Date: Tue, 3 Dec 2024 12:09:00 +0100 Subject: [PATCH 3/3] Changed test --- CHANGELOG.md | 1 + tests/test_cons.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a4866b00..36feae611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Added stage checks to presolve, freereoptsolve, freetransform - Added primal_dual_evolution recipe and a plot recipe ### Fixed +- Added default names to indicator constraints ### Changed - GitHub actions using Mac now use precompiled SCIP from latest release ### Removed diff --git a/tests/test_cons.py b/tests/test_cons.py index 51077d86b..42801bd93 100644 --- a/tests/test_cons.py +++ b/tests/test_cons.py @@ -120,7 +120,7 @@ def test_cons_indicator(): m.optimize() - assert m.getNConss() == 5 + assert m.getNConss(transformed=False) == 5 assert m.isEQ(m.getVal(slack), 0) assert m.isEQ(m.getVal(binvar), 1) assert m.isEQ(m.getVal(x), 1)