Scippy

SCIP

Solving Constraint Integer Programs

type_cons.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program and library */
4 /* SCIP --- Solving Constraint Integer Programs */
5 /* */
6 /* Copyright (C) 2002-2015 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SCIP is distributed under the terms of the ZIB Academic License. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SCIP; see the file COPYING. If not email to scip@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file type_cons.h
17  * @ingroup TYPEDEFINITIONS
18  * @brief type definitions for constraints and constraint handlers
19  * @author Tobias Achterberg
20  * @author Stefan Heinz
21  *
22  * This file defines the interface for constraint handlers implemented in C.
23  *
24  * - \ref CONS "Instructions for implementing a constraint handler"
25  * - \ref CONSHDLRS "List of available constraint handlers"
26  * - \ref scip::ObjConshdlr "C++ wrapper class"
27  */
28 
29 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
30 
31 #ifndef __SCIP_TYPE_CONS_H__
32 #define __SCIP_TYPE_CONS_H__
33 
34 #include "scip/def.h"
35 #include "scip/type_retcode.h"
36 #include "scip/type_result.h"
37 #include "scip/type_var.h"
38 #include "scip/type_sol.h"
39 #include "scip/type_scip.h"
40 #include "scip/type_timing.h"
41 #include "scip/type_heur.h"
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 typedef struct SCIP_Conshdlr SCIP_CONSHDLR; /**< constraint handler for a specific constraint type */
48 typedef struct SCIP_Cons SCIP_CONS; /**< constraint data structure */
49 typedef struct SCIP_ConshdlrData SCIP_CONSHDLRDATA; /**< constraint handler data */
50 typedef struct SCIP_ConsData SCIP_CONSDATA; /**< locally defined constraint type specific data */
51 typedef struct SCIP_ConsSetChg SCIP_CONSSETCHG; /**< tracks additions and removals of the set of active constraints */
52 
53 /** copy method for constraint handler plugins (called when SCIP copies plugins)
54  *
55  * If the copy process was a one to one the valid pointer can set to TRUE. Otherwise, you have to set this pointer to
56  * FALSE. In case all problem defining objects (constraint handlers and variable pricers) return a valid TRUE for all
57  * their copying calls, SCIP assumes that it is a overall one to one copy of the original instance. In this case any
58  * reductions made in the copied SCIP instance can be transfer to the original SCIP instance. If the valid pointer is
59  * set to TRUE and it was not one to one copy, it might happen that optimal solutions are cut off.
60  *
61  * input:
62  * - scip : SCIP main data structure
63  * - conshdlr : the constraint handler itself
64  * - valid : was the copying process valid?
65  */
66 #define SCIP_DECL_CONSHDLRCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_Bool* valid)
67 
68 /** destructor of constraint handler to free constraint handler data (called when SCIP is exiting)
69  *
70  * input:
71  * - scip : SCIP main data structure
72  * - conshdlr : the constraint handler itself
73  */
74 #define SCIP_DECL_CONSFREE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr)
75 
76 /** initialization method of constraint handler (called after problem was transformed)
77  *
78  * input:
79  * - scip : SCIP main data structure
80  * - conshdlr : the constraint handler itself
81  * - conss : array of constraints in transformed problem
82  * - nconss : number of constraints in transformed problem
83  */
84 #define SCIP_DECL_CONSINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
85 
86 /** deinitialization method of constraint handler (called before transformed problem is freed)
87  *
88  * input:
89  * - scip : SCIP main data structure
90  * - conshdlr : the constraint handler itself
91  * - conss : array of constraints in transformed problem
92  * - nconss : number of constraints in transformed problem
93  */
94 #define SCIP_DECL_CONSEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
95 
96 /** presolving initialization method of constraint handler (called when presolving is about to begin)
97  *
98  * This method is called when the presolving process is about to begin, even if presolving is turned off.
99  * The constraint handler may use this call to initialize its data structures.
100  *
101  * Necessary modifications that have to be performed even if presolving is turned off should be done here or in the
102  * presolving deinitialization call (SCIP_DECL_CONSEXITPRE()).
103  *
104  * @note Note that the constraint array might contain constraints that were created but not added to the problem.
105  * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem
106  * reductions.
107  *
108  * input:
109  * - scip : SCIP main data structure
110  * - conshdlr : the constraint handler itself
111  * - conss : array of constraints in transformed problem
112  * - nconss : number of constraints in transformed problem
113  */
114 #define SCIP_DECL_CONSINITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
115 
116 /** presolving deinitialization method of constraint handler (called after presolving has been finished)
117  *
118  * This method is called after the presolving has been finished, even if presolving is turned off.
119  * The constraint handler may use this call e.g. to clean up or modify its data structures.
120  *
121  * Necessary modifications that have to be performed even if presolving is turned off should be done here or in the
122  * presolving initialization call (SCIP_DECL_CONSINITPRE()).
123  *
124  * Besides necessary modifications and clean up, no time consuming operations should be performed, especially if the
125  * problem has already been solved. Use the method SCIPgetStatus(), which in this case returns SCIP_STATUS_OPTIMAL,
126  * SCIP_STATUS_INFEASIBLE, SCIP_STATUS_UNBOUNDED, or SCIP_STATUS_INFORUNBD.
127  *
128  * @note Note that the constraint array might contain constraints that were created but not added to the problem.
129  * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem
130  * reductions.
131  *
132  * input:
133  * - scip : SCIP main data structure
134  * - conshdlr : the constraint handler itself
135  * - conss : final array of constraints in transformed problem
136  * - nconss : final number of constraints in transformed problem
137  */
138 #define SCIP_DECL_CONSEXITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
139 
140 /** solving process initialization method of constraint handler (called when branch and bound process is about to begin)
141  *
142  * This method is called when the presolving was finished and the branch and bound process is about to begin.
143  * The constraint handler may use this call to initialize its branch and bound specific data.
144  *
145  * Besides necessary modifications and clean up, no time consuming operations should be performed, especially if the
146  * problem has already been solved. Use the method SCIPgetStatus(), which in this case returns SCIP_STATUS_OPTIMAL,
147  * SCIP_STATUS_INFEASIBLE, SCIP_STATUS_UNBOUNDED, or SCIP_STATUS_INFORUNBD.
148  *
149  * @note Note that the constraint array might contain constraints that were created but not added to the problem.
150  * Constraints that are not added, i.e., for which SCIPconsIsAdded() returns FALSE, cannot be used for problem
151  * reductions.
152  *
153  * input:
154  * - scip : SCIP main data structure
155  * - conshdlr : the constraint handler itself
156  * - conss : array of constraints of the constraint handler
157  * - nconss : number of constraints of the constraint handler
158  */
159 #define SCIP_DECL_CONSINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
160 
161 /** solving process deinitialization method of constraint handler (called before branch and bound process data is freed)
162  *
163  * This method is called before the branch and bound process is freed.
164  * The constraint handler should use this call to clean up its branch and bound data, in particular to release
165  * all LP rows that he has created or captured.
166  *
167  * input:
168  * - scip : SCIP main data structure
169  * - conshdlr : the constraint handler itself
170  * - conss : array of constraints of the constraint handler
171  * - nconss : number of constraints of the constraint handler
172  * - restart : was this exit solve call triggered by a restart?
173  */
174 #define SCIP_DECL_CONSEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, SCIP_Bool restart)
175 
176 /** frees specific constraint data
177  *
178  * @warning There may exist unprocessed events. For example, a variable's bound may have been already changed, but the
179  * corresponding bound change event was not yet processed.
180  *
181  * input:
182  * - scip : SCIP main data structure
183  * - conshdlr : the constraint handler itself
184  * - cons : the constraint belonging to the constraint data
185  * - consdata : pointer to the constraint data to free
186  */
187 #define SCIP_DECL_CONSDELETE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, SCIP_CONSDATA** consdata)
188 
189 /** transforms constraint data into data belonging to the transformed problem
190  *
191  * input:
192  * - scip : SCIP main data structure
193  * - conshdlr : the constraint handler itself
194  * - sourcecons : source constraint to transform
195  * - targetcons : pointer to store created target constraint
196  */
197 #define SCIP_DECL_CONSTRANS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* sourcecons, SCIP_CONS** targetcons)
198 
199 /** LP initialization method of constraint handler (called before the initial LP relaxation at a node is solved)
200  *
201  * Puts the LP relaxations of all "initial" constraints into the LP. The method should put a canonic LP relaxation
202  * of all given constraints to the LP with calls to SCIPaddCut().
203  *
204  * input:
205  * - scip : SCIP main data structure
206  * - conshdlr : the constraint handler itself
207  * - conss : array of constraints to process
208  * - nconss : number of constraints to process
209  */
210 #define SCIP_DECL_CONSINITLP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
211 
212 /** separation method of constraint handler for LP solution
213  *
214  * Separates all constraints of the constraint handler. The method is called in the LP solution loop,
215  * which means that a valid LP solution exists.
216  *
217  * The first nusefulconss constraints are the ones, that are identified to likely be violated. The separation
218  * method should process only the useful constraints in most runs, and only occasionally the remaining
219  * nconss - nusefulconss constraints.
220  *
221  * input:
222  * - scip : SCIP main data structure
223  * - conshdlr : the constraint handler itself
224  * - conss : array of constraints to process
225  * - nconss : number of constraints to process
226  * - nusefulconss : number of useful (non-obsolete) constraints to process
227  * - result : pointer to store the result of the separation call
228  *
229  * possible return values for *result (if more than one applies, the first in the list should be used):
230  * - SCIP_CUTOFF : the node is infeasible in the variable's bounds and can be cut off
231  * - SCIP_CONSADDED : an additional constraint was generated
232  * - SCIP_REDUCEDDOM : a variable's domain was reduced
233  * - SCIP_SEPARATED : a cutting plane was generated
234  * - SCIP_NEWROUND : a cutting plane was generated and a new separation round should immediately start
235  * - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints
236  * - SCIP_DIDNOTRUN : the separator was skipped
237  * - SCIP_DELAYED : the separator was skipped, but should be called again
238  */
239 #define SCIP_DECL_CONSSEPALP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, \
240  int nconss, int nusefulconss, SCIP_RESULT* result)
241 
242 /** separation method of constraint handler for arbitrary primal solution
243  *
244  * Separates all constraints of the constraint handler. The method is called outside the LP solution loop (e.g., by
245  * a relaxator or a primal heuristic), which means that there is no valid LP solution.
246  * Instead, the method should produce cuts that separate the given solution.
247  *
248  * The first nusefulconss constraints are the ones, that are identified to likely be violated. The separation
249  * method should process only the useful constraints in most runs, and only occasionally the remaining
250  * nconss - nusefulconss constraints.
251  *
252  * input:
253  * - scip : SCIP main data structure
254  * - conshdlr : the constraint handler itself
255  * - conss : array of constraints to process
256  * - nconss : number of constraints to process
257  * - nusefulconss : number of useful (non-obsolete) constraints to process
258  * - sol : primal solution that should be separated
259  * - result : pointer to store the result of the separation call
260  *
261  * possible return values for *result (if more than one applies, the first in the list should be used):
262  * - SCIP_CUTOFF : the node is infeasible in the variable's bounds and can be cut off
263  * - SCIP_CONSADDED : an additional constraint was generated
264  * - SCIP_REDUCEDDOM : a variable's domain was reduced
265  * - SCIP_SEPARATED : a cutting plane was generated
266  * - SCIP_NEWROUND : a cutting plane was generated and a new separation round should immediately start
267  * - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints
268  * - SCIP_DIDNOTRUN : the separator was skipped
269  * - SCIP_DELAYED : the separator was skipped, but should be called again
270  */
271 #define SCIP_DECL_CONSSEPASOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, \
272  int nconss, int nusefulconss, SCIP_SOL* sol, SCIP_RESULT* result)
273 
274 /** constraint enforcing method of constraint handler for LP solutions
275  *
276  * The method is called at the end of the node processing loop for a node where the LP was solved.
277  * The LP solution has to be checked for feasibility. If possible, an infeasibility should be resolved by
278  * branching, reducing a variable's domain to exclude the solution or separating the solution with a valid
279  * cutting plane.
280  *
281  * The enforcing methods of the active constraint handlers are called in decreasing order of their enforcing
282  * priorities until the first constraint handler returned with the value SCIP_CUTOFF, SCIP_SEPARATED,
283  * SCIP_REDUCEDDOM, SCIP_CONSADDED, or SCIP_BRANCHED.
284  * The integrality constraint handler has an enforcing priority of zero. A constraint handler which can
285  * (or wants) to enforce its constraints only for integral solutions should have a negative enforcing priority
286  * (e.g. the alldiff-constraint can only operate on integral solutions).
287  * A constraint handler which wants to incorporate its own branching strategy even on non-integral
288  * solutions must have an enforcing priority greater than zero (e.g. the SOS-constraint incorporates
289  * SOS-branching on non-integral solutions).
290  *
291  * The first nusefulconss constraints are the ones, that are identified to likely be violated. The enforcing
292  * method should process the useful constraints first. The other nconss - nusefulconss constraints should only
293  * be enforced, if no violation was found in the useful constraints.
294  *
295  * input:
296  * - scip : SCIP main data structure
297  * - conshdlr : the constraint handler itself
298  * - conss : array of constraints to process
299  * - nconss : number of constraints to process
300  * - nusefulconss : number of useful (non-obsolete) constraints to process
301  * - solinfeasible : was the solution already declared infeasible by a constraint handler?
302  * - result : pointer to store the result of the enforcing call
303  *
304  * possible return values for *result (if more than one applies, the first in the list should be used):
305  * - SCIP_CUTOFF : the node is infeasible in the variable's bounds and can be cut off
306  * - SCIP_CONSADDED : an additional constraint was generated
307  * - SCIP_REDUCEDDOM : a variable's domain was reduced
308  * - SCIP_SEPARATED : a cutting plane was generated
309  * - SCIP_BRANCHED : no changes were made to the problem, but a branching was applied to resolve an infeasibility
310  * - SCIP_INFEASIBLE : at least one constraint is infeasible, but it was not resolved
311  * - SCIP_FEASIBLE : all constraints of the handler are feasible
312  */
313 #define SCIP_DECL_CONSENFOLP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, \
314  SCIP_Bool solinfeasible, SCIP_RESULT* result)
315 
316 /** constraint enforcing method of constraint handler for pseudo solutions
317  *
318  * The method is called at the end of the node processing loop for a node where the LP was not solved.
319  * The pseudo solution has to be checked for feasibility. If possible, an infeasibility should be resolved by
320  * branching, reducing a variable's domain to exclude the solution or adding an additional constraint.
321  * Separation is not possible, since the LP is not processed at the current node. All LP informations like
322  * LP solution, slack values, or reduced costs are invalid and must not be accessed.
323  *
324  * Like in the enforcing method for LP solutions, the enforcing methods of the active constraint handlers are
325  * called in decreasing order of their enforcing priorities until the first constraint handler returned with
326  * the value SCIP_CUTOFF, SCIP_REDUCEDDOM, SCIP_CONSADDED, SCIP_BRANCHED, or SCIP_SOLVELP.
327  *
328  * The first nusefulconss constraints are the ones, that are identified to likely be violated. The enforcing
329  * method should process the useful constraints first. The other nconss - nusefulconss constraints should only
330  * be enforced, if no violation was found in the useful constraints.
331  *
332  * If the pseudo solution's objective value is lower than the lower bound of the node, it cannot be feasible
333  * and the enforcing method may skip it's check and set *result to SCIP_DIDNOTRUN. However, it can also process
334  * its constraints and return any other possible result code.
335  *
336  * input:
337  * - scip : SCIP main data structure
338  * - conshdlr : the constraint handler itself
339  * - conss : array of constraints to process
340  * - nconss : number of constraints to process
341  * - nusefulconss : number of useful (non-obsolete) constraints to process
342  * - solinfeasible : was the solution already declared infeasible by a constraint handler?
343  * - objinfeasible : is the solution infeasible anyway due to violating lower objective bound?
344  * - result : pointer to store the result of the enforcing call
345  *
346  * possible return values for *result (if more than one applies, the first in the list should be used):
347  * - SCIP_CUTOFF : the node is infeasible in the variable's bounds and can be cut off
348  * - SCIP_CONSADDED : an additional constraint was generated
349  * - SCIP_REDUCEDDOM : a variable's domain was reduced
350  * - SCIP_BRANCHED : no changes were made to the problem, but a branching was applied to resolve an infeasibility
351  * - SCIP_SOLVELP : at least one constraint is infeasible, and this can only be resolved by solving the LP
352  * - SCIP_INFEASIBLE : at least one constraint is infeasible, but it was not resolved
353  * - SCIP_FEASIBLE : all constraints of the handler are feasible
354  * - SCIP_DIDNOTRUN : the enforcement was skipped (only possible, if objinfeasible is true)
355  */
356 #define SCIP_DECL_CONSENFOPS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, \
357  SCIP_Bool solinfeasible, SCIP_Bool objinfeasible, SCIP_RESULT* result)
358 
359 /** feasibility check method of constraint handler for integral solutions
360  *
361  * The given solution has to be checked for feasibility.
362  *
363  * The check methods of the active constraint handlers are called in decreasing order of their check
364  * priorities until the first constraint handler returned with the result SCIP_INFEASIBLE.
365  * The integrality constraint handler has a check priority of zero. A constraint handler which can
366  * (or wants) to check its constraints only for integral solutions should have a negative check priority
367  * (e.g. the alldiff-constraint can only operate on integral solutions).
368  * A constraint handler which wants to check feasibility even on non-integral solutions must have a
369  * check priority greater than zero (e.g. if the check is much faster than testing all variables for
370  * integrality).
371  *
372  * In some cases, integrality conditions or rows of the current LP don't have to be checked, because their
373  * feasibility is already checked or implicitly given. In these cases, 'checkintegrality' or
374  * 'checklprows' is FALSE.
375  *
376  * input:
377  * - scip : SCIP main data structure
378  * - conshdlr : the constraint handler itself
379  * - conss : array of constraints to process
380  * - nconss : number of constraints to process
381  * - sol : the solution to check feasibility for
382  * - checkintegrality: has integrality to be checked?
383  * - checklprows : have current LP rows to be checked?
384  * - printreason : should the reason for the violation be printed?
385  * - result : pointer to store the result of the feasibility checking call
386  *
387  * possible return values for *result:
388  * - SCIP_INFEASIBLE : at least one constraint of the handler is infeasible
389  * - SCIP_FEASIBLE : all constraints of the handler are feasible
390  */
391 #define SCIP_DECL_CONSCHECK(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, SCIP_SOL* sol, \
392  SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_RESULT* result)
393 
394 /** domain propagation method of constraint handler
395  *
396  * The first nusefulconss constraints are the ones, that are identified to likely be violated. The propagation
397  * method should process only the useful constraints in most runs, and only occasionally the remaining
398  * nconss - nusefulconss constraints.
399  *
400  * @note if the constraint handler uses dual information in propagation it is nesassary to check via calling
401  * SCIPallowDualReds and SCIPallowObjProp if dual reductions and propgation with the current cutoff bound, resp.,
402  * are allowed.
403  *
404  * input:
405  * - scip : SCIP main data structure
406  * - conshdlr : the constraint handler itself
407  * - conss : array of constraints to process
408  * - nconss : number of constraints to process
409  * - nusefulconss : number of useful (non-obsolete) constraints to process
410  * - nmarkedconss : number of constraints which are marked to be definitely propagated
411  * - proptiming : current point in the node solving loop
412  * - result : pointer to store the result of the propagation call
413  *
414  * possible return values for *result:
415  * - SCIP_CUTOFF : the node is infeasible in the variable's bounds and can be cut off
416  * - SCIP_REDUCEDDOM : at least one domain reduction was found
417  * - SCIP_DIDNOTFIND : the propagator searched but did not find any domain reductions
418  * - SCIP_DIDNOTRUN : the propagator was skipped
419  * - SCIP_DELAYED : the propagator was skipped, but should be called again
420  */
421 #define SCIP_DECL_CONSPROP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nusefulconss, int nmarkedconss, \
422  SCIP_PROPTIMING proptiming, SCIP_RESULT* result)
423 
424 /** presolving method of constraint handler
425  *
426  * The presolver should go through the variables and constraints and tighten the domains or
427  * constraints. Each tightening should increase the given total number of changes.
428  *
429  * input:
430  * - scip : SCIP main data structure
431  * - conshdlr : the constraint handler itself
432  * - conss : array of constraints to process
433  * - nconss : number of constraints to process
434  * - nrounds : number of presolving rounds already done
435  * - presoltiming : current presolving timing
436  * - nnewfixedvars : number of variables fixed since the last call to the presolving method
437  * - nnewaggrvars : number of variables aggregated since the last call to the presolving method
438  * - nnewchgvartypes : number of variable type changes since the last call to the presolving method
439  * - nnewchgbds : number of variable bounds tightened since the last call to the presolving method
440  * - nnewholes : number of domain holes added since the last call to the presolving method
441  * - nnewdelconss : number of deleted constraints since the last call to the presolving method
442  * - nnewaddconss : number of added constraints since the last call to the presolving method
443  * - nnewupgdconss : number of upgraded constraints since the last call to the presolving method
444  * - nnewchgcoefs : number of changed coefficients since the last call to the presolving method
445  * - nnewchgsides : number of changed left or right hand sides since the last call to the presolving method
446  *
447  * @note the counters state the changes since the last call including the changes of this presolving method during its
448  * call
449  *
450  * @note if the constraint handler performs dual presolving it is nesassary to check via calling SCIPallowDualReds
451  * if dual reductions are allowed.
452  *
453  * input/output:
454  * - nfixedvars : pointer to count total number of variables fixed of all presolvers
455  * - naggrvars : pointer to count total number of variables aggregated of all presolvers
456  * - nchgvartypes : pointer to count total number of variable type changes of all presolvers
457  * - nchgbds : pointer to count total number of variable bounds tightened of all presolvers
458  * - naddholes : pointer to count total number of domain holes added of all presolvers
459  * - ndelconss : pointer to count total number of deleted constraints of all presolvers
460  * - naddconss : pointer to count total number of added constraints of all presolvers
461  * - nupgdconss : pointer to count total number of upgraded constraints of all presolvers
462  * - nchgcoefs : pointer to count total number of changed coefficients of all presolvers
463  * - nchgsides : pointer to count total number of changed left/right hand sides of all presolvers
464  *
465  * @todo: implement a final round of presolving after SCIPisPresolveFinished(),
466  * therefore, duplicate counters to a "relevant for finishing presolve" version
467  *
468  * output:
469  * - result : pointer to store the result of the presolving call
470  *
471  * possible return values for *result:
472  * - SCIP_UNBOUNDED : at least one variable is not bounded by any constraint in obj. direction -> problem is unbounded
473  * - SCIP_CUTOFF : at least one constraint is infeasible in the variable's bounds -> problem is infeasible
474  * - SCIP_SUCCESS : the presolving method found a reduction
475  * - SCIP_DIDNOTFIND : the presolving method searched, but did not find a presolving change
476  * - SCIP_DIDNOTRUN : the presolving method was skipped
477  * - SCIP_DELAYED : the presolving method was skipped, but should be called again
478  */
479 #define SCIP_DECL_CONSPRESOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss, int nrounds, \
480  SCIP_PRESOLTIMING presoltiming, int nnewfixedvars, int nnewaggrvars, int nnewchgvartypes, int nnewchgbds, int nnewholes, \
481  int nnewdelconss, int nnewaddconss, int nnewupgdconss, int nnewchgcoefs, int nnewchgsides, \
482  int* nfixedvars, int* naggrvars, int* nchgvartypes, int* nchgbds, int* naddholes, \
483  int* ndelconss, int* naddconss, int* nupgdconss, int* nchgcoefs, int* nchgsides, SCIP_RESULT* result)
484 
485 /** propagation conflict resolving method of constraint handler
486  *
487  * This method is called during conflict analysis. If the constraint handler wants to support conflict analysis,
488  * it should call SCIPinferVarLbCons() or SCIPinferVarUbCons() in domain propagation instead of SCIPchgVarLb() or
489  * SCIPchgVarUb() in order to deduce bound changes on variables.
490  * In the SCIPinferVarLbCons() and SCIPinferVarUbCons() calls, the handler provides the constraint, that deduced the
491  * variable's bound change, and an integer value "inferinfo" that can be arbitrarily chosen.
492  * The propagation conflict resolving method can then be implemented, to provide a "reasons" for the bound
493  * changes, i.e. the bounds of variables at the time of the propagation, that forced the constraint to set the
494  * conflict variable's bound to its current value. It can use the "inferinfo" tag to identify its own propagation
495  * rule and thus identify the "reason" bounds. The bounds that form the reason of the assignment must then be provided
496  * by calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(), SCIPaddConflictRelaxedLb(),
497  * SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), and/or SCIPaddConflictBinvar() in the propagation conflict
498  * resolving method.
499  *
500  * For example, the logicor constraint c = "x or y or z" fixes variable z to TRUE (i.e. changes the lower bound of z
501  * to 1.0), if both, x and y, are assigned to FALSE (i.e. if the upper bounds of these variables are 0.0). It uses
502  * SCIPinferVarLbCons(scip, z, 1.0, c, 0) to apply this assignment (an inference information tag is not needed by the
503  * constraint handler and is set to 0).
504  * In the conflict analysis, the constraint handler may be asked to resolve the lower bound change on z with
505  * constraint c, that was applied at a time given by a bound change index "bdchgidx".
506  * With a call to SCIPvarGetLbAtIndex(z, bdchgidx, TRUE), the handler can find out, that the lower bound of
507  * variable z was set to 1.0 at the given point of time, and should call SCIPaddConflictUb(scip, x, bdchgidx) and
508  * SCIPaddConflictUb(scip, y, bdchgidx) to tell SCIP, that the upper bounds of x and y at this point of time were
509  * the reason for the deduction of the lower bound of z.
510  *
511  * input:
512  * - scip : SCIP main data structure
513  * - conshdlr : the constraint handler itself
514  * - cons : the constraint that deduced the bound change of the conflict variable
515  * - infervar : the conflict variable whose bound change has to be resolved
516  * - inferinfo : the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call
517  * - boundtype : the type of the changed bound (lower or upper bound)
518  * - bdchgidx : the index of the bound change, representing the point of time where the change took place
519  * - relaxedbd : the relaxed bound which is sufficient to be explained
520  *
521  * output:
522  * - result : pointer to store the result of the propagation conflict resolving call
523  *
524  * possible return values for *result:
525  * - SCIP_SUCCESS : the conflicting bound change has been successfully resolved by adding all reason bounds
526  * - SCIP_DIDNOTFIND : the conflicting bound change could not be resolved and has to be put into the conflict set
527  *
528  * @note it is sufficient to explain/resolve the relaxed bound
529  */
530 #define SCIP_DECL_CONSRESPROP(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \
531  SCIP_VAR* infervar, int inferinfo, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX* bdchgidx, SCIP_Real relaxedbd, \
532  SCIP_RESULT* result)
533 
534 /** variable rounding lock method of constraint handler
535  *
536  * This method is called, after a constraint is added or removed from the transformed problem.
537  * It should update the rounding locks of all associated variables with calls to SCIPaddVarLocks(),
538  * depending on the way, the variable is involved in the constraint:
539  * - If the constraint may get violated by decreasing the value of a variable, it should call
540  * SCIPaddVarLocks(scip, var, nlockspos, nlocksneg), saying that rounding down is potentially rendering the
541  * (positive) constraint infeasible and rounding up is potentially rendering the negation of the constraint
542  * infeasible.
543  * - If the constraint may get violated by increasing the value of a variable, it should call
544  * SCIPaddVarLocks(scip, var, nlocksneg, nlockspos), saying that rounding up is potentially rendering the
545  * constraint's negation infeasible and rounding up is potentially rendering the constraint itself
546  * infeasible.
547  * - If the constraint may get violated by changing the variable in any direction, it should call
548  * SCIPaddVarLocks(scip, var, nlockspos + nlocksneg, nlockspos + nlocksneg).
549  *
550  * Consider the linear constraint "3x -5y +2z <= 7" as an example. The variable rounding lock method of the
551  * linear constraint handler should call SCIPaddVarLocks(scip, x, nlocksneg, nlockspos),
552  * SCIPaddVarLocks(scip, y, nlockspos, nlocksneg) and SCIPaddVarLocks(scip, z, nlocksneg, nlockspos) to tell SCIP,
553  * that rounding up of x and z and rounding down of y can destroy the feasibility of the constraint, while rounding
554  * down of x and z and rounding up of y can destroy the feasibility of the constraint's negation "3x -5y +2z > 7".
555  * A linear constraint "2 <= 3x -5y +2z <= 7" should call
556  * SCIPaddVarLocks(scip, ..., nlockspos + nlocksneg, nlockspos + nlocksneg) on all variables, since rounding in both
557  * directions of each variable can destroy both the feasibility of the constraint and it's negation
558  * "3x -5y +2z < 2 or 3x -5y +2z > 7".
559  *
560  * If the constraint itself contains other constraints as sub constraints (e.g. the "or" constraint concatenation
561  * "c(x) or d(x)"), the rounding lock methods of these constraints should be called in a proper way.
562  * - If the constraint may get violated by the violation of the sub constraint c, it should call
563  * SCIPaddConsLocks(scip, c, nlockspos, nlocksneg), saying that infeasibility of c may lead to infeasibility of
564  * the (positive) constraint, and infeasibility of c's negation (i.e. feasibility of c) may lead to infeasibility
565  * of the constraint's negation (i.e. feasibility of the constraint).
566  * - If the constraint may get violated by the feasibility of the sub constraint c, it should call
567  * SCIPaddConsLocks(scip, c, nlocksneg, nlockspos), saying that infeasibility of c may lead to infeasibility of
568  * the constraint's negation (i.e. feasibility of the constraint), and infeasibility of c's negation (i.e. feasibility
569  * of c) may lead to infeasibility of the (positive) constraint.
570  * - If the constraint may get violated by any change in the feasibility of the sub constraint c, it should call
571  * SCIPaddConsLocks(scip, c, nlockspos + nlocksneg, nlockspos + nlocksneg).
572  *
573  * Consider the or concatenation "c(x) or d(x)". The variable rounding lock method of the or constraint handler
574  * should call SCIPaddConsLocks(scip, c, nlockspos, nlocksneg) and SCIPaddConsLocks(scip, d, nlockspos, nlocksneg)
575  * to tell SCIP, that infeasibility of c and d can lead to infeasibility of "c(x) or d(x)".
576  *
577  * As a second example, consider the equivalence constraint "y <-> c(x)" with variable y and constraint c. The
578  * constraint demands, that y == 1 if and only if c(x) is satisfied. The variable lock method of the corresponding
579  * constraint handler should call SCIPaddVarLocks(scip, y, nlockspos + nlocksneg, nlockspos + nlocksneg) and
580  * SCIPaddConsLocks(scip, c, nlockspos + nlocksneg, nlockspos + nlocksneg), because any modification to the
581  * value of y or to the feasibility of c can alter the feasibility of the equivalence constraint.
582  *
583  * input:
584  * - scip : SCIP main data structure
585  * - conshdlr : the constraint handler itself
586  * - cons : the constraint that should lock rounding of its variables, or NULL if the constraint handler
587  * does not need constraints
588  * - nlockspos : number of times, the roundings should be locked for the constraint (may be negative)
589  * - nlocksneg : number of times, the roundings should be locked for the constraint's negation (may be negative)
590  */
591 #define SCIP_DECL_CONSLOCK(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, int nlockspos, int nlocksneg)
592 
593 /** constraint activation notification method of constraint handler
594  *
595  * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but
596  * the corresponding bound change event was not yet processed.
597  *
598  * This method is always called after a constraint of the constraint handler was activated. The constraint
599  * handler may use this call to update his own (statistical) data.
600  *
601  * input:
602  * - scip : SCIP main data structure
603  * - conshdlr : the constraint handler itself
604  * - cons : the constraint that has been activated
605  */
606 #define SCIP_DECL_CONSACTIVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons)
607 
608 /** constraint deactivation notification method of constraint handler
609  *
610  * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but
611  * the corresponding bound change event was not yet processed.
612  *
613  * This method is always called before a constraint of the constraint handler is deactivated. The constraint
614  * handler may use this call to update his own (statistical) data.
615  *
616  * input:
617  * - scip : SCIP main data structure
618  * - conshdlr : the constraint handler itself
619  * - cons : the constraint that will be deactivated
620  */
621 #define SCIP_DECL_CONSDEACTIVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons)
622 
623 /** constraint enabling notification method of constraint handler
624  *
625  * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but
626  * the corresponding bound change event was not yet processed.
627  *
628  * This method is always called after a constraint of the constraint handler was enabled. The constraint
629  * handler may use this call to update his own (statistical) data.
630  *
631  * input:
632  * - scip : SCIP main data structure
633  * - conshdlr : the constraint handler itself
634  * - cons : the constraint that has been enabled
635  */
636 #define SCIP_DECL_CONSENABLE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons)
637 
638 /** constraint disabling notification method of constraint handler
639  *
640  * WARNING! There may exist unprocessed events. For example, a variable's bound may have been already changed, but
641  * the corresponding bound change event was not yet processed.
642  *
643  * This method is always called before a constraint of the constraint handler is disabled. The constraint
644  * handler may use this call to update his own (statistical) data.
645  *
646  * input:
647  * - scip : SCIP main data structure
648  * - conshdlr : the constraint handler itself
649  * - cons : the constraint that will be disabled
650  */
651 #define SCIP_DECL_CONSDISABLE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons)
652 
653 /** variable deletion method of constraint handler
654  *
655  * This method is optinal and only of interest if you are using SCIP as a branch-and-price framework. That means, you
656  * are generating new variables during the search. If you are not doing that just define the function pointer to be
657  * NULL.
658  *
659  * If this method gets implemented you should iterate over all constraints of the constraint handler and delete all
660  * variables that were marked for deletion by SCIPdelVar().
661  *
662  * input:
663  * - scip : SCIP main data structure
664  * - conshdlr : the constraint handler itself
665  * - conss : array of constraints in transformed problem
666  * - nconss : number of constraints in transformed problem
667  */
668 #define SCIP_DECL_CONSDELVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** conss, int nconss)
669 
670 /** constraint display method of constraint handler
671  *
672  * The constraint handler can store a representation of the constraint into the given text file. Use the method
673  * SCIPinfoMessage() to push a string into the file stream.
674  *
675  * @note There are several methods which help to display variables. These are SCIPwriteVarName(), SCIPwriteVarsList(),
676  * SCIPwriteVarsLinearsum(), and SCIPwriteVarsPolynomial().
677  *
678  * input: - scip : SCIP main data structure - conshdlr : the constraint handler itself - cons : the constraint that
679  * should be displayed - file : the text file to store the information into
680  *
681  */
682 #define SCIP_DECL_CONSPRINT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, FILE* file)
683 
684 /** constraint copying method of constraint handler
685  *
686  * The constraint handler can provide a copy method which copies a constraint from one SCIP data structure into a other
687  * SCIP data structure. If a copy of a constraint is created the constraint has to be captured (The capture is usually
688  * already done due to the creation of the constraint).
689  *
690  * If the copy process was a one to one the valid pointer can set to TRUE. Otherwise, you have to set this pointer to
691  * FALSE. In case all problem defining objects (constraint handlers and variable pricers) return a valid TRUE for all
692  * their copying calls, SCIP assumes that it is a overall one to one copy of the original instance. In this case any
693  * reductions made in the copied SCIP instance can be transfer to the original SCIP instance. If the valid pointer is
694  * set to TRUE and it was not one to one copy, it might happen that optimal solutions are cut off.
695  *
696  * To get a copy of a variable in the target SCIP you should use the function SCIPgetVarCopy().
697  *
698  * input:
699  * - scip : target SCIP data structure
700  * - cons : pointer to store the created target constraint
701  * - name : name of constraint, or NULL if the name of the source constraint should be used
702  * - sourcescip : source SCIP data structure
703  * - sourceconshdlr : source constraint handler of the source SCIP
704  * - sourcecons : source constraint of the source SCIP
705  * - varmap : a SCIP_HASHMAP mapping variables of the source SCIP to corresponding variables of the target SCIP
706  * - consmap : a SCIP_HASHMAP mapping constraints of the source SCIP to corresponding constraints of the target SCIP
707  * - initial : should the LP relaxation of constraint be in the initial LP?
708  * - separate : should the constraint be separated during LP processing?
709  * - enforce : should the constraint be enforced during node processing?
710  * - check : should the constraint be checked for feasibility?
711  * - propagate : should the constraint be propagated during node processing?
712  * - local : is constraint only valid locally?
713  * - modifiable : is constraint modifiable (subject to column generation)?
714  * - dynamic : is constraint subject to aging?
715  * - removable : should the relaxation be removed from the LP due to aging or cleanup?
716  * - stickingatnode : should the constraint always be kept at the node where it was added, even
717  * if it may be moved to a more global node?
718  * - global : should a global or a local copy be created?
719  *
720  * output:
721  * - valid : pointer to store whether the copying was valid or not
722  */
723 #define SCIP_DECL_CONSCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONS** cons, const char* name, \
724  SCIP* sourcescip, SCIP_CONSHDLR* sourceconshdlr, SCIP_CONS* sourcecons, SCIP_HASHMAP* varmap, SCIP_HASHMAP* consmap, \
725  SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, \
726  SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, \
727  SCIP_Bool global, SCIP_Bool* valid)
728 
729 /** constraint parsing method of constraint handler
730  *
731  * The constraint handler can provide a callback to parse the output created by the display method
732  * (\ref SCIP_DECL_CONSPRINT) and to create a constraint out of it.
733  *
734  * @note For parsing there are several methods which are handy. Have a look at: SCIPparseVarName(),
735  * SCIPparseVarsList(), SCIPparseVarsLinearsum(), SCIPparseVarsPolynomial(), SCIPstrToRealValue(), and
736  * SCIPstrCopySection().
737  *
738  * input:
739  * - scip : SCIP main data structure
740  * - conshdlr : the constraint handler itself
741  * - cons : pointer to store the created constraint
742  * - name : name of the constraint
743  * - str : string to parse
744  * - initial : should the LP relaxation of constraint be in the initial LP?
745  * - separate : should the constraint be separated during LP processing?
746  * - enforce : should the constraint be enforced during node processing?
747  * - check : should the constraint be checked for feasibility?
748  * - propagate : should the constraint be propagated during node processing?
749  * - local : is constraint only valid locally?
750  * - modifiable : is constraint modifiable (subject to column generation)?
751  * - dynamic : is constraint subject to aging?
752  * - removable : should the relaxation be removed from the LP due to aging or cleanup?
753  * - stickingatnode : should the constraint always be kept at the node where it was added, even
754  * if it may be moved to a more global node?
755  * output:
756  * - success : pointer to store whether the parsing was successful or not
757  */
758 #define SCIP_DECL_CONSPARSE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS** cons, \
759  const char* name, const char* str, \
760  SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, \
761  SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool* success)
762 
763 /** constraint method of constraint handler which returns the variables (if possible)
764  *
765  * The constraint handler can (this callback is optional) provide this callback to return the variables which are
766  * involved in that particular constraint. If this is possible, the variables should be copyied into the variables
767  * array and the success pointers has to be set to TRUE. Otherwise the success has to be set FALSE or the callback
768  * should not be implemented.
769  *
770  * input:
771  * - scip : SCIP main data structure
772  * - conshdlr : the constraint handler itself
773  * - cons : the constraint that should return its variable data
774  *
775  * output:
776  * - vars : array to store/copy the involved variables of the constraint
777  * - varssize : available slots in vars array which is needed to check if the array is large enough
778  * - success : pointer to store whether the variables are successfully copied
779  */
780 #define SCIP_DECL_CONSGETVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \
781  SCIP_VAR** vars, int varssize, SCIP_Bool* success)
782 
783 /** constraint method of constraint handler which returns the number of variables (if possible)
784  *
785  * The constraint handler can (this callback is optional) provide this callback to return the number variable which are
786  * involved in that particular constraint. If this is not possible, the success pointers has to be set to FALSE or the
787  * callback should not be implemented.
788  *
789  * input:
790  * - scip : SCIP main data structure
791  * - conshdlr : the constraint handler itself
792  * - cons : constraint for which the number of variables is wanted
793  *
794  * output:
795  * - nvars : pointer to store the number of variables
796  * - success : pointer to store whether the constraint successfully returned the number of variables
797  */
798 #define SCIP_DECL_CONSGETNVARS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_CONS* cons, \
799  int* nvars, SCIP_Bool* success)
800 
801 /** constraint handler method to suggest dive bound changes during the generic diving algorithm
802  *
803  * This callback is used inside the various diving heuristics of SCIP and does not affect the normal branching
804  * of the actual search.
805  * The constraint handler can provide this callback to render the current solution (even more) infeasible by
806  * suggesting one or several variable bound changes. Infact,
807  * since diving heuristics do not necessarily solve LP relaxations at every probing depth, some of the variable
808  * local bounds might already be conflicting with the solution values.
809  * The solution is rendered infeasible by determining bound changes that should be applied to the next explored search node
810  * via SCIPaddDiveBoundChange().
811  * An alternative in case that the preferred bound change(s) were detected infeasible must be provided.
812  *
813  * The constraint handler must take care to only add bound changes that further shrink the variable domain.
814  *
815  * The success pointer must be used to indicate whether the constraint handler succeeded in selecting diving bound
816  * changes. The infeasible pointer should be set to TRUE if the constraint handler found a local infeasibility. If the
817  * constraint handler needs to select between several candidates, it may use the scoring mechanism of the diveset
818  * argument to control its choice.
819  *
820  *
821  *
822  * This callback is optional.
823  *
824  * @note: @p sol is usually the LP relaxation solution unless the caller of the method, usually a diving heuristic,
825  * does not solve LP relaxations at every depth
826  *
827  * input:
828  * - scip : SCIP main data structure
829  * - conshdlr : the constraint handler itself
830  * - diveset : diving settings for scoring
831  * - sol : current diving solution, usually the LP relaxation solution
832  *
833  * output:
834  * - success : pointer to store whether the constraint handler succeeded to determine dive bound changes
835  * - infeasible : pointer to store whether the constraint handler detected an infeasibility in the local node
836  */
837 #define SCIP_DECL_CONSGETDIVEBDCHGS(x) SCIP_RETCODE x (SCIP* scip, SCIP_CONSHDLR* conshdlr, SCIP_DIVESET* diveset, \
838  SCIP_SOL* sol, SCIP_Bool* success, SCIP_Bool* infeasible)
839 
840 #ifdef __cplusplus
841 }
842 #endif
843 
844 #endif
timing definitions for SCIP
type definitions for return codes for SCIP methods
type definitions for primal heuristics
type definitions for SCIP's main datastructure
type definitions for problem variables
struct SCIP_ConsData SCIP_CONSDATA
Definition: type_cons.h:50
type definitions for storing primal CIP solutions
result codes for SCIP callback methods
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
Definition: type_cons.h:49
common defines and data types used in all packages of SCIP