Scippy

SCIP

Solving Constraint Integer Programs

presol.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 presol.c
26 * @ingroup OTHER_CFILES
27 * @brief methods for presolvers
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 *
31 * @todo add maxrounds parameter for single timings, count number of runs of a presolver with given timing
32 */
33
34/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
35
36#include <assert.h>
37#include <string.h>
38
39#include "scip/def.h"
41#include "scip/set.h"
42#include "scip/clock.h"
43#include "scip/paramset.h"
44#include "scip/scip.h"
45#include "scip/pub_misc.h"
46#include "scip/presol.h"
47
48#include "scip/struct_presol.h"
49
50
51
52/*
53 * presolver methods
54 */
55
56/** compares two presolvers w. r. to their priority */
57SCIP_DECL_SORTPTRCOMP(SCIPpresolComp)
58{ /*lint --e{715}*/
59 return ((SCIP_PRESOL*)elem2)->priority - ((SCIP_PRESOL*)elem1)->priority;
60}
61
62/** comparison method for sorting presolvers w.r.t. to their name */
63SCIP_DECL_SORTPTRCOMP(SCIPpresolCompName)
64{
65 return strcmp(SCIPpresolGetName((SCIP_PRESOL*)elem1), SCIPpresolGetName((SCIP_PRESOL*)elem2));
66}
67
68/** method to call, when the priority of a presolver was changed */
69static
70SCIP_DECL_PARAMCHGD(paramChgdPresolPriority)
71{ /*lint --e{715}*/
72 SCIP_PARAMDATA* paramdata;
73
74 paramdata = SCIPparamGetData(param);
75 assert(paramdata != NULL);
76
77 /* use SCIPsetPresolPriority() to mark the presols unsorted */
78 SCIP_CALL( SCIPsetPresolPriority(scip, (SCIP_PRESOL*)paramdata, SCIPparamGetInt(param)) ); /*lint !e740*/
79
80 return SCIP_OKAY;
81}
82
83/** copies the given presolver to a new scip */
85 SCIP_PRESOL* presol, /**< presolver */
86 SCIP_SET* set /**< SCIP_SET of SCIP to copy to */
87 )
88{
89 assert(presol != NULL);
90 assert(set != NULL);
91 assert(set->scip != NULL);
92
93 if( presol->presolcopy != NULL )
94 {
95 SCIPsetDebugMsg(set, "including presolver %s in subscip %p\n", SCIPpresolGetName(presol), (void*)set->scip);
96 SCIP_CALL( presol->presolcopy(set->scip, presol) );
97 }
98 return SCIP_OKAY;
99}
100
101/** internal method for creating a presolver */
102static
104 SCIP_PRESOL** presol, /**< pointer to store presolver */
105 SCIP_SET* set, /**< global SCIP settings */
106 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
107 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
108 const char* name, /**< name of presolver */
109 const char* desc, /**< description of presolver */
110 int priority, /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */
111 int maxrounds, /**< maximal number of presolving rounds the presolver participates in (-1: no limit) */
112 SCIP_PRESOLTIMING timing, /**< timing mask of the presolver */
113 SCIP_DECL_PRESOLCOPY ((*presolcopy)), /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
114 SCIP_DECL_PRESOLFREE ((*presolfree)), /**< destructor of presolver to free user data (called when SCIP is exiting) */
115 SCIP_DECL_PRESOLINIT ((*presolinit)), /**< initialization method of presolver (called after problem was transformed) */
116 SCIP_DECL_PRESOLEXIT ((*presolexit)), /**< deinitialization method of presolver (called before transformed problem is freed) */
117 SCIP_DECL_PRESOLINITPRE((*presolinitpre)),/**< presolving initialization method of presolver (called when presolving is about to begin) */
118 SCIP_DECL_PRESOLEXITPRE((*presolexitpre)),/**< presolving deinitialization method of presolver (called after presolving has been finished) */
119 SCIP_DECL_PRESOLEXEC ((*presolexec)), /**< execution method of presolver */
120 SCIP_PRESOLDATA* presoldata /**< presolver data */
121 )
122{
124 char paramdesc[SCIP_MAXSTRLEN];
125
126 assert(presol != NULL);
127 assert(name != NULL);
128 assert(desc != NULL);
129
130 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
131 * error message
132 */
133 if( timing < SCIP_PRESOLTIMING_NONE || timing > SCIP_PRESOLTIMING_MAX )
134 {
135 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
136 "'SCIP_PRESOLTIMING' for <%s> presolver instead.\n", name);
137
139 }
140
141 SCIP_ALLOC( BMSallocMemory(presol) );
142 BMSclearMemory(*presol);
143
144 SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->name, name, strlen(name)+1) );
145 SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->desc, desc, strlen(desc)+1) );
146 (*presol)->presolcopy = presolcopy;
147 (*presol)->presolfree = presolfree;
148 (*presol)->presolinit = presolinit;
149 (*presol)->presolexit = presolexit;
150 (*presol)->presolinitpre = presolinitpre;
151 (*presol)->presolexitpre = presolexitpre;
152 (*presol)->presolexec = presolexec;
153 (*presol)->presoldata = presoldata;
154 SCIP_CALL( SCIPclockCreate(&(*presol)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
155 SCIP_CALL( SCIPclockCreate(&(*presol)->presolclock, SCIP_CLOCKTYPE_DEFAULT) );
156 (*presol)->initialized = FALSE;
157 (*presol)->exact = FALSE;
158
159 /* add parameters */
160 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/priority", name);
161 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of presolver <%s>", name);
162 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
163 &(*presol)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4,
164 paramChgdPresolPriority, (SCIP_PARAMDATA*)(*presol)) ); /*lint !e740*/
165
166 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/maxrounds", name);
167 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
168 "maximal number of presolving rounds the presolver participates in (-1: no limit)",
169 &(*presol)->maxrounds, FALSE, maxrounds, -1, INT_MAX, NULL, NULL) ); /*lint !e740*/
170
171 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/timing", name);
172 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of presolver <%s> (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
174 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
175 (int*)&(*presol)->timing, TRUE, (int)timing, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740*/
176
177 return SCIP_OKAY;
178}
179
180/** creates a presolver */
182 SCIP_PRESOL** presol, /**< pointer to store presolver */
183 SCIP_SET* set, /**< global SCIP settings */
184 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
185 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
186 const char* name, /**< name of presolver */
187 const char* desc, /**< description of presolver */
188 int priority, /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */
189 int maxrounds, /**< maximal number of presolving rounds the presolver participates in (-1: no limit) */
190 SCIP_PRESOLTIMING timing, /**< timing mask of the presolver */
191 SCIP_DECL_PRESOLCOPY ((*presolcopy)), /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
192 SCIP_DECL_PRESOLFREE ((*presolfree)), /**< destructor of presolver to free user data (called when SCIP is exiting) */
193 SCIP_DECL_PRESOLINIT ((*presolinit)), /**< initialization method of presolver (called after problem was transformed) */
194 SCIP_DECL_PRESOLEXIT ((*presolexit)), /**< deinitialization method of presolver (called before transformed problem is freed) */
195 SCIP_DECL_PRESOLINITPRE((*presolinitpre)),/**< presolving initialization method of presolver (called when presolving is about to begin) */
196 SCIP_DECL_PRESOLEXITPRE((*presolexitpre)),/**< presolving deinitialization method of presolver (called after presolving has been finished) */
197 SCIP_DECL_PRESOLEXEC ((*presolexec)), /**< execution method of presolver */
198 SCIP_PRESOLDATA* presoldata /**< presolver data */
199 )
200{
201 assert(presol != NULL);
202 assert(name != NULL);
203 assert(desc != NULL);
204
205 SCIP_CALL_FINALLY( doPresolCreate(presol, set, messagehdlr, blkmem, name, desc, priority, maxrounds, timing,
206 presolcopy, presolfree, presolinit, presolexit, presolinitpre, presolexitpre, presolexec, presoldata),
207 (void) SCIPpresolFree(presol, set) );
208
209 return SCIP_OKAY;
210}
211
212/** frees memory of presolver */
214 SCIP_PRESOL** presol, /**< pointer to presolver data structure */
215 SCIP_SET* set /**< global SCIP settings */
216 )
217{
218 assert(presol != NULL);
219 if( *presol == NULL )
220 return SCIP_OKAY;
221 assert(!(*presol)->initialized);
222 assert(set != NULL);
223
224 /* call destructor of presolver */
225 if( (*presol)->presolfree != NULL )
226 {
227 SCIP_CALL( (*presol)->presolfree(set->scip, *presol) );
228 }
229
230 SCIPclockFree(&(*presol)->presolclock);
231 SCIPclockFree(&(*presol)->setuptime);
232 BMSfreeMemoryArrayNull(&(*presol)->name);
233 BMSfreeMemoryArrayNull(&(*presol)->desc);
234 BMSfreeMemory(presol);
235
236 return SCIP_OKAY;
237}
238
239/** initializes presolver */
241 SCIP_PRESOL* presol, /**< presolver */
242 SCIP_SET* set /**< global SCIP settings */
243 )
244{
245 assert(presol != NULL);
246 assert(set != NULL);
247
248 if( presol->initialized )
249 {
250 SCIPerrorMessage("presolver <%s> already initialized\n", presol->name);
251 return SCIP_INVALIDCALL;
252 }
253
254 if( set->misc_resetstat )
255 {
256 SCIPclockReset(presol->setuptime);
258
259 presol->lastnfixedvars = 0;
260 presol->lastnaggrvars = 0;
261 presol->lastnchgvartypes = 0;
262 presol->lastnchgbds = 0;
263 presol->lastnaddholes = 0;
264 presol->lastndelconss = 0;
265 presol->lastnaddconss = 0;
266 presol->lastnupgdconss = 0;
267 presol->lastnchgcoefs = 0;
268 presol->lastnchgsides = 0;
269 presol->nfixedvars = 0;
270 presol->naggrvars = 0;
271 presol->nchgvartypes = 0;
272 presol->nchgbds = 0;
273 presol->naddholes = 0;
274 presol->ndelconss = 0;
275 presol->naddconss = 0;
276 presol->nupgdconss = 0;
277 presol->nchgcoefs = 0;
278 presol->nchgsides = 0;
279 presol->ncalls = 0;
280 }
281
282 /* call initialization method of presolver */
283 if( presol->presolinit != NULL )
284 {
285 /* start timing */
286 SCIPclockStart(presol->setuptime, set);
287
288 SCIP_CALL( presol->presolinit(set->scip, presol) );
289
290 /* stop timing */
291 SCIPclockStop(presol->setuptime, set);
292 }
293 presol->initialized = TRUE;
294
295 return SCIP_OKAY;
296}
297
298/** deinitializes presolver */
300 SCIP_PRESOL* presol, /**< presolver */
301 SCIP_SET* set /**< global SCIP settings */
302 )
303{
304 assert(presol != NULL);
305 assert(set != NULL);
306
307 if( !presol->initialized )
308 {
309 SCIPerrorMessage("presolver <%s> not initialized\n", presol->name);
310 return SCIP_INVALIDCALL;
311 }
312
313 /* call deinitialization method of presolver */
314 if( presol->presolexit != NULL )
315 {
316 /* start timing */
317 SCIPclockStart(presol->setuptime, set);
318
319 SCIP_CALL( presol->presolexit(set->scip, presol) );
320
321 /* stop timing */
322 SCIPclockStop(presol->setuptime, set);
323 }
324 presol->initialized = FALSE;
325
326 return SCIP_OKAY;
327}
328
329/** informs presolver that the presolving process is being started */
331 SCIP_PRESOL* presol, /**< presolver */
332 SCIP_SET* set /**< global SCIP settings */
333 )
334{
335 assert(presol != NULL);
336 assert(set != NULL);
337
338 presol->lastnfixedvars = 0;
339 presol->lastnaggrvars = 0;
340 presol->lastnchgvartypes = 0;
341 presol->lastnchgbds = 0;
342 presol->lastnaddholes = 0;
343 presol->lastndelconss = 0;
344 presol->lastnaddconss = 0;
345 presol->lastnupgdconss = 0;
346 presol->lastnchgcoefs = 0;
347 presol->lastnchgsides = 0;
348
349 /* call presolving initialization method of presolver */
350 if( presol->presolinitpre != NULL )
351 {
352 /* start timing */
353 SCIPclockStart(presol->setuptime, set);
354
355 SCIP_CALL( presol->presolinitpre(set->scip, presol) );
356
357 /* stop timing */
358 SCIPclockStop(presol->setuptime, set);
359 }
360
361 return SCIP_OKAY;
362}
363
364/** informs presolver that the presolving process is finished */
366 SCIP_PRESOL* presol, /**< presolver */
367 SCIP_SET* set /**< global SCIP settings */
368 )
369{
370 assert(presol != NULL);
371 assert(set != NULL);
372
373 /* call presolving deinitialization method of presolver */
374 if( presol->presolexitpre != NULL )
375 {
376 /* start timing */
377 SCIPclockStart(presol->setuptime, set);
378
379 SCIP_CALL( presol->presolexitpre(set->scip, presol) );
380
381 /* stop timing */
382 SCIPclockStop(presol->setuptime, set);
383 }
384
385 return SCIP_OKAY;
386}
387
388/** executes presolver */
390 SCIP_PRESOL* presol, /**< presolver */
391 SCIP_SET* set, /**< global SCIP settings */
392 SCIP_PRESOLTIMING timing, /**< current presolving timing */
393 int nrounds, /**< number of presolving rounds already done */
394 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
395 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
396 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
397 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
398 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
399 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
400 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
401 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
402 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
403 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
404 SCIP_RESULT* result /**< pointer to store the result of the callback method */
405 )
406{
407 int nnewfixedvars;
408 int nnewaggrvars;
409 int nnewchgvartypes;
410 int nnewchgbds;
411 int nnewaddholes;
412 int nnewdelconss;
413 int nnewaddconss;
414 int nnewupgdconss;
415 int nnewchgcoefs;
416 int nnewchgsides;
417
418 assert(presol != NULL);
419 assert(presol->presolexec != NULL);
420 assert(set != NULL);
421 assert(nfixedvars != NULL);
422 assert(naggrvars != NULL);
423 assert(nchgvartypes != NULL);
424 assert(nchgbds != NULL);
425 assert(naddholes != NULL);
426 assert(ndelconss != NULL);
427 assert(naddconss != NULL);
428 assert(nupgdconss != NULL);
429 assert(nchgcoefs != NULL);
430 assert(nchgsides != NULL);
431 assert(result != NULL);
432
433 *result = SCIP_DIDNOTRUN;
434
435 /* do not execute if in exact solving mode and presolver is not safe */
436 if( set->exact_enable && !presol->exact )
437 return SCIP_OKAY;
438
439 /* check number of presolving rounds */
440 if( presol->maxrounds >= 0 && presol->ncalls >= presol->maxrounds )
441 return SCIP_OKAY;
442
443 /* calculate the number of changes since last call */
444 nnewfixedvars = *nfixedvars - presol->lastnfixedvars;
445 nnewaggrvars = *naggrvars - presol->lastnaggrvars;
446 nnewchgvartypes = *nchgvartypes - presol->lastnchgvartypes;
447 nnewchgbds = *nchgbds - presol->lastnchgbds;
448 nnewaddholes = *naddholes - presol->lastnaddholes;
449 nnewdelconss = *ndelconss - presol->lastndelconss;
450 nnewaddconss = *naddconss - presol->lastnaddconss;
451 nnewupgdconss = *nupgdconss - presol->lastnupgdconss;
452 nnewchgcoefs = *nchgcoefs - presol->lastnchgcoefs;
453 nnewchgsides = *nchgsides - presol->lastnchgsides;
454
455 /* remember the number of changes prior to the call of the presolver */
456 presol->lastnfixedvars = *nfixedvars;
457 presol->lastnaggrvars = *naggrvars;
458 presol->lastnchgvartypes = *nchgvartypes;
459 presol->lastnchgbds = *nchgbds;
460 presol->lastnaddholes = *naddholes;
461 presol->lastndelconss = *ndelconss;
462 presol->lastnaddconss = *naddconss;
463 presol->lastnupgdconss = *nupgdconss;
464 presol->lastnchgcoefs = *nchgcoefs;
465 presol->lastnchgsides = *nchgsides;
466
467 /* check, if presolver should be called with the current timing */
468 if( timing & presol->timing )
469 {
470 SCIPsetDebugMsg(set, "calling presolver <%s> with timing %u\n", presol->name, timing);
471
472 /* start timing */
474
475 /* call external method */
476 SCIP_CALL( presol->presolexec(set->scip, presol, nrounds, timing,
477 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewaddholes,
478 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
479 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
480 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
481
482 /* stop timing */
483 SCIPclockStop(presol->presolclock, set);
484
485 /* add/count the new changes */
486 assert( *nfixedvars - presol->lastnfixedvars >= 0 );
487 assert( *naggrvars - presol->lastnaggrvars >= 0 );
488 assert( *nchgvartypes - presol->lastnchgvartypes >= 0 );
489 assert( *nchgbds - presol->lastnchgbds >= 0 );
490 assert( *naddholes - presol->lastnaddholes >= 0 );
491 assert( *ndelconss - presol->lastndelconss >= 0 );
492 assert( *naddconss - presol->lastnaddconss >= 0 );
493 assert( *nupgdconss - presol->lastnupgdconss >= 0 );
494 assert( *nchgcoefs - presol->lastnchgcoefs >= 0 );
495 assert( *nchgsides - presol->lastnchgsides >= 0 );
496
497 presol->nfixedvars += *nfixedvars - presol->lastnfixedvars;
498 presol->naggrvars += *naggrvars - presol->lastnaggrvars;
499 presol->nchgvartypes += *nchgvartypes - presol->lastnchgvartypes;
500 presol->nchgbds += *nchgbds - presol->lastnchgbds;
501 presol->naddholes += *naddholes - presol->lastnaddholes;
502 presol->ndelconss += *ndelconss - presol->lastndelconss;
503 presol->naddconss += *naddconss - presol->lastnaddconss;
504 presol->nupgdconss += *nupgdconss - presol->lastnupgdconss;
505 presol->nchgcoefs += *nchgcoefs - presol->lastnchgcoefs;
506 presol->nchgsides += *nchgsides - presol->lastnchgsides;
507
508 /* check result code of callback method */
509 if( *result != SCIP_CUTOFF
510 && *result != SCIP_UNBOUNDED
511 && *result != SCIP_SUCCESS
512 && *result != SCIP_DIDNOTFIND
513 && *result != SCIP_DIDNOTRUN )
514 {
515 SCIPerrorMessage("presolver <%s> returned invalid result <%d>\n", presol->name, *result);
516 return SCIP_INVALIDRESULT;
517 }
518
519 /* increase the number of calls, if the presolver tried to find reductions */
520 if( *result != SCIP_DIDNOTRUN )
521 ++(presol->ncalls);
522 }
523
524 return SCIP_OKAY;
525}
526
527/** gets user data of presolver */
529 SCIP_PRESOL* presol /**< presolver */
530 )
531{
532 assert(presol != NULL);
533
534 return presol->presoldata;
535}
536
537/** sets user data of presolver; user has to free old data in advance! */
539 SCIP_PRESOL* presol, /**< presolver */
540 SCIP_PRESOLDATA* presoldata /**< new presolver user data */
541 )
542{
543 assert(presol != NULL);
544
545 presol->presoldata = presoldata;
546}
547
548/** sets copy method of presolver */
550 SCIP_PRESOL* presol, /**< presolver */
551 SCIP_DECL_PRESOLCOPY ((*presolcopy)) /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */
552 )
553{
554 assert(presol != NULL);
555
556 presol->presolcopy = presolcopy;
557}
558
559/** sets destructor method of presolver */
561 SCIP_PRESOL* presol, /**< presolver */
562 SCIP_DECL_PRESOLFREE ((*presolfree)) /**< destructor of presolver */
563 )
564{
565 assert(presol != NULL);
566
567 presol->presolfree = presolfree;
568}
569
570/** sets initialization method of presolver */
572 SCIP_PRESOL* presol, /**< presolver */
573 SCIP_DECL_PRESOLINIT ((*presolinit)) /**< initialize presolver */
574 )
575{
576 assert(presol != NULL);
577
578 presol->presolinit = presolinit;
579}
580
581/** sets deinitialization method of presolver */
583 SCIP_PRESOL* presol, /**< presolver */
584 SCIP_DECL_PRESOLEXIT ((*presolexit)) /**< deinitialize presolver */
585 )
586{
587 assert(presol != NULL);
588
589 presol->presolexit = presolexit;
590}
591
592/** sets solving process initialization method of presolver */
594 SCIP_PRESOL* presol, /**< presolver */
595 SCIP_DECL_PRESOLINITPRE ((*presolinitpre))/**< solving process initialization method of presolver */
596 )
597{
598 assert(presol != NULL);
599
600 presol->presolinitpre = presolinitpre;
601}
602
603/** sets solving process deinitialization method of presolver */
605 SCIP_PRESOL* presol, /**< presolver */
606 SCIP_DECL_PRESOLEXITPRE ((*presolexitpre))/**< solving process deinitialization method of presolver */
607 )
608{
609 assert(presol != NULL);
610
611 presol->presolexitpre = presolexitpre;
612}
613
614/** marks the presolver as safe to use in exact solving mode */
616 SCIP_PRESOL* presol /**< presolver */
617 )
618{
619 assert(presol != NULL);
620
621 presol->exact = TRUE;
622}
623
624/** gets name of presolver */
626 SCIP_PRESOL* presol /**< presolver */
627 )
628{
629 assert(presol != NULL);
630
631 return presol->name;
632}
633
634/** gets description of presolver */
636 SCIP_PRESOL* presol /**< presolver */
637 )
638{
639 assert(presol != NULL);
640
641 return presol->desc;
642}
643
644/** gets priority of presolver */
646 SCIP_PRESOL* presol /**< presolver */
647 )
648{
649 assert(presol != NULL);
650
651 return presol->priority;
652}
653
654/** gets round limit of presolver */
656 SCIP_PRESOL* presol /**< presolver */
657 )
658{
659 assert(presol != NULL);
660
661 return presol->maxrounds;
662}
663
664/** sets priority of presolver */
666 SCIP_PRESOL* presol, /**< presolver */
667 SCIP_SET* set, /**< global SCIP settings */
668 int priority /**< new priority of the presolver */
669 )
670{
671 assert(presol != NULL);
672 assert(set != NULL);
673
674 presol->priority = priority;
675 set->presolssorted = FALSE;
676}
677
678/** gets the timing mask of the presolver */
680 SCIP_PRESOL* presol /**< presolver */
681 )
682{
683 assert(presol != NULL);
684
685 return presol->timing;
686}
687
688/** sets the timing mask of the presolver */
690 SCIP_PRESOL* presol, /**< presolver */
691 SCIP_PRESOLTIMING timing /**< timing mask of the presolver */
692 )
693{
694 assert(presol != NULL);
695
696 presol->timing = timing;
697}
698
699/** is presolver initialized? */
701 SCIP_PRESOL* presol /**< presolver */
702 )
703{
704 assert(presol != NULL);
705
706 return presol->initialized;
707}
708
709/** enables or disables all clocks of \p presol, depending on the value of the flag */
711 SCIP_PRESOL* presol, /**< the presolver for which all clocks should be enabled or disabled */
712 SCIP_Bool enable /**< should the clocks of the presolver be enabled? */
713 )
714{
715 assert(presol != NULL);
716
717 SCIPclockEnableOrDisable(presol->setuptime, enable);
718 SCIPclockEnableOrDisable(presol->presolclock, enable);
719}
720
721/** gets time in seconds used in this presolver for setting up for next stages */
723 SCIP_PRESOL* presol /**< presolver */
724 )
725{
726 assert(presol != NULL);
727
728 return SCIPclockGetTime(presol->setuptime);
729}
730
731/** gets time in seconds used in this presolver */
733 SCIP_PRESOL* presol /**< presolver */
734 )
735{
736 assert(presol != NULL);
737
738 return SCIPclockGetTime(presol->presolclock);
739}
740
741/** gets number of variables fixed in presolver */
743 SCIP_PRESOL* presol /**< presolver */
744 )
745{
746 assert(presol != NULL);
747
748 return presol->nfixedvars;
749}
750
751/** gets number of variables aggregated in presolver */
753 SCIP_PRESOL* presol /**< presolver */
754 )
755{
756 assert(presol != NULL);
757
758 return presol->naggrvars;
759}
760
761/** gets number of variable types changed in presolver */
763 SCIP_PRESOL* presol /**< presolver */
764 )
765{
766 assert(presol != NULL);
767
768 return presol->nchgvartypes;
769}
770
771/** gets number of bounds changed in presolver */
773 SCIP_PRESOL* presol /**< presolver */
774 )
775{
776 assert(presol != NULL);
777
778 return presol->nchgbds;
779}
780
781/** gets number of holes added to domains of variables in presolver */
783 SCIP_PRESOL* presol /**< presolver */
784 )
785{
786 assert(presol != NULL);
787
788 return presol->naddholes;
789}
790
791/** gets number of constraints deleted in presolver */
793 SCIP_PRESOL* presol /**< presolver */
794 )
795{
796 assert(presol != NULL);
797
798 return presol->ndelconss;
799}
800
801/** gets number of constraints added in presolver */
803 SCIP_PRESOL* presol /**< presolver */
804 )
805{
806 assert(presol != NULL);
807
808 return presol->naddconss;
809}
810
811/** gets number of constraints upgraded in presolver */
813 SCIP_PRESOL* presol /**< presolver */
814 )
815{
816 assert(presol != NULL);
817
818 return presol->nupgdconss;
819}
820
821/** gets number of coefficients changed in presolver */
823 SCIP_PRESOL* presol /**< presolver */
824 )
825{
826 assert(presol != NULL);
827
828 return presol->nchgcoefs;
829}
830
831/** gets number of constraint sides changed in presolver */
833 SCIP_PRESOL* presol /**< presolver */
834 )
835{
836 assert(presol != NULL);
837
838 return presol->nchgsides;
839}
840
841/** gets number of times the presolver was called and tried to find reductions */
843 SCIP_PRESOL* presol /**< presolver */
844 )
845{
846 assert(presol != NULL);
847
848 return presol->ncalls;
849}
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_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_Real SCIPpresolGetSetupTime(SCIP_PRESOL *presol)
Definition: presol.c:722
int SCIPpresolGetNAggrVars(SCIP_PRESOL *presol)
Definition: presol.c:752
SCIP_Bool SCIPpresolIsInitialized(SCIP_PRESOL *presol)
Definition: presol.c:700
int SCIPpresolGetNUpgdConss(SCIP_PRESOL *presol)
Definition: presol.c:812
int SCIPpresolGetNCalls(SCIP_PRESOL *presol)
Definition: presol.c:842
int SCIPpresolGetNDelConss(SCIP_PRESOL *presol)
Definition: presol.c:792
int SCIPpresolGetNChgCoefs(SCIP_PRESOL *presol)
Definition: presol.c:822
void SCIPpresolSetTiming(SCIP_PRESOL *presol, SCIP_PRESOLTIMING timing)
Definition: presol.c:689
int SCIPpresolGetNAddHoles(SCIP_PRESOL *presol)
Definition: presol.c:782
void SCIPpresolMarkExact(SCIP_PRESOL *presol)
Definition: presol.c:615
SCIP_DECL_SORTPTRCOMP(SCIPpresolComp)
Definition: presol.c:57
void SCIPpresolSetData(SCIP_PRESOL *presol, SCIP_PRESOLDATA *presoldata)
Definition: presol.c:538
SCIP_Real SCIPpresolGetTime(SCIP_PRESOL *presol)
Definition: presol.c:732
int SCIPpresolGetNChgVarTypes(SCIP_PRESOL *presol)
Definition: presol.c:762
SCIP_PRESOLDATA * SCIPpresolGetData(SCIP_PRESOL *presol)
Definition: presol.c:528
int SCIPpresolGetPriority(SCIP_PRESOL *presol)
Definition: presol.c:645
int SCIPpresolGetNChgSides(SCIP_PRESOL *presol)
Definition: presol.c:832
int SCIPpresolGetNFixedVars(SCIP_PRESOL *presol)
Definition: presol.c:742
const char * SCIPpresolGetDesc(SCIP_PRESOL *presol)
Definition: presol.c:635
SCIP_RETCODE SCIPsetPresolPriority(SCIP *scip, SCIP_PRESOL *presol, int priority)
Definition: scip_presol.c:281
int SCIPpresolGetNChgBds(SCIP_PRESOL *presol)
Definition: presol.c:772
int SCIPpresolGetNAddConss(SCIP_PRESOL *presol)
Definition: presol.c:802
int SCIPpresolGetMaxrounds(SCIP_PRESOL *presol)
Definition: presol.c:655
SCIP_PRESOLTIMING SCIPpresolGetTiming(SCIP_PRESOL *presol)
Definition: presol.c:679
const char * SCIPpresolGetName(SCIP_PRESOL *presol)
Definition: presol.c:625
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10827
static const char * paramname[]
Definition: lpi_msk.c:5172
memory allocation routines
#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
static SCIP_RETCODE doPresolCreate(SCIP_PRESOL **presol, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLCOPY((*presolcopy)), SCIP_DECL_PRESOLFREE((*presolfree)), SCIP_DECL_PRESOLINIT((*presolinit)), SCIP_DECL_PRESOLEXIT((*presolexit)), SCIP_DECL_PRESOLINITPRE((*presolinitpre)), SCIP_DECL_PRESOLEXITPRE((*presolexitpre)), SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
Definition: presol.c:103
void SCIPpresolSetExitpre(SCIP_PRESOL *presol, SCIP_DECL_PRESOLEXITPRE((*presolexitpre)))
Definition: presol.c:604
SCIP_RETCODE SCIPpresolFree(SCIP_PRESOL **presol, SCIP_SET *set)
Definition: presol.c:213
void SCIPpresolEnableOrDisableClocks(SCIP_PRESOL *presol, SCIP_Bool enable)
Definition: presol.c:710
void SCIPpresolSetPriority(SCIP_PRESOL *presol, SCIP_SET *set, int priority)
Definition: presol.c:665
SCIP_RETCODE SCIPpresolExitpre(SCIP_PRESOL *presol, SCIP_SET *set)
Definition: presol.c:365
void SCIPpresolSetExit(SCIP_PRESOL *presol, SCIP_DECL_PRESOLEXIT((*presolexit)))
Definition: presol.c:582
SCIP_RETCODE SCIPpresolExit(SCIP_PRESOL *presol, SCIP_SET *set)
Definition: presol.c:299
void SCIPpresolSetInitpre(SCIP_PRESOL *presol, SCIP_DECL_PRESOLINITPRE((*presolinitpre)))
Definition: presol.c:593
SCIP_RETCODE SCIPpresolCreate(SCIP_PRESOL **presol, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int priority, int maxrounds, SCIP_PRESOLTIMING timing, SCIP_DECL_PRESOLCOPY((*presolcopy)), SCIP_DECL_PRESOLFREE((*presolfree)), SCIP_DECL_PRESOLINIT((*presolinit)), SCIP_DECL_PRESOLEXIT((*presolexit)), SCIP_DECL_PRESOLINITPRE((*presolinitpre)), SCIP_DECL_PRESOLEXITPRE((*presolexitpre)), SCIP_DECL_PRESOLEXEC((*presolexec)), SCIP_PRESOLDATA *presoldata)
Definition: presol.c:181
void SCIPpresolSetCopy(SCIP_PRESOL *presol, SCIP_DECL_PRESOLCOPY((*presolcopy)))
Definition: presol.c:549
static SCIP_DECL_PARAMCHGD(paramChgdPresolPriority)
Definition: presol.c:70
SCIP_RETCODE SCIPpresolInit(SCIP_PRESOL *presol, SCIP_SET *set)
Definition: presol.c:240
SCIP_RETCODE SCIPpresolExec(SCIP_PRESOL *presol, 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: presol.c:389
SCIP_RETCODE SCIPpresolCopyInclude(SCIP_PRESOL *presol, SCIP_SET *set)
Definition: presol.c:84
void SCIPpresolSetFree(SCIP_PRESOL *presol, SCIP_DECL_PRESOLFREE((*presolfree)))
Definition: presol.c:560
void SCIPpresolSetInit(SCIP_PRESOL *presol, SCIP_DECL_PRESOLINIT((*presolinit)))
Definition: presol.c:571
SCIP_RETCODE SCIPpresolInitpre(SCIP_PRESOL *presol, SCIP_SET *set)
Definition: presol.c:330
internal methods for presolvers
#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
internal methods for global SCIP settings
#define SCIPsetDebugMsg
Definition: set.h:1811
SCIP_CLOCK * setuptime
Definition: struct_presol.h:58
int lastnfixedvars
Definition: struct_presol.h:62
int lastnchgvartypes
Definition: struct_presol.h:64
int lastnupgdconss
Definition: struct_presol.h:69
SCIP_Bool initialized
Definition: struct_presol.h:83
SCIP_CLOCK * presolclock
Definition: struct_presol.h:59
SCIP_PRESOLTIMING timing
Definition: struct_presol.h:85
SCIP_Bool exact
Definition: struct_presol.h:84
SCIP_PRESOLDATA * presoldata
Definition: struct_presol.h:57
datastructures for presolvers
Definition: heur_padm.c:135
@ SCIP_CLOCKTYPE_DEFAULT
Definition: type_clock.h:43
struct SCIP_ParamData SCIP_PARAMDATA
Definition: type_paramset.h:87
#define SCIP_DECL_PRESOLCOPY(x)
Definition: type_presol.h:60
struct SCIP_PresolData SCIP_PRESOLDATA
Definition: type_presol.h:51
#define SCIP_DECL_PRESOLFREE(x)
Definition: type_presol.h:68
#define SCIP_DECL_PRESOLINITPRE(x)
Definition: type_presol.h:98
#define SCIP_DECL_PRESOLEXITPRE(x)
Definition: type_presol.h:116
#define SCIP_DECL_PRESOLINIT(x)
Definition: type_presol.h:76
#define SCIP_DECL_PRESOLEXIT(x)
Definition: type_presol.h:84
#define SCIP_DECL_PRESOLEXEC(x)
Definition: type_presol.h:167
@ SCIP_DIDNOTRUN
Definition: type_result.h:42
@ SCIP_CUTOFF
Definition: type_result.h:48
@ SCIP_DIDNOTFIND
Definition: type_result.h:44
@ SCIP_UNBOUNDED
Definition: type_result.h:47
@ SCIP_SUCCESS
Definition: type_result.h:58
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:61
@ SCIP_INVALIDRESULT
Definition: type_retcode.h:53
@ 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_PRESOLTIMING_FINAL
Definition: type_timing.h:55
#define SCIP_PRESOLTIMING_MEDIUM
Definition: type_timing.h:53
unsigned int SCIP_PRESOLTIMING
Definition: type_timing.h:61
#define SCIP_PRESOLTIMING_FAST
Definition: type_timing.h:52
#define SCIP_PRESOLTIMING_EXHAUSTIVE
Definition: type_timing.h:54