SCIP Doxygen Documentation
Loading...
Searching...
No Matches
cons.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-2026 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 cons.c
26 * @ingroup OTHER_CFILES
27 * @brief methods for constraints and constraint handlers
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
36#include "scip/def.h"
37#include "scip/set.h"
38#include "scip/stat.h"
39#include "scip/clock.h"
40#include "scip/var.h"
41#include "scip/prob.h"
42#include "scip/tree.h"
43#include "scip/scip.h"
44#include "scip/sepastore.h"
45#include "scip/cons.h"
46#include "scip/branch.h"
47#include "scip/reopt.h"
48#include "scip/pub_misc.h"
49
50#ifndef NDEBUG
51#include "scip/struct_cons.h"
52#endif
53
54
55#define AGERESETAVG_INIT 1000.0 /**< initial value of the exponentially decaying weighted sum for ages */
56#define AGERESETAVG_MIN 100.0 /**< minimal value to use for weighted sum of ages */
57#define AGERESETAVG_DECAY 0.0005 /**< weight of a new addend in the exponentially decyaing sum */
58#define AGERESETAVG_AGELIMIT 2.0 /**< in dynamic setting, a constraint is deleted if its age exceeds the
59 * average reset age by this factor */
60#define AGERESETAVG_OBSOLETEAGE 1.8 /**< in dynamic setting, a constraint is marked obsolete if its age exceeds the
61 * average reset age by this factor */
62
63
64/* #define CHECKCONSARRAYS */
65
66
67/*
68 * dynamic memory arrays
69 */
70
71
72/** resizes conss array to be able to store at least num constraints */
73static
75 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
76 SCIP_SET* set, /**< global SCIP settings */
77 int num /**< minimal number of slots in array */
78 )
79{
80 assert(conshdlr != NULL);
81 assert(set != NULL);
82
83 if( num > conshdlr->consssize )
84 {
85 int newsize;
86
87 newsize = SCIPsetCalcMemGrowSize(set, num);
88 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->conss, newsize) );
89 conshdlr->consssize = newsize;
90 }
91 assert(num <= conshdlr->consssize);
92
93 return SCIP_OKAY;
94}
95
96/** resizes initconss array to be able to store at least num constraints */
97static
99 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
100 SCIP_SET* set, /**< global SCIP settings */
101 int num /**< minimal number of slots in array */
102 )
103{
104 assert(conshdlr != NULL);
105 assert(set != NULL);
106
107 if( num > conshdlr->initconsssize )
108 {
109 int newsize;
110
111 newsize = SCIPsetCalcMemGrowSize(set, num);
112 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->initconss, newsize) );
113 conshdlr->initconsssize = newsize;
114 }
115 assert(num <= conshdlr->initconsssize);
116
117 return SCIP_OKAY;
118}
119
120/** resizes sepaconss array to be able to store at least num constraints */
121static
123 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
124 SCIP_SET* set, /**< global SCIP settings */
125 int num /**< minimal number of slots in array */
126 )
127{
128 assert(conshdlr != NULL);
129 assert(set != NULL);
130
131 if( num > conshdlr->sepaconsssize )
132 {
133 int newsize;
134
135 newsize = SCIPsetCalcMemGrowSize(set, num);
136 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->sepaconss, newsize) );
137 conshdlr->sepaconsssize = newsize;
138 }
139 assert(num <= conshdlr->sepaconsssize);
140
141 return SCIP_OKAY;
142}
143
144/** resizes enfoconss array to be able to store at least num constraints */
145static
147 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
148 SCIP_SET* set, /**< global SCIP settings */
149 int num /**< minimal number of slots in array */
150 )
151{
152 assert(conshdlr != NULL);
153 assert(set != NULL);
154
155 if( num > conshdlr->enfoconsssize )
156 {
157 int newsize;
158
159 newsize = SCIPsetCalcMemGrowSize(set, num);
160 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->enfoconss, newsize) );
161 conshdlr->enfoconsssize = newsize;
162 }
163 assert(num <= conshdlr->enfoconsssize);
164
165 return SCIP_OKAY;
166}
167
168/** resizes checkconss array to be able to store at least num constraints */
169static
171 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
172 SCIP_SET* set, /**< global SCIP settings */
173 int num /**< minimal number of slots in array */
174 )
175{
176 assert(conshdlr != NULL);
177 assert(set != NULL);
178
179 if( num > conshdlr->checkconsssize )
180 {
181 int newsize;
182
183 newsize = SCIPsetCalcMemGrowSize(set, num);
184 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->checkconss, newsize) );
185 conshdlr->checkconsssize = newsize;
186 }
187 assert(num <= conshdlr->checkconsssize);
188
189 return SCIP_OKAY;
190}
191
192/** resizes propconss array to be able to store at least num constraints */
193static
195 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
196 SCIP_SET* set, /**< global SCIP settings */
197 int num /**< minimal number of slots in array */
198 )
199{
200 assert(conshdlr != NULL);
201 assert(set != NULL);
202
203 if( num > conshdlr->propconsssize )
204 {
205 int newsize;
206
207 newsize = SCIPsetCalcMemGrowSize(set, num);
208 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->propconss, newsize) );
209 conshdlr->propconsssize = newsize;
210 }
211 assert(num <= conshdlr->propconsssize);
212
213 return SCIP_OKAY;
214}
215
216/** resizes updateconss array to be able to store at least num constraints */
217static
219 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
220 SCIP_SET* set, /**< global SCIP settings */
221 int num /**< minimal number of slots in array */
222 )
223{
224 assert(conshdlr != NULL);
225 assert(set != NULL);
226
227 if( num > conshdlr->updateconsssize )
228 {
229 int newsize;
230
231 newsize = SCIPsetCalcMemGrowSize(set, num);
232 SCIP_ALLOC( BMSreallocMemoryArray(&conshdlr->updateconss, newsize) );
233 conshdlr->updateconsssize = newsize;
234 }
235 assert(num <= conshdlr->updateconsssize);
236
237 return SCIP_OKAY;
238}
239
240
241
242
243/*
244 * Constraint handler methods
245 */
246
247#define checkConssArrays(conshdlr) /**/
248#ifndef NDEBUG
249#ifdef CHECKCONSARRAYS
250#undef checkConssArrays
251/** sanity check for the constraint arrays of the constraint handler (only in debug mode) */
252static
254 SCIP_CONSHDLR* conshdlr /**< constraint handler */
255 )
256{
257 int c;
258
259 assert(conshdlr != NULL);
260 assert(0 <= conshdlr->nactiveconss && conshdlr->nactiveconss <= conshdlr->nconss);
261
262 for( c = 0; c < conshdlr->nconss; ++c )
263 {
264 assert(conshdlr->conss[c] != NULL);
265 assert(!conshdlr->conss[c]->original);
266 assert(conshdlr->conss[c]->active == (c < conshdlr->nactiveconss));
267 assert(conshdlr->conss[c]->consspos == c);
268 }
269
270 for( c = 0; c < conshdlr->ninitconss; ++c )
271 {
272 assert(conshdlr->initconss[c] != NULL);
273 assert(!conshdlr->initconss[c]->original);
274 assert(c < conshdlr->ninitconsskept || conshdlr->initconss[c]->active);
275 assert(conshdlr->initconss[c]->initial);
276 }
277
278 for( c = 0; c < conshdlr->nsepaconss; ++c )
279 {
280 assert(conshdlr->sepaconss[c] != NULL);
281 assert(!conshdlr->sepaconss[c]->original);
282 assert(conshdlr->sepaconss[c]->active);
283 assert(conshdlr->sepaconss[c]->separate);
284 assert(conshdlr->sepaconss[c]->sepaenabled);
285 assert(conshdlr->sepaconss[c]->obsolete == (c >= conshdlr->nusefulsepaconss));
286 }
287
288 for( c = 0; c < conshdlr->nenfoconss; ++c )
289 {
290 assert(conshdlr->enfoconss[c] != NULL);
291 assert(!conshdlr->enfoconss[c]->original);
292 assert(conshdlr->enfoconss[c]->active);
293 assert(conshdlr->enfoconss[c]->enforce);
294 assert(conshdlr->enfoconss[c]->obsolete == (c >= conshdlr->nusefulenfoconss));
295 }
296
297 for( c = 0; c < conshdlr->ncheckconss; ++c )
298 {
299 assert(conshdlr->checkconss[c] != NULL);
300 assert(!conshdlr->checkconss[c]->original);
301 assert(conshdlr->checkconss[c]->active);
302 assert(conshdlr->checkconss[c]->check);
303 assert(conshdlr->checkconss[c]->obsolete == (c >= conshdlr->nusefulcheckconss));
304 }
305
306 for( c = 0; c < conshdlr->npropconss; ++c )
307 {
308 assert(conshdlr->propconss[c] != NULL);
309 assert(!conshdlr->propconss[c]->original);
310 assert(conshdlr->propconss[c]->active);
311 assert(conshdlr->propconss[c]->propagate);
312 assert(conshdlr->propconss[c]->propenabled);
313 assert(conshdlr->propconss[c]->markpropagate == (c < conshdlr->nmarkedpropconss));
314 assert(conshdlr->propconss[c]->markpropagate || (conshdlr->propconss[c]->obsolete == (c >= conshdlr->nusefulpropconss)));
315 }
316 assert(conshdlr->nmarkedpropconss <= conshdlr->npropconss);
317}
318#endif
319#endif
320
321/** returns whether the constraint updates of the constraint handler are currently delayed */
322static
324 SCIP_CONSHDLR* conshdlr /**< constraint handler */
325 )
326{
327 return (conshdlr->delayupdatecount > 0);
328}
329
330/** returns the exponentially decaying weighted age average for age resets */
331static
333 SCIP_CONSHDLR* conshdlr /**< constraint handler */
334 )
335{
336 assert(conshdlr != NULL);
337
338 return MAX(conshdlr->ageresetavg, AGERESETAVG_MIN);
339}
340
341/** updates the exponentially decaying weighted age average for age resets after a constraint age was reset */
342static
344 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
345 SCIP_Real age /**< age of the constraint that is reset to zero */
346 )
347{
348 assert(conshdlr != NULL);
349
350 conshdlr->ageresetavg *= (1.0-AGERESETAVG_DECAY);
351 conshdlr->ageresetavg += AGERESETAVG_DECAY * age;
352}
353
354/** returns whether the constraint's age exceeds the age limit */
355static
357 SCIP_CONS* cons, /**< constraint to check */
358 SCIP_SET* set /**< global SCIP settings */
359 )
360{
361 assert(cons != NULL);
362 assert(set != NULL);
363
364 return (cons->dynamic
365 && ((set->cons_agelimit > 0 && cons->age > set->cons_agelimit)
366 || (set->cons_agelimit == 0 && cons->age > AGERESETAVG_AGELIMIT * conshdlrGetAgeresetavg(cons->conshdlr))));
367}
368
369/** returns whether the constraint's age exceeds the obsolete age limit */
370static
372 SCIP_CONS* cons, /**< constraint to check */
373 SCIP_SET* set /**< global SCIP settings */
374 )
375{
376 assert(cons != NULL);
377 assert(set != NULL);
378
379 return (cons->dynamic
380 && ((set->cons_obsoleteage > 0 && cons->age > set->cons_obsoleteage)
381 || (set->cons_obsoleteage == 0 && cons->age > AGERESETAVG_OBSOLETEAGE * conshdlrGetAgeresetavg(cons->conshdlr))));
382}
383
384/** marks constraint to be obsolete; it will be moved to the last part of the constraint arrays, such that
385 * it is checked, enforced, separated, and propagated after the useful constraints
386 */
387static
389 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
390 SCIP_CONS* cons /**< constraint to be marked obsolete */
391 )
392{
393 SCIP_CONS* tmpcons;
394
395 assert(conshdlr != NULL);
396 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
397 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
398 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
399 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
400 assert(cons != NULL);
401 assert(!cons->original);
402 assert(!cons->obsolete);
404
405 cons->obsolete = TRUE;
406
407 if( cons->active )
408 {
409 if( cons->check )
410 {
411 assert(0 <= cons->checkconsspos && cons->checkconsspos < conshdlr->nusefulcheckconss);
412
413 /* switch the last useful (non-obsolete) check constraint with this constraint */
414 tmpcons = conshdlr->checkconss[conshdlr->nusefulcheckconss-1];
415 assert(tmpcons->checkconsspos == conshdlr->nusefulcheckconss-1);
416
417 conshdlr->checkconss[conshdlr->nusefulcheckconss-1] = cons;
418 conshdlr->checkconss[cons->checkconsspos] = tmpcons;
419 tmpcons->checkconsspos = cons->checkconsspos;
420 cons->checkconsspos = conshdlr->nusefulcheckconss-1;
421
422 conshdlr->nusefulcheckconss--;
423 }
424 }
425 if( cons->enabled )
426 {
427 if( cons->separate && cons->sepaenabled )
428 {
429 assert(0 <= cons->sepaconsspos && cons->sepaconsspos < conshdlr->nusefulsepaconss);
430
431 if( cons->sepaconsspos < conshdlr->lastnusefulsepaconss )
432 conshdlr->lastnusefulsepaconss--;
433
434 /* switch the last useful (non-obsolete) sepa constraint with this constraint */
435 tmpcons = conshdlr->sepaconss[conshdlr->nusefulsepaconss-1];
436 assert(tmpcons->sepaconsspos == conshdlr->nusefulsepaconss-1);
437
438 conshdlr->sepaconss[conshdlr->nusefulsepaconss-1] = cons;
439 conshdlr->sepaconss[cons->sepaconsspos] = tmpcons;
440 tmpcons->sepaconsspos = cons->sepaconsspos;
441 cons->sepaconsspos = conshdlr->nusefulsepaconss-1;
442
443 conshdlr->nusefulsepaconss--;
444 }
445 if( cons->enforce )
446 {
447 assert(0 <= cons->enfoconsspos && cons->enfoconsspos < conshdlr->nusefulenfoconss);
448
449 if( cons->enfoconsspos < conshdlr->lastnusefulenfoconss )
450 conshdlr->lastnusefulenfoconss--;
451 else
452 {
453 /* the constraint that becomes obsolete is not yet enforced on the current solution:
454 * we have to make sure that it will be enforced the next time; this is not done, if the current
455 * solution was already enforced and only enforcement on the additional constraints is performed
456 * (because in this case, only the new useful constraints are enforced);
457 * thus, we have to reset the enforcement counters in order to enforce all constraints again, especially
458 * the now obsolete one;
459 * this case should occur almost never, because a constraint that was not enforced in the last enforcement
460 * is a newly added one, and it is very unlikely that this constraint will become obsolete before the next
461 * enforcement call;
462 * this reset is not performed for separation and propagation, because they are not vital for correctness
463 */
464 conshdlr->lastenfolplpcount = -1;
465 conshdlr->lastenfolpdomchgcount = -1;
466 conshdlr->lastenfopsdomchgcount = -1;
467 conshdlr->lastenforelaxdomchgcount = -1;
468 conshdlr->lastenforelaxrelaxcount = -1;
469 conshdlr->lastenfolpnode = -1;
470 conshdlr->lastenfopsnode = -1;
471 }
472
473 /* switch the last useful (non-obsolete) enfo constraint with this constraint */
474 tmpcons = conshdlr->enfoconss[conshdlr->nusefulenfoconss-1];
475 assert(tmpcons->enfoconsspos == conshdlr->nusefulenfoconss-1);
476
477 conshdlr->enfoconss[conshdlr->nusefulenfoconss-1] = cons;
478 conshdlr->enfoconss[cons->enfoconsspos] = tmpcons;
479 tmpcons->enfoconsspos = cons->enfoconsspos;
480 cons->enfoconsspos = conshdlr->nusefulenfoconss-1;
481
482 conshdlr->nusefulenfoconss--;
483 }
484 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
485 * part of the array contains all marked constraints independently of their age
486 */
487 assert((!cons->markpropagate) == (cons->propconsspos < conshdlr->nmarkedpropconss));
488 if( cons->propagate && cons->propenabled && !cons->markpropagate )
489 {
490 assert(0 <= cons->propconsspos && cons->propconsspos < conshdlr->nusefulpropconss);
491
492 if( cons->propconsspos < conshdlr->lastnusefulpropconss )
493 conshdlr->lastnusefulpropconss--;
494
495 /* switch the last useful (non-obsolete) prop constraint with this constraint */
496 tmpcons = conshdlr->propconss[conshdlr->nusefulpropconss-1];
497 assert(tmpcons->propconsspos == conshdlr->nusefulpropconss-1);
498
499 conshdlr->propconss[conshdlr->nusefulpropconss-1] = cons;
500 conshdlr->propconss[cons->propconsspos] = tmpcons;
501 tmpcons->propconsspos = cons->propconsspos;
502 cons->propconsspos = conshdlr->nusefulpropconss-1;
503
504 conshdlr->nusefulpropconss--;
505 }
506 }
507
508 checkConssArrays(conshdlr);
509
510 return SCIP_OKAY;
511}
512
513/** marks obsolete constraint to be not obsolete anymore;
514 * it will be moved to the first part of the constraint arrays, such that it is checked, enforced, separated,
515 * and propagated before the obsolete constraints
516 */
517static
519 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
520 SCIP_CONS* cons /**< constraint to be marked obsolete */
521 )
522{
523 SCIP_CONS* tmpcons;
524
525 assert(conshdlr != NULL);
526 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
527 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
528 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
529 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
530 assert(cons != NULL);
531 assert(!cons->original);
532 assert(cons->obsolete);
534
535 cons->obsolete = FALSE;
536
537 if( cons->active )
538 {
539 if( cons->check )
540 {
541 assert(conshdlr->nusefulcheckconss <= cons->checkconsspos && cons->checkconsspos < conshdlr->ncheckconss);
542
543 /* switch the first obsolete check constraint with this constraint */
544 tmpcons = conshdlr->checkconss[conshdlr->nusefulcheckconss];
545 assert(tmpcons->checkconsspos == conshdlr->nusefulcheckconss);
546
547 conshdlr->checkconss[conshdlr->nusefulcheckconss] = cons;
548 conshdlr->checkconss[cons->checkconsspos] = tmpcons;
549 tmpcons->checkconsspos = cons->checkconsspos;
550 cons->checkconsspos = conshdlr->nusefulcheckconss;
551
552 conshdlr->nusefulcheckconss++;
553 }
554 }
555 if( cons->enabled )
556 {
557 if( cons->separate && cons->sepaenabled )
558 {
559 assert(conshdlr->nusefulsepaconss <= cons->sepaconsspos && cons->sepaconsspos < conshdlr->nsepaconss);
560
561 /* switch the first obsolete sepa constraint with this constraint */
562 tmpcons = conshdlr->sepaconss[conshdlr->nusefulsepaconss];
563 assert(tmpcons->sepaconsspos == conshdlr->nusefulsepaconss);
564
565 conshdlr->sepaconss[conshdlr->nusefulsepaconss] = cons;
566 conshdlr->sepaconss[cons->sepaconsspos] = tmpcons;
567 tmpcons->sepaconsspos = cons->sepaconsspos;
568 cons->sepaconsspos = conshdlr->nusefulsepaconss;
569
570 conshdlr->nusefulsepaconss++;
571 }
572 if( cons->enforce )
573 {
574 assert(conshdlr->nusefulenfoconss <= cons->enfoconsspos && cons->enfoconsspos < conshdlr->nenfoconss);
575
576 /* switch the first obsolete enfo constraint with this constraint */
577 tmpcons = conshdlr->enfoconss[conshdlr->nusefulenfoconss];
578 assert(tmpcons->enfoconsspos == conshdlr->nusefulenfoconss);
579
580 conshdlr->enfoconss[conshdlr->nusefulenfoconss] = cons;
581 conshdlr->enfoconss[cons->enfoconsspos] = tmpcons;
582 tmpcons->enfoconsspos = cons->enfoconsspos;
583 cons->enfoconsspos = conshdlr->nusefulenfoconss;
584
585 conshdlr->nusefulenfoconss++;
586 }
587 /* in case the constraint is marked to be propagated, we do not move it in the propconss array since the first
588 * part of the array contains all marked constraints independently of their age
589 */
590 assert((!cons->markpropagate) == (cons->propconsspos < conshdlr->nmarkedpropconss));
591 if( cons->propagate && cons->propenabled && !cons->markpropagate)
592 {
593 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
594
595 /* switch the first obsolete prop constraint with this constraint */
596 tmpcons = conshdlr->propconss[conshdlr->nusefulpropconss];
597 assert(tmpcons->propconsspos == conshdlr->nusefulpropconss);
598
599 conshdlr->propconss[conshdlr->nusefulpropconss] = cons;
600 conshdlr->propconss[cons->propconsspos] = tmpcons;
601 tmpcons->propconsspos = cons->propconsspos;
602 cons->propconsspos = conshdlr->nusefulpropconss;
603
604 conshdlr->nusefulpropconss++;
605 }
606 }
607
608 checkConssArrays(conshdlr);
609
610 return SCIP_OKAY;
611}
612
613/** marks constraint to be propagated in the next propagation round;
614 *
615 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
616 * the first part contains constraints which were marked to be propagated (independently of its age)
617 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
618 * finally, the third part contains obsolete constraints which are not marked to be propagated
619 *
620 * @note if a constraint gets marked for propagation we put it into the first part regardless of its age
621 */
622static
624 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
625 SCIP_CONS* cons /**< constraint to be marked obsolete */
626 )
627{
628 SCIP_CONS* tmpcons;
629
630 assert(conshdlr != NULL);
631 assert(conshdlr->nmarkedpropconss <= conshdlr->nusefulpropconss);
632 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
633 assert(cons != NULL);
634 assert(!cons->original);
635
636 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
637 if( !cons->enabled )
638 return;
639
640 if( cons->markpropagate )
641 return;
642
643 cons->markpropagate = TRUE;
644
645 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
646 * propconss array
647 */
648 if( !cons->propagate || !cons->propenabled )
649 {
650 assert(cons->propconsspos == -1);
651 return;
652 }
653 assert(cons->propconsspos >= conshdlr->nmarkedpropconss);
654
655 /* if the constraint is obsolete, we need to move it first to the non-obsolete part of the array */
656 if( cons->obsolete )
657 {
658 assert(conshdlr->nusefulpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->npropconss);
659
660 /* switch the first obsolete prop constraint with this constraint */
661 tmpcons = conshdlr->propconss[conshdlr->nusefulpropconss];
662 assert(tmpcons->propconsspos == conshdlr->nusefulpropconss);
663
664 conshdlr->propconss[conshdlr->nusefulpropconss] = cons;
665 conshdlr->propconss[cons->propconsspos] = tmpcons;
666 tmpcons->propconsspos = cons->propconsspos;
667 cons->propconsspos = conshdlr->nusefulpropconss;
668
669 conshdlr->nusefulpropconss++;
670 }
671 assert(conshdlr->nmarkedpropconss <= cons->propconsspos && cons->propconsspos < conshdlr->nusefulpropconss);
672
673 /* switch the first useful prop constraint with this constraint */
674 tmpcons = conshdlr->propconss[conshdlr->nmarkedpropconss];
675 assert(tmpcons->propconsspos == conshdlr->nmarkedpropconss);
676
677 conshdlr->propconss[conshdlr->nmarkedpropconss] = cons;
678 conshdlr->propconss[cons->propconsspos] = tmpcons;
679 tmpcons->propconsspos = cons->propconsspos;
680 cons->propconsspos = conshdlr->nmarkedpropconss;
681
682 conshdlr->nmarkedpropconss++;
683 assert(conshdlr->nmarkedpropconss <= conshdlr->npropconss);
684
685 checkConssArrays(conshdlr);
686}
687
688/** unmarks constraint to be propagated in the next propagation round;
689 *
690 * @note the propagation array is divided into three parts in contrast to the other constraint arrays;
691 * the first part contains constraints which were marked to be propagated (independently of its age)
692 * the second part contains the useful (non-obsolete) constraints which are not marked to be propagated
693 * finally, the third part contains obsolete constraints which are not marked to be propagated
694 *
695 * @note if a constraint gets unmarked for propagation, it is put into the right part depending on its age
696 */
697static
699 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
700 SCIP_CONS* cons /**< constraint to be marked obsolete */
701 )
702{
703 SCIP_CONS* tmpcons;
704
705 assert(conshdlr != NULL);
706 assert(conshdlr->nmarkedpropconss <= conshdlr->nusefulpropconss);
707 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
708 assert(cons != NULL);
709 assert(!cons->original);
710
711 /* it may happen that the constraint is deleted while updates are delayed: in this case we just return */
712 if( !cons->enabled )
713 return;
714
715 if( !cons->markpropagate )
716 return;
717
718 cons->markpropagate = FALSE;
719
720 /* propagation of the constraint is globally or locally disabled, so we do not have to move the constraint in the
721 * propconss array
722 */
723 if( !cons->propagate || !cons->propenabled )
724 {
725 assert(cons->propconsspos == -1);
726 return;
727 }
728 assert(cons->propconsspos >= 0);
729 assert(cons->propconsspos < conshdlr->nmarkedpropconss);
730
731 /* first, move the constraint out of the first part to the second part of the constraint array */
732 if( cons->propconsspos < conshdlr->nmarkedpropconss - 1 )
733 {
734 conshdlr->nmarkedpropconss--;
735
736 /* switch the last marked prop constraint with this constraint */
737 tmpcons = conshdlr->propconss[conshdlr->nmarkedpropconss];
738 assert(tmpcons->propconsspos == conshdlr->nmarkedpropconss);
739
740 conshdlr->propconss[conshdlr->nmarkedpropconss] = cons;
741 conshdlr->propconss[cons->propconsspos] = tmpcons;
742 tmpcons->propconsspos = cons->propconsspos;
743 cons->propconsspos = conshdlr->nmarkedpropconss;
744 }
745 else if( cons->propconsspos == conshdlr->nmarkedpropconss - 1 )
746 conshdlr->nmarkedpropconss--;
747 assert(cons->propconsspos == conshdlr->nmarkedpropconss);
748
749 /* if the constraint is obsolete, move it to the last part of the constraint array */
750 if( cons->obsolete )
751 {
752 conshdlr->nusefulpropconss--;
753
754 /* switch the last useful prop constraint with this constraint */
755 tmpcons = conshdlr->propconss[conshdlr->nusefulpropconss];
756 assert(tmpcons->propconsspos == conshdlr->nusefulpropconss);
757
758 conshdlr->propconss[conshdlr->nusefulpropconss] = cons;
759 conshdlr->propconss[cons->propconsspos] = tmpcons;
760 tmpcons->propconsspos = cons->propconsspos;
761 cons->propconsspos = conshdlr->nusefulpropconss;
762 }
763
764 checkConssArrays(conshdlr);
765}
766
767
768/** adds constraint to the conss array of constraint handler */
769static
771 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
772 SCIP_SET* set, /**< global SCIP settings */
773 SCIP_CONS* cons /**< constraint to add */
774 )
775{
776 assert(conshdlr != NULL);
777 assert(cons != NULL);
778 assert(cons->conshdlr == conshdlr);
779 assert(!cons->original);
780 assert(!cons->active);
781 assert(cons->consspos == -1);
782 assert(set != NULL);
783 assert(cons->scip == set->scip);
784
785 /* insert the constraint as inactive constraint into the transformed constraints array */
786 SCIP_CALL( conshdlrEnsureConssMem(conshdlr, set, conshdlr->nconss+1) );
787 conshdlr->conss[conshdlr->nconss] = cons;
788 cons->consspos = conshdlr->nconss;
789 conshdlr->nconss++;
790
791 return SCIP_OKAY;
792}
793
794/** deletes constraint from the conss array of constraint handler */
795static
797 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
798 SCIP_CONS* cons /**< constraint to remove */
799 )
800{
801 assert(conshdlr != NULL);
802 assert(cons != NULL);
803 assert(cons->conshdlr == conshdlr);
804 assert(!cons->original);
805 assert(!cons->active);
806 assert(conshdlr->nactiveconss <= cons->consspos && cons->consspos < conshdlr->nconss);
807
808 conshdlr->conss[cons->consspos] = conshdlr->conss[conshdlr->nconss-1];
809 conshdlr->conss[cons->consspos]->consspos = cons->consspos;
810 conshdlr->nconss--;
811 cons->consspos = -1;
812}
813
814/** adds constraint to the initconss array of constraint handler */
815static
817 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
818 SCIP_SET* set, /**< global SCIP settings */
819 SCIP_STAT* stat, /**< dynamic problem statistics */
820 SCIP_CONS* cons /**< constraint to add */
821 )
822{
823 int insertpos;
824
825 assert(conshdlr != NULL);
826 assert(cons != NULL);
827 assert(cons->conshdlr == conshdlr);
828 assert(!cons->original);
829 assert(cons->active);
830 assert(cons->initial);
831 assert(cons->initconsspos == -1 || cons->initconsspos < conshdlr->ninitconsskept);
832
833 SCIP_CALL( conshdlrEnsureInitconssMem(conshdlr, set, conshdlr->ninitconss+1) );
834
835 insertpos = conshdlr->ninitconss;
836
837 conshdlr->initconss[insertpos] = cons;
838 conshdlr->ninitconss++;
839 stat->ninitconssadded++;
840
841 /* if the constraint is kept, we keep the stored position at the beginning of the array */
842 if( cons->initconsspos == -1 )
843 cons->initconsspos = insertpos;
844
845 checkConssArrays(conshdlr);
846
847 return SCIP_OKAY;
848}
849
850/** deletes constraint from the initconss array of constraint handler */
851static
853 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
854 SCIP_CONS* cons /**< constraint to remove */
855 )
856{
857 int delpos;
858
859 assert(conshdlr != NULL);
860 assert(cons != NULL);
861 assert(cons->conshdlr == conshdlr);
862 assert(!cons->original);
863 assert(0 <= cons->initconsspos && cons->initconsspos < conshdlr->ninitconss);
864
865 delpos = cons->initconsspos;
866 if( delpos < conshdlr->ninitconsskept )
867 {
868 conshdlr->ninitconsskept--;
869 conshdlr->initconss[delpos] = conshdlr->initconss[conshdlr->ninitconsskept];
870 conshdlr->initconss[delpos]->initconsspos = delpos;
871 delpos = conshdlr->ninitconsskept;
872 }
873
874 if( delpos < conshdlr->ninitconss-1 )
875 {
876 conshdlr->initconss[delpos] = conshdlr->initconss[conshdlr->ninitconss-1];
877 conshdlr->initconss[delpos]->initconsspos = delpos;
878 }
879 conshdlr->ninitconss--;
880 cons->initconsspos = -1;
881
882 checkConssArrays(conshdlr);
883}
884
885/** adds constraint to the sepaconss array of constraint handler */
886static
888 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
889 SCIP_SET* set, /**< global SCIP settings */
890 SCIP_CONS* cons /**< constraint to add */
891 )
892{
893 int insertpos;
894
895 assert(conshdlr != NULL);
896 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
897 assert(cons != NULL);
898 assert(cons->conshdlr == conshdlr);
899 assert(!cons->original);
900 assert(cons->active);
901 assert(cons->separate);
902 assert(cons->sepaenabled);
903 assert(cons->sepaconsspos == -1);
904 assert(set != NULL);
905 assert(cons->scip == set->scip);
906 assert(!conshdlrAreUpdatesDelayed(conshdlr) || !conshdlr->duringsepa);
907
908 SCIP_CALL( conshdlrEnsureSepaconssMem(conshdlr, set, conshdlr->nsepaconss+1) );
909 insertpos = conshdlr->nsepaconss;
910 if( !cons->obsolete )
911 {
912 if( conshdlr->nusefulsepaconss < conshdlr->nsepaconss )
913 {
914 conshdlr->sepaconss[conshdlr->nsepaconss] = conshdlr->sepaconss[conshdlr->nusefulsepaconss];
915 conshdlr->sepaconss[conshdlr->nsepaconss]->sepaconsspos = conshdlr->nsepaconss;
916 insertpos = conshdlr->nusefulsepaconss;
917 }
918 conshdlr->nusefulsepaconss++;
919 }
920 conshdlr->sepaconss[insertpos] = cons;
921 cons->sepaconsspos = insertpos;
922 conshdlr->nsepaconss++;
923
924 checkConssArrays(conshdlr);
925
926 return SCIP_OKAY;
927}
928
929/** deletes constraint from the sepaconss array of constraint handler */
930static
932 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
933 SCIP_CONS* cons /**< constraint to remove */
934 )
935{
936 int delpos;
937
938 assert(conshdlr != NULL);
939 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
940 assert(cons != NULL);
941 assert(cons->conshdlr == conshdlr);
942 assert(!cons->original);
943 assert(cons->separate);
944 assert(cons->sepaenabled);
945 assert(cons->sepaconsspos != -1);
946 assert(!conshdlrAreUpdatesDelayed(conshdlr) || !conshdlr->duringsepa);
947
948 delpos = cons->sepaconsspos;
949 if( !cons->obsolete )
950 {
951 assert(0 <= delpos && delpos < conshdlr->nusefulsepaconss);
952
953 if( delpos < conshdlr->lastnusefulsepaconss )
954 conshdlr->lastnusefulsepaconss--;
955
956 conshdlr->sepaconss[delpos] = conshdlr->sepaconss[conshdlr->nusefulsepaconss-1];
957 conshdlr->sepaconss[delpos]->sepaconsspos = delpos;
958 delpos = conshdlr->nusefulsepaconss-1;
959 conshdlr->nusefulsepaconss--;
960 assert(conshdlr->nusefulsepaconss >= 0);
961 assert(conshdlr->lastnusefulsepaconss >= 0);
962 }
963 assert(conshdlr->nusefulsepaconss <= delpos && delpos < conshdlr->nsepaconss);
964 if( delpos < conshdlr->nsepaconss-1 )
965 {
966 conshdlr->sepaconss[delpos] = conshdlr->sepaconss[conshdlr->nsepaconss-1];
967 conshdlr->sepaconss[delpos]->sepaconsspos = delpos;
968 }
969 conshdlr->nsepaconss--;
970 cons->sepaconsspos = -1;
971
972 checkConssArrays(conshdlr);
973}
974
975/** adds constraint to the enfoconss array of constraint handler */
976static
978 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
979 SCIP_SET* set, /**< global SCIP settings */
980 SCIP_CONS* cons /**< constraint to add */
981 )
982{
983 int insertpos;
984
985 assert(conshdlr != NULL);
986 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
987 assert(cons != NULL);
988 assert(cons->conshdlr == conshdlr);
989 assert(!cons->original);
990 assert(cons->active);
991 assert(cons->enforce);
992 assert(cons->enfoconsspos == -1);
993 assert(set != NULL);
994 assert(cons->scip == set->scip);
995
996 SCIP_CALL( conshdlrEnsureEnfoconssMem(conshdlr, set, conshdlr->nenfoconss+1) );
997 insertpos = conshdlr->nenfoconss;
998 if( !cons->obsolete )
999 {
1000 if( conshdlr->nusefulenfoconss < conshdlr->nenfoconss )
1001 {
1002 conshdlr->enfoconss[conshdlr->nenfoconss] = conshdlr->enfoconss[conshdlr->nusefulenfoconss];
1003 conshdlr->enfoconss[conshdlr->nenfoconss]->enfoconsspos = conshdlr->nenfoconss;
1004 insertpos = conshdlr->nusefulenfoconss;
1005 }
1006 conshdlr->nusefulenfoconss++;
1007 }
1008 else
1009 {
1010 /* we have to make sure that even this obsolete constraint is enforced in the next enforcement call;
1011 * if the same LP or pseudo solution is enforced again, only the newly added useful constraints are
1012 * enforced; thus, we have to reset the enforcement counters and force all constraints to be
1013 * enforced again; this is not needed for separation and propagation, because they are not vital for correctness
1014 */
1015 conshdlr->lastenfolplpcount = -1;
1016 conshdlr->lastenfolpdomchgcount = -1;
1017 conshdlr->lastenfopsdomchgcount = -1;
1018 conshdlr->lastenforelaxdomchgcount = -1;
1019 conshdlr->lastenforelaxrelaxcount = -1;
1020 conshdlr->lastenfolpnode = -1;
1021 conshdlr->lastenfopsnode = -1;
1022 }
1023 conshdlr->enfoconss[insertpos] = cons;
1024 cons->enfoconsspos = insertpos;
1025 conshdlr->nenfoconss++;
1026
1027 checkConssArrays(conshdlr);
1028
1029 return SCIP_OKAY;
1030}
1031
1032/** deletes constraint from the enfoconss array of constraint handler */
1033static
1035 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1036 SCIP_CONS* cons /**< constraint to remove */
1037 )
1038{
1039 int delpos;
1040
1041 assert(conshdlr != NULL);
1042 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1043 assert(cons != NULL);
1044 assert(cons->conshdlr == conshdlr);
1045 assert(!cons->original);
1046 assert(cons->enforce);
1047 assert(cons->enfoconsspos != -1);
1048
1049 delpos = cons->enfoconsspos;
1050 if( !cons->obsolete )
1051 {
1052 assert(0 <= delpos && delpos < conshdlr->nusefulenfoconss);
1053
1054 if( delpos < conshdlr->lastnusefulenfoconss )
1055 conshdlr->lastnusefulenfoconss--;
1056
1057 conshdlr->enfoconss[delpos] = conshdlr->enfoconss[conshdlr->nusefulenfoconss-1];
1058 conshdlr->enfoconss[delpos]->enfoconsspos = delpos;
1059 delpos = conshdlr->nusefulenfoconss-1;
1060 conshdlr->nusefulenfoconss--;
1061
1062 /* if the constraint that moved to the free position was a newly added constraint and not enforced in the last
1063 * enforcement, we have to make sure it will be enforced in the next run;
1064 * this check is not performed for separation and propagation, because they are not vital for correctness
1065 */
1066 if( delpos >= conshdlr->lastnusefulenfoconss )
1067 conshdlr->lastnusefulenfoconss = cons->enfoconsspos;
1068
1069 assert(conshdlr->nusefulenfoconss >= 0);
1070 assert(conshdlr->lastnusefulenfoconss >= 0);
1071 }
1072 assert(conshdlr->nusefulenfoconss <= delpos && delpos < conshdlr->nenfoconss);
1073 if( delpos < conshdlr->nenfoconss-1 )
1074 {
1075 conshdlr->enfoconss[delpos] = conshdlr->enfoconss[conshdlr->nenfoconss-1];
1076 conshdlr->enfoconss[delpos]->enfoconsspos = delpos;
1077 }
1078 conshdlr->nenfoconss--;
1079 cons->enfoconsspos = -1;
1080
1081 checkConssArrays(conshdlr);
1082}
1083
1084/** adds constraint to the checkconss array of constraint handler */
1085static
1087 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1088 SCIP_SET* set, /**< global SCIP settings */
1089 SCIP_CONS* cons /**< constraint to add */
1090 )
1091{
1092 int insertpos;
1093
1094 assert(conshdlr != NULL);
1095 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1096 assert(cons != NULL);
1097 assert(cons->conshdlr == conshdlr);
1098 assert(!cons->original);
1099 assert(cons->active);
1100 assert(cons->check);
1101 assert(cons->checkconsspos == -1);
1102 assert(set != NULL);
1103 assert(cons->scip == set->scip);
1104
1105 SCIP_CALL( conshdlrEnsureCheckconssMem(conshdlr, set, conshdlr->ncheckconss+1) );
1106 insertpos = conshdlr->ncheckconss;
1107 if( !cons->obsolete )
1108 {
1109 if( conshdlr->nusefulcheckconss < conshdlr->ncheckconss )
1110 {
1111 assert(conshdlr->checkconss[conshdlr->nusefulcheckconss] != NULL);
1112 conshdlr->checkconss[conshdlr->ncheckconss] = conshdlr->checkconss[conshdlr->nusefulcheckconss];
1113 conshdlr->checkconss[conshdlr->ncheckconss]->checkconsspos = conshdlr->ncheckconss;
1114 insertpos = conshdlr->nusefulcheckconss;
1115 }
1116 conshdlr->nusefulcheckconss++;
1117 }
1118 assert(0 <= insertpos && insertpos <= conshdlr->ncheckconss);
1119 conshdlr->checkconss[insertpos] = cons;
1120 cons->checkconsspos = insertpos;
1121 conshdlr->ncheckconss++;
1122
1123 checkConssArrays(conshdlr);
1124
1125 return SCIP_OKAY;
1126}
1127
1128/** deletes constraint from the checkconss array of constraint handler */
1129static
1131 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1132 SCIP_CONS* cons /**< constraint to add */
1133 )
1134{
1135 int delpos;
1136
1137 assert(conshdlr != NULL);
1138 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1139 assert(cons != NULL);
1140 assert(cons->conshdlr == conshdlr);
1141 assert(!cons->original);
1142 assert(cons->active);
1143 assert(cons->check);
1144 assert(cons->checkconsspos != -1);
1145
1146 delpos = cons->checkconsspos;
1147 if( !cons->obsolete )
1148 {
1149 assert(0 <= delpos && delpos < conshdlr->nusefulcheckconss);
1150 conshdlr->checkconss[delpos] = conshdlr->checkconss[conshdlr->nusefulcheckconss-1];
1151 conshdlr->checkconss[delpos]->checkconsspos = delpos;
1152 delpos = conshdlr->nusefulcheckconss-1;
1153 conshdlr->nusefulcheckconss--;
1154 }
1155 assert(conshdlr->nusefulcheckconss <= delpos && delpos < conshdlr->ncheckconss);
1156 if( delpos < conshdlr->ncheckconss-1 )
1157 {
1158 conshdlr->checkconss[delpos] = conshdlr->checkconss[conshdlr->ncheckconss-1];
1159 conshdlr->checkconss[delpos]->checkconsspos = delpos;
1160 }
1161 conshdlr->ncheckconss--;
1162 cons->checkconsspos = -1;
1163
1164 checkConssArrays(conshdlr);
1165}
1166
1167/** adds constraint to the propconss array of constraint handler */
1168static
1170 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1171 SCIP_SET* set, /**< global SCIP settings */
1172 SCIP_CONS* cons /**< constraint to add */
1173 )
1174{
1175 int insertpos;
1176
1177 assert(conshdlr != NULL);
1178 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1179 assert(cons != NULL);
1180 assert(cons->conshdlr == conshdlr);
1181 assert(!cons->original);
1182 assert(cons->active);
1183 assert(cons->enabled);
1184 assert(cons->propagate);
1185 assert(cons->propenabled);
1186 assert(cons->propconsspos == -1);
1187 assert(set != NULL);
1188 assert(cons->scip == set->scip);
1189 assert(!conshdlrAreUpdatesDelayed(conshdlr) || !conshdlr->duringprop);
1190
1191 /* add constraint to the propagation array */
1192 SCIP_CALL( conshdlrEnsurePropconssMem(conshdlr, set, conshdlr->npropconss+1) );
1193 insertpos = conshdlr->npropconss;
1194 if( !cons->obsolete )
1195 {
1196 if( conshdlr->nusefulpropconss < conshdlr->npropconss )
1197 {
1198 conshdlr->propconss[conshdlr->npropconss] = conshdlr->propconss[conshdlr->nusefulpropconss];
1199 conshdlr->propconss[conshdlr->npropconss]->propconsspos = conshdlr->npropconss;
1200 insertpos = conshdlr->nusefulpropconss;
1201 }
1202 conshdlr->nusefulpropconss++;
1203 }
1204 conshdlr->propconss[insertpos] = cons;
1205 cons->propconsspos = insertpos;
1206 conshdlr->npropconss++;
1207
1208 /* if the constraint is marked to be propagated, we have to move it to the first part of the array */
1209 if( cons->markpropagate )
1210 {
1211 /* temporarily unmark the constraint to be propagated, such that we can use the method below */
1212 cons->markpropagate = FALSE;
1213
1215 assert(cons->markpropagate);
1216 }
1217
1218 checkConssArrays(conshdlr);
1219
1220 return SCIP_OKAY;
1221}
1222
1223/** deletes constraint from the propconss array of constraint handler */
1224static
1226 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1227 SCIP_CONS* cons /**< constraint to remove */
1228 )
1229{
1230 int delpos;
1231
1232 assert(conshdlr != NULL);
1233 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1234 assert(cons != NULL);
1235 assert(cons->conshdlr == conshdlr);
1236 assert(!cons->original);
1237 assert(cons->propagate);
1238 assert(cons->propenabled);
1239 assert(cons->propconsspos != -1);
1240 assert(!conshdlrAreUpdatesDelayed(conshdlr) || !conshdlr->duringprop);
1241
1242 /* unmark constraint to be propagated; this will move the constraint to the obsolete or non-obsolete part of the
1243 * array, depending on its age
1244 */
1245 if( cons->markpropagate )
1246 {
1248 assert(!cons->markpropagate);
1249 }
1250
1251 /* delete constraint from the propagation array */
1252 delpos = cons->propconsspos;
1253 assert(delpos >= conshdlr->nmarkedpropconss);
1254 if( !cons->obsolete )
1255 {
1256 assert(0 <= delpos && delpos < conshdlr->nusefulpropconss);
1257
1258 if( delpos < conshdlr->lastnusefulpropconss )
1259 conshdlr->lastnusefulpropconss--;
1260
1261 conshdlr->propconss[delpos] = conshdlr->propconss[conshdlr->nusefulpropconss-1];
1262 conshdlr->propconss[delpos]->propconsspos = delpos;
1263 delpos = conshdlr->nusefulpropconss-1;
1264 conshdlr->nusefulpropconss--;
1265 assert(conshdlr->nusefulpropconss >= 0);
1266 assert(conshdlr->lastnusefulpropconss >= 0);
1267 }
1268 assert(conshdlr->nusefulpropconss <= delpos && delpos < conshdlr->npropconss);
1269
1270 if( delpos < conshdlr->npropconss-1 )
1271 {
1272 conshdlr->propconss[delpos] = conshdlr->propconss[conshdlr->npropconss-1];
1273 conshdlr->propconss[delpos]->propconsspos = delpos;
1274 }
1275 conshdlr->npropconss--;
1276 cons->propconsspos = -1;
1277 assert(conshdlr->nmarkedpropconss <= conshdlr->npropconss);
1278
1279 checkConssArrays(conshdlr);
1280}
1281
1282/** enables separation of constraint */
1283static
1285 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1286 SCIP_SET* set, /**< global SCIP settings */
1287 SCIP_CONS* cons /**< constraint to add */
1288 )
1289{
1290 assert(conshdlr != NULL);
1291 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1292 assert(cons != NULL);
1293 assert(cons->conshdlr == conshdlr);
1294 assert(!cons->sepaenabled);
1295 assert(cons->sepaconsspos == -1);
1296 assert(set != NULL);
1297 assert(cons->scip == set->scip);
1298
1299 SCIPsetDebugMsg(set, "enable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1300
1301 /* enable separation of constraint */
1302 cons->sepaenabled = TRUE;
1303
1304 /* add constraint to the separation array */
1305 if( cons->enabled && cons->separate )
1306 {
1307 SCIP_CALL( conshdlrAddSepacons(conshdlr, set, cons) );
1308 }
1309
1310 return SCIP_OKAY;
1311}
1312
1313/** disables separation of constraint */
1314static
1316 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1317 SCIP_CONS* cons /**< constraint to remove */
1318 )
1319{
1320 assert(conshdlr != NULL);
1321 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1322 assert(cons != NULL);
1323 assert(cons->conshdlr == conshdlr);
1324 assert(cons->sepaenabled);
1325 assert((cons->separate && cons->enabled) == (cons->sepaconsspos != -1));
1326
1327 SCIPdebugMessage("disable separation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1328
1329 /* delete constraint from the separation array */
1330 if( cons->separate && cons->enabled )
1331 {
1332 conshdlrDelSepacons(conshdlr, cons);
1333 }
1334 assert(cons->sepaconsspos == -1);
1335
1336 /* disable separation of constraint */
1337 cons->sepaenabled = FALSE;
1338
1339 return SCIP_OKAY;
1340}
1341
1342/** enables propagation of constraint */
1343static
1345 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1346 SCIP_SET* set, /**< global SCIP settings */
1347 SCIP_CONS* cons /**< constraint to add */
1348 )
1349{
1350 assert(conshdlr != NULL);
1351 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1352 assert(cons != NULL);
1353 assert(cons->conshdlr == conshdlr);
1354 assert(!cons->propenabled);
1355 assert(cons->propconsspos == -1);
1356 assert(set != NULL);
1357 assert(cons->scip == set->scip);
1358
1359 SCIPsetDebugMsg(set, "enable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1360
1361 /* enable propagation of constraint */
1362 cons->propenabled = TRUE;
1363
1364 /* add constraint to the propagation array */
1365 if( cons->enabled && cons->propagate )
1366 {
1367 SCIP_CALL( conshdlrAddPropcons(conshdlr, set, cons) );
1368 }
1369
1370 return SCIP_OKAY;
1371}
1372
1373/** disables propagation of constraint */
1374static
1376 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1377 SCIP_CONS* cons /**< constraint to remove */
1378 )
1379{
1380 assert(conshdlr != NULL);
1381 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1382 assert(cons != NULL);
1383 assert(cons->conshdlr == conshdlr);
1384 assert(cons->propenabled);
1385 assert((cons->propagate && cons->enabled) == (cons->propconsspos != -1));
1386
1387 SCIPdebugMessage("disable propagation of constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1388
1389 /* delete constraint from the propagation array */
1390 if( cons->propagate && cons->enabled )
1391 {
1392 conshdlrDelPropcons(conshdlr, cons);
1393 }
1394 assert(cons->propconsspos == -1);
1395
1396 /* disable propagation of constraint */
1397 cons->propenabled = FALSE;
1398
1399 return SCIP_OKAY;
1400}
1401
1402/** enables separation, enforcement, and propagation of constraint */
1403static
1405 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1406 SCIP_SET* set, /**< global SCIP settings */
1407 SCIP_STAT* stat, /**< dynamic problem statistics */
1408 SCIP_CONS* cons /**< constraint to add */
1409 )
1410{
1411 assert(conshdlr != NULL);
1412 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1413 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1414 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1415 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1416 assert(set != NULL);
1417 assert(stat != NULL);
1418 assert(cons != NULL);
1419 assert(cons->scip == set->scip);
1420 assert(cons->conshdlr == conshdlr);
1421 assert(!cons->original);
1422 assert(cons->active);
1423 assert(!cons->enabled);
1424 assert(cons->sepaconsspos == -1);
1425 assert(cons->enfoconsspos == -1);
1426 assert(cons->propconsspos == -1);
1427
1428 SCIPsetDebugMsg(set, "enable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1429
1430 /* enable constraint */
1431 cons->enabled = TRUE;
1432 conshdlr->nenabledconss++;
1433 stat->nenabledconss++;
1434
1435 /* add constraint to the separation array */
1436 if( cons->separate && cons->sepaenabled )
1437 {
1438 SCIP_CALL( conshdlrAddSepacons(conshdlr, set, cons) );
1439 }
1440
1441 /* add constraint to the enforcement array */
1442 if( cons->enforce )
1443 {
1444 SCIP_CALL( conshdlrAddEnfocons(conshdlr, set, cons) );
1445 }
1446
1447 /* add constraint to the propagation array */
1448 if( cons->propagate && cons->propenabled )
1449 {
1450 SCIP_CALL( conshdlrAddPropcons(conshdlr, set, cons) );
1451 }
1452
1453 /* call constraint handler's enabling notification method */
1454 if( conshdlr->consenable != NULL )
1455 {
1456 SCIP_CALL( conshdlr->consenable(set->scip, conshdlr, cons) );
1457 }
1458
1459 checkConssArrays(conshdlr);
1460
1461 return SCIP_OKAY;
1462}
1463
1464/** disables separation, enforcement, and propagation of constraint */
1465static
1467 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1468 SCIP_SET* set, /**< global SCIP settings */
1469 SCIP_STAT* stat, /**< dynamic problem statistics */
1470 SCIP_CONS* cons /**< constraint to remove */
1471 )
1472{
1473 assert(conshdlr != NULL);
1474 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1475 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1476 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1477 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1478 assert(set != NULL);
1479 assert(stat != NULL);
1480 assert(cons != NULL);
1481 assert(cons->scip == set->scip);
1482 assert(cons->conshdlr == conshdlr);
1483 assert(!cons->original);
1484 assert(cons->active);
1485 assert(cons->enabled);
1486 assert((cons->separate && cons->sepaenabled) == (cons->sepaconsspos != -1));
1487 assert(cons->enforce == (cons->enfoconsspos != -1));
1488 assert((cons->propagate && cons->propenabled) == (cons->propconsspos != -1));
1489
1490 SCIPsetDebugMsg(set, "disable constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1491
1492 /* call constraint handler's disabling notification method */
1493 if( conshdlr->consdisable != NULL )
1494 {
1495 SCIP_CALL( conshdlr->consdisable(set->scip, conshdlr, cons) );
1496 }
1497
1498 /* delete constraint from the separation array */
1499 if( cons->separate && cons->sepaenabled )
1500 {
1501 conshdlrDelSepacons(conshdlr, cons);
1502 }
1503
1504 /* delete constraint from the enforcement array */
1505 if( cons->enforce )
1506 {
1507 conshdlrDelEnfocons(conshdlr, cons);
1508 }
1509
1510 /* delete constraint from the propagation array */
1511 if( cons->propagate && cons->propenabled )
1512 {
1513 conshdlrDelPropcons(conshdlr, cons);
1514 }
1515
1516 assert(cons->sepaconsspos == -1);
1517 assert(cons->enfoconsspos == -1);
1518 assert(cons->propconsspos == -1);
1519
1520 /* disable constraint */
1521 cons->enabled = FALSE;
1522 conshdlr->nenabledconss--;
1523 stat->nenabledconss--;
1524
1525 checkConssArrays(conshdlr);
1526
1527 return SCIP_OKAY;
1528}
1529
1530/** activates and adds constraint to constraint handler's constraint arrays */
1531static
1533 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1534 SCIP_SET* set, /**< global SCIP settings */
1535 SCIP_STAT* stat, /**< dynamic problem statistics */
1536 SCIP_CONS* cons, /**< constraint to add */
1537 int depth, /**< depth in the tree where the activation takes place, or -1 for global problem */
1538 SCIP_Bool focusnode /**< does the constraint activation take place at the focus node? */
1539 )
1540{
1541 assert(conshdlr != NULL);
1542 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1543 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1544 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1545 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1546 assert(set != NULL);
1547 assert(stat != NULL);
1548 assert(cons != NULL);
1549 assert(cons->scip == set->scip);
1550 assert(cons->conshdlr == conshdlr);
1551 assert(!cons->original);
1552 assert(!cons->active);
1553 assert(!cons->enabled);
1554 assert(conshdlr->nactiveconss <= cons->consspos && cons->consspos < conshdlr->nconss);
1555 assert(conshdlr->conss[cons->consspos] == cons);
1556 assert(cons->initconsspos < conshdlr->ninitconsskept);
1557 assert(cons->sepaconsspos == -1);
1558 assert(cons->enfoconsspos == -1);
1559 assert(cons->checkconsspos == -1);
1560 assert(cons->propconsspos == -1);
1561 assert(depth >= -1);
1562
1563 SCIPsetDebugMsg(set, "activate constraint <%s> in constraint handler <%s> (depth %d, focus=%u)\n",
1564 cons->name, conshdlr->name, depth, focusnode);
1565
1566 /* activate constraint, switch positions with first inactive constraint */
1567 cons->active = TRUE;
1568 cons->activedepth = depth;
1569 conshdlr->conss[cons->consspos] = conshdlr->conss[conshdlr->nactiveconss];
1570 conshdlr->conss[cons->consspos]->consspos = cons->consspos;
1571 conshdlr->conss[conshdlr->nactiveconss] = cons;
1572 cons->consspos = conshdlr->nactiveconss;
1573 conshdlr->nactiveconss++;
1574 conshdlr->maxnactiveconss = MAX(conshdlr->maxnactiveconss, conshdlr->nactiveconss);
1575 stat->nactiveconss++;
1576
1577 /* add constraint to the check array */
1578 if( cons->check )
1579 {
1580 SCIP_CALL( conshdlrAddCheckcons(conshdlr, set, cons) );
1581 }
1582
1583 /* add constraint to the initconss array if the constraint is initial and added to the focus node */
1584 if( cons->initial )
1585 {
1586 SCIP_CALL( conshdlrAddInitcons(conshdlr, set, stat, cons) );
1587 }
1588
1589 /* call constraint handler's activation notification method */
1590 if( conshdlr->consactive != NULL )
1591 {
1592 SCIP_CALL( conshdlr->consactive(set->scip, conshdlr, cons) );
1593 }
1594
1595 /* enable separation, enforcement, and propagation of constraint */
1596 SCIP_CALL( conshdlrEnableCons(conshdlr, set, stat, cons) );
1597
1598 assert(0 <= cons->consspos && cons->consspos < conshdlr->nactiveconss);
1599
1600 checkConssArrays(conshdlr);
1601
1602 return SCIP_OKAY;
1603}
1604
1605/** deactivates and removes constraint from constraint handler's conss array */
1606static
1608 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1609 SCIP_SET* set, /**< global SCIP settings */
1610 SCIP_STAT* stat, /**< dynamic problem statistics */
1611 SCIP_CONS* cons /**< constraint to remove */
1612 )
1613{
1614 assert(conshdlr != NULL);
1615 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1616 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1617 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1618 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1619 assert(set != NULL);
1620 assert(stat != NULL);
1621 assert(cons != NULL);
1622 assert(cons->scip == set->scip);
1623 assert(cons->conshdlr == conshdlr);
1624 assert(!cons->original);
1625 assert(cons->active);
1626 assert(0 <= cons->consspos && cons->consspos < conshdlr->nactiveconss);
1627 assert(conshdlr->conss[cons->consspos] == cons);
1628 assert(cons->check == (cons->checkconsspos != -1));
1629
1630 SCIPsetDebugMsg(set, "deactivate constraint <%s> in constraint handler <%s>\n", cons->name, conshdlr->name);
1631
1632 /* disable constraint */
1633 if( cons->enabled )
1634 {
1635 SCIP_CALL( conshdlrDisableCons(conshdlr, set, stat, cons) );
1636 }
1637 assert(!cons->enabled);
1638
1639 /* call constraint handler's deactivation notification method */
1640 if( conshdlr->consdeactive != NULL )
1641 {
1642 SCIP_CALL( conshdlr->consdeactive(set->scip, conshdlr, cons) );
1643 }
1644
1645 /* delete constraint from the initconss array */
1646 if( cons->initconsspos >= 0 )
1647 {
1648 conshdlrDelInitcons(conshdlr, cons);
1649 }
1650
1651 /* delete constraint from the check array */
1652 if( cons->check )
1653 {
1654 conshdlrDelCheckcons(conshdlr, cons);
1655 }
1656
1657 /* switch constraint with the last active constraint in the conss array */
1658 conshdlr->conss[cons->consspos] = conshdlr->conss[conshdlr->nactiveconss-1];
1659 conshdlr->conss[cons->consspos]->consspos = cons->consspos;
1660 conshdlr->conss[conshdlr->nactiveconss-1] = cons;
1661 cons->consspos = conshdlr->nactiveconss-1;
1662 conshdlr->nactiveconss--;
1663 cons->active = FALSE;
1664 cons->activedepth = -2;
1665 stat->nactiveconss--;
1666
1667 assert(conshdlr->nactiveconss <= cons->consspos && cons->consspos < conshdlr->nconss);
1668 assert(cons->initconsspos == -1);
1669 assert(cons->sepaconsspos == -1);
1670 assert(cons->enfoconsspos == -1);
1671 assert(cons->checkconsspos == -1);
1672 assert(cons->propconsspos == -1);
1673
1674 checkConssArrays(conshdlr);
1675
1676 return SCIP_OKAY;
1677}
1678
1679/** processes all delayed updates of constraints:
1680 * recently (de)activated constraints will be (de)activated;
1681 * recently en/disabled constraints will be en/disabled;
1682 * recent obsolete non-check constraints will be globally deleted;
1683 * recent obsolete check constraints will be moved to the last positions in the sepa-, enfo-, check-, and prop-arrays;
1684 * recent useful constraints will be moved to the first positions in the sepa-, enfo-, check-, and prop-arrays;
1685 * constraints which were recently marked to be propagated are moved to the first positions in the prop-array;
1686 * no longer used constraints will be freed and removed from the conss array
1687 */
1688static
1690 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1691 BMS_BLKMEM* blkmem, /**< block memory */
1692 SCIP_SET* set, /**< global SCIP settings */
1693 SCIP_STAT* stat /**< dynamic problem statistics */
1694 )
1695{
1696 SCIP_CONS* cons;
1697 int i;
1698
1699 assert(conshdlr != NULL);
1701 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
1702 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
1703 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
1704 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
1705
1706 SCIPsetDebugMsg(set, "processing %d constraints that have to be updated in constraint handler <%s>\n",
1707 conshdlr->nupdateconss, conshdlr->name);
1708
1709 for( i = conshdlr->nupdateconss - 1; i >= 0; --i )
1710 {
1711 cons = conshdlr->updateconss[i];
1712 assert(cons != NULL);
1713 assert(cons->conshdlr == conshdlr);
1714 assert(cons->update);
1715 assert(cons->updateinsert || cons->updateactivate || cons->updatedeactivate
1716 || cons->updateenable || cons->updatedisable
1717 || cons->updatesepaenable || cons->updatesepadisable
1718 || cons->updatepropenable || cons->updatepropdisable
1719 || cons->updateobsolete || cons->updatefree
1720 || cons->updatemarkpropagate || cons->updateunmarkpropagate);
1721
1722 SCIPsetDebugMsg(set, " -> constraint <%s>: insert=%u, activate=%u, deactivate=%u, enable=%u, disable=%u, sepaenable=%u, sepadisable=%u, propenable=%u, propdisable=%u, obsolete=%u, free=%u (consdata=%p)\n",
1723 cons->name, cons->updateinsert, cons->updateactivate, cons->updatedeactivate,
1724 cons->updateenable, cons->updatedisable,
1727 cons->updateobsolete, cons->updatefree, (void*)cons->consdata);
1728
1729 if( cons->updateinsert )
1730 {
1731 SCIP_CALL( conshdlrAddCons(conshdlr, set, cons) );
1732 cons->updateinsert = FALSE;
1733 }
1734
1735 if( cons->updateactivate )
1736 {
1737 assert(!cons->active);
1738 assert(!cons->updatedeactivate);
1739 assert(!cons->updateenable);
1740 assert(!cons->updatedisable);
1741 assert(!cons->updateobsolete);
1742 assert(!cons->updatefree);
1743
1744 /* the activation depth was already stored in SCIPconsActivate() */
1745 SCIP_CALL( conshdlrActivateCons(conshdlr, set, stat, cons, cons->activedepth, cons->updateactfocus) );
1746 assert(cons->active);
1747 cons->updateactivate = FALSE;
1748 }
1749 else if( cons->updatedeactivate )
1750 {
1751 assert(cons->active);
1752
1753 SCIP_CALL( conshdlrDeactivateCons(conshdlr, set, stat, cons) );
1754 assert(!cons->active);
1755 cons->updatedeactivate = FALSE;
1756 cons->updateenable = FALSE;
1757 cons->updatedisable = FALSE;
1758 cons->obsolete = consExceedsObsoleteage(cons, set);
1759 cons->updateobsolete = FALSE;
1760 }
1761 else if( cons->updateenable )
1762 {
1763 assert(!cons->enabled);
1764 assert(!cons->updatedisable);
1765
1766 SCIP_CALL( conshdlrEnableCons(conshdlr, set, stat, cons) );
1767 assert(cons->enabled);
1768 cons->updateenable = FALSE;
1769 }
1770 else if( cons->updatedisable )
1771 {
1772 assert(cons->enabled);
1773
1774 SCIP_CALL( conshdlrDisableCons(conshdlr, set, stat, cons) );
1775 assert(!cons->enabled);
1776 cons->updatedisable = FALSE;
1777 }
1778
1779 if( cons->updatesepaenable )
1780 {
1781 assert(!cons->updatesepadisable);
1782 if( !cons->sepaenabled )
1783 {
1784 SCIP_CALL( conshdlrEnableConsSeparation(conshdlr, set, cons) );
1785 assert(cons->sepaenabled);
1786 }
1787 cons->updatesepaenable = FALSE;
1788 }
1789 else if( cons->updatesepadisable )
1790 {
1791 if( cons->sepaenabled )
1792 {
1793 SCIP_CALL( conshdlrDisableConsSeparation(conshdlr, cons) );
1794 assert(!cons->sepaenabled);
1795 }
1796 cons->updatesepadisable = FALSE;
1797 }
1798
1799 if( cons->updatepropenable )
1800 {
1801 assert(!cons->updatepropdisable);
1802 if( !cons->propenabled )
1803 {
1804 SCIP_CALL( conshdlrEnableConsPropagation(conshdlr, set, cons) );
1805 assert(cons->propenabled);
1806 }
1807 cons->updatepropenable = FALSE;
1808 }
1809 else if( cons->updatepropdisable )
1810 {
1811 if( cons->propenabled )
1812 {
1813 SCIP_CALL( conshdlrDisableConsPropagation(conshdlr, cons) );
1814 assert(!cons->propenabled);
1815 }
1816 cons->updatepropdisable = FALSE;
1817 }
1818
1819 if( cons->updatefree )
1820 {
1821 /* nothing to do here: the constraint is freed, when it is released from the updateconss array */
1822 assert(cons->nuses == 1); /* it only exists in the updateconss array */
1823 cons->updatefree = FALSE;
1824 cons->updateobsolete = FALSE;
1825 }
1826 else
1827 {
1828 if( cons->updateobsolete )
1829 {
1830 if( !cons->obsolete && consExceedsObsoleteage(cons, set) )
1831 {
1832 /* the constraint's status must be switched to obsolete */
1833 SCIP_CALL( conshdlrMarkConsObsolete(conshdlr, cons) );
1834 }
1835 else if( cons->obsolete && !consExceedsObsoleteage(cons, set) )
1836 {
1837 /* the constraint's status must be switched to useful */
1838 SCIP_CALL( conshdlrMarkConsUseful(conshdlr, cons) );
1839 }
1840 cons->updateobsolete = FALSE;
1841 }
1842
1843 if( cons->updatemarkpropagate )
1844 {
1845 /* the constraint must be marked to be propagated */
1846 conshdlrMarkConsPropagate(conshdlr, cons);
1847 cons->updatemarkpropagate = FALSE;
1848 }
1849 else if( cons->updateunmarkpropagate )
1850 {
1851 /* the constraint must be unmarked to be propagated */
1852 conshdlrUnmarkConsPropagate(conshdlr, cons);
1854 }
1855 }
1856
1857 assert(!cons->updateinsert);
1858 assert(!cons->updateactivate);
1859 assert(!cons->updatedeactivate);
1860 assert(!cons->updateenable);
1861 assert(!cons->updatedisable);
1862 assert(!cons->updatesepaenable);
1863 assert(!cons->updatesepadisable);
1864 assert(!cons->updatepropenable);
1865 assert(!cons->updatepropdisable);
1866 assert(!cons->updateobsolete);
1869 assert(!cons->updatefree);
1870 cons->update = FALSE;
1871
1872 /* release the constraint */
1873 SCIP_CALL( SCIPconsRelease(&conshdlr->updateconss[i], blkmem, set) );
1874 }
1875
1876 conshdlr->nupdateconss = 0;
1877
1878 return SCIP_OKAY;
1879}
1880
1881/** marks constraint handler to delay all constraint updates until the next conshdlrProcessUpdates() call */
1882static
1884 SCIP_CONSHDLR* conshdlr /**< constraint handler */
1885 )
1886{
1887 assert(conshdlr != NULL);
1888
1889 SCIPdebugMessage("constraint updates of constraint handler <%s> will be delayed (count:%d)\n",
1890 conshdlr->name, conshdlr->delayupdatecount+1);
1891
1892 conshdlr->delayupdatecount++;
1893}
1894
1895/** marks constraint handler to perform all constraint updates immediately;
1896 * all delayed constraint updates will be processed
1897 */
1898static
1900 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1901 BMS_BLKMEM* blkmem, /**< block memory */
1902 SCIP_SET* set, /**< global SCIP settings */
1903 SCIP_STAT* stat /**< dynamic problem statistics */
1904 )
1905{
1906 assert(conshdlr != NULL);
1908
1909 SCIPsetDebugMsg(set, "constraint updates of constraint handler <%s> will be processed immediately (count:%d)\n",
1910 conshdlr->name, conshdlr->delayupdatecount);
1911 conshdlr->delayupdatecount--;
1912
1913 /* only run the update if all delays are taken away (reference counting) */
1914 if( !conshdlrAreUpdatesDelayed(conshdlr) )
1915 {
1916 SCIP_CALL( conshdlrProcessUpdates(conshdlr, blkmem, set, stat) );
1917 assert(conshdlr->nupdateconss == 0);
1918 }
1919
1920 return SCIP_OKAY;
1921}
1922
1923/** adds constraint to constraint handler's update constraint array and captures it */
1924static
1926 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1927 SCIP_SET* set, /**< global SCIP settings */
1928 SCIP_CONS* cons /**< constraint to add */
1929 )
1930{
1931 assert(conshdlr != NULL);
1932 assert(set != NULL);
1933 assert(cons != NULL);
1934 assert(cons->conshdlr == conshdlr);
1935
1936 if( !cons->update )
1937 {
1938 SCIPsetDebugMsg(set, "constraint <%s> of age %g has to be updated in constraint handler <%s> (consdata=%p)\n",
1939 cons->name, cons->age, conshdlr->name, (void*)cons->consdata);
1940
1941 /* add constraint to the updateconss array */
1942 SCIP_CALL( conshdlrEnsureUpdateconssMem(conshdlr, set, conshdlr->nupdateconss+1) );
1943 conshdlr->updateconss[conshdlr->nupdateconss] = cons;
1944 conshdlr->nupdateconss++;
1945
1946 /* capture constraint */
1947 SCIPconsCapture(cons);
1948
1949 cons->update = TRUE;
1950 }
1951
1952 return SCIP_OKAY;
1953}
1954
1955/** compares two constraint handlers w.r.t. their separation priority */
1956SCIP_DECL_SORTPTRCOMP(SCIPconshdlrCompSepa)
1957{ /*lint --e{715}*/
1958 return ((SCIP_CONSHDLR*)elem2)->sepapriority - ((SCIP_CONSHDLR*)elem1)->sepapriority;
1959}
1960
1961/** compares two constraint handlers w.r.t. their enforcing priority */
1962SCIP_DECL_SORTPTRCOMP(SCIPconshdlrCompEnfo)
1963{ /*lint --e{715}*/
1964 return ((SCIP_CONSHDLR*)elem2)->enfopriority - ((SCIP_CONSHDLR*)elem1)->enfopriority;
1965}
1966
1967/** compares two constraint handlers w.r.t. their feasibility check priority */
1968SCIP_DECL_SORTPTRCOMP(SCIPconshdlrCompCheck)
1969{ /*lint --e{715}*/
1970 return ((SCIP_CONSHDLR*)elem2)->checkpriority - ((SCIP_CONSHDLR*)elem1)->checkpriority;
1971}
1972
1973/** compares two constraints w.r.t. their feasibility check priority */
1974SCIP_DECL_SORTPTRCOMP(SCIPconsCompCheck)
1975{ /*lint --e{715}*/
1976 return ((SCIP_CONS*)elem2)->conshdlr->checkpriority - ((SCIP_CONS*)elem1)->conshdlr->checkpriority;
1977}
1978
1979/** copies the given constraint handler to a new scip */
1981 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
1982 SCIP_SET* set, /**< SCIP_SET of SCIP to copy to */
1983 SCIP_Bool* valid /**< was the copying process valid? */
1984 )
1985{
1986 assert(conshdlr != NULL);
1987 assert(set != NULL);
1988 assert(valid != NULL);
1989 assert(set->scip != NULL);
1990
1991 if( conshdlr->conshdlrcopy != NULL )
1992 {
1993 SCIPsetDebugMsg(set, "including constraint handler %s in subscip %p\n", SCIPconshdlrGetName(conshdlr), (void*)set->scip);
1994 SCIP_CALL( conshdlr->conshdlrcopy(set->scip, conshdlr, valid) );
1995 }
1996
1997 return SCIP_OKAY;
1998}
1999
2000/** internal method for creating a constraint handler */
2001static
2003 SCIP_CONSHDLR** conshdlr, /**< pointer to constraint handler data structure */
2004 SCIP_SET* set, /**< global SCIP settings */
2005 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2006 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
2007 const char* name, /**< name of constraint handler */
2008 const char* desc, /**< description of constraint handler */
2009 int sepapriority, /**< priority of the constraint handler for separation */
2010 int enfopriority, /**< priority of the constraint handler for constraint enforcing */
2011 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
2012 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
2013 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
2014 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
2015 * propagation and enforcement, -1 for no eager evaluations, 0 for first only */
2016 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
2017 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
2018 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
2019 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
2020 SCIP_PROPTIMING proptiming, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
2021 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the constraint handler's presolving method */
2022 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2023 SCIP_DECL_CONSFREE ((*consfree)), /**< destructor of constraint handler */
2024 SCIP_DECL_CONSINIT ((*consinit)), /**< initialize constraint handler */
2025 SCIP_DECL_CONSEXIT ((*consexit)), /**< deinitialize constraint handler */
2026 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2027 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2028 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2029 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2030 SCIP_DECL_CONSDELETE ((*consdelete)), /**< free specific constraint data */
2031 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2032 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2033 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
2034 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2035 SCIP_DECL_CONSENFOLP ((*consenfolp)), /**< enforcing constraints for LP solutions */
2036 SCIP_DECL_CONSENFORELAX ((*consenforelax)), /**< enforcing constraints for relaxation solutions */
2037 SCIP_DECL_CONSENFOPS ((*consenfops)), /**< enforcing constraints for pseudo solutions */
2038 SCIP_DECL_CONSCHECK ((*conscheck)), /**< check feasibility of primal solution */
2039 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
2040 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method */
2041 SCIP_DECL_CONSRESPROP ((*consresprop)), /**< propagation conflict resolving method */
2042 SCIP_DECL_CONSLOCK ((*conslock)), /**< variable rounding lock method */
2043 SCIP_DECL_CONSACTIVE ((*consactive)), /**< activation notification method */
2044 SCIP_DECL_CONSDEACTIVE((*consdeactive)), /**< deactivation notification method */
2045 SCIP_DECL_CONSENABLE ((*consenable)), /**< enabling notification method */
2046 SCIP_DECL_CONSDISABLE ((*consdisable)), /**< disabling notification method */
2047 SCIP_DECL_CONSDELVARS ((*consdelvars)), /**< variable deletion method */
2048 SCIP_DECL_CONSPRINT ((*consprint)), /**< constraint display method */
2049 SCIP_DECL_CONSCOPY ((*conscopy)), /**< constraint copying method */
2050 SCIP_DECL_CONSPARSE ((*consparse)), /**< constraint parsing method */
2051 SCIP_DECL_CONSGETVARS ((*consgetvars)), /**< constraint get variables method */
2052 SCIP_DECL_CONSGETNVARS((*consgetnvars)), /**< constraint get number of variable method */
2053 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), /**< constraint handler diving solution enforcement method */
2054 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)), /**< constraint permutation symmetry detection graph
2055 * getter method */
2056 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)), /**< constraint signed permutation
2057 * symmetry detection graph getter method */
2058 SCIP_CONSHDLRDATA* conshdlrdata /**< constraint handler data */
2059 )
2060{
2062 char paramdesc[SCIP_MAXSTRLEN];
2063
2064 assert(conshdlr != NULL);
2065 assert(name != NULL);
2066 assert(desc != NULL);
2067 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
2068 assert(consprop != NULL || propfreq == -1);
2069 assert(eagerfreq >= -1);
2070 assert(!needscons || ((conshdlrcopy == NULL) == (conscopy == NULL)));
2071
2072 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
2073 * error message
2074 */
2075 if( presoltiming < SCIP_PRESOLTIMING_NONE || presoltiming > SCIP_PRESOLTIMING_MAX )
2076 {
2077 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
2078 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", name);
2079
2081 }
2082
2083 /* both callbacks have to exist or not exist */
2084 assert((consgetvars != NULL) == (consgetnvars != NULL));
2085
2086 SCIP_ALLOC( BMSallocMemory(conshdlr) );
2087 BMSclearMemory(*conshdlr);
2088
2089 SCIP_ALLOC( BMSduplicateMemoryArray(&(*conshdlr)->name, name, strlen(name)+1) );
2090 SCIP_ALLOC( BMSduplicateMemoryArray(&(*conshdlr)->desc, desc, strlen(desc)+1) );
2091 (*conshdlr)->sepapriority = sepapriority;
2092 (*conshdlr)->enfopriority = enfopriority;
2093 (*conshdlr)->checkpriority = checkpriority;
2094 (*conshdlr)->sepafreq = sepafreq;
2095 (*conshdlr)->propfreq = propfreq;
2096 (*conshdlr)->eagerfreq = eagerfreq;
2097 (*conshdlr)->maxprerounds = maxprerounds;
2098 (*conshdlr)->conshdlrcopy = conshdlrcopy;
2099 (*conshdlr)->consfree = consfree;
2100 (*conshdlr)->consinit = consinit;
2101 (*conshdlr)->consexit = consexit;
2102 (*conshdlr)->consinitpre = consinitpre;
2103 (*conshdlr)->consexitpre = consexitpre;
2104 (*conshdlr)->consinitsol = consinitsol;
2105 (*conshdlr)->consexitsol = consexitsol;
2106 (*conshdlr)->consdelete = consdelete;
2107 (*conshdlr)->constrans = constrans;
2108 (*conshdlr)->consinitlp = consinitlp;
2109 (*conshdlr)->conssepalp = conssepalp;
2110 (*conshdlr)->conssepasol = conssepasol;
2111 (*conshdlr)->consenfolp = consenfolp;
2112 (*conshdlr)->consenforelax = consenforelax;
2113 (*conshdlr)->consenfops = consenfops;
2114 (*conshdlr)->conscheck = conscheck;
2115 (*conshdlr)->consprop = consprop;
2116 (*conshdlr)->conspresol = conspresol;
2117 (*conshdlr)->consresprop = consresprop;
2118 (*conshdlr)->conslock = conslock;
2119 (*conshdlr)->consactive = consactive;
2120 (*conshdlr)->consdeactive = consdeactive;
2121 (*conshdlr)->consenable = consenable;
2122 (*conshdlr)->consdisable = consdisable;
2123 (*conshdlr)->consprint = consprint;
2124 (*conshdlr)->consdelvars = consdelvars;
2125 (*conshdlr)->conscopy = conscopy;
2126 (*conshdlr)->consparse = consparse;
2127 (*conshdlr)->consgetvars = consgetvars;
2128 (*conshdlr)->consgetnvars = consgetnvars;
2129 (*conshdlr)->conshdlrdata = conshdlrdata;
2130 (*conshdlr)->consgetdivebdchgs = consgetdivebdchgs;
2131 (*conshdlr)->consgetpermsymgraph = consgetpermsymgraph;
2132 (*conshdlr)->consgetsignedpermsymgraph = consgetsignedpermsymgraph;
2133 (*conshdlr)->conss = NULL;
2134 (*conshdlr)->consssize = 0;
2135 (*conshdlr)->nconss = 0;
2136 (*conshdlr)->nactiveconss = 0;
2137 (*conshdlr)->maxnactiveconss = 0;
2138 (*conshdlr)->startnactiveconss = 0;
2139 (*conshdlr)->initconss = NULL;
2140 (*conshdlr)->initconsssize = 0;
2141 (*conshdlr)->ninitconss = 0;
2142 (*conshdlr)->ninitconsskept = 0;
2143 (*conshdlr)->sepaconss = NULL;
2144 (*conshdlr)->sepaconsssize = 0;
2145 (*conshdlr)->nsepaconss = 0;
2146 (*conshdlr)->nusefulsepaconss = 0;
2147 (*conshdlr)->enfoconss = NULL;
2148 (*conshdlr)->enfoconsssize = 0;
2149 (*conshdlr)->nenfoconss = 0;
2150 (*conshdlr)->nusefulenfoconss = 0;
2151 (*conshdlr)->checkconss = NULL;
2152 (*conshdlr)->checkconsssize = 0;
2153 (*conshdlr)->ncheckconss = 0;
2154 (*conshdlr)->nusefulcheckconss = 0;
2155 (*conshdlr)->propconss = NULL;
2156 (*conshdlr)->propconsssize = 0;
2157 (*conshdlr)->npropconss = 0;
2158 (*conshdlr)->nusefulpropconss = 0;
2159 (*conshdlr)->nmarkedpropconss = 0;
2160 (*conshdlr)->updateconss = NULL;
2161 (*conshdlr)->updateconsssize = 0;
2162 (*conshdlr)->nupdateconss = 0;
2163 (*conshdlr)->nenabledconss = 0;
2164 (*conshdlr)->lastnusefulpropconss = 0;
2165 (*conshdlr)->lastnusefulsepaconss = 0;
2166 (*conshdlr)->lastnusefulenfoconss = 0;
2167
2168 (*conshdlr)->storedpropconss = NULL;
2169 (*conshdlr)->storedpropconsssize = 0;
2170 (*conshdlr)->storednmarkedpropconss = 0;
2171 (*conshdlr)->storedpropdomchgcount = 0;
2172
2173 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->setuptime, SCIP_CLOCKTYPE_DEFAULT) );
2174 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->presoltime, SCIP_CLOCKTYPE_DEFAULT) );
2175 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->sepatime, SCIP_CLOCKTYPE_DEFAULT) );
2176 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->enfolptime, SCIP_CLOCKTYPE_DEFAULT) );
2177 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->enfopstime, SCIP_CLOCKTYPE_DEFAULT) );
2178 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->enforelaxtime, SCIP_CLOCKTYPE_DEFAULT) );
2179 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->proptime, SCIP_CLOCKTYPE_DEFAULT) );
2180 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->sbproptime, SCIP_CLOCKTYPE_DEFAULT) );
2181 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->checktime, SCIP_CLOCKTYPE_DEFAULT) );
2182 SCIP_CALL( SCIPclockCreate(&(*conshdlr)->resproptime, SCIP_CLOCKTYPE_DEFAULT) );
2183
2184 (*conshdlr)->nsepacalls = 0;
2185 (*conshdlr)->nenfolpcalls = 0;
2186 (*conshdlr)->nenfopscalls = 0;
2187 (*conshdlr)->nenforelaxcalls = 0;
2188 (*conshdlr)->npropcalls = 0;
2189 (*conshdlr)->ncheckcalls = 0;
2190 (*conshdlr)->nrespropcalls = 0;
2191 (*conshdlr)->ncutoffs = 0;
2192 (*conshdlr)->ncutsfound = 0;
2193 (*conshdlr)->ncutsapplied = 0;
2194 (*conshdlr)->nconssfound = 0;
2195 (*conshdlr)->ndomredsfound = 0;
2196 (*conshdlr)->nchildren = 0;
2197 (*conshdlr)->lastpropdomchgcount = -1;
2198 (*conshdlr)->lastsepalpcount = -1;
2199 (*conshdlr)->lastenfolplpcount = -1;
2200 (*conshdlr)->lastenfolpdomchgcount = -1;
2201 (*conshdlr)->lastenfopsdomchgcount = -1;
2202 (*conshdlr)->lastenforelaxdomchgcount = -1;
2203 (*conshdlr)->lastenforelaxrelaxcount = -1;
2204 (*conshdlr)->lastenfolpnode = -1;
2205 (*conshdlr)->lastenfopsnode = -1;
2206 (*conshdlr)->lastenfolpresult = SCIP_DIDNOTRUN;
2207 (*conshdlr)->lastenfopsresult = SCIP_DIDNOTRUN;
2208 (*conshdlr)->lastenforelaxresult = SCIP_DIDNOTRUN;
2209 (*conshdlr)->lastnfixedvars = 0;
2210 (*conshdlr)->lastnaggrvars = 0;
2211 (*conshdlr)->lastnchgvartypes = 0;
2212 (*conshdlr)->lastnchgbds = 0;
2213 (*conshdlr)->lastnaddholes = 0;
2214 (*conshdlr)->lastndelconss = 0;
2215 (*conshdlr)->lastnaddconss = 0;
2216 (*conshdlr)->lastnupgdconss = 0;
2217 (*conshdlr)->lastnchgcoefs = 0;
2218 (*conshdlr)->lastnchgsides = 0;
2219 (*conshdlr)->nfixedvars = 0;
2220 (*conshdlr)->naggrvars = 0;
2221 (*conshdlr)->nchgvartypes = 0;
2222 (*conshdlr)->nchgbds = 0;
2223 (*conshdlr)->naddholes = 0;
2224 (*conshdlr)->ndelconss = 0;
2225 (*conshdlr)->naddconss = 0;
2226 (*conshdlr)->nupgdconss = 0;
2227 (*conshdlr)->nchgcoefs = 0;
2228 (*conshdlr)->nchgsides = 0;
2229 (*conshdlr)->npresolcalls = 0;
2230 (*conshdlr)->delayupdatecount = 0;
2231 (*conshdlr)->ageresetavg = AGERESETAVG_INIT;
2232 (*conshdlr)->needscons = needscons;
2233 (*conshdlr)->sepalpwasdelayed = FALSE;
2234 (*conshdlr)->sepasolwasdelayed = FALSE;
2235 (*conshdlr)->propwasdelayed = FALSE;
2236 (*conshdlr)->duringsepa = FALSE;
2237 (*conshdlr)->duringprop = FALSE;
2238 (*conshdlr)->exact = FALSE;
2239 (*conshdlr)->initialized = FALSE;
2240
2241 /* add parameters */
2242 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/sepafreq", name);
2243 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2244 "frequency for separating cuts (-1: never, 0: only in root node)",
2245 &(*conshdlr)->sepafreq, FALSE, sepafreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2246
2247 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/propfreq", name);
2248 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2249 "frequency for propagating domains (-1: never, 0: only in root node)",
2250 &(*conshdlr)->propfreq, FALSE, propfreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2251
2252 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/proptiming", name);
2253 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing when constraint propagation should be called (%u:BEFORELP, %u:DURINGLPLOOP, %u:AFTERLPLOOP, %u:ALWAYS)", SCIP_PROPTIMING_BEFORELP, SCIP_PROPTIMING_DURINGLPLOOP, SCIP_PROPTIMING_AFTERLPLOOP, SCIP_PROPTIMING_ALWAYS);
2254 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
2255 (int*)(&(*conshdlr)->proptiming), TRUE, (int) proptiming, (int) SCIP_PROPTIMING_BEFORELP, (int) SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
2256
2257 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/eagerfreq", name);
2258 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2259 "frequency for using all instead of only the useful constraints in separation, propagation and enforcement (-1: never, 0: only in first evaluation)",
2260 &(*conshdlr)->eagerfreq, TRUE, eagerfreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2261
2262 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/maxprerounds", name);
2263 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2264 "maximal number of presolving rounds the constraint handler participates in (-1: no limit)",
2265 &(*conshdlr)->maxprerounds, TRUE, maxprerounds, -1, INT_MAX, NULL, NULL) );
2266
2267 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/delaysepa", name);
2268 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
2269 "should separation method be delayed, if other separators found cuts?",
2270 &(*conshdlr)->delaysepa, TRUE, delaysepa, NULL, NULL) ); /*lint !e740*/
2271
2272 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/delayprop", name);
2273 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
2274 "should propagation method be delayed, if other propagators found reductions?",
2275 &(*conshdlr)->delayprop, TRUE, delayprop, NULL, NULL) ); /*lint !e740*/
2276
2277 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/presoltiming", name);
2278 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of the constraint handler's presolving method (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
2280 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
2281 (int*)&(*conshdlr)->presoltiming, TRUE, (int) presoltiming, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740 !e713*/
2282
2283 return SCIP_OKAY;
2284}
2285
2286/** creates a constraint handler */
2288 SCIP_CONSHDLR** conshdlr, /**< pointer to constraint handler data structure */
2289 SCIP_SET* set, /**< global SCIP settings */
2290 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2291 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
2292 const char* name, /**< name of constraint handler */
2293 const char* desc, /**< description of constraint handler */
2294 int sepapriority, /**< priority of the constraint handler for separation */
2295 int enfopriority, /**< priority of the constraint handler for constraint enforcing */
2296 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
2297 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
2298 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
2299 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
2300 * propagation and enforcement, -1 for no eager evaluations, 0 for first only */
2301 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
2302 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
2303 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
2304 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
2305 SCIP_PROPTIMING proptiming, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
2306 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the constraint handler's presolving method */
2307 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2308 SCIP_DECL_CONSFREE ((*consfree)), /**< destructor of constraint handler */
2309 SCIP_DECL_CONSINIT ((*consinit)), /**< initialize constraint handler */
2310 SCIP_DECL_CONSEXIT ((*consexit)), /**< deinitialize constraint handler */
2311 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2312 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2313 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2314 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2315 SCIP_DECL_CONSDELETE ((*consdelete)), /**< free specific constraint data */
2316 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2317 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2318 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
2319 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2320 SCIP_DECL_CONSENFOLP ((*consenfolp)), /**< enforcing constraints for LP solutions */
2321 SCIP_DECL_CONSENFORELAX ((*consenforelax)), /**< enforcing constraints for relaxation solutions */
2322 SCIP_DECL_CONSENFOPS ((*consenfops)), /**< enforcing constraints for pseudo solutions */
2323 SCIP_DECL_CONSCHECK ((*conscheck)), /**< check feasibility of primal solution */
2324 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
2325 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method */
2326 SCIP_DECL_CONSRESPROP ((*consresprop)), /**< propagation conflict resolving method */
2327 SCIP_DECL_CONSLOCK ((*conslock)), /**< variable rounding lock method */
2328 SCIP_DECL_CONSACTIVE ((*consactive)), /**< activation notification method */
2329 SCIP_DECL_CONSDEACTIVE((*consdeactive)), /**< deactivation notification method */
2330 SCIP_DECL_CONSENABLE ((*consenable)), /**< enabling notification method */
2331 SCIP_DECL_CONSDISABLE ((*consdisable)), /**< disabling notification method */
2332 SCIP_DECL_CONSDELVARS ((*consdelvars)), /**< variable deletion method */
2333 SCIP_DECL_CONSPRINT ((*consprint)), /**< constraint display method */
2334 SCIP_DECL_CONSCOPY ((*conscopy)), /**< constraint copying method */
2335 SCIP_DECL_CONSPARSE ((*consparse)), /**< constraint parsing method */
2336 SCIP_DECL_CONSGETVARS ((*consgetvars)), /**< constraint get variables method */
2337 SCIP_DECL_CONSGETNVARS((*consgetnvars)), /**< constraint get number of variable method */
2338 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), /**< constraint handler diving solution enforcement method */
2339 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)), /**< constraint permutation symmetry detection graph
2340 * getter method */
2341 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)), /**< constraint signed permutation symmetry
2342 * detection graph getter method */
2343 SCIP_CONSHDLRDATA* conshdlrdata /**< constraint handler data */
2344 )
2345{
2346 assert(conshdlr != NULL);
2347 assert(name != NULL);
2348 assert(desc != NULL);
2349 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
2350 assert(consprop != NULL || propfreq == -1);
2351 assert(eagerfreq >= -1);
2352 assert(!needscons || ((conshdlrcopy == NULL) == (conscopy == NULL)));
2353
2354 SCIP_CALL_FINALLY( doConshdlrCreate(conshdlr, set, messagehdlr, blkmem, name, desc, sepapriority, enfopriority,
2355 checkpriority, sepafreq, propfreq, eagerfreq, maxprerounds, delaysepa, delayprop, needscons, proptiming,
2356 presoltiming, conshdlrcopy, consfree, consinit, consexit, consinitpre, consexitpre, consinitsol, consexitsol,
2357 consdelete, constrans, consinitlp, conssepalp, conssepasol, consenfolp, consenforelax, consenfops, conscheck,
2358 consprop, conspresol, consresprop, conslock, consactive, consdeactive, consenable, consdisable, consdelvars,
2359 consprint, conscopy, consparse, consgetvars, consgetnvars, consgetdivebdchgs, consgetpermsymgraph,
2360 consgetsignedpermsymgraph, conshdlrdata),
2361 (void) SCIPconshdlrFree(conshdlr, set) );
2362
2363 return SCIP_OKAY;
2364} /*lint !e715*/
2365
2366/** calls destructor and frees memory of constraint handler */
2368 SCIP_CONSHDLR** conshdlr, /**< pointer to constraint handler data structure */
2369 SCIP_SET* set /**< global SCIP settings */
2370 )
2371{
2372 assert(conshdlr != NULL);
2373 if( *conshdlr == NULL )
2374 return SCIP_OKAY;
2375 assert(!(*conshdlr)->initialized);
2376 assert((*conshdlr)->nconss == 0);
2377 assert(set != NULL);
2378
2379 /* call destructor of constraint handler */
2380 if( (*conshdlr)->consfree != NULL )
2381 {
2382 SCIP_CALL( (*conshdlr)->consfree(set->scip, *conshdlr) );
2383 }
2384
2385 SCIPclockFree(&(*conshdlr)->resproptime);
2386 SCIPclockFree(&(*conshdlr)->checktime);
2387 SCIPclockFree(&(*conshdlr)->sbproptime);
2388 SCIPclockFree(&(*conshdlr)->proptime);
2389 SCIPclockFree(&(*conshdlr)->enforelaxtime);
2390 SCIPclockFree(&(*conshdlr)->enfopstime);
2391 SCIPclockFree(&(*conshdlr)->enfolptime);
2392 SCIPclockFree(&(*conshdlr)->sepatime);
2393 SCIPclockFree(&(*conshdlr)->presoltime);
2394 SCIPclockFree(&(*conshdlr)->setuptime);
2395
2396 BMSfreeMemoryArrayNull(&(*conshdlr)->name);
2397 BMSfreeMemoryArrayNull(&(*conshdlr)->desc);
2398 BMSfreeMemoryArrayNull(&(*conshdlr)->conss);
2399 BMSfreeMemoryArrayNull(&(*conshdlr)->initconss);
2400 BMSfreeMemoryArrayNull(&(*conshdlr)->sepaconss);
2401 BMSfreeMemoryArrayNull(&(*conshdlr)->enfoconss);
2402 BMSfreeMemoryArrayNull(&(*conshdlr)->checkconss);
2403 BMSfreeMemoryArrayNull(&(*conshdlr)->propconss);
2404 BMSfreeMemoryArrayNull(&(*conshdlr)->updateconss);
2405 BMSfreeMemoryArrayNull(&(*conshdlr)->storedpropconss);
2406 BMSfreeMemory(conshdlr);
2407
2408 return SCIP_OKAY;
2409}
2410
2411/** calls initialization method of constraint handler */
2413 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2414 BMS_BLKMEM* blkmem, /**< block memory */
2415 SCIP_SET* set, /**< global SCIP settings */
2416 SCIP_STAT* stat /**< dynamic problem statistics */
2417 )
2418{
2419 assert(conshdlr != NULL);
2420 assert(set != NULL);
2421
2422 /* skip non-exact constraint handlers during exact solving mode */
2423 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2424 if( set->exact_enable && !conshdlr->exact )
2425 return SCIP_OKAY;
2426
2427 if( conshdlr->initialized )
2428 {
2429 SCIPerrorMessage("constraint handler <%s> already initialized\n", conshdlr->name);
2430 return SCIP_INVALIDCALL;
2431 }
2432
2433 if( set->misc_resetstat )
2434 {
2435 SCIPclockReset(conshdlr->setuptime);
2436 SCIPclockReset(conshdlr->presoltime);
2437 SCIPclockReset(conshdlr->sepatime);
2438 SCIPclockReset(conshdlr->enfolptime);
2439 SCIPclockReset(conshdlr->enfopstime);
2440 SCIPclockReset(conshdlr->enforelaxtime);
2441 SCIPclockReset(conshdlr->proptime);
2442 SCIPclockReset(conshdlr->sbproptime);
2443 SCIPclockReset(conshdlr->checktime);
2444 SCIPclockReset(conshdlr->resproptime);
2445
2446 conshdlr->nsepacalls = 0;
2447 conshdlr->nenfolpcalls = 0;
2448 conshdlr->nenfopscalls = 0;
2449 conshdlr->nenforelaxcalls = 0;
2450 conshdlr->npropcalls = 0;
2451 conshdlr->ncheckcalls = 0;
2452 conshdlr->nrespropcalls = 0;
2453 conshdlr->ncutoffs = 0;
2454 conshdlr->ncutsfound = 0;
2455 conshdlr->ncutsapplied = 0;
2456 conshdlr->nconssfound = 0;
2457 conshdlr->ndomredsfound = 0;
2458 conshdlr->nchildren = 0;
2459 conshdlr->lastpropdomchgcount = -1;
2460 conshdlr->lastenfolpdomchgcount = -1;
2461 conshdlr->lastenfopsdomchgcount = -1;
2462 conshdlr->lastenforelaxdomchgcount = -1;
2463 conshdlr->lastenforelaxrelaxcount = -1;
2464 conshdlr->lastenfolpnode = -1;
2465 conshdlr->lastenfopsnode = -1;
2466 conshdlr->lastenfolpresult = SCIP_DIDNOTRUN;
2467 conshdlr->lastenfopsresult = SCIP_DIDNOTRUN;
2468 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2469 conshdlr->startnactiveconss = 0;
2470 conshdlr->lastsepalpcount = -1;
2471 conshdlr->lastenfolplpcount = -1;
2472 conshdlr->lastnusefulpropconss = 0;
2473 conshdlr->lastnusefulsepaconss = 0;
2474 conshdlr->lastnusefulenfoconss = 0;
2475 conshdlr->lastnfixedvars = 0;
2476 conshdlr->lastnaggrvars = 0;
2477 conshdlr->lastnchgvartypes = 0;
2478 conshdlr->lastnchgbds = 0;
2479 conshdlr->lastnaddholes = 0;
2480 conshdlr->lastndelconss = 0;
2481 conshdlr->lastnaddconss = 0;
2482 conshdlr->lastnupgdconss = 0;
2483 conshdlr->lastnchgcoefs = 0;
2484 conshdlr->lastnchgsides = 0;
2485 conshdlr->nfixedvars = 0;
2486 conshdlr->naggrvars = 0;
2487 conshdlr->nchgvartypes = 0;
2488 conshdlr->nchgbds = 0;
2489 conshdlr->naddholes = 0;
2490 conshdlr->ndelconss = 0;
2491 conshdlr->naddconss = 0;
2492 conshdlr->nupgdconss = 0;
2493 conshdlr->nchgcoefs = 0;
2494 conshdlr->nchgsides = 0;
2495 conshdlr->npresolcalls = 0;
2496 conshdlr->ageresetavg = AGERESETAVG_INIT;
2497 conshdlr->sepalpwasdelayed = FALSE;
2498 conshdlr->sepasolwasdelayed = FALSE;
2499 conshdlr->propwasdelayed = FALSE;
2500 }
2501
2502 /* call initialization method of constraint handler */
2503 if( conshdlr->consinit != NULL )
2504 {
2505 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2506 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2507 * external method; to avoid this, these changes will be buffered and processed after the method call
2508 */
2509 conshdlrDelayUpdates(conshdlr);
2510
2511 /* start timing */
2512 SCIPclockStart(conshdlr->setuptime, set);
2513
2514 /* call external method */
2515 SCIP_CALL( conshdlr->consinit(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2516
2517 /* stop timing */
2518 SCIPclockStop(conshdlr->setuptime, set);
2519
2520 /* perform the cached constraint updates */
2521 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2522 }
2523 conshdlr->initialized = TRUE;
2525
2526 return SCIP_OKAY;
2527}
2528
2529/** calls exit method of constraint handler */
2531 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2532 BMS_BLKMEM* blkmem, /**< block memory */
2533 SCIP_SET* set, /**< global SCIP settings */
2534 SCIP_STAT* stat /**< dynamic problem statistics */
2535 )
2536{
2537 assert(conshdlr != NULL);
2538 assert(set != NULL);
2539
2540 /* skip non-exact constraint handlers during exact solving mode */
2541 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2542 if( set->exact_enable && !conshdlr->exact )
2543 return SCIP_OKAY;
2544
2545 if( !conshdlr->initialized )
2546 {
2547 SCIPerrorMessage("constraint handler <%s> not initialized\n", conshdlr->name);
2548 return SCIP_INVALIDCALL;
2549 }
2550
2551 /* call deinitialization method of constraint handler */
2552 if( conshdlr->consexit != NULL )
2553 {
2554 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2555 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2556 * external method; to avoid this, these changes will be buffered and processed after the method call
2557 */
2558 conshdlrDelayUpdates(conshdlr);
2559
2560 /* start timing */
2561 SCIPclockStart(conshdlr->setuptime, set);
2562
2563 /* call external method */
2564 SCIP_CALL( conshdlr->consexit(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2565
2566 /* stop timing */
2567 SCIPclockStop(conshdlr->setuptime, set);
2568
2569 /* perform the cached constraint updates */
2570 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2571 }
2572 conshdlr->initialized = FALSE;
2573
2574 return SCIP_OKAY;
2575}
2576
2577/** informs constraint handler that the presolving process is being started */
2579 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2580 BMS_BLKMEM* blkmem, /**< block memory */
2581 SCIP_SET* set, /**< global SCIP settings */
2582 SCIP_STAT* stat /**< dynamic problem statistics */
2583 )
2584{
2585 assert(conshdlr != NULL);
2586 assert(set != NULL);
2587
2588 /* skip non-exact constraint handlers during exact solving mode */
2589 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2590 if( set->exact_enable && !conshdlr->exact )
2591 return SCIP_OKAY;
2592
2593 /* reset conshdlr last presolved data in case of a restart */
2594 conshdlr->lastpropdomchgcount = -1;
2595 conshdlr->lastenfolpdomchgcount = -1;
2596 conshdlr->lastenfopsdomchgcount = -1;
2597 conshdlr->lastenforelaxdomchgcount = -1;
2598 conshdlr->lastenforelaxrelaxcount = -1;
2599 conshdlr->lastenfolpnode = -1;
2600 conshdlr->lastenfopsnode = -1;
2601 conshdlr->lastenfolpresult = SCIP_DIDNOTRUN;
2602 conshdlr->lastenfopsresult = SCIP_DIDNOTRUN;
2604 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2605 conshdlr->startnactiveconss = 0;
2606 conshdlr->lastsepalpcount = -1;
2607 conshdlr->lastenfolplpcount = -1;
2608 conshdlr->lastnusefulpropconss = 0;
2609 conshdlr->lastnusefulsepaconss = 0;
2610 conshdlr->lastnusefulenfoconss = 0;
2611 conshdlr->lastnfixedvars = 0;
2612 conshdlr->lastnaggrvars = 0;
2613 conshdlr->lastnchgvartypes = 0;
2614 conshdlr->lastnchgbds = 0;
2615 conshdlr->lastnaddholes = 0;
2616 conshdlr->lastndelconss = 0;
2617 conshdlr->lastnaddconss = 0;
2618 conshdlr->lastnupgdconss = 0;
2619 conshdlr->lastnchgcoefs = 0;
2620 conshdlr->lastnchgsides = 0;
2621 conshdlr->propwasdelayed = FALSE;
2622
2623 /* call presolving initialization method of constraint handler */
2624 if( conshdlr->consinitpre != NULL )
2625 {
2626 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2627 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2628 * external method; to avoid this, these changes will be buffered and processed after the method call
2629 */
2630 conshdlrDelayUpdates(conshdlr);
2631
2632 /* start timing */
2633 SCIPclockStart(conshdlr->setuptime, set);
2634
2635 /* call external method */
2636 SCIP_CALL( conshdlr->consinitpre(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2637
2638 /* stop timing */
2639 SCIPclockStop(conshdlr->setuptime, set);
2640
2641 /* perform the cached constraint updates */
2642 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2643 }
2644
2645 /* after a restart the LP is empty but the initial constraints are not included in the initialconss array anymore;
2646 * we have to put them back into this array in order to obtain the correct initial root relaxation
2647 */
2648 if( stat->nruns >= 2 )
2649 {
2650 int c;
2651
2652 for( c = 0; c < conshdlr->nconss; ++c )
2653 {
2654 /**@todo should only active constraints be added to the initconss array? at least cons->active is asserted in
2655 * conshdlrAddInitcons(conshdlr, set, conshdlr->conss[c])
2656 */
2657 if( conshdlr->conss[c]->addarraypos >= 0 && !conshdlr->conss[c]->deleted &&
2658 conshdlr->conss[c]->initial && conshdlr->conss[c]->initconsspos == -1 )
2659 {
2660 SCIP_CALL( conshdlrAddInitcons(conshdlr, set, stat, conshdlr->conss[c]) );
2661 }
2662 }
2663 }
2664
2665 return SCIP_OKAY;
2666}
2667
2668/** informs constraint handler that the presolving is finished */
2670 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2671 BMS_BLKMEM* blkmem, /**< block memory */
2672 SCIP_SET* set, /**< global SCIP settings */
2673 SCIP_STAT* stat /**< dynamic problem statistics */
2674 )
2675{
2676 assert(conshdlr != NULL);
2677 assert(set != NULL);
2678
2679 /* skip non-exact constraint handlers during exact solving mode */
2680 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2681 if( set->exact_enable && !conshdlr->exact )
2682 return SCIP_OKAY;
2683
2684 /* call presolving deinitialization method of constraint handler */
2685 if( conshdlr->consexitpre != NULL )
2686 {
2687 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2688 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2689 * external method; to avoid this, these changes will be buffered and processed after the method call
2690 */
2691 conshdlrDelayUpdates(conshdlr);
2692
2693 /* start timing */
2694 SCIPclockStart(conshdlr->setuptime, set);
2695
2696 /* call external method */
2697 SCIP_CALL( conshdlr->consexitpre(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2698
2699 /* stop timing */
2700 SCIPclockStop(conshdlr->setuptime, set);
2701
2702 /* perform the cached constraint updates */
2703 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2704 }
2705
2706 /* update statistics */
2707 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2708 conshdlr->startnactiveconss = conshdlr->nactiveconss;
2709
2710 return SCIP_OKAY;
2711}
2712
2713/** informs constraint handler that the branch and bound process is being started */
2715 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2716 BMS_BLKMEM* blkmem, /**< block memory */
2717 SCIP_SET* set, /**< global SCIP settings */
2718 SCIP_STAT* stat /**< dynamic problem statistics */
2719 )
2720{
2721 assert(conshdlr != NULL);
2722 assert(set != NULL);
2723 assert(stat != NULL);
2724
2725 /* skip non-exact constraint handlers during exact solving mode */
2726 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2727 if( set->exact_enable && !conshdlr->exact )
2728 return SCIP_OKAY;
2729
2730 conshdlr->sepalpwasdelayed = FALSE;
2731 conshdlr->sepasolwasdelayed = FALSE;
2732
2733 /* call solving process initialization method of constraint handler */
2734 if( conshdlr->consinitsol != NULL )
2735 {
2736 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2737 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2738 * external method; to avoid this, these changes will be buffered and processed after the method call
2739 */
2740 conshdlrDelayUpdates(conshdlr);
2741
2742 /* start timing */
2743 SCIPclockStart(conshdlr->setuptime, set);
2744
2745 /* call external method */
2746 SCIP_CALL( conshdlr->consinitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2747
2748 /* stop timing */
2749 SCIPclockStop(conshdlr->setuptime, set);
2750
2751 /* perform the cached constraint updates */
2752 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2753 }
2754
2755 return SCIP_OKAY;
2756}
2757
2758/** informs constraint handler that the branch and bound process data is being freed */
2760 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2761 BMS_BLKMEM* blkmem, /**< block memory */
2762 SCIP_SET* set, /**< global SCIP settings */
2763 SCIP_STAT* stat, /**< dynamic problem statistics */
2764 SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
2765 )
2766{
2767 assert(conshdlr != NULL);
2768 assert(set != NULL);
2769
2770 /* skip non-exact constraint handlers during exact solving mode */
2771 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2772 if( set->exact_enable && !conshdlr->exact )
2773 return SCIP_OKAY;
2774
2775 /* call solving process deinitialization method of constraint handler */
2776 if( conshdlr->consexitsol != NULL )
2777 {
2778 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2779 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2780 * external method; to avoid this, these changes will be buffered and processed after the method call
2781 */
2782 conshdlrDelayUpdates(conshdlr);
2783
2784 /* start timing */
2785 SCIPclockStart(conshdlr->setuptime, set);
2786
2787 /* call external method */
2788 SCIP_CALL( conshdlr->consexitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss, restart) );
2789
2790 /* stop timing */
2791 SCIPclockStop(conshdlr->setuptime, set);
2792
2793 /* perform the cached constraint updates */
2794 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2795 }
2796
2797 return SCIP_OKAY;
2798}
2799
2800/** calls LP initialization method of constraint handler to separate all initial active constraints */
2802 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2803 BMS_BLKMEM* blkmem, /**< block memory */
2804 SCIP_SET* set, /**< global SCIP settings */
2805 SCIP_STAT* stat, /**< dynamic problem statistics */
2806 SCIP_TREE* tree, /**< branch and bound tree */
2807 SCIP_Bool initkeptconss, /**< Also initialize constraints which are valid at a more global node,
2808 * but were not activated there? Should be FALSE for repeated calls at
2809 * one node or if the current focusnode is a child of the former one */
2810 SCIP_Bool* cutoff /**< pointer to store whether infeasibility was detected while building the LP */
2811 )
2812{
2813 assert(conshdlr != NULL);
2814 assert(cutoff != NULL);
2815#ifdef MORE_DEBUG
2816 assert(stat->nnodes > 1 || conshdlr->ninitconsskept == 0 || SCIPtreeProbing(tree));
2817#endif
2818
2819 *cutoff = FALSE;
2820
2821 /* skip non-exact constraint handlers during exact solving mode */
2822 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2823 if( set->exact_enable && !conshdlr->exact )
2824 return SCIP_OKAY;
2825
2826 if( conshdlr->consinitlp != NULL )
2827 {
2828 int currentdepth;
2829 int oldninitconss;
2830 int c;
2831
2832 SCIPsetDebugMsg(set, "initializing LP with %d initial constraints of handler <%s> (ninitconss=%d, kept=%d, initkept=%u)\n",
2833 initkeptconss ? conshdlr->ninitconss : conshdlr->ninitconss - conshdlr->ninitconsskept, conshdlr->name,
2834 conshdlr->ninitconss, conshdlr->ninitconsskept, initkeptconss);
2835
2836 /* no constraints to initialize (or only kept constraints which do not need to be initialized this time) -> return */
2837 if( conshdlr->needscons && (conshdlr->ninitconss == 0 || (!initkeptconss && conshdlr->ninitconss == conshdlr->ninitconsskept)) )
2838 return SCIP_OKAY;
2839
2840 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2841 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2842 * external method; to avoid this, these changes will be buffered and processed after the method call
2843 */
2844 conshdlrDelayUpdates(conshdlr);
2845
2846 oldninitconss = conshdlr->ninitconss;
2847
2848 /* start timing */
2849 SCIPclockStart(conshdlr->sepatime, set);
2850
2851 if( initkeptconss )
2852 {
2853 /* add all kept initial constraints which are currently active to the second part of the initconss array */
2854 /* @todo keep track of where a constraint was already initialized (e.g., in the conssetchg)? */
2855 for( c = 0; c < conshdlr->ninitconsskept; ++c )
2856 {
2857 assert(conshdlr->initconss[c]->initconsspos == c);
2858
2859 if( SCIPconsIsActive(conshdlr->initconss[c]) )
2860 {
2861 SCIP_CALL( conshdlrAddInitcons(conshdlr, set, stat, conshdlr->initconss[c]) );
2862 }
2863 }
2864 }
2865
2866 /* call external method */
2867 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &conshdlr->initconss[conshdlr->ninitconsskept],
2868 conshdlr->ninitconss - conshdlr->ninitconsskept, cutoff) );
2869
2870 /* stop timing */
2871 SCIPclockStop(conshdlr->sepatime, set);
2872
2873 /* perform the cached constraint updates */
2874 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2875
2876 currentdepth = SCIPtreeGetCurrentDepth(tree);
2877 assert(currentdepth >= 0);
2878
2879 /* clear the initconss array */
2880 for( c = conshdlr->ninitconsskept; c < oldninitconss; ++c )
2881 {
2882 assert(SCIPconsGetActiveDepth(conshdlr->initconss[c]) >= -1);
2883 assert(SCIPconsGetActiveDepth(conshdlr->initconss[c]) <= currentdepth);
2884
2885 /* if the constraint was not initialized at its valid node, we keep it */
2886 if( currentdepth > 0 ? SCIPconsGetActiveDepth(conshdlr->initconss[c]) != currentdepth :
2887 SCIPconsGetActiveDepth(conshdlr->initconss[c]) > 0 )
2888 {
2889 conshdlr->initconss[conshdlr->ninitconsskept] = conshdlr->initconss[c];
2890 conshdlr->initconss[conshdlr->ninitconsskept]->initconsspos = conshdlr->ninitconsskept;
2891 ++(conshdlr->ninitconsskept);
2892 }
2893 else
2894 conshdlr->initconss[c]->initconsspos = -1;
2895 }
2896#ifndef NDEBUG
2897 for( ; c < conshdlr->ninitconss; ++c )
2898 assert(conshdlr->initconss[c]->initconsspos < conshdlr->ninitconsskept);
2899#endif
2900 conshdlr->ninitconss = conshdlr->ninitconsskept;
2901
2902 if( conshdlr->ninitconss == 0 )
2903 {
2905 conshdlr->initconsssize = 0;
2906 }
2907 }
2908
2909 return SCIP_OKAY;
2910}
2911
2912/** calls separator method of constraint handler to separate LP solution */
2914 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2915 BMS_BLKMEM* blkmem, /**< block memory */
2916 SCIP_SET* set, /**< global SCIP settings */
2917 SCIP_STAT* stat, /**< dynamic problem statistics */
2918 SCIP_SEPASTORE* sepastore, /**< separation storage */
2919 int depth, /**< depth of current node */
2920 SCIP_Bool execdelayed, /**< execute separation method even if it is marked to be delayed */
2921 SCIP_RESULT* result /**< pointer to store the result of the callback method */
2922 )
2923{
2924 assert(conshdlr != NULL);
2925 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
2926 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
2927 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
2928 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
2929 assert(stat != NULL);
2930 assert(conshdlr->lastsepalpcount != stat->lpcount
2931 || (0 <= conshdlr->lastnusefulsepaconss && conshdlr->lastnusefulsepaconss <= conshdlr->nusefulsepaconss));
2932 assert(set != NULL);
2933 assert(result != NULL);
2934
2936
2937 /* skip non-exact constraint handlers during exact solving mode */
2938 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
2939 if( set->exact_enable && !conshdlr->exact )
2940 return SCIP_OKAY;
2941
2942 if( conshdlr->conssepalp != NULL
2943 && ((depth == 0 && conshdlr->sepafreq == 0)
2944 || (conshdlr->sepafreq > 0 && depth % conshdlr->sepafreq == 0)
2945 || conshdlr->sepalpwasdelayed) )
2946 {
2947 /* check, if separation method should be delayed */
2948 if( !conshdlr->delaysepa || execdelayed )
2949 {
2950 int nconss;
2951 int nusefulconss;
2952 int firstcons;
2953
2954 /* check, if this LP solution was already separated */
2955 if( conshdlr->lastsepalpcount == stat->lpcount )
2956 {
2957 /* all constraints that were not yet separated on the new LP solution must be useful constraints, which means,
2958 * that the new constraints are the last constraints of the useful ones
2959 */
2960 nconss = conshdlr->nusefulsepaconss - conshdlr->lastnusefulsepaconss;
2961 nusefulconss = nconss;
2962 firstcons = conshdlr->lastnusefulsepaconss;
2963 }
2964 else
2965 {
2966 /* on a new LP solution, we want to separate all constraints */
2967 nconss = conshdlr->nsepaconss;
2968 nusefulconss = conshdlr->nusefulsepaconss;
2969 firstcons = 0;
2970 }
2971 assert(firstcons >= 0);
2972 assert(firstcons + nconss <= conshdlr->nsepaconss);
2973 assert(nusefulconss <= nconss);
2974
2975 /* constraint handlers without constraints should only be called once */
2976 if( nconss > 0 || (!conshdlr->needscons && conshdlr->lastsepalpcount != stat->lpcount) )
2977 {
2978 SCIP_CONS** conss;
2979 SCIP_Longint oldndomchgs;
2980 SCIP_Longint oldnprobdomchgs;
2981 SCIP_Longint lastsepalpcount;
2982 int oldncuts;
2983 int oldnactiveconss;
2984 int lastnusefulsepaconss;
2985
2986 SCIPsetDebugMsg(set, "separating constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
2987 firstcons, firstcons + nconss - 1, conshdlr->nsepaconss, conshdlr->name,
2988 conshdlr->lastsepalpcount == stat->lpcount ? "old" : "new");
2989
2990 /* remember the number of processed constraints on the current LP solution */
2991 lastsepalpcount = stat->lpcount;
2992 lastnusefulsepaconss = conshdlr->nusefulsepaconss;
2993
2994 /* get the array of the constraints to be processed */
2995 conss = &(conshdlr->sepaconss[firstcons]);
2996
2997 oldndomchgs = stat->nboundchgs + stat->nholechgs;
2998 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
2999 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3000 oldnactiveconss = stat->nactiveconss;
3001
3002 /* check, if we want to use eager evaluation */
3003 if( (conshdlr->eagerfreq == 0 && conshdlr->nsepacalls == 0)
3004 || (conshdlr->eagerfreq > 0 && conshdlr->nsepacalls % conshdlr->eagerfreq == 0) )
3005 nusefulconss = nconss;
3006
3007 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3008 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3009 * external method; to avoid this, these changes will be buffered and processed after the method call
3010 */
3011 conshdlrDelayUpdates(conshdlr);
3012 conshdlr->duringsepa = TRUE;
3013
3014 /* start timing */
3015 SCIPclockStart(conshdlr->sepatime, set);
3016
3017 /* call external method */
3018 SCIP_CALL( conshdlr->conssepalp(set->scip, conshdlr, conss, nconss, nusefulconss, result) );
3019 SCIPsetDebugMsg(set, " -> separating LP returned result <%d>\n", *result);
3020
3021 /* stop timing */
3022 SCIPclockStop(conshdlr->sepatime, set);
3023
3024 /* perform the cached constraint updates */
3025 conshdlr->duringsepa = FALSE;
3026 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3027
3028 /* update statistics */
3029 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
3030 {
3031 conshdlr->lastsepalpcount = lastsepalpcount;
3032 conshdlr->lastnusefulsepaconss = MIN(lastnusefulsepaconss, conshdlr->nusefulsepaconss);
3033 conshdlr->nsepacalls++;
3034 }
3035 if( *result == SCIP_CUTOFF )
3036 conshdlr->ncutoffs++;
3037 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3038 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3039
3040 /* update domain reductions; therefore remove the domain
3041 * reduction counts which were generated in probing mode */
3042 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3043 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3044
3045 /* evaluate result */
3046 if( *result != SCIP_CUTOFF
3047 && *result != SCIP_CONSADDED
3048 && *result != SCIP_REDUCEDDOM
3049 && *result != SCIP_SEPARATED
3050 && *result != SCIP_NEWROUND
3051 && *result != SCIP_DIDNOTFIND
3052 && *result != SCIP_DIDNOTRUN
3053 && *result != SCIP_DELAYED )
3054 {
3055 SCIPerrorMessage("LP separation method of constraint handler <%s> returned invalid result <%d>\n",
3056 conshdlr->name, *result);
3057 return SCIP_INVALIDRESULT;
3058 }
3059 }
3060 }
3061 else
3062 {
3063 SCIPsetDebugMsg(set, "LP separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3065 }
3066
3067 /* remember whether separation method was delayed */
3068 conshdlr->sepalpwasdelayed = (*result == SCIP_DELAYED);
3069 }
3070
3071 return SCIP_OKAY;
3072}
3073
3074/** calls separator method of constraint handler to separate given primal solution */
3076 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3077 BMS_BLKMEM* blkmem, /**< block memory */
3078 SCIP_SET* set, /**< global SCIP settings */
3079 SCIP_STAT* stat, /**< dynamic problem statistics */
3080 SCIP_SEPASTORE* sepastore, /**< separation storage */
3081 SCIP_SOL* sol, /**< primal solution that should be separated */
3082 int depth, /**< depth of current node */
3083 SCIP_Bool execdelayed, /**< execute separation method even if it is marked to be delayed */
3084 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3085 )
3086{
3087 assert(conshdlr != NULL);
3088 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3089 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3090 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3091 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3092 assert(set != NULL);
3093 assert(stat != NULL);
3094 assert(result != NULL);
3095
3097
3098 /* skip non-exact constraint handlers during exact solving mode */
3099 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3100 if( set->exact_enable && !conshdlr->exact )
3101 return SCIP_OKAY;
3102
3103 if( conshdlr->conssepasol != NULL
3104 && ((depth == 0 && conshdlr->sepafreq == 0)
3105 || (conshdlr->sepafreq > 0 && depth % conshdlr->sepafreq == 0)
3106 || conshdlr->sepasolwasdelayed) )
3107 {
3108 /* check, if separation method should be delayed */
3109 if( !conshdlr->delaysepa || execdelayed )
3110 {
3111 int nconss;
3112 int nusefulconss;
3113
3114 /* always separate all constraints */
3115 nconss = conshdlr->nsepaconss;
3116 nusefulconss = conshdlr->nusefulsepaconss;
3117 assert(nusefulconss <= nconss);
3118
3119 if( nconss > 0 || !conshdlr->needscons )
3120 {
3121 SCIP_CONS** conss;
3122 SCIP_Longint oldndomchgs;
3123 SCIP_Longint oldnprobdomchgs;
3124 int oldncuts;
3125 int oldnactiveconss;
3126
3127 SCIPsetDebugMsg(set, "separating %d constraints of handler <%s> (primal solution %p)\n",
3128 nconss, conshdlr->name, (void*)sol);
3129
3130 /* get the array of the constraints to be processed */
3131 conss = conshdlr->sepaconss;
3132
3133 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3134 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3135 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3136 oldnactiveconss = stat->nactiveconss;
3137
3138 /* check, if we want to use eager evaluation */
3139 if( (conshdlr->eagerfreq == 0 && conshdlr->nsepacalls == 0)
3140 || (conshdlr->eagerfreq > 0 && conshdlr->nsepacalls % conshdlr->eagerfreq == 0) )
3141 nusefulconss = nconss;
3142
3143 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3144 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3145 * external method; to avoid this, these changes will be buffered and processed after the method call
3146 */
3147 conshdlrDelayUpdates(conshdlr);
3148 conshdlr->duringsepa = TRUE;
3149
3150 /* start timing */
3151 SCIPclockStart(conshdlr->sepatime, set);
3152
3153 /* call external method */
3154 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, conss, nconss, nusefulconss, sol, result) );
3155 SCIPsetDebugMsg(set, " -> separating sol returned result <%d>\n", *result);
3156
3157 /* stop timing */
3158 SCIPclockStop(conshdlr->sepatime, set);
3159
3160 /* perform the cached constraint updates */
3161 conshdlr->duringsepa = FALSE;
3162 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3163
3164 /* update statistics */
3165 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
3166 conshdlr->nsepacalls++;
3167 if( *result == SCIP_CUTOFF )
3168 conshdlr->ncutoffs++;
3169 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3170 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3171
3172 /* update domain reductions; therefore remove the domain
3173 * reduction counts which were generated in probing mode */
3174 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3175 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3176
3177 /* evaluate result */
3178 if( *result != SCIP_CUTOFF
3179 && *result != SCIP_CONSADDED
3180 && *result != SCIP_REDUCEDDOM
3181 && *result != SCIP_SEPARATED
3182 && *result != SCIP_NEWROUND
3183 && *result != SCIP_DIDNOTFIND
3184 && *result != SCIP_DIDNOTRUN
3185 && *result != SCIP_DELAYED )
3186 {
3187 SCIPerrorMessage("SOL separation method of constraint handler <%s> returned invalid result <%d>\n",
3188 conshdlr->name, *result);
3189 return SCIP_INVALIDRESULT;
3190 }
3191 }
3192 }
3193 else
3194 {
3195 SCIPsetDebugMsg(set, "SOL separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3197 }
3198
3199 /* remember whether separation method was delayed */
3200 conshdlr->sepasolwasdelayed = (*result == SCIP_DELAYED);
3201 }
3202
3203 return SCIP_OKAY;
3204}
3205
3206/** calls enforcing method of constraint handler for a relaxation solution for all constraints added after last
3207 * conshdlrResetEnfo() call
3208 */
3210 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3211 BMS_BLKMEM* blkmem, /**< block memory */
3212 SCIP_SET* set, /**< global SCIP settings */
3213 SCIP_STAT* stat, /**< dynamic problem statistics */
3214 SCIP_TREE* tree, /**< branch and bound tree */
3215 SCIP_SEPASTORE* sepastore, /**< separation storage */
3216 SCIP_SOL* relaxsol, /**< solution to be enforced */
3217 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3218 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3219 )
3220{
3221 int nconss;
3222 int nusefulconss;
3223 int firstcons;
3224 SCIP_Bool relaxchanged;
3225 SCIP_Bool lastinfeasible;
3226
3227 assert(conshdlr != NULL);
3228 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3229 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3230 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3231 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3232 assert(stat != NULL);
3233 assert(conshdlr->lastenfopsdomchgcount != stat->domchgcount
3234 || conshdlr->lastenfopsnode != stat->nnodes
3235 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3236 assert(set != NULL);
3237 assert(tree != NULL);
3238 assert(tree->nchildren == 0);
3239 assert(relaxsol != NULL);
3240 assert(result != NULL);
3241
3243
3244 /* skip non-exact constraint handlers during exact solving mode */
3245 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3246 if( set->exact_enable && !conshdlr->exact )
3247 return SCIP_OKAY;
3248
3249 /* check, if this relaxation solution was already enforced at this node
3250 * the integrality constraint handler always needs to be enforced for all constraints since external branching
3251 * candidates are cleared before each resolve
3252 */
3253 if( conshdlr->lastenforelaxrelaxcount == stat->relaxcount
3254 && conshdlr->lastenforelaxdomchgcount == stat->domchgcount
3255 && conshdlr->lastenforelaxnode == stat->nnodes
3256 && conshdlr->lastenforelaxresult != SCIP_CONSADDED
3257 && conshdlr->lastenforelaxresult != SCIP_SOLVELP
3258 && ( strcmp(conshdlr->name, "integral") != 0 )
3259 )
3260 {
3265
3266 /* if we already enforced the same relaxation solution at this node, we will only enforce new constraints in the
3267 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3268 * that an infeasibility in the last call is not lost because we only enforce new constraints
3269 */
3270 if( conshdlr->lastenforelaxresult == SCIP_INFEASIBLE )
3271 {
3273 lastinfeasible = TRUE;
3274 }
3275 else
3276 lastinfeasible = FALSE;
3277
3278 /* all constraints that were not yet enforced on the new relaxation solution must be useful constraints, which means,
3279 * that the new constraints are the last constraints of the useful ones
3280 */
3281 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3282 nusefulconss = nconss;
3283 firstcons = conshdlr->lastnusefulenfoconss;
3284 relaxchanged = FALSE;
3285 }
3286 else
3287 {
3288 /* on a new relaxation solution or a new node, we want to enforce all constraints */
3289 nconss = conshdlr->nenfoconss;
3290 nusefulconss = conshdlr->nusefulenfoconss;
3291 firstcons = 0;
3292 relaxchanged = TRUE;
3293 lastinfeasible = FALSE;
3294 }
3295 assert(firstcons >= 0);
3296 assert(firstcons + nconss <= conshdlr->nenfoconss);
3297 assert(nusefulconss <= nconss);
3298
3299 /* constraint handlers without constraints should only be called once */
3300 if( nconss > 0 || (!conshdlr->needscons && relaxchanged) )
3301 {
3302 SCIP_CONS** conss = NULL;
3303 SCIP_Longint oldndomchgs;
3304 SCIP_Longint oldnprobdomchgs;
3305 int oldncuts;
3306 int oldnactiveconss;
3307
3308 assert(conshdlr->consenforelax != NULL);
3309
3310 SCIPdebugMessage("enforcing constraints %d to %d of %d constraints of handler <%s> (%s relaxation solution)\n",
3311 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, relaxchanged ? "new" : "old");
3312
3313 /* remember the number of processed constraints on the current relaxation solution */
3314 conshdlr->lastenforelaxrelaxcount = stat->relaxcount;
3315 conshdlr->lastenforelaxdomchgcount = stat->domchgcount;
3316 conshdlr->lastenforelaxnode = stat->nnodes;
3317 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3318
3319 /* get the array of the constraints to be processed */
3320 if( conshdlr->needscons )
3321 {
3322 assert(conshdlr->enfoconss != NULL);
3323 conss = conshdlr->enfoconss + firstcons;
3324 }
3325
3326 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3327 oldnactiveconss = stat->nactiveconss;
3328 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3329 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3330
3331 /* check, if we want to use eager evaluation */
3332 if( (conshdlr->eagerfreq == 0 && conshdlr->nenforelaxcalls == 0)
3333 || (conshdlr->eagerfreq > 0 && conshdlr->nenforelaxcalls % conshdlr->eagerfreq == 0) )
3334 nusefulconss = nconss;
3335
3336 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3337 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3338 * external method; to avoid this, these changes will be buffered and processed after the method call
3339 */
3340 conshdlrDelayUpdates(conshdlr);
3341
3342 /* start timing */
3343 SCIPclockStart(conshdlr->enforelaxtime, set);
3344
3345 /* call external method */
3346 SCIP_CALL( conshdlr->consenforelax(set->scip, relaxsol, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3347 SCIPdebugMessage(" -> enforcing returned result <%d>\n", *result);
3348
3349 /* stop timing */
3350 SCIPclockStop(conshdlr->enforelaxtime, set);
3351
3352 /* perform the cached constraint updates */
3353 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3354
3355 /* update statistics */
3356 conshdlr->nenforelaxcalls++;
3357 if( *result == SCIP_CUTOFF )
3358 conshdlr->ncutoffs++;
3359 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3360 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3361
3362 if( *result != SCIP_BRANCHED )
3363 {
3364 assert(tree->nchildren == 0);
3365
3366 /* update domain reductions; therefore remove the domain
3367 * reduction counts which were generated in probing mode */
3368 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3369 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3370 }
3371 else
3372 conshdlr->nchildren += tree->nchildren;
3373
3374 /* remember the result of the enforcement call */
3375 conshdlr->lastenforelaxresult = *result;
3376
3377 /* evaluate result */
3378 if( *result != SCIP_CUTOFF
3379 && *result != SCIP_CONSADDED
3380 && *result != SCIP_REDUCEDDOM
3381 && *result != SCIP_SEPARATED
3382 && *result != SCIP_BRANCHED
3383 && *result != SCIP_SOLVELP
3384 && *result != SCIP_INFEASIBLE
3385 && *result != SCIP_FEASIBLE )
3386 {
3387 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation solutions returned invalid result <%d>\n",
3388 conshdlr->name, *result);
3389 return SCIP_INVALIDRESULT;
3390 }
3391
3392 /* if the same relaxation solution was already enforced at this node, we only enforced new constraints this time;
3393 * if the enforelax call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3394 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3395 */
3396 if( lastinfeasible && *result == SCIP_FEASIBLE )
3398 }
3399
3400 return SCIP_OKAY;
3401}
3402
3403/** calls enforcing method of constraint handler for LP solution for all constraints added after last
3404 * conshdlrResetEnfo() call
3405 */
3407 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3408 BMS_BLKMEM* blkmem, /**< block memory */
3409 SCIP_SET* set, /**< global SCIP settings */
3410 SCIP_STAT* stat, /**< dynamic problem statistics */
3411 SCIP_TREE* tree, /**< branch and bound tree */
3412 SCIP_SEPASTORE* sepastore, /**< separation storage */
3413 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3414 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3415 )
3416{
3417 assert(conshdlr != NULL);
3418 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3419 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3420 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3421 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3422 assert(stat != NULL);
3423 assert(conshdlr->lastenfolplpcount != stat->lpcount
3424 || conshdlr->lastenfolpdomchgcount != stat->domchgcount
3425 || conshdlr->lastenfolpnode != stat->nnodes
3426 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3427 assert(set != NULL);
3428 assert(tree != NULL);
3429 assert(tree->nchildren == 0);
3430 assert(result != NULL);
3431
3433
3434 /* skip non-exact constraint handlers during exact solving mode */
3435 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3436 if( set->exact_enable && !conshdlr->exact )
3437 return SCIP_OKAY;
3438
3439 if( conshdlr->consenfolp != NULL )
3440 {
3441 int nconss;
3442 int nusefulconss;
3443 int firstcons;
3444 SCIP_Bool lpchanged;
3445 SCIP_Bool lastinfeasible;
3446
3447 /* check, if this LP solution was already enforced at this node */
3448 if( conshdlr->lastenfolplpcount == stat->lpcount
3449 && conshdlr->lastenfolpdomchgcount == stat->domchgcount
3450 && conshdlr->lastenfolpnode == stat->nnodes
3451 && conshdlr->lastenfolpresult != SCIP_CONSADDED )
3452 {
3454 || conshdlr->lastenfolpresult == SCIP_SEPARATED );
3455
3456 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3457 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3458 * that an infeasibility in the last call is not lost because we only enforce new constraints
3459 */
3460 if( conshdlr->lastenfolpresult == SCIP_FEASIBLE )
3461 lastinfeasible = FALSE;
3462 else
3463 {
3466 lastinfeasible = TRUE;
3467 }
3468
3469 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3470 * that the new constraints are the last constraints of the useful ones
3471 */
3472 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3473 nusefulconss = nconss;
3474 firstcons = conshdlr->lastnusefulenfoconss;
3475 lpchanged = FALSE;
3476 }
3477 else
3478 {
3479 /* on a new LP solution or a new node, we want to enforce all constraints */
3480 nconss = conshdlr->nenfoconss;
3481 nusefulconss = conshdlr->nusefulenfoconss;
3482 firstcons = 0;
3483 lpchanged = TRUE;
3484 lastinfeasible = FALSE;
3485 }
3486 assert(firstcons >= 0);
3487 assert(firstcons + nconss <= conshdlr->nenfoconss);
3488 assert(nusefulconss <= nconss);
3489
3490 /* constraint handlers without constraints should only be called once */
3491 if( nconss > 0 || (!conshdlr->needscons && lpchanged) )
3492 {
3493 SCIP_CONS** conss;
3494 SCIP_Longint oldndomchgs;
3495 SCIP_Longint oldnprobdomchgs;
3496 int oldncuts;
3497 int oldnactiveconss;
3498
3499 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
3500 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, lpchanged ? "new" : "old");
3501
3502 /* remember the number of processed constraints on the current LP solution */
3503 conshdlr->lastenfolplpcount = stat->lpcount;
3504 conshdlr->lastenfolpdomchgcount = stat->domchgcount;
3505 conshdlr->lastenfolpnode = stat->nnodes;
3506 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3507
3508 /* get the array of the constraints to be processed */
3509 conss = nconss > 0 ? conshdlr->enfoconss + firstcons : NULL;
3510
3511 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3512 oldnactiveconss = stat->nactiveconss;
3513 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3514 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3515
3516 /* check, if we want to use eager evaluation */
3517 if( (conshdlr->eagerfreq == 0 && conshdlr->nenfolpcalls == 0)
3518 || (conshdlr->eagerfreq > 0 && conshdlr->nenfolpcalls % conshdlr->eagerfreq == 0) )
3519 nusefulconss = nconss;
3520
3521 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3522 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3523 * external method; to avoid this, these changes will be buffered and processed after the method call
3524 */
3525 conshdlrDelayUpdates(conshdlr);
3526
3527 /* start timing */
3528 SCIPclockStart(conshdlr->enfolptime, set);
3529
3530 /* call external method */
3531 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3532 SCIPsetDebugMsg(set, " -> enforcing returned result <%d>\n", *result);
3533
3534 /* stop timing */
3535 SCIPclockStop(conshdlr->enfolptime, set);
3536
3537 /* perform the cached constraint updates */
3538 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3539
3540 /* remember the result of the enforcement call */
3541 conshdlr->lastenfolpresult = *result;
3542
3543 /* update statistics */
3544 conshdlr->nenfolpcalls++;
3545 if( *result == SCIP_CUTOFF )
3546 conshdlr->ncutoffs++;
3547 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3548 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3549 if( *result != SCIP_BRANCHED )
3550 {
3551 assert(tree->nchildren == 0);
3552
3553 /* update domain reductions; therefore remove the domain
3554 * reduction counts which were generated in probing mode */
3555 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3556 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3557 }
3558 else
3559 conshdlr->nchildren += tree->nchildren;
3560
3561 /* evaluate result */
3562 if( *result != SCIP_CUTOFF
3563 && *result != SCIP_CONSADDED
3564 && *result != SCIP_REDUCEDDOM
3565 && *result != SCIP_SEPARATED
3566 && *result != SCIP_SOLVELP
3567 && *result != SCIP_BRANCHED
3568 && *result != SCIP_INFEASIBLE
3569 && *result != SCIP_FEASIBLE )
3570 {
3571 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP solutions returned invalid result <%d>\n",
3572 conshdlr->name, *result);
3573 return SCIP_INVALIDRESULT;
3574 }
3575
3576 /* if the same LP solution was already enforced at this node, we only enforced new constraints this time;
3577 * if the enfolp call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3578 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3579 */
3580 if( lastinfeasible && *result == SCIP_FEASIBLE )
3582 }
3583 }
3584
3585 return SCIP_OKAY;
3586}
3587
3588/** calls diving solution enforcement callback of constraint handler, if it exists */
3590 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3591 SCIP_SET* set, /**< global SCIP settings */
3592 SCIP_DIVESET* diveset, /**< diving settings to control scoring */
3593 SCIP_SOL* sol, /**< current solution of diving mode */
3594 SCIP_Bool* success, /**< pointer to store whether constraint handler successfully found a variable */
3595 SCIP_Bool* infeasible /**< pointer to store whether the current node was detected to be infeasible */
3596 )
3597{
3598 assert(conshdlr != NULL);
3599 assert(set != NULL);
3600 assert(diveset != NULL);
3601 assert(sol != NULL);
3602 assert(success != NULL);
3603 assert(infeasible != NULL);
3604
3605 *success = FALSE;
3606 *infeasible = FALSE;
3607
3608 /* skip non-exact constraint handlers during exact solving mode */
3609 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3610 if( set->exact_enable && !conshdlr->exact )
3611 return SCIP_OKAY;
3612
3613 if( conshdlr->consgetdivebdchgs != NULL )
3614 {
3615 SCIP_CALL( conshdlr->consgetdivebdchgs(set->scip, conshdlr, diveset, sol, success, infeasible) );
3616 }
3617
3618 return SCIP_OKAY;
3619}
3620
3621/** calls enforcing method of constraint handler for pseudo solution for all constraints added after last
3622 * conshdlrResetEnfo() call
3623 */
3625 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3626 BMS_BLKMEM* blkmem, /**< block memory */
3627 SCIP_SET* set, /**< global SCIP settings */
3628 SCIP_STAT* stat, /**< dynamic problem statistics */
3629 SCIP_TREE* tree, /**< branch and bound tree */
3630 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
3631 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3632 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
3633 SCIP_Bool forced, /**< should enforcement of pseudo solution be forced? */
3634 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3635 )
3636{
3637 assert(conshdlr != NULL);
3638 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3639 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3640 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3641 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3642 assert(stat != NULL);
3643 assert(conshdlr->lastenfopsdomchgcount != stat->domchgcount
3644 || conshdlr->lastenfopsnode != stat->nnodes
3645 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3646 assert(set != NULL);
3647 assert(tree != NULL);
3648 assert(tree->nchildren == 0);
3649 assert(result != NULL);
3650
3651 /* no enforcing of pseudo solution */
3652 if( set->cons_disableenfops && SCIPbranchcandGetNPseudoCands(branchcand) > 0 )
3653 {
3655 return SCIP_OKAY;
3656 }
3657
3659
3660 /* skip non-exact constraint handlers during exact solving mode */
3661 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3662 if( set->exact_enable && !conshdlr->exact )
3663 return SCIP_OKAY;
3664
3665 if( conshdlr->consenfops != NULL )
3666 {
3667 int nconss;
3668 int nusefulconss;
3669 int firstcons;
3670 SCIP_Bool pschanged;
3671 SCIP_Bool lastinfeasible;
3672
3673 /* check, if this pseudo solution was already enforced at this node */
3674 if( !forced && conshdlr->lastenfopsdomchgcount == stat->domchgcount
3675 && conshdlr->lastenfopsnode == stat->nnodes
3676 && conshdlr->lastenfopsresult != SCIP_CONSADDED
3677 && conshdlr->lastenfopsresult != SCIP_SOLVELP
3678 )
3679 {
3680 assert(conshdlr->lastenfopsresult != SCIP_CUTOFF);
3683 assert(conshdlr->lastenfopsresult != SCIP_DIDNOTRUN || objinfeasible);
3684
3685 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3686 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3687 * that an infeasibility in the last call is not lost because we only enforce new constraints
3688 */
3689 if( conshdlr->lastenfopsresult == SCIP_INFEASIBLE )
3690 {
3692 lastinfeasible = TRUE;
3693 }
3694 else
3695 lastinfeasible = FALSE;
3696
3697 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3698 * that the new constraints are the last constraints of the useful ones
3699 */
3700 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3701 nusefulconss = nconss;
3702 firstcons = conshdlr->lastnusefulenfoconss;
3703 pschanged = FALSE;
3704 }
3705 else
3706 {
3707 /* on a new pseudo solution or a new node, we want to enforce all constraints */
3708 nconss = conshdlr->nenfoconss;
3709 nusefulconss = conshdlr->nusefulenfoconss;
3710 firstcons = 0;
3711 pschanged = TRUE;
3712 lastinfeasible = FALSE;
3713 }
3714 assert(firstcons >= 0);
3715 assert(firstcons + nconss <= conshdlr->nenfoconss);
3716 assert(nusefulconss <= nconss);
3717
3718 /* constraint handlers without constraints should only be called once */
3719 if( nconss > 0 || (!conshdlr->needscons && pschanged) )
3720 {
3721 SCIP_CONS** conss = NULL;
3722 SCIP_Longint oldndomchgs;
3723 SCIP_Longint oldnprobdomchgs;
3724
3725 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, objinfeasible=%u)\n",
3726 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, pschanged ? "new" : "old", objinfeasible);
3727
3728 /* remember the number of processed constraints on the current pseudo solution */
3729 conshdlr->lastenfopsdomchgcount = stat->domchgcount;
3730 conshdlr->lastenfopsnode = stat->nnodes;
3731 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3732
3733 /* get the array of the constraints to be processed */
3734 if( conshdlr->needscons )
3735 {
3736 assert(conshdlr->enfoconss != NULL);
3737 conss = conshdlr->enfoconss + firstcons;
3738 }
3739
3740 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3741 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3742
3743 /* check, if we want to use eager evaluation */
3744 if( (conshdlr->eagerfreq == 0 && conshdlr->nenfopscalls == 0)
3745 || (conshdlr->eagerfreq > 0 && conshdlr->nenfopscalls % conshdlr->eagerfreq == 0) )
3746 nusefulconss = nconss;
3747
3748 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3749 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3750 * external method; to avoid this, these changes will be buffered and processed after the method call
3751 */
3752 conshdlrDelayUpdates(conshdlr);
3753
3754 /* start timing */
3755 SCIPclockStart(conshdlr->enfopstime, set);
3756
3757 /* call external method */
3758 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, objinfeasible, result) );
3759 SCIPsetDebugMsg(set, " -> enforcing returned result <%d>\n", *result);
3760
3761 /* stop timing */
3762 SCIPclockStop(conshdlr->enfopstime, set);
3763
3764 /* perform the cached constraint updates */
3765 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3766
3767 /* update statistics */
3768 if( *result != SCIP_DIDNOTRUN )
3769 conshdlr->nenfopscalls++;
3770 else if( !objinfeasible )
3771 {
3772 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions was skipped, even though the solution was not objective-infeasible\n",
3773 conshdlr->name);
3774 conshdlr->lastenfopsresult = *result;
3775
3776 return SCIP_INVALIDRESULT;
3777 }
3778 /* A constraint handler might return SCIP_DIDNOTRUN and not check any constraints in case objinfeasible was
3779 * TRUE; we change the result pointer to SCIP_INFEASIBLE in this case.
3780 */
3781 else
3783
3784 if( *result == SCIP_CUTOFF )
3785 conshdlr->ncutoffs++;
3786
3787 if( *result != SCIP_BRANCHED )
3788 {
3789 assert(tree->nchildren == 0);
3790
3791 /* update domain reductions; therefore remove the domain
3792 * reduction counts which were generated in probing mode */
3793 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3794 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3795 }
3796 else
3797 conshdlr->nchildren += tree->nchildren;
3798
3799 /* remember the result of the enforcement call */
3800 conshdlr->lastenfopsresult = *result;
3801
3802 /* evaluate result */
3803 if( *result != SCIP_CUTOFF
3804 && *result != SCIP_CONSADDED
3805 && *result != SCIP_REDUCEDDOM
3806 && *result != SCIP_BRANCHED
3807 && *result != SCIP_SOLVELP
3808 && *result != SCIP_INFEASIBLE
3809 && *result != SCIP_FEASIBLE
3810 && *result != SCIP_DIDNOTRUN )
3811 {
3812 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
3813 conshdlr->name, *result);
3814 return SCIP_INVALIDRESULT;
3815 }
3816
3817 /* if the same pseudo solution was already enforced at this node, we only enforced new constraints this time;
3818 * if the enfops call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3819 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3820 */
3821 if( lastinfeasible && *result == SCIP_FEASIBLE )
3823 }
3824 else if( objinfeasible )
3825 {
3826 /*
3827 * Even if nothing is enforced, the solution might still be infeasible due to violating lower bound.
3828 * Make sure the result is updated in this case as well.
3829 */
3831 }
3832 }
3833
3834 return SCIP_OKAY;
3835}
3836
3837/** calls feasibility check method of constraint handler */
3839 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3840 BMS_BLKMEM* blkmem, /**< block memory */
3841 SCIP_SET* set, /**< global SCIP settings */
3842 SCIP_STAT* stat, /**< dynamic problem statistics */
3843 SCIP_SOL* sol, /**< primal CIP solution */
3844 SCIP_Bool checkintegrality, /**< Has integrality to be checked? */
3845 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
3846 SCIP_Bool printreason, /**< Should the reason for the violation be printed? */
3847 SCIP_Bool completely, /**< Should all violations be checked? */
3848 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3849 )
3850{
3851 assert(conshdlr != NULL);
3852 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3853 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3854 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3855 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3856 assert(set != NULL);
3857 assert(result != NULL);
3858
3860
3861 /* skip non-exact constraint handlers during exact solving mode */
3862 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3863 if( set->exact_enable && !conshdlr->exact )
3864 return SCIP_OKAY;
3865
3866 if( conshdlr->conscheck != NULL && (!conshdlr->needscons || conshdlr->ncheckconss > 0) )
3867 {
3868 SCIPsetDebugMsg(set, "checking %d constraints of handler <%s>\n", conshdlr->ncheckconss, conshdlr->name);
3869
3870 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3871 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3872 * external method; to avoid this, these changes will be buffered and processed after the method call
3873 */
3874 conshdlrDelayUpdates(conshdlr);
3875
3876 /* start timing */
3877 SCIPclockStart(conshdlr->checktime, set);
3878
3879 /* call external method */
3880 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, conshdlr->checkconss, conshdlr->ncheckconss,
3881 sol, checkintegrality, checklprows, printreason, completely, result) );
3882 SCIPsetDebugMsg(set, " -> checking returned result <%d>\n", *result);
3883
3884 /* stop timing */
3885 SCIPclockStop(conshdlr->checktime, set);
3886
3887 /* update statistics */
3888 conshdlr->ncheckcalls++;
3889
3890 /* perform the cached constraint updates */
3891 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3892
3893 /* evaluate result */
3895 {
3896 SCIPerrorMessage("feasibility check of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name, *result);
3897 return SCIP_INVALIDRESULT;
3898 }
3899 }
3900
3901 return SCIP_OKAY;
3902}
3903
3904/** calls propagation method of constraint handler */
3906 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3907 BMS_BLKMEM* blkmem, /**< block memory */
3908 SCIP_SET* set, /**< global SCIP settings */
3909 SCIP_STAT* stat, /**< dynamic problem statistics */
3910 int depth, /**< depth of current node */
3911 SCIP_Bool fullpropagation, /**< should all constraints be propagated (or only new ones)? */
3912 SCIP_Bool execdelayed, /**< execute propagation method even if it is marked to be delayed */
3913 SCIP_Bool instrongbranching, /**< are we currently doing strong branching? */
3914 SCIP_PROPTIMING proptiming, /**< current point in the node solving process */
3915 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3916 )
3917{
3918 assert(conshdlr != NULL);
3919 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3920 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3921 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3922 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3923 assert(stat != NULL);
3924 assert(conshdlr->lastpropdomchgcount != stat->domchgcount
3925 || (0 <= conshdlr->lastnusefulpropconss && conshdlr->lastnusefulpropconss <= conshdlr->nusefulpropconss));
3926 assert(set != NULL);
3927 assert(depth >= 0);
3928 assert(result != NULL);
3929
3931
3932 /* skip non-exact constraint handlers during exact solving mode */
3933 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
3934 if( set->exact_enable && !conshdlr->exact )
3935 return SCIP_OKAY;
3936
3937 if( conshdlr->consprop != NULL
3938 && (!conshdlr->needscons || conshdlr->npropconss > 0)
3939 && ((depth == 0 && conshdlr->propfreq == 0)
3940 || (conshdlr->propfreq > 0 && depth % conshdlr->propfreq == 0)
3941 || conshdlr->propwasdelayed) )
3942 {
3943 /* check, if propagation method should be delayed */
3944 if( !conshdlr->delayprop || execdelayed )
3945 {
3946 int nconss;
3947 int nusefulconss;
3948 int nmarkedpropconss;
3949 int firstcons;
3950
3951 /* check, if the current domains were already propagated */
3952 if( !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount && conshdlr->nmarkedpropconss == 0 )
3953 {
3954 /* all constraints that were not yet propagated on the new domains must be useful constraints, which means,
3955 * that the new constraints are the last constraints of the useful ones
3956 */
3957 nconss = conshdlr->nusefulpropconss - conshdlr->lastnusefulpropconss;
3958 nusefulconss = nconss;
3959 firstcons = conshdlr->lastnusefulpropconss;
3960 }
3961 else
3962 {
3963 /* on new domains, we want to propagate all constraints */
3964 nconss = conshdlr->npropconss;
3965 nusefulconss = conshdlr->nusefulpropconss;
3966 firstcons = 0;
3967 }
3968 assert(firstcons >= 0);
3969 assert(firstcons + nconss <= conshdlr->npropconss);
3970 assert(nusefulconss <= nconss);
3971
3972 nmarkedpropconss = conshdlr->nmarkedpropconss;
3973
3974 /* constraint handlers without constraints should only be called once */
3975 if( nconss > 0 || fullpropagation
3976 || (!conshdlr->needscons && conshdlr->lastpropdomchgcount != stat->domchgcount) )
3977 {
3978 SCIP_CONS** conss;
3979 SCIP_Longint oldndomchgs;
3980 SCIP_Longint oldnactiveconss;
3981 SCIP_Longint oldnprobdomchgs;
3982 SCIP_Longint lastpropdomchgcount;
3983 int lastnusefulpropconss;
3984
3985 SCIPsetDebugMsg(set, "propagating constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, %d useful)\n",
3986 firstcons, firstcons + nconss - 1, conshdlr->npropconss, conshdlr->name,
3987 !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount ? "old" : "new", nusefulconss);
3988
3989 /* remember the number of processed constraints on the current domains */
3990 lastpropdomchgcount = stat->domchgcount;
3991 lastnusefulpropconss = conshdlr->nusefulpropconss;
3992
3993 /* get the array of the constraints to be processed */
3994 conss = nconss > 0 ? (conshdlr->propconss + firstcons) : NULL;
3995
3996 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3997 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3998 oldnactiveconss = stat->nactiveconss;
3999
4000 /* check, if we want to use eager evaluation */
4001 if( (conshdlr->eagerfreq == 0 && conshdlr->npropcalls == 0)
4002 || (conshdlr->eagerfreq > 0 && conshdlr->npropcalls % conshdlr->eagerfreq == 0) )
4003 nusefulconss = nconss;
4004
4005 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4006 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4007 * external method; to avoid this, these changes will be buffered and processed after the method call
4008 */
4009 conshdlrDelayUpdates(conshdlr);
4010 conshdlr->duringprop = TRUE;
4011
4012 /* start timing */
4013 if( instrongbranching )
4014 SCIPclockStart(conshdlr->sbproptime, set);
4015 else
4016 SCIPclockStart(conshdlr->proptime, set);
4017
4018 assert(nusefulconss <= nconss);
4019 assert(nmarkedpropconss <= nconss);
4020
4021 /* call external method */
4022 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, conss, nconss, nusefulconss, nmarkedpropconss, proptiming, result) );
4023 SCIPsetDebugMsg(set, " -> propagation returned result <%d>\n", *result);
4024
4025 /* stop timing */
4026 if( instrongbranching )
4027 SCIPclockStop(conshdlr->sbproptime, set);
4028 else
4029 SCIPclockStop(conshdlr->proptime, set);
4030
4031 /* perform the cached constraint updates */
4032 conshdlr->duringprop = FALSE;
4033 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4034
4035 /* update statistics */
4036 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
4037 {
4038 conshdlr->lastpropdomchgcount = lastpropdomchgcount;
4039 conshdlr->lastnusefulpropconss = MIN(conshdlr->nusefulpropconss, lastnusefulpropconss);
4040 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
4041 conshdlr->npropcalls++;
4042 }
4043 else
4044 {
4045 assert(lastpropdomchgcount == stat->domchgcount);
4046 assert(lastnusefulpropconss == conshdlr->nusefulpropconss);
4047 }
4048 if( *result == SCIP_CUTOFF )
4049 conshdlr->ncutoffs++;
4050
4051 /* update domain reductions; therefore remove the domain
4052 * reduction counts which were generated in probing mode */
4053 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
4054 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
4055
4056 /* check result code of callback method */
4057 if( *result != SCIP_CUTOFF
4058 && *result != SCIP_CONSADDED
4059 && *result != SCIP_REDUCEDDOM
4060 && *result != SCIP_DIDNOTFIND
4061 && *result != SCIP_DIDNOTRUN
4062 && *result != SCIP_DELAYED
4063 && *result != SCIP_DELAYNODE )
4064 {
4065 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
4066 conshdlr->name, *result);
4067 return SCIP_INVALIDRESULT;
4068 }
4069 }
4070 }
4071 else
4072 {
4073 SCIPsetDebugMsg(set, "propagation method of constraint handler <%s> was delayed\n", conshdlr->name);
4075 }
4076
4077 /* remember whether propagation method was delayed */
4078 conshdlr->propwasdelayed = (*result == SCIP_DELAYED);
4079 }
4080
4081 return SCIP_OKAY;
4082}
4083
4084/** calls presolving method of constraint handler */
4086 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4087 BMS_BLKMEM* blkmem, /**< block memory */
4088 SCIP_SET* set, /**< global SCIP settings */
4089 SCIP_STAT* stat, /**< dynamic problem statistics */
4090 SCIP_PRESOLTIMING timing, /**< current presolving timing */
4091 int nrounds, /**< number of presolving rounds already done */
4092 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
4093 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
4094 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
4095 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
4096 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
4097 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
4098 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
4099 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
4100 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
4101 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
4102 SCIP_RESULT* result /**< pointer to store the result of the callback method */
4103 )
4104{
4105 assert(conshdlr != NULL);
4106 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
4107 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
4108 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
4109 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
4110 assert(set != NULL);
4111 assert(nfixedvars != NULL);
4112 assert(naggrvars != NULL);
4113 assert(nchgvartypes != NULL);
4114 assert(nchgbds != NULL);
4115 assert(naddholes != NULL);
4116 assert(ndelconss != NULL);
4117 assert(naddconss != NULL);
4118 assert(nupgdconss != NULL);
4119 assert(nchgcoefs != NULL);
4120 assert(nchgsides != NULL);
4121 assert(result != NULL);
4122
4124
4125 /* skip non-exact constraint handlers during exact solving mode */
4126 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
4127 if( set->exact_enable && !conshdlr->exact )
4128 return SCIP_OKAY;
4129
4130 if( conshdlr->conspresol != NULL
4131 && (!conshdlr->needscons || conshdlr->nactiveconss > 0)
4132 && (conshdlr->maxprerounds == -1 || conshdlr->npresolcalls < conshdlr->maxprerounds ) )
4133 {
4134 SCIPsetDebugMsg(set, "presolving %d constraints of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4135
4136 /* check, if presolving method should be executed for the current timing */
4137 if( timing & conshdlr->presoltiming )
4138 {
4139 int nnewfixedvars;
4140 int nnewaggrvars;
4141 int nnewchgvartypes;
4142 int nnewchgbds;
4143 int nnewholes;
4144 int nnewdelconss;
4145 int nnewaddconss;
4146 int nnewupgdconss;
4147 int nnewchgcoefs;
4148 int nnewchgsides;
4149
4150 /* calculate the number of changes since last call */
4151 nnewfixedvars = *nfixedvars - conshdlr->lastnfixedvars;
4152 nnewaggrvars = *naggrvars - conshdlr->lastnaggrvars;
4153 nnewchgvartypes = *nchgvartypes - conshdlr->lastnchgvartypes;
4154 nnewchgbds = *nchgbds - conshdlr->lastnchgbds;
4155 nnewholes = *naddholes - conshdlr->lastnaddholes;
4156 nnewdelconss = *ndelconss - conshdlr->lastndelconss;
4157 nnewaddconss = *naddconss - conshdlr->lastnaddconss;
4158 nnewupgdconss = *nupgdconss - conshdlr->lastnupgdconss;
4159 nnewchgcoefs = *nchgcoefs - conshdlr->lastnchgcoefs;
4160 nnewchgsides = *nchgsides - conshdlr->lastnchgsides;
4161
4162 /* remember the old number of changes */
4163 conshdlr->lastnfixedvars = *nfixedvars;
4164 conshdlr->lastnaggrvars = *naggrvars;
4165 conshdlr->lastnchgvartypes = *nchgvartypes;
4166 conshdlr->lastnchgbds = *nchgbds;
4167 conshdlr->lastnaddholes = *naddholes;
4168 conshdlr->lastndelconss = *ndelconss;
4169 conshdlr->lastnaddconss = *naddconss;
4170 conshdlr->lastnupgdconss = *nupgdconss;
4171 conshdlr->lastnchgcoefs = *nchgcoefs;
4172 conshdlr->lastnchgsides = *nchgsides;
4173
4174 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4175 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4176 * external method; to avoid this, these changes will be buffered and processed after the method call
4177 */
4178 conshdlrDelayUpdates(conshdlr);
4179
4180 /* start timing */
4181 SCIPclockStart(conshdlr->presoltime, set);
4182
4183 /* call external method */
4184 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, conshdlr->conss, conshdlr->nactiveconss, nrounds, timing,
4185 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewholes,
4186 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
4187 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
4188 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
4189
4190 /* stop timing */
4191 SCIPclockStop(conshdlr->presoltime, set);
4192
4193 /* perform the cached constraint updates */
4194 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4195
4196 /* count the new changes */
4197 assert( *nfixedvars - conshdlr->lastnfixedvars >= 0 );
4198 assert( *naggrvars - conshdlr->lastnaggrvars >= 0 );
4199 assert( *nchgvartypes - conshdlr->lastnchgvartypes >= 0 );
4200 assert( *nchgbds - conshdlr->lastnchgbds >= 0 );
4201 assert( *naddholes - conshdlr->lastnaddholes >= 0 );
4202 assert( *ndelconss - conshdlr->lastndelconss >= 0 );
4203 assert( *naddconss - conshdlr->lastnaddconss >= 0 );
4204 assert( *nupgdconss - conshdlr->lastnupgdconss >= 0 );
4205 assert( *nchgcoefs - conshdlr->lastnchgcoefs >= 0 );
4206 assert( *nchgsides - conshdlr->lastnchgsides >= 0 );
4207
4208 conshdlr->nfixedvars += *nfixedvars - conshdlr->lastnfixedvars;
4209 conshdlr->naggrvars += *naggrvars - conshdlr->lastnaggrvars;
4210 conshdlr->nchgvartypes += *nchgvartypes - conshdlr->lastnchgvartypes;
4211 conshdlr->nchgbds += *nchgbds - conshdlr->lastnchgbds;
4212 conshdlr->naddholes += *naddholes - conshdlr->lastnaddholes;
4213 conshdlr->ndelconss += *ndelconss - conshdlr->lastndelconss;
4214 conshdlr->naddconss += *naddconss - conshdlr->lastnaddconss;
4215 conshdlr->nupgdconss += *nupgdconss - conshdlr->lastnupgdconss;
4216 conshdlr->nchgcoefs += *nchgcoefs - conshdlr->lastnchgcoefs;
4217 conshdlr->nchgsides += *nchgsides - conshdlr->lastnchgsides;
4218
4219 /* check result code of callback method */
4220 if( *result != SCIP_CUTOFF
4221 && *result != SCIP_UNBOUNDED
4222 && *result != SCIP_SUCCESS
4223 && *result != SCIP_DIDNOTFIND
4224 && *result != SCIP_DIDNOTRUN
4225 && *result != SCIP_DELAYED )
4226 {
4227 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
4228 conshdlr->name, *result);
4229 return SCIP_INVALIDRESULT;
4230 }
4231
4232 /* increase the number of calls, if the presolving method tried to find reductions */
4233 if( *result != SCIP_DIDNOTRUN )
4234 ++(conshdlr->npresolcalls);
4235 }
4236
4237 SCIPsetDebugMsg(set, "after presolving %d constraints left of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4238 }
4239
4240 return SCIP_OKAY;
4241}
4242
4243/** calls variable deletion method of constraint handler */
4245 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4246 BMS_BLKMEM* blkmem, /**< block memory */
4247 SCIP_SET* set, /**< global SCIP settings */
4248 SCIP_STAT* stat /**< dynamic problem statistics */
4249 )
4250{
4251 assert(conshdlr != NULL);
4252 assert(set != NULL);
4253
4254 /* skip non-exact constraint handlers during exact solving mode */
4255 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
4256 if( set->exact_enable && !conshdlr->exact )
4257 return SCIP_OKAY;
4258
4259 if( conshdlr->consdelvars != NULL )
4260 {
4261 SCIPsetDebugMsg(set, "deleting variables in constraints of handler <%s>\n", conshdlr->name);
4262
4263 /* during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4264 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4265 * external method; to avoid this, these changes will be buffered and processed after the method call
4266 */
4267 conshdlrDelayUpdates(conshdlr);
4268
4269 /* call external method */
4270 SCIP_CALL( conshdlr->consdelvars(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
4271
4272 /* perform the cached constraint updates */
4273 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4274 }
4275
4276 return SCIP_OKAY;
4277}
4278
4279/** locks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4281 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4282 SCIP_SET* set /**< global SCIP settings */
4283 )
4284{
4285 assert(conshdlr != NULL);
4286 assert(conshdlr->conslock != NULL);
4287 assert(!conshdlr->needscons);
4288
4289 /* skip non-exact constraint handlers during exact solving mode */
4290 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
4291 if( set->exact_enable && !conshdlr->exact )
4292 return SCIP_OKAY;
4293
4294 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, +1, 0) );
4295
4296 return SCIP_OKAY;
4297}
4298
4299/** unlocks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4301 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4302 SCIP_SET* set /**< global SCIP settings */
4303 )
4304{
4305 assert(conshdlr != NULL);
4306 assert(conshdlr->conslock != NULL);
4307 assert(!conshdlr->needscons);
4308
4309 /* skip non-exact constraint handlers during exact solving mode */
4310 assert(!set->exact_enable || conshdlr->exact || !conshdlr->needscons || conshdlr->nconss == 0);
4311 if( set->exact_enable && !conshdlr->exact )
4312 return SCIP_OKAY;
4313
4314 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, -1, 0) );
4315
4316 return SCIP_OKAY;
4317}
4318
4319/** gets name of constraint handler */
4321 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4322 )
4323{
4324 assert(conshdlr != NULL);
4325
4326 return conshdlr->name;
4327}
4328
4329/** gets description of constraint handler */
4331 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4332 )
4333{
4334 assert(conshdlr != NULL);
4335
4336 return conshdlr->desc;
4337}
4338
4339/** gets user data of constraint handler */
4341 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4342 )
4343{
4344 assert(conshdlr != NULL);
4345
4346 return conshdlr->conshdlrdata;
4347}
4348
4349/** sets user data of constraint handler; user has to free old data in advance! */
4351 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4352 SCIP_CONSHDLRDATA* conshdlrdata /**< new constraint handler user data */
4353 )
4354{
4355 assert(conshdlr != NULL);
4356
4357 conshdlr->conshdlrdata = conshdlrdata;
4358}
4359
4360/** is constraint handler safe to use in exact solving mode? */
4362 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4363 )
4364{
4365 assert(conshdlr != NULL);
4366
4367 return conshdlr->exact;
4368}
4369
4370/** marks the constraint handler as safe to use in exact solving mode
4371 *
4372 * @note Constraint handlers that are not marked as exact are skipped during exact solving mode.
4373 */
4375 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4376 )
4377{
4378 assert(conshdlr != NULL);
4379
4380 conshdlr->exact = TRUE;
4381}
4382
4383/** sets all separation related callbacks of the constraint handler */
4385 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4386 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
4387 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
4388 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
4389 int sepapriority, /**< priority of the constraint handler for separation */
4390 SCIP_Bool delaysepa /**< should separation method be delayed, if other separators found cuts? */
4391 )
4392{
4393 assert(conshdlr != NULL);
4394
4395 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
4396
4397 conshdlr->conssepalp = conssepalp;
4398 conshdlr->conssepasol = conssepasol;
4399 conshdlr->sepafreq = sepafreq;
4400 conshdlr->sepapriority = sepapriority;
4401 conshdlr->delaysepa = delaysepa;
4402}
4403
4404/** sets both the propagation callback and the propagation frequency of the constraint handler */
4406 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4407 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
4408 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
4409 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
4410 SCIP_PROPTIMING timingmask /**< positions in the node solving loop where propagators should be executed */
4411 )
4412{
4413 assert(conshdlr != NULL);
4414
4415 assert(consprop != NULL || propfreq == -1);
4416
4417 conshdlr->consprop = consprop;
4418 conshdlr->propfreq = propfreq;
4419 conshdlr->delayprop = delayprop;
4420 conshdlr->proptiming = timingmask;
4421}
4422
4423/** sets copy method of both the constraint handler and each associated constraint */
4425 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4426 SCIP_DECL_CONSENFORELAX ((*consenforelax)) /**< constraint copying method */
4427 )
4428{
4429 assert(conshdlr != NULL);
4430
4431 conshdlr->consenforelax = consenforelax;
4432}
4433
4434/** sets copy method of both the constraint handler and each associated constraint */
4436 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4437 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
4438 SCIP_DECL_CONSCOPY ((*conscopy)) /**< constraint copying method */
4439 )
4440{
4441 assert(conshdlr != NULL);
4442
4443 assert(!conshdlr->needscons || (conshdlrcopy == NULL) == (conscopy == NULL));
4444
4445 conshdlr->conshdlrcopy = conshdlrcopy;
4446 conshdlr->conscopy = conscopy;
4447}
4448
4449/** sets destructor method of constraint handler */
4451 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4452 SCIP_DECL_CONSFREE ((*consfree)) /**< destructor of constraint handler */
4453 )
4454{
4455 assert(conshdlr != NULL);
4456
4457 conshdlr->consfree = consfree;
4458}
4459
4460/** sets initialization method of constraint handler */
4462 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4463 SCIP_DECL_CONSINIT ((*consinit)) /**< initialize constraint handler */
4464 )
4465{
4466 assert(conshdlr != NULL);
4467
4468 conshdlr->consinit = consinit;
4469}
4470
4471/** sets deinitialization method of constraint handler */
4473 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4474 SCIP_DECL_CONSEXIT ((*consexit)) /**< deinitialize constraint handler */
4475 )
4476{
4477 assert(conshdlr != NULL);
4478
4479 conshdlr->consexit = consexit;
4480}
4481
4482/** sets solving process initialization method of constraint handler */
4484 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4485 SCIP_DECL_CONSINITSOL((*consinitsol)) /**< solving process initialization method of constraint handler */
4486 )
4487{
4488 assert(conshdlr != NULL);
4489
4490 conshdlr->consinitsol = consinitsol;
4491}
4492
4493/** sets solving process deinitialization method of constraint handler */
4495 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4496 SCIP_DECL_CONSEXITSOL ((*consexitsol)) /**< solving process deinitialization method of constraint handler */
4497 )
4498{
4499 assert(conshdlr != NULL);
4500
4501 conshdlr->consexitsol = consexitsol;
4502}
4503
4504/** sets preprocessing initialization method of constraint handler */
4506 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4507 SCIP_DECL_CONSINITPRE((*consinitpre)) /**< preprocessing initialization method of constraint handler */
4508 )
4509{
4510 assert(conshdlr != NULL);
4511
4512 conshdlr->consinitpre = consinitpre;
4513}
4514
4515/** sets preprocessing deinitialization method of constraint handler */
4517 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4518 SCIP_DECL_CONSEXITPRE((*consexitpre)) /**< preprocessing deinitialization method of constraint handler */
4519 )
4520{
4521 assert(conshdlr != NULL);
4522
4523 conshdlr->consexitpre = consexitpre;
4524}
4525
4526/** sets presolving method of constraint handler */
4528 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4529 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method of constraint handler */
4530 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
4531 SCIP_PRESOLTIMING presoltiming /**< timing mask of the constraint handler's presolving method */
4532 )
4533{
4534 assert(conshdlr != NULL);
4535
4536 conshdlr->conspresol = conspresol;
4537 conshdlr->maxprerounds = maxprerounds;
4538
4539 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
4540 * error message
4541 */
4542 if( presoltiming < SCIP_PRESOLTIMING_FAST || presoltiming > SCIP_PRESOLTIMING_MAX )
4543 {
4544 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
4545 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", conshdlr->name);
4546
4548 }
4549
4550 conshdlr->presoltiming = presoltiming;
4551
4552 return SCIP_OKAY;
4553}
4554
4555/** sets method of constraint handler to free specific constraint data */
4557 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4558 SCIP_DECL_CONSDELETE ((*consdelete)) /**< free specific constraint data */
4559 )
4560{
4561 assert(conshdlr != NULL);
4562
4563 conshdlr->consdelete = consdelete;
4564}
4565
4566/** sets method of constraint handler to transform constraint data into data belonging to the transformed problem */
4568 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4569 SCIP_DECL_CONSTRANS ((*constrans)) /**< transform constraint data into data belonging to the transformed problem */
4570 )
4571{
4572 assert(conshdlr != NULL);
4573
4574 conshdlr->constrans = constrans;
4575}
4576
4577/** sets method of constraint handler to initialize LP with relaxations of "initial" constraints */
4579 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4580 SCIP_DECL_CONSINITLP ((*consinitlp)) /**< initialize LP with relaxations of "initial" constraints */
4581 )
4582{
4583 assert(conshdlr != NULL);
4584
4585 conshdlr->consinitlp = consinitlp;
4586}
4587
4588/** sets propagation conflict resolving method of constraint handler */
4590 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4591 SCIP_DECL_CONSRESPROP ((*consresprop)) /**< propagation conflict resolving method */
4592 )
4593{
4594 assert(conshdlr != NULL);
4595
4596 conshdlr->consresprop = consresprop;
4597}
4598
4599/** sets activation notification method of constraint handler */
4601 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4602 SCIP_DECL_CONSACTIVE ((*consactive)) /**< activation notification method */
4603 )
4604{
4605 assert(conshdlr != NULL);
4606
4607 conshdlr->consactive = consactive;
4608}
4609
4610/** sets deactivation notification method of constraint handler */
4612 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4613 SCIP_DECL_CONSDEACTIVE((*consdeactive)) /**< deactivation notification method */
4614 )
4615{
4616 assert(conshdlr != NULL);
4617
4618 conshdlr->consdeactive = consdeactive;
4619}
4620
4621/** sets enabling notification method of constraint handler */
4623 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4624 SCIP_DECL_CONSENABLE ((*consenable)) /**< enabling notification method */
4625 )
4626{
4627 assert(conshdlr != NULL);
4628
4629 conshdlr->consenable = consenable;
4630}
4631
4632/** sets disabling notification method of constraint handler */
4634 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4635 SCIP_DECL_CONSDISABLE ((*consdisable)) /**< disabling notification method */
4636 )
4637{
4638 assert(conshdlr != NULL);
4639
4640 conshdlr->consdisable = consdisable;
4641}
4642
4643/** sets variable deletion method of constraint handler */
4645 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4646 SCIP_DECL_CONSDELVARS ((*consdelvars)) /**< variable deletion method */
4647 )
4648{
4649 assert(conshdlr != NULL);
4650
4651 conshdlr->consdelvars = consdelvars;
4652}
4653
4654/** sets constraint display method of constraint handler */
4656 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4657 SCIP_DECL_CONSPRINT ((*consprint)) /**< constraint display method */
4658 )
4659{
4660 assert(conshdlr != NULL);
4661
4662 conshdlr->consprint = consprint;
4663}
4664
4665/** sets constraint parsing method of constraint handler */
4667 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4668 SCIP_DECL_CONSPARSE ((*consparse)) /**< constraint parsing method */
4669 )
4670{
4671 assert(conshdlr != NULL);
4672
4673 conshdlr->consparse = consparse;
4674}
4675
4676/** sets constraint variable getter method of constraint handler */
4678 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4679 SCIP_DECL_CONSGETVARS ((*consgetvars)) /**< constraint variable getter method */
4680 )
4681{
4682 assert(conshdlr != NULL);
4683
4684 conshdlr->consgetvars = consgetvars;
4685}
4686
4687/** sets constraint variable number getter method of constraint handler */
4689 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4690 SCIP_DECL_CONSGETNVARS((*consgetnvars)) /**< constraint variable number getter method */
4691 )
4692{
4693 assert(conshdlr != NULL);
4694
4695 conshdlr->consgetnvars = consgetnvars;
4696}
4697
4698/** sets diving enforcement method of constraint handler */
4700 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4701 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)) /**< constraint handler diving solution enforcement method */
4702 )
4703{
4704 assert(conshdlr != NULL);
4705
4706 conshdlr->consgetdivebdchgs = consgetdivebdchgs;
4707}
4708
4709/** sets permutation symmetry detection graph getter method of constraint handler */
4711 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4712 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)) /**< constraint permutation symmetry detection graph
4713 * getter method */
4714 )
4715{
4716 assert(conshdlr != NULL);
4717
4718 conshdlr->consgetpermsymgraph = consgetpermsymgraph;
4719}
4720
4721/** sets signed permutation symmetry detection graph getter method of constraint handler */
4723 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4724 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)) /**< constraint permutation symmetry detection
4725 * graph getter method */
4726 )
4727{
4728 assert(conshdlr != NULL);
4729
4730 conshdlr->consgetsignedpermsymgraph = consgetsignedpermsymgraph;
4731}
4732
4733/** gets array with constraints of constraint handler; the first SCIPconshdlrGetNActiveConss() entries are the active
4734 * constraints, the last SCIPconshdlrGetNConss() - SCIPconshdlrGetNActiveConss() constraints are deactivated
4735 *
4736 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4737 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4738 */
4740 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4741 )
4742{
4743 assert(conshdlr != NULL);
4744
4745 return conshdlr->conss;
4746}
4747
4748/** gets array with enforced constraints of constraint handler; this is local information */
4750 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4751 )
4752{
4753 assert(conshdlr != NULL);
4754
4755 return conshdlr->enfoconss;
4756}
4757
4758/** gets array with checked constraints of constraint handler; this is local information */
4760 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4761 )
4762{
4763 assert(conshdlr != NULL);
4764
4765 return conshdlr->checkconss;
4766}
4767
4768/** gets array with delayed update constraints
4769 *
4770 * @attention Usually, there should be no need to access this array. Use this only if you are absolutely sure what you are doing.
4771 */
4773 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4774 )
4775{
4776 assert(conshdlr != NULL);
4777
4778 return conshdlr->updateconss;
4779}
4780
4781/** gets total number of existing transformed constraints of constraint handler */
4783 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4784 )
4785{
4786 assert(conshdlr != NULL);
4787
4788 return conshdlr->nconss;
4789}
4790
4791/** gets number of enforced constraints of constraint handler; this is local information */
4793 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4794 )
4795{
4796 assert(conshdlr != NULL);
4797
4798 return conshdlr->nenfoconss;
4799}
4800
4801/** gets number of checked constraints of constraint handler; this is local information */
4803 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4804 )
4805{
4806 assert(conshdlr != NULL);
4807
4808 return conshdlr->ncheckconss;
4809}
4810
4811/** gets number of active constraints of constraint handler
4812 *
4813 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4814 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4815 */
4817 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4818 )
4819{
4820 assert(conshdlr != NULL);
4821
4822 return conshdlr->nactiveconss;
4823}
4824
4825/** gets number of enabled constraints of constraint handler */
4827 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4828 )
4829{
4830 assert(conshdlr != NULL);
4831
4832 return conshdlr->nenabledconss;
4833}
4834
4835/** gets number of constraints that have delayed updates */
4837 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4838 )
4839{
4840 assert(conshdlr != NULL);
4841
4842 return conshdlr->nupdateconss;
4843}
4844
4845/** enables or disables all clocks of \p conshdlr, depending on the value of the flag */
4847 SCIP_CONSHDLR* conshdlr, /**< the constraint handler for which all clocks should be enabled or disabled */
4848 SCIP_Bool enable /**< should the clocks of the constraint handler be enabled? */
4849 )
4850{
4851 assert(conshdlr != NULL);
4852
4853 SCIPclockEnableOrDisable(conshdlr->setuptime, enable);
4854 SCIPclockEnableOrDisable(conshdlr->checktime, enable);
4855 SCIPclockEnableOrDisable(conshdlr->enfolptime, enable);
4856 SCIPclockEnableOrDisable(conshdlr->enfopstime, enable);
4857 SCIPclockEnableOrDisable(conshdlr->enforelaxtime, enable);
4858 SCIPclockEnableOrDisable(conshdlr->presoltime, enable);
4859 SCIPclockEnableOrDisable(conshdlr->proptime, enable);
4860 SCIPclockEnableOrDisable(conshdlr->resproptime, enable);
4861 SCIPclockEnableOrDisable(conshdlr->sbproptime, enable);
4862 SCIPclockEnableOrDisable(conshdlr->sepatime, enable);
4863}
4864
4865/** gets time in seconds used for setting up this constraint handler for new stages */
4867 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4868 )
4869{
4870 assert(conshdlr != NULL);
4871
4872 return SCIPclockGetTime(conshdlr->setuptime);
4873}
4874
4875/** gets time in seconds used for presolving in this constraint handler */
4877 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4878 )
4879{
4880 assert(conshdlr != NULL);
4881
4882 return SCIPclockGetTime(conshdlr->presoltime);
4883}
4884
4885/** gets time in seconds used for separation in this constraint handler */
4887 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4888 )
4889{
4890 assert(conshdlr != NULL);
4891
4892 return SCIPclockGetTime(conshdlr->sepatime);
4893}
4894
4895/** gets time in seconds used for LP enforcement in this constraint handler */
4897 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4898 )
4899{
4900 assert(conshdlr != NULL);
4901
4902 return SCIPclockGetTime(conshdlr->enfolptime);
4903}
4904
4905/** gets time in seconds used for pseudo enforcement in this constraint handler */
4907 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4908 )
4909{
4910 assert(conshdlr != NULL);
4911
4912 return SCIPclockGetTime(conshdlr->enfopstime);
4913}
4914
4915/** gets time in seconds used for relaxation enforcement in this constraint handler */
4917 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4918 )
4919{
4920 assert(conshdlr != NULL);
4921
4922 return SCIPclockGetTime(conshdlr->enforelaxtime);
4923}
4924
4925/** gets time in seconds used for propagation in this constraint handler */
4927 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4928 )
4929{
4930 assert(conshdlr != NULL);
4931
4932 return SCIPclockGetTime(conshdlr->proptime);
4933}
4934
4935/** gets time in seconds used for propagation in this constraint handler during strong branching */
4937 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4938 )
4939{
4940 assert(conshdlr != NULL);
4941
4942 return SCIPclockGetTime(conshdlr->sbproptime);
4943}
4944
4945/** gets time in seconds used for feasibility checking in this constraint handler */
4947 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4948 )
4949{
4950 assert(conshdlr != NULL);
4951
4952 return SCIPclockGetTime(conshdlr->checktime);
4953}
4954
4955/** gets time in seconds used for resolving propagation in this constraint handler */
4957 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4958 )
4959{
4960 assert(conshdlr != NULL);
4961
4962 return SCIPclockGetTime(conshdlr->resproptime);
4963}
4964
4965/** gets number of calls to the constraint handler's separation method */
4967 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4968 )
4969{
4970 assert(conshdlr != NULL);
4971
4972 return conshdlr->nsepacalls;
4973}
4974
4975/** gets number of calls to the constraint handler's LP enforcing method */
4977 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4978 )
4979{
4980 assert(conshdlr != NULL);
4981
4982 return conshdlr->nenfolpcalls;
4983}
4984
4985/** gets number of calls to the constraint handler's pseudo enforcing method */
4987 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4988 )
4989{
4990 assert(conshdlr != NULL);
4991
4992 return conshdlr->nenfopscalls;
4993}
4994
4995/** gets number of calls to the constraint handler's relaxation enforcing method */
4997 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4998 )
4999{
5000 assert(conshdlr != NULL);
5001
5002 return conshdlr->nenforelaxcalls;
5003}
5004
5005/** gets number of calls to the constraint handler's propagation method */
5007 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5008 )
5009{
5010 assert(conshdlr != NULL);
5011
5012 return conshdlr->npropcalls;
5013}
5014
5015/** gets number of calls to the constraint handler's checking method */
5017 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5018 )
5019{
5020 assert(conshdlr != NULL);
5021
5022 return conshdlr->ncheckcalls;
5023}
5024
5025/** gets number of calls to the constraint handler's resolve propagation method */
5027 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5028 )
5029{
5030 assert(conshdlr != NULL);
5031
5032 return conshdlr->nrespropcalls;
5033}
5034
5035/** gets total number of times, this constraint handler detected a cutoff */
5037 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5038 )
5039{
5040 assert(conshdlr != NULL);
5041
5042 return conshdlr->ncutoffs;
5043}
5044
5045/** gets total number of cuts found by this constraint handler */
5047 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5048 )
5049{
5050 assert(conshdlr != NULL);
5051
5052 return conshdlr->ncutsfound;
5053}
5054
5055/** gets total number of cuts found by this constraint handler applied to lp */
5057 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5058 )
5059{
5060 assert(conshdlr != NULL);
5061
5062 return conshdlr->ncutsapplied;
5063}
5064
5065/** increase count of applied cuts */
5067 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5068 )
5069{
5070 assert(conshdlr != NULL);
5071
5072 ++conshdlr->ncutsapplied;
5073}
5074
5075/** increase count of found cuts */
5077 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5078 )
5079{
5080 assert(conshdlr != NULL);
5081
5082 ++conshdlr->ncutsfound;
5083}
5084
5085/** gets total number of additional constraints added by this constraint handler */
5087 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5088 )
5089{
5090 assert(conshdlr != NULL);
5091
5092 return conshdlr->nconssfound;
5093}
5094
5095/** gets total number of domain reductions found by this constraint handler */
5097 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5098 )
5099{
5100 assert(conshdlr != NULL);
5101
5102 return conshdlr->ndomredsfound;
5103}
5104
5105/** gets number of children created by this constraint handler */
5107 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5108 )
5109{
5110 assert(conshdlr != NULL);
5111
5112 return conshdlr->nchildren;
5113}
5114
5115/** gets maximum number of active constraints of constraint handler existing at the same time */
5117 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5118 )
5119{
5120 assert(conshdlr != NULL);
5121
5122 return conshdlr->maxnactiveconss;
5123}
5124
5125/** gets initial number of active constraints of constraint handler */
5127 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5128 )
5129{
5130 assert(conshdlr != NULL);
5131
5132 return conshdlr->startnactiveconss;
5133}
5134
5135/** gets number of variables fixed in presolving method of constraint handler */
5137 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5138 )
5139{
5140 assert(conshdlr != NULL);
5141
5142 return conshdlr->nfixedvars;
5143}
5144
5145/** gets number of variables aggregated in presolving method of constraint handler */
5147 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5148 )
5149{
5150 assert(conshdlr != NULL);
5151
5152 return conshdlr->naggrvars;
5153}
5154
5155/** gets number of variable types changed in presolving method of constraint handler */
5157 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5158 )
5159{
5160 assert(conshdlr != NULL);
5161
5162 return conshdlr->nchgvartypes;
5163}
5164
5165/** gets number of bounds changed in presolving method of constraint handler */
5167 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5168 )
5169{
5170 assert(conshdlr != NULL);
5171
5172 return conshdlr->nchgbds;
5173}
5174
5175/** gets number of holes added to domains of variables in presolving method of constraint handler */
5177 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5178 )
5179{
5180 assert(conshdlr != NULL);
5181
5182 return conshdlr->naddholes;
5183}
5184
5185/** gets number of constraints deleted in presolving method of constraint handler */
5187 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5188 )
5189{
5190 assert(conshdlr != NULL);
5191
5192 return conshdlr->ndelconss;
5193}
5194
5195/** gets number of constraints added in presolving method of constraint handler */
5197 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5198 )
5199{
5200 assert(conshdlr != NULL);
5201
5202 return conshdlr->naddconss;
5203}
5204
5205/** gets number of constraints upgraded in presolving method of constraint handler */
5207 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5208 )
5209{
5210 assert(conshdlr != NULL);
5211
5212 return conshdlr->nupgdconss;
5213}
5214
5215/** gets number of coefficients changed in presolving method of constraint handler */
5217 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5218 )
5219{
5220 assert(conshdlr != NULL);
5221
5222 return conshdlr->nchgcoefs;
5223}
5224
5225/** gets number of constraint sides changed in presolving method of constraint handler */
5227 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5228 )
5229{
5230 assert(conshdlr != NULL);
5231
5232 return conshdlr->nchgsides;
5233}
5234
5235/** gets number of times the presolving method of the constraint handler was called and tried to find reductions */
5237 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5238 )
5239{
5240 assert(conshdlr != NULL);
5241
5242 return conshdlr->npresolcalls;
5243}
5244
5245/** gets separation priority of constraint handler */
5247 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5248 )
5249{
5250 assert(conshdlr != NULL);
5251
5252 return conshdlr->sepapriority;
5253}
5254
5255/** gets enforcing priority of constraint handler */
5257 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5258 )
5259{
5260 assert(conshdlr != NULL);
5261
5262 return conshdlr->enfopriority;
5263}
5264
5265/** gets checking priority of constraint handler */
5267 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5268 )
5269{
5270 assert(conshdlr != NULL);
5271
5272 return conshdlr->checkpriority;
5273}
5274
5275/** gets separation frequency of constraint handler */
5277 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5278 )
5279{
5280 assert(conshdlr != NULL);
5281
5282 return conshdlr->sepafreq;
5283}
5284
5285/** gets propagation frequency of constraint handler */
5287 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5288 )
5289{
5290 assert(conshdlr != NULL);
5291
5292 return conshdlr->propfreq;
5293}
5294
5295/** gets frequency of constraint handler for eager evaluations in separation, propagation and enforcement */
5297 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5298 )
5299{
5300 assert(conshdlr != NULL);
5301
5302 return conshdlr->eagerfreq;
5303}
5304
5305/** does the constraint handler need a constraint in order to be called? */
5307 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5308 )
5309{
5310 assert(conshdlr != NULL);
5311
5312 return conshdlr->needscons;
5313}
5314
5315/** sets the needscons flag of constraint handler, for example to disable without constraints */
5317 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5318 SCIP_Bool needscons /**< should be skipped, if no constraints are available? */
5319 )
5320{
5321 assert(conshdlr != NULL);
5322
5323 conshdlr->needscons = needscons;
5324}
5325
5326/** does the constraint handler perform presolving? */
5328 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5329 )
5330{
5331 assert(conshdlr != NULL);
5332
5333 return (conshdlr->conspresol != NULL);
5334}
5335
5336/** should separation method be delayed, if other separators found cuts? */
5338 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5339 )
5340{
5341 assert(conshdlr != NULL);
5342
5343 return conshdlr->delaysepa;
5344}
5345
5346/** should propagation method be delayed, if other propagators found reductions? */
5348 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5349 )
5350{
5351 assert(conshdlr != NULL);
5352
5353 return conshdlr->delayprop;
5354}
5355
5356/** was LP separation method delayed at the last call? */
5358 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5359 )
5360{
5361 assert(conshdlr != NULL);
5362
5363 return conshdlr->sepalpwasdelayed;
5364}
5365
5366/** was primal solution separation method delayed at the last call? */
5368 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5369 )
5370{
5371 assert(conshdlr != NULL);
5372
5373 return conshdlr->sepasolwasdelayed;
5374}
5375
5376/** was propagation method delayed at the last call? */
5378 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5379 )
5380{
5381 assert(conshdlr != NULL);
5382
5383 return conshdlr->propwasdelayed;
5384}
5385
5386/** is constraint handler initialized? */
5388 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5389 )
5390{
5391 assert(conshdlr != NULL);
5392
5393 return conshdlr->initialized;
5394}
5395
5396/** does the constraint handler have a copy function? */
5398 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5399 )
5400{
5401 assert(conshdlr != NULL);
5402
5403 return (conshdlr->conshdlrcopy != NULL);
5404}
5405
5406/** returns the timing mask of the propagation method of the constraint handler */
5408 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5409 )
5410{
5411 assert(conshdlr != NULL);
5412
5413 return conshdlr->proptiming;
5414}
5415
5416/** sets the timing mask of the propagation method of the constraint handler */
5418 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5419 SCIP_PROPTIMING proptiming /**< timing mask to be set */
5420 )
5421{
5422 assert(conshdlr != NULL);
5423
5424 conshdlr->proptiming = proptiming;
5425}
5426
5427
5428/** returns the timing mask of the presolving method of the constraint handler */
5430 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5431 )
5432{
5433 assert(conshdlr != NULL);
5434
5435 return conshdlr->presoltiming;
5436}
5437
5438/** sets the timing mask of the presolving method of the constraint handler */
5440 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5441 SCIP_PRESOLTIMING presoltiming /** timing mask to be set */
5442 )
5443{
5444 assert(conshdlr != NULL);
5445
5446 conshdlr->presoltiming = presoltiming;
5447}
5448
5449/** returns whether conshdlr supports permutation symmetry detection */
5451 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5452 )
5453{
5454 assert(conshdlr != NULL);
5455
5456 return conshdlr->consgetpermsymgraph != NULL;
5457}
5458
5459/** returns whether conshdlr supports signed permutation symmetry detection */
5461 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5462 )
5463{
5464 assert(conshdlr != NULL);
5465
5466 return conshdlr->consgetsignedpermsymgraph != NULL;
5467}
5468
5469/*
5470 * Constraint set change methods
5471 */
5472
5473/** creates empty constraint set change data */
5474static
5476 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5477 BMS_BLKMEM* blkmem /**< block memory */
5478 )
5479{
5480 assert(conssetchg != NULL);
5481 assert(blkmem != NULL);
5482
5483 SCIP_ALLOC( BMSallocBlockMemory(blkmem, conssetchg) );
5484 (*conssetchg)->addedconss = NULL;
5485 (*conssetchg)->disabledconss = NULL;
5486 (*conssetchg)->addedconsssize = 0;
5487 (*conssetchg)->naddedconss = 0;
5488 (*conssetchg)->disabledconsssize = 0;
5489 (*conssetchg)->ndisabledconss = 0;
5490
5491 return SCIP_OKAY;
5492}
5493
5494/** releases all constraints of the constraint set change data */
5495static
5497 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data */
5498 BMS_BLKMEM* blkmem, /**< block memory */
5499 SCIP_SET* set /**< global SCIP settings */
5500 )
5501{
5502 int i;
5503
5504 assert(conssetchg != NULL);
5505
5506 /* release constraints */
5507 for( i = 0; i < conssetchg->naddedconss; ++i )
5508 {
5509 if( conssetchg->addedconss[i] != NULL )
5510 {
5511 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[i], blkmem, set) );
5512 }
5513 }
5514 for( i = 0; i < conssetchg->ndisabledconss; ++i )
5515 {
5516 if( conssetchg->disabledconss[i] != NULL )
5517 {
5518 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[i], blkmem, set) );
5519 }
5520 }
5521
5522 return SCIP_OKAY;
5523}
5524
5525/** frees constraint set change data and releases all included constraints */
5527 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change */
5528 BMS_BLKMEM* blkmem, /**< block memory */
5529 SCIP_SET* set /**< global SCIP settings */
5530 )
5531{
5532 assert(conssetchg != NULL);
5533 assert(blkmem != NULL);
5534
5535 if( *conssetchg != NULL )
5536 {
5537 /* release constraints */
5538 SCIP_CALL( conssetchgRelease(*conssetchg, blkmem, set) );
5539
5540 /* free memory */
5541 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->addedconss, (*conssetchg)->addedconsssize);
5542 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->disabledconss, (*conssetchg)->disabledconsssize);
5543 BMSfreeBlockMemory(blkmem, conssetchg);
5544 }
5545
5546 return SCIP_OKAY;
5547}
5548
5549/** ensures, that addedconss array can store at least num entries */
5550static
5552 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5553 BMS_BLKMEM* blkmem, /**< block memory */
5554 SCIP_SET* set, /**< global SCIP settings */
5555 int num /**< minimum number of entries to store */
5556 )
5557{
5558 assert(conssetchg != NULL);
5559
5560 if( num > conssetchg->addedconsssize )
5561 {
5562 int newsize;
5563
5564 newsize = SCIPsetCalcMemGrowSize(set, num);
5565 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->addedconss, conssetchg->addedconsssize, newsize) );
5566 conssetchg->addedconsssize = newsize;
5567 }
5568 assert(num <= conssetchg->addedconsssize);
5569
5570 return SCIP_OKAY;
5571}
5572
5573/** ensures, that disabledconss array can store at least num entries */
5574static
5576 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5577 BMS_BLKMEM* blkmem, /**< block memory */
5578 SCIP_SET* set, /**< global SCIP settings */
5579 int num /**< minimum number of entries to store */
5580 )
5581{
5582 assert(conssetchg != NULL);
5583
5584 if( num > conssetchg->disabledconsssize )
5585 {
5586 int newsize;
5587
5588 newsize = SCIPsetCalcMemGrowSize(set, num);
5589 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->disabledconss, conssetchg->disabledconsssize, newsize) );
5590 conssetchg->disabledconsssize = newsize;
5591 }
5592 assert(num <= conssetchg->disabledconsssize);
5593
5594 return SCIP_OKAY;
5595}
5596
5597/** adds constraint addition to constraint set changes, and captures constraint; activates constraint if the
5598 * constraint set change data is currently active
5599 */
5601 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5602 BMS_BLKMEM* blkmem, /**< block memory */
5603 SCIP_SET* set, /**< global SCIP settings */
5604 SCIP_STAT* stat, /**< dynamic problem statistics */
5605 SCIP_CONS* cons, /**< added constraint */
5606 int depth, /**< depth of constraint set change's node */
5607 SCIP_Bool focusnode, /**< does the constraint set change belong to the focus node? */
5608 SCIP_Bool active /**< is the constraint set change currently active? */
5609 )
5610{
5611 assert(conssetchg != NULL);
5612 assert(cons != NULL);
5613
5614 /* if constraint set change doesn't exist, create it */
5615 if( *conssetchg == NULL )
5616 {
5617 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5618 }
5619
5620 /* add constraint to the addedconss array */
5621 SCIP_CALL( conssetchgEnsureAddedconssSize(*conssetchg, blkmem, set, (*conssetchg)->naddedconss+1) );
5622 (*conssetchg)->addedconss[(*conssetchg)->naddedconss] = cons;
5623 (*conssetchg)->naddedconss++;
5624
5625 /* undelete constraint, if it was globally deleted in the past */
5626 cons->deleted = FALSE;
5627
5628 /* capture constraint */
5629 SCIPconsCapture(cons);
5630
5631 /* activate constraint, if node is active */
5632 if( active && !SCIPconsIsActive(cons) )
5633 {
5634 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5635 assert(SCIPconsIsActive(cons));
5636
5637 /* remember, that this constraint set change data was responsible for the constraint's addition */
5638 cons->addconssetchg = *conssetchg;
5639 cons->addarraypos = (*conssetchg)->naddedconss-1;
5640 }
5641
5642 return SCIP_OKAY;
5643}
5644
5645/** adds constraint disabling to constraint set changes, and captures constraint */
5647 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5648 BMS_BLKMEM* blkmem, /**< block memory */
5649 SCIP_SET* set, /**< global SCIP settings */
5650 SCIP_CONS* cons /**< disabled constraint */
5651 )
5652{
5653 assert(conssetchg != NULL);
5654 assert(cons != NULL);
5655
5656 /* if constraint set change doesn't exist, create it */
5657 if( *conssetchg == NULL )
5658 {
5659 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5660 }
5661
5662 /* add constraint to the disabledconss array */
5663 SCIP_CALL( conssetchgEnsureDisabledconssSize(*conssetchg, blkmem, set, (*conssetchg)->ndisabledconss+1) );
5664 (*conssetchg)->disabledconss[(*conssetchg)->ndisabledconss] = cons;
5665 (*conssetchg)->ndisabledconss++;
5666
5667 /* capture constraint */
5668 SCIPconsCapture(cons);
5669
5670 return SCIP_OKAY;
5671}
5672
5673/** deactivates, deletes, and releases constraint from the addedconss array of the constraint set change data */
5674static
5676 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to delete constraint from */
5677 BMS_BLKMEM* blkmem, /**< block memory */
5678 SCIP_SET* set, /**< global SCIP settings */
5679 int arraypos /**< position of constraint in disabledconss array */
5680 )
5681{
5682 SCIP_CONS* cons;
5683
5684 assert(conssetchg != NULL);
5685 assert(conssetchg->addedconss != NULL);
5686 assert(0 <= arraypos && arraypos < conssetchg->naddedconss);
5687
5688 cons = conssetchg->addedconss[arraypos];
5689 assert(cons != NULL);
5690
5691 SCIPsetDebugMsg(set, "delete added constraint <%s> at position %d from constraint set change data\n", cons->name, arraypos);
5692
5693 /* remove the link to the constraint set change data */
5694 if( cons->addconssetchg == conssetchg )
5695 {
5696 cons->addconssetchg = NULL;
5697 cons->addarraypos = -1;
5698 }
5699
5700 /* release constraint */
5701 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[arraypos], blkmem, set) );
5702
5703 /* we want to keep the order of the constraint additions: move all subsequent constraints one slot to the front */
5704 for( ; arraypos < conssetchg->naddedconss-1; ++arraypos )
5705 {
5706 conssetchg->addedconss[arraypos] = conssetchg->addedconss[arraypos+1];
5707 assert(conssetchg->addedconss[arraypos] != NULL);
5708 if( conssetchg->addedconss[arraypos]->addconssetchg == conssetchg )
5709 {
5710 assert(conssetchg->addedconss[arraypos]->addarraypos == arraypos+1);
5711 conssetchg->addedconss[arraypos]->addarraypos = arraypos;
5712 }
5713 }
5714 conssetchg->naddedconss--;
5715
5716 return SCIP_OKAY;
5717}
5718
5719/** deletes and releases deactivated constraint from the disabledconss array of the constraint set change data */
5720static
5722 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5723 BMS_BLKMEM* blkmem, /**< block memory */
5724 SCIP_SET* set, /**< global SCIP settings */
5725 int arraypos /**< position of constraint in disabledconss array */
5726 )
5727{
5728 assert(conssetchg != NULL);
5729 assert(0 <= arraypos && arraypos < conssetchg->ndisabledconss);
5730 assert(conssetchg->disabledconss[arraypos] != NULL);
5731
5732 SCIPsetDebugMsg(set, "delete disabled constraint <%s> at position %d from constraint set change data\n",
5733 conssetchg->disabledconss[arraypos]->name, arraypos);
5734
5735 /* release constraint */
5736 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[arraypos], blkmem, set) );
5737
5738 /* we want to keep the order of the constraint disablings: move all subsequent constraints one slot to the front */
5739 for( ; arraypos < conssetchg->ndisabledconss-1; ++arraypos )
5740 {
5741 conssetchg->disabledconss[arraypos] = conssetchg->disabledconss[arraypos+1];
5742 assert(conssetchg->disabledconss[arraypos] != NULL);
5743 }
5744 conssetchg->ndisabledconss--;
5745
5746 return SCIP_OKAY;
5747}
5748
5749/** gets added constraints data for a constraint set change */
5751 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to get data from */
5752 SCIP_CONS*** conss, /**< reference to constraints array added in the conssetchg, or NULL */
5753 int* nconss /**< reference to store the size of the constraints array, or NULL */
5754 )
5755{
5756 assert(conssetchg != NULL);
5757 if( conss != NULL )
5758 *conss = conssetchg->addedconss;
5759 if( nconss != NULL )
5760 *nconss = conssetchg->naddedconss;
5761}
5762
5763/** applies constraint set change */
5765 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5766 BMS_BLKMEM* blkmem, /**< block memory */
5767 SCIP_SET* set, /**< global SCIP settings */
5768 SCIP_STAT* stat, /**< dynamic problem statistics */
5769 int depth, /**< depth of constraint set change's node */
5770 SCIP_Bool focusnode /**< does the constraint set change belong to the focus node? */
5771 )
5772{
5773 SCIP_CONS* cons;
5774 int i;
5775
5776 if( conssetchg == NULL )
5777 return SCIP_OKAY;
5778
5779 SCIPsetDebugMsg(set, "applying constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5780 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5781
5782 /* apply constraint additions */
5783 i = 0;
5784 while( i < conssetchg->naddedconss )
5785 {
5786 cons = conssetchg->addedconss[i];
5787 assert(cons != NULL);
5788 assert(!cons->update);
5789
5790 /* if constraint is already active, or if constraint is globally deleted, it can be removed from addedconss array */
5791 if( cons->active || cons->deleted )
5792 {
5793 /* delete constraint from addedcons array, the empty slot is now used by the next constraint,
5794 * and naddedconss was decreased, so do not increase i
5795 */
5796 SCIP_CALL( conssetchgDelAddedCons(conssetchg, blkmem, set, i) );
5797 }
5798 else
5799 {
5800 assert(cons->addconssetchg == NULL);
5801 assert(cons->addarraypos == -1);
5802
5803 /* activate constraint */
5804 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5805 assert(cons->active);
5806 assert(!cons->update);
5807
5808 /* remember, that this constraint set change data was responsible for the constraint's addition */
5809 cons->addconssetchg = conssetchg;
5810 cons->addarraypos = i;
5811
5812 ++i; /* handle the next constraint */
5813 }
5814 }
5815
5816 /* apply constraint disablings */
5817 i = 0;
5818 while( i < conssetchg->ndisabledconss )
5819 {
5820 cons = conssetchg->disabledconss[i];
5821 assert(cons != NULL);
5822 assert(!cons->update);
5823
5824 /* if the constraint is disabled, we can permanently remove it from the disabledconss array */
5825 if( !cons->enabled )
5826 {
5827 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5828 cons->name, cons->conshdlr->name);
5829
5830 /* release and remove constraint from the disabledconss array, the empty slot is now used by the next constraint
5831 * and ndisabledconss was decreased, so do not increase i
5832 */
5833 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5834 }
5835 else
5836 {
5837 assert(cons->addarraypos >= 0);
5838 assert(!cons->deleted); /* deleted constraints must not be enabled! */
5839 SCIP_CALL( SCIPconsDisable(conssetchg->disabledconss[i], set, stat) );
5840 assert(!cons->update);
5841 assert(!cons->enabled);
5842
5843 ++i; /* handle the next constraint */
5844 }
5845 }
5846
5847 return SCIP_OKAY;
5848}
5849
5850/** undoes constraint set change */
5852 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to undo */
5853 BMS_BLKMEM* blkmem, /**< block memory */
5854 SCIP_SET* set, /**< global SCIP settings */
5855 SCIP_STAT* stat /**< dynamic problem statistics */
5856 )
5857{
5858 SCIP_CONS* cons;
5859 int i;
5860
5861 if( conssetchg == NULL )
5862 return SCIP_OKAY;
5863
5864 SCIPsetDebugMsg(set, "undoing constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5865 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5866
5867 /* undo constraint disablings */
5868 for( i = conssetchg->ndisabledconss-1; i >= 0; --i )
5869 {
5870 cons = conssetchg->disabledconss[i];
5871 assert(cons != NULL);
5872 assert(!cons->update);
5873
5874 /* If the constraint is inactive, we can permanently remove it from the disabledconss array. It was deactivated
5875 * in the subtree of the current node but not reactivated on the switching way back to the current node, which
5876 * means, the deactivation was more global (i.e. valid on a higher level node) than the current node and the
5877 * disabling at the current node doesn't have any effect anymore.
5878 * If the constraint is already enabled, we need not to do anything. This may happen on a path A -> B,
5879 * if the constraint is disabled at node B, and while processing the subtree of B, it is also disabled at
5880 * the more global node A. Then on the switching path back to A, the constraint is enabled at node B (which is
5881 * actually wrong, since it now should be disabled in the whole subtree of A, but we cannot know this), and
5882 * again enabled at node A (where enabling is ignored). If afterwards, a subnode of B is processed, the
5883 * switching disables the constraint in node A, and the disabling is then removed from node B.
5884 */
5885 if( !cons->active )
5886 {
5887 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5888 cons->name, cons->conshdlr->name);
5889
5890 /* release and remove constraint from the disabledconss array */
5891 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5892 }
5893 else if( !cons->enabled )
5894 {
5895 assert(cons->addarraypos >= 0);
5896 assert(!cons->deleted); /* deleted constraints must not be active! */
5897 SCIP_CALL( SCIPconsEnable(cons, set, stat) );
5898 assert(!cons->update);
5899 assert(!cons->active || cons->enabled);
5900 }
5901 }
5902
5903 /* undo constraint additions */
5904 for( i = conssetchg->naddedconss-1; i >= 0; --i )
5905 {
5906 cons = conssetchg->addedconss[i];
5907 assert(cons != NULL);
5908 assert(!cons->update);
5909
5910 /* If the constraint is already deactivated, we need not to do anything. This may happen on a path A -> B,
5911 * if the constraint is added at node B, and while processing the subtree of B, it is also added at
5912 * the more global node A. Then on the switching path back to A, the node is deactivated at node B (which is
5913 * actually wrong, since it now should be active in the whole subtree of A, but we cannot know this), and
5914 * again deactivated at node A (where deactivation is ignored). If afterwards, a subnode of B is processed, the
5915 * switching activates the constraint in node A, and the activation is then removed from node B.
5916 */
5917 if( cons->active )
5918 {
5919 assert(cons->addconssetchg == conssetchg);
5920 assert(cons->addarraypos == i);
5921
5922 /* deactivate constraint */
5923 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
5924
5925 /* unlink the constraint and the constraint set change */
5926 cons->addconssetchg = NULL;
5927 cons->addarraypos = -1;
5928 }
5929 assert(!cons->active);
5930 assert(!cons->update);
5931 }
5932
5933 return SCIP_OKAY;
5934}
5935
5936/** applies constraint set change to the global problem and deletes the constraint set change data */
5938 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5939 BMS_BLKMEM* blkmem, /**< block memory */
5940 SCIP_SET* set, /**< global SCIP settings */
5941 SCIP_STAT* stat, /**< dynamic problem statistics */
5942 SCIP_PROB* prob, /**< problem data */
5943 SCIP_REOPT* reopt /**< reoptimization data */
5944 )
5945{
5946 SCIP_CONS* cons;
5947 int i;
5948
5949 assert(conssetchg != NULL);
5950
5951 /* nothing to do on empty constraint set change data */
5952 if( *conssetchg == NULL )
5953 return SCIP_OKAY;
5954
5955 SCIPsetDebugMsg(set, "moving constraint set changes at %p to global problem: %d constraint additions, %d constraint disablings\n",
5956 (void*)*conssetchg, (*conssetchg)->naddedconss, (*conssetchg)->ndisabledconss);
5957
5958 /* apply constraint additions to the global problem (loop backwards, because then conssetchgDelAddedCons() is
5959 * more efficient)
5960 */
5961 for( i = (*conssetchg)->naddedconss-1; i >= 0; --i )
5962 {
5963 cons = (*conssetchg)->addedconss[i];
5964 assert(cons != NULL);
5965 assert(!cons->update);
5966
5967 /* only move constraints that are not sticking at the current node */
5968 if( !SCIPconsIsStickingAtNode(cons) )
5969 {
5970 /* because we first have to delete the constraint, we have to capture it in order to not loose it */
5971 SCIPconsCapture(cons);
5972
5973 /* delete constraint addition from constraint set change data */
5974 SCIP_CALL( conssetchgDelAddedCons(*conssetchg, blkmem, set, i) );
5975
5976 /* don't move deleted constraints to the global problem */
5977 if( !cons->deleted )
5978 {
5979 SCIP_CALL( SCIPprobAddCons(prob, set, stat, cons) );
5980 }
5981
5982 /* release constraint */
5983 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
5984 }
5985 }
5986
5987 /* apply constraint disablings to the global problem (loop backwards, because then conssetchgDelDisabledCons() is
5988 * more efficient)
5989 */
5990 for( i = (*conssetchg)->ndisabledconss-1; i >= 0; --i )
5991 {
5992 cons = (*conssetchg)->disabledconss[i];
5993 assert(cons != NULL);
5994 assert(!cons->update);
5995
5996 /* only delete constraints that are not sticking at the current node */
5997 if( !SCIPconsIsStickingAtNode(cons) )
5998 {
5999 /* globally delete constraint */
6000 if( !cons->deleted )
6001 {
6002 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
6003 }
6004
6005 /* release and remove constraint from the disabledconss array */
6006 SCIP_CALL( conssetchgDelDisabledCons(*conssetchg, blkmem, set, i) );
6007 }
6008 }
6009
6010 if( (*conssetchg)->naddedconss == 0 && (*conssetchg)->ndisabledconss == 0 )
6011 {
6012 /* free empty constraint set change data */
6013 SCIP_CALL( SCIPconssetchgFree(conssetchg, blkmem, set) );
6014 }
6015
6016 return SCIP_OKAY;
6017}
6018
6019
6020
6021
6022/*
6023 * Constraint methods
6024 */
6025
6026/** creates and captures a constraint, and inserts it into the conss array of its constraint handler
6027 *
6028 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, a LP or pseudo solution
6029 * may be declared feasible even if it violates this particular constraint.
6030 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6031 * local constraint is redundant due to the variable's local bounds.
6032 */
6034 SCIP_CONS** cons, /**< pointer to constraint */
6035 BMS_BLKMEM* blkmem, /**< block memory */
6036 SCIP_SET* set, /**< global SCIP settings */
6037 const char* name, /**< name of constraint */
6038 SCIP_CONSHDLR* conshdlr, /**< constraint handler for this constraint */
6039 SCIP_CONSDATA* consdata, /**< data for this specific constraint */
6040 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
6041 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
6042 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
6043 * Usually set to TRUE. */
6044 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
6045 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6046 SCIP_Bool check, /**< should the constraint be checked for feasibility?
6047 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6048 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
6049 * Usually set to TRUE. */
6050 SCIP_Bool local, /**< is constraint only valid locally?
6051 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
6052 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
6053 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
6054 * adds coefficients to this constraint. */
6055 SCIP_Bool dynamic, /**< is constraint subject to aging?
6056 * Usually set to FALSE. Set to TRUE for own cuts which
6057 * are separated as constraints. */
6058 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
6059 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
6060 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6061 * if it may be moved to a more global node?
6062 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
6063 SCIP_Bool original, /**< is constraint belonging to the original problem? */
6064 SCIP_Bool deleteconsdata /**< has the constraint data to be deleted if constraint is freed? */
6065 )
6066{
6067 int i;
6068
6069 assert(cons != NULL);
6070 assert(blkmem != NULL);
6071 assert(set != NULL);
6072 assert(name != NULL);
6073 assert(conshdlr != NULL);
6074 assert(!original || deleteconsdata);
6075
6076 /* create constraint data */
6077 SCIP_ALLOC( BMSallocBlockMemory(blkmem, cons) );
6078 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &(*cons)->name, name, strlen(name)+1) );
6079#ifndef NDEBUG
6080 (*cons)->scip = set->scip;
6081#endif
6082 (*cons)->conshdlr = conshdlr;
6083 (*cons)->consdata = consdata;
6084 (*cons)->transorigcons = NULL;
6085 (*cons)->addconssetchg = NULL;
6086 (*cons)->addarraypos = -1;
6087 (*cons)->consspos = -1;
6088 (*cons)->initconsspos = -1;
6089 (*cons)->sepaconsspos = -1;
6090 (*cons)->enfoconsspos = -1;
6091 (*cons)->checkconsspos = -1;
6092 (*cons)->propconsspos = -1;
6093 (*cons)->confconsspos = -1;
6094 (*cons)->activedepth = -2;
6095 (*cons)->validdepth = (local ? -1 : 0);
6096 (*cons)->age = 0.0;
6097 (*cons)->nuses = 0;
6098 (*cons)->nupgradelocks = 0;
6099 (*cons)->initial = initial;
6100 (*cons)->separate = separate;
6101 (*cons)->enforce = enforce;
6102 (*cons)->check = check;
6103 (*cons)->propagate = propagate;
6104 (*cons)->sepaenabled = separate;
6105 (*cons)->propenabled = propagate;
6106 (*cons)->local = local;
6107 (*cons)->modifiable = modifiable;
6108 (*cons)->dynamic = dynamic;
6109 (*cons)->removable = removable;
6110 (*cons)->stickingatnode = stickingatnode;
6111 (*cons)->original = original;
6112 (*cons)->deleteconsdata = deleteconsdata;
6113 (*cons)->active = FALSE;
6114 (*cons)->conflict = FALSE;
6115 (*cons)->enabled = FALSE;
6116 (*cons)->obsolete = FALSE;
6117 (*cons)->markpropagate = TRUE;
6118 (*cons)->deleted = FALSE;
6119 (*cons)->update = FALSE;
6120 (*cons)->updateinsert = FALSE;
6121 (*cons)->updateactivate = FALSE;
6122 (*cons)->updatedeactivate = FALSE;
6123 (*cons)->updateenable = FALSE;
6124 (*cons)->updatedisable = FALSE;
6125 (*cons)->updatesepaenable = FALSE;
6126 (*cons)->updatesepadisable = FALSE;
6127 (*cons)->updatepropenable = FALSE;
6128 (*cons)->updatepropdisable = FALSE;
6129 (*cons)->updateobsolete = FALSE;
6130 (*cons)->updatemarkpropagate = FALSE;
6131 (*cons)->updateunmarkpropagate = FALSE;
6132 (*cons)->updatefree = FALSE;
6133 (*cons)->updateactfocus = FALSE;
6134
6135 for( i = 0; i < NLOCKTYPES; i++ )
6136 {
6137 (*cons)->nlockspos[i] = 0;
6138 (*cons)->nlocksneg[i] = 0;
6139 }
6140
6141 /* capture constraint */
6142 SCIPconsCapture(*cons);
6143
6144 /* insert the constraint as inactive constraint into the transformed constraints array */
6145 if( !original )
6146 {
6147 /* check, if inserting constraint should be delayed */
6148 if( conshdlrAreUpdatesDelayed(conshdlr) )
6149 {
6150 SCIPsetDebugMsg(set, " -> delaying insertion of constraint <%s>\n", (*cons)->name);
6151 (*cons)->updateinsert = TRUE;
6152 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6153 assert((*cons)->update);
6154 assert((*cons)->nuses == 2);
6155 }
6156 else
6157 {
6158 SCIP_CALL( conshdlrAddCons(conshdlr, set, *cons) );
6159 }
6160 }
6161
6162 checkConssArrays(conshdlr);
6163
6164 return SCIP_OKAY;
6165}
6166
6167/** copies source constraint of source SCIP into the target constraint for the target SCIP, using the variable map for
6168 * mapping the variables of the source SCIP to the variables of the target SCIP; if the copying process was successful
6169 * a constraint is created and captured;
6170 *
6171 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6172 * may be declared feasible even if it violates this particular constraint.
6173 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6174 * local constraint is redundant due to the variable's local bounds.
6175 */
6177 SCIP_CONS** cons, /**< pointer to store the created target constraint */
6178 SCIP_SET* set, /**< global SCIP settings of the target SCIP */
6179 const char* name, /**< name of constraint, or NULL if the name of the source constraint should be used */
6180 SCIP* sourcescip, /**< source SCIP data structure */
6181 SCIP_CONSHDLR* sourceconshdlr, /**< source constraint handler for this constraint */
6182 SCIP_CONS* sourcecons, /**< source constraint of the source SCIP */
6183 SCIP_HASHMAP* varmap, /**< a SCIP_HASHMAP mapping variables of the source SCIP to corresponding
6184 * variables of the target SCIP */
6185 SCIP_HASHMAP* consmap, /**< a hashmap to store the mapping of source constraints to the corresponding
6186 * target constraints, must not be NULL! */
6187 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP? */
6188 SCIP_Bool separate, /**< should the constraint be separated during LP processing? */
6189 SCIP_Bool enforce, /**< should the constraint be enforced during node processing? */
6190 SCIP_Bool check, /**< should the constraint be checked for feasibility? */
6191 SCIP_Bool propagate, /**< should the constraint be propagated during node processing? */
6192 SCIP_Bool local, /**< is constraint only valid locally? */
6193 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)? */
6194 SCIP_Bool dynamic, /**< is constraint subject to aging? */
6195 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup? */
6196 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6197 * if it may be moved to a more global node? */
6198 SCIP_Bool global, /**< create a global or a local copy? */
6199 SCIP_Bool* valid /**< pointer to store whether the copying was valid or not */
6200 )
6201{
6202 assert(cons != NULL);
6203 assert(set != NULL);
6204 assert(sourcescip != NULL);
6205 assert(sourceconshdlr != NULL);
6206 assert(sourcecons != NULL);
6207 assert(varmap != NULL);
6208 assert(consmap != NULL);
6209 assert(valid != NULL);
6210
6211 /* if constraint handler does not support copying, success will return false. Constraints handlers have to actively set this to true. */
6212 (*valid) = FALSE;
6213
6214 if( sourceconshdlr->conscopy != NULL )
6215 {
6216 SCIP_CALL( sourceconshdlr->conscopy(set->scip, cons, name, sourcescip, sourceconshdlr, sourcecons, varmap, consmap,
6217 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, global, valid) );
6218 }
6219
6220 return SCIP_OKAY;
6221}
6222
6223
6224/** parses constraint information (in cip format) out of a string; if the parsing process was successful a constraint is
6225 * created, captured, and inserted into the conss array of its constraint handler.
6226 *
6227 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6228 * may be declared feasible even if it violates this particular constraint.
6229 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6230 * local constraint is redundant due to the variable's local bounds.
6231 */
6233 SCIP_CONS** cons, /**< pointer to constraint */
6234 SCIP_SET* set, /**< global SCIP settings */
6235 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler of target SCIP */
6236 const char* str, /**< string to parse for constraint */
6237 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
6238 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
6239 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
6240 * Usually set to TRUE. */
6241 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
6242 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6243 SCIP_Bool check, /**< should the constraint be checked for feasibility?
6244 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6245 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
6246 * Usually set to TRUE. */
6247 SCIP_Bool local, /**< is constraint only valid locally?
6248 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
6249 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
6250 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
6251 * adds coefficients to this constraint. */
6252 SCIP_Bool dynamic, /**< is constraint subject to aging?
6253 * Usually set to FALSE. Set to TRUE for own cuts which
6254 * are separated as constraints. */
6255 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
6256 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
6257 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6258 * if it may be moved to a more global node?
6259 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
6260 SCIP_Bool* success /**< pointer store if the paring process was successful */
6261 )
6262{
6263 SCIP_CONSHDLR* conshdlr;
6264 char conshdlrname[SCIP_MAXSTRLEN];
6265 char consname[SCIP_MAXSTRLEN];
6266 char* endptr;
6267
6268 assert(cons != NULL);
6269 assert(set != NULL);
6270
6271 (*success) = FALSE;
6272
6273 /* scan constraint handler name */
6274 assert(str != NULL);
6275 SCIPstrCopySection(str, '[', ']', conshdlrname, SCIP_MAXSTRLEN, &endptr);
6276 if( endptr == NULL || endptr == str )
6277 {
6278 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint handler name.\n");
6279 return SCIP_OKAY;
6280 }
6281 assert(endptr != NULL);
6282
6283 /* allow parsing linear constraints exactly in exact solving mode */
6284 if( set->exact_enable )
6285 {
6286 /* linear to exactlinear */
6287 if( strcmp(conshdlrname, "linear") == 0 )
6288 strcpy(conshdlrname, "exactlinear");
6289 }
6290#ifdef SCIP_DISABLED_CODE
6291 /**@todo allow parsing exactlinear constraints approximately in real solving mode, but issue a warning message */
6292 else
6293 {
6294 /* exactlinear to linear */
6295 if( strcmp(conshdlrname, "exactlinear") == 0 )
6296 strcpy(conshdlrname, "linear");
6297 }
6298#endif
6299
6300 SCIPsetDebugMsg(set, "constraint handler name <%s>\n", conshdlrname);
6301
6302 /* scan constraint name */
6303 SCIPstrCopySection(endptr, '<', '>', consname, SCIP_MAXSTRLEN, &endptr);
6304 if( endptr == NULL || endptr == str )
6305 {
6306 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint name.\n");
6307 return SCIP_OKAY;
6308 }
6309 assert(endptr != NULL);
6310 SCIPsetDebugMsg(set, "constraint name <%s>\n", consname);
6311
6312 str = endptr;
6313
6314 /* skip white space */
6315 SCIP_CALL( SCIPskipSpace((char**)&str) );
6316
6317 /* check for colon */
6318 if( *str != ':' )
6319 {
6320 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find colon ':' after constraint name.\n");
6321 return SCIP_OKAY;
6322 }
6323
6324 /* skip colon */
6325 ++str;
6326
6327 /* skip white space */
6328 SCIP_CALL( SCIPskipSpace((char**)&str) );
6329
6330 /* check if a constraint handler with parsed name exists */
6331 conshdlr = SCIPsetFindConshdlr(set, conshdlrname);
6332
6333 if( conshdlr == NULL )
6334 {
6335 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> doesn't exist in SCIP data structure\n", conshdlrname);
6336 }
6337 else
6338 {
6339 assert( conshdlr != NULL );
6340 if ( conshdlr->consparse == NULL )
6341 {
6342 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> does not support parsing constraints\n", conshdlrname);
6343 }
6344 else
6345 {
6346 SCIP_CALL( conshdlr->consparse(set->scip, conshdlr, cons, consname, str,
6347 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, success) );
6348 }
6349 }
6350
6351 return SCIP_OKAY;
6352}
6353
6354/** change name of given constraint */
6356 SCIP_CONS* cons, /**< problem constraint */
6357 BMS_BLKMEM* blkmem, /**< block memory buffer */
6358 const char* name /**< new name of constraint */
6359 )
6360{
6361 assert(cons != NULL);
6362 assert(cons->name != NULL);
6363
6364 /* free old constraint name */
6365 BMSfreeBlockMemoryArray(blkmem, &cons->name, strlen(cons->name)+1);
6366
6367 /* copy new constraint name */
6368 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &cons->name, name, strlen(name)+1) );
6369
6370 return SCIP_OKAY;
6371}
6372
6373
6374/** frees a constraint and removes it from the conss array of its constraint handler */
6376 SCIP_CONS** cons, /**< constraint to free */
6377 BMS_BLKMEM* blkmem, /**< block memory buffer */
6378 SCIP_SET* set /**< global SCIP settings */
6379 )
6380{
6381 assert(cons != NULL);
6382 assert(*cons != NULL);
6383 assert((*cons)->conshdlr != NULL);
6384 assert((*cons)->nuses == 0);
6385 assert(!(*cons)->active);
6386 assert(!(*cons)->update);
6387 assert(!(*cons)->original || (*cons)->transorigcons == NULL);
6388 assert(blkmem != NULL);
6389 assert(set != NULL);
6390 assert((*cons)->scip == set->scip);
6391
6392 SCIPsetDebugMsg(set, "freeing constraint <%s> at conss pos %d of handler <%s>\n",
6393 (*cons)->name, (*cons)->consspos, (*cons)->conshdlr->name);
6394
6395 /* free constraint data */
6396 if( (*cons)->conshdlr->consdelete != NULL && (*cons)->consdata != NULL && (*cons)->deleteconsdata )
6397 {
6398 SCIP_CALL( (*cons)->conshdlr->consdelete(set->scip, (*cons)->conshdlr, *cons, &(*cons)->consdata) );
6399 }
6400 else if( !(*cons)->deleteconsdata )
6401 (*cons)->consdata = NULL;
6402 assert((*cons)->consdata == NULL);
6403
6404 /* unlink transformed and original constraint */
6405 if( (*cons)->transorigcons != NULL )
6406 {
6407 assert(!(*cons)->original);
6408 assert((*cons)->transorigcons->original);
6409 assert((*cons)->transorigcons->transorigcons == *cons);
6410
6411 (*cons)->transorigcons->transorigcons = NULL;
6412 }
6413
6414 /* remove constraint from the transformed constraints array */
6415 if( !(*cons)->original )
6416 {
6417 conshdlrDelCons((*cons)->conshdlr, *cons);
6418 checkConssArrays((*cons)->conshdlr);
6419 }
6420 assert((*cons)->consspos == -1);
6421 assert((*cons)->confconsspos == -1);
6422
6423 /* free constraint */
6424 BMSfreeBlockMemoryArray(blkmem, &(*cons)->name, strlen((*cons)->name)+1);
6425 BMSfreeBlockMemory(blkmem, cons);
6426
6427 return SCIP_OKAY;
6428}
6429
6430/** increases usage counter of constraint */
6432 SCIP_CONS* cons /**< constraint */
6433 )
6434{
6435 assert(cons != NULL);
6436 assert(cons->nuses >= 0);
6437
6438 SCIPdebugMessage("capture constraint <%s> with nuses=%d, cons pointer %p\n", cons->name, cons->nuses, (void*)cons);
6439 cons->nuses++;
6440}
6441
6442/** decreases usage counter of constraint, and frees memory if necessary */
6444 SCIP_CONS** cons, /**< pointer to constraint */
6445 BMS_BLKMEM* blkmem, /**< block memory */
6446 SCIP_SET* set /**< global SCIP settings */
6447 )
6448{
6449 assert(blkmem != NULL);
6450 assert(cons != NULL);
6451 assert(*cons != NULL);
6452 assert((*cons)->conshdlr != NULL);
6453 assert((*cons)->nuses >= 1);
6454 assert(set != NULL);
6455 assert((*cons)->scip == set->scip);
6456
6457 SCIPsetDebugMsg(set, "release constraint <%s> with nuses=%d, cons pointer %p\n", (*cons)->name, (*cons)->nuses, (void*)(*cons));
6458 (*cons)->nuses--;
6459 if( (*cons)->nuses == 0 )
6460 {
6461 assert(!(*cons)->active || (*cons)->updatedeactivate);
6462
6463 /* check, if freeing constraint should be delayed */
6464 if( conshdlrAreUpdatesDelayed((*cons)->conshdlr) )
6465 {
6466 SCIPsetDebugMsg(set, " -> delaying freeing constraint <%s>\n", (*cons)->name);
6467 (*cons)->updatefree = TRUE;
6468 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6469 assert((*cons)->update);
6470 assert((*cons)->nuses == 1);
6471 }
6472 else
6473 {
6474 SCIP_CALL( SCIPconsFree(cons, blkmem, set) );
6475 }
6476 }
6477 *cons = NULL;
6478
6479 return SCIP_OKAY;
6480}
6481
6482/** outputs constraint information to file stream */
6484 SCIP_CONS* cons, /**< constraint to print */
6485 SCIP_SET* set, /**< global SCIP settings */
6486 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
6487 FILE* file /**< output file (or NULL for standard output) */
6488 )
6489{
6490 SCIP_CONSHDLR* conshdlr;
6491
6492 assert(cons != NULL);
6493 assert(set != NULL);
6494 assert(cons->scip == set->scip);
6495
6496 conshdlr = cons->conshdlr;
6497 assert(conshdlr != NULL);
6498
6499 SCIPmessageFPrintInfo(messagehdlr, file, " [%s] <%s>: ", conshdlr->name, cons->name);
6500
6501 if( conshdlr->consprint != NULL )
6502 {
6503 SCIP_CALL( conshdlr->consprint(set->scip, conshdlr, cons, file) );
6504 }
6505 else
6506 SCIPmessageFPrintInfo(messagehdlr, file, "constraint handler <%s> doesn't support printing constraint", conshdlr->name);
6507
6508 return SCIP_OKAY;
6509}
6510
6511/** method to collect the variables of a constraint
6512 *
6513 * If the number of variables is greater than the available slots in the variable array, nothing happens except that
6514 * the success point is set to FALSE. With the method SCIPconsGetNVars() it is possible to get the number of variables
6515 * a constraint has in its scope.
6516 *
6517 * @note The success pointer indicates if all variables were copied into the vars arrray.
6518 *
6519 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6520 * set to FALSE.
6521 */
6523 SCIP_CONS* cons, /**< constraint to get variables for */
6524 SCIP_SET* set, /**< global SCIP settings */
6525 SCIP_VAR** vars, /**< array to store the involved variable of the constraint */
6526 int varssize, /**< available slots in vars array which is needed to check if the array is large enough */
6527 SCIP_Bool* success /**< pointer to store whether the variables are successfully copied */
6528 )
6529{
6530 SCIP_CONSHDLR* conshdlr;
6531
6532 assert(cons != NULL);
6533 assert(set != NULL);
6534 assert(cons->scip == set->scip);
6535
6536 conshdlr = cons->conshdlr;
6537 assert(conshdlr != NULL);
6538
6539 if( conshdlr->consgetvars != NULL )
6540 {
6541 SCIP_CALL( conshdlr->consgetvars(set->scip, conshdlr, cons, vars, varssize, success) );
6542 }
6543 else
6544 {
6545 (*success) = FALSE;
6546 }
6547
6548 return SCIP_OKAY;
6549}
6550
6551/** method to collect the number of variables of a constraint
6552 *
6553 * @note The success pointer indicates if the contraint handler was able to return the number of variables
6554 *
6555 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6556 * set to FALSE
6557 */
6559 SCIP_CONS* cons, /**< constraint to get number of variables for */
6560 SCIP_SET* set, /**< global SCIP settings */
6561 int* nvars, /**< pointer to store the number of variables */
6562 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the number of variables */
6563 )
6564{
6565 SCIP_CONSHDLR* conshdlr;
6566
6567 assert(cons != NULL);
6568 assert(set != NULL);
6569 assert(cons->scip == set->scip);
6570
6571 conshdlr = cons->conshdlr;
6572 assert(conshdlr != NULL);
6573
6574 if( conshdlr->consgetnvars != NULL )
6575 {
6576 SCIP_CALL( conshdlr->consgetnvars(set->scip, conshdlr, cons, nvars, success) );
6577 }
6578 else
6579 {
6580 (*nvars) = 0;
6581 (*success) = FALSE;
6582 }
6583
6584 return SCIP_OKAY;
6585}
6586
6587/** method to collect the permutation symmetry detection graph of a constraint
6588 *
6589 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6590 *
6591 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6592 */
6594 SCIP_CONS* cons, /**< constraint to get graph for */
6595 SCIP_SET* set, /**< global SCIP settings */
6596 SYM_GRAPH* graph, /**< symmetry detection graph */
6597 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6598 )
6599{
6600 SCIP_CONSHDLR* conshdlr;
6601
6602 assert(cons != NULL);
6603 assert(set != NULL);
6604 assert(cons->scip == set->scip);
6605 assert(success != NULL);
6606
6607 conshdlr = cons->conshdlr;
6608 assert(conshdlr != NULL);
6609
6610 if( conshdlr->consgetpermsymgraph != NULL )
6611 {
6612 SCIP_CALL( conshdlr->consgetpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6613 }
6614 else
6615 *success = FALSE;
6616
6617 return SCIP_OKAY;
6618}
6619
6620/** method to collect the signed permutation symmetry detection graph of a constraint
6621 *
6622 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6623 *
6624 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6625 */
6627 SCIP_CONS* cons, /**< constraint to get graph for */
6628 SCIP_SET* set, /**< global SCIP settings */
6629 SYM_GRAPH* graph, /**< symmetry detection graph */
6630 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6631 )
6632{
6633 SCIP_CONSHDLR* conshdlr;
6634
6635 assert(cons != NULL);
6636 assert(set != NULL);
6637 assert(cons->scip == set->scip);
6638 assert(success != NULL);
6639
6640 conshdlr = cons->conshdlr;
6641 assert(conshdlr != NULL);
6642
6643 if( conshdlr->consgetsignedpermsymgraph != NULL )
6644 {
6645 SCIP_CALL( conshdlr->consgetsignedpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6646 }
6647 else
6648 *success = FALSE;
6649
6650 return SCIP_OKAY;
6651}
6652
6653/** globally removes constraint from all subproblems; removes constraint from the constraint set change data of the
6654 * node, where it was created, or from the problem, if it was a problem constraint
6655 */
6657 SCIP_CONS* cons, /**< constraint to delete */
6658 BMS_BLKMEM* blkmem, /**< block memory */
6659 SCIP_SET* set, /**< global SCIP settings */
6660 SCIP_STAT* stat, /**< dynamic problem statistics */
6661 SCIP_PROB* prob, /**< problem data */
6662 SCIP_REOPT* reopt /**< reoptimization data */
6663 )
6664{
6665 assert(cons != NULL);
6666 assert(cons->conshdlr != NULL);
6667 assert(!cons->active || cons->updatedeactivate || cons->addarraypos >= 0);
6668 assert(set != NULL);
6669 assert(cons->scip == set->scip);
6670
6671 SCIPsetDebugMsg(set, "globally deleting constraint <%s> (delay updates: %d)\n",
6672 cons->name, cons->conshdlr->delayupdatecount);
6673
6674 /* mark constraint deleted */
6675 cons->deleted = TRUE;
6676
6677 /* deactivate constraint, if it is currently active */
6678 if( cons->active && !cons->updatedeactivate )
6679 {
6680 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
6681 }
6682 else
6683 cons->updateactivate = FALSE;
6684
6685 if( set->reopt_enable && !SCIPreoptConsCanBeDeleted(reopt, cons) )
6686 return SCIP_OKAY;
6687
6688 assert(!cons->active || cons->updatedeactivate);
6689 assert(!cons->enabled || cons->updatedeactivate);
6690
6691 /* remove formerly active constraint from the conssetchg's addedconss / prob's conss array */
6692 if( cons->addarraypos >= 0 )
6693 {
6694 if( cons->addconssetchg == NULL )
6695 {
6696 /* remove problem constraint from the problem */
6697 SCIP_CALL( SCIPprobDelCons(prob, blkmem, set, stat, cons) );
6698 }
6699 else
6700 {
6702 assert(0 <= cons->addarraypos && cons->addarraypos < cons->addconssetchg->naddedconss);
6703 assert(cons->addconssetchg->addedconss[cons->addarraypos] == cons);
6704
6705 /* remove constraint from the constraint set change addedconss array */
6707 }
6708 }
6709
6710 return SCIP_OKAY;
6711}
6712
6713/** gets and captures transformed constraint of a given original constraint; if the constraint is not yet transformed,
6714 * a new transformed constraint for this constraint is created
6715 */
6717 SCIP_CONS* origcons, /**< original constraint */
6718 BMS_BLKMEM* blkmem, /**< block memory buffer */
6719 SCIP_SET* set, /**< global SCIP settings */
6720 SCIP_CONS** transcons /**< pointer to store the transformed constraint */
6721 )
6722{
6723 assert(origcons != NULL);
6724 assert(set != NULL);
6725 assert(origcons->scip == set->scip);
6726 assert(origcons->conshdlr != NULL);
6727 assert(origcons->original);
6728 assert(transcons != NULL);
6729
6730 /* check, if the constraint is already transformed */
6731 if( origcons->transorigcons != NULL )
6732 {
6733 *transcons = origcons->transorigcons;
6734 SCIPconsCapture(*transcons);
6735 }
6736 else
6737 {
6738 /* create transformed constraint */
6739 if( origcons->conshdlr->constrans != NULL )
6740 {
6741 /* use constraint handler's own method to transform constraint */
6742 SCIP_CALL( origcons->conshdlr->constrans(set->scip, origcons->conshdlr, origcons, transcons) );
6743 }
6744 else
6745 {
6746 /* create new constraint with a pointer copy of the constraint data */
6747 SCIP_CALL( SCIPconsCreate(transcons, blkmem, set, origcons->name, origcons->conshdlr, origcons->consdata, origcons->initial,
6748 origcons->separate, origcons->enforce, origcons->check, origcons->propagate,
6749 origcons->local, origcons->modifiable, origcons->dynamic, origcons->removable, origcons->stickingatnode,
6750 FALSE, FALSE) );
6751 }
6752
6753 /* link original and transformed constraint */
6754 origcons->transorigcons = *transcons;
6755 (*transcons)->transorigcons = origcons;
6756
6757 /* copy the number of upgradelocks */
6758 (*transcons)->nupgradelocks = origcons->nupgradelocks; /*lint !e732*/
6759 }
6760 assert(*transcons != NULL);
6761
6762 return SCIP_OKAY;
6763}
6764
6765/** sets the initial flag of the given constraint */
6767 SCIP_CONS* cons, /**< constraint */
6768 SCIP_SET* set, /**< global SCIP settings */
6769 SCIP_STAT* stat, /**< dynamic problem statistics */
6770 SCIP_Bool initial /**< new value */
6771 )
6772{
6773 assert(cons != NULL);
6774 assert(set != NULL);
6775 assert(cons->scip == set->scip);
6776
6777 if( cons->initial != initial )
6778 {
6779 cons->initial = initial;
6780 if( !cons->original )
6781 {
6782 if( cons->initial )
6783 {
6784 SCIP_CALL( conshdlrAddInitcons(SCIPconsGetHdlr(cons), set, stat, cons) );
6785 }
6786 else
6787 {
6788 if( cons->initconsspos >= 0 )
6789 {
6791 }
6792 }
6793 }
6794 }
6795
6796 return SCIP_OKAY;
6797}
6798
6799/** sets the separate flag of the given constraint */
6801 SCIP_CONS* cons, /**< constraint */
6802 SCIP_SET* set, /**< global SCIP settings */
6803 SCIP_Bool separate /**< new value */
6804 )
6805{
6806 assert(cons != NULL);
6807 assert(set != NULL);
6808 assert(cons->scip == set->scip);
6809
6810 if( cons->separate != separate )
6811 {
6813 {
6814 cons->separate = separate;
6815 }
6816 else if( cons->enabled && cons->sepaenabled )
6817 {
6818 if( separate )
6819 {
6820 cons->separate = separate;
6821 SCIP_CALL( conshdlrAddSepacons(cons->conshdlr, set, cons) );
6822 }
6823 else
6824 {
6825 conshdlrDelSepacons(cons->conshdlr, cons);
6826 cons->separate = separate;
6827 }
6828 }
6829 }
6830
6831 return SCIP_OKAY;
6832}
6833
6834/** sets the enforce flag of the given constraint */
6836 SCIP_CONS* cons, /**< constraint */
6837 SCIP_SET* set, /**< global SCIP settings */
6838 SCIP_Bool enforce /**< new value */
6839 )
6840{
6841 assert(cons != NULL);
6842 assert(set != NULL);
6843 assert(cons->scip == set->scip);
6844
6845 if( cons->enforce != enforce )
6846 {
6848 {
6849 cons->enforce = enforce;
6850 }
6851 else if( cons->enabled )
6852 {
6853 if( enforce )
6854 {
6855 cons->enforce = enforce;
6856 SCIP_CALL( conshdlrAddEnfocons(cons->conshdlr, set, cons) );
6857 }
6858 else
6859 {
6860 conshdlrDelEnfocons(cons->conshdlr, cons);
6861 cons->enforce = enforce;
6862 }
6863 }
6864 }
6865
6866 return SCIP_OKAY;
6867}
6868
6869/** sets the check flag of the given constraint */
6871 SCIP_CONS* cons, /**< constraint */
6872 SCIP_SET* set, /**< global SCIP settings */
6873 SCIP_Bool check /**< new value */
6874 )
6875{
6876 assert(cons != NULL);
6877 assert(set != NULL);
6878 assert(cons->scip == set->scip);
6879
6880 if( cons->check != check )
6881 {
6882 cons->check = check;
6883
6884 if( !cons->original )
6885 {
6886 /* if constraint is a problem constraint, update variable roundings locks */
6887 if( cons->addconssetchg == NULL && cons->addarraypos >= 0 )
6888 {
6889 if( cons->check )
6890 {
6892 }
6893 else
6894 {
6896 }
6897 }
6898
6899 /* if constraint is active, update the checkconss array of the constraint handler */
6900 if( cons->active )
6901 {
6902 if( cons->check )
6903 {
6904 SCIP_CALL( conshdlrAddCheckcons(cons->conshdlr, set, cons) );
6905 }
6906 else
6907 {
6908 conshdlrDelCheckcons(cons->conshdlr, cons);
6909 }
6910 }
6911 }
6912 }
6913
6914 return SCIP_OKAY;
6915}
6916
6917/** sets the propagate flag of the given constraint */
6919 SCIP_CONS* cons, /**< constraint */
6920 SCIP_SET* set, /**< global SCIP settings */
6921 SCIP_Bool propagate /**< new value */
6922 )
6923{
6924 assert(cons != NULL);
6925 assert(set != NULL);
6926 assert(cons->scip == set->scip);
6927
6928 if( cons->propagate != propagate )
6929 {
6931 {
6932 cons->propagate = propagate;
6933 }
6934 else if( cons->enabled && cons->propenabled )
6935 {
6936 if( propagate )
6937 {
6938 cons->propagate = propagate;
6939 SCIP_CALL( conshdlrAddPropcons(cons->conshdlr, set, cons) );
6940 }
6941 else
6942 {
6943 conshdlrDelPropcons(cons->conshdlr, cons);
6944 cons->propagate = propagate;
6945 }
6946 }
6947 }
6948
6949 return SCIP_OKAY;
6950}
6951
6952/** sets the local flag of the given constraint */
6954 SCIP_CONS* cons, /**< constraint */
6955 SCIP_Bool local /**< new value */
6956 )
6957{
6958 assert(cons != NULL);
6959
6960 cons->local = local;
6961 if( !local )
6962 cons->validdepth = 0;
6963}
6964
6965/** sets the modifiable flag of the given constraint */
6967 SCIP_CONS* cons, /**< constraint */
6968 SCIP_Bool modifiable /**< new value */
6969 )
6970{
6971 assert(cons != NULL);
6972
6973 cons->modifiable = modifiable;
6974}
6975
6976/** sets the dynamic flag of the given constraint */
6978 SCIP_CONS* cons, /**< constraint */
6979 SCIP_Bool dynamic /**< new value */
6980 )
6981{
6982 assert(cons != NULL);
6983
6984 cons->dynamic = dynamic;
6985}
6986
6987/** sets the removable flag of the given constraint */
6989 SCIP_CONS* cons, /**< constraint */
6990 SCIP_Bool removable /**< new value */
6991 )
6992{
6993 assert(cons != NULL);
6994
6995 cons->removable = removable;
6996}
6997
6998/** sets the stickingatnode flag of the given constraint */
7000 SCIP_CONS* cons, /**< constraint */
7001 SCIP_Bool stickingatnode /**< new value */
7002 )
7003{
7004 assert(cons != NULL);
7005
7006 cons->stickingatnode = stickingatnode;
7007}
7008
7009/** gives the constraint a new name; ATTENTION: to old pointer is over written that might
7010 * result in a memory leakage */
7012 SCIP_CONS* cons, /**< constraint */
7013 const char* name /**< new name of constraint */
7014 )
7015{
7016 assert( cons != NULL );
7017 assert( name != NULL );
7018
7019 cons->name = (char*)name;
7020}
7021
7022/** gets associated transformed constraint of an original constraint, or NULL if no associated transformed constraint
7023 * exists
7024 */
7026 SCIP_CONS* cons /**< constraint */
7027 )
7028{
7029 assert(cons->original);
7030
7031 return cons->transorigcons;
7032}
7033
7034/** activates constraint or marks constraint to be activated in next update */
7036 SCIP_CONS* cons, /**< constraint */
7037 SCIP_SET* set, /**< global SCIP settings */
7038 SCIP_STAT* stat, /**< dynamic problem statistics */
7039 int depth, /**< depth in the tree where the constraint activation takes place, or -1 for global problem */
7040 SCIP_Bool focusnode /**< does the constraint activation take place at the focus node? */
7041 )
7042{
7043 assert(cons != NULL);
7044 assert(!cons->original);
7045 assert(!cons->active);
7046 assert(!cons->updateactivate);
7047 assert(!cons->updatedeactivate);
7048 assert(!cons->updateenable);
7049 assert(!cons->updatedisable);
7050 assert(!cons->updateobsolete);
7051 assert(!cons->updatefree);
7052 assert(cons->activedepth == -2);
7053 assert(cons->conshdlr != NULL);
7054 assert(set != NULL);
7055 assert(cons->scip == set->scip);
7056
7058 {
7059 SCIPsetDebugMsg(set, "delayed activation of constraint <%s> in constraint handler <%s> (depth %d)\n",
7060 cons->name, cons->conshdlr->name, depth);
7061 cons->updateactivate = TRUE;
7062 cons->activedepth = depth;
7063 cons->updateactfocus = focusnode;
7065 assert(cons->update);
7066 }
7067 else
7068 {
7069 SCIP_CALL( conshdlrActivateCons(cons->conshdlr, set, stat, cons, depth, focusnode) );
7070 assert(cons->active);
7071 }
7072
7073 return SCIP_OKAY;
7074}
7075
7076/** deactivates constraint or marks constraint to be deactivated in next update */
7078 SCIP_CONS* cons, /**< constraint */
7079 SCIP_SET* set, /**< global SCIP settings */
7080 SCIP_STAT* stat /**< dynamic problem statistics */
7081 )
7082{
7083 assert(cons != NULL);
7084 assert(!cons->original);
7085 assert(cons->active);
7086 assert(!cons->updateactivate);
7087 assert(!cons->updatedeactivate);
7088 assert(cons->activedepth >= -1);
7089 assert(cons->conshdlr != NULL);
7090 assert(set != NULL);
7091 assert(cons->scip == set->scip);
7092
7094 {
7095 SCIPsetDebugMsg(set, "delayed deactivation of constraint <%s> in constraint handler <%s>\n",
7096 cons->name, cons->conshdlr->name);
7097 cons->updatedeactivate = TRUE;
7098 cons->activedepth = -2;
7100 assert(cons->update);
7101 }
7102 else
7103 {
7104 SCIP_CALL( conshdlrDeactivateCons(cons->conshdlr, set, stat, cons) );
7105 assert(!cons->active);
7106 }
7107
7108 return SCIP_OKAY;
7109}
7110
7111/** enables constraint's separation, enforcing, and propagation capabilities or marks them to be enabled in next update */
7113 SCIP_CONS* cons, /**< constraint */
7114 SCIP_SET* set, /**< global SCIP settings */
7115 SCIP_STAT* stat /**< dynamic problem statistics */
7116 )
7117{
7118 assert(cons != NULL);
7119 assert(!cons->original);
7120 assert(cons->conshdlr != NULL);
7121 assert(set != NULL);
7122 assert(cons->scip == set->scip);
7123
7124 if( !cons->active || cons->updatedeactivate || cons->updateenable || (cons->enabled && !cons->updatedisable) )
7125 return SCIP_OKAY;
7126
7127 assert(!cons->updateactivate);
7128
7130 {
7131 cons->updateenable = TRUE;
7133 assert(cons->update);
7134 }
7135 else
7136 {
7137 SCIP_CALL( conshdlrEnableCons(cons->conshdlr, set, stat, cons) );
7138 assert(cons->enabled);
7139 }
7140
7141 return SCIP_OKAY;
7142}
7143
7144/** disables constraint's separation, enforcing, and propagation capabilities or marks them to be disabled in next update */
7146 SCIP_CONS* cons, /**< constraint */
7147 SCIP_SET* set, /**< global SCIP settings */
7148 SCIP_STAT* stat /**< dynamic problem statistics */
7149 )
7150{
7151 assert(cons != NULL);
7152 assert(!cons->original);
7153 assert(cons->conshdlr != NULL);
7154 assert(set != NULL);
7155 assert(cons->scip == set->scip);
7156
7157 if( cons->updatedisable || (!cons->enabled && !cons->updateenable) )
7158 return SCIP_OKAY;
7159
7160 assert(cons->active);
7161 assert(!cons->updateactivate);
7162
7164 {
7165 cons->updatedisable = TRUE;
7167 assert(cons->update);
7168 }
7169 else
7170 {
7171 SCIP_CALL( conshdlrDisableCons(cons->conshdlr, set, stat, cons) );
7172 assert(!cons->enabled);
7173 }
7174
7175 return SCIP_OKAY;
7176}
7177
7178/** enables constraint's separation capabilities or marks them to be enabled in next update */
7180 SCIP_CONS* cons, /**< constraint */
7181 SCIP_SET* set /**< global SCIP settings */
7182 )
7183{
7184 assert(cons != NULL);
7185 assert(cons->conshdlr != NULL);
7186 assert(set != NULL);
7187 assert(cons->scip == set->scip);
7188
7189 if( cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable) )
7190 return SCIP_OKAY;
7191
7193 {
7194 cons->updatesepadisable = FALSE;
7195 cons->updatesepaenable = TRUE;
7197 assert(cons->update);
7198 }
7199 else
7200 {
7202 assert(cons->sepaenabled);
7203 }
7204
7205 return SCIP_OKAY;
7206}
7207
7208/** disables constraint's separation capabilities or marks them to be disabled in next update */
7210 SCIP_CONS* cons, /**< constraint */
7211 SCIP_SET* set /**< global SCIP settings */
7212 )
7213{
7214 assert(cons != NULL);
7215 assert(cons->conshdlr != NULL);
7216
7217 if( cons->updatesepadisable || (!cons->sepaenabled && !cons->updatesepaenable) )
7218 return SCIP_OKAY;
7219
7221 {
7222 cons->updatesepaenable = FALSE;
7223 cons->updatesepadisable = TRUE;
7225 assert(cons->update);
7226 }
7227 else
7228 {
7230 assert(!cons->sepaenabled);
7231 }
7232
7233 return SCIP_OKAY;
7234}
7235
7236/** enables constraint's propagation capabilities or marks them to be enabled in next update */
7238 SCIP_CONS* cons, /**< constraint */
7239 SCIP_SET* set /**< global SCIP settings */
7240 )
7241{
7242 assert(cons != NULL);
7243 assert(cons->conshdlr != NULL);
7244 assert(set != NULL);
7245 assert(cons->scip == set->scip);
7246
7247 if( cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable) )
7248 return SCIP_OKAY;
7249
7251 {
7252 cons->updatepropdisable = FALSE;
7253 cons->updatepropenable = TRUE;
7255 assert(cons->update);
7256 }
7257 else
7258 {
7260 assert(cons->propenabled);
7261 }
7262
7263 return SCIP_OKAY;
7264}
7265
7266/** disables constraint's propagation capabilities or marks them to be disabled in next update */
7268 SCIP_CONS* cons, /**< constraint */
7269 SCIP_SET* set /**< global SCIP settings */
7270 )
7271{
7272 assert(cons != NULL);
7273 assert(cons->conshdlr != NULL);
7274 assert(set != NULL);
7275 assert(cons->scip == set->scip);
7276
7277 if( cons->updatepropdisable || (!cons->propenabled && !cons->updatepropenable) )
7278 return SCIP_OKAY;
7279
7281 {
7282 cons->updatepropenable = FALSE;
7283 cons->updatepropdisable = TRUE;
7285 assert(cons->update);
7286 }
7287 else
7288 {
7290 assert(!cons->propenabled);
7291 }
7292
7293 return SCIP_OKAY;
7294}
7295
7296/** marks the constraint to be a conflict */
7298 SCIP_CONS* cons /**< constraint */
7299 )
7300{
7301 assert(cons != NULL);
7302
7303 cons->conflict = TRUE;
7304
7305 return SCIP_OKAY;
7306}
7307
7308/** marks the constraint to be propagated (update might be delayed) */
7310 SCIP_CONS* cons, /**< constraint */
7311 SCIP_SET* set /**< global SCIP settings */
7312 )
7313{
7314 assert(cons != NULL);
7315 assert(cons->conshdlr != NULL);
7316 assert(set != NULL);
7317 assert(cons->scip == set->scip);
7318
7319 if( cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate) )
7320 return SCIP_OKAY;
7321
7323 {
7325 cons->updatemarkpropagate = TRUE;
7327 assert(cons->update);
7328 }
7329 else
7330 {
7332 assert(cons->markpropagate || !cons->enabled);
7333 }
7334
7335 return SCIP_OKAY;
7336}
7337
7338/** unmarks the constraint to be propagated (update might be delayed) */
7340 SCIP_CONS* cons, /**< constraint */
7341 SCIP_SET* set /**< global SCIP settings */
7342 )
7343{
7344 assert(cons != NULL);
7345 assert(cons->conshdlr != NULL);
7346 assert(set != NULL);
7347 assert(cons->scip == set->scip);
7348
7349 if( cons->updateunmarkpropagate || (!cons->markpropagate && !cons->updatemarkpropagate) )
7350 return SCIP_OKAY;
7351
7353 {
7354 cons->updatemarkpropagate = FALSE;
7357 assert(cons->update);
7358 }
7359 else
7360 {
7362 assert(!cons->markpropagate || !cons->enabled);
7363 }
7364
7365 return SCIP_OKAY;
7366}
7367
7368/** adds given value to age of constraint, but age can never become negative;
7369 * should be called
7370 * - in constraint separation, if no cut was found for this constraint,
7371 * - in constraint enforcing, if constraint was feasible, and
7372 * - in constraint propagation, if no domain reduction was deduced;
7373 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7374 * in next update
7375 */
7377 SCIP_CONS* cons, /**< constraint */
7378 BMS_BLKMEM* blkmem, /**< block memory */
7379 SCIP_SET* set, /**< global SCIP settings */
7380 SCIP_STAT* stat, /**< dynamic problem statistics */
7381 SCIP_PROB* prob, /**< problem data */
7382 SCIP_Real deltaage, /**< value to add to the constraint's age */
7383 SCIP_REOPT* reopt /**< reoptimization data */
7384 )
7385{
7386 assert(cons != NULL);
7387 assert(cons->conshdlr != NULL);
7388 assert(!cons->updateactivate);
7389 assert(set != NULL);
7390 assert(cons->scip == set->scip);
7391
7392 /* no aging in presolving */
7393 if( set->stage == SCIP_STAGE_PRESOLVING )
7394 return SCIP_OKAY;
7395
7396 SCIPsetDebugMsg(set, "adding %g to age (%g) of constraint <%s> of handler <%s>\n",
7397 deltaage, cons->age, cons->name, cons->conshdlr->name);
7398
7399 cons->age += deltaage;
7400 cons->age = MAX(cons->age, 0.0);
7401
7402 if( !cons->original )
7403 {
7404 if( !cons->check && consExceedsAgelimit(cons, set) )
7405 {
7406 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
7407 }
7408 else if( !cons->obsolete && consExceedsObsoleteage(cons, set) )
7409 {
7411 {
7412 cons->updateobsolete = TRUE;
7414 assert(cons->update);
7415 }
7416 else
7417 {
7419 assert(cons->obsolete);
7420 }
7421 }
7422 }
7423
7424 return SCIP_OKAY;
7425}
7426
7427/** increases age of constraint by 1.0;
7428 * should be called
7429 * - in constraint separation, if no cut was found for this constraint,
7430 * - in constraint enforcing, if constraint was feasible, and
7431 * - in constraint propagation, if no domain reduction was deduced;
7432 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7433 * in next update
7434 */
7436 SCIP_CONS* cons, /**< constraint */
7437 BMS_BLKMEM* blkmem, /**< block memory */
7438 SCIP_SET* set, /**< global SCIP settings */
7439 SCIP_STAT* stat, /**< dynamic problem statistics */
7440 SCIP_PROB* prob, /**< problem data */
7441 SCIP_REOPT* reopt /**< reoptimization data */
7442 )
7443{
7444 SCIP_CALL( SCIPconsAddAge(cons, blkmem, set, stat, prob, 1.0, reopt) );
7445
7446 return SCIP_OKAY;
7447}
7448
7449/** resets age of constraint to zero;
7450 * should be called
7451 * - in constraint separation, if a cut was found for this constraint,
7452 * - in constraint enforcing, if the constraint was violated, and
7453 * - in constraint propagation, if a domain reduction was deduced;
7454 * if it was obsolete, makes constraint useful again or marks constraint to be made useful again in next update
7455 */
7457 SCIP_CONS* cons, /**< constraint */
7458 SCIP_SET* set /**< global SCIP settings */
7459 )
7460{
7461 assert(cons != NULL);
7462 assert(cons->conshdlr != NULL);
7463 assert(!cons->updateactivate);
7464 assert(set != NULL);
7465 assert(cons->scip == set->scip);
7466
7467 SCIPsetDebugMsg(set, "resetting age %g of constraint <%s> of handler <%s>\n", cons->age, cons->name, cons->conshdlr->name);
7468
7470 cons->age = 0.0;
7471
7472 if( cons->obsolete )
7473 {
7474 assert(!cons->original);
7476 {
7477 cons->updateobsolete = TRUE;
7479 assert(cons->update);
7480 }
7481 else
7482 {
7484 assert(!cons->obsolete);
7485 }
7486 }
7487
7488 return SCIP_OKAY;
7489}
7490
7491/** resolves the given conflicting bound, that was deduced by the given constraint, by putting all "reason" bounds
7492 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
7493 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
7494 *
7495 * @note it is sufficient to explain the relaxed bound change
7496 */
7498 SCIP_CONS* cons, /**< constraint that deduced the assignment */
7499 SCIP_SET* set, /**< global SCIP settings */
7500 SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
7501 int inferinfo, /**< user inference information attached to the bound change */
7502 SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
7503 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
7504 SCIP_Real relaxedbd, /**< the relaxed bound */
7505 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7506 )
7507{
7508 SCIP_CONSHDLR* conshdlr;
7509
7510 assert(set != NULL);
7511 assert(cons != NULL);
7512 assert((inferboundtype == SCIP_BOUNDTYPE_LOWER
7513 && SCIPgetVarLbAtIndex(set->scip, infervar, bdchgidx, TRUE) > SCIPvarGetLbGlobal(infervar))
7514 || (inferboundtype == SCIP_BOUNDTYPE_UPPER
7515 && SCIPgetVarUbAtIndex(set->scip, infervar, bdchgidx, TRUE) < SCIPvarGetUbGlobal(infervar)));
7516 assert(result != NULL);
7517 assert(cons->scip == set->scip);
7518
7520
7521 conshdlr = cons->conshdlr;
7522 assert(conshdlr != NULL);
7523
7524 if( conshdlr->consresprop != NULL )
7525 {
7526 /* start timing */
7527 SCIPclockStart(conshdlr->resproptime, set);
7528
7529 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, inferboundtype, bdchgidx,
7530 relaxedbd, result) );
7531
7532 /* stop timing */
7533 SCIPclockStop(conshdlr->resproptime, set);
7534
7535 /* update statistics */
7536 conshdlr->nrespropcalls++;
7537
7538 /* check result code */
7539 if( *result != SCIP_SUCCESS && *result != SCIP_DIDNOTFIND )
7540 {
7541 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7542 conshdlr->name, *result);
7543 return SCIP_INVALIDRESULT;
7544 }
7545 }
7546 else
7547 {
7548 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> is not implemented\n",
7549 conshdlr->name);
7550 return SCIP_PLUGINNOTFOUND;
7551 }
7552
7553 return SCIP_OKAY;
7554}
7555
7556/** adds given values to lock status of the constraint and updates the locks of the given locktype of the involved variables */
7558 SCIP_CONS* cons, /**< constraint */
7559 SCIP_SET* set, /**< global SCIP settings */
7560 SCIP_LOCKTYPE locktype, /**< type of variable locks */
7561 int nlockspos, /**< increase in number of rounding locks for constraint */
7562 int nlocksneg /**< increase in number of rounding locks for constraint's negation */
7563 )
7564{
7565 int oldnlockspos;
7566 int oldnlocksneg;
7567 int updlockpos;
7568 int updlockneg;
7569
7570 assert(cons != NULL);
7571 assert(cons->conshdlr != NULL);
7572 assert(cons->conshdlr->conslock != NULL);
7573 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
7574 assert(cons->nlockspos[locktype] >= 0);
7575 assert(cons->nlocksneg[locktype] >= 0);
7576 assert(-2 <= nlockspos && nlockspos <= 2);
7577 assert(-2 <= nlocksneg && nlocksneg <= 2);
7578 assert(set != NULL);
7579 assert(cons->scip == set->scip);
7580
7581 /* update the rounding locks */
7582 oldnlockspos = cons->nlockspos[locktype];
7583 oldnlocksneg = cons->nlocksneg[locktype];
7584 cons->nlockspos[locktype] += nlockspos;
7585 cons->nlocksneg[locktype] += nlocksneg;
7586 assert(cons->nlockspos[locktype] >= 0);
7587 assert(cons->nlocksneg[locktype] >= 0);
7588
7589 /* check, if the constraint switched from unlocked to locked, or from locked to unlocked */
7590 updlockpos = (int)(cons->nlockspos[locktype] > 0) - (int)(oldnlockspos > 0);
7591 updlockneg = (int)(cons->nlocksneg[locktype] > 0) - (int)(oldnlocksneg > 0);
7592
7593 /* lock the variables, if the constraint switched from unlocked to locked or from locked to unlocked */
7594 if( updlockpos != 0 || updlockneg != 0 )
7595 {
7596 SCIP_CALL( cons->conshdlr->conslock(set->scip, cons->conshdlr, cons, locktype, updlockpos, updlockneg) );
7597 }
7598
7599 return SCIP_OKAY;
7600}
7601
7602/** checks single constraint for feasibility of the given solution */
7604 SCIP_CONS* cons, /**< constraint to check */
7605 SCIP_SET* set, /**< global SCIP settings */
7606 SCIP_SOL* sol, /**< primal CIP solution */
7607 SCIP_Bool checkintegrality, /**< Has integrality to be checked? */
7608 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
7609 SCIP_Bool printreason, /**< Should the reason for the violation be printed? */
7610 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7611 )
7612{
7613 SCIP_CONSHDLR* conshdlr;
7614
7615 assert(cons != NULL);
7616 assert(set != NULL);
7617 assert(cons->scip == set->scip);
7618 assert(result != NULL);
7619
7620 conshdlr = cons->conshdlr;
7621 assert(conshdlr != NULL);
7622
7623 /* call external method */
7624 assert(conshdlr->conscheck != NULL);
7625
7626 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, &cons, 1, sol, checkintegrality, checklprows, printreason,
7627 FALSE, result) );
7628 SCIPsetDebugMsg(set, " -> checking returned result <%d>\n", *result);
7629
7631 {
7632 SCIPerrorMessage("feasibility check of constraint handler <%s> on constraint <%s> returned invalid result <%d>\n",
7633 conshdlr->name, cons->name, *result);
7634 return SCIP_INVALIDRESULT;
7635 }
7636
7637 return SCIP_OKAY;
7638}
7639
7640/** enforces single constraint for a given pseudo solution */
7642 SCIP_CONS* cons, /**< constraint to enforce */
7643 SCIP_SET* set, /**< global SCIP settings */
7644 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7645 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
7646 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7647 )
7648{
7649 SCIP_CONSHDLR* conshdlr;
7650
7651 assert(cons != NULL);
7652 assert(set != NULL);
7653 assert(cons->scip == set->scip);
7654 assert(result != NULL);
7655
7656 conshdlr = cons->conshdlr;
7657 assert(conshdlr != NULL);
7658
7659 /* call external method */
7660 assert(conshdlr->consenfops != NULL);
7661
7662 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, &cons, 1, 1, solinfeasible, objinfeasible, result) );
7663 SCIPsetDebugMsg(set, " -> enfops returned result <%d>\n", *result);
7664
7665 if( *result != SCIP_CUTOFF
7666 && *result != SCIP_CONSADDED
7667 && *result != SCIP_REDUCEDDOM
7668 && *result != SCIP_BRANCHED
7669 && *result != SCIP_SOLVELP
7670 && *result != SCIP_INFEASIBLE
7671 && *result != SCIP_FEASIBLE
7672 && *result != SCIP_DIDNOTRUN )
7673 {
7674 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
7675 conshdlr->name, *result);
7676 return SCIP_INVALIDRESULT;
7677 }
7678
7679 /* do not update statistics */
7680
7681 return SCIP_OKAY;
7682}
7683
7684/** enforces single constraint for a given LP solution */
7686 SCIP_CONS* cons, /**< constraint to enforce */
7687 SCIP_SET* set, /**< global SCIP settings */
7688 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7689 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7690 )
7691{
7692 SCIP_CONSHDLR* conshdlr;
7693
7694 assert(cons != NULL);
7695 assert(set != NULL);
7696 assert(cons->scip == set->scip);
7697 assert(result != NULL);
7698
7699 conshdlr = cons->conshdlr;
7700 assert(conshdlr != NULL);
7701
7702 /* call external method */
7703 assert(conshdlr->consenfolp != NULL);
7704
7705 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, &cons, 1, 1, solinfeasible, result) );
7706 SCIPsetDebugMsg(set, " -> enfolp returned result <%d>\n", *result);
7707
7708 if( *result != SCIP_CUTOFF
7709 && *result != SCIP_CONSADDED
7710 && *result != SCIP_REDUCEDDOM
7711 && *result != SCIP_BRANCHED
7712 && *result != SCIP_SEPARATED
7713 && *result != SCIP_INFEASIBLE
7714 && *result != SCIP_FEASIBLE)
7715 {
7716 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP returned invalid result <%d>\n",
7717 conshdlr->name, *result);
7718 return SCIP_INVALIDRESULT;
7719 }
7720
7721 /* do not update statistics */
7722
7723 return SCIP_OKAY;
7724}
7725
7726/** enforces single constraint for a given relaxation solution */
7728 SCIP_CONS* cons, /**< constraint to enforce */
7729 SCIP_SET* set, /**< global SCIP settings */
7730 SCIP_SOL* sol, /**< solution to be enforced */
7731 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7732 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7733 )
7734{
7735 SCIP_CONSHDLR* conshdlr;
7736
7737 assert(cons != NULL);
7738 assert(set != NULL);
7739 assert(cons->scip == set->scip);
7740 assert(sol != NULL);
7741 assert(result != NULL);
7742
7743 conshdlr = cons->conshdlr;
7744 assert(conshdlr != NULL);
7745
7746 /* call external method */
7747 assert(conshdlr->consenfolp != NULL);
7748
7749 SCIP_CALL( conshdlr->consenforelax(set->scip, sol, conshdlr, &cons, 1, 1, solinfeasible, result) );
7750 SCIPdebugMessage(" -> enforelax returned result <%d>\n", *result);
7751
7752 if( *result != SCIP_CUTOFF
7753 && *result != SCIP_CONSADDED
7754 && *result != SCIP_REDUCEDDOM
7755 && *result != SCIP_BRANCHED
7756 && *result != SCIP_SEPARATED
7757 && *result != SCIP_INFEASIBLE
7758 && *result != SCIP_FEASIBLE)
7759 {
7760 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation returned invalid result <%d>\n",
7761 conshdlr->name, *result);
7762 return SCIP_INVALIDRESULT;
7763 }
7764
7765 /* do not update statistics */
7766
7767 return SCIP_OKAY;
7768}
7769
7770/** calls LP initialization method for single constraint */
7772 SCIP_CONS* cons, /**< constraint to initialize */
7773 SCIP_SET* set, /**< global SCIP settings */
7774 SCIP_Bool* infeasible /**< pointer to store whether infeasibility was detected while building the LP */
7775 )
7776{
7777 SCIP_CONSHDLR* conshdlr;
7778
7779 assert(cons != NULL);
7780 assert(set != NULL);
7781 assert(infeasible != NULL);
7782 assert(cons->scip == set->scip);
7783
7784 conshdlr = cons->conshdlr;
7785 assert(conshdlr != NULL);
7786
7787 /* call external method */
7788 if( conshdlr->consinitlp != NULL )
7789 {
7790 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &cons, 1, infeasible) );
7791 }
7792
7793 return SCIP_OKAY;
7794}
7795
7796/** calls separation method of single constraint for LP solution */
7798 SCIP_CONS* cons, /**< constraint to separate */
7799 SCIP_SET* set, /**< global SCIP settings */
7800 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7801 )
7802{
7803 SCIP_CONSHDLR* conshdlr;
7804
7805 assert(cons != NULL);
7806 assert(set != NULL);
7807 assert(cons->scip == set->scip);
7808 assert(result != NULL);
7809
7810 conshdlr = cons->conshdlr;
7811 assert(conshdlr != NULL);
7812
7813 /* call external method */
7814 if( conshdlr->conssepalp != NULL )
7815 {
7816 SCIP_CALL( conshdlr->conssepalp(set->scip, conshdlr, &cons, 1, 1, result) );
7817 SCIPsetDebugMsg(set, " -> sepalp returned result <%d>\n", *result);
7818
7819 if( *result != SCIP_CUTOFF
7820 && *result != SCIP_CONSADDED
7821 && *result != SCIP_REDUCEDDOM
7822 && *result != SCIP_SEPARATED
7823 && *result != SCIP_NEWROUND
7824 && *result != SCIP_DIDNOTFIND
7825 && *result != SCIP_DIDNOTRUN
7826 && *result != SCIP_DELAYED )
7827 {
7828 SCIPerrorMessage("separation method of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name,
7829 *result);
7830 return SCIP_INVALIDRESULT;
7831 }
7832 }
7833
7834 return SCIP_OKAY;
7835}
7836
7837/** calls separation method of single constraint for given primal solution */
7839 SCIP_CONS* cons, /**< constraint to separate */
7840 SCIP_SET* set, /**< global SCIP settings */
7841 SCIP_SOL* sol, /**< primal solution that should be separated */
7842 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7843 )
7844{
7845 SCIP_CONSHDLR* conshdlr;
7846
7847 assert(cons != NULL);
7848 assert(set != NULL);
7849 assert(cons->scip == set->scip);
7850 assert(sol != NULL);
7851 assert(result != NULL);
7852
7853 conshdlr = cons->conshdlr;
7854 assert(conshdlr != NULL);
7855
7856 /* call external method */
7857 if( conshdlr->conssepasol != NULL )
7858 {
7859 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, &cons, 1, 1, sol, result) );
7860 SCIPsetDebugMsg(set, " -> sepasol returned result <%d>\n", *result);
7861
7862 if( *result != SCIP_CUTOFF
7863 && *result != SCIP_CONSADDED
7864 && *result != SCIP_REDUCEDDOM
7865 && *result != SCIP_SEPARATED
7866 && *result != SCIP_NEWROUND
7867 && *result != SCIP_DIDNOTFIND
7868 && *result != SCIP_DIDNOTRUN
7869 && *result != SCIP_DELAYED )
7870 {
7871 SCIPerrorMessage("separation method of constraint handler for arbitrary primal solution <%s> returned invalid result <%d>\n",
7872 conshdlr->name, *result);
7873 return SCIP_INVALIDRESULT;
7874 }
7875 }
7876
7877 return SCIP_OKAY;
7878}
7879
7880/** calls domain propagation method of single constraint */
7882 SCIP_CONS* cons, /**< constraint to propagate */
7883 SCIP_SET* set, /**< global SCIP settings */
7884 SCIP_PROPTIMING proptiming, /**< current point in the node solving loop */
7885 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7886 )
7887{
7888 SCIP_CONSHDLR* conshdlr;
7889
7890 assert(cons != NULL);
7891 assert(set != NULL);
7892 assert(cons->scip == set->scip);
7893 assert(result != NULL);
7894
7895 conshdlr = cons->conshdlr;
7896 assert(conshdlr != NULL);
7897
7899
7900 /* call external method */
7901 if( conshdlr->consprop != NULL )
7902 {
7903 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, &cons, 1, 1, 1, proptiming, result) );
7904 SCIPsetDebugMsg(set, " -> prop returned result <%d>\n", *result);
7905
7906 if( *result != SCIP_CUTOFF
7907 && *result != SCIP_CONSADDED
7908 && *result != SCIP_REDUCEDDOM
7909 && *result != SCIP_DIDNOTFIND
7910 && *result != SCIP_DIDNOTRUN
7911 && *result != SCIP_DELAYED )
7912 {
7913 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
7914 conshdlr->name, *result);
7915 return SCIP_INVALIDRESULT;
7916 }
7917 }
7918
7919 return SCIP_OKAY;
7920}
7921
7922/** resolves propagation conflict of single constraint */
7924 SCIP_CONS* cons, /**< constraint to resolve conflict for */
7925 SCIP_SET* set, /**< global SCIP settings */
7926 SCIP_VAR* infervar, /**< the conflict variable whose bound change has to be resolved */
7927 int inferinfo, /**< the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call */
7928 SCIP_BOUNDTYPE boundtype, /**< the type of the changed bound (lower or upper bound) */
7929 SCIP_BDCHGIDX* bdchgidx, /**< the index of the bound change, representing the point of time where the change took place */
7930 SCIP_Real relaxedbd, /**< the relaxed bound which is sufficient to be explained */
7931 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7932 )
7933{
7934 SCIP_CONSHDLR* conshdlr;
7935
7936 assert(cons != NULL);
7937 assert(set != NULL);
7938 assert(cons->scip == set->scip);
7939 assert(result != NULL);
7940 assert(infervar != NULL);
7941 assert(bdchgidx != NULL);
7942
7943 conshdlr = cons->conshdlr;
7944 assert(conshdlr != NULL);
7945
7946 /* call external method */
7947 if( conshdlr->consresprop != NULL )
7948 {
7949 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, boundtype, bdchgidx, relaxedbd, result) );
7950 SCIPsetDebugMsg(set, " -> resprop returned result <%d>\n", *result);
7951
7952 if( *result != SCIP_SUCCESS
7953 && *result != SCIP_DIDNOTFIND )
7954 {
7955 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7956 conshdlr->name, *result);
7957 return SCIP_INVALIDRESULT;
7958 }
7959 }
7960
7961 return SCIP_OKAY;
7962}
7963
7964/** presolves single constraint */
7966 SCIP_CONS* cons, /**< constraint to presolve */
7967 SCIP_SET* set, /**< global SCIP settings */
7968 int nrounds, /**< number of presolving rounds already done */
7969 SCIP_PRESOLTIMING timing, /**< current presolving timing */
7970 int nnewfixedvars, /**< number of variables fixed since the last call to the presolving method */
7971 int nnewaggrvars, /**< number of variables aggregated since the last call to the presolving method */
7972 int nnewchgvartypes, /**< number of variable type changes since the last call to the presolving method */
7973 int nnewchgbds, /**< number of variable bounds tightened since the last call to the presolving method */
7974 int nnewholes, /**< number of domain holes added since the last call to the presolving method */
7975 int nnewdelconss, /**< number of deleted constraints since the last call to the presolving method */
7976 int nnewaddconss, /**< number of added constraints since the last call to the presolving method */
7977 int nnewupgdconss, /**< number of upgraded constraints since the last call to the presolving method */
7978 int nnewchgcoefs, /**< number of changed coefficients since the last call to the presolving method */
7979 int nnewchgsides, /**< number of changed left or right hand sides since the last call to the presolving method */
7980 int* nfixedvars, /**< pointer to count total number of variables fixed of all presolvers */
7981 int* naggrvars, /**< pointer to count total number of variables aggregated of all presolvers */
7982 int* nchgvartypes, /**< pointer to count total number of variable type changes of all presolvers */
7983 int* nchgbds, /**< pointer to count total number of variable bounds tightened of all presolvers */
7984 int* naddholes, /**< pointer to count total number of domain holes added of all presolvers */
7985 int* ndelconss, /**< pointer to count total number of deleted constraints of all presolvers */
7986 int* naddconss, /**< pointer to count total number of added constraints of all presolvers */
7987 int* nupgdconss, /**< pointer to count total number of upgraded constraints of all presolvers */
7988 int* nchgcoefs, /**< pointer to count total number of changed coefficients of all presolvers */
7989 int* nchgsides, /**< pointer to count total number of changed left/right hand sides of all presolvers */
7990 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7991 )
7992{
7993 SCIP_CONSHDLR* conshdlr;
7994
7995 assert(cons != NULL);
7996 assert(set != NULL);
7997 assert(cons->scip == set->scip);
7998 assert(nfixedvars != NULL);
7999 assert(naggrvars != NULL);
8000 assert(nchgvartypes != NULL);
8001 assert(nchgbds != NULL);
8002 assert(naddholes != NULL);
8003 assert(ndelconss != NULL);
8004 assert(naddconss != NULL);
8005 assert(nupgdconss != NULL);
8006 assert(nchgcoefs != NULL);
8007 assert(nchgsides != NULL);
8008 assert(result != NULL);
8009
8010 conshdlr = cons->conshdlr;
8011 assert(conshdlr != NULL);
8012
8013 /* call external method */
8014 if( conshdlr->conspresol != NULL )
8015 {
8016 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, &cons, 1, nrounds, timing,
8017 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewholes, nnewdelconss, nnewaddconss,
8018 nnewupgdconss, nnewchgcoefs, nnewchgsides, nfixedvars, naggrvars, nchgvartypes,
8019 nchgbds, naddholes, ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
8020 SCIPsetDebugMsg(set, " -> presol returned result <%d>\n", *result);
8021
8022 if( *result != SCIP_UNBOUNDED
8023 && *result != SCIP_CUTOFF
8024 && *result != SCIP_SUCCESS
8025 && *result != SCIP_DIDNOTFIND
8026 && *result != SCIP_DIDNOTRUN
8027 && *result != SCIP_DELAYED )
8028 {
8029 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
8030 conshdlr->name, *result);
8031 return SCIP_INVALIDRESULT;
8032 }
8033 }
8034
8035 return SCIP_OKAY;
8036}
8037
8038/** calls constraint activation notification method of single constraint */
8040 SCIP_CONS* cons, /**< constraint to notify */
8041 SCIP_SET* set /**< global SCIP settings */
8042 )
8043{
8044 SCIP_CONSHDLR* conshdlr;
8045
8046 assert(cons != NULL);
8047 assert(set != NULL);
8048 assert(cons->scip == set->scip);
8049
8050 conshdlr = cons->conshdlr;
8051 assert(conshdlr != NULL);
8052
8053 /* call external method */
8054 if( conshdlr->consactive != NULL )
8055 {
8056 SCIP_CALL( conshdlr->consactive(set->scip, conshdlr, cons) );
8057 }
8058
8059 return SCIP_OKAY;
8060}
8061
8062/** calls constraint deactivation notification method of single constraint */
8064 SCIP_CONS* cons, /**< constraint to notify */
8065 SCIP_SET* set /**< global SCIP settings */
8066 )
8067{
8068 SCIP_CONSHDLR* conshdlr;
8069
8070 assert(cons != NULL);
8071 assert(set != NULL);
8072 assert(cons->scip == set->scip);
8073
8074 conshdlr = cons->conshdlr;
8075 assert(conshdlr != NULL);
8076
8077 /* call external method */
8078 if( conshdlr->consdeactive != NULL )
8079 {
8080 SCIP_CALL( conshdlr->consdeactive(set->scip, conshdlr, cons) );
8081 }
8082
8083 return SCIP_OKAY;
8084}
8085
8086
8087
8088/*
8089 * Hash functions
8090 */
8091
8092/** gets the key (i.e. the name) of the given constraint */
8093SCIP_DECL_HASHGETKEY(SCIPhashGetKeyCons)
8094{ /*lint --e{715}*/
8095 SCIP_CONS* cons = (SCIP_CONS*)elem;
8096
8097 assert(cons != NULL);
8098 return cons->name;
8099}
8100
8101
8102/*
8103 * method for arrays of contraint handlers
8104 */
8105
8106/** ensures size of storage for propagable constraints with a minimum size of num */
8107static
8109 SCIP_SET* set, /**< global SCIP settings */
8110 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
8111 int num /**< minimum number of entries to store */
8112 )
8113{
8114 assert(set != NULL);
8115 assert(conshdlr != NULL);
8116
8117 if( num > conshdlr->storedpropconsssize )
8118 {
8119 int newsize;
8120
8121 newsize = SCIPsetCalcMemGrowSize(set, num);
8122 SCIP_ALLOC( BMSreallocMemoryArray(&(conshdlr->storedpropconss), newsize) );
8123
8124 conshdlr->storedpropconsssize = newsize;
8125 }
8126 assert(num <= conshdlr->storedpropconsssize);
8127
8128 return SCIP_OKAY;
8129}
8130
8131/** stores all constraints marked for propagation away when probing is started */
8133 SCIP_SET* set, /**< global SCIP settings */
8134 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
8135 int nconshdlrs /**< number of contraint handlers */
8136 )
8137{
8138 SCIP_CONSHDLR* conshdlr;
8139 int c;
8140
8141 assert(set != NULL);
8142 assert(conshdlrs != NULL || nconshdlrs == 0);
8143
8144 for( c = nconshdlrs - 1; c >= 0; --c )
8145 {
8146 conshdlr = conshdlrs[c]; /*lint !e613*/
8147 assert(conshdlr != NULL);
8148 assert(conshdlr->storednmarkedpropconss == 0);
8149
8150 if( conshdlr->nmarkedpropconss > 0 )
8151 {
8152 int v;
8153
8154 SCIP_CALL( ensurePropagationStorage(set, conshdlr, conshdlr->nmarkedpropconss) );
8155 BMScopyMemoryArray(conshdlr->storedpropconss, conshdlr->propconss, conshdlr->nmarkedpropconss);
8156
8157 conshdlr->storednmarkedpropconss = conshdlr->nmarkedpropconss;
8158 conshdlr->storedpropdomchgcount = conshdlr->lastpropdomchgcount;
8159
8160 for( v = conshdlr->storednmarkedpropconss - 1; v >= 0; --v )
8161 {
8162 SCIPconsCapture(conshdlr->storedpropconss[v]);
8163 }
8164 /* assert(conshdlr->nmarkedpropconss == 0); this assert does not hold if updates are delayed */
8165 }
8166 }
8167
8168 return SCIP_OKAY;
8169}
8170
8171/** reset all constraints marked for propagation when probing was finished */
8173 SCIP_SET* set, /**< global SCIP settings */
8174 BMS_BLKMEM* blkmem, /**< block memory */
8175 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
8176 int nconshdlrs /**< number of contraint handlers */
8177 )
8178{
8179 SCIP_CONSHDLR* conshdlr;
8180 int c;
8181
8182 assert(set != NULL);
8183 assert(blkmem != NULL);
8184 assert(conshdlrs != NULL || nconshdlrs == 0);
8185
8186 for( c = nconshdlrs - 1; c >= 0; --c )
8187 {
8188 conshdlr = conshdlrs[c]; /*lint !e613*/
8189 assert(conshdlr != NULL);
8190
8191 if( conshdlr->storednmarkedpropconss > 0 )
8192 {
8193#ifndef NDEBUG
8194 int ndisabled = 0;
8195#endif
8196 int v;
8197
8198 for( v = conshdlr->nmarkedpropconss - 1; v >= 0; --v )
8199 {
8201 }
8202
8203 /* mark all previously marked constraint, which were marked before probing */
8204 for( v = 0; v < conshdlr->storednmarkedpropconss; ++v )
8205 {
8206 SCIP_CONS* cons = conshdlr->storedpropconss[v];
8207 assert(cons != NULL);
8208
8209 if( cons->enabled && cons->propagate && cons->propenabled )
8210 {
8212 }
8213#ifndef NDEBUG
8214 else
8215 ++ndisabled;
8216#endif
8217 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
8218 } /*lint !e438*/
8219
8220 assert(conshdlr->storednmarkedpropconss - ndisabled <= conshdlr->npropconss);
8221 assert(conshdlr->nmarkedpropconss + ndisabled >= conshdlr->storednmarkedpropconss || (conshdlrAreUpdatesDelayed(conshdlr) && conshdlr->nupdateconss + ndisabled >= conshdlr->storednmarkedpropconss));
8222
8223 conshdlr->lastpropdomchgcount = conshdlr->storedpropdomchgcount;
8224 conshdlr->storednmarkedpropconss = 0;
8225 }
8226 }
8227
8228 return SCIP_OKAY;
8229}
8230
8231/** create linear constraint statistics */
8233 SCIP* scip, /**< scip data structure */
8234 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8235 )
8236{
8237 assert(linconsstats != NULL);
8238
8239 SCIP_CALL( SCIPallocBlockMemory(scip, linconsstats) );
8240
8241 return SCIP_OKAY;
8242}
8243
8244/** free linear constraint statistics */
8246 SCIP* scip, /**< scip data structure */
8247 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8248 )
8249{
8250 assert(linconsstats != NULL);
8251 assert(*linconsstats != NULL);
8252
8253 SCIPfreeBlockMemory(scip, linconsstats);
8254}
8255
8256/** resets linear constraint statistics */
8258 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8259 )
8260{
8262 linconsstats->sum = 0;
8263}
8264
8265/** returns the number of occurrences of a specific type of linear constraint */
8267 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8268 SCIP_LINCONSTYPE linconstype /**< linear constraint type */
8269 )
8270{
8271 assert(linconsstats != NULL);
8272 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8273
8274 return linconsstats->counter[(int)linconstype];
8275}
8276
8277/** returns the total number of classified constraints */
8279 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8280 )
8281{
8282 assert(linconsstats != NULL);
8283
8284 return linconsstats->sum;
8285}
8286
8287/** increases the number of occurrences of a specific type of linear constraint */
8289 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8290 SCIP_LINCONSTYPE linconstype, /**< linear constraint type */
8291 int increment /**< positive increment */
8292 )
8293{
8294 assert(linconsstats != NULL);
8295 assert(increment >= 1);
8296 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8297
8298 linconsstats->counter[(int)linconstype] += increment;
8299 linconsstats->sum += increment;
8300}
8301
8302/** print linear constraint classification statistics */
8304 SCIP* scip, /**< scip data structure */
8305 FILE* file, /**< file handle or NULL to print to standard out */
8306 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8307 )
8308{
8309 assert(scip != NULL);
8310 assert(linconsstats != NULL);
8311
8312 /* print statistics */
8313 SCIPinfoMessage(scip, file, "\n");
8314 SCIPinfoMessage(scip, file, "%-19s : %10s\n", "Linear cons types", "count");
8315 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "total", SCIPlinConsStatsGetSum(linconsstats));
8316 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "empty", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EMPTY));
8317 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "free", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_FREE));
8318 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "singleton", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SINGLETON));
8319 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "aggregation", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_AGGREGATION));
8320 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "precedence", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_PRECEDENCE));
8321 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "varbound", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_VARBOUND));
8322 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpartition", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPARTITION));
8323 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPACKING));
8324 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setcovering", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETCOVERING));
8325 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "cardinality", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_CARDINALITY));
8326 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "invknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INVKNAPSACK));
8327 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "eqknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EQKNAPSACK));
8328 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "binpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_BINPACKING));
8329 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "knapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_KNAPSACK));
8330 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "intknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INTKNAPSACK));
8331 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "mixedbinary", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_MIXEDBINARY));
8332 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "general", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_GENERAL));
8333 SCIPinfoMessage(scip, file, "\n");
8334}
8335
8336/*
8337 * simple functions implemented as defines
8338 */
8339
8340/* In debug mode, the following methods are implemented as function calls to ensure
8341 * type validity.
8342 * In optimized mode, the methods are implemented as defines to improve performance.
8343 * However, we want to have them in the library anyways, so we have to undef the defines.
8344 */
8345
8346#undef SCIPconsGetName
8347#undef SCIPconsGetPos
8348#undef SCIPconsGetHdlr
8349#undef SCIPconsGetData
8350#undef SCIPconsGetNUses
8351#undef SCIPconsGetActiveDepth
8352#undef SCIPconsGetValidDepth
8353#undef SCIPconsIsActive
8354#undef SCIPconsIsEnabled
8355#undef SCIPconsIsSeparationEnabled
8356#undef SCIPconsIsPropagationEnabled
8357#undef SCIPconsIsDeleted
8358#undef SCIPconsIsObsolete
8359#undef SCIPconsIsConflict
8360#undef SCIPconsGetAge
8361#undef SCIPconsIsInitial
8362#undef SCIPconsIsSeparated
8363#undef SCIPconsIsEnforced
8364#undef SCIPconsIsChecked
8365#undef SCIPconsIsMarkedPropagate
8366#undef SCIPconsIsPropagated
8367#undef SCIPconsIsGlobal
8368#undef SCIPconsIsLocal
8369#undef SCIPconsIsModifiable
8370#undef SCIPconsIsDynamic
8371#undef SCIPconsIsRemovable
8372#undef SCIPconsIsStickingAtNode
8373#undef SCIPconsIsInProb
8374#undef SCIPconsIsOriginal
8375#undef SCIPconsIsTransformed
8376#undef SCIPconsIsLockedPos
8377#undef SCIPconsIsLockedNeg
8378#undef SCIPconsIsLocked
8379#undef SCIPconsGetNLocksPos
8380#undef SCIPconsGetNLocksNeg
8381#undef SCIPconsIsLockedTypePos
8382#undef SCIPconsIsLockedTypeNeg
8383#undef SCIPconsIsLockedType
8384#undef SCIPconsGetNLocksTypePos
8385#undef SCIPconsGetNLocksTypeNeg
8386#undef SCIPconsIsAdded
8387#undef SCIPconsGetNUpgradeLocks
8388
8389/** returns the name of the constraint
8390 *
8391 * @note to change the name of a constraint, use SCIPchgConsName() from scip.h
8392 */
8394 SCIP_CONS* cons /**< constraint */
8395 )
8396{
8397 assert(cons != NULL);
8398
8399 return cons->name;
8400}
8401
8402/** returns the position of constraint in the corresponding handler's conss array */
8404 SCIP_CONS* cons /**< constraint */
8405 )
8406{
8407 assert(cons != NULL);
8408
8409 return cons->consspos;
8410}
8411
8412/** returns the constraint handler of the constraint */
8414 SCIP_CONS* cons /**< constraint */
8415 )
8416{
8417 assert(cons != NULL);
8418
8419 return cons->conshdlr;
8420}
8421
8422/** returns the constraint data field of the constraint */
8424 SCIP_CONS* cons /**< constraint */
8425 )
8426{
8427 assert(cons != NULL);
8428
8429 return cons->consdata;
8430}
8431
8432/** gets number of times, the constraint is currently captured */
8434 SCIP_CONS* cons /**< constraint */
8435 )
8436{
8437 assert(cons != NULL);
8438
8439 return cons->nuses;
8440}
8441
8442/** for an active constraint, returns the depth in the tree at which the constraint was activated */
8444 SCIP_CONS* cons /**< constraint */
8445 )
8446{
8447 assert(cons != NULL);
8448 assert(SCIPconsIsActive(cons));
8449
8450 return cons->activedepth;
8451}
8452
8453/** returns TRUE iff constraint is active in the current node */
8455 SCIP_CONS* cons /**< constraint */
8456 )
8457{
8458 assert(cons != NULL);
8459
8460 return cons->updateactivate || (cons->active && !cons->updatedeactivate);
8461}
8462
8463/** returns TRUE iff constraint is active in the current node */
8465 SCIP_CONS* cons /**< constraint */
8466 )
8467{
8468 assert(cons != NULL);
8469
8470 return cons->updatedeactivate;
8471}
8472
8473/** returns the depth in the tree at which the constraint is valid; returns INT_MAX, if the constraint is local
8474 * and currently not active
8475 */
8477 SCIP_CONS* cons /**< constraint */
8478 )
8479{
8480 assert(cons != NULL);
8481 assert(cons->validdepth == 0 || cons->local);
8482
8483 return (!cons->local ? 0
8484 : !SCIPconsIsActive(cons) ? INT_MAX
8485 : cons->validdepth == -1 ? SCIPconsGetActiveDepth(cons)
8486 : cons->validdepth);
8487}
8488
8489/** returns TRUE iff constraint is enabled in the current node */
8491 SCIP_CONS* cons /**< constraint */
8492 )
8493{
8494 assert(cons != NULL);
8495
8496 return cons->updateenable || (cons->enabled && !cons->updatedisable);
8497}
8498
8499/** returns TRUE iff constraint's separation is enabled in the current node */
8501 SCIP_CONS* cons /**< constraint */
8502 )
8503{
8504 assert(cons != NULL);
8505
8506 return SCIPconsIsEnabled(cons)
8507 && (cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable));
8508}
8509
8510/** returns TRUE iff constraint's propagation is enabled in the current node */
8512 SCIP_CONS* cons /**< constraint */
8513 )
8514{
8515 assert(cons != NULL);
8516
8517 return SCIPconsIsEnabled(cons)
8518 && (cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable));
8519}
8520
8521/** returns TRUE iff constraint is deleted or marked to be deleted */
8523 SCIP_CONS* cons /**< constraint */
8524 )
8525{
8526 assert(cons != NULL);
8527
8528 return cons->deleted;
8529}
8530
8531/** returns TRUE iff constraint is marked obsolete */
8533 SCIP_CONS* cons /**< constraint */
8534 )
8535{
8536 assert(cons != NULL);
8537
8538 return cons->updateobsolete || cons->obsolete;
8539}
8540
8541/** returns TRUE iff constraint is marked as a conflict */
8543 SCIP_CONS* cons /**< constraint */
8544 )
8545{
8546 assert(cons != NULL);
8547
8548 return cons->conflict;
8549}
8550
8551/** gets age of constraint */
8553 SCIP_CONS* cons /**< constraint */
8554 )
8555{
8556 assert(cons != NULL);
8557
8558 return cons->age;
8559}
8560
8561/** returns TRUE iff the LP relaxation of constraint should be in the initial LP */
8563 SCIP_CONS* cons /**< constraint */
8564 )
8565{
8566 assert(cons != NULL);
8567
8568 return cons->initial;
8569}
8570
8571/** returns TRUE iff constraint should be separated during LP processing */
8573 SCIP_CONS* cons /**< constraint */
8574 )
8575{
8576 assert(cons != NULL);
8577
8578 return cons->separate;
8579}
8580
8581/** returns TRUE iff constraint should be enforced during node processing */
8583 SCIP_CONS* cons /**< constraint */
8584 )
8585{
8586 assert(cons != NULL);
8587
8588 return cons->enforce;
8589}
8590
8591/** returns TRUE iff constraint should be checked for feasibility */
8593 SCIP_CONS* cons /**< constraint */
8594 )
8595{
8596 assert(cons != NULL);
8597
8598 return cons->check;
8599}
8600
8601/** returns whether the constraint is marked for propagation */
8603 SCIP_CONS* cons /**< constraint */
8604 )
8605{
8606 assert(cons != NULL);
8607
8608 return (cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate));
8609}
8610
8611/** returns TRUE iff constraint should be propagated during node processing */
8613 SCIP_CONS* cons /**< constraint */
8614 )
8615{
8616 assert(cons != NULL);
8617
8618 return cons->propagate;
8619}
8620
8621/** returns TRUE iff constraint is globally valid */
8623 SCIP_CONS* cons /**< constraint */
8624 )
8625{
8626 assert(cons != NULL);
8627
8628 return !cons->local;
8629}
8630
8631/** returns TRUE iff constraint is only locally valid or not added to any (sub)problem */
8633 SCIP_CONS* cons /**< constraint */
8634 )
8635{
8636 assert(cons != NULL);
8637
8638 return cons->local;
8639}
8640
8641/** returns TRUE iff constraint is modifiable (subject to column generation) */
8643 SCIP_CONS* cons /**< constraint */
8644 )
8645{
8646 assert(cons != NULL);
8647
8648 return cons->modifiable;
8649}
8650
8651/** returns TRUE iff constraint is subject to aging */
8653 SCIP_CONS* cons /**< constraint */
8654 )
8655{
8656 assert(cons != NULL);
8657
8658 return cons->dynamic;
8659}
8660
8661/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8663 SCIP_CONS* cons /**< constraint */
8664 )
8665{
8666 assert(cons != NULL);
8667
8668 return cons->removable;
8669}
8670
8671/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8673 SCIP_CONS* cons /**< constraint */
8674 )
8675{
8676 assert(cons != NULL);
8677
8678 return cons->stickingatnode;
8679}
8680
8681/** returns TRUE iff constraint belongs to the global problem */
8683 SCIP_CONS* cons /**< constraint */
8684 )
8685{
8686 assert(cons != NULL);
8687
8688 return (cons->addconssetchg == NULL && cons->addarraypos >= 0);
8689}
8690
8691/** returns TRUE iff constraint is belonging to original space */
8693 SCIP_CONS* cons /**< constraint */
8694 )
8695{
8696 assert(cons != NULL);
8697
8698 return cons->original;
8699}
8700
8701/** returns TRUE iff constraint is belonging to transformed space */
8703 SCIP_CONS* cons /**< constraint */
8704 )
8705{
8706 assert(cons != NULL);
8707
8708 return !cons->original;
8709}
8710
8711/** returns TRUE iff roundings for variables in constraint are locked */
8713 SCIP_CONS* cons /**< constraint */
8714 )
8715{
8716 assert(cons != NULL);
8717
8718 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0);
8719}
8720
8721/** returns TRUE iff roundings for variables in constraint's negation are locked */
8723 SCIP_CONS* cons /**< constraint */
8724 )
8725{
8726 assert(cons != NULL);
8727
8728 return (cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8729}
8730
8731/** returns TRUE iff roundings for variables in constraint or in constraint's negation are locked */
8733 SCIP_CONS* cons /**< constraint */
8734 )
8735{
8736 assert(cons != NULL);
8737
8738 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0 || cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8739}
8740
8741/** get number of times the roundings for variables in constraint are locked */
8743 SCIP_CONS* cons /**< constraint */
8744 )
8745{
8746 assert(cons != NULL);
8747
8748 return cons->nlockspos[SCIP_LOCKTYPE_MODEL];
8749}
8750
8751/** get number of times the roundings for variables in constraint's negation are locked */
8753 SCIP_CONS* cons /**< constraint */
8754 )
8755{
8756 assert(cons != NULL);
8757
8758 return cons->nlocksneg[SCIP_LOCKTYPE_MODEL];
8759}
8760
8761/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8763 SCIP_CONS* cons, /**< constraint */
8764 SCIP_LOCKTYPE locktype /**< variable lock type */
8765 )
8766{
8767 assert(cons != NULL);
8768 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8769
8770 return (cons->nlockspos[locktype] > 0);
8771}
8772
8773/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8775 SCIP_CONS* cons, /**< constraint */
8776 SCIP_LOCKTYPE locktype /**< variable lock type */
8777 )
8778{
8779 assert(cons != NULL);
8780 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8781
8782 return (cons->nlocksneg[locktype] > 0);
8783}
8784
8785/** returns TRUE iff roundings of given locktype for variables in constraint or in constraint's negation are locked */
8787 SCIP_CONS* cons, /**< constraint */
8788 SCIP_LOCKTYPE locktype /**< variable lock type */
8789 )
8790{
8791 assert(cons != NULL);
8792 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8793
8794 return (cons->nlockspos[locktype] > 0 || cons->nlocksneg[locktype] > 0);
8795}
8796
8797/** get number of times the roundings of given locktype for variables in constraint are locked */
8799 SCIP_CONS* cons, /**< constraint */
8800 SCIP_LOCKTYPE locktype /**< variable lock type */
8801 )
8802{
8803 assert(cons != NULL);
8804 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8805
8806 return cons->nlockspos[locktype];
8807}
8808
8809/** get number of times the roundings of given locktype for variables in constraint's negation are locked */
8811 SCIP_CONS* cons, /**< constraint */
8812 SCIP_LOCKTYPE locktype /**< variable lock type */
8813 )
8814{
8815 assert(cons != NULL);
8816 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8817
8818 return cons->nlocksneg[locktype];
8819}
8820
8821/** returns if the constraint was already added to a SCIP instance */
8823 SCIP_CONS* cons /**< constraint */
8824 )
8825{
8826 assert(cons != NULL);
8827
8828 return (cons->addarraypos >= 0);
8829}
8830
8831/** adds locks to (dis-)allow upgrading of constraint */
8833 SCIP_CONS* cons, /**< constraint to add locks */
8834 int nlocks /**< number of locks to add */
8835 )
8836{
8837 assert(cons != NULL);
8838
8839 assert(cons->nupgradelocks >= -nlocks);
8840 cons->nupgradelocks += nlocks;
8841 assert(cons->nupgradelocks >= nlocks);
8842}
8843
8844/** gets number of locks against upgrading the constraint, 0 means this constraint can be upgraded */
8846 SCIP_CONS* cons /**< constraint */
8847 )
8848{
8849 assert(cons != NULL);
8850
8851 return (int) cons->nupgradelocks;
8852}
static GRAPHNODE ** active
int SCIPbranchcandGetNPseudoCands(SCIP_BRANCHCAND *branchcand)
Definition branch.c:875
internal methods for branching rules and branching candidate storage
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
SCIP_RETCODE SCIPconshdlrsStorePropagationStatus(SCIP_SET *set, SCIP_CONSHDLR **conshdlrs, int nconshdlrs)
Definition cons.c:8132
void SCIPconshdlrSetExitpre(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4516
static SCIP_RETCODE conshdlrAddInitcons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition cons.c:816
SCIP_RETCODE SCIPconsAddLocks(SCIP_CONS *cons, SCIP_SET *set, SCIP_LOCKTYPE locktype, int nlockspos, int nlocksneg)
Definition cons.c:7557
SCIP_RETCODE SCIPconshdlrSeparateLP(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_SEPASTORE *sepastore, int depth, SCIP_Bool execdelayed, SCIP_RESULT *result)
Definition cons.c:2913
SCIP_RETCODE SCIPconsParse(SCIP_CONS **cons, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, const char *str, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool *success)
Definition cons.c:6232
void SCIPconshdlrSetGetPermsymGraph(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4710
SCIP_RETCODE SCIPconssetchgUndo(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:5851
SCIP_RETCODE SCIPconsEnableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7179
static SCIP_RETCODE conssetchgEnsureAddedconssSize(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition cons.c:5551
SCIP_RETCODE SCIPconshdlrSetPresol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRESOL((*conspresol)), int maxprerounds, SCIP_PRESOLTIMING presoltiming)
Definition cons.c:4527
void SCIPconshdlrIncNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5076
SCIP_RETCODE SCIPconshdlrInit(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:2412
static SCIP_RETCODE conssetchgDelAddedCons(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int arraypos)
Definition cons.c:5675
static SCIP_RETCODE conshdlrEnableCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition cons.c:1404
void SCIPconshdlrSetDelvars(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4644
SCIP_RETCODE SCIPconsEnable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:7112
void SCIPconsCapture(SCIP_CONS *cons)
Definition cons.c:6431
SCIP_RETCODE SCIPconsProp(SCIP_CONS *cons, SCIP_SET *set, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
Definition cons.c:7881
static SCIP_RETCODE conssetchgCreate(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem)
Definition cons.c:5475
SCIP_RETCODE SCIPconsPrint(SCIP_CONS *cons, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition cons.c:6483
SCIP_RETCODE SCIPconsCreate(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set, const char *name, SCIP_CONSHDLR *conshdlr, SCIP_CONSDATA *consdata, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool original, SCIP_Bool deleteconsdata)
Definition cons.c:6033
void SCIPconshdlrIncNAppliedCuts(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5066
static SCIP_RETCODE conshdlrEnsureCheckconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:170
static void conshdlrDelPropcons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:1225
static SCIP_Bool conshdlrAreUpdatesDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:323
void SCIPconshdlrSetInit(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4461
void SCIPconsSetLocal(SCIP_CONS *cons, SCIP_Bool local)
Definition cons.c:6953
SCIP_RETCODE SCIPconsMarkPropagate(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7309
SCIP_RETCODE SCIPconshdlrEnforceRelaxSol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_TREE *tree, SCIP_SEPASTORE *sepastore, SCIP_SOL *relaxsol, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition cons.c:3209
static SCIP_RETCODE conshdlrDisableConsSeparation(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:1315
static SCIP_Real conshdlrGetAgeresetavg(SCIP_CONSHDLR *conshdlr)
Definition cons.c:332
void SCIPconshdlrSetGetNVars(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4688
static SCIP_RETCODE conssetchgEnsureDisabledconssSize(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition cons.c:5575
void SCIPconshdlrSetGetSignedPermsymGraph(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4722
SCIP_RETCODE SCIPconsDeactivate(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:7077
static SCIP_RETCODE conshdlrEnsurePropconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:194
SCIP_RETCODE SCIPconshdlrExitsol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_Bool restart)
Definition cons.c:2759
SCIP_RETCODE SCIPconshdlrSeparateSol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_SEPASTORE *sepastore, SCIP_SOL *sol, int depth, SCIP_Bool execdelayed, SCIP_RESULT *result)
Definition cons.c:3075
SCIP_RETCODE SCIPconsDisable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:7145
SCIP_RETCODE SCIPconsDeactive(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:8063
static SCIP_RETCODE conshdlrMarkConsObsolete(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:388
SCIP_RETCODE SCIPconshdlrLockVars(SCIP_CONSHDLR *conshdlr, SCIP_SET *set)
Definition cons.c:4280
SCIP_RETCODE SCIPconshdlrEnforceLPSol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_TREE *tree, SCIP_SEPASTORE *sepastore, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition cons.c:3406
SCIP_RETCODE SCIPconsGetPermsymGraph(SCIP_CONS *cons, SCIP_SET *set, SYM_GRAPH *graph, SCIP_Bool *success)
Definition cons.c:6593
SCIP_RETCODE SCIPconsGetNVars(SCIP_CONS *cons, SCIP_SET *set, int *nvars, SCIP_Bool *success)
Definition cons.c:6558
static SCIP_RETCODE conshdlrEnsureUpdateconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:218
void SCIPconsSetStickingAtNode(SCIP_CONS *cons, SCIP_Bool stickingatnode)
Definition cons.c:6999
SCIP_RETCODE SCIPconsSetSeparated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool separate)
Definition cons.c:6800
#define checkConssArrays(conshdlr)
Definition cons.c:247
SCIP_RETCODE SCIPconsSepalp(SCIP_CONS *cons, SCIP_SET *set, SCIP_RESULT *result)
Definition cons.c:7797
static SCIP_RETCODE conssetchgRelease(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition cons.c:5496
static SCIP_RETCODE conshdlrProcessUpdates(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:1689
SCIP_RETCODE SCIPconsEnfops(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool solinfeasible, SCIP_Bool objinfeasible, SCIP_RESULT *result)
Definition cons.c:7641
SCIP_RETCODE SCIPconsActive(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:8039
#define AGERESETAVG_AGELIMIT
Definition cons.c:58
SCIP_RETCODE SCIPconsResetAge(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7456
static SCIP_RETCODE conshdlrEnsureInitconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:98
void SCIPconshdlrSetExit(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4472
void SCIPconshdlrSetResprop(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4589
void SCIPconshdlrSetTrans(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4567
static SCIP_RETCODE conshdlrAddCheckcons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:1086
static SCIP_RETCODE ensurePropagationStorage(SCIP_SET *set, SCIP_CONSHDLR *conshdlr, int num)
Definition cons.c:8108
void SCIPconshdlrSetDelete(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4556
SCIP_RETCODE SCIPconsResprop(SCIP_CONS *cons, SCIP_SET *set, SCIP_VAR *infervar, int inferinfo, SCIP_BOUNDTYPE boundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd, SCIP_RESULT *result)
Definition cons.c:7923
void SCIPconshdlrSetParse(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4666
void SCIPconsSetRemovable(SCIP_CONS *cons, SCIP_Bool removable)
Definition cons.c:6988
void SCIPconshdlrSetExitsol(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4494
SCIP_RETCODE SCIPconshdlrCreate(SCIP_CONSHDLR **conshdlr, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int sepapriority, int enfopriority, int checkpriority, int sepafreq, int propfreq, int eagerfreq, int maxprerounds, SCIP_Bool delaysepa, SCIP_Bool delayprop, SCIP_Bool needscons, SCIP_PROPTIMING proptiming, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), SCIP_DECL_CONSFREE((*consfree)), SCIP_DECL_CONSINIT((*consinit)), SCIP_DECL_CONSEXIT((*consexit)), SCIP_DECL_CONSINITPRE((*consinitpre)), SCIP_DECL_CONSEXITPRE((*consexitpre)), SCIP_DECL_CONSINITSOL((*consinitsol)), SCIP_DECL_CONSEXITSOL((*consexitsol)), SCIP_DECL_CONSDELETE((*consdelete)), SCIP_DECL_CONSTRANS((*constrans)), SCIP_DECL_CONSINITLP((*consinitlp)), SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), SCIP_DECL_CONSENFOLP((*consenfolp)), SCIP_DECL_CONSENFORELAX((*consenforelax)), SCIP_DECL_CONSENFOPS((*consenfops)), SCIP_DECL_CONSCHECK((*conscheck)), SCIP_DECL_CONSPROP((*consprop)), SCIP_DECL_CONSPRESOL((*conspresol)), SCIP_DECL_CONSRESPROP((*consresprop)), SCIP_DECL_CONSLOCK((*conslock)), SCIP_DECL_CONSACTIVE((*consactive)), SCIP_DECL_CONSDEACTIVE((*consdeactive)), SCIP_DECL_CONSENABLE((*consenable)), SCIP_DECL_CONSDISABLE((*consdisable)), SCIP_DECL_CONSDELVARS((*consdelvars)), SCIP_DECL_CONSPRINT((*consprint)), SCIP_DECL_CONSCOPY((*conscopy)), SCIP_DECL_CONSPARSE((*consparse)), SCIP_DECL_CONSGETVARS((*consgetvars)), SCIP_DECL_CONSGETNVARS((*consgetnvars)), SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)), SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)), SCIP_CONSHDLRDATA *conshdlrdata)
Definition cons.c:2287
void SCIPconshdlrEnableOrDisableClocks(SCIP_CONSHDLR *conshdlr, SCIP_Bool enable)
Definition cons.c:4846
static SCIP_RETCODE conssetchgDelDisabledCons(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int arraypos)
Definition cons.c:5721
void SCIPconshdlrSetDisable(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4633
void SCIPconshdlrSetActive(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4600
SCIP_RETCODE SCIPconsTransform(SCIP_CONS *origcons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_CONS **transcons)
Definition cons.c:6716
static SCIP_Bool consExceedsAgelimit(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:356
static SCIP_RETCODE conshdlrAddSepacons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:887
SCIP_RETCODE SCIPconsCheck(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_RESULT *result)
Definition cons.c:7603
#define AGERESETAVG_OBSOLETEAGE
Definition cons.c:60
static void conshdlrDelEnfocons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:1034
SCIP_RETCODE SCIPconssetchgAddAddedCons(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons, int depth, SCIP_Bool focusnode, SCIP_Bool active)
Definition cons.c:5600
SCIP_RETCODE SCIPconshdlrInitLP(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_TREE *tree, SCIP_Bool initkeptconss, SCIP_Bool *cutoff)
Definition cons.c:2801
static SCIP_RETCODE conshdlrDisableConsPropagation(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:1375
static SCIP_RETCODE conshdlrEnsureConssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:74
#define AGERESETAVG_MIN
Definition cons.c:56
static void conshdlrUnmarkConsPropagate(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:698
static void conshdlrMarkConsPropagate(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:623
SCIP_RETCODE SCIPconsAddAge(SCIP_CONS *cons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_Real deltaage, SCIP_REOPT *reopt)
Definition cons.c:7376
SCIP_RETCODE SCIPconsEnablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7237
static void conshdlrDelCheckcons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:1130
static void conshdlrDelayUpdates(SCIP_CONSHDLR *conshdlr)
Definition cons.c:1883
static void conshdlrDelInitcons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:852
static SCIP_RETCODE conshdlrForceUpdates(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:1899
SCIP_RETCODE SCIPconsEnfolp(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition cons.c:7685
static SCIP_RETCODE conshdlrAddCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:770
SCIP_RETCODE SCIPconsSetInitial(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat, SCIP_Bool initial)
Definition cons.c:6766
SCIP_RETCODE SCIPconssetchgFree(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition cons.c:5526
static SCIP_RETCODE conshdlrEnsureEnfoconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:146
SCIP_RETCODE SCIPconsChgName(SCIP_CONS *cons, BMS_BLKMEM *blkmem, const char *name)
Definition cons.c:6355
static SCIP_RETCODE conshdlrDisableCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition cons.c:1466
SCIP_RETCODE SCIPconsIncAge(SCIP_CONS *cons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition cons.c:7435
static SCIP_Bool consExceedsObsoleteage(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:371
void SCIPconshdlrSetEnable(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4622
SCIP_RETCODE SCIPconshdlrInitpre(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:2578
void SCIPconsSetDynamic(SCIP_CONS *cons, SCIP_Bool dynamic)
Definition cons.c:6977
SCIP_RETCODE SCIPconsSepasol(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_RESULT *result)
Definition cons.c:7838
SCIP_RETCODE SCIPconsFree(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition cons.c:6375
static SCIP_RETCODE conshdlrMarkConsUseful(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:518
static SCIP_RETCODE conshdlrEnableConsPropagation(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:1344
SCIP_RETCODE SCIPconssetchgAddDisabledCons(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:5646
void SCIPconshdlrSetDeactive(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4611
SCIP_RETCODE SCIPconsDelete(SCIP_CONS *cons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition cons.c:6656
void SCIPconshdlrSetGetVars(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4677
SCIP_RETCODE SCIPconsPresol(SCIP_CONS *cons, SCIP_SET *set, int nrounds, SCIP_PRESOLTIMING timing, int nnewfixedvars, int nnewaggrvars, int nnewchgvartypes, int nnewchgbds, int nnewholes, int nnewdelconss, int nnewaddconss, int nnewupgdconss, int nnewchgcoefs, int nnewchgsides, int *nfixedvars, int *naggrvars, int *nchgvartypes, int *nchgbds, int *naddholes, int *ndelconss, int *naddconss, int *nupgdconss, int *nchgcoefs, int *nchgsides, SCIP_RESULT *result)
Definition cons.c:7965
SCIP_RETCODE SCIPconsDisablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7267
SCIP_RETCODE SCIPconsCopy(SCIP_CONS **cons, SCIP_SET *set, const char *name, SCIP *sourcescip, SCIP_CONSHDLR *sourceconshdlr, SCIP_CONS *sourcecons, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool global, SCIP_Bool *valid)
Definition cons.c:6176
static void conshdlrDelCons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:796
void SCIPconshdlrSetGetDiveBdChgs(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4699
SCIP_RETCODE SCIPconsRelease(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition cons.c:6443
SCIP_RETCODE SCIPconsResolvePropagation(SCIP_CONS *cons, SCIP_SET *set, SCIP_VAR *infervar, int inferinfo, SCIP_BOUNDTYPE inferboundtype, SCIP_BDCHGIDX *bdchgidx, SCIP_Real relaxedbd, SCIP_RESULT *result)
Definition cons.c:7497
SCIP_RETCODE SCIPconsSetPropagated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool propagate)
Definition cons.c:6918
SCIP_RETCODE SCIPconsDisableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7209
static SCIP_RETCODE conshdlrEnsureSepaconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition cons.c:122
void SCIPconshdlrSetInitsol(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4483
SCIP_RETCODE SCIPconsGetSignedPermsymGraph(SCIP_CONS *cons, SCIP_SET *set, SYM_GRAPH *graph, SCIP_Bool *success)
Definition cons.c:6626
#define AGERESETAVG_INIT
Definition cons.c:55
SCIP_RETCODE SCIPconshdlrUnlockVars(SCIP_CONSHDLR *conshdlr, SCIP_SET *set)
Definition cons.c:4300
SCIP_RETCODE SCIPconsSetChecked(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool check)
Definition cons.c:6870
SCIP_RETCODE SCIPconsInitlp(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool *infeasible)
Definition cons.c:7771
SCIP_RETCODE SCIPconsEnforelax(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition cons.c:7727
static SCIP_RETCODE conshdlrAddUpdateCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:1925
static SCIP_RETCODE doConshdlrCreate(SCIP_CONSHDLR **conshdlr, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, int sepapriority, int enfopriority, int checkpriority, int sepafreq, int propfreq, int eagerfreq, int maxprerounds, SCIP_Bool delaysepa, SCIP_Bool delayprop, SCIP_Bool needscons, SCIP_PROPTIMING proptiming, SCIP_PRESOLTIMING presoltiming, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), SCIP_DECL_CONSFREE((*consfree)), SCIP_DECL_CONSINIT((*consinit)), SCIP_DECL_CONSEXIT((*consexit)), SCIP_DECL_CONSINITPRE((*consinitpre)), SCIP_DECL_CONSEXITPRE((*consexitpre)), SCIP_DECL_CONSINITSOL((*consinitsol)), SCIP_DECL_CONSEXITSOL((*consexitsol)), SCIP_DECL_CONSDELETE((*consdelete)), SCIP_DECL_CONSTRANS((*constrans)), SCIP_DECL_CONSINITLP((*consinitlp)), SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), SCIP_DECL_CONSENFOLP((*consenfolp)), SCIP_DECL_CONSENFORELAX((*consenforelax)), SCIP_DECL_CONSENFOPS((*consenfops)), SCIP_DECL_CONSCHECK((*conscheck)), SCIP_DECL_CONSPROP((*consprop)), SCIP_DECL_CONSPRESOL((*conspresol)), SCIP_DECL_CONSRESPROP((*consresprop)), SCIP_DECL_CONSLOCK((*conslock)), SCIP_DECL_CONSACTIVE((*consactive)), SCIP_DECL_CONSDEACTIVE((*consdeactive)), SCIP_DECL_CONSENABLE((*consenable)), SCIP_DECL_CONSDISABLE((*consdisable)), SCIP_DECL_CONSDELVARS((*consdelvars)), SCIP_DECL_CONSPRINT((*consprint)), SCIP_DECL_CONSCOPY((*conscopy)), SCIP_DECL_CONSPARSE((*consparse)), SCIP_DECL_CONSGETVARS((*consgetvars)), SCIP_DECL_CONSGETNVARS((*consgetnvars)), SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)), SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)), SCIP_CONSHDLRDATA *conshdlrdata)
Definition cons.c:2002
SCIP_RETCODE SCIPconshdlrsResetPropagationStatus(SCIP_SET *set, BMS_BLKMEM *blkmem, SCIP_CONSHDLR **conshdlrs, int nconshdlrs)
Definition cons.c:8172
SCIP_RETCODE SCIPconshdlrCopyInclude(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_Bool *valid)
Definition cons.c:1980
SCIP_RETCODE SCIPconsMarkConflict(SCIP_CONS *cons)
Definition cons.c:7297
SCIP_RETCODE SCIPconsActivate(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool focusnode)
Definition cons.c:7035
static SCIP_RETCODE conshdlrAddEnfocons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:977
static SCIP_RETCODE conshdlrEnableConsSeparation(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:1284
static void conshdlrDelSepacons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition cons.c:931
SCIP_CONS * SCIPconsGetTransformed(SCIP_CONS *cons)
Definition cons.c:7025
#define AGERESETAVG_DECAY
Definition cons.c:57
SCIP_RETCODE SCIPconshdlrPropagate(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool fullpropagation, SCIP_Bool execdelayed, SCIP_Bool instrongbranching, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
Definition cons.c:3905
void SCIPconshdlrSetInitlp(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4578
SCIP_RETCODE SCIPconsUnmarkPropagate(SCIP_CONS *cons, SCIP_SET *set)
Definition cons.c:7339
SCIP_RETCODE SCIPconshdlrGetDiveBoundChanges(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_DIVESET *diveset, SCIP_SOL *sol, SCIP_Bool *success, SCIP_Bool *infeasible)
Definition cons.c:3589
static void conshdlrUpdateAgeresetavg(SCIP_CONSHDLR *conshdlr, SCIP_Real age)
Definition cons.c:343
void SCIPconshdlrSetCopy(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)),)
Definition cons.c:4435
void SCIPconshdlrSetFree(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4450
static SCIP_RETCODE conshdlrAddPropcons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_CONS *cons)
Definition cons.c:1169
SCIP_RETCODE SCIPconshdlrPresolve(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, 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 cons.c:4085
SCIP_RETCODE SCIPconsGetVars(SCIP_CONS *cons, SCIP_SET *set, SCIP_VAR **vars, int varssize, SCIP_Bool *success)
Definition cons.c:6522
void SCIPconsSetNamePointer(SCIP_CONS *cons, const char *name)
Definition cons.c:7011
SCIP_RETCODE SCIPconshdlrEnforcePseudoSol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_TREE *tree, SCIP_BRANCHCAND *branchcand, SCIP_Bool solinfeasible, SCIP_Bool objinfeasible, SCIP_Bool forced, SCIP_RESULT *result)
Definition cons.c:3624
void SCIPconshdlrSetInitpre(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4505
SCIP_RETCODE SCIPconssetchgApply(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool focusnode)
Definition cons.c:5764
SCIP_RETCODE SCIPconshdlrDelVars(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:4244
SCIP_RETCODE SCIPconsSetEnforced(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool enforce)
Definition cons.c:6835
void SCIPconsSetModifiable(SCIP_CONS *cons, SCIP_Bool modifiable)
Definition cons.c:6966
static SCIP_RETCODE conshdlrDeactivateCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition cons.c:1607
SCIP_RETCODE SCIPconshdlrExitpre(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:2669
SCIP_RETCODE SCIPconshdlrInitsol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:2714
SCIP_RETCODE SCIPconssetchgMakeGlobal(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition cons.c:5937
void SCIPconshdlrSetPrint(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4655
SCIP_RETCODE SCIPconshdlrCheck(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_Bool completely, SCIP_RESULT *result)
Definition cons.c:3838
SCIP_RETCODE SCIPconshdlrExit(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition cons.c:2530
static SCIP_RETCODE conshdlrActivateCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons, int depth, SCIP_Bool focusnode)
Definition cons.c:1532
SCIP_RETCODE SCIPconshdlrFree(SCIP_CONSHDLR **conshdlr, SCIP_SET *set)
Definition cons.c:2367
internal methods for constraints and constraint handlers
common defines and data types used in all packages of SCIP
#define NULL
Definition def.h:255
#define SCIP_MAXSTRLEN
Definition def.h:276
#define SCIP_Longint
Definition def.h:148
#define SCIP_MAXTREEDEPTH
Definition def.h:304
#define SCIP_Bool
Definition def.h:98
#define MIN(x, y)
Definition def.h:231
#define SCIP_ALLOC(x)
Definition def.h:373
#define SCIP_Real
Definition def.h:163
#define TRUE
Definition def.h:100
#define FALSE
Definition def.h:101
#define MAX(x, y)
Definition def.h:227
#define SCIP_CALL(x)
Definition def.h:362
#define SCIP_CALL_FINALLY(x, y)
Definition def.h:404
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
int SCIPconshdlrGetNCheckConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4802
void SCIPconshdlrSetData(SCIP_CONSHDLR *conshdlr, SCIP_CONSHDLRDATA *conshdlrdata)
Definition cons.c:4350
void SCIPconshdlrSetEnforelax(SCIP_CONSHDLR *conshdlr,)
Definition cons.c:4424
int SCIPconshdlrGetMaxNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5116
SCIP_Real SCIPconshdlrGetCheckTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4946
SCIP_PROPTIMING SCIPconshdlrGetPropTiming(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5407
SCIP_Bool SCIPconshdlrWasSolSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5367
SCIP_Longint SCIPconshdlrGetNCheckCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5016
SCIP_CONS ** SCIPconshdlrGetCheckConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4759
int SCIPconshdlrGetNChgSides(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5226
SCIP_Real SCIPconshdlrGetPresolTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4876
int SCIPconshdlrGetEagerFreq(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5296
SCIP_Bool SCIPconshdlrDoesPresolve(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5327
void SCIPconshdlrSetProp(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING timingmask)
Definition cons.c:4405
int SCIPconshdlrGetNFixedVars(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5136
SCIP_PRESOLTIMING SCIPconshdlrGetPresolTiming(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5429
SCIP_Real SCIPconshdlrGetEnfoLPTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4896
int SCIPconshdlrGetNPresolCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5236
SCIP_Longint SCIPconshdlrGetNDomredsFound(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5096
int SCIPconshdlrGetSepaPriority(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5246
SCIP_Longint SCIPconshdlrGetNCutsApplied(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5056
int SCIPconshdlrGetNChgCoefs(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5216
void SCIPconshdlrSetPresolTiming(SCIP_CONSHDLR *conshdlr, SCIP_PRESOLTIMING presoltiming)
Definition cons.c:5439
void SCIPconshdlrMarkExact(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4374
int SCIPconshdlrGetNUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4836
SCIP_CONS ** SCIPconshdlrGetEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4749
void SCIPconshdlrSetSepa(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), int sepafreq, int sepapriority, SCIP_Bool delaysepa)
Definition cons.c:4384
SCIP_Real SCIPconshdlrGetStrongBranchPropTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4936
SCIP_Longint SCIPconshdlrGetNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5046
SCIP_Bool SCIPconshdlrSupportsSignedPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5460
SCIP_Bool SCIPconshdlrIsPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5347
SCIP_Real SCIPconshdlrGetPropTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4926
void SCIPconssetchgGetAddedConsData(SCIP_CONSSETCHG *conssetchg, SCIP_CONS ***conss, int *nconss)
Definition cons.c:5750
SCIP_Real SCIPconshdlrGetEnfoPSTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4906
int SCIPconshdlrGetPropFreq(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5286
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4782
SCIP_Longint SCIPconshdlrGetNCutoffs(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5036
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4320
int SCIPconshdlrGetNEnabledConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4826
SCIP_CONS ** SCIPconshdlrGetUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4772
SCIP_Bool SCIPconshdlrIsSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5337
SCIP_Longint SCIPconshdlrGetNSepaCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4966
int SCIPconshdlrGetNDelConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5186
SCIP_Bool SCIPconshdlrWasLPSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5357
SCIP_Longint SCIPconshdlrGetNChildren(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5106
SCIP_Real SCIPconshdlrGetEnfoRelaxTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4916
void SCIPconshdlrSetPropTiming(SCIP_CONSHDLR *conshdlr, SCIP_PROPTIMING proptiming)
Definition cons.c:5417
SCIP_Bool SCIPconshdlrNeedsCons(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5306
int SCIPconshdlrGetNAggrVars(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5146
SCIP_Longint SCIPconshdlrGetNEnfoPSCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4986
int SCIPconshdlrGetNAddHoles(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5176
int SCIPconshdlrGetNEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4792
void SCIPconshdlrSetNeedsCons(SCIP_CONSHDLR *conshdlr, SCIP_Bool needscons)
Definition cons.c:5316
SCIP_Bool SCIPconshdlrIsInitialized(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5387
int SCIPconshdlrGetNUpgdConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5206
int SCIPconshdlrGetStartNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5126
SCIP_Bool SCIPconshdlrIsExact(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4361
SCIP_Bool SCIPconshdlrWasPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5377
int SCIPconshdlrGetNAddConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5196
SCIP_Bool SCIPconshdlrSupportsPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5450
int SCIPconshdlrGetNChgBds(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5166
const char * SCIPconshdlrGetDesc(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4330
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4340
SCIP_Longint SCIPconshdlrGetNConssFound(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5086
int SCIPconshdlrGetNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4816
int SCIPconshdlrGetCheckPriority(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5266
int SCIPconshdlrGetSepaFreq(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5276
SCIP_Longint SCIPconshdlrGetNPropCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5006
SCIP_Longint SCIPconshdlrGetNEnfoLPCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4976
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4739
int SCIPconshdlrGetEnfoPriority(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5256
SCIP_Real SCIPconshdlrGetSetupTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4866
SCIP_Longint SCIPconshdlrGetNRespropCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5026
SCIP_Real SCIPconshdlrGetSepaTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4886
SCIP_Bool SCIPconshdlrIsClonable(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5397
int SCIPconshdlrGetNChgVarTypes(SCIP_CONSHDLR *conshdlr)
Definition cons.c:5156
SCIP_Real SCIPconshdlrGetRespropTime(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4956
SCIP_Longint SCIPconshdlrGetNEnfoRelaxCalls(SCIP_CONSHDLR *conshdlr)
Definition cons.c:4996
SCIP_Bool SCIPconsIsLockedNeg(SCIP_CONS *cons)
Definition cons.c:8722
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
Definition cons.c:8423
void SCIPconsAddUpgradeLocks(SCIP_CONS *cons, int nlocks)
Definition cons.c:8832
int SCIPconsGetPos(SCIP_CONS *cons)
Definition cons.c:8403
SCIP_Bool SCIPconsIsConflict(SCIP_CONS *cons)
Definition cons.c:8542
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
Definition cons.c:8652
SCIP_Real SCIPconsGetAge(SCIP_CONS *cons)
Definition cons.c:8552
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
Definition cons.c:8413
int SCIPconsGetActiveDepth(SCIP_CONS *cons)
Definition cons.c:8443
SCIP_Bool SCIPconsIsLockedPos(SCIP_CONS *cons)
Definition cons.c:8712
SCIP_Bool SCIPconsIsPropagationEnabled(SCIP_CONS *cons)
Definition cons.c:8511
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
Definition cons.c:8562
int SCIPconsGetNUpgradeLocks(SCIP_CONS *cons)
Definition cons.c:8845
SCIP_Bool SCIPconsIsMarkedPropagate(SCIP_CONS *cons)
Definition cons.c:8602
int SCIPconsGetNLocksTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition cons.c:8810
int SCIPconsGetValidDepth(SCIP_CONS *cons)
Definition cons.c:8476
SCIP_Bool SCIPconsIsOriginal(SCIP_CONS *cons)
Definition cons.c:8692
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
Definition cons.c:8592
SCIP_Bool SCIPconsIsDeleted(SCIP_CONS *cons)
Definition cons.c:8522
SCIP_Bool SCIPconsIsUpdatedeactivate(SCIP_CONS *cons)
Definition cons.c:8464
SCIP_Bool SCIPconsIsTransformed(SCIP_CONS *cons)
Definition cons.c:8702
int SCIPconsGetNLocksPos(SCIP_CONS *cons)
Definition cons.c:8742
SCIP_Bool SCIPconsIsLockedType(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition cons.c:8786
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
Definition cons.c:8582
SCIP_Bool SCIPconsIsInProb(SCIP_CONS *cons)
Definition cons.c:8682
SCIP_Bool SCIPconsIsGlobal(SCIP_CONS *cons)
Definition cons.c:8622
SCIP_Bool SCIPconsIsActive(SCIP_CONS *cons)
Definition cons.c:8454
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
Definition cons.c:8612
SCIP_Bool SCIPconsIsLocal(SCIP_CONS *cons)
Definition cons.c:8632
int SCIPconsGetNLocksNeg(SCIP_CONS *cons)
Definition cons.c:8752
int SCIPconsGetNUses(SCIP_CONS *cons)
Definition cons.c:8433
SCIP_Bool SCIPconsIsLockedTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition cons.c:8762
SCIP_Bool SCIPconsIsEnabled(SCIP_CONS *cons)
Definition cons.c:8490
const char * SCIPconsGetName(SCIP_CONS *cons)
Definition cons.c:8393
SCIP_Bool SCIPconsIsLocked(SCIP_CONS *cons)
Definition cons.c:8732
SCIP_Bool SCIPconsIsSeparationEnabled(SCIP_CONS *cons)
Definition cons.c:8500
SCIP_Bool SCIPconsIsLockedTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition cons.c:8774
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
Definition cons.c:8642
SCIP_Bool SCIPconsIsAdded(SCIP_CONS *cons)
Definition cons.c:8822
SCIP_Bool SCIPconsIsObsolete(SCIP_CONS *cons)
Definition cons.c:8532
SCIP_Bool SCIPconsIsStickingAtNode(SCIP_CONS *cons)
Definition cons.c:8672
int SCIPconsGetNLocksTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition cons.c:8798
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
Definition cons.c:8572
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
Definition cons.c:8662
#define SCIPfreeBlockMemory(scip, ptr)
Definition scip_mem.h:108
#define SCIPallocBlockMemory(scip, ptr)
Definition scip_mem.h:89
int SCIPlinConsStatsGetSum(SCIP_LINCONSSTATS *linconsstats)
Definition cons.c:8278
void SCIPlinConsStatsIncTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype, int increment)
Definition cons.c:8288
int SCIPlinConsStatsGetTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype)
Definition cons.c:8266
void SCIPlinConsStatsFree(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition cons.c:8245
void SCIPlinConsStatsReset(SCIP_LINCONSSTATS *linconsstats)
Definition cons.c:8257
void SCIPprintLinConsStats(SCIP *scip, FILE *file, SCIP_LINCONSSTATS *linconsstats)
Definition cons.c:8303
SCIP_RETCODE SCIPlinConsStatsCreate(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition cons.c:8232
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
Definition var.c:24143
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:24121
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
void SCIPstrCopySection(const char *str, char startchar, char endchar, char *token, int size, char **endptr)
Definition misc.c:10985
SCIP_RETCODE SCIPskipSpace(char **s)
Definition misc.c:10816
return SCIP_OKAY
static SCIP_DIVESET * diveset
int c
int depth
SCIP_Bool cutoff
static SCIP_SOL * sol
assert(minobj< SCIPgetCutoffbound(scip))
int nvars
static SCIP_Bool propagate
static SCIP_VAR ** vars
static const char * paramname[]
Definition lpi_msk.c:5172
#define BMSduplicateBlockMemoryArray(mem, ptr, source, num)
Definition memory.h:462
#define BMSfreeMemory(ptr)
Definition memory.h:145
#define BMSfreeBlockMemory(mem, ptr)
Definition memory.h:465
#define BMSallocBlockMemory(mem, ptr)
Definition memory.h:451
#define BMSreallocMemoryArray(ptr, num)
Definition memory.h:127
#define BMSfreeBlockMemoryArrayNull(mem, ptr, num)
Definition memory.h:468
#define BMSduplicateMemoryArray(ptr, source, num)
Definition memory.h:143
#define BMSclearMemory(ptr)
Definition memory.h:129
#define BMScopyMemoryArray(ptr, source, num)
Definition memory.h:134
#define BMSfreeBlockMemoryArray(mem, ptr, num)
Definition memory.h:467
#define BMSreallocBlockMemoryArray(mem, ptr, oldnum, newnum)
Definition memory.h:458
#define BMSclearMemoryArray(ptr, num)
Definition memory.h:130
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
void SCIPmessageFPrintInfo(SCIP_MESSAGEHDLR *messagehdlr, FILE *file, const char *formatstr,...)
Definition message.c:618
void SCIPmessagePrintWarning(SCIP_MESSAGEHDLR *messagehdlr, const char *formatstr,...)
Definition message.c:427
SCIP_RETCODE SCIPprobDelCons(SCIP_PROB *prob, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition prob.c:1575
SCIP_RETCODE SCIPprobAddCons(SCIP_PROB *prob, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition prob.c:1504
internal methods for storing and manipulating the main problem
#define SCIPerrorMessage
Definition pub_message.h:64
#define SCIPdebugMessage
Definition pub_message.h:96
public data structures and miscellaneous methods
SCIP_Bool SCIPreoptConsCanBeDeleted(SCIP_REOPT *reopt, SCIP_CONS *cons)
Definition reopt.c:8284
data structures and methods for collecting reoptimization information
SCIP callable library.
static SCIP_RETCODE separate(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
Main separation function.
int SCIPsepastoreGetNCuts(SCIP_SEPASTORE *sepastore)
Definition sepastore.c:1183
internal methods for storing separated cuts
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
SCIP_CONSHDLR * SCIPsetFindConshdlr(SCIP_SET *set, const char *name)
Definition set.c:4244
SCIP_STAGE SCIPsetGetStage(SCIP_SET *set)
Definition set.c:3197
int SCIPsetCalcMemGrowSize(SCIP_SET *set, int num)
Definition set.c:6080
internal methods for global SCIP settings
#define SCIPsetDebugMsg
Definition set.h:1811
internal methods for problem statistics
SCIP_CONS ** addedconss
SCIP_CONS ** disabledconss
unsigned int initial
Definition struct_cons.h:71
int nlocksneg[NLOCKTYPES]
Definition struct_cons.h:65
unsigned int updatefree
unsigned int updatesepaenable
int validdepth
Definition struct_cons.h:67
SCIP_CONSDATA * consdata
Definition struct_cons.h:51
unsigned int enabled
Definition struct_cons.h:91
int enfoconsspos
Definition struct_cons.h:60
SCIP_Real age
Definition struct_cons.h:48
unsigned int dynamic
Definition struct_cons.h:80
int addarraypos
Definition struct_cons.h:56
int nupgradelocks
Definition struct_cons.h:69
unsigned int propagate
Definition struct_cons.h:75
unsigned int updateobsolete
unsigned int updatesepadisable
SCIP_CONSSETCHG * addconssetchg
Definition struct_cons.h:54
char * name
Definition struct_cons.h:49
unsigned int updateenable
Definition struct_cons.h:99
unsigned int updateactfocus
int sepaconsspos
Definition struct_cons.h:59
unsigned int updateunmarkpropagate
unsigned int deleted
Definition struct_cons.h:94
unsigned int updateactivate
Definition struct_cons.h:97
unsigned int local
Definition struct_cons.h:78
SCIP_CONS * transorigcons
Definition struct_cons.h:52
int propconsspos
Definition struct_cons.h:62
SCIP * scip
unsigned int updatedisable
unsigned int updatedeactivate
Definition struct_cons.h:98
int activedepth
Definition struct_cons.h:66
unsigned int active
Definition struct_cons.h:85
unsigned int removable
Definition struct_cons.h:81
unsigned int updatepropenable
unsigned int enforce
Definition struct_cons.h:73
SCIP_CONSHDLR * conshdlr
Definition struct_cons.h:50
unsigned int modifiable
Definition struct_cons.h:79
int checkconsspos
Definition struct_cons.h:61
unsigned int conflict
Definition struct_cons.h:90
unsigned int original
Definition struct_cons.h:83
unsigned int separate
Definition struct_cons.h:72
unsigned int sepaenabled
Definition struct_cons.h:76
unsigned int obsolete
Definition struct_cons.h:92
unsigned int update
Definition struct_cons.h:95
int initconsspos
Definition struct_cons.h:58
unsigned int stickingatnode
Definition struct_cons.h:82
unsigned int propenabled
Definition struct_cons.h:77
unsigned int check
Definition struct_cons.h:74
int nlockspos[NLOCKTYPES]
Definition struct_cons.h:64
unsigned int markpropagate
Definition struct_cons.h:93
unsigned int updatemarkpropagate
unsigned int updatepropdisable
unsigned int updateinsert
Definition struct_cons.h:96
SCIP_Longint nsepacalls
SCIP_CONS ** conss
SCIP_CONS ** checkconss
SCIP_CLOCK * presoltime
SCIP_RESULT lastenfolpresult
SCIP_Longint ndomredsfound
SCIP_PRESOLTIMING presoltiming
SCIP_CLOCK * enfopstime
SCIP_Longint lastenfolpdomchgcount
SCIP_CLOCK * enforelaxtime
SCIP_Bool delayprop
int storednmarkedpropconss
SCIP_CLOCK * enfolptime
SCIP_Longint nenfolpcalls
SCIP_Longint ncutoffs
int storedpropconsssize
SCIP_CLOCK * proptime
SCIP_Longint ncheckcalls
SCIP_CLOCK * checktime
SCIP_RESULT lastenfopsresult
SCIP_Bool initialized
SCIP_Bool duringsepa
SCIP_CLOCK * sbproptime
SCIP_Longint nenforelaxcalls
SCIP_Longint lastsepalpcount
SCIP_Longint lastenfolplpcount
int lastnusefulpropconss
SCIP_Bool sepasolwasdelayed
SCIP_Bool propwasdelayed
SCIP_Bool sepalpwasdelayed
SCIP_Longint ncutsapplied
SCIP_CLOCK * resproptime
SCIP_RESULT lastenforelaxresult
int lastnusefulenfoconss
SCIP_Longint nchildren
SCIP_Longint nenfopscalls
SCIP_Longint lastenforelaxrelaxcount
SCIP_Bool needscons
SCIP_Real ageresetavg
SCIP_Longint storedpropdomchgcount
SCIP_CONS ** sepaconss
SCIP_Longint lastenfolpnode
SCIP_PROPTIMING proptiming
SCIP_Bool delaysepa
SCIP_CONS ** enfoconss
SCIP_Longint lastenforelaxnode
SCIP_CONS ** initconss
SCIP_CONS ** storedpropconss
SCIP_Bool duringprop
SCIP_Longint lastpropdomchgcount
SCIP_Longint ncutsfound
SCIP_Longint lastenfopsnode
SCIP_Longint lastenforelaxdomchgcount
SCIP_Longint nrespropcalls
SCIP_Longint npropcalls
SCIP_CONSHDLRDATA * conshdlrdata
SCIP_CLOCK * sepatime
SCIP_CONS ** propconss
SCIP_CONS ** updateconss
int lastnusefulsepaconss
SCIP_Bool exact
SCIP_CLOCK * setuptime
SCIP_Longint nconssfound
SCIP_Longint lastenfopsdomchgcount
int counter[SCIP_NLINCONSTYPES]
SCIP_Longint nnodes
Definition struct_stat.h:84
SCIP_Longint domchgcount
SCIP_Longint lpcount
SCIP_Longint nprobholechgs
SCIP_Longint ninitconssadded
SCIP_Longint relaxcount
SCIP_Longint nboundchgs
SCIP_Longint nholechgs
int nenabledconss
int nactiveconss
SCIP_Longint nprobboundchgs
datastructures for constraints and constraint handlers
SCIP_Bool SCIPtreeProbing(SCIP_TREE *tree)
Definition tree.c:9391
int SCIPtreeGetCurrentDepth(SCIP_TREE *tree)
Definition tree.c:9509
internal methods for branch and bound tree
struct SCIP_BranchCand SCIP_BRANCHCAND
Definition type_branch.h:55
@ SCIP_CLOCKTYPE_DEFAULT
Definition type_clock.h:43
#define SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH(x)
Definition type_cons.h:956
#define SCIP_DECL_CONSGETPERMSYMGRAPH(x)
Definition type_cons.h:938
#define SCIP_DECL_CONSENFOLP(x)
Definition type_cons.h:363
#define SCIP_DECL_CONSINITPRE(x)
Definition type_cons.h:156
#define SCIP_DECL_CONSDELETE(x)
Definition type_cons.h:229
struct SCIP_Cons SCIP_CONS
Definition type_cons.h:63
#define SCIP_DECL_CONSEXIT(x)
Definition type_cons.h:136
#define SCIP_DECL_CONSGETVARS(x)
Definition type_cons.h:867
#define SCIP_DECL_CONSINITSOL(x)
Definition type_cons.h:201
#define SCIP_DECL_CONSPRINT(x)
Definition type_cons.h:769
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
Definition type_cons.h:64
#define SCIP_DECL_CONSSEPALP(x)
Definition type_cons.h:288
#define SCIP_DECL_CONSDISABLE(x)
Definition type_cons.h:736
struct SCIP_ConsSetChg SCIP_CONSSETCHG
Definition type_cons.h:66
struct SYM_Graph SYM_GRAPH
Definition type_cons.h:68
#define SCIP_DECL_CONSENFORELAX(x)
Definition type_cons.h:388
struct SCIP_LinConsStats SCIP_LINCONSSTATS
Definition type_cons.h:67
#define SCIP_DECL_CONSGETDIVEBDCHGS(x)
Definition type_cons.h:920
#define SCIP_DECL_CONSPROP(x)
Definition type_cons.h:506
#define SCIP_DECL_CONSGETNVARS(x)
Definition type_cons.h:885
#define SCIP_DECL_CONSRESPROP(x)
Definition type_cons.h:612
@ SCIP_LINCONSTYPE_BINPACKING
Definition type_cons.h:85
@ SCIP_LINCONSTYPE_VARBOUND
Definition type_cons.h:78
@ SCIP_LINCONSTYPE_EMPTY
Definition type_cons.h:73
@ SCIP_LINCONSTYPE_INVKNAPSACK
Definition type_cons.h:83
@ SCIP_LINCONSTYPE_PRECEDENCE
Definition type_cons.h:77
@ SCIP_LINCONSTYPE_AGGREGATION
Definition type_cons.h:76
@ SCIP_LINCONSTYPE_MIXEDBINARY
Definition type_cons.h:88
@ SCIP_LINCONSTYPE_SINGLETON
Definition type_cons.h:75
@ SCIP_LINCONSTYPE_SETCOVERING
Definition type_cons.h:81
@ SCIP_LINCONSTYPE_EQKNAPSACK
Definition type_cons.h:84
@ SCIP_LINCONSTYPE_FREE
Definition type_cons.h:74
@ SCIP_LINCONSTYPE_KNAPSACK
Definition type_cons.h:86
@ SCIP_LINCONSTYPE_SETPARTITION
Definition type_cons.h:79
@ SCIP_LINCONSTYPE_INTKNAPSACK
Definition type_cons.h:87
@ SCIP_LINCONSTYPE_SETPACKING
Definition type_cons.h:80
@ SCIP_LINCONSTYPE_GENERAL
Definition type_cons.h:89
@ SCIP_LINCONSTYPE_CARDINALITY
Definition type_cons.h:82
#define SCIP_DECL_CONSACTIVE(x)
Definition type_cons.h:691
#define SCIP_DECL_CONSENFOPS(x)
Definition type_cons.h:431
#define SCIP_DECL_CONSPARSE(x)
Definition type_cons.h:845
#define SCIP_DECL_CONSTRANS(x)
Definition type_cons.h:239
#define SCIP_DECL_CONSDEACTIVE(x)
Definition type_cons.h:706
#define SCIP_DECL_CONSPRESOL(x)
Definition type_cons.h:561
#define SCIP_DECL_CONSENABLE(x)
Definition type_cons.h:721
#define SCIP_DECL_CONSINITLP(x)
Definition type_cons.h:259
#define SCIP_DECL_CONSEXITPRE(x)
Definition type_cons.h:180
#define SCIP_DECL_CONSLOCK(x)
Definition type_cons.h:676
struct SCIP_Conshdlr SCIP_CONSHDLR
Definition type_cons.h:62
#define SCIP_DECL_CONSCOPY(x)
Definition type_cons.h:810
#define SCIP_DECL_CONSINIT(x)
Definition type_cons.h:126
struct SCIP_ConsData SCIP_CONSDATA
Definition type_cons.h:65
#define SCIP_DECL_CONSCHECK(x)
Definition type_cons.h:474
#define SCIP_DECL_CONSHDLRCOPY(x)
Definition type_cons.h:108
#define SCIP_DECL_CONSEXITSOL(x)
Definition type_cons.h:216
#define SCIP_NLINCONSTYPES
Definition type_cons.h:93
#define SCIP_DECL_CONSFREE(x)
Definition type_cons.h:116
#define SCIP_DECL_CONSSEPASOL(x)
Definition type_cons.h:320
enum SCIP_LinConstype SCIP_LINCONSTYPE
Definition type_cons.h:91
#define SCIP_DECL_CONSDELVARS(x)
Definition type_cons.h:753
struct SCIP_Diveset SCIP_DIVESET
Definition type_heur.h:78
@ 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_Messagehdlr SCIP_MESSAGEHDLR
struct SCIP_HashMap SCIP_HASHMAP
Definition type_misc.h:106
#define SCIP_DECL_SORTPTRCOMP(x)
Definition type_misc.h:189
#define SCIP_DECL_HASHGETKEY(x)
Definition type_misc.h:192
struct SCIP_Prob SCIP_PROB
Definition type_prob.h:52
struct SCIP_Reopt SCIP_REOPT
Definition type_reopt.h:39
@ SCIP_DIDNOTRUN
Definition type_result.h:42
@ SCIP_CUTOFF
Definition type_result.h:48
@ SCIP_FEASIBLE
Definition type_result.h:45
@ SCIP_DELAYED
Definition type_result.h:43
@ SCIP_REDUCEDDOM
Definition type_result.h:51
@ SCIP_DIDNOTFIND
Definition type_result.h:44
@ SCIP_CONSADDED
Definition type_result.h:52
@ SCIP_UNBOUNDED
Definition type_result.h:47
@ SCIP_BRANCHED
Definition type_result.h:54
@ SCIP_SEPARATED
Definition type_result.h:49
@ SCIP_SOLVELP
Definition type_result.h:55
@ SCIP_NEWROUND
Definition type_result.h:50
@ SCIP_SUCCESS
Definition type_result.h:58
@ SCIP_DELAYNODE
Definition type_result.h:59
@ SCIP_INFEASIBLE
Definition type_result.h:46
enum SCIP_Result SCIP_RESULT
Definition type_result.h:61
@ SCIP_INVALIDRESULT
@ SCIP_PLUGINNOTFOUND
@ SCIP_PARAMETERWRONGVAL
@ SCIP_INVALIDCALL
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_SepaStore SCIP_SEPASTORE
struct SCIP_Set SCIP_SET
Definition type_set.h:71
@ SCIP_STAGE_PROBLEM
Definition type_set.h:45
@ SCIP_STAGE_PRESOLVING
Definition type_set.h:49
struct SCIP_Sol SCIP_SOL
Definition type_sol.h:57
struct SCIP_Stat SCIP_STAT
Definition type_stat.h:66
#define SCIP_PRESOLTIMING_MAX
Definition type_timing.h:59
#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_PROPTIMING_DURINGLPLOOP
Definition type_timing.h:67
struct SCIP_Tree SCIP_TREE
Definition type_tree.h:65
struct SCIP_Var SCIP_VAR
Definition type_var.h:166
#define NLOCKTYPES
Definition type_var.h:138
struct SCIP_BdChgIdx SCIP_BDCHGIDX
Definition type_var.h:151
enum SCIP_LockType SCIP_LOCKTYPE
Definition type_var.h:144
@ SCIP_LOCKTYPE_MODEL
Definition type_var.h:141
internal methods for problem variables