1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* This file is part of the program and library */
/* SCIP --- Solving Constraint Integer Programs */
/* */
/* Copyright 2002-2022 Zuse Institute Berlin */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* */
/* You should have received a copy of the Apache-2.0 license */
/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**@file prop.h
* @ingroup INTERNALAPI
* @brief internal methods for propagators
* @author Tobias Achterberg
*/
/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
#ifndef __SCIP_PROP_H__
#define __SCIP_PROP_H__
#include "scip/def.h"
#include "blockmemshell/memory.h"
#include "scip/type_retcode.h"
#include "scip/type_result.h"
#include "scip/type_set.h"
#include "scip/type_stat.h"
#include "scip/type_lp.h"
#include "scip/type_var.h"
#include "scip/type_prop.h"
#include "scip/pub_prop.h"
#ifdef __cplusplus
extern "C" {
#endif
/** copies the given propagator to a new scip */
SCIP_RETCODE SCIPpropCopyInclude(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
);
/** creates a propagator */
SCIP_RETCODE SCIPpropCreate(
SCIP_PROP** prop, /**< pointer to propagator data structure */
SCIP_SET* set, /**< global SCIP settings */
SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
const char* name, /**< name of propagator */
const char* desc, /**< description of propagator */
int priority, /**< priority of propagator (>= 0: before, < 0: after constraint handlers) */
int freq, /**< frequency for calling propagator */
SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
int presolpriority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
SCIP_PRESOLTIMING presoltiming, /**< timing mask of the propagator's presolving method */
SCIP_DECL_PROPCOPY ((*propcopy)), /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
SCIP_DECL_PROPFREE ((*propfree)), /**< destructor of propagator */
SCIP_DECL_PROPINIT ((*propinit)), /**< initialize propagator */
SCIP_DECL_PROPEXIT ((*propexit)), /**< deinitialize propagator */
SCIP_DECL_PROPINITPRE ((*propinitpre)), /**< presolving initialization method of propagator */
SCIP_DECL_PROPEXITPRE ((*propexitpre)), /**< presolving deinitialization method of propagator */
SCIP_DECL_PROPINITSOL ((*propinitsol)), /**< solving process initialization method of propagator */
SCIP_DECL_PROPEXITSOL ((*propexitsol)), /**< solving process deinitialization method of propagator */
SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
SCIP_DECL_PROPEXEC ((*propexec)), /**< execution method of propagator */
SCIP_DECL_PROPRESPROP ((*propresprop)), /**< propagation conflict resolving method */
SCIP_PROPDATA* propdata /**< propagator data */
);
/** calls destructor and frees memory of propagator */
SCIP_RETCODE SCIPpropFree(
SCIP_PROP** prop, /**< pointer to propagator data structure */
SCIP_SET* set /**< global SCIP settings */
);
/** initializes propagator */
SCIP_RETCODE SCIPpropInit(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< global SCIP settings */
);
/** calls exit method of propagator */
SCIP_RETCODE SCIPpropExit(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< global SCIP settings */
);
/** informs propagator that the presolving process is being started */
SCIP_RETCODE SCIPpropInitpre(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< global SCIP settings */
);
/** informs propagator that the presolving is finished */
SCIP_RETCODE SCIPpropExitpre(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< global SCIP settings */
);
/** informs propagator that the branch and bound process is being started */
SCIP_RETCODE SCIPpropInitsol(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set /**< global SCIP settings */
);
/** informs propagator that the branch and bound process data is being freed */
SCIP_RETCODE SCIPpropExitsol(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
);
/** executes presolving method of propagator */
SCIP_RETCODE SCIPpropPresol(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
SCIP_PRESOLTIMING timing, /**< current presolving timing */
int nrounds, /**< number of presolving rounds already done */
int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
int* naddconss, /**< pointer to total number of added constraints of all presolvers */
int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
SCIP_RESULT* result /**< pointer to store the result of the callback method */
);
/** calls execution method of propagator */
SCIP_RETCODE SCIPpropExec(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
SCIP_STAT* stat, /**< dynamic problem statistics */
int depth, /**< depth of current node */
SCIP_Bool execdelayed, /**< execute propagator even if it is marked to be delayed */
SCIP_Bool instrongbranching, /**< are we currently doing strong branching? */
SCIP_PROPTIMING proptiming, /**< current point in the node solving process */
SCIP_RESULT* result /**< pointer to store the result of the callback method */
);
/** resolves the given conflicting bound, that was deduced by the given propagator, by putting all "reason" bounds
* leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
* SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
*
* @note it is sufficient to explain the relaxed bound change
*/
SCIP_RETCODE SCIPpropResolvePropagation(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
int inferinfo, /**< user inference information attached to the bound change */
SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
SCIP_Real relaxedbd, /**< the relaxed bound */
SCIP_RESULT* result /**< pointer to store the result of the callback method */
);
/** sets priority of propagator */
void SCIPpropSetPriority(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
int priority /**< new priority of the propagator */
);
/** sets presolving priority of propagator */
void SCIPpropSetPresolPriority(
SCIP_PROP* prop, /**< propagator */
SCIP_SET* set, /**< global SCIP settings */
int presolpriority /**< new priority of the propagator */
);
/** sets copy method of propagator */
void SCIPpropSetCopy(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPCOPY ((*propcopy)) /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
);
/** sets destructor method of propagator */
void SCIPpropSetFree(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPFREE ((*propfree)) /**< destructor of propagator */
);
/** sets initialization method of propagator */
void SCIPpropSetInit(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPINIT ((*propinit)) /**< initialize propagator */
);
/** sets deinitialization method of propagator */
void SCIPpropSetExit(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPEXIT ((*propexit)) /**< deinitialize propagator */
);
/** sets solving process initialization method of propagator */
void SCIPpropSetInitsol(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPINITSOL((*propinitsol)) /**< solving process initialization method of propagator */
);
/** sets solving process deinitialization method of propagator */
void SCIPpropSetExitsol(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPEXITSOL ((*propexitsol)) /**< solving process deinitialization method of propagator */
);
/** sets preprocessing initialization method of propagator */
void SCIPpropSetInitpre(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPINITPRE((*propinitpre)) /**< preprocessing initialization method of propagator */
);
/** sets preprocessing deinitialization method of propagator */
void SCIPpropSetExitpre(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPEXITPRE((*propexitpre)) /**< preprocessing deinitialization method of propagator */
);
/** sets presolving method of propagator */
SCIP_RETCODE SCIPpropSetPresol(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
int presolpriority, /**< presolving priority of the propagator (>= 0: before, < 0: after constraint handlers) */
int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
SCIP_PRESOLTIMING presoltiming /**< timing mask of the propagator's presolving method */
);
/** sets propagation conflict resolving callback of propagator */
void SCIPpropSetResprop(
SCIP_PROP* prop, /**< propagator */
SCIP_DECL_PROPRESPROP ((*propresprop)) /**< propagation conflict resolving callback */
);
/** enables or disables all clocks of \p prop, depending on the value of the flag */
void SCIPpropEnableOrDisableClocks(
SCIP_PROP* prop, /**< the propagator for which all clocks should be enabled or disabled */
SCIP_Bool enable /**< should the clocks of the propagator be enabled? */
);
#ifdef __cplusplus
}
#endif
#endif