Skip to content

Commit 099c15b

Browse files
mantepseMatthias Koeppe
authored andcommitted
src/sage/numerical/backends/scip_backend.pyx: Cache constraints to avoid expensive calls to getConss
1 parent 2040546 commit 099c15b

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

src/sage/numerical/backends/scip_backend.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ cdef class SCIPBackend(GenericBackend):
1414

1515
cdef model
1616
cdef object variables
17+
cdef object constraints
1718

1819
cpdef _get_model(self)
1920
cpdef get_row_prim(self, int i)

src/sage/numerical/backends/scip_backend.pyx

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ cdef class SCIPBackend(GenericBackend):
6060
self.obj_constant_term = 0.0
6161
self.variables = []
6262
self.model.hideOutput()
63+
# always set this to None if the list of constraints may change
64+
self.constraints = None
65+
66+
def get_constraints(self):
67+
"""
68+
Get all constraints of the problem.
69+
"""
70+
if self.constraints is None:
71+
self.constraints = self.model.getConss()
72+
return self.constraints
6373

6474
cpdef _get_model(self):
6575
"""
@@ -360,7 +370,9 @@ cdef class SCIPBackend(GenericBackend):
360370
raise ValueError("The constraint's index i must satisfy 0 <= i < number_of_constraints")
361371
if self.model.getStatus() != 'unknown':
362372
self.model.freeTransform()
363-
self.model.delCons(self.model.getConss()[i])
373+
self.constraints = None
374+
self.model.delCons(self.get_constraints()[i])
375+
self.constraints = None
364376

365377
cpdef add_linear_constraint(self, coefficients, lower_bound, upper_bound, name=None):
366378
"""
@@ -408,6 +420,7 @@ cdef class SCIPBackend(GenericBackend):
408420

409421
cons = lower_bound <= (linfun <= upper_bound)
410422
self.model.addCons(cons, name=name)
423+
self.constraints = None
411424

412425
cpdef row(self, int index):
413426
r"""
@@ -438,7 +451,7 @@ cdef class SCIPBackend(GenericBackend):
438451
(2.0, 2.0)
439452
"""
440453
namedvars = [var.name for var in self.variables]
441-
valslinear = self.model.getValsLinear(self.model.getConss()[index])
454+
valslinear = self.model.getValsLinear(self.get_constraints()[index])
442455
cdef list indices = []
443456
cdef list values = []
444457
for var, coeff in valslinear.iteritems():
@@ -470,7 +483,7 @@ cdef class SCIPBackend(GenericBackend):
470483
sage: p.row_bounds(0)
471484
(2.0, 2.0)
472485
"""
473-
cons = self.model.getConss()[index]
486+
cons = self.get_constraints()[index]
474487
lhs = self.model.getLhs(cons)
475488
rhs = self.model.getRhs(cons)
476489
if lhs == -self.model.infinity():
@@ -548,7 +561,8 @@ cdef class SCIPBackend(GenericBackend):
548561
sage: p.nrows()
549562
5
550563
"""
551-
mcons = self.model.getConss()
564+
mcons = self.get_constraints()
565+
self.constraints = None # is this necessary?
552566
# after update of
553567
index = self.add_variable(lower_bound=-self.model.infinity())
554568
var = self.variables[index]
@@ -770,7 +784,7 @@ cdef class SCIPBackend(GenericBackend):
770784
sage: lp.get_row_prim(2)
771785
8.0
772786
"""
773-
return self.model.getActivity(self.model.getConss()[i])
787+
return self.model.getActivity(self.get_constraints()[i])
774788

775789
cpdef int ncols(self):
776790
"""
@@ -803,7 +817,7 @@ cdef class SCIPBackend(GenericBackend):
803817
sage: p.nrows()
804818
2
805819
"""
806-
return len(self.model.getConss())
820+
return len(self.get_constraints())
807821

808822
cpdef col_name(self, int index):
809823
"""
@@ -840,7 +854,7 @@ cdef class SCIPBackend(GenericBackend):
840854
sage: p.row_name(0)
841855
'Empty constraint 1'
842856
"""
843-
return self.model.getConss()[index].name
857+
return self.get_constraints()[index].name
844858

845859
cpdef bint is_variable_binary(self, int index):
846860
"""
@@ -1159,10 +1173,13 @@ cdef class SCIPBackend(GenericBackend):
11591173
assert self.ncols() == cp.ncols()
11601174

11611175
for i in range(self.nrows()):
1162-
cp.add_linear_constraint(zip(*self.row(i)),
1163-
self.row_bounds(i)[0],
1164-
self.row_bounds(i)[1],
1165-
name=self.row_name(i))
1176+
coefficients = zip(*self.row(i))
1177+
lower_bound, upper_bound = self.row_bounds(i)
1178+
name = self.row_name(i)
1179+
cp.add_linear_constraint(coefficients,
1180+
lower_bound,
1181+
upper_bound,
1182+
name=name)
11661183
assert self.nrows() == cp.nrows()
11671184
return cp
11681185

0 commit comments

Comments
 (0)