PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
logical.py
Go to the documentation of this file.
1 
3 """
4 N.B.: standard SCIP XOR constraint works differently from AND/OR by design.
5 The constraint is set with a boolean rhs instead of an integer resultant.
6 cf. http://listserv.zib.de/pipermail/scip/2018-May/003392.html
7 A workaround to get the resultant as variable is here proposed.
8 
9 Public Domain, WTFNMFPL Public Licence
10 """
11 from pyscipopt import Model
12 from pyscipopt import quicksum
13 
14 def _init():
15  model = Model()
16  model.hideOutput()
17  x = model.addVar("x","B")
18  y = model.addVar("y","B")
19  z = model.addVar("z","B")
20  return model, x, y, z
21 
22 def _optimize(name, m):
23  m.optimize()
24  print("* %s constraint *" % name)
25  objSet = bool(m.getObjective().terms.keys())
26  print("* Is objective set? %s" % objSet)
27  if objSet:
28  print("* Sense: %s" % m.getObjectiveSense())
29  status = m.getStatus()
30  print("* Model status: %s" % status)
31  if status == 'optimal':
32  for v in m.getVars():
33  if v.name != "n":
34  print("%s: %d" % (v, round(m.getVal(v))))
35  else:
36  print("* No variable is printed if model status is not optimal")
37  print("")
38 
39 def and_constraint(v=1, sense="minimize"):
40  """ AND constraint """
41  assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__()
42  model, x, y, z = _init()
43  r = model.addVar("r", "B")
44  model.addConsAnd([x,y,z], r)
45  model.addCons(x==v)
46  model.setObjective(r, sense=sense)
47  _optimize("AND", model)
48 
49 
50 def or_constraint(v=0, sense="maximize"):
51  """ OR constraint"""
52  assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__()
53  model, x, y, z = _init()
54  r = model.addVar("r", "B")
55  model.addConsOr([x,y,z], r)
56  model.addCons(x==v)
57  model.setObjective(r, sense=sense)
58  _optimize("OR", model)
59 
60 def xors_constraint(v=1):
61  """ XOR (r as boolean) standard constraint"""
62  assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__()
63  model, x, y, z = _init()
64  r = True
65  model.addConsXor([x,y,z], r)
66  model.addCons(x==v)
67  _optimize("Standard XOR (as boolean)", model)
68 
69 def xorc_constraint(v=0, sense="maximize"):
70  """ XOR (r as variable) custom constraint"""
71  assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__()
72  model, x, y, z = _init()
73  r = model.addVar("r", "B")
74  n = model.addVar("n", "I") # auxiliary
75  model.addCons(r+quicksum([x,y,z]) == 2*n)
76  model.addCons(x==v)
77  model.setObjective(r, sense=sense)
78  _optimize("Custom XOR (as variable)", model)
79 
80 if __name__ == "__main__":
85 
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
logical.xors_constraint
def xors_constraint(v=1)
Definition: logical.py:60
logical.xorc_constraint
def xorc_constraint(v=0, sense="maximize")
Definition: logical.py:69
logical.or_constraint
def or_constraint(v=0, sense="maximize")
Definition: logical.py:50
logical.and_constraint
def and_constraint(v=1, sense="minimize")
Definition: logical.py:39