Skip to content

Commit b4e9065

Browse files
committed
Call wrapper class in a few more places
1 parent 928f2e5 commit b4e9065

2 files changed

Lines changed: 23 additions & 22 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Added support for knapsack constraints
66
- Added isPositive(), isNegative(), isFeasLE(), isFeasLT(), isFeasGE(), isFeasGT(), isHugeValue(), and tests
77
- Added SCIP_LOCKTYPE, addVarLocksType(), getNLocksDown(), getNLocksUp(), getNLocksDownType(), getNLocksUpType(), and tests
8+
- Added internal class _VarArrayWrapper to get the scip variables from PySCIPOpt variables
89
### Fixed
910
- Fixed segmentation fault when logical constraints were used with expressions rather than variables.
1011
### Changed

src/pyscipopt/scip.pxi

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,19 +2397,25 @@ cdef void relayErrorMessage(void *messagehdlr, FILE *file, const char *msg) noex
23972397
fputs(msg, file)
23982398
fflush(file)
23992399

2400-
cdef class VarArrayWrapper:
2400+
cdef class _VarArrayWrapper:
24012401
cdef SCIP_VAR** ptr
24022402
cdef int size
24032403

24042404
def __cinit__(self, object vars):
24052405
cdef int size = len(vars)
24062406
self.ptr = <SCIP_VAR**> malloc(size * sizeof(SCIP_VAR*))
24072407

2408-
for i, var in enumerate(vars):
2409-
if not isinstance(var, Variable):
2410-
raise TypeError("Expected Variable, got %s." % type(var))
2408+
if size == 1:
2409+
if not isinstance(vars, Variable):
2410+
raise TypeError("Expected Variable, got %s." % type(vars))
2411+
else:
2412+
self.ptr[0] = (<Variable>vars).scip_var
2413+
else:
2414+
for i, var in enumerate(vars):
2415+
if not isinstance(var, Variable):
2416+
raise TypeError("Expected Variable, got %s." % type(var))
24112417

2412-
self.ptr[i] = (<Variable>var).scip_var
2418+
self.ptr[i] = (<Variable>var).scip_var
24132419

24142420
def __dealloc__(self):
24152421
if self.ptr != NULL:
@@ -6345,17 +6351,6 @@ cdef class Model:
63456351

63466352
return pyCons
63476353

6348-
def _convert_var_to_scipvar(self, vars, nvars):
6349-
cdef VarArrayWrapper wrapper = VarArrayWrapper(nvars)
6350-
6351-
for i, var in enumerate(vars):
6352-
if not isinstance(var, Variable):
6353-
raise TypeError("Expected Variable, got %s." % type(var))
6354-
6355-
wrapper.ptr[i] = (<Variable>var).scip_var
6356-
6357-
return wrapper
6358-
63596354
def addConsOr(self, vars, resvar, name="",
63606355
initial=True, separate=True, enforce=True, check=True,
63616356
propagate=True, local=False, modifiable=False, dynamic=False,
@@ -6398,13 +6393,17 @@ cdef class Model:
63986393
63996394
"""
64006395
cdef int nvars = len(vars)
6396+
cdef SCIP_VAR** _vars
64016397
cdef SCIP_VAR* _resvar
64026398
cdef SCIP_CONS* scip_cons
64036399
cdef int i
6400+
cdef _VarArrayWrapper wrapper
64046401

6405-
_resvar = (<Variable>resvar).scip_var
6406-
cdef VarArrayWrapper wrapper = VarArrayWrapper(vars)
6407-
cdef SCIP_VAR** _vars = wrapper.ptr
6402+
wrapper = _VarArrayWrapper(resvar)
6403+
_resvar = wrapper.ptr
6404+
6405+
wrapper = _VarArrayWrapper(vars)
6406+
_vars = wrapper.ptr
64086407

64096408
if name == '':
64106409
name = 'c'+str(SCIPgetNConss(self._scip)+1)
@@ -8271,9 +8270,10 @@ cdef class Model:
82718270
cdef SCIP_HEUR* _heur
82728271
cdef SCIP_Bool success
82738272
cdef int i
8274-
8275-
for i, var in enumerate(sub_model.getVars()):
8276-
vars[i] = (<Variable>var).scip_var
8273+
cdef _VarArrayWrapper wrapper
8274+
8275+
wrapper = _VarArrayWrapper(sub_model.getVars())
8276+
vars = wrapper.ptr
82778277

82788278
name = str_conversion(heur.name)
82798279
_heur = SCIPfindHeur(self._scip, name)

0 commit comments

Comments
 (0)