@@ -42,7 +42,6 @@ class MyConshdlr(Conshdlr):
4242 def __init__ (self , shouldtrans , shouldcopy ):
4343 self .shouldtrans = shouldtrans
4444 self .shouldcopy = shouldcopy
45- self .first_time = True
4645
4746 def createData (self , constraint , nvars , othername ):
4847 print ("Creating data for my constraint: %s" % constraint .name )
@@ -69,34 +68,29 @@ def conslock(self, constraint, locktype, nlockspos, nlocksneg):
6968 calls .add ("conslock" )
7069 assert id (constraint ) in ids
7170
72- if self .first_time :
73- self .first_time = False
71+ try :
7472 var = self .model .getVars ()[0 ]
75- n_locks_up = var .getNLocksUp ()
76- n_locks_down = var .getNLocksDown ()
77- n_locks_up_model = var .getNLocksUpType (SCIP_LOCKTYPE .MODEL )
78- n_locks_up_conflict = var .getNLocksUpType (SCIP_LOCKTYPE .CONFLICT )
79- n_locks_down_model = var .getNLocksDownType (SCIP_LOCKTYPE .MODEL )
80- n_locks_down_conflict = var .getNLocksDownType (SCIP_LOCKTYPE .CONFLICT )
81- assert n_locks_down == 2
82- assert n_locks_up == 2
83- assert n_locks_up_model == 2
84- assert n_locks_up_conflict == 0
85- assert n_locks_down_model == 2
86- assert n_locks_down_conflict == 0
87-
88- self .model .addVarLocksType (var , SCIP_LOCKTYPE .CONFLICT , nlockspos , nlocksneg )
73+ except ReferenceError :
74+ return
75+
76+ n_locks_up = var .getNLocksUp ()
77+ n_locks_down = var .getNLocksDown ()
78+ n_locks_up_model = var .getNLocksUpType (SCIP_LOCKTYPE .MODEL )
79+ n_locks_up_conflict = var .getNLocksUpType (SCIP_LOCKTYPE .CONFLICT )
80+ n_locks_down_model = var .getNLocksDownType (SCIP_LOCKTYPE .MODEL )
81+ n_locks_down_conflict = var .getNLocksDownType (SCIP_LOCKTYPE .CONFLICT )
82+
83+ self .model .addVarLocksType (var , locktype , nlockspos , nlocksneg )
84+ if locktype == SCIP_LOCKTYPE .CONFLICT :
8985 assert var .getNLocksUpType (SCIP_LOCKTYPE .CONFLICT ) != n_locks_up_conflict or var .getNLocksDownType (SCIP_LOCKTYPE .CONFLICT ) != n_locks_down_conflict
90- assert var .getNLocksUpType (SCIP_LOCKTYPE .MODEL ) == n_locks_up_conflict and var .getNLocksDownType (SCIP_LOCKTYPE .MODEL ) == n_locks_down_conflict
86+ assert var .getNLocksUpType (SCIP_LOCKTYPE .MODEL ) == n_locks_up_model and var .getNLocksDownType (SCIP_LOCKTYPE .MODEL ) == n_locks_down_model
87+ elif locktype == SCIP_LOCKTYPE .MODEL :
88+ assert var .getNLocksUpType (SCIP_LOCKTYPE .CONFLICT ) == n_locks_up_conflict and var .getNLocksDownType (SCIP_LOCKTYPE .CONFLICT ) == n_locks_down_conflict
89+ assert var .getNLocksUpType (SCIP_LOCKTYPE .MODEL ) != n_locks_up_model or var .getNLocksDownType (SCIP_LOCKTYPE .MODEL ) != n_locks_down_model
90+ else :
91+ raise ValueError ("Unknown locktype" )
9192
92- if locktype == SCIP_LOCKTYPE .MODEL :
93- self .model .addVarLocks (var , nlockspos , nlocksneg )
94- assert var .getNLocksUpType (SCIP_LOCKTYPE .MODEL ) != n_locks_up_model or var .getNLocksDownType (SCIP_LOCKTYPE .MODEL ) != n_locks_down_model
95- elif locktype == SCIP_LOCKTYPE .CONFLICT :
96- self .model .addVarLocks (var , nlockspos , nlocksneg )
97- assert var .getNLocksUpType (SCIP_LOCKTYPE .CONFLICT ) != n_locks_up_conflict or var .getNLocksDownType (SCIP_LOCKTYPE .CONFLICT ) != n_locks_down_conflict
98-
99- assert var .getNLocksDown () != n_locks_down or var .getNLocksUp () != n_locks_up
93+ assert var .getNLocksDown () != n_locks_down or var .getNLocksUp () != n_locks_up
10094
10195 ## callbacks ##
10296 def consfree (self ):
@@ -217,43 +211,43 @@ def consgetnvars(self, constraint):
217211def test_conshdlr ():
218212 def create_model ():
219213 # create solver instance
220- s = Model ()
214+ model = Model ()
221215
222216 # add some variables
223- x = s .addVar ("x" , obj = - 1.0 , vtype = "I" , lb = - 10 )
224- y = s .addVar ("y" , obj = 1.0 , vtype = "I" , lb = - 1000 )
225- z = s .addVar ("z" , obj = 1.0 , vtype = "I" , lb = - 1000 )
217+ x = model .addVar ("x" , obj = - 1.0 , vtype = "I" , lb = - 10 )
218+ y = model .addVar ("y" , obj = 1.0 , vtype = "I" , lb = - 1000 )
219+ z = model .addVar ("z" , obj = 1.0 , vtype = "I" , lb = - 1000 )
226220
227221 # add some constraint
228- s .addCons (314 * x + 867 * y + 860 * z == 363 )
229- s .addCons (87 * x + 875 * y - 695 * z == 423 )
222+ model .addCons (314 * x + 867 * y + 860 * z == 363 )
223+ model .addCons (87 * x + 875 * y - 695 * z == 423 )
230224
231225 # create conshdlr and include it to SCIP
232226 conshdlr = MyConshdlr (shouldtrans = True , shouldcopy = False )
233- s .includeConshdlr (conshdlr , "PyCons" , "custom constraint handler implemented in python" ,
227+ model .includeConshdlr (conshdlr , "PyCons" , "custom constraint handler implemented in python" ,
234228 sepapriority = 1 , enfopriority = 1 , chckpriority = 1 , sepafreq = 10 , propfreq = 50 ,
235229 eagerfreq = 1 , maxprerounds = - 1 , delaysepa = False , delayprop = False , needscons = True ,
236230 presoltiming = SCIP_PRESOLTIMING .FAST , proptiming = SCIP_PROPTIMING .BEFORELP )
237231
238- cons1 = s .createCons (conshdlr , "cons1name" )
232+ cons1 = model .createCons (conshdlr , "cons1name" )
239233 ids .append (id (cons1 ))
240- cons2 = s .createCons (conshdlr , "cons2name" )
234+ cons2 = model .createCons (conshdlr , "cons2name" )
241235 ids .append (id (cons2 ))
242236 conshdlr .createData (cons1 , 10 , "cons1_anothername" )
243237 conshdlr .createData (cons2 , 12 , "cons2_anothername" )
244238
245239 # add these constraints
246- s .addPyCons (cons1 )
247- s .addPyCons (cons2 )
248- return s
240+ model .addPyCons (cons1 )
241+ model .addPyCons (cons2 )
242+ return model
249243
250- s = create_model ()
244+ model = create_model ()
251245
252246 # solve problem
253- s .optimize ()
247+ model .optimize ()
254248
255249 # so that consfree gets called
256- del s
250+ del model
257251
258252 # check callbacks got called
259253 assert "consenfolp" in calls
@@ -279,4 +273,6 @@ def create_model():
279273 assert "consdisable" in calls
280274 #assert "consdelvars" in calls
281275 #assert "consprint" in calls
282- assert "consgetnvars" in calls
276+ assert "consgetnvars" in calls
277+
278+ test_conshdlr ()
0 commit comments