Skip to content

Commit c559c37

Browse files
committed
Some more fixes
1 parent afe83c3 commit c559c37

1 file changed

Lines changed: 45 additions & 33 deletions

File tree

src/pyscipopt/scip.pxi

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,16 +1042,20 @@ cdef class Solution:
10421042

10431043
# fast track for Variable
10441044
cdef SCIP_Real coeff
1045+
cdef _VarArray wrapper
10451046
if isinstance(expr, Variable):
1047+
wrapper = _VarArray(expr)
10461048
self._checkStage("SCIPgetSolVal")
1047-
return SCIPgetSolVal(self.scip, self.sol, _VarArray(expr).ptr[0])
1049+
return SCIPgetSolVal(self.scip, self.sol, wrapper.ptr[0])
10481050
return sum(self._evaluate(term)*coeff for term, coeff in expr.terms.items() if coeff != 0)
10491051

10501052
def _evaluate(self, term):
10511053
self._checkStage("SCIPgetSolVal")
10521054
result = 1
1053-
for var in term.vartuple:
1054-
result *= SCIPgetSolVal(self.scip, self.sol, _VarArray(var).ptr[0])
1055+
cdef _VarArray wrapper
1056+
wrapper = _VarArray(term.vartuple)
1057+
for i in range(len(term.vartuple)):
1058+
result *= SCIPgetSolVal(self.scip, self.sol, wrapper.ptr[i])
10551059
return result
10561060

10571061
def __setitem__(self, Variable var, value):
@@ -3445,6 +3449,7 @@ cdef class Model:
34453449
cdef int nvars
34463450
cdef SCIP_Real coef
34473451
cdef int i
3452+
cdef _VarArray wrapper
34483453

34493454
# turn the constant value into an Expr instance for further processing
34503455
if not isinstance(expr, Expr):
@@ -3469,7 +3474,8 @@ cdef class Model:
34693474
# avoid CONST term of Expr
34703475
if term != CONST:
34713476
assert len(term) == 1
3472-
PY_SCIP_CALL(SCIPchgVarObj(self._scip, _VarArray(term[0]).ptr[0], coef))
3477+
wrapper = _VarArray(term[0])
3478+
PY_SCIP_CALL(SCIPchgVarObj(self._scip, wrapper.ptr[0], coef))
34733479

34743480
if sense == "minimize":
34753481
self.setMinimize()
@@ -5206,6 +5212,7 @@ cdef class Model:
52065212

52075213
cdef SCIP_CONS* scip_cons
52085214
cdef SCIP_EXPR* prodexpr
5215+
cdef _VarArray wrapper
52095216
PY_SCIP_CALL(SCIPcreateConsQuadraticNonlinear(
52105217
self._scip, &scip_cons, str_conversion(kwargs['name']),
52115218
0, NULL, NULL, # linear
@@ -5217,13 +5224,16 @@ cdef class Model:
52175224

52185225
for v, c in terms.items():
52195226
if len(v) == 1: # linear
5220-
PY_SCIP_CALL(SCIPaddLinearVarNonlinear(self._scip, scip_cons, _VarArray(v[0]).ptr[0], c))
5227+
wrapper = _VarArray(v[0])
5228+
PY_SCIP_CALL(SCIPaddLinearVarNonlinear(self._scip, scip_cons, wrapper.ptr[0], c))
52215229
else: # nonlinear
52225230
assert len(v) == 2, 'term length must be 1 or 2 but it is %s' % len(v)
52235231

52245232
varexprs = <SCIP_EXPR**> malloc(2 * sizeof(SCIP_EXPR*))
5225-
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &varexprs[0], _VarArray(v[0]).ptr[0], NULL, NULL) )
5226-
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &varexprs[1], _VarArray(v[1]).ptr[0], NULL, NULL) )
5233+
wrapper = _VarArray(v[0])
5234+
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &varexprs[0], wrapper.ptr[0], NULL, NULL) )
5235+
wrapper = _VarArray(v[1])
5236+
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &varexprs[1], wrapper.ptr[0], NULL, NULL) )
52275237
PY_SCIP_CALL( SCIPcreateExprProduct(self._scip, &prodexpr, 2, varexprs, 1.0, NULL, NULL) )
52285238

52295239
PY_SCIP_CALL( SCIPaddExprNonlinear(self._scip, scip_cons, prodexpr, c) )
@@ -5351,19 +5361,15 @@ cdef class Model:
53515361
for node in nodes:
53525362
if node[0] == Operator.varidx:
53535363
nvars += 1
5354-
vars = <SCIP_VAR**> malloc(nvars * sizeof(SCIP_VAR*))
53555364

5356-
varpos = 0
53575365
scipexprs = <SCIP_EXPR**> malloc(len(nodes) * sizeof(SCIP_EXPR*))
53585366
for i,node in enumerate(nodes):
53595367
opidx = node[0]
53605368
if opidx == Operator.varidx:
53615369
assert len(node[1]) == 1
53625370
pyvar = node[1][0] # for vars we store the actual var!
53635371
wrapper = _VarArray(pyvar)
5364-
vars[varpos] = wrapper.ptr[0]
5365-
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &scipexprs[i], vars[varpos], NULL, NULL) )
5366-
varpos += 1
5372+
PY_SCIP_CALL( SCIPcreateExprVar(self._scip, &scipexprs[i], wrapper.ptr[0], NULL, NULL) )
53675373
continue
53685374
if opidx == Operator.const:
53695375
assert len(node[1]) == 1
@@ -5422,7 +5428,6 @@ cdef class Model:
54225428
continue
54235429
# default:
54245430
raise NotImplementedError
5425-
assert varpos == nvars
54265431

54275432
# create nonlinear constraint for the expression root
54285433
PY_SCIP_CALL( SCIPcreateConsNonlinear(
@@ -5447,7 +5452,6 @@ cdef class Model:
54475452

54485453
# free more memory
54495454
free(scipexprs)
5450-
free(vars)
54515455

54525456
return PyCons
54535457

@@ -6140,13 +6144,12 @@ cdef class Model:
61406144
if name == '':
61416145
name = 'c'+str(SCIPgetNConss(self._scip)+1)
61426146

6147+
wrapper = _VarArray(vars)
61436148
for i in range(nvars):
6144-
wrapper = _VarArray(vars[i])
6145-
vars_array[i] = wrapper.ptr[0]
61466149
weights_array[i] = <SCIP_Longint>weights[i]
61476150

61486151
PY_SCIP_CALL(SCIPcreateConsKnapsack(
6149-
self._scip, &scip_cons, str_conversion(name), nvars, vars_array, weights_array,
6152+
self._scip, &scip_cons, str_conversion(name), nvars, wrapper.ptr, weights_array,
61506153
capacity, initial, separate, enforce, check, propagate, local, modifiable,
61516154
dynamic, removable, stickingatnode))
61526155

@@ -6204,20 +6207,22 @@ cdef class Model:
62046207
cdef SCIP_CONS* scip_cons
62056208
cdef int nvars
62066209
cdef int i
6210+
cdef _VarArray wrapper
62076211

62086212
PY_SCIP_CALL(SCIPcreateConsSOS1(self._scip, &scip_cons, str_conversion(name), 0, NULL, NULL,
62096213
initial, separate, enforce, check, propagate, local, dynamic, removable, stickingatnode))
62106214

62116215
if name == '':
62126216
name = 'c'+str(SCIPgetNConss(self._scip)+1)
62136217

6218+
nvars = len(vars)
6219+
wrapper = _VarArray(vars)
62146220
if weights is None:
6215-
for v in vars:
6216-
PY_SCIP_CALL(SCIPappendVarSOS1(self._scip, scip_cons, _VarArray(v).ptr[0]))
6221+
for i in range(nvars):
6222+
PY_SCIP_CALL(SCIPappendVarSOS1(self._scip, scip_cons, wrapper.ptr[i]))
62176223
else:
6218-
nvars = len(vars)
62196224
for i in range(nvars):
6220-
PY_SCIP_CALL(SCIPaddVarSOS1(self._scip, scip_cons, _VarArray(vars[i]).ptr[0], weights[i]))
6225+
PY_SCIP_CALL(SCIPaddVarSOS1(self._scip, scip_cons, wrapper.ptr[i], weights[i]))
62216226

62226227
PY_SCIP_CALL(SCIPaddCons(self._scip, scip_cons))
62236228

@@ -6267,20 +6272,22 @@ cdef class Model:
62676272
cdef SCIP_CONS* scip_cons
62686273
cdef int nvars
62696274
cdef int i
6275+
cdef _VarArray wrapper
62706276

62716277
PY_SCIP_CALL(SCIPcreateConsSOS2(self._scip, &scip_cons, str_conversion(name), 0, NULL, NULL,
62726278
initial, separate, enforce, check, propagate, local, dynamic, removable, stickingatnode))
62736279

62746280
if name == '':
62756281
name = 'c'+str(SCIPgetNConss(self._scip)+1)
62766282

6283+
nvars = len(vars)
6284+
wrapper = _VarArray(vars)
62776285
if weights is None:
6278-
for v in vars:
6279-
PY_SCIP_CALL(SCIPappendVarSOS2(self._scip, scip_cons, _VarArray(v).ptr[0]))
6286+
for i in range(nvars):
6287+
PY_SCIP_CALL(SCIPappendVarSOS2(self._scip, scip_cons, wrapper.ptr[i]))
62806288
else:
6281-
nvars = len(vars)
62826289
for i in range(nvars):
6283-
PY_SCIP_CALL(SCIPaddVarSOS2(self._scip, scip_cons, _VarArray(vars[i]).ptr[0], weights[i]))
6290+
PY_SCIP_CALL(SCIPaddVarSOS2(self._scip, scip_cons, wrapper.ptr[i], weights[i]))
62846291

62856292
PY_SCIP_CALL(SCIPaddCons(self._scip, scip_cons))
62866293

@@ -6394,13 +6401,13 @@ cdef class Model:
63946401
cdef int nvars = len(vars)
63956402
cdef SCIP_VAR** _vars
63966403
cdef SCIP_VAR* _resvar
6404+
cdef _VarArray resvar_wrapper = _VarArray(resvar)
6405+
cdef _VarArray vars_wrapper = _VarArray(vars)
63976406
cdef SCIP_CONS* scip_cons
63986407
cdef int i
6399-
cdef _VarArray wrapper = _VarArray(vars)
6400-
cdef _VarArray resvar_wrapper = _VarArray(resvar)
64016408

64026409
_resvar = resvar_wrapper.ptr[0]
6403-
_vars = wrapper.ptr
6410+
_vars = vars_wrapper.ptr
64046411

64056412
if name == '':
64066413
name = 'c'+str(SCIPgetNConss(self._scip)+1)
@@ -6542,9 +6549,9 @@ cdef class Model:
65426549
if name == '':
65436550
name = 'c'+str(SCIPgetNConss(self._scip)+1)
65446551

6552+
v_wrapper = _VarArray(consvars)
65456553
for i, v in enumerate(consvars):
6546-
v_wrapper = _VarArray(v)
6547-
scip_var = v_wrapper.ptr[0]
6554+
scip_var = v_wrapper.ptr[i]
65486555
if indvars:
65496556
indvar_wrapper = _VarArray(indvars[i])
65506557
indvar = indvar_wrapper.ptr[0]
@@ -6646,7 +6653,8 @@ cdef class Model:
66466653
for key, coeff in terms.items():
66476654
if negate:
66486655
coeff = -coeff
6649-
PY_SCIP_CALL(SCIPaddVarIndicator(self._scip, scip_cons, _VarArray(key[0]).ptr[0], <SCIP_Real>coeff))
6656+
wrapper = _VarArray(key[0])
6657+
PY_SCIP_CALL(SCIPaddVarIndicator(self._scip, scip_cons, wrapper.ptr[0], <SCIP_Real>coeff))
66506658

66516659
PY_SCIP_CALL(SCIPaddCons(self._scip, scip_cons))
66526660
pyCons = Constraint.create(scip_cons)
@@ -9815,8 +9823,10 @@ cdef class Model:
98159823
98169824
"""
98179825
# no need to create a NULL solution wrapper in case we have a variable
9826+
cdef _VarArray wrapper
98189827
if sol == None and isinstance(expr, Variable):
9819-
return SCIPgetSolVal(self._scip, NULL, _VarArray(expr).ptr[0])
9828+
wrapper = _VarArray(expr)
9829+
return SCIPgetSolVal(self._scip, NULL, wrapper.ptr[0])
98209830
if sol == None:
98219831
sol = Solution.create(self._scip, NULL)
98229832
return sol[expr]
@@ -10617,6 +10627,7 @@ cdef class Model:
1061710627
cdef SCIP_OBJSENSE objsense
1061810628
cdef SCIP_Real coef
1061910629
cdef int i
10630+
cdef _VarArray wrapper
1062010631

1062110632
if sense == "minimize":
1062210633
objsense = SCIP_OBJSENSE_MINIMIZE
@@ -10644,7 +10655,8 @@ cdef class Model:
1064410655
if term != CONST:
1064510656
assert len(term) == 1
1064610657
for i in range(nvars):
10647-
if vars[i] == _VarArray(term[0]).ptr[0]:
10658+
wrapper = _VarArray(term[0])
10659+
if vars[i] == wrapper.ptr[0]:
1064810660
_coeffs[i] = coef
1064910661

1065010662
PY_SCIP_CALL(SCIPchgReoptObjective(self._scip, objsense, vars, &_coeffs[0], nvars))

0 commit comments

Comments
 (0)