PySCIPOpt
Python Interface to the SCIP Optimization Suite
benders.pxi
Go to the documentation of this file.
1 ##@file benders.pxi
2 #@brief Base class of the Benders decomposition Plugin
3 cdef class Benders:
4  cdef public Model model
5  cdef public str name
6 
7  def bendersfree(self):
8  '''calls destructor and frees memory of Benders decomposition '''
9  pass
10 
11  def bendersinit(self):
12  '''initializes Benders deconposition'''
13  pass
14 
15  def bendersexit(self):
16  '''calls exit method of Benders decomposition'''
17  pass
18 
19  def bendersinitpre(self):
20  '''informs the Benders decomposition that the presolving process is being started '''
21  pass
22 
23  def bendersexitpre(self):
24  '''informs the Benders decomposition that the presolving process has been completed'''
25  pass
26 
27  def bendersinitsol(self):
28  '''informs Benders decomposition that the branch and bound process is being started '''
29  pass
30 
31  def bendersexitsol(self):
32  '''informs Benders decomposition that the branch and bound process data is being freed'''
33  pass
34 
35  def benderscreatesub(self, probnumber):
36  '''creates the subproblems and registers it with the Benders decomposition struct '''
37  print("python error in benderscreatesub: this method needs to be implemented")
38  return {}
39 
40  def benderspresubsolve(self, solution, enfotype, checkint):
41  '''sets the pre subproblem solve callback of Benders decomposition '''
42  return {}
43 
44  def benderssolvesubconvex(self, solution, probnumber, onlyconvex):
45  '''sets convex solve callback of Benders decomposition'''
46  return {}
47 
48  def benderssolvesub(self, solution, probnumber):
49  '''sets solve callback of Benders decomposition '''
50  return {}
51 
52  def benderspostsolve(self, solution, enfotype, mergecandidates, npriomergecands, checkint, infeasible):
53  '''sets post-solve callback of Benders decomposition '''
54  return {}
55 
56  def bendersfreesub(self, probnumber):
57  '''frees the subproblems'''
58  pass
59 
60  def bendersgetvar(self, variable, probnumber):
61  '''Returns the corresponding master or subproblem variable for the given variable. This provides a call back for the variable mapping between the master and subproblems. '''
62  print("python error in bendersgetvar: this method needs to be implemented")
63  return {}
64 
65 # local helper functions for the interface
66 cdef Variable getPyVar(SCIP_VAR* var):
67  cdef SCIP_VARDATA* vardata
68  vardata = SCIPvarGetData(var)
69  return <Variable>vardata
70 
71 
72 cdef SCIP_RETCODE PyBendersCopy (SCIP* scip, SCIP_BENDERS* benders):
73  return SCIP_OKAY
74 
75 cdef SCIP_RETCODE PyBendersFree (SCIP* scip, SCIP_BENDERS* benders):
76  cdef SCIP_BENDERSDATA* bendersdata
77  bendersdata = SCIPbendersGetData(benders)
78  PyBenders = <Benders>bendersdata
79  PyBenders.bendersfree()
80  Py_DECREF(PyBenders)
81  return SCIP_OKAY
82 
83 cdef SCIP_RETCODE PyBendersInit (SCIP* scip, SCIP_BENDERS* benders):
84  cdef SCIP_BENDERSDATA* bendersdata
85  bendersdata = SCIPbendersGetData(benders)
86  PyBenders = <Benders>bendersdata
87  PyBenders.bendersinit()
88  return SCIP_OKAY
89 
90 cdef SCIP_RETCODE PyBendersExit (SCIP* scip, SCIP_BENDERS* benders):
91  cdef SCIP_BENDERSDATA* bendersdata
92  bendersdata = SCIPbendersGetData(benders)
93  PyBenders = <Benders>bendersdata
94  PyBenders.bendersexit()
95  return SCIP_OKAY
96 
97 cdef SCIP_RETCODE PyBendersInitpre (SCIP* scip, SCIP_BENDERS* benders):
98  cdef SCIP_BENDERSDATA* bendersdata
99  bendersdata = SCIPbendersGetData(benders)
100  PyBenders = <Benders>bendersdata
101  PyBenders.bendersinitpre()
102  return SCIP_OKAY
103 
104 cdef SCIP_RETCODE PyBendersExitpre (SCIP* scip, SCIP_BENDERS* benders):
105  cdef SCIP_BENDERSDATA* bendersdata
106  bendersdata = SCIPbendersGetData(benders)
107  PyBenders = <Benders>bendersdata
108  PyBenders.bendersexitpre()
109  return SCIP_OKAY
110 
111 cdef SCIP_RETCODE PyBendersInitsol (SCIP* scip, SCIP_BENDERS* benders):
112  cdef SCIP_BENDERSDATA* bendersdata
113  bendersdata = SCIPbendersGetData(benders)
114  PyBenders = <Benders>bendersdata
115  PyBenders.bendersinitsol()
116  return SCIP_OKAY
117 
118 cdef SCIP_RETCODE PyBendersExitsol (SCIP* scip, SCIP_BENDERS* benders):
119  cdef SCIP_BENDERSDATA* bendersdata
120  bendersdata = SCIPbendersGetData(benders)
121  PyBenders = <Benders>bendersdata
122  PyBenders.bendersexitsol()
123  return SCIP_OKAY
124 
125 cdef SCIP_RETCODE PyBendersCreatesub (SCIP* scip, SCIP_BENDERS* benders, int probnumber):
126  cdef SCIP_BENDERSDATA* bendersdata
127  bendersdata = SCIPbendersGetData(benders)
128  PyBenders = <Benders>bendersdata
129  PyBenders.benderscreatesub(probnumber)
130  return SCIP_OKAY
131 
132 cdef SCIP_RETCODE PyBendersPresubsolve (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol, SCIP_BENDERSENFOTYPE type, SCIP_Bool checkint, SCIP_Bool* skipsolve, SCIP_RESULT* result):
133  cdef SCIP_BENDERSDATA* bendersdata
134  bendersdata = SCIPbendersGetData(benders)
135  PyBenders = <Benders>bendersdata
136  if sol == NULL:
137  solution = None
138  else:
139  solution = Solution()
140  solution.sol = sol
141  enfotype = type
142  result_dict = PyBenders.benderspresubsolve(solution, enfotype, checkint)
143  skipsolve[0] = result_dict.get("skipsolve", False)
144  result[0] = result_dict.get("result", <SCIP_RESULT>result[0])
145  return SCIP_OKAY
146 
147 cdef SCIP_RETCODE PyBendersSolvesubconvex (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol, int probnumber, SCIP_Bool onlyconvex, SCIP_Real* objective, SCIP_RESULT* result):
148  cdef SCIP_BENDERSDATA* bendersdata
149  bendersdata = SCIPbendersGetData(benders)
150  PyBenders = <Benders>bendersdata
151  if sol == NULL:
152  solution = None
153  else:
154  solution = Solution()
155  solution.sol = sol
156  result_dict = PyBenders.benderssolvesubconvex(solution, probnumber, onlyconvex)
157  objective[0] = result_dict.get("objective", 1e+20)
158  result[0] = result_dict.get("result", <SCIP_RESULT>result[0])
159  return SCIP_OKAY
160 
161 cdef SCIP_RETCODE PyBendersSolvesub (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol, int probnumber, SCIP_Real* objective, SCIP_RESULT* result):
162  cdef SCIP_BENDERSDATA* bendersdata
163  bendersdata = SCIPbendersGetData(benders)
164  PyBenders = <Benders>bendersdata
165  if sol == NULL:
166  solution = None
167  else:
168  solution = Solution()
169  solution.sol = sol
170  result_dict = PyBenders.benderssolvesub(solution, probnumber)
171  objective[0] = result_dict.get("objective", 1e+20)
172  result[0] = result_dict.get("result", <SCIP_RESULT>result[0])
173  return SCIP_OKAY
174 
175 cdef SCIP_RETCODE PyBendersPostsolve (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol,
176  SCIP_BENDERSENFOTYPE type, int* mergecands, int npriomergecands, int nmergecands, SCIP_Bool checkint,
177  SCIP_Bool infeasible, SCIP_Bool* merged):
178  cdef SCIP_BENDERSDATA* bendersdata
179  bendersdata = SCIPbendersGetData(benders)
180  PyBenders = <Benders>bendersdata
181  if sol == NULL:
182  solution = None
183  else:
184  solution = Solution()
185  solution.sol = sol
186  enfotype = type
187  mergecandidates = []
188  for i in range(nmergecands):
189  mergecandidates.append(mergecands[i])
190  result_dict = PyBenders.benderspostsolve(solution, enfotype, mergecandidates, npriomergecands, checkint, infeasible)
191  merged[0] = result_dict.get("merged", False)
192  return SCIP_OKAY
193 
194 cdef SCIP_RETCODE PyBendersFreesub (SCIP* scip, SCIP_BENDERS* benders, int probnumber):
195  cdef SCIP_BENDERSDATA* bendersdata
196  bendersdata = SCIPbendersGetData(benders)
197  PyBenders = <Benders>bendersdata
198  PyBenders.bendersfreesub(probnumber)
199  return SCIP_OKAY
200 
201 #TODO: Really need to ask about the passing and returning of variables
202 cdef SCIP_RETCODE PyBendersGetvar (SCIP* scip, SCIP_BENDERS* benders, SCIP_VAR* var, SCIP_VAR** mappedvar, int probnumber):
203  cdef SCIP_BENDERSDATA* bendersdata
204  bendersdata = SCIPbendersGetData(benders)
205  PyBenders = <Benders>bendersdata
206  PyVar = getPyVar(var)
207  result_dict = PyBenders.bendersgetvar(PyVar, probnumber)
208  mappedvariable = <Variable>(result_dict.get("mappedvar", None))
209  if mappedvariable is None:
210  mappedvar[0] = NULL
211  else:
212  mappedvar[0] = mappedvariable.var
213  return SCIP_OKAY
def benderssolvesub(self, solution, probnumber)
Definition: benders.pxi:48
def benderspresubsolve(self, solution, enfotype, checkint)
Definition: benders.pxi:40
def bendersgetvar(self, variable, probnumber)
Definition: benders.pxi:60
def benderspostsolve(self, solution, enfotype, mergecandidates, npriomergecands, checkint, infeasible)
Definition: benders.pxi:52
SCIP_BENDERSDATA * SCIPbendersGetData(SCIP_BENDERS *benders)
def bendersinitpre(self)
Definition: benders.pxi:19
def bendersexitpre(self)
Definition: benders.pxi:23
def benderssolvesubconvex(self, solution, probnumber, onlyconvex)
Definition: benders.pxi:44
SCIP_VARDATA * SCIPvarGetData(SCIP_VAR *var)
def bendersfreesub(self, probnumber)
Definition: benders.pxi:56
def benderscreatesub(self, probnumber)
Definition: benders.pxi:35
def bendersexitsol(self)
Definition: benders.pxi:31
def bendersinitsol(self)
Definition: benders.pxi:27