Scippy

SCIP

Solving Constraint Integer Programs

prop.c
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-2025 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file prop.c
26 * @ingroup OTHER_CFILES
27 * @brief methods and datastructures for propagators
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 */
31
32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
33
34#include <assert.h>
35#include <string.h>
36
37#include "scip/def.h"
38#include "scip/set.h"
39#include "scip/stat.h"
40#include "scip/clock.h"
41#include "scip/paramset.h"
42#include "scip/var.h"
43#include "scip/scip.h"
44#include "scip/prop.h"
45#include "scip/pub_message.h"
46#include "scip/pub_misc.h"
47
48#include "scip/struct_prop.h"
49
50
51/** compares two propagators w. r. to their priority */
53{ /*lint --e{715}*/
54 return ((SCIP_PROP*)elem2)->priority - ((SCIP_PROP*)elem1)->priority;
55}
56
57/** compares two propagators w. r. to their priority */
58SCIP_DECL_SORTPTRCOMP(SCIPpropCompPresol)
59{ /*lint --e{715}*/
60 return ((SCIP_PROP*)elem2)->presolpriority - ((SCIP_PROP*)elem1)->presolpriority;
61}
62
63/** comparison method for sorting propagators w.r.t. to their name */
64SCIP_DECL_SORTPTRCOMP(SCIPpropCompName)
65{
66 return strcmp(SCIPpropGetName((SCIP_PROP*)elem1), SCIPpropGetName((SCIP_PROP*)elem2));
67}
68
69/** method to call, when the priority of a propagator was changed */
70static
71SCIP_DECL_PARAMCHGD(paramChgdPropPriority)
72{ /*lint --e{715}*/
73 SCIP_PARAMDATA* paramdata;
74
75 paramdata = SCIPparamGetData(param);
76 assert(paramdata != NULL);
77
78 /* use SCIPsetPropPriority() to mark the props unsorted */
79 SCIP_CALL( SCIPsetPropPriority(scip, (SCIP_PROP*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
80
81 return SCIP_OKAY;
82}
83
84/** method to call, when the presolving priority of a propagator was changed */
85static
86SCIP_DECL_PARAMCHGD(paramChgdPropPresolPriority)
87{ /*lint --e{715}*/
88 SCIP_PARAMDATA* paramdata;
89
90 paramdata = SCIPparamGetData(param);
91 assert(paramdata != NULL);
92
93 /* use SCIPsetPropPriority() to mark the props unsorted */
94 SCIP_CALL( SCIPsetPropPresolPriority(scip, (SCIP_PROP*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
95
96 return SCIP_OKAY;
97}
98
99/** copies the given propagator to a new scip */
101 SCIP_PROP* prop, /**< propagator */
102 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
103 )
104{
105 assert(prop != NULL);
106 assert(set != NULL);
107 assert(set->scip != NULL);
108
109 if( prop->propcopy != NULL )
110 {
111 SCIPsetDebugMsg(set, "including propagator %s in subscip %p\n", SCIPpropGetName(prop), (void*)set->scip);
112 SCIP_CALL( prop->propcopy(set->scip, prop) );
113 }
114 return SCIP_OKAY;
115}
116
117/** internal method for creating a propagator */
118static
120 SCIP_PROP** prop, /**< pointer to propagator data structure */
121 SCIP_SET* set, /**< global SCIP settings */
122 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
123 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
124 const char* name, /**< name of propagator */
125 const char* desc, /**< description of propagator */
126 int priority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
127 int freq, /**< frequency for calling propagator */
128 SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
129 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
130 int presolpriority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
131 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
132 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the propagator's presolving method */
133 SCIP_DECL_PROPCOPY ((*propcopy)), /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
134 SCIP_DECL_PROPFREE ((*propfree)), /**< destructor of propagator */
135 SCIP_DECL_PROPINIT ((*propinit)), /**< initialize propagator */
136 SCIP_DECL_PROPEXIT ((*propexit)), /**< deinitialize propagator */
137 SCIP_DECL_PROPINITPRE ((*propinitpre)), /**< presolving initialization method of propagator */
138 SCIP_DECL_PROPEXITPRE ((*propexitpre)), /**< presolving deinitialization method of propagator */
139 SCIP_DECL_PROPINITSOL ((*propinitsol)), /**< solving process initialization method of propagator */
140 SCIP_DECL_PROPEXITSOL ((*propexitsol)), /**< solving process deinitialization method of propagator */
141 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
142 SCIP_DECL_PROPEXEC ((*propexec)), /**< execution method of propagator */
143 SCIP_DECL_PROPRESPROP ((*propresprop)), /**< propagation conflict resolving method */
144 SCIP_PROPDATA* propdata /**< propagator data */
145 )
146{
148 char paramdesc[SCIP_MAXSTRLEN];
149
150 assert(prop != NULL);
151 assert(name != NULL);
152 assert(desc != NULL);
153 assert(freq >= -1);
154 assert(propexec != NULL);
155
156 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
157 * error message
158 */
159 if( presoltiming < SCIP_PRESOLTIMING_NONE || presoltiming > SCIP_PRESOLTIMING_MAX )
160 {
161 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
162 "'SCIP_PRESOLTIMING' for <%s> propagator instead.\n", name);
163
165 }
166
167 SCIP_ALLOC( BMSallocMemory(prop) );
168 BMSclearMemory(*prop);
169
170 SCIP_ALLOC( BMSduplicateMemoryArray(&(*prop)->name, name, strlen(name)+1) );
171 SCIP_ALLOC( BMSduplicateMemoryArray(&(*prop)->desc, desc, strlen(desc)+1) );
172 (*prop)->priority = priority;
173 (*prop)->freq = freq;
174 (*prop)->propcopy = propcopy;
175 (*prop)->propfree = propfree;
176 (*prop)->propinit = propinit;
177 (*prop)->propexit = propexit;
178 (*prop)->propinitpre = propinitpre;
179 (*prop)->propexitpre = propexitpre;
180 (*prop)->propinitsol = propinitsol;
181 (*prop)->propexitsol = propexitsol;
182 (*prop)->proppresol = proppresol;
183 (*prop)->propexec = propexec;
184 (*prop)->propresprop = propresprop;
185 (*prop)->propdata = propdata;
186 SCIP_CALL( SCIPclockCreate(&(*prop)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
187 SCIP_CALL( SCIPclockCreate(&(*prop)->proptime, SCIP_CLOCKTYPE_DEFAULT) );
188 SCIP_CALL( SCIPclockCreate(&(*prop)->sbproptime, SCIP_CLOCKTYPE_DEFAULT) );
189 SCIP_CALL( SCIPclockCreate(&(*prop)->resproptime, SCIP_CLOCKTYPE_DEFAULT) );
190 SCIP_CALL( SCIPclockCreate(&(*prop)->presoltime, SCIP_CLOCKTYPE_DEFAULT) );
191 (*prop)->ncalls = 0;
192 (*prop)->nrespropcalls = 0;
193 (*prop)->ncutoffs = 0;
194 (*prop)->ndomredsfound = 0;
195 (*prop)->wasdelayed = FALSE;
196 (*prop)->exact = FALSE;
197 (*prop)->initialized = FALSE;
198
199 /* add parameters */
200 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/priority", name);
201 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of propagator <%s>", name);
202 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
203 &(*prop)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4,
204 paramChgdPropPriority, (SCIP_PARAMDATA*)(*prop)) ); /*lint !e740*/
205
206 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/freq", name);
207 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "frequency for calling propagator <%s> (-1: never, 0: only in root node)", name);
208 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
209 &(*prop)->freq, FALSE, freq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
210
211 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/delay", name);
212 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
213 "should propagator be delayed, if other propagators found reductions?",
214 &(*prop)->delay, TRUE, delay, NULL, NULL) ); /*lint !e740*/
215
216 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/timingmask", name);
217 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing when propagator should be called (%u:BEFORELP, %u:DURINGLPLOOP, %u:AFTERLPLOOP, %u:ALWAYS))",
219 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
220 (int*)(&(*prop)->timingmask), TRUE, (int)timingmask, (int)SCIP_PROPTIMING_NONE, (int)SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
221
222 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/presolpriority", name);
223 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "presolving priority of propagator <%s>", name);
224 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
225 &(*prop)->presolpriority, TRUE, presolpriority, INT_MIN/4, INT_MAX/4,
226 paramChgdPropPresolPriority, (SCIP_PARAMDATA*)(*prop)) ); /*lint !e740*/
227
228 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/maxprerounds", name);
229 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
230 "maximal number of presolving rounds the propagator participates in (-1: no limit)",
231 &(*prop)->maxprerounds, FALSE, presolmaxrounds, -1, INT_MAX, NULL, NULL) ); /*lint !e740*/
232
233 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "propagating/%s/presoltiming", name);
234 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of the presolving method of propagator <%s> (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
236 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
237 (int*)&(*prop)->presoltiming, TRUE, (int)presoltiming, (int)SCIP_PRESOLTIMING_NONE, (int)SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740*/
238
239 return SCIP_OKAY;
240}
241
242/** creates a propagator */
244 SCIP_PROP** prop, /**< pointer to propagator data structure */
245 SCIP_SET* set, /**< global SCIP settings */
246 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
247 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
248 const char* name, /**< name of propagator */
249 const char* desc, /**< description of propagator */
250 int priority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
251 int freq, /**< frequency for calling propagator */
252 SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
253 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
254 int presolpriority, /**< priority of the propagator (>= 0: before, < 0: after constraint handlers) */
255 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
256 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the propagator's presolving method */
257 SCIP_DECL_PROPCOPY ((*propcopy)), /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
258 SCIP_DECL_PROPFREE ((*propfree)), /**< destructor of propagator */
259 SCIP_DECL_PROPINIT ((*propinit)), /**< initialize propagator */
260 SCIP_DECL_PROPEXIT ((*propexit)), /**< deinitialize propagator */
261 SCIP_DECL_PROPINITPRE ((*propinitpre)), /**< presolving initialization method of propagator */
262 SCIP_DECL_PROPEXITPRE ((*propexitpre)), /**< presolving deinitialization method of propagator */
263 SCIP_DECL_PROPINITSOL ((*propinitsol)), /**< solving process initialization method of propagator */
264 SCIP_DECL_PROPEXITSOL ((*propexitsol)), /**< solving process deinitialization method of propagator */
265 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
266 SCIP_DECL_PROPEXEC ((*propexec)), /**< execution method of propagator */
267 SCIP_DECL_PROPRESPROP ((*propresprop)), /**< propagation conflict resolving method */
268 SCIP_PROPDATA* propdata /**< propagator data */
269 )
270{
271 assert(prop != NULL);
272 assert(name != NULL);
273 assert(desc != NULL);
274 assert(freq >= -1);
275 assert(propexec != NULL);
276
277 SCIP_CALL_FINALLY( doPropCreate(prop, set, messagehdlr, blkmem, name, desc, priority, freq, delay, timingmask,
278 presolpriority, presolmaxrounds, presoltiming, propcopy, propfree, propinit, propexit, propinitpre, propexitpre,
279 propinitsol, propexitsol, proppresol, propexec, propresprop, propdata), (void) SCIPpropFree(prop, set) );
280
281 return SCIP_OKAY;
282}
283
284/** calls destructor and frees memory of propagator */
286 SCIP_PROP** prop, /**< pointer to propagator data structure */
287 SCIP_SET* set /**< global SCIP settings */
288 )
289{
290 assert(prop != NULL);
291 if( *prop == NULL )
292 return SCIP_OKAY;
293 assert(!(*prop)->initialized);
294 assert(set != NULL);
295
296 /* call destructor of propagator */
297 if( (*prop)->propfree != NULL )
298 {
299 SCIP_CALL( (*prop)->propfree(set->scip, *prop) );
300 }
301
302 SCIPclockFree(&(*prop)->presoltime);
303 SCIPclockFree(&(*prop)->resproptime);
304 SCIPclockFree(&(*prop)->sbproptime);
305 SCIPclockFree(&(*prop)->proptime);
306 SCIPclockFree(&(*prop)->setuptime);
307 BMSfreeMemoryArrayNull(&(*prop)->desc);
308 BMSfreeMemoryArrayNull(&(*prop)->name);
309 BMSfreeMemory(prop);
310
311 return SCIP_OKAY;
312}
313
314/** initializes propagator */
316 SCIP_PROP* prop, /**< propagator */
317 SCIP_SET* set /**< global SCIP settings */
318 )
319{
320 assert(prop != NULL);
321 assert(set != NULL);
322
323 if( prop->initialized )
324 {
325 SCIPerrorMessage("propagator <%s> already initialized\n", prop->name);
326 return SCIP_INVALIDCALL;
327 }
328
329 if( set->misc_resetstat )
330 {
336
337 prop->ncalls = 0;
338 prop->nrespropcalls = 0;
339 prop->ncutoffs = 0;
340 prop->ndomredsfound = 0;
341 prop->lastnfixedvars = 0;
342 prop->lastnaggrvars = 0;
343 prop->lastnchgvartypes = 0;
344 prop->lastnchgbds = 0;
345 prop->lastnaddholes = 0;
346 prop->lastndelconss = 0;
347 prop->lastnaddconss = 0;
348 prop->lastnupgdconss = 0;
349 prop->lastnchgcoefs = 0;
350 prop->lastnchgsides = 0;
351 prop->nfixedvars = 0;
352 prop->naggrvars = 0;
353 prop->nchgvartypes = 0;
354 prop->nchgbds = 0;
355 prop->naddholes = 0;
356 prop->ndelconss = 0;
357 prop->naddconss = 0;
358 prop->nupgdconss = 0;
359 prop->nchgcoefs = 0;
360 prop->nchgsides = 0;
361 prop->npresolcalls = 0;
362 prop->wasdelayed = FALSE;
363 }
364
365 if( prop->propinit != NULL )
366 {
367 /* start timing */
369
370 SCIP_CALL( prop->propinit(set->scip, prop) );
371
372 /* stop timing */
374 }
375 prop->initialized = TRUE;
376
377 return SCIP_OKAY;
378}
379
380/** calls exit method of propagator */
382 SCIP_PROP* prop, /**< propagator */
383 SCIP_SET* set /**< global SCIP settings */
384 )
385{
386 assert(prop != NULL);
387 assert(set != NULL);
388
389 if( !prop->initialized )
390 {
391 SCIPerrorMessage("propagator <%s> not initialized\n", prop->name);
392 return SCIP_INVALIDCALL;
393 }
394
395 if( prop->propexit != NULL )
396 {
397 /* start timing */
399
400 SCIP_CALL( prop->propexit(set->scip, prop) );
401
402 /* stop timing */
404 }
405 prop->initialized = FALSE;
406
407 return SCIP_OKAY;
408}
409
410/** informs propagator that the presolving process is being started */
412 SCIP_PROP* prop, /**< propagator */
413 SCIP_SET* set /**< global SCIP settings */
414 )
415{
416 assert(prop != NULL);
417 assert(set != NULL);
418
419 prop->lastnfixedvars = 0;
420 prop->lastnaggrvars = 0;
421 prop->lastnchgvartypes = 0;
422 prop->lastnchgbds = 0;
423 prop->lastnaddholes = 0;
424 prop->lastndelconss = 0;
425 prop->lastnaddconss = 0;
426 prop->lastnupgdconss = 0;
427 prop->lastnchgcoefs = 0;
428 prop->lastnchgsides = 0;
429 prop->wasdelayed = FALSE;
430
431 /* call presolving initialization method of propagator */
432 if( prop->propinitpre != NULL )
433 {
434 /* start timing */
436
437 SCIP_CALL( prop->propinitpre(set->scip, prop) );
438
439 /* stop timing */
441 }
442
443 return SCIP_OKAY;
444}
445
446/** informs propagator that the presolving process is finished */
448 SCIP_PROP* prop, /**< propagator */
449 SCIP_SET* set /**< global SCIP settings */
450 )
451{
452 assert(prop != NULL);
453 assert(set != NULL);
454
455 /* call presolving deinitialization method of propagator */
456 if( prop->propexitpre != NULL )
457 {
458 /* start timing */
460
461 SCIP_CALL( prop->propexitpre(set->scip, prop) );
462
463 /* stop timing */
465 }
466
467 return SCIP_OKAY;
468}
469
470/** informs propagator that the prop and bound process is being started */
472 SCIP_PROP* prop, /**< propagator */
473 SCIP_SET* set /**< global SCIP settings */
474 )
475{
476 assert(prop != NULL);
477 assert(set != NULL);
478
479 /* call solving process initialization method of propagator */
480 if( prop->propinitsol != NULL )
481 {
482 /* start timing */
484
485 SCIP_CALL( prop->propinitsol(set->scip, prop) );
486
487 /* stop timing */
489 }
490
491 return SCIP_OKAY;
492}
493
494/** informs propagator that the prop and bound process data is being freed */
496 SCIP_PROP* prop, /**< propagator */
497 SCIP_SET* set, /**< global SCIP settings */
498 SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
499 )
500{
501 assert(prop != NULL);
502 assert(set != NULL);
503
504 /* call solving process deinitialization method of propagator */
505 if( prop->propexitsol != NULL )
506 {
507 /* start timing */
509
510 SCIP_CALL( prop->propexitsol(set->scip, prop, restart) );
511
512 /* stop timing */
514 }
515
516 return SCIP_OKAY;
517}
518
519/** executes presolving method of propagator */
521 SCIP_PROP* prop, /**< propagator */
522 SCIP_SET* set, /**< global SCIP settings */
523 SCIP_PRESOLTIMING timing, /**< current presolving timing */
524 int nrounds, /**< number of presolving rounds already done */
525 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
526 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
527 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
528 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
529 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
530 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
531 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
532 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
533 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
534 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
535 SCIP_RESULT* result /**< pointer to store the result of the callback method */
536 )
537{
538 assert(prop != NULL);
539 assert(set != NULL);
540 assert(nfixedvars != NULL);
541 assert(naggrvars != NULL);
542 assert(nchgvartypes != NULL);
543 assert(nchgbds != NULL);
544 assert(naddholes != NULL);
545 assert(ndelconss != NULL);
546 assert(naddconss != NULL);
547 assert(nupgdconss != NULL);
548 assert(nchgcoefs != NULL);
549 assert(nchgsides != NULL);
550 assert(result != NULL);
551
552 *result = SCIP_DIDNOTRUN;
553
554 if( prop->proppresol == NULL || (set->exact_enable && !prop->exact) )
555 return SCIP_OKAY;
556
557 /* check number of presolving rounds */
558 if( prop->maxprerounds >= 0 && prop->npresolcalls >= prop->maxprerounds )
559 return SCIP_OKAY;
560
561 /* check, if presolver should be delayed */
562 if( prop->presoltiming & timing )
563 {
564 int nnewfixedvars;
565 int nnewaggrvars;
566 int nnewchgvartypes;
567 int nnewchgbds;
568 int nnewaddholes;
569 int nnewdelconss;
570 int nnewaddconss;
571 int nnewupgdconss;
572 int nnewchgcoefs;
573 int nnewchgsides;
574
575 SCIPsetDebugMsg(set, "calling presolving method of propagator <%s>\n", prop->name);
576
577 /* calculate the number of changes since last call */
578 nnewfixedvars = *nfixedvars - prop->lastnfixedvars;
579 nnewaggrvars = *naggrvars - prop->lastnaggrvars;
580 nnewchgvartypes = *nchgvartypes - prop->lastnchgvartypes;
581 nnewchgbds = *nchgbds - prop->lastnchgbds;
582 nnewaddholes = *naddholes - prop->lastnaddholes;
583 nnewdelconss = *ndelconss - prop->lastndelconss;
584 nnewaddconss = *naddconss - prop->lastnaddconss;
585 nnewupgdconss = *nupgdconss - prop->lastnupgdconss;
586 nnewchgcoefs = *nchgcoefs - prop->lastnchgcoefs;
587 nnewchgsides = *nchgsides - prop->lastnchgsides;
588
589 /* remember the number of changes prior to the call of the presolver method of the propagator */
590 prop->lastnfixedvars = *nfixedvars;
591 prop->lastnaggrvars = *naggrvars;
592 prop->lastnchgvartypes = *nchgvartypes;
593 prop->lastnchgbds = *nchgbds;
594 prop->lastnaddholes = *naddholes;
595 prop->lastndelconss = *ndelconss;
596 prop->lastnaddconss = *naddconss;
597 prop->lastnupgdconss = *nupgdconss;
598 prop->lastnchgcoefs = *nchgcoefs;
599 prop->lastnchgsides = *nchgsides;
600
601 /* start timing */
603
604 /* call external method */
605 SCIP_CALL( prop->proppresol(set->scip, prop, nrounds, timing,
606 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewaddholes,
607 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
608 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
609 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
610
611 /* stop timing */
613
614 /* add/count the new changes */
615 prop->nfixedvars += *nfixedvars - prop->lastnfixedvars;
616 prop->naggrvars += *naggrvars - prop->lastnaggrvars;
617 prop->nchgvartypes += *nchgvartypes - prop->lastnchgvartypes;
618 prop->nchgbds += *nchgbds - prop->lastnchgbds;
619 prop->naddholes += *naddholes - prop->lastnaddholes;
620 prop->ndelconss += *ndelconss - prop->lastndelconss;
621 prop->naddconss += *naddconss - prop->lastnaddconss;
622 prop->nupgdconss += *nupgdconss - prop->lastnupgdconss;
623 prop->nchgcoefs += *nchgcoefs - prop->lastnchgcoefs;
624 prop->nchgsides += *nchgsides - prop->lastnchgsides;
625
626 /* check result code of callback method */
627 if( *result != SCIP_CUTOFF
628 && *result != SCIP_UNBOUNDED
629 && *result != SCIP_SUCCESS
630 && *result != SCIP_DIDNOTFIND
631 && *result != SCIP_DIDNOTRUN )
632 {
633 SCIPerrorMessage("propagator <%s> returned invalid result <%d>\n", prop->name, *result);
634 return SCIP_INVALIDRESULT;
635 }
636
637 /* increase the number of presolving calls, if the propagator tried to find reductions */
638 if( *result != SCIP_DIDNOTRUN )
639 ++(prop->npresolcalls);
640 }
641
642 return SCIP_OKAY;
643}
644
645/** calls execution method of propagator */
647 SCIP_PROP* prop, /**< propagator */
648 SCIP_SET* set, /**< global SCIP settings */
649 SCIP_STAT* stat, /**< dynamic problem statistics */
650 int depth, /**< depth of current node */
651 SCIP_Bool execdelayed, /**< execute propagator even if it is marked to be delayed */
652 SCIP_Bool instrongbranching, /**< are we currently doing strong branching? */
653 SCIP_PROPTIMING proptiming, /**< current point in the node solving process */
654 SCIP_RESULT* result /**< pointer to store the result of the callback method */
655 )
656{
657 assert(prop != NULL);
658 assert(prop->propexec != NULL);
659 assert(prop->freq >= -1);
660 assert(set != NULL);
661 assert(set->scip != NULL);
662 assert(stat != NULL);
663 assert(depth >= 0);
664 assert(result != NULL);
665
666 if( ((depth == 0 && prop->freq == 0) || (prop->freq > 0 && depth % prop->freq == 0))
667 && (!set->exact_enable || prop->exact) )
668 {
669 if( !prop->delay || execdelayed )
670 {
671 SCIP_Longint oldndomchgs;
672 SCIP_Longint oldnprobdomchgs;
673
674 SCIPsetDebugMsg(set, "executing propagator <%s>\n", prop->name);
675
676 oldndomchgs = stat->nboundchgs + stat->nholechgs;
677 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
678
679 /* start timing */
680 if( instrongbranching )
682 else
684
685 /* call external propagation method */
686 SCIP_CALL( prop->propexec(set->scip, prop, proptiming, result) );
687
688 /* stop timing */
689 if( instrongbranching )
691 else
692 SCIPclockStop(prop->proptime, set);
693
694 /* update statistics */
695 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
696 prop->ncalls++;
697 if( *result == SCIP_CUTOFF )
698 prop->ncutoffs++;
699
700 /* update domain reductions; therefore remove the domain
701 * reduction counts which were generated in probing mode */
702 prop->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
703 prop->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
704
705 /* evaluate result */
706 if( *result != SCIP_CUTOFF
707 && *result != SCIP_REDUCEDDOM
708 && *result != SCIP_DIDNOTFIND
709 && *result != SCIP_DIDNOTRUN
710 && *result != SCIP_DELAYED
711 && *result != SCIP_DELAYNODE )
712 {
713 SCIPerrorMessage("execution method of propagator <%s> returned invalid result <%d>\n",
714 prop->name, *result);
715 return SCIP_INVALIDRESULT;
716 }
717 }
718 else
719 {
720 SCIPsetDebugMsg(set, "propagator <%s> was delayed\n", prop->name);
721 *result = SCIP_DELAYED;
722 }
723
724 /* remember whether propagator was delayed */
725 prop->wasdelayed = (*result == SCIP_DELAYED);
726 }
727 else
728 *result = SCIP_DIDNOTRUN;
729
730 return SCIP_OKAY;
731}
732
733/** resolves the given conflicting bound, that was deduced by the given propagator, by putting all "reason" bounds
734 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
735 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
736 *
737 * @note it is sufficient to explain the relaxed bound change
738 */
740 SCIP_PROP* prop, /**< propagator */
741 SCIP_SET* set, /**< global SCIP settings */
742 SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
743 int inferinfo, /**< user inference information attached to the bound change */
744 SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
745 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
746 SCIP_Real relaxedbd, /**< the relaxed bound */
747 SCIP_RESULT* result /**< pointer to store the result of the callback method */
748 )
749{
750 assert(prop != NULL);
751 assert((inferboundtype == SCIP_BOUNDTYPE_LOWER
752 && SCIPgetVarLbAtIndex(set->scip, infervar, bdchgidx, TRUE) > SCIPvarGetLbGlobal(infervar))
753 || (inferboundtype == SCIP_BOUNDTYPE_UPPER
754 && SCIPgetVarUbAtIndex(set->scip, infervar, bdchgidx, TRUE) < SCIPvarGetUbGlobal(infervar)));
755 assert(result != NULL);
756
757 *result = SCIP_DIDNOTRUN;
758
759 if( prop->propresprop != NULL )
760 {
761 /* start timing */
763
764 SCIP_CALL( prop->propresprop(set->scip, prop, infervar, inferinfo, inferboundtype, bdchgidx,
765 relaxedbd, result) );
766
767 /* stop timing */
769
770 /* update statistic */
771 prop->nrespropcalls++;
772
773 /* check result code */
774 if( *result != SCIP_SUCCESS && *result != SCIP_DIDNOTFIND )
775 {
776 SCIPerrorMessage("propagation conflict resolving method of propagator <%s> returned invalid result <%d>\n",
777 prop->name, *result);
778 return SCIP_INVALIDRESULT;
779 }
780 }
781 else
782 {
783 SCIPerrorMessage("propagation conflict resolving method of propagator <%s> is not implemented\n", prop->name);
784 return SCIP_PLUGINNOTFOUND;
785 }
786
787 return SCIP_OKAY;
788}
789
790/** gets user data of propagator */
792 SCIP_PROP* prop /**< propagator */
793 )
794{
795 assert(prop != NULL);
796
797 return prop->propdata;
798}
799
800/** sets user data of propagator; user has to free old data in advance! */
802 SCIP_PROP* prop, /**< propagator */
803 SCIP_PROPDATA* propdata /**< new propagator user data */
804 )
805{
806 assert(prop != NULL);
807
808 prop->propdata = propdata;
809}
810
811/** sets copy method of propagator */
813 SCIP_PROP* prop, /**< propagator */
814 SCIP_DECL_PROPCOPY ((*propcopy)) /**< copy method of propagator or NULL if you don't want to copy your plugin into sub-SCIPs */
815 )
816{
817 assert(prop != NULL);
818
819 prop->propcopy = propcopy;
820}
821
822/** sets destructor method of propagator */
824 SCIP_PROP* prop, /**< propagator */
825 SCIP_DECL_PROPFREE ((*propfree)) /**< destructor of propagator */
826 )
827{
828 assert(prop != NULL);
829
830 prop->propfree = propfree;
831}
832
833/** sets initialization method of propagator */
835 SCIP_PROP* prop, /**< propagator */
836 SCIP_DECL_PROPINIT ((*propinit)) /**< initialize propagator */
837 )
838{
839 assert(prop != NULL);
840
841 prop->propinit = propinit;
842}
843
844/** sets deinitialization method of propagator */
846 SCIP_PROP* prop, /**< propagator */
847 SCIP_DECL_PROPEXIT ((*propexit)) /**< deinitialize propagator */
848 )
849{
850 assert(prop != NULL);
851
852 prop->propexit = propexit;
853}
854
855/** sets solving process initialization method of propagator */
857 SCIP_PROP* prop, /**< propagator */
858 SCIP_DECL_PROPINITSOL((*propinitsol)) /**< solving process initialization method of propagator */
859 )
860{
861 assert(prop != NULL);
862
863 prop->propinitsol = propinitsol;
864}
865
866/** sets solving process deinitialization method of propagator */
868 SCIP_PROP* prop, /**< propagator */
869 SCIP_DECL_PROPEXITSOL ((*propexitsol)) /**< solving process deinitialization method of propagator */
870 )
871{
872 assert(prop != NULL);
873
874 prop->propexitsol = propexitsol;
875}
876
877/** sets preprocessing initialization method of propagator */
879 SCIP_PROP* prop, /**< propagator */
880 SCIP_DECL_PROPINITPRE((*propinitpre)) /**< preprocessing initialization method of propagator */
881 )
882{
883 assert(prop != NULL);
884
885 prop->propinitpre = propinitpre;
886}
887
888/** sets preprocessing deinitialization method of propagator */
890 SCIP_PROP* prop, /**< propagator */
891 SCIP_DECL_PROPEXITPRE((*propexitpre)) /**< preprocessing deinitialization method of propagator */
892 )
893{
894 assert(prop != NULL);
895
896 prop->propexitpre = propexitpre;
897}
898
899/** sets presolving method of propagator */
901 SCIP_PROP* prop, /**< propagator */
902 SCIP_DECL_PROPPRESOL ((*proppresol)), /**< presolving method */
903 int presolpriority, /**< presolving priority of the propagator (>= 0: before, < 0: after constraint handlers) */
904 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
905 SCIP_PRESOLTIMING presoltiming /**< timing mask of the propagator's presolving method */
906 )
907{
908 assert(prop != NULL);
909
910 prop->proppresol = proppresol;
911 prop->presolpriority = presolpriority;
912 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
913 * error message
914 */
915 if( presoltiming < SCIP_PRESOLTIMING_FAST || presoltiming > SCIP_PRESOLTIMING_MAX )
916 {
917 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
918 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", prop->name);
919
921 }
922
923 prop->presoltiming = presoltiming;
924 prop->maxprerounds = presolmaxrounds;
925
926 return SCIP_OKAY;
927}
928
929/** sets propagation conflict resolving callback of propagator */
931 SCIP_PROP* prop, /**< propagator */
932 SCIP_DECL_PROPRESPROP ((*propresprop)) /**< propagation conflict resolving callback */
933 )
934{
935 assert(prop != NULL);
936
937 prop->propresprop = propresprop;
938}
939
940/** marks the propagator as safe to use in exact solving mode */
942 SCIP_PROP* prop /**< propagator */
943 )
944{
945 assert(prop != NULL);
946
947 prop->exact = TRUE;
948}
949
950/** gets name of propagator */
951const char* SCIPpropGetName(
952 SCIP_PROP* prop /**< propagator */
953 )
954{
955 assert(prop != NULL);
956
957 return prop->name;
958}
959
960/** gets description of propagator */
961const char* SCIPpropGetDesc(
962 SCIP_PROP* prop /**< propagator */
963 )
964{
965 assert(prop != NULL);
966
967 return prop->desc;
968}
969
970/** gets priority of propagator */
972 SCIP_PROP* prop /**< propagator */
973 )
974{
975 assert(prop != NULL);
976
977 return prop->priority;
978}
979
980/** gets presolving priority of propagator */
982 SCIP_PROP* prop /**< propagator */
983 )
984{
985 assert(prop != NULL);
986
987 return prop->presolpriority;
988}
989
990/** sets priority of propagator */
992 SCIP_PROP* prop, /**< propagator */
993 SCIP_SET* set, /**< global SCIP settings */
994 int priority /**< new priority of the propagator */
995 )
996{
997 assert(prop != NULL);
998 assert(set != NULL);
999
1000 prop->priority = priority;
1001 set->propssorted = FALSE;
1002}
1003
1004/** sets presolving priority of propagator */
1006 SCIP_PROP* prop, /**< propagator */
1007 SCIP_SET* set, /**< global SCIP settings */
1008 int presolpriority /**< new priority of the propagator */
1009 )
1010{
1011 assert(prop != NULL);
1012 assert(set != NULL);
1013
1014 prop->presolpriority = presolpriority;
1015 set->propspresolsorted = FALSE;
1016}
1017
1018/** gets frequency of propagator */
1020 SCIP_PROP* prop /**< propagator */
1021 )
1022{
1023 assert(prop != NULL);
1024
1025 return prop->freq;
1026}
1027
1028/** enables or disables all clocks of \p prop, depending on the value of the flag */
1030 SCIP_PROP* prop, /**< the propagator for which all clocks should be enabled or disabled */
1031 SCIP_Bool enable /**< should the clocks of the propagator be enabled? */
1032 )
1033{
1034 assert(prop != NULL);
1035
1036 SCIPclockEnableOrDisable(prop->setuptime, enable);
1037 SCIPclockEnableOrDisable(prop->presoltime, enable);
1038 SCIPclockEnableOrDisable(prop->proptime, enable);
1040 SCIPclockEnableOrDisable(prop->sbproptime, enable);
1041}
1042
1043/** gets time in seconds used for setting up this propagator for new stages */
1045 SCIP_PROP* prop /**< propagator */
1046 )
1047{
1048 assert(prop != NULL);
1049
1050 return SCIPclockGetTime(prop->setuptime);
1051}
1052
1053/** sets frequency of propagator */
1055 SCIP_PROP* prop, /**< propagator */
1056 int freq /**< new frequency of propagator */
1057 )
1058{
1059 assert(prop != NULL);
1060 assert(freq >= -1);
1061
1062 prop->freq = freq;
1063}
1064
1065/** gets time in seconds used in this propagator for propagation */
1067 SCIP_PROP* prop /**< propagator */
1068 )
1069{
1070 assert(prop != NULL);
1071
1072 return SCIPclockGetTime(prop->proptime);
1073}
1074
1075/** gets time in seconds used in this propagator for propagation during strong branching */
1077 SCIP_PROP* prop /**< propagator */
1078 )
1079{
1080 assert(prop != NULL);
1081
1082 return SCIPclockGetTime(prop->sbproptime);
1083}
1084
1085/** gets time in seconds used in this propagator for resolve propagation */
1087 SCIP_PROP* prop /**< propagator */
1088 )
1089{
1090 assert(prop != NULL);
1091
1092 return SCIPclockGetTime(prop->resproptime);
1093}
1094
1095/** gets time in seconds used in this propagator for presolving */
1097 SCIP_PROP* prop /**< propagator */
1098 )
1099{
1100 assert(prop != NULL);
1101
1102 return SCIPclockGetTime(prop->presoltime);
1103}
1104
1105/** gets the total number of times, the propagator was called */
1107 SCIP_PROP* prop /**< propagator */
1108 )
1109{
1110 assert(prop != NULL);
1111
1112 return prop->ncalls;
1113}
1114
1115/** gets the total number of times, the propagator was called for resolving a propagation */
1117 SCIP_PROP* prop /**< propagator */
1118 )
1119{
1120 assert(prop != NULL);
1121
1122 return prop->nrespropcalls;
1123}
1124
1125/** gets total number of times, this propagator detected a cutoff */
1127 SCIP_PROP* prop /**< propagator */
1128 )
1129{
1130 assert(prop != NULL);
1131
1132 return prop->ncutoffs;
1133}
1134
1135/** gets total number of domain reductions found by this propagator */
1137 SCIP_PROP* prop /**< propagator */
1138 )
1139{
1140 assert(prop != NULL);
1141
1142 return prop->ndomredsfound;
1143}
1144
1145/** should propagator be delayed, if other propagators found reductions? */
1147 SCIP_PROP* prop /**< propagator */
1148 )
1149{
1150 assert(prop != NULL);
1151
1152 return prop->delay;
1153}
1154
1155/** was propagator delayed at the last call? */
1157 SCIP_PROP* prop /**< propagator */
1158 )
1159{
1160 assert(prop != NULL);
1161
1162 return prop->wasdelayed;
1163}
1164
1165/** is propagator initialized? */
1167 SCIP_PROP* prop /**< propagator */
1168 )
1169{
1170 assert(prop != NULL);
1171
1172 return prop->initialized;
1173}
1174
1175/** gets number of variables fixed during presolving of propagator */
1177 SCIP_PROP* prop /**< propagator */
1178 )
1179{
1180 assert(prop != NULL);
1181
1182 return prop->nfixedvars;
1183}
1184
1185/** gets number of variables aggregated during presolving of propagator */
1187 SCIP_PROP* prop /**< propagator */
1188 )
1189{
1190 assert(prop != NULL);
1191
1192 return prop->naggrvars;
1193}
1194
1195/** gets number of variable types changed during presolving of propagator */
1197 SCIP_PROP* prop /**< propagator */
1198 )
1199{
1200 assert(prop != NULL);
1201
1202 return prop->nchgvartypes;
1203}
1204
1205/** gets number of bounds changed during presolving of propagator */
1207 SCIP_PROP* prop /**< propagator */
1208 )
1209{
1210 assert(prop != NULL);
1211
1212 return prop->nchgbds;
1213}
1214
1215/** gets number of holes added to domains of variables during presolving of propagator */
1217 SCIP_PROP* prop /**< propagator */
1218 )
1219{
1220 assert(prop != NULL);
1221
1222 return prop->naddholes;
1223}
1224
1225/** gets number of constraints deleted during presolving of propagator */
1227 SCIP_PROP* prop /**< propagator */
1228 )
1229{
1230 assert(prop != NULL);
1231
1232 return prop->ndelconss;
1233}
1234
1235/** gets number of constraints added during presolving of propagator */
1237 SCIP_PROP* prop /**< propagator */
1238 )
1239{
1240 assert(prop != NULL);
1241
1242 return prop->naddconss;
1243}
1244
1245/** gets number of constraints upgraded during presolving of propagator */
1247 SCIP_PROP* prop /**< propagator */
1248 )
1249{
1250 assert(prop != NULL);
1251
1252 return prop->nupgdconss;
1253}
1254
1255/** gets number of coefficients changed during presolving of propagator */
1257 SCIP_PROP* prop /**< propagator */
1258 )
1259{
1260 assert(prop != NULL);
1261
1262 return prop->nchgcoefs;
1263}
1264
1265/** gets number of constraint sides changed during presolving of propagator */
1267 SCIP_PROP* prop /**< propagator */
1268 )
1269{
1270 assert(prop != NULL);
1271
1272 return prop->nchgsides;
1273}
1274
1275/** gets number of times the propagator was called in presolving and tried to find reductions */
1277 SCIP_PROP* prop /**< propagator */
1278 )
1279{
1280 assert(prop != NULL);
1281
1282 return prop->npresolcalls;
1283}
1284
1285/** returns the timing mask of the propagator */
1287 SCIP_PROP* prop /**< propagator */
1288 )
1289{
1290 assert(prop != NULL);
1291
1292 return prop->timingmask;
1293}
1294
1295/** sets new timing mask for propagator */
1297 SCIP_PROP* prop, /**< propagator */
1298 SCIP_PROPTIMING timingmask /**< new timing mask of propagator */
1299 )
1300{
1301 assert(prop != NULL);
1302
1303 prop->timingmask = timingmask;
1304}
1305
1306/** does the propagator perform presolving? */
1308 SCIP_PROP* prop /**< propagator */
1309 )
1310{
1311 assert(prop != NULL);
1312
1313 return (prop->proppresol != NULL);
1314}
1315
1316/** returns the timing mask of the presolving method of the propagator */
1318 SCIP_PROP* prop /**< propagator */
1319 )
1320{
1321 assert(prop != NULL);
1322
1323 return prop->presoltiming;
1324}
1325
1326/** sets the timing mask of the presolving method of the propagator */
1328 SCIP_PROP* prop, /**< propagator */
1329 SCIP_PRESOLTIMING presoltiming /** timing mask to be set */
1330 )
1331{
1332 assert(prop != NULL);
1333
1334 prop->presoltiming = presoltiming;
1335}
void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
Definition: clock.c:360
void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
Definition: clock.c:260
void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
Definition: clock.c:290
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
Definition: clock.c:438
void SCIPclockReset(SCIP_CLOCK *clck)
Definition: clock.c:209
void SCIPclockFree(SCIP_CLOCK **clck)
Definition: clock.c:185
SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
Definition: clock.c:170
internal methods for clocks and timing issues
common defines and data types used in all packages of SCIP
#define NULL
Definition: def.h:248
#define SCIP_MAXSTRLEN
Definition: def.h:269
#define SCIP_Longint
Definition: def.h:141
#define SCIP_MAXTREEDEPTH
Definition: def.h:297
#define SCIP_Bool
Definition: def.h:91
#define SCIP_ALLOC(x)
Definition: def.h:366
#define SCIP_Real
Definition: def.h:156
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define SCIP_CALL(x)
Definition: def.h:355
#define SCIP_CALL_FINALLY(x, y)
Definition: def.h:397
SCIP_Bool SCIPpropDoesPresolve(SCIP_PROP *prop)
Definition: prop.c:1307
SCIP_Real SCIPpropGetRespropTime(SCIP_PROP *prop)
Definition: prop.c:1086
SCIP_Bool SCIPpropIsDelayed(SCIP_PROP *prop)
Definition: prop.c:1146
SCIP_Real SCIPpropGetPresolTime(SCIP_PROP *prop)
Definition: prop.c:1096
void SCIPpropSetPresolTiming(SCIP_PROP *prop, SCIP_PRESOLTIMING presoltiming)
Definition: prop.c:1327
SCIP_Bool SCIPpropWasDelayed(SCIP_PROP *prop)
Definition: prop.c:1156
SCIP_Longint SCIPpropGetNCutoffs(SCIP_PROP *prop)
Definition: prop.c:1126
SCIP_Real SCIPpropGetSetupTime(SCIP_PROP *prop)
Definition: prop.c:1044
int SCIPpropGetNAddHoles(SCIP_PROP *prop)
Definition: prop.c:1216
int SCIPpropGetNChgBds(SCIP_PROP *prop)
Definition: prop.c:1206
void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
Definition: prop.c:801
int SCIPpropGetNChgSides(SCIP_PROP *prop)
Definition: prop.c:1266
SCIP_RETCODE SCIPsetPropPriority(SCIP *scip, SCIP_PROP *prop, int priority)
Definition: scip_prop.c:370
int SCIPpropGetNUpgdConss(SCIP_PROP *prop)
Definition: prop.c:1246
int SCIPpropGetNPresolCalls(SCIP_PROP *prop)
Definition: prop.c:1276
SCIP_Longint SCIPpropGetNRespropCalls(SCIP_PROP *prop)
Definition: prop.c:1116
SCIP_Real SCIPpropGetStrongBranchPropTime(SCIP_PROP *prop)
Definition: prop.c:1076
SCIP_Longint SCIPpropGetNDomredsFound(SCIP_PROP *prop)
Definition: prop.c:1136
int SCIPpropGetFreq(SCIP_PROP *prop)
Definition: prop.c:1019
SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
Definition: prop.c:791
SCIP_RETCODE SCIPsetPropPresolPriority(SCIP *scip, SCIP_PROP *prop, int presolpriority)
Definition: scip_prop.c:385
int SCIPpropGetNChgCoefs(SCIP_PROP *prop)
Definition: prop.c:1256
int SCIPpropGetNAggrVars(SCIP_PROP *prop)
Definition: prop.c:1186
const char * SCIPpropGetDesc(SCIP_PROP *prop)
Definition: prop.c:961
int SCIPpropGetPresolPriority(SCIP_PROP *prop)
Definition: prop.c:981
int SCIPpropGetNFixedVars(SCIP_PROP *prop)
Definition: prop.c:1176
const char * SCIPpropGetName(SCIP_PROP *prop)
Definition: prop.c:951
void SCIPpropSetTimingmask(SCIP_PROP *prop, SCIP_PROPTIMING timingmask)
Definition: prop.c:1296
int SCIPpropGetNAddConss(SCIP_PROP *prop)
Definition: prop.c:1236
int SCIPpropGetPriority(SCIP_PROP *prop)
Definition: prop.c:971
void SCIPpropSetFreq(SCIP_PROP *prop, int freq)
Definition: prop.c:1054
SCIP_Real SCIPpropGetTime(SCIP_PROP *prop)
Definition: prop.c:1066
int SCIPpropGetNChgVarTypes(SCIP_PROP *prop)
Definition: prop.c:1196
SCIP_PRESOLTIMING SCIPpropGetPresolTiming(SCIP_PROP *prop)
Definition: prop.c:1317
SCIP_Bool SCIPpropIsInitialized(SCIP_PROP *prop)
Definition: prop.c:1166
void SCIPpropMarkExact(SCIP_PROP *prop)
Definition: prop.c:941
SCIP_DECL_SORTPTRCOMP(SCIPpropComp)
Definition: prop.c:52
SCIP_Longint SCIPpropGetNCalls(SCIP_PROP *prop)
Definition: prop.c:1106
SCIP_PROPTIMING SCIPpropGetTimingmask(SCIP_PROP *prop)
Definition: prop.c:1286
int SCIPpropGetNDelConss(SCIP_PROP *prop)
Definition: prop.c:1226
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
Definition: var.c:24142
SCIP_Real SCIPgetVarUbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
Definition: scip_var.c:2872
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
Definition: var.c:24120
SCIP_Real SCIPgetVarLbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
Definition: scip_var.c:2736
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10827
static const char * paramname[]
Definition: lpi_msk.c:5172
#define BMSfreeMemory(ptr)
Definition: memory.h:145
#define BMSduplicateMemoryArray(ptr, source, num)
Definition: memory.h:143
#define BMSclearMemory(ptr)
Definition: memory.h:129
struct BMS_BlkMem BMS_BLKMEM
Definition: memory.h:437
#define BMSfreeMemoryArrayNull(ptr)
Definition: memory.h:148
#define BMSallocMemory(ptr)
Definition: memory.h:118
void SCIPmessagePrintError(const char *formatstr,...)
Definition: message.c:791
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
Definition: paramset.c:678
int SCIPparamGetInt(SCIP_PARAM *param)
Definition: paramset.c:733
internal methods for handling parameter settings
void SCIPpropSetPriority(SCIP_PROP *prop, SCIP_SET *set, int priority)
Definition: prop.c:991
SCIP_RETCODE SCIPpropInitsol(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:471
SCIP_RETCODE SCIPpropInit(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:315
void SCIPpropSetResprop(SCIP_PROP *prop, SCIP_DECL_PROPRESPROP((*propresprop)))
Definition: prop.c:930
void SCIPpropSetExitsol(SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol)))
Definition: prop.c:867
void SCIPpropSetFree(SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree)))
Definition: prop.c:823
SCIP_RETCODE SCIPpropCreate(SCIP_PROP **prop, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_PROPCOPY((*propcopy)), SCIP_DECL_PROPFREE((*propfree)), SCIP_DECL_PROPINIT((*propinit)), SCIP_DECL_PROPEXIT((*propexit)), SCIP_DECL_PROPINITPRE((*propinitpre)), SCIP_DECL_PROPEXITPRE((*propexitpre)), SCIP_DECL_PROPINITSOL((*propinitsol)), SCIP_DECL_PROPEXITSOL((*propexitsol)), SCIP_DECL_PROPPRESOL((*proppresol)), SCIP_DECL_PROPEXEC((*propexec)), SCIP_DECL_PROPRESPROP((*propresprop)), SCIP_PROPDATA *propdata)
Definition: prop.c:243
SCIP_RETCODE SCIPpropCopyInclude(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:100
SCIP_RETCODE SCIPpropExitpre(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:447
SCIP_RETCODE SCIPpropExit(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:381
void SCIPpropEnableOrDisableClocks(SCIP_PROP *prop, SCIP_Bool enable)
Definition: prop.c:1029
static SCIP_RETCODE doPropCreate(SCIP_PROP **prop, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_PROPCOPY((*propcopy)), SCIP_DECL_PROPFREE((*propfree)), SCIP_DECL_PROPINIT((*propinit)), SCIP_DECL_PROPEXIT((*propexit)), SCIP_DECL_PROPINITPRE((*propinitpre)), SCIP_DECL_PROPEXITPRE((*propexitpre)), SCIP_DECL_PROPINITSOL((*propinitsol)), SCIP_DECL_PROPEXITSOL((*propexitsol)), SCIP_DECL_PROPPRESOL((*proppresol)), SCIP_DECL_PROPEXEC((*propexec)), SCIP_DECL_PROPRESPROP((*propresprop)), SCIP_PROPDATA *propdata)
Definition: prop.c:119
void SCIPpropSetExitpre(SCIP_PROP *prop, SCIP_DECL_PROPEXITPRE((*propexitpre)))
Definition: prop.c:889
SCIP_RETCODE SCIPpropResolvePropagation(SCIP_PROP *prop, SCIP_SET *set, SCIP_VAR *infervar, int inferinfo, SCIP_BOUNDTYPE inferboundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd, SCIP_RESULT *result)
Definition: prop.c:739
SCIP_RETCODE SCIPpropExitsol(SCIP_PROP *prop, SCIP_SET *set, SCIP_Bool restart)
Definition: prop.c:495
void SCIPpropSetInitsol(SCIP_PROP *prop, SCIP_DECL_PROPINITSOL((*propinitsol)))
Definition: prop.c:856
void SCIPpropSetExit(SCIP_PROP *prop, SCIP_DECL_PROPEXIT((*propexit)))
Definition: prop.c:845
void SCIPpropSetPresolPriority(SCIP_PROP *prop, SCIP_SET *set, int presolpriority)
Definition: prop.c:1005
void SCIPpropSetInitpre(SCIP_PROP *prop, SCIP_DECL_PROPINITPRE((*propinitpre)))
Definition: prop.c:878
static SCIP_DECL_PARAMCHGD(paramChgdPropPriority)
Definition: prop.c:71
SCIP_RETCODE SCIPpropPresol(SCIP_PROP *prop, SCIP_SET *set, SCIP_PRESOLTIMING timing, int nrounds, int *nfixedvars, int *naggrvars, int *nchgvartypes, int *nchgbds, int *naddholes, int *ndelconss, int *naddconss, int *nupgdconss, int *nchgcoefs, int *nchgsides, SCIP_RESULT *result)
Definition: prop.c:520
SCIP_RETCODE SCIPpropExec(SCIP_PROP *prop, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool execdelayed, SCIP_Bool instrongbranching, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
Definition: prop.c:646
SCIP_RETCODE SCIPpropInitpre(SCIP_PROP *prop, SCIP_SET *set)
Definition: prop.c:411
void SCIPpropSetInit(SCIP_PROP *prop, SCIP_DECL_PROPINIT((*propinit)))
Definition: prop.c:834
SCIP_RETCODE SCIPpropFree(SCIP_PROP **prop, SCIP_SET *set)
Definition: prop.c:285
SCIP_RETCODE SCIPpropSetPresol(SCIP_PROP *prop, SCIP_DECL_PROPPRESOL((*proppresol)), int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming)
Definition: prop.c:900
void SCIPpropSetCopy(SCIP_PROP *prop, SCIP_DECL_PROPCOPY((*propcopy)))
Definition: prop.c:812
internal methods for propagators
public methods for message output
#define SCIPerrorMessage
Definition: pub_message.h:64
public data structures and miscellaneous methods
SCIP callable library.
SCIP_RETCODE SCIPsetAddIntParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: set.c:3229
SCIP_RETCODE SCIPsetAddBoolParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: set.c:3207
internal methods for global SCIP settings
#define SCIPsetDebugMsg
Definition: set.h:1811
internal methods for problem statistics
int priority
Definition: struct_prop.h:71
SCIP_Bool initialized
Definition: struct_prop.h:101
SCIP_CLOCK * resproptime
Definition: struct_prop.h:69
int nfixedvars
Definition: struct_prop.h:87
SCIP_CLOCK * presoltime
Definition: struct_prop.h:70
int lastnchgvartypes
Definition: struct_prop.h:79
int lastnfixedvars
Definition: struct_prop.h:77
int npresolcalls
Definition: struct_prop.h:97
int lastnchgbds
Definition: struct_prop.h:80
SCIP_Longint ncutoffs
Definition: struct_prop.h:50
SCIP_PROPTIMING timingmask
Definition: struct_prop.h:73
int ndelconss
Definition: struct_prop.h:92
int nchgvartypes
Definition: struct_prop.h:89
SCIP_CLOCK * setuptime
Definition: struct_prop.h:66
int lastnchgsides
Definition: struct_prop.h:86
int lastnaddholes
Definition: struct_prop.h:81
int maxprerounds
Definition: struct_prop.h:76
int lastnupgdconss
Definition: struct_prop.h:84
int lastnaddconss
Definition: struct_prop.h:83
SCIP_CLOCK * sbproptime
Definition: struct_prop.h:68
SCIP_PRESOLTIMING presoltiming
Definition: struct_prop.h:74
int nchgcoefs
Definition: struct_prop.h:95
SCIP_PROPDATA * propdata
Definition: struct_prop.h:65
char * desc
Definition: struct_prop.h:53
int presolpriority
Definition: struct_prop.h:75
SCIP_Bool wasdelayed
Definition: struct_prop.h:99
SCIP_Bool exact
Definition: struct_prop.h:100
char * name
Definition: struct_prop.h:52
SCIP_CLOCK * proptime
Definition: struct_prop.h:67
SCIP_Longint ndomredsfound
Definition: struct_prop.h:51
int nupgdconss
Definition: struct_prop.h:94
int nchgsides
Definition: struct_prop.h:96
SCIP_Bool delay
Definition: struct_prop.h:98
int naggrvars
Definition: struct_prop.h:88
int lastnchgcoefs
Definition: struct_prop.h:85
int lastnaggrvars
Definition: struct_prop.h:78
SCIP_Longint ncalls
Definition: struct_prop.h:48
int naddconss
Definition: struct_prop.h:93
SCIP_Longint nrespropcalls
Definition: struct_prop.h:49
int naddholes
Definition: struct_prop.h:91
int lastndelconss
Definition: struct_prop.h:82
int nchgbds
Definition: struct_prop.h:90
SCIP_Longint nprobholechgs
Definition: struct_stat.h:120
SCIP_Longint nboundchgs
Definition: struct_stat.h:117
SCIP_Longint nholechgs
Definition: struct_stat.h:118
SCIP_Longint nprobboundchgs
Definition: struct_stat.h:119
datastructures for propagators
Definition: heur_padm.c:135
@ SCIP_CLOCKTYPE_DEFAULT
Definition: type_clock.h:43
@ SCIP_BOUNDTYPE_UPPER
Definition: type_lp.h:58
@ SCIP_BOUNDTYPE_LOWER
Definition: type_lp.h:57
enum SCIP_BoundType SCIP_BOUNDTYPE
Definition: type_lp.h:60
struct SCIP_ParamData SCIP_PARAMDATA
Definition: type_paramset.h:87
#define SCIP_DECL_PROPCOPY(x)
Definition: type_prop.h:61
#define SCIP_DECL_PROPEXITPRE(x)
Definition: type_prop.h:114
#define SCIP_DECL_PROPINITSOL(x)
Definition: type_prop.h:129
#define SCIP_DECL_PROPINIT(x)
Definition: type_prop.h:77
#define SCIP_DECL_PROPFREE(x)
Definition: type_prop.h:69
#define SCIP_DECL_PROPEXITSOL(x)
Definition: type_prop.h:141
#define SCIP_DECL_PROPEXIT(x)
Definition: type_prop.h:85
#define SCIP_DECL_PROPPRESOL(x)
Definition: type_prop.h:193
#define SCIP_DECL_PROPINITPRE(x)
Definition: type_prop.h:99
#define SCIP_DECL_PROPRESPROP(x)
Definition: type_prop.h:258
struct SCIP_PropData SCIP_PROPDATA
Definition: type_prop.h:52
#define SCIP_DECL_PROPEXEC(x)
Definition: type_prop.h:217
@ SCIP_DIDNOTRUN
Definition: type_result.h:42
@ SCIP_CUTOFF
Definition: type_result.h:48
@ SCIP_DELAYED
Definition: type_result.h:43
@ SCIP_REDUCEDDOM
Definition: type_result.h:51
@ SCIP_DIDNOTFIND
Definition: type_result.h:44
@ SCIP_UNBOUNDED
Definition: type_result.h:47
@ SCIP_SUCCESS
Definition: type_result.h:58
@ SCIP_DELAYNODE
Definition: type_result.h:59
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:61
@ SCIP_INVALIDRESULT
Definition: type_retcode.h:53
@ SCIP_PLUGINNOTFOUND
Definition: type_retcode.h:54
@ SCIP_PARAMETERWRONGVAL
Definition: type_retcode.h:57
@ SCIP_OKAY
Definition: type_retcode.h:42
@ SCIP_INVALIDCALL
Definition: type_retcode.h:51
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
#define SCIP_PRESOLTIMING_MAX
Definition: type_timing.h:59
#define SCIP_PROPTIMING_NONE
Definition: type_timing.h:65
#define SCIP_PRESOLTIMING_FINAL
Definition: type_timing.h:55
unsigned int SCIP_PROPTIMING
Definition: type_timing.h:75
#define SCIP_PRESOLTIMING_MEDIUM
Definition: type_timing.h:53
unsigned int SCIP_PRESOLTIMING
Definition: type_timing.h:61
#define SCIP_PROPTIMING_AFTERLPLOOP
Definition: type_timing.h:68
#define SCIP_PRESOLTIMING_FAST
Definition: type_timing.h:52
#define SCIP_PRESOLTIMING_EXHAUSTIVE
Definition: type_timing.h:54
#define SCIP_PROPTIMING_BEFORELP
Definition: type_timing.h:66
#define SCIP_PROPTIMING_ALWAYS
Definition: type_timing.h:73
#define SCIP_PRESOLTIMING_NONE
Definition: type_timing.h:51
#define SCIP_PROPTIMING_DURINGLPLOOP
Definition: type_timing.h:67
internal methods for problem variables