Skip to content

Commit 0b9adcb

Browse files
committed
Add untested changes to fix test and assert
1 parent 0d78d09 commit 0b9adcb

File tree

2 files changed

+23
-42
lines changed

2 files changed

+23
-42
lines changed

src/pyscipopt/scip.pxi

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,7 @@ cdef class Model:
13131313
:param objlimit: limit on the objective function
13141314
13151315
"""
1316-
PY_SCIP_CALL(SCIPsetObjlimit(self._scip, objlimit))
1316+
PY_SCIP_CALL(SCIPlimit(self._scip, objlimit))
13171317

13181318
def getObjlimit(self):
13191319
"""returns current limit on objective function."""
@@ -1322,7 +1322,7 @@ cdef class Model:
13221322
def setObjective(self, coeffs, sense = 'minimize', clear = 'true'):
13231323
"""Establish the objective function as a linear expression.
13241324
1325-
:param coeffs: the coefficients
1325+
:param coeffs: the objective function SCIP Expr, or constant value
13261326
:param sense: the objective sense (Default value = 'minimize')
13271327
:param clear: set all other variables objective coefficient to zero (Default value = 'true')
13281328
@@ -1332,9 +1332,10 @@ cdef class Model:
13321332

13331333
# turn the constant value into an Expr instance for further processing
13341334
if not isinstance(coeffs, Expr):
1335+
if not isinstance(coeffs, GenExpr) and not issubclass(type(coeffs), GenExpr):
1336+
assert(_is_number(coeffs)), "given coefficients are neither Expr / GenExpr or number but %s" % coeffs.__class__.__name__
13351337
coeffs = Expr() + coeffs
13361338

1337-
cdef int i
13381339
if clear:
13391340
# clear existing objective function
13401341
self.addObjoffset(-self.getObjoffset())
@@ -1345,7 +1346,7 @@ cdef class Model:
13451346
PY_SCIP_CALL(SCIPchgVarObj(self._scip, _vars[i], 0.0))
13461347

13471348
if coeffs.degree() > 1:
1348-
new_obj = self.addVar(lb=-float("inf"),obj=1)
1349+
new_obj = self.addVar(lb=-SCIPinfinity,obj=1)
13491350
if sense == "minimize":
13501351
self.addCons(coeffs <= new_obj)
13511352
self.setMinimize()

tests/test_nonlinear.py

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -288,48 +288,28 @@ def test_quad_coeffs():
288288
assert linterms[0][1] == 4
289289

290290
def test_nonlinear_objective():
291-
m = Model()
291+
scip = Model()
292292

293-
x = {}
294-
for i in range(random.randint(1,20)):
295-
x[i] = m.addVar(lb = -float("inf"))
293+
v = scip.addVar()
294+
w = scip.addVar()
295+
x = scip.addVar()
296+
y = scip.addVar()
297+
z = scip.addVar()
296298

297299
obj = 0
298-
for var in x:
299-
rand = random.random()
300-
if rand <= 0.2:
301-
obj += 20*random.random()*var
302-
elif rand <= 0.4:
303-
obj += exp(random.random()*var)
304-
elif rand <= 0.6:
305-
obj += log(max(random.random()*var,0.1))
306-
elif rand <= 0.8:
307-
obj += sqrt(random.random()*var)
308-
else:
309-
obj += sin(random.random()*var)
310-
311-
if random.random() <= 0.5:
312-
sense = "minimize"
313-
else:
314-
sense = "maximize"
315-
316-
m.setObjective(obj, sense=sense)
317-
m.optimize()
318-
assert m.getNSols() > 0
319-
result_1 = m.getObjVal()
300+
obj += exp(v)
301+
obj += log(w)
302+
obj += sqrt(x)
303+
obj += sin(y)
304+
obj += z**3 * y
320305

321-
m = Model()
322-
aux = m.addVar(lb=-float("inf"), obj = 1)
323-
if sense == "minimize":
324-
m.addCons(obj <= aux)
325-
m.setMinimize()
326-
else:
327-
m.addCons(obj >= aux)
328-
m.setMaximize()
329-
m.optimize()
330-
assert m.getNSols() > 0
331-
result_2 = m.getObjVal()
306+
scip.addCons(v + w + x + y + z <= 1)
307+
308+
scip.setObjective(obj, sense='maximize')
309+
310+
obj_expr = scip.getObjective()
332311

333-
assert result_1 == result_2
312+
assert len(obj_expr) == 1
313+
assert obj_expr.degree == 1
334314

335315

0 commit comments

Comments
 (0)