@@ -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