Scippy

SCIP

Solving Constraint Integer Programs

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-2025 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file 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);
403 assert(!conshdlrAreUpdatesDelayed(conshdlr));
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);
533 assert(!conshdlrAreUpdatesDelayed(conshdlr));
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);
1700 assert(!conshdlrAreUpdatesDelayed(conshdlr));
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);
1867 assert(!cons->updatemarkpropagate);
1868 assert(!cons->updateunmarkpropagate);
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);
1907 assert(conshdlrAreUpdatesDelayed(conshdlr));
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)->initialized = FALSE;
2239
2240 /* add parameters */
2241 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/sepafreq", name);
2242 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2243 "frequency for separating cuts (-1: never, 0: only in root node)",
2244 &(*conshdlr)->sepafreq, FALSE, sepafreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2245
2246 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/propfreq", name);
2247 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2248 "frequency for propagating domains (-1: never, 0: only in root node)",
2249 &(*conshdlr)->propfreq, FALSE, propfreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2250
2251 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/proptiming", name);
2252 (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);
2253 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
2254 (int*)(&(*conshdlr)->proptiming), TRUE, (int) proptiming, (int) SCIP_PROPTIMING_BEFORELP, (int) SCIP_PROPTIMING_ALWAYS, NULL, NULL) ); /*lint !e713*/
2255
2256 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/eagerfreq", name);
2257 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2258 "frequency for using all instead of only the useful constraints in separation, propagation and enforcement (-1: never, 0: only in first evaluation)",
2259 &(*conshdlr)->eagerfreq, TRUE, eagerfreq, -1, SCIP_MAXTREEDEPTH, NULL, NULL) );
2260
2261 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/maxprerounds", name);
2262 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname,
2263 "maximal number of presolving rounds the constraint handler participates in (-1: no limit)",
2264 &(*conshdlr)->maxprerounds, TRUE, maxprerounds, -1, INT_MAX, NULL, NULL) );
2265
2266 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/delaysepa", name);
2267 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
2268 "should separation method be delayed, if other separators found cuts?",
2269 &(*conshdlr)->delaysepa, TRUE, delaysepa, NULL, NULL) ); /*lint !e740*/
2270
2271 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/delayprop", name);
2272 SCIP_CALL( SCIPsetAddBoolParam(set, messagehdlr, blkmem, paramname,
2273 "should propagation method be delayed, if other propagators found reductions?",
2274 &(*conshdlr)->delayprop, TRUE, delayprop, NULL, NULL) ); /*lint !e740*/
2275
2276 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "constraints/%s/presoltiming", name);
2277 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of the constraint handler's presolving method (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE, %u:FINAL)",
2279 SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc,
2280 (int*)&(*conshdlr)->presoltiming, TRUE, (int) presoltiming, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_MAX, NULL, NULL) ); /*lint !e740 !e713*/
2281
2282 return SCIP_OKAY;
2283}
2284
2285/** creates a constraint handler */
2287 SCIP_CONSHDLR** conshdlr, /**< pointer to constraint handler data structure */
2288 SCIP_SET* set, /**< global SCIP settings */
2289 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2290 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
2291 const char* name, /**< name of constraint handler */
2292 const char* desc, /**< description of constraint handler */
2293 int sepapriority, /**< priority of the constraint handler for separation */
2294 int enfopriority, /**< priority of the constraint handler for constraint enforcing */
2295 int checkpriority, /**< priority of the constraint handler for checking feasibility (and propagation) */
2296 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
2297 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
2298 int eagerfreq, /**< frequency for using all instead of only the useful constraints in separation,
2299 * propagation and enforcement, -1 for no eager evaluations, 0 for first only */
2300 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
2301 SCIP_Bool delaysepa, /**< should separation method be delayed, if other separators found cuts? */
2302 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
2303 SCIP_Bool needscons, /**< should the constraint handler be skipped, if no constraints are available? */
2304 SCIP_PROPTIMING proptiming, /**< positions in the node solving loop where propagation method of constraint handlers should be executed */
2305 SCIP_PRESOLTIMING presoltiming, /**< timing mask of the constraint handler's presolving method */
2306 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
2307 SCIP_DECL_CONSFREE ((*consfree)), /**< destructor of constraint handler */
2308 SCIP_DECL_CONSINIT ((*consinit)), /**< initialize constraint handler */
2309 SCIP_DECL_CONSEXIT ((*consexit)), /**< deinitialize constraint handler */
2310 SCIP_DECL_CONSINITPRE ((*consinitpre)), /**< presolving initialization method of constraint handler */
2311 SCIP_DECL_CONSEXITPRE ((*consexitpre)), /**< presolving deinitialization method of constraint handler */
2312 SCIP_DECL_CONSINITSOL ((*consinitsol)), /**< solving process initialization method of constraint handler */
2313 SCIP_DECL_CONSEXITSOL ((*consexitsol)), /**< solving process deinitialization method of constraint handler */
2314 SCIP_DECL_CONSDELETE ((*consdelete)), /**< free specific constraint data */
2315 SCIP_DECL_CONSTRANS ((*constrans)), /**< transform constraint data into data belonging to the transformed problem */
2316 SCIP_DECL_CONSINITLP ((*consinitlp)), /**< initialize LP with relaxations of "initial" constraints */
2317 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
2318 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
2319 SCIP_DECL_CONSENFOLP ((*consenfolp)), /**< enforcing constraints for LP solutions */
2320 SCIP_DECL_CONSENFORELAX ((*consenforelax)), /**< enforcing constraints for relaxation solutions */
2321 SCIP_DECL_CONSENFOPS ((*consenfops)), /**< enforcing constraints for pseudo solutions */
2322 SCIP_DECL_CONSCHECK ((*conscheck)), /**< check feasibility of primal solution */
2323 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
2324 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method */
2325 SCIP_DECL_CONSRESPROP ((*consresprop)), /**< propagation conflict resolving method */
2326 SCIP_DECL_CONSLOCK ((*conslock)), /**< variable rounding lock method */
2327 SCIP_DECL_CONSACTIVE ((*consactive)), /**< activation notification method */
2328 SCIP_DECL_CONSDEACTIVE((*consdeactive)), /**< deactivation notification method */
2329 SCIP_DECL_CONSENABLE ((*consenable)), /**< enabling notification method */
2330 SCIP_DECL_CONSDISABLE ((*consdisable)), /**< disabling notification method */
2331 SCIP_DECL_CONSDELVARS ((*consdelvars)), /**< variable deletion method */
2332 SCIP_DECL_CONSPRINT ((*consprint)), /**< constraint display method */
2333 SCIP_DECL_CONSCOPY ((*conscopy)), /**< constraint copying method */
2334 SCIP_DECL_CONSPARSE ((*consparse)), /**< constraint parsing method */
2335 SCIP_DECL_CONSGETVARS ((*consgetvars)), /**< constraint get variables method */
2336 SCIP_DECL_CONSGETNVARS((*consgetnvars)), /**< constraint get number of variable method */
2337 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)), /**< constraint handler diving solution enforcement method */
2338 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)), /**< constraint permutation symmetry detection graph
2339 * getter method */
2340 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)), /**< constraint signed permutation symmetry
2341 * detection graph getter method */
2342 SCIP_CONSHDLRDATA* conshdlrdata /**< constraint handler data */
2343 )
2344{
2345 assert(conshdlr != NULL);
2346 assert(name != NULL);
2347 assert(desc != NULL);
2348 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
2349 assert(consprop != NULL || propfreq == -1);
2350 assert(eagerfreq >= -1);
2351 assert(!needscons || ((conshdlrcopy == NULL) == (conscopy == NULL)));
2352
2353 SCIP_CALL_FINALLY( doConshdlrCreate(conshdlr, set, messagehdlr, blkmem, name, desc, sepapriority, enfopriority,
2354 checkpriority, sepafreq, propfreq, eagerfreq, maxprerounds, delaysepa, delayprop, needscons, proptiming,
2355 presoltiming, conshdlrcopy, consfree, consinit, consexit, consinitpre, consexitpre, consinitsol, consexitsol,
2356 consdelete, constrans, consinitlp, conssepalp, conssepasol, consenfolp, consenforelax, consenfops, conscheck,
2357 consprop, conspresol, consresprop, conslock, consactive, consdeactive, consenable, consdisable, consdelvars,
2358 consprint, conscopy, consparse, consgetvars, consgetnvars, consgetdivebdchgs, consgetpermsymgraph,
2359 consgetsignedpermsymgraph, conshdlrdata),
2360 (void) SCIPconshdlrFree(conshdlr, set) );
2361
2362 return SCIP_OKAY;
2363} /*lint !e715*/
2364
2365/** calls destructor and frees memory of constraint handler */
2367 SCIP_CONSHDLR** conshdlr, /**< pointer to constraint handler data structure */
2368 SCIP_SET* set /**< global SCIP settings */
2369 )
2370{
2371 assert(conshdlr != NULL);
2372 if( *conshdlr == NULL )
2373 return SCIP_OKAY;
2374 assert(!(*conshdlr)->initialized);
2375 assert((*conshdlr)->nconss == 0);
2376 assert(set != NULL);
2377
2378 /* call destructor of constraint handler */
2379 if( (*conshdlr)->consfree != NULL )
2380 {
2381 SCIP_CALL( (*conshdlr)->consfree(set->scip, *conshdlr) );
2382 }
2383
2384 SCIPclockFree(&(*conshdlr)->resproptime);
2385 SCIPclockFree(&(*conshdlr)->checktime);
2386 SCIPclockFree(&(*conshdlr)->sbproptime);
2387 SCIPclockFree(&(*conshdlr)->proptime);
2388 SCIPclockFree(&(*conshdlr)->enforelaxtime);
2389 SCIPclockFree(&(*conshdlr)->enfopstime);
2390 SCIPclockFree(&(*conshdlr)->enfolptime);
2391 SCIPclockFree(&(*conshdlr)->sepatime);
2392 SCIPclockFree(&(*conshdlr)->presoltime);
2393 SCIPclockFree(&(*conshdlr)->setuptime);
2394
2395 BMSfreeMemoryArrayNull(&(*conshdlr)->name);
2396 BMSfreeMemoryArrayNull(&(*conshdlr)->desc);
2397 BMSfreeMemoryArrayNull(&(*conshdlr)->conss);
2398 BMSfreeMemoryArrayNull(&(*conshdlr)->initconss);
2399 BMSfreeMemoryArrayNull(&(*conshdlr)->sepaconss);
2400 BMSfreeMemoryArrayNull(&(*conshdlr)->enfoconss);
2401 BMSfreeMemoryArrayNull(&(*conshdlr)->checkconss);
2402 BMSfreeMemoryArrayNull(&(*conshdlr)->propconss);
2403 BMSfreeMemoryArrayNull(&(*conshdlr)->updateconss);
2404 BMSfreeMemoryArrayNull(&(*conshdlr)->storedpropconss);
2405 BMSfreeMemory(conshdlr);
2406
2407 return SCIP_OKAY;
2408}
2409
2410/** calls initialization method of constraint handler */
2412 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2413 BMS_BLKMEM* blkmem, /**< block memory */
2414 SCIP_SET* set, /**< global SCIP settings */
2415 SCIP_STAT* stat /**< dynamic problem statistics */
2416 )
2417{
2418 assert(conshdlr != NULL);
2419 assert(set != NULL);
2420
2421 if( conshdlr->initialized )
2422 {
2423 SCIPerrorMessage("constraint handler <%s> already initialized\n", conshdlr->name);
2424 return SCIP_INVALIDCALL;
2425 }
2426
2427 if( set->misc_resetstat )
2428 {
2429 SCIPclockReset(conshdlr->setuptime);
2430 SCIPclockReset(conshdlr->presoltime);
2431 SCIPclockReset(conshdlr->sepatime);
2432 SCIPclockReset(conshdlr->enfolptime);
2433 SCIPclockReset(conshdlr->enfopstime);
2434 SCIPclockReset(conshdlr->enforelaxtime);
2435 SCIPclockReset(conshdlr->proptime);
2436 SCIPclockReset(conshdlr->sbproptime);
2437 SCIPclockReset(conshdlr->checktime);
2438 SCIPclockReset(conshdlr->resproptime);
2439
2440 conshdlr->nsepacalls = 0;
2441 conshdlr->nenfolpcalls = 0;
2442 conshdlr->nenfopscalls = 0;
2443 conshdlr->nenforelaxcalls = 0;
2444 conshdlr->npropcalls = 0;
2445 conshdlr->ncheckcalls = 0;
2446 conshdlr->nrespropcalls = 0;
2447 conshdlr->ncutoffs = 0;
2448 conshdlr->ncutsfound = 0;
2449 conshdlr->ncutsapplied = 0;
2450 conshdlr->nconssfound = 0;
2451 conshdlr->ndomredsfound = 0;
2452 conshdlr->nchildren = 0;
2453 conshdlr->lastpropdomchgcount = -1;
2454 conshdlr->lastenfolpdomchgcount = -1;
2455 conshdlr->lastenfopsdomchgcount = -1;
2456 conshdlr->lastenforelaxdomchgcount = -1;
2457 conshdlr->lastenforelaxrelaxcount = -1;
2458 conshdlr->lastenfolpnode = -1;
2459 conshdlr->lastenfopsnode = -1;
2460 conshdlr->lastenfolpresult = SCIP_DIDNOTRUN;
2461 conshdlr->lastenfopsresult = SCIP_DIDNOTRUN;
2462 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2463 conshdlr->startnactiveconss = 0;
2464 conshdlr->lastsepalpcount = -1;
2465 conshdlr->lastenfolplpcount = -1;
2466 conshdlr->lastnusefulpropconss = 0;
2467 conshdlr->lastnusefulsepaconss = 0;
2468 conshdlr->lastnusefulenfoconss = 0;
2469 conshdlr->lastnfixedvars = 0;
2470 conshdlr->lastnaggrvars = 0;
2471 conshdlr->lastnchgvartypes = 0;
2472 conshdlr->lastnchgbds = 0;
2473 conshdlr->lastnaddholes = 0;
2474 conshdlr->lastndelconss = 0;
2475 conshdlr->lastnaddconss = 0;
2476 conshdlr->lastnupgdconss = 0;
2477 conshdlr->lastnchgcoefs = 0;
2478 conshdlr->lastnchgsides = 0;
2479 conshdlr->nfixedvars = 0;
2480 conshdlr->naggrvars = 0;
2481 conshdlr->nchgvartypes = 0;
2482 conshdlr->nchgbds = 0;
2483 conshdlr->naddholes = 0;
2484 conshdlr->ndelconss = 0;
2485 conshdlr->naddconss = 0;
2486 conshdlr->nupgdconss = 0;
2487 conshdlr->nchgcoefs = 0;
2488 conshdlr->nchgsides = 0;
2489 conshdlr->npresolcalls = 0;
2490 conshdlr->ageresetavg = AGERESETAVG_INIT;
2491 conshdlr->sepalpwasdelayed = FALSE;
2492 conshdlr->sepasolwasdelayed = FALSE;
2493 conshdlr->propwasdelayed = FALSE;
2494 }
2495
2496 /* call initialization method of constraint handler */
2497 if( conshdlr->consinit != NULL )
2498 {
2499 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2500 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2501 * external method; to avoid this, these changes will be buffered and processed after the method call
2502 */
2503 conshdlrDelayUpdates(conshdlr);
2504
2505 /* start timing */
2506 SCIPclockStart(conshdlr->setuptime, set);
2507
2508 /* call external method */
2509 SCIP_CALL( conshdlr->consinit(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2510
2511 /* stop timing */
2512 SCIPclockStop(conshdlr->setuptime, set);
2513
2514 /* perform the cached constraint updates */
2515 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2516 }
2517 conshdlr->initialized = TRUE;
2518 assert(!conshdlrAreUpdatesDelayed(conshdlr));
2519
2520 return SCIP_OKAY;
2521}
2522
2523/** calls exit method of constraint handler */
2525 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2526 BMS_BLKMEM* blkmem, /**< block memory */
2527 SCIP_SET* set, /**< global SCIP settings */
2528 SCIP_STAT* stat /**< dynamic problem statistics */
2529 )
2530{
2531 assert(conshdlr != NULL);
2532 assert(set != NULL);
2533
2534 if( !conshdlr->initialized )
2535 {
2536 SCIPerrorMessage("constraint handler <%s> not initialized\n", conshdlr->name);
2537 return SCIP_INVALIDCALL;
2538 }
2539
2540 /* call deinitialization method of constraint handler */
2541 if( conshdlr->consexit != NULL )
2542 {
2543 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2544 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2545 * external method; to avoid this, these changes will be buffered and processed after the method call
2546 */
2547 conshdlrDelayUpdates(conshdlr);
2548
2549 /* start timing */
2550 SCIPclockStart(conshdlr->setuptime, set);
2551
2552 /* call external method */
2553 SCIP_CALL( conshdlr->consexit(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2554
2555 /* stop timing */
2556 SCIPclockStop(conshdlr->setuptime, set);
2557
2558 /* perform the cached constraint updates */
2559 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2560 }
2561 conshdlr->initialized = FALSE;
2562
2563 return SCIP_OKAY;
2564}
2565
2566/** informs constraint handler that the presolving process is being started */
2568 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2569 BMS_BLKMEM* blkmem, /**< block memory */
2570 SCIP_SET* set, /**< global SCIP settings */
2571 SCIP_STAT* stat /**< dynamic problem statistics */
2572 )
2573{
2574 assert(conshdlr != NULL);
2575 assert(set != NULL);
2576
2577 /* reset conshdlr last presolved data in case of a restart */
2578 conshdlr->lastpropdomchgcount = -1;
2579 conshdlr->lastenfolpdomchgcount = -1;
2580 conshdlr->lastenfopsdomchgcount = -1;
2581 conshdlr->lastenforelaxdomchgcount = -1;
2582 conshdlr->lastenforelaxrelaxcount = -1;
2583 conshdlr->lastenfolpnode = -1;
2584 conshdlr->lastenfopsnode = -1;
2585 conshdlr->lastenfolpresult = SCIP_DIDNOTRUN;
2586 conshdlr->lastenfopsresult = SCIP_DIDNOTRUN;
2588 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2589 conshdlr->startnactiveconss = 0;
2590 conshdlr->lastsepalpcount = -1;
2591 conshdlr->lastenfolplpcount = -1;
2592 conshdlr->lastnusefulpropconss = 0;
2593 conshdlr->lastnusefulsepaconss = 0;
2594 conshdlr->lastnusefulenfoconss = 0;
2595 conshdlr->lastnfixedvars = 0;
2596 conshdlr->lastnaggrvars = 0;
2597 conshdlr->lastnchgvartypes = 0;
2598 conshdlr->lastnchgbds = 0;
2599 conshdlr->lastnaddholes = 0;
2600 conshdlr->lastndelconss = 0;
2601 conshdlr->lastnaddconss = 0;
2602 conshdlr->lastnupgdconss = 0;
2603 conshdlr->lastnchgcoefs = 0;
2604 conshdlr->lastnchgsides = 0;
2605 conshdlr->propwasdelayed = FALSE;
2606
2607 /* call presolving initialization method of constraint handler */
2608 if( conshdlr->consinitpre != NULL )
2609 {
2610 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2611 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2612 * external method; to avoid this, these changes will be buffered and processed after the method call
2613 */
2614 conshdlrDelayUpdates(conshdlr);
2615
2616 /* start timing */
2617 SCIPclockStart(conshdlr->setuptime, set);
2618
2619 /* call external method */
2620 SCIP_CALL( conshdlr->consinitpre(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2621
2622 /* stop timing */
2623 SCIPclockStop(conshdlr->setuptime, set);
2624
2625 /* perform the cached constraint updates */
2626 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2627 }
2628
2629 /* after a restart the LP is empty but the initial constraints are not included in the initialconss array anymore;
2630 * we have to put them back into this array in order to obtain the correct initial root relaxation
2631 */
2632 if( stat->nruns >= 2 )
2633 {
2634 int c;
2635
2636 for( c = 0; c < conshdlr->nconss; ++c )
2637 {
2638 /**@todo should only active constraints be added to the initconss array? at least cons->active is asserted in
2639 * conshdlrAddInitcons(conshdlr, set, conshdlr->conss[c])
2640 */
2641 if( conshdlr->conss[c]->addarraypos >= 0 && !conshdlr->conss[c]->deleted &&
2642 conshdlr->conss[c]->initial && conshdlr->conss[c]->initconsspos == -1 )
2643 {
2644 SCIP_CALL( conshdlrAddInitcons(conshdlr, set, stat, conshdlr->conss[c]) );
2645 }
2646 }
2647 }
2648
2649 return SCIP_OKAY;
2650}
2651
2652/** informs constraint handler that the presolving is finished */
2654 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2655 BMS_BLKMEM* blkmem, /**< block memory */
2656 SCIP_SET* set, /**< global SCIP settings */
2657 SCIP_STAT* stat /**< dynamic problem statistics */
2658 )
2659{
2660 assert(conshdlr != NULL);
2661 assert(set != NULL);
2662
2663 /* call presolving deinitialization method of constraint handler */
2664 if( conshdlr->consexitpre != NULL )
2665 {
2666 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2667 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2668 * external method; to avoid this, these changes will be buffered and processed after the method call
2669 */
2670 conshdlrDelayUpdates(conshdlr);
2671
2672 /* start timing */
2673 SCIPclockStart(conshdlr->setuptime, set);
2674
2675 /* call external method */
2676 SCIP_CALL( conshdlr->consexitpre(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2677
2678 /* stop timing */
2679 SCIPclockStop(conshdlr->setuptime, set);
2680
2681 /* perform the cached constraint updates */
2682 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2683 }
2684
2685 /* update statistics */
2686 conshdlr->maxnactiveconss = conshdlr->nactiveconss;
2687 conshdlr->startnactiveconss = conshdlr->nactiveconss;
2688
2689 return SCIP_OKAY;
2690}
2691
2692/** informs constraint handler that the branch and bound process is being started */
2694 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2695 BMS_BLKMEM* blkmem, /**< block memory */
2696 SCIP_SET* set, /**< global SCIP settings */
2697 SCIP_STAT* stat /**< dynamic problem statistics */
2698 )
2699{
2700 assert(conshdlr != NULL);
2701 assert(set != NULL);
2702 assert(stat != NULL);
2703
2704 conshdlr->sepalpwasdelayed = FALSE;
2705 conshdlr->sepasolwasdelayed = FALSE;
2706
2707 /* call solving process initialization method of constraint handler */
2708 if( conshdlr->consinitsol != NULL )
2709 {
2710 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2711 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2712 * external method; to avoid this, these changes will be buffered and processed after the method call
2713 */
2714 conshdlrDelayUpdates(conshdlr);
2715
2716 /* start timing */
2717 SCIPclockStart(conshdlr->setuptime, set);
2718
2719 /* call external method */
2720 SCIP_CALL( conshdlr->consinitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
2721
2722 /* stop timing */
2723 SCIPclockStop(conshdlr->setuptime, set);
2724
2725 /* perform the cached constraint updates */
2726 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2727 }
2728
2729 return SCIP_OKAY;
2730}
2731
2732/** informs constraint handler that the branch and bound process data is being freed */
2734 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2735 BMS_BLKMEM* blkmem, /**< block memory */
2736 SCIP_SET* set, /**< global SCIP settings */
2737 SCIP_STAT* stat, /**< dynamic problem statistics */
2738 SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
2739 )
2740{
2741 assert(conshdlr != NULL);
2742 assert(set != NULL);
2743
2744 /* call solving process deinitialization method of constraint handler */
2745 if( conshdlr->consexitsol != NULL )
2746 {
2747 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2748 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2749 * external method; to avoid this, these changes will be buffered and processed after the method call
2750 */
2751 conshdlrDelayUpdates(conshdlr);
2752
2753 /* start timing */
2754 SCIPclockStart(conshdlr->setuptime, set);
2755
2756 /* call external method */
2757 SCIP_CALL( conshdlr->consexitsol(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss, restart) );
2758
2759 /* stop timing */
2760 SCIPclockStop(conshdlr->setuptime, set);
2761
2762 /* perform the cached constraint updates */
2763 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2764 }
2765
2766 return SCIP_OKAY;
2767}
2768
2769/** calls LP initialization method of constraint handler to separate all initial active constraints */
2771 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2772 BMS_BLKMEM* blkmem, /**< block memory */
2773 SCIP_SET* set, /**< global SCIP settings */
2774 SCIP_STAT* stat, /**< dynamic problem statistics */
2775 SCIP_TREE* tree, /**< branch and bound tree */
2776 SCIP_Bool initkeptconss, /**< Also initialize constraints which are valid at a more global node,
2777 * but were not activated there? Should be FALSE for repeated calls at
2778 * one node or if the current focusnode is a child of the former one */
2779 SCIP_Bool* cutoff /**< pointer to store whether infeasibility was detected while building the LP */
2780 )
2781{
2782 assert(conshdlr != NULL);
2783 assert(cutoff != NULL);
2784#ifdef MORE_DEBUG
2785 assert(stat->nnodes > 1 || conshdlr->ninitconsskept == 0 || SCIPtreeProbing(tree));
2786#endif
2787
2788 *cutoff = FALSE;
2789
2790 if( conshdlr->consinitlp != NULL )
2791 {
2792 int currentdepth;
2793 int oldninitconss;
2794 int c;
2795
2796 SCIPsetDebugMsg(set, "initializing LP with %d initial constraints of handler <%s> (ninitconss=%d, kept=%d, initkept=%u)\n",
2797 initkeptconss ? conshdlr->ninitconss : conshdlr->ninitconss - conshdlr->ninitconsskept, conshdlr->name,
2798 conshdlr->ninitconss, conshdlr->ninitconsskept, initkeptconss);
2799
2800 /* no constraints to initialize (or only kept constraints which do not need to be initialized this time) -> return */
2801 if( conshdlr->needscons && (conshdlr->ninitconss == 0 || (!initkeptconss && conshdlr->ninitconss == conshdlr->ninitconsskept)) )
2802 return SCIP_OKAY;
2803
2804 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2805 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2806 * external method; to avoid this, these changes will be buffered and processed after the method call
2807 */
2808 conshdlrDelayUpdates(conshdlr);
2809
2810 oldninitconss = conshdlr->ninitconss;
2811
2812 /* start timing */
2813 SCIPclockStart(conshdlr->sepatime, set);
2814
2815 if( initkeptconss )
2816 {
2817 /* add all kept initial constraints which are currently active to the second part of the initconss array */
2818 /* @todo keep track of where a constraint was already initialized (e.g., in the conssetchg)? */
2819 for( c = 0; c < conshdlr->ninitconsskept; ++c )
2820 {
2821 assert(conshdlr->initconss[c]->initconsspos == c);
2822
2823 if( SCIPconsIsActive(conshdlr->initconss[c]) )
2824 {
2825 SCIP_CALL( conshdlrAddInitcons(conshdlr, set, stat, conshdlr->initconss[c]) );
2826 }
2827 }
2828 }
2829
2830 /* call external method */
2831 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &conshdlr->initconss[conshdlr->ninitconsskept],
2832 conshdlr->ninitconss - conshdlr->ninitconsskept, cutoff) );
2833
2834 /* stop timing */
2835 SCIPclockStop(conshdlr->sepatime, set);
2836
2837 /* perform the cached constraint updates */
2838 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2839
2840 currentdepth = SCIPtreeGetCurrentDepth(tree);
2841 assert(currentdepth >= 0);
2842
2843 /* clear the initconss array */
2844 for( c = conshdlr->ninitconsskept; c < oldninitconss; ++c )
2845 {
2846 assert(SCIPconsGetActiveDepth(conshdlr->initconss[c]) >= -1);
2847 assert(SCIPconsGetActiveDepth(conshdlr->initconss[c]) <= currentdepth);
2848
2849 /* if the constraint was not initialized at its valid node, we keep it */
2850 if( currentdepth > 0 ? SCIPconsGetActiveDepth(conshdlr->initconss[c]) != currentdepth :
2851 SCIPconsGetActiveDepth(conshdlr->initconss[c]) > 0 )
2852 {
2853 conshdlr->initconss[conshdlr->ninitconsskept] = conshdlr->initconss[c];
2854 conshdlr->initconss[conshdlr->ninitconsskept]->initconsspos = conshdlr->ninitconsskept;
2855 ++(conshdlr->ninitconsskept);
2856 }
2857 else
2858 conshdlr->initconss[c]->initconsspos = -1;
2859 }
2860#ifndef NDEBUG
2861 for( ; c < conshdlr->ninitconss; ++c )
2862 assert(conshdlr->initconss[c]->initconsspos < conshdlr->ninitconsskept);
2863#endif
2864 conshdlr->ninitconss = conshdlr->ninitconsskept;
2865
2866 if( conshdlr->ninitconss == 0 )
2867 {
2869 conshdlr->initconsssize = 0;
2870 }
2871 }
2872
2873 return SCIP_OKAY;
2874}
2875
2876/** calls separator method of constraint handler to separate LP solution */
2878 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
2879 BMS_BLKMEM* blkmem, /**< block memory */
2880 SCIP_SET* set, /**< global SCIP settings */
2881 SCIP_STAT* stat, /**< dynamic problem statistics */
2882 SCIP_SEPASTORE* sepastore, /**< separation storage */
2883 int depth, /**< depth of current node */
2884 SCIP_Bool execdelayed, /**< execute separation method even if it is marked to be delayed */
2885 SCIP_RESULT* result /**< pointer to store the result of the callback method */
2886 )
2887{
2888 assert(conshdlr != NULL);
2889 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
2890 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
2891 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
2892 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
2893 assert(stat != NULL);
2894 assert(conshdlr->lastsepalpcount != stat->lpcount
2895 || (0 <= conshdlr->lastnusefulsepaconss && conshdlr->lastnusefulsepaconss <= conshdlr->nusefulsepaconss));
2896 assert(set != NULL);
2897 assert(result != NULL);
2898
2899 *result = SCIP_DIDNOTRUN;
2900
2901 if( conshdlr->conssepalp != NULL
2902 && ((depth == 0 && conshdlr->sepafreq == 0)
2903 || (conshdlr->sepafreq > 0 && depth % conshdlr->sepafreq == 0)
2904 || conshdlr->sepalpwasdelayed) )
2905 {
2906 /* check, if separation method should be delayed */
2907 if( !conshdlr->delaysepa || execdelayed )
2908 {
2909 int nconss;
2910 int nusefulconss;
2911 int firstcons;
2912
2913 /* check, if this LP solution was already separated */
2914 if( conshdlr->lastsepalpcount == stat->lpcount )
2915 {
2916 /* all constraints that were not yet separated on the new LP solution must be useful constraints, which means,
2917 * that the new constraints are the last constraints of the useful ones
2918 */
2919 nconss = conshdlr->nusefulsepaconss - conshdlr->lastnusefulsepaconss;
2920 nusefulconss = nconss;
2921 firstcons = conshdlr->lastnusefulsepaconss;
2922 }
2923 else
2924 {
2925 /* on a new LP solution, we want to separate all constraints */
2926 nconss = conshdlr->nsepaconss;
2927 nusefulconss = conshdlr->nusefulsepaconss;
2928 firstcons = 0;
2929 }
2930 assert(firstcons >= 0);
2931 assert(firstcons + nconss <= conshdlr->nsepaconss);
2932 assert(nusefulconss <= nconss);
2933
2934 /* constraint handlers without constraints should only be called once */
2935 if( nconss > 0 || (!conshdlr->needscons && conshdlr->lastsepalpcount != stat->lpcount) )
2936 {
2937 SCIP_CONS** conss;
2938 SCIP_Longint oldndomchgs;
2939 SCIP_Longint oldnprobdomchgs;
2940 SCIP_Longint lastsepalpcount;
2941 int oldncuts;
2942 int oldnactiveconss;
2943 int lastnusefulsepaconss;
2944
2945 SCIPsetDebugMsg(set, "separating constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
2946 firstcons, firstcons + nconss - 1, conshdlr->nsepaconss, conshdlr->name,
2947 conshdlr->lastsepalpcount == stat->lpcount ? "old" : "new");
2948
2949 /* remember the number of processed constraints on the current LP solution */
2950 lastsepalpcount = stat->lpcount;
2951 lastnusefulsepaconss = conshdlr->nusefulsepaconss;
2952
2953 /* get the array of the constraints to be processed */
2954 conss = &(conshdlr->sepaconss[firstcons]);
2955
2956 oldndomchgs = stat->nboundchgs + stat->nholechgs;
2957 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
2958 oldncuts = SCIPsepastoreGetNCuts(sepastore);
2959 oldnactiveconss = stat->nactiveconss;
2960
2961 /* check, if we want to use eager evaluation */
2962 if( (conshdlr->eagerfreq == 0 && conshdlr->nsepacalls == 0)
2963 || (conshdlr->eagerfreq > 0 && conshdlr->nsepacalls % conshdlr->eagerfreq == 0) )
2964 nusefulconss = nconss;
2965
2966 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
2967 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
2968 * external method; to avoid this, these changes will be buffered and processed after the method call
2969 */
2970 conshdlrDelayUpdates(conshdlr);
2971 conshdlr->duringsepa = TRUE;
2972
2973 /* start timing */
2974 SCIPclockStart(conshdlr->sepatime, set);
2975
2976 /* call external method */
2977 SCIP_CALL( conshdlr->conssepalp(set->scip, conshdlr, conss, nconss, nusefulconss, result) );
2978 SCIPsetDebugMsg(set, " -> separating LP returned result <%d>\n", *result);
2979
2980 /* stop timing */
2981 SCIPclockStop(conshdlr->sepatime, set);
2982
2983 /* perform the cached constraint updates */
2984 conshdlr->duringsepa = FALSE;
2985 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
2986
2987 /* update statistics */
2988 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
2989 {
2990 conshdlr->lastsepalpcount = lastsepalpcount;
2991 conshdlr->lastnusefulsepaconss = MIN(lastnusefulsepaconss, conshdlr->nusefulsepaconss);
2992 conshdlr->nsepacalls++;
2993 }
2994 if( *result == SCIP_CUTOFF )
2995 conshdlr->ncutoffs++;
2996 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
2997 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
2998
2999 /* update domain reductions; therefore remove the domain
3000 * reduction counts which were generated in probing mode */
3001 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3002 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3003
3004 /* evaluate result */
3005 if( *result != SCIP_CUTOFF
3006 && *result != SCIP_CONSADDED
3007 && *result != SCIP_REDUCEDDOM
3008 && *result != SCIP_SEPARATED
3009 && *result != SCIP_NEWROUND
3010 && *result != SCIP_DIDNOTFIND
3011 && *result != SCIP_DIDNOTRUN
3012 && *result != SCIP_DELAYED )
3013 {
3014 SCIPerrorMessage("LP separation method of constraint handler <%s> returned invalid result <%d>\n",
3015 conshdlr->name, *result);
3016 return SCIP_INVALIDRESULT;
3017 }
3018 }
3019 }
3020 else
3021 {
3022 SCIPsetDebugMsg(set, "LP separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3023 *result = SCIP_DELAYED;
3024 }
3025
3026 /* remember whether separation method was delayed */
3027 conshdlr->sepalpwasdelayed = (*result == SCIP_DELAYED);
3028 }
3029
3030 return SCIP_OKAY;
3031}
3032
3033/** calls separator method of constraint handler to separate given primal solution */
3035 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3036 BMS_BLKMEM* blkmem, /**< block memory */
3037 SCIP_SET* set, /**< global SCIP settings */
3038 SCIP_STAT* stat, /**< dynamic problem statistics */
3039 SCIP_SEPASTORE* sepastore, /**< separation storage */
3040 SCIP_SOL* sol, /**< primal solution that should be separated */
3041 int depth, /**< depth of current node */
3042 SCIP_Bool execdelayed, /**< execute separation method even if it is marked to be delayed */
3043 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3044 )
3045{
3046 assert(conshdlr != NULL);
3047 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3048 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3049 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3050 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3051 assert(set != NULL);
3052 assert(stat != NULL);
3053 assert(result != NULL);
3054
3055 *result = SCIP_DIDNOTRUN;
3056
3057 if( conshdlr->conssepasol != NULL
3058 && ((depth == 0 && conshdlr->sepafreq == 0)
3059 || (conshdlr->sepafreq > 0 && depth % conshdlr->sepafreq == 0)
3060 || conshdlr->sepasolwasdelayed) )
3061 {
3062 /* check, if separation method should be delayed */
3063 if( !conshdlr->delaysepa || execdelayed )
3064 {
3065 int nconss;
3066 int nusefulconss;
3067
3068 /* always separate all constraints */
3069 nconss = conshdlr->nsepaconss;
3070 nusefulconss = conshdlr->nusefulsepaconss;
3071 assert(nusefulconss <= nconss);
3072
3073 if( nconss > 0 || !conshdlr->needscons )
3074 {
3075 SCIP_CONS** conss;
3076 SCIP_Longint oldndomchgs;
3077 SCIP_Longint oldnprobdomchgs;
3078 int oldncuts;
3079 int oldnactiveconss;
3080
3081 SCIPsetDebugMsg(set, "separating %d constraints of handler <%s> (primal solution %p)\n",
3082 nconss, conshdlr->name, (void*)sol);
3083
3084 /* get the array of the constraints to be processed */
3085 conss = conshdlr->sepaconss;
3086
3087 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3088 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3089 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3090 oldnactiveconss = stat->nactiveconss;
3091
3092 /* check, if we want to use eager evaluation */
3093 if( (conshdlr->eagerfreq == 0 && conshdlr->nsepacalls == 0)
3094 || (conshdlr->eagerfreq > 0 && conshdlr->nsepacalls % conshdlr->eagerfreq == 0) )
3095 nusefulconss = nconss;
3096
3097 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3098 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3099 * external method; to avoid this, these changes will be buffered and processed after the method call
3100 */
3101 conshdlrDelayUpdates(conshdlr);
3102 conshdlr->duringsepa = TRUE;
3103
3104 /* start timing */
3105 SCIPclockStart(conshdlr->sepatime, set);
3106
3107 /* call external method */
3108 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, conss, nconss, nusefulconss, sol, result) );
3109 SCIPsetDebugMsg(set, " -> separating sol returned result <%d>\n", *result);
3110
3111 /* stop timing */
3112 SCIPclockStop(conshdlr->sepatime, set);
3113
3114 /* perform the cached constraint updates */
3115 conshdlr->duringsepa = FALSE;
3116 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3117
3118 /* update statistics */
3119 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
3120 conshdlr->nsepacalls++;
3121 if( *result == SCIP_CUTOFF )
3122 conshdlr->ncutoffs++;
3123 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3124 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3125
3126 /* update domain reductions; therefore remove the domain
3127 * reduction counts which were generated in probing mode */
3128 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3129 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3130
3131 /* evaluate result */
3132 if( *result != SCIP_CUTOFF
3133 && *result != SCIP_CONSADDED
3134 && *result != SCIP_REDUCEDDOM
3135 && *result != SCIP_SEPARATED
3136 && *result != SCIP_NEWROUND
3137 && *result != SCIP_DIDNOTFIND
3138 && *result != SCIP_DIDNOTRUN
3139 && *result != SCIP_DELAYED )
3140 {
3141 SCIPerrorMessage("SOL separation method of constraint handler <%s> returned invalid result <%d>\n",
3142 conshdlr->name, *result);
3143 return SCIP_INVALIDRESULT;
3144 }
3145 }
3146 }
3147 else
3148 {
3149 SCIPsetDebugMsg(set, "SOL separation method of constraint handler <%s> was delayed\n", conshdlr->name);
3150 *result = SCIP_DELAYED;
3151 }
3152
3153 /* remember whether separation method was delayed */
3154 conshdlr->sepasolwasdelayed = (*result == SCIP_DELAYED);
3155 }
3156
3157 return SCIP_OKAY;
3158}
3159
3160/** calls enforcing method of constraint handler for a relaxation solution for all constraints added after last
3161 * conshdlrResetEnfo() call
3162 */
3164 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3165 BMS_BLKMEM* blkmem, /**< block memory */
3166 SCIP_SET* set, /**< global SCIP settings */
3167 SCIP_STAT* stat, /**< dynamic problem statistics */
3168 SCIP_TREE* tree, /**< branch and bound tree */
3169 SCIP_SEPASTORE* sepastore, /**< separation storage */
3170 SCIP_SOL* relaxsol, /**< solution to be enforced */
3171 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3172 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3173 )
3174{
3175 int nconss;
3176 int nusefulconss;
3177 int firstcons;
3178 SCIP_Bool relaxchanged;
3179 SCIP_Bool lastinfeasible;
3180
3181 assert(conshdlr != NULL);
3182 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3183 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3184 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3185 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3186 assert(stat != NULL);
3187 assert(conshdlr->lastenfopsdomchgcount != stat->domchgcount
3188 || conshdlr->lastenfopsnode != stat->nnodes
3189 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3190 assert(set != NULL);
3191 assert(tree != NULL);
3192 assert(tree->nchildren == 0);
3193 assert(relaxsol != NULL);
3194 assert(result != NULL);
3195
3196 *result = SCIP_FEASIBLE;
3197
3198 /* check, if this relaxation solution was already enforced at this node
3199 * the integrality constraint handler always needs to be enforced for all constraints since external branching
3200 * candidates are cleared before each resolve
3201 */
3202 if( conshdlr->lastenforelaxrelaxcount == stat->relaxcount
3203 && conshdlr->lastenforelaxdomchgcount == stat->domchgcount
3204 && conshdlr->lastenforelaxnode == stat->nnodes
3205 && conshdlr->lastenforelaxresult != SCIP_CONSADDED
3206 && conshdlr->lastenforelaxresult != SCIP_SOLVELP
3207 && ( strcmp(conshdlr->name, "integral") != 0 )
3208 )
3209 {
3210 assert(conshdlr->lastenforelaxresult != SCIP_CUTOFF);
3211 assert(conshdlr->lastenforelaxresult != SCIP_BRANCHED);
3212 assert(conshdlr->lastenforelaxresult != SCIP_REDUCEDDOM);
3213 assert(conshdlr->lastenforelaxresult != SCIP_DIDNOTRUN);
3214
3215 /* if we already enforced the same relaxation solution at this node, we will only enforce new constraints in the
3216 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3217 * that an infeasibility in the last call is not lost because we only enforce new constraints
3218 */
3219 if( conshdlr->lastenforelaxresult == SCIP_INFEASIBLE )
3220 {
3221 *result = SCIP_INFEASIBLE;
3222 lastinfeasible = TRUE;
3223 }
3224 else
3225 lastinfeasible = FALSE;
3226
3227 /* all constraints that were not yet enforced on the new relaxation solution must be useful constraints, which means,
3228 * that the new constraints are the last constraints of the useful ones
3229 */
3230 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3231 nusefulconss = nconss;
3232 firstcons = conshdlr->lastnusefulenfoconss;
3233 relaxchanged = FALSE;
3234 }
3235 else
3236 {
3237 /* on a new relaxation solution or a new node, we want to enforce all constraints */
3238 nconss = conshdlr->nenfoconss;
3239 nusefulconss = conshdlr->nusefulenfoconss;
3240 firstcons = 0;
3241 relaxchanged = TRUE;
3242 lastinfeasible = FALSE;
3243 }
3244 assert(firstcons >= 0);
3245 assert(firstcons + nconss <= conshdlr->nenfoconss);
3246 assert(nusefulconss <= nconss);
3247
3248 /* constraint handlers without constraints should only be called once */
3249 if( nconss > 0 || (!conshdlr->needscons && relaxchanged) )
3250 {
3251 SCIP_CONS** conss = NULL;
3252 SCIP_Longint oldndomchgs;
3253 SCIP_Longint oldnprobdomchgs;
3254 int oldncuts;
3255 int oldnactiveconss;
3256
3257 assert(conshdlr->consenforelax != NULL);
3258
3259 SCIPdebugMessage("enforcing constraints %d to %d of %d constraints of handler <%s> (%s relaxation solution)\n",
3260 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, relaxchanged ? "new" : "old");
3261
3262 /* remember the number of processed constraints on the current relaxation solution */
3263 conshdlr->lastenforelaxrelaxcount = stat->relaxcount;
3264 conshdlr->lastenforelaxdomchgcount = stat->domchgcount;
3265 conshdlr->lastenforelaxnode = stat->nnodes;
3266 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3267
3268 /* get the array of the constraints to be processed */
3269 if( conshdlr->needscons )
3270 {
3271 assert(conshdlr->enfoconss != NULL);
3272 conss = conshdlr->enfoconss + firstcons;
3273 }
3274
3275 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3276 oldnactiveconss = stat->nactiveconss;
3277 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3278 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3279
3280 /* check, if we want to use eager evaluation */
3281 if( (conshdlr->eagerfreq == 0 && conshdlr->nenforelaxcalls == 0)
3282 || (conshdlr->eagerfreq > 0 && conshdlr->nenforelaxcalls % conshdlr->eagerfreq == 0) )
3283 nusefulconss = nconss;
3284
3285 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3286 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3287 * external method; to avoid this, these changes will be buffered and processed after the method call
3288 */
3289 conshdlrDelayUpdates(conshdlr);
3290
3291 /* start timing */
3292 SCIPclockStart(conshdlr->enforelaxtime, set);
3293
3294 /* call external method */
3295 SCIP_CALL( conshdlr->consenforelax(set->scip, relaxsol, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3296 SCIPdebugMessage(" -> enforcing returned result <%d>\n", *result);
3297
3298 /* stop timing */
3299 SCIPclockStop(conshdlr->enforelaxtime, set);
3300
3301 /* perform the cached constraint updates */
3302 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3303
3304 /* update statistics */
3305 conshdlr->nenforelaxcalls++;
3306 if( *result == SCIP_CUTOFF )
3307 conshdlr->ncutoffs++;
3308 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3309 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3310
3311 if( *result != SCIP_BRANCHED )
3312 {
3313 assert(tree->nchildren == 0);
3314
3315 /* update domain reductions; therefore remove the domain
3316 * reduction counts which were generated in probing mode */
3317 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3318 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3319 }
3320 else
3321 conshdlr->nchildren += tree->nchildren;
3322
3323 /* remember the result of the enforcement call */
3324 conshdlr->lastenforelaxresult = *result;
3325
3326 /* evaluate result */
3327 if( *result != SCIP_CUTOFF
3328 && *result != SCIP_CONSADDED
3329 && *result != SCIP_REDUCEDDOM
3330 && *result != SCIP_SEPARATED
3331 && *result != SCIP_BRANCHED
3332 && *result != SCIP_SOLVELP
3333 && *result != SCIP_INFEASIBLE
3334 && *result != SCIP_FEASIBLE )
3335 {
3336 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation solutions returned invalid result <%d>\n",
3337 conshdlr->name, *result);
3338 return SCIP_INVALIDRESULT;
3339 }
3340
3341 /* if the same relaxation solution was already enforced at this node, we only enforced new constraints this time;
3342 * if the enforelax call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3343 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3344 */
3345 if( lastinfeasible && *result == SCIP_FEASIBLE )
3346 *result = SCIP_INFEASIBLE;
3347 }
3348
3349 return SCIP_OKAY;
3350}
3351
3352/** calls enforcing method of constraint handler for LP solution for all constraints added after last
3353 * conshdlrResetEnfo() call
3354 */
3356 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3357 BMS_BLKMEM* blkmem, /**< block memory */
3358 SCIP_SET* set, /**< global SCIP settings */
3359 SCIP_STAT* stat, /**< dynamic problem statistics */
3360 SCIP_TREE* tree, /**< branch and bound tree */
3361 SCIP_SEPASTORE* sepastore, /**< separation storage */
3362 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3363 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3364 )
3365{
3366 assert(conshdlr != NULL);
3367 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3368 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3369 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3370 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3371 assert(stat != NULL);
3372 assert(conshdlr->lastenfolplpcount != stat->lpcount
3373 || conshdlr->lastenfolpdomchgcount != stat->domchgcount
3374 || conshdlr->lastenfolpnode != stat->nnodes
3375 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3376 assert(set != NULL);
3377 assert(tree != NULL);
3378 assert(tree->nchildren == 0);
3379 assert(result != NULL);
3380
3381 *result = SCIP_FEASIBLE;
3382
3383 if( conshdlr->consenfolp != NULL )
3384 {
3385 int nconss;
3386 int nusefulconss;
3387 int firstcons;
3388 SCIP_Bool lpchanged;
3389 SCIP_Bool lastinfeasible;
3390
3391 /* check, if this LP solution was already enforced at this node */
3392 if( conshdlr->lastenfolplpcount == stat->lpcount
3393 && conshdlr->lastenfolpdomchgcount == stat->domchgcount
3394 && conshdlr->lastenfolpnode == stat->nnodes
3395 && conshdlr->lastenfolpresult != SCIP_CONSADDED )
3396 {
3397 assert(conshdlr->lastenfolpresult == SCIP_FEASIBLE || conshdlr->lastenfolpresult == SCIP_INFEASIBLE
3398 || conshdlr->lastenfolpresult == SCIP_SEPARATED );
3399
3400 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3401 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3402 * that an infeasibility in the last call is not lost because we only enforce new constraints
3403 */
3404 if( conshdlr->lastenfolpresult == SCIP_FEASIBLE )
3405 lastinfeasible = FALSE;
3406 else
3407 {
3408 assert(conshdlr->lastenfolpresult == SCIP_INFEASIBLE || conshdlr->lastenfolpresult == SCIP_SEPARATED);
3409 *result = SCIP_INFEASIBLE;
3410 lastinfeasible = TRUE;
3411 }
3412
3413 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3414 * that the new constraints are the last constraints of the useful ones
3415 */
3416 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3417 nusefulconss = nconss;
3418 firstcons = conshdlr->lastnusefulenfoconss;
3419 lpchanged = FALSE;
3420 }
3421 else
3422 {
3423 /* on a new LP solution or a new node, we want to enforce all constraints */
3424 nconss = conshdlr->nenfoconss;
3425 nusefulconss = conshdlr->nusefulenfoconss;
3426 firstcons = 0;
3427 lpchanged = TRUE;
3428 lastinfeasible = FALSE;
3429 }
3430 assert(firstcons >= 0);
3431 assert(firstcons + nconss <= conshdlr->nenfoconss);
3432 assert(nusefulconss <= nconss);
3433
3434 /* constraint handlers without constraints should only be called once */
3435 if( nconss > 0 || (!conshdlr->needscons && lpchanged) )
3436 {
3437 SCIP_CONS** conss;
3438 SCIP_Longint oldndomchgs;
3439 SCIP_Longint oldnprobdomchgs;
3440 int oldncuts;
3441 int oldnactiveconss;
3442
3443 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s LP solution)\n",
3444 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, lpchanged ? "new" : "old");
3445
3446 /* remember the number of processed constraints on the current LP solution */
3447 conshdlr->lastenfolplpcount = stat->lpcount;
3448 conshdlr->lastenfolpdomchgcount = stat->domchgcount;
3449 conshdlr->lastenfolpnode = stat->nnodes;
3450 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3451
3452 /* get the array of the constraints to be processed */
3453 conss = nconss > 0 ? conshdlr->enfoconss + firstcons : NULL;
3454
3455 oldncuts = SCIPsepastoreGetNCuts(sepastore);
3456 oldnactiveconss = stat->nactiveconss;
3457 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3458 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3459
3460 /* check, if we want to use eager evaluation */
3461 if( (conshdlr->eagerfreq == 0 && conshdlr->nenfolpcalls == 0)
3462 || (conshdlr->eagerfreq > 0 && conshdlr->nenfolpcalls % conshdlr->eagerfreq == 0) )
3463 nusefulconss = nconss;
3464
3465 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3466 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3467 * external method; to avoid this, these changes will be buffered and processed after the method call
3468 */
3469 conshdlrDelayUpdates(conshdlr);
3470
3471 /* start timing */
3472 SCIPclockStart(conshdlr->enfolptime, set);
3473
3474 /* call external method */
3475 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, result) );
3476 SCIPsetDebugMsg(set, " -> enforcing returned result <%d>\n", *result);
3477
3478 /* stop timing */
3479 SCIPclockStop(conshdlr->enfolptime, set);
3480
3481 /* perform the cached constraint updates */
3482 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3483
3484 /* remember the result of the enforcement call */
3485 conshdlr->lastenfolpresult = *result;
3486
3487 /* update statistics */
3488 conshdlr->nenfolpcalls++;
3489 if( *result == SCIP_CUTOFF )
3490 conshdlr->ncutoffs++;
3491 conshdlr->ncutsfound += SCIPsepastoreGetNCuts(sepastore) - oldncuts; /*lint !e776*/
3492 conshdlr->nconssfound += MAX(stat->nactiveconss - oldnactiveconss, 0); /*lint !e776*/
3493 if( *result != SCIP_BRANCHED )
3494 {
3495 assert(tree->nchildren == 0);
3496
3497 /* update domain reductions; therefore remove the domain
3498 * reduction counts which were generated in probing mode */
3499 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3500 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3501 }
3502 else
3503 conshdlr->nchildren += tree->nchildren;
3504
3505 /* evaluate result */
3506 if( *result != SCIP_CUTOFF
3507 && *result != SCIP_CONSADDED
3508 && *result != SCIP_REDUCEDDOM
3509 && *result != SCIP_SEPARATED
3510 && *result != SCIP_SOLVELP
3511 && *result != SCIP_BRANCHED
3512 && *result != SCIP_INFEASIBLE
3513 && *result != SCIP_FEASIBLE )
3514 {
3515 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP solutions returned invalid result <%d>\n",
3516 conshdlr->name, *result);
3517 return SCIP_INVALIDRESULT;
3518 }
3519
3520 /* if the same LP solution was already enforced at this node, we only enforced new constraints this time;
3521 * if the enfolp call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3522 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3523 */
3524 if( lastinfeasible && *result == SCIP_FEASIBLE )
3525 *result = SCIP_INFEASIBLE;
3526 }
3527 }
3528
3529 return SCIP_OKAY;
3530}
3531
3532/** calls diving solution enforcement callback of constraint handler, if it exists */
3534 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3535 SCIP_SET* set, /**< global SCIP settings */
3536 SCIP_DIVESET* diveset, /**< diving settings to control scoring */
3537 SCIP_SOL* sol, /**< current solution of diving mode */
3538 SCIP_Bool* success, /**< pointer to store whether constraint handler successfully found a variable */
3539 SCIP_Bool* infeasible /**< pointer to store whether the current node was detected to be infeasible */
3540 )
3541{
3542 assert(conshdlr != NULL);
3543 assert(set != NULL);
3544 assert(diveset != NULL);
3545 assert(sol != NULL);
3546 assert(success != NULL);
3547 assert(infeasible != NULL);
3548
3549 if( conshdlr->consgetdivebdchgs != NULL )
3550 {
3551 SCIP_CALL( conshdlr->consgetdivebdchgs(set->scip, conshdlr, diveset, sol, success, infeasible) );
3552 }
3553
3554 return SCIP_OKAY;
3555}
3556
3557/** calls enforcing method of constraint handler for pseudo solution for all constraints added after last
3558 * conshdlrResetEnfo() call
3559 */
3561 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3562 BMS_BLKMEM* blkmem, /**< block memory */
3563 SCIP_SET* set, /**< global SCIP settings */
3564 SCIP_STAT* stat, /**< dynamic problem statistics */
3565 SCIP_TREE* tree, /**< branch and bound tree */
3566 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
3567 SCIP_Bool solinfeasible, /**< was the solution already found out to be infeasible? */
3568 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
3569 SCIP_Bool forced, /**< should enforcement of pseudo solution be forced? */
3570 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3571 )
3572{
3573 assert(conshdlr != NULL);
3574 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3575 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3576 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3577 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3578 assert(stat != NULL);
3579 assert(conshdlr->lastenfopsdomchgcount != stat->domchgcount
3580 || conshdlr->lastenfopsnode != stat->nnodes
3581 || (0 <= conshdlr->lastnusefulenfoconss && conshdlr->lastnusefulenfoconss <= conshdlr->nusefulenfoconss));
3582 assert(set != NULL);
3583 assert(tree != NULL);
3584 assert(tree->nchildren == 0);
3585 assert(result != NULL);
3586
3587 /* no enforcing of pseudo solution */
3588 if( set->cons_disableenfops && SCIPbranchcandGetNPseudoCands(branchcand) > 0 )
3589 {
3590 *result = SCIP_INFEASIBLE;
3591 return SCIP_OKAY;
3592 }
3593
3594 *result = SCIP_FEASIBLE;
3595 if( conshdlr->consenfops != NULL )
3596 {
3597 int nconss;
3598 int nusefulconss;
3599 int firstcons;
3600 SCIP_Bool pschanged;
3601 SCIP_Bool lastinfeasible;
3602
3603 /* check, if this pseudo solution was already enforced at this node */
3604 if( !forced && conshdlr->lastenfopsdomchgcount == stat->domchgcount
3605 && conshdlr->lastenfopsnode == stat->nnodes
3606 && conshdlr->lastenfopsresult != SCIP_CONSADDED
3607 && conshdlr->lastenfopsresult != SCIP_SOLVELP
3608 )
3609 {
3610 assert(conshdlr->lastenfopsresult != SCIP_CUTOFF);
3611 assert(conshdlr->lastenfopsresult != SCIP_BRANCHED);
3612 assert(conshdlr->lastenfopsresult != SCIP_REDUCEDDOM);
3613 assert(conshdlr->lastenfopsresult != SCIP_DIDNOTRUN || objinfeasible);
3614
3615 /* if we already enforced the same pseudo solution at this node, we will only enforce new constraints in the
3616 * following; however, the result of the last call for the old constraint is still valid and we have to ensure
3617 * that an infeasibility in the last call is not lost because we only enforce new constraints
3618 */
3619 if( conshdlr->lastenfopsresult == SCIP_INFEASIBLE )
3620 {
3621 *result = SCIP_INFEASIBLE;
3622 lastinfeasible = TRUE;
3623 }
3624 else
3625 lastinfeasible = FALSE;
3626
3627 /* all constraints that were not yet enforced on the new LP solution must be useful constraints, which means,
3628 * that the new constraints are the last constraints of the useful ones
3629 */
3630 nconss = conshdlr->nusefulenfoconss - conshdlr->lastnusefulenfoconss;
3631 nusefulconss = nconss;
3632 firstcons = conshdlr->lastnusefulenfoconss;
3633 pschanged = FALSE;
3634 }
3635 else
3636 {
3637 /* on a new pseudo solution or a new node, we want to enforce all constraints */
3638 nconss = conshdlr->nenfoconss;
3639 nusefulconss = conshdlr->nusefulenfoconss;
3640 firstcons = 0;
3641 pschanged = TRUE;
3642 lastinfeasible = FALSE;
3643 }
3644 assert(firstcons >= 0);
3645 assert(firstcons + nconss <= conshdlr->nenfoconss);
3646 assert(nusefulconss <= nconss);
3647
3648 /* constraint handlers without constraints should only be called once */
3649 if( nconss > 0 || (!conshdlr->needscons && pschanged) )
3650 {
3651 SCIP_CONS** conss = NULL;
3652 SCIP_Longint oldndomchgs;
3653 SCIP_Longint oldnprobdomchgs;
3654
3655 SCIPsetDebugMsg(set, "enforcing constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, objinfeasible=%u)\n",
3656 firstcons, firstcons + nconss - 1, conshdlr->nenfoconss, conshdlr->name, pschanged ? "new" : "old", objinfeasible);
3657
3658 /* remember the number of processed constraints on the current pseudo solution */
3659 conshdlr->lastenfopsdomchgcount = stat->domchgcount;
3660 conshdlr->lastenfopsnode = stat->nnodes;
3661 conshdlr->lastnusefulenfoconss = conshdlr->nusefulenfoconss;
3662
3663 /* get the array of the constraints to be processed */
3664 if( conshdlr->needscons )
3665 {
3666 assert(conshdlr->enfoconss != NULL);
3667 conss = conshdlr->enfoconss + firstcons;
3668 }
3669
3670 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3671 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3672
3673 /* check, if we want to use eager evaluation */
3674 if( (conshdlr->eagerfreq == 0 && conshdlr->nenfopscalls == 0)
3675 || (conshdlr->eagerfreq > 0 && conshdlr->nenfopscalls % conshdlr->eagerfreq == 0) )
3676 nusefulconss = nconss;
3677
3678 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3679 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3680 * external method; to avoid this, these changes will be buffered and processed after the method call
3681 */
3682 conshdlrDelayUpdates(conshdlr);
3683
3684 /* start timing */
3685 SCIPclockStart(conshdlr->enfopstime, set);
3686
3687 /* call external method */
3688 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, conss, nconss, nusefulconss, solinfeasible, objinfeasible, result) );
3689 SCIPsetDebugMsg(set, " -> enforcing returned result <%d>\n", *result);
3690
3691 /* stop timing */
3692 SCIPclockStop(conshdlr->enfopstime, set);
3693
3694 /* perform the cached constraint updates */
3695 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3696
3697 /* update statistics */
3698 if( *result != SCIP_DIDNOTRUN )
3699 conshdlr->nenfopscalls++;
3700 else if( !objinfeasible )
3701 {
3702 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions was skipped, even though the solution was not objective-infeasible\n",
3703 conshdlr->name);
3704 conshdlr->lastenfopsresult = *result;
3705
3706 return SCIP_INVALIDRESULT;
3707 }
3708 /* A constraint handler might return SCIP_DIDNOTRUN and not check any constraints in case objinfeasible was
3709 * TRUE; we change the result pointer to SCIP_INFEASIBLE in this case.
3710 */
3711 else
3712 *result = SCIP_INFEASIBLE;
3713
3714 if( *result == SCIP_CUTOFF )
3715 conshdlr->ncutoffs++;
3716
3717 if( *result != SCIP_BRANCHED )
3718 {
3719 assert(tree->nchildren == 0);
3720
3721 /* update domain reductions; therefore remove the domain
3722 * reduction counts which were generated in probing mode */
3723 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3724 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3725 }
3726 else
3727 conshdlr->nchildren += tree->nchildren;
3728
3729 /* remember the result of the enforcement call */
3730 conshdlr->lastenfopsresult = *result;
3731
3732 /* evaluate result */
3733 if( *result != SCIP_CUTOFF
3734 && *result != SCIP_CONSADDED
3735 && *result != SCIP_REDUCEDDOM
3736 && *result != SCIP_BRANCHED
3737 && *result != SCIP_SOLVELP
3738 && *result != SCIP_INFEASIBLE
3739 && *result != SCIP_FEASIBLE
3740 && *result != SCIP_DIDNOTRUN )
3741 {
3742 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
3743 conshdlr->name, *result);
3744 return SCIP_INVALIDRESULT;
3745 }
3746
3747 /* if the same pseudo solution was already enforced at this node, we only enforced new constraints this time;
3748 * if the enfops call returns feasible now, the solution is only feasible w.r.t. the new constraints, if the
3749 * last call detected infeasibility for the old constraints, we have to change the result to infeasible
3750 */
3751 if( lastinfeasible && *result == SCIP_FEASIBLE )
3752 *result = SCIP_INFEASIBLE;
3753 }
3754 else if( objinfeasible )
3755 {
3756 /*
3757 * Even if nothing is enforced, the solution might still be infeasible due to violating lower bound.
3758 * Make sure the result is updated in this case as well.
3759 */
3760 *result = SCIP_INFEASIBLE;
3761 }
3762 }
3763
3764 return SCIP_OKAY;
3765}
3766
3767/** calls feasibility check method of constraint handler */
3769 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3770 BMS_BLKMEM* blkmem, /**< block memory */
3771 SCIP_SET* set, /**< global SCIP settings */
3772 SCIP_STAT* stat, /**< dynamic problem statistics */
3773 SCIP_SOL* sol, /**< primal CIP solution */
3774 SCIP_Bool checkintegrality, /**< Has integrality to be checked? */
3775 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
3776 SCIP_Bool printreason, /**< Should the reason for the violation be printed? */
3777 SCIP_Bool completely, /**< Should all violations be checked? */
3778 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3779 )
3780{
3781 assert(conshdlr != NULL);
3782 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3783 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3784 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3785 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3786 assert(set != NULL);
3787 assert(result != NULL);
3788
3789 *result = SCIP_FEASIBLE;
3790
3791 if( conshdlr->conscheck != NULL && (!conshdlr->needscons || conshdlr->ncheckconss > 0) )
3792 {
3793 SCIPsetDebugMsg(set, "checking %d constraints of handler <%s>\n", conshdlr->ncheckconss, conshdlr->name);
3794
3795 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3796 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3797 * external method; to avoid this, these changes will be buffered and processed after the method call
3798 */
3799 conshdlrDelayUpdates(conshdlr);
3800
3801 /* start timing */
3802 SCIPclockStart(conshdlr->checktime, set);
3803
3804 /* call external method */
3805 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, conshdlr->checkconss, conshdlr->ncheckconss,
3806 sol, checkintegrality, checklprows, printreason, completely, result) );
3807 SCIPsetDebugMsg(set, " -> checking returned result <%d>\n", *result);
3808
3809 /* stop timing */
3810 SCIPclockStop(conshdlr->checktime, set);
3811
3812 /* update statistics */
3813 conshdlr->ncheckcalls++;
3814
3815 /* perform the cached constraint updates */
3816 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3817
3818 /* evaluate result */
3819 if( *result != SCIP_INFEASIBLE && *result != SCIP_FEASIBLE )
3820 {
3821 SCIPerrorMessage("feasibility check of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name, *result);
3822 return SCIP_INVALIDRESULT;
3823 }
3824 }
3825
3826 return SCIP_OKAY;
3827}
3828
3829/** calls propagation method of constraint handler */
3831 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
3832 BMS_BLKMEM* blkmem, /**< block memory */
3833 SCIP_SET* set, /**< global SCIP settings */
3834 SCIP_STAT* stat, /**< dynamic problem statistics */
3835 int depth, /**< depth of current node */
3836 SCIP_Bool fullpropagation, /**< should all constraints be propagated (or only new ones)? */
3837 SCIP_Bool execdelayed, /**< execute propagation method even if it is marked to be delayed */
3838 SCIP_Bool instrongbranching, /**< are we currently doing strong branching? */
3839 SCIP_PROPTIMING proptiming, /**< current point in the node solving process */
3840 SCIP_RESULT* result /**< pointer to store the result of the callback method */
3841 )
3842{
3843 assert(conshdlr != NULL);
3844 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
3845 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
3846 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
3847 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
3848 assert(stat != NULL);
3849 assert(conshdlr->lastpropdomchgcount != stat->domchgcount
3850 || (0 <= conshdlr->lastnusefulpropconss && conshdlr->lastnusefulpropconss <= conshdlr->nusefulpropconss));
3851 assert(set != NULL);
3852 assert(depth >= 0);
3853 assert(result != NULL);
3854
3855 *result = SCIP_DIDNOTRUN;
3856
3857 if( conshdlr->consprop != NULL
3858 && (!conshdlr->needscons || conshdlr->npropconss > 0)
3859 && ((depth == 0 && conshdlr->propfreq == 0)
3860 || (conshdlr->propfreq > 0 && depth % conshdlr->propfreq == 0)
3861 || conshdlr->propwasdelayed) )
3862 {
3863 /* check, if propagation method should be delayed */
3864 if( !conshdlr->delayprop || execdelayed )
3865 {
3866 int nconss;
3867 int nusefulconss;
3868 int nmarkedpropconss;
3869 int firstcons;
3870
3871 /* check, if the current domains were already propagated */
3872 if( !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount && conshdlr->nmarkedpropconss == 0 )
3873 {
3874 /* all constraints that were not yet propagated on the new domains must be useful constraints, which means,
3875 * that the new constraints are the last constraints of the useful ones
3876 */
3877 nconss = conshdlr->nusefulpropconss - conshdlr->lastnusefulpropconss;
3878 nusefulconss = nconss;
3879 firstcons = conshdlr->lastnusefulpropconss;
3880 }
3881 else
3882 {
3883 /* on new domains, we want to propagate all constraints */
3884 nconss = conshdlr->npropconss;
3885 nusefulconss = conshdlr->nusefulpropconss;
3886 firstcons = 0;
3887 }
3888 assert(firstcons >= 0);
3889 assert(firstcons + nconss <= conshdlr->npropconss);
3890 assert(nusefulconss <= nconss);
3891
3892 nmarkedpropconss = conshdlr->nmarkedpropconss;
3893
3894 /* constraint handlers without constraints should only be called once */
3895 if( nconss > 0 || fullpropagation
3896 || (!conshdlr->needscons && conshdlr->lastpropdomchgcount != stat->domchgcount) )
3897 {
3898 SCIP_CONS** conss;
3899 SCIP_Longint oldndomchgs;
3900 SCIP_Longint oldnprobdomchgs;
3901 SCIP_Longint lastpropdomchgcount;
3902 int lastnusefulpropconss;
3903
3904 SCIPsetDebugMsg(set, "propagating constraints %d to %d of %d constraints of handler <%s> (%s pseudo solution, %d useful)\n",
3905 firstcons, firstcons + nconss - 1, conshdlr->npropconss, conshdlr->name,
3906 !fullpropagation && conshdlr->lastpropdomchgcount == stat->domchgcount ? "old" : "new", nusefulconss);
3907
3908 /* remember the number of processed constraints on the current domains */
3909 lastpropdomchgcount = stat->domchgcount;
3910 lastnusefulpropconss = conshdlr->nusefulpropconss;
3911
3912 /* get the array of the constraints to be processed */
3913 conss = nconss > 0 ? (conshdlr->propconss + firstcons) : NULL;
3914
3915 oldndomchgs = stat->nboundchgs + stat->nholechgs;
3916 oldnprobdomchgs = stat->nprobboundchgs + stat->nprobholechgs;
3917
3918 /* check, if we want to use eager evaluation */
3919 if( (conshdlr->eagerfreq == 0 && conshdlr->npropcalls == 0)
3920 || (conshdlr->eagerfreq > 0 && conshdlr->npropcalls % conshdlr->eagerfreq == 0) )
3921 nusefulconss = nconss;
3922
3923 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
3924 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
3925 * external method; to avoid this, these changes will be buffered and processed after the method call
3926 */
3927 conshdlrDelayUpdates(conshdlr);
3928 conshdlr->duringprop = TRUE;
3929
3930 /* start timing */
3931 if( instrongbranching )
3932 SCIPclockStart(conshdlr->sbproptime, set);
3933 else
3934 SCIPclockStart(conshdlr->proptime, set);
3935
3936 assert(nusefulconss <= nconss);
3937 assert(nmarkedpropconss <= nconss);
3938
3939 /* call external method */
3940 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, conss, nconss, nusefulconss, nmarkedpropconss, proptiming, result) );
3941 SCIPsetDebugMsg(set, " -> propagation returned result <%d>\n", *result);
3942
3943 /* stop timing */
3944 if( instrongbranching )
3945 SCIPclockStop(conshdlr->sbproptime, set);
3946 else
3947 SCIPclockStop(conshdlr->proptime, set);
3948
3949 /* perform the cached constraint updates */
3950 conshdlr->duringprop = FALSE;
3951 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
3952
3953 /* update statistics */
3954 if( *result != SCIP_DIDNOTRUN && *result != SCIP_DELAYED )
3955 {
3956 conshdlr->lastpropdomchgcount = lastpropdomchgcount;
3957 conshdlr->lastnusefulpropconss = MIN(conshdlr->nusefulpropconss, lastnusefulpropconss);
3958 conshdlr->npropcalls++;
3959 }
3960 else
3961 {
3962 assert(lastpropdomchgcount == stat->domchgcount);
3963 assert(lastnusefulpropconss == conshdlr->nusefulpropconss);
3964 }
3965 if( *result == SCIP_CUTOFF )
3966 conshdlr->ncutoffs++;
3967
3968 /* update domain reductions; therefore remove the domain
3969 * reduction counts which were generated in probing mode */
3970 conshdlr->ndomredsfound += stat->nboundchgs + stat->nholechgs - oldndomchgs;
3971 conshdlr->ndomredsfound -= (stat->nprobboundchgs + stat->nprobholechgs - oldnprobdomchgs);
3972
3973 /* check result code of callback method */
3974 if( *result != SCIP_CUTOFF
3975 && *result != SCIP_REDUCEDDOM
3976 && *result != SCIP_DIDNOTFIND
3977 && *result != SCIP_DIDNOTRUN
3978 && *result != SCIP_DELAYED
3979 && *result != SCIP_DELAYNODE )
3980 {
3981 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
3982 conshdlr->name, *result);
3983 return SCIP_INVALIDRESULT;
3984 }
3985 }
3986 }
3987 else
3988 {
3989 SCIPsetDebugMsg(set, "propagation method of constraint handler <%s> was delayed\n", conshdlr->name);
3990 *result = SCIP_DELAYED;
3991 }
3992
3993 /* remember whether propagation method was delayed */
3994 conshdlr->propwasdelayed = (*result == SCIP_DELAYED);
3995 }
3996
3997 return SCIP_OKAY;
3998}
3999
4000/** calls presolving method of constraint handler */
4002 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4003 BMS_BLKMEM* blkmem, /**< block memory */
4004 SCIP_SET* set, /**< global SCIP settings */
4005 SCIP_STAT* stat, /**< dynamic problem statistics */
4006 SCIP_PRESOLTIMING timing, /**< current presolving timing */
4007 int nrounds, /**< number of presolving rounds already done */
4008 int* nfixedvars, /**< pointer to total number of variables fixed of all presolvers */
4009 int* naggrvars, /**< pointer to total number of variables aggregated of all presolvers */
4010 int* nchgvartypes, /**< pointer to total number of variable type changes of all presolvers */
4011 int* nchgbds, /**< pointer to total number of variable bounds tightened of all presolvers */
4012 int* naddholes, /**< pointer to total number of domain holes added of all presolvers */
4013 int* ndelconss, /**< pointer to total number of deleted constraints of all presolvers */
4014 int* naddconss, /**< pointer to total number of added constraints of all presolvers */
4015 int* nupgdconss, /**< pointer to total number of upgraded constraints of all presolvers */
4016 int* nchgcoefs, /**< pointer to total number of changed coefficients of all presolvers */
4017 int* nchgsides, /**< pointer to total number of changed left/right hand sides of all presolvers */
4018 SCIP_RESULT* result /**< pointer to store the result of the callback method */
4019 )
4020{
4021 assert(conshdlr != NULL);
4022 assert(conshdlr->nusefulsepaconss <= conshdlr->nsepaconss);
4023 assert(conshdlr->nusefulenfoconss <= conshdlr->nenfoconss);
4024 assert(conshdlr->nusefulcheckconss <= conshdlr->ncheckconss);
4025 assert(conshdlr->nusefulpropconss <= conshdlr->npropconss);
4026 assert(set != NULL);
4027 assert(nfixedvars != NULL);
4028 assert(naggrvars != NULL);
4029 assert(nchgvartypes != NULL);
4030 assert(nchgbds != NULL);
4031 assert(naddholes != NULL);
4032 assert(ndelconss != NULL);
4033 assert(naddconss != NULL);
4034 assert(nupgdconss != NULL);
4035 assert(nchgcoefs != NULL);
4036 assert(nchgsides != NULL);
4037 assert(result != NULL);
4038
4039 *result = SCIP_DIDNOTRUN;
4040
4041 if( conshdlr->conspresol != NULL
4042 && (!conshdlr->needscons || conshdlr->nactiveconss > 0)
4043 && (conshdlr->maxprerounds == -1 || conshdlr->npresolcalls < conshdlr->maxprerounds ) )
4044 {
4045 SCIPsetDebugMsg(set, "presolving %d constraints of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4046
4047 /* check, if presolving method should be executed for the current timing */
4048 if( timing & conshdlr->presoltiming )
4049 {
4050 int nnewfixedvars;
4051 int nnewaggrvars;
4052 int nnewchgvartypes;
4053 int nnewchgbds;
4054 int nnewholes;
4055 int nnewdelconss;
4056 int nnewaddconss;
4057 int nnewupgdconss;
4058 int nnewchgcoefs;
4059 int nnewchgsides;
4060
4061 /* calculate the number of changes since last call */
4062 nnewfixedvars = *nfixedvars - conshdlr->lastnfixedvars;
4063 nnewaggrvars = *naggrvars - conshdlr->lastnaggrvars;
4064 nnewchgvartypes = *nchgvartypes - conshdlr->lastnchgvartypes;
4065 nnewchgbds = *nchgbds - conshdlr->lastnchgbds;
4066 nnewholes = *naddholes - conshdlr->lastnaddholes;
4067 nnewdelconss = *ndelconss - conshdlr->lastndelconss;
4068 nnewaddconss = *naddconss - conshdlr->lastnaddconss;
4069 nnewupgdconss = *nupgdconss - conshdlr->lastnupgdconss;
4070 nnewchgcoefs = *nchgcoefs - conshdlr->lastnchgcoefs;
4071 nnewchgsides = *nchgsides - conshdlr->lastnchgsides;
4072
4073 /* remember the old number of changes */
4074 conshdlr->lastnfixedvars = *nfixedvars;
4075 conshdlr->lastnaggrvars = *naggrvars;
4076 conshdlr->lastnchgvartypes = *nchgvartypes;
4077 conshdlr->lastnchgbds = *nchgbds;
4078 conshdlr->lastnaddholes = *naddholes;
4079 conshdlr->lastndelconss = *ndelconss;
4080 conshdlr->lastnaddconss = *naddconss;
4081 conshdlr->lastnupgdconss = *nupgdconss;
4082 conshdlr->lastnchgcoefs = *nchgcoefs;
4083 conshdlr->lastnchgsides = *nchgsides;
4084
4085 /* because during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4086 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4087 * external method; to avoid this, these changes will be buffered and processed after the method call
4088 */
4089 conshdlrDelayUpdates(conshdlr);
4090
4091 /* start timing */
4092 SCIPclockStart(conshdlr->presoltime, set);
4093
4094 /* call external method */
4095 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, conshdlr->conss, conshdlr->nactiveconss, nrounds, timing,
4096 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewholes,
4097 nnewdelconss, nnewaddconss, nnewupgdconss, nnewchgcoefs, nnewchgsides,
4098 nfixedvars, naggrvars, nchgvartypes, nchgbds, naddholes,
4099 ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
4100
4101 /* stop timing */
4102 SCIPclockStop(conshdlr->presoltime, set);
4103
4104 /* perform the cached constraint updates */
4105 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4106
4107 /* count the new changes */
4108 conshdlr->nfixedvars += *nfixedvars - conshdlr->lastnfixedvars;
4109 conshdlr->naggrvars += *naggrvars - conshdlr->lastnaggrvars;
4110 conshdlr->nchgvartypes += *nchgvartypes - conshdlr->lastnchgvartypes;
4111 conshdlr->nchgbds += *nchgbds - conshdlr->lastnchgbds;
4112 conshdlr->naddholes += *naddholes - conshdlr->lastnaddholes;
4113 conshdlr->ndelconss += *ndelconss - conshdlr->lastndelconss;
4114 conshdlr->naddconss += *naddconss - conshdlr->lastnaddconss;
4115 conshdlr->nupgdconss += *nupgdconss - conshdlr->lastnupgdconss;
4116 conshdlr->nchgcoefs += *nchgcoefs - conshdlr->lastnchgcoefs;
4117 conshdlr->nchgsides += *nchgsides - conshdlr->lastnchgsides;
4118
4119 /* check result code of callback method */
4120 if( *result != SCIP_CUTOFF
4121 && *result != SCIP_UNBOUNDED
4122 && *result != SCIP_SUCCESS
4123 && *result != SCIP_DIDNOTFIND
4124 && *result != SCIP_DIDNOTRUN
4125 && *result != SCIP_DELAYED )
4126 {
4127 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
4128 conshdlr->name, *result);
4129 return SCIP_INVALIDRESULT;
4130 }
4131
4132 /* increase the number of calls, if the presolving method tried to find reductions */
4133 if( *result != SCIP_DIDNOTRUN )
4134 ++(conshdlr->npresolcalls);
4135 }
4136
4137 SCIPsetDebugMsg(set, "after presolving %d constraints left of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4138 }
4139
4140 return SCIP_OKAY;
4141}
4142
4143/** calls variable deletion method of constraint handler */
4145 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4146 BMS_BLKMEM* blkmem, /**< block memory */
4147 SCIP_SET* set, /**< global SCIP settings */
4148 SCIP_STAT* stat /**< dynamic problem statistics */
4149 )
4150{
4151 assert(conshdlr != NULL);
4152 assert(set != NULL);
4153
4154 if( conshdlr->consdelvars != NULL )
4155 {
4156 SCIPsetDebugMsg(set, "deleting variables in constraints of handler <%s>\n", conshdlr->name);
4157
4158 /* during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4159 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4160 * external method; to avoid this, these changes will be buffered and processed after the method call
4161 */
4162 conshdlrDelayUpdates(conshdlr);
4163
4164 /* call external method */
4165 SCIP_CALL( conshdlr->consdelvars(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
4166
4167 /* perform the cached constraint updates */
4168 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4169 }
4170
4171 return SCIP_OKAY;
4172}
4173
4174/** locks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4176 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4177 SCIP_SET* set /**< global SCIP settings */
4178 )
4179{
4180 assert(conshdlr != NULL);
4181 assert(conshdlr->conslock != NULL);
4182 assert(!conshdlr->needscons);
4183
4184 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, +1, 0) );
4185
4186 return SCIP_OKAY;
4187}
4188
4189/** unlocks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4191 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4192 SCIP_SET* set /**< global SCIP settings */
4193 )
4194{
4195 assert(conshdlr != NULL);
4196 assert(conshdlr->conslock != NULL);
4197 assert(!conshdlr->needscons);
4198
4199 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, -1, 0) );
4200
4201 return SCIP_OKAY;
4202}
4203
4204/** gets name of constraint handler */
4206 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4207 )
4208{
4209 assert(conshdlr != NULL);
4210
4211 return conshdlr->name;
4212}
4213
4214/** gets description of constraint handler */
4216 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4217 )
4218{
4219 assert(conshdlr != NULL);
4220
4221 return conshdlr->desc;
4222}
4223
4224/** gets user data of constraint handler */
4226 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4227 )
4228{
4229 assert(conshdlr != NULL);
4230
4231 return conshdlr->conshdlrdata;
4232}
4233
4234/** sets user data of constraint handler; user has to free old data in advance! */
4236 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4237 SCIP_CONSHDLRDATA* conshdlrdata /**< new constraint handler user data */
4238 )
4239{
4240 assert(conshdlr != NULL);
4241
4242 conshdlr->conshdlrdata = conshdlrdata;
4243}
4244
4245/** sets all separation related callbacks of the constraint handler */
4247 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4248 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
4249 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
4250 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
4251 int sepapriority, /**< priority of the constraint handler for separation */
4252 SCIP_Bool delaysepa /**< should separation method be delayed, if other separators found cuts? */
4253 )
4254{
4255 assert(conshdlr != NULL);
4256
4257 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
4258
4259 conshdlr->conssepalp = conssepalp;
4260 conshdlr->conssepasol = conssepasol;
4261 conshdlr->sepafreq = sepafreq;
4262 conshdlr->sepapriority = sepapriority;
4263 conshdlr->delaysepa = delaysepa;
4264}
4265
4266/** sets both the propagation callback and the propagation frequency of the constraint handler */
4268 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4269 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
4270 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
4271 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
4272 SCIP_PROPTIMING timingmask /**< positions in the node solving loop where propagators should be executed */
4273 )
4274{
4275 assert(conshdlr != NULL);
4276
4277 assert(consprop != NULL || propfreq == -1);
4278
4279 conshdlr->consprop = consprop;
4280 conshdlr->propfreq = propfreq;
4281 conshdlr->delayprop = delayprop;
4282 conshdlr->proptiming = timingmask;
4283}
4284
4285/** sets copy method of both the constraint handler and each associated constraint */
4287 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4288 SCIP_DECL_CONSENFORELAX ((*consenforelax)) /**< constraint copying method */
4289 )
4290{
4291 assert(conshdlr != NULL);
4292
4293 conshdlr->consenforelax = consenforelax;
4294}
4295
4296/** sets copy method of both the constraint handler and each associated constraint */
4298 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4299 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
4300 SCIP_DECL_CONSCOPY ((*conscopy)) /**< constraint copying method */
4301 )
4302{
4303 assert(conshdlr != NULL);
4304
4305 assert(!conshdlr->needscons || (conshdlrcopy == NULL) == (conscopy == NULL));
4306
4307 conshdlr->conshdlrcopy = conshdlrcopy;
4308 conshdlr->conscopy = conscopy;
4309}
4310
4311/** sets destructor method of constraint handler */
4313 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4314 SCIP_DECL_CONSFREE ((*consfree)) /**< destructor of constraint handler */
4315 )
4316{
4317 assert(conshdlr != NULL);
4318
4319 conshdlr->consfree = consfree;
4320}
4321
4322/** sets initialization method of constraint handler */
4324 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4325 SCIP_DECL_CONSINIT ((*consinit)) /**< initialize constraint handler */
4326 )
4327{
4328 assert(conshdlr != NULL);
4329
4330 conshdlr->consinit = consinit;
4331}
4332
4333/** sets deinitialization method of constraint handler */
4335 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4336 SCIP_DECL_CONSEXIT ((*consexit)) /**< deinitialize constraint handler */
4337 )
4338{
4339 assert(conshdlr != NULL);
4340
4341 conshdlr->consexit = consexit;
4342}
4343
4344/** sets solving process initialization method of constraint handler */
4346 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4347 SCIP_DECL_CONSINITSOL((*consinitsol)) /**< solving process initialization method of constraint handler */
4348 )
4349{
4350 assert(conshdlr != NULL);
4351
4352 conshdlr->consinitsol = consinitsol;
4353}
4354
4355/** sets solving process deinitialization method of constraint handler */
4357 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4358 SCIP_DECL_CONSEXITSOL ((*consexitsol)) /**< solving process deinitialization method of constraint handler */
4359 )
4360{
4361 assert(conshdlr != NULL);
4362
4363 conshdlr->consexitsol = consexitsol;
4364}
4365
4366/** sets preprocessing initialization method of constraint handler */
4368 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4369 SCIP_DECL_CONSINITPRE((*consinitpre)) /**< preprocessing initialization method of constraint handler */
4370 )
4371{
4372 assert(conshdlr != NULL);
4373
4374 conshdlr->consinitpre = consinitpre;
4375}
4376
4377/** sets preprocessing deinitialization method of constraint handler */
4379 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4380 SCIP_DECL_CONSEXITPRE((*consexitpre)) /**< preprocessing deinitialization method of constraint handler */
4381 )
4382{
4383 assert(conshdlr != NULL);
4384
4385 conshdlr->consexitpre = consexitpre;
4386}
4387
4388/** sets presolving method of constraint handler */
4390 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4391 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method of constraint handler */
4392 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
4393 SCIP_PRESOLTIMING presoltiming /**< timing mask of the constraint handler's presolving method */
4394 )
4395{
4396 assert(conshdlr != NULL);
4397
4398 conshdlr->conspresol = conspresol;
4399 conshdlr->maxprerounds = maxprerounds;
4400
4401 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
4402 * error message
4403 */
4404 if( presoltiming < SCIP_PRESOLTIMING_FAST || presoltiming > SCIP_PRESOLTIMING_MAX )
4405 {
4406 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
4407 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", conshdlr->name);
4408
4410 }
4411
4412 conshdlr->presoltiming = presoltiming;
4413
4414 return SCIP_OKAY;
4415}
4416
4417/** sets method of constraint handler to free specific constraint data */
4419 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4420 SCIP_DECL_CONSDELETE ((*consdelete)) /**< free specific constraint data */
4421 )
4422{
4423 assert(conshdlr != NULL);
4424
4425 conshdlr->consdelete = consdelete;
4426}
4427
4428/** sets method of constraint handler to transform constraint data into data belonging to the transformed problem */
4430 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4431 SCIP_DECL_CONSTRANS ((*constrans)) /**< transform constraint data into data belonging to the transformed problem */
4432 )
4433{
4434 assert(conshdlr != NULL);
4435
4436 conshdlr->constrans = constrans;
4437}
4438
4439/** sets method of constraint handler to initialize LP with relaxations of "initial" constraints */
4441 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4442 SCIP_DECL_CONSINITLP ((*consinitlp)) /**< initialize LP with relaxations of "initial" constraints */
4443 )
4444{
4445 assert(conshdlr != NULL);
4446
4447 conshdlr->consinitlp = consinitlp;
4448}
4449
4450/** sets propagation conflict resolving method of constraint handler */
4452 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4453 SCIP_DECL_CONSRESPROP ((*consresprop)) /**< propagation conflict resolving method */
4454 )
4455{
4456 assert(conshdlr != NULL);
4457
4458 conshdlr->consresprop = consresprop;
4459}
4460
4461/** sets activation notification method of constraint handler */
4463 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4464 SCIP_DECL_CONSACTIVE ((*consactive)) /**< activation notification method */
4465 )
4466{
4467 assert(conshdlr != NULL);
4468
4469 conshdlr->consactive = consactive;
4470}
4471
4472/** sets deactivation notification method of constraint handler */
4474 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4475 SCIP_DECL_CONSDEACTIVE((*consdeactive)) /**< deactivation notification method */
4476 )
4477{
4478 assert(conshdlr != NULL);
4479
4480 conshdlr->consdeactive = consdeactive;
4481}
4482
4483/** sets enabling notification method of constraint handler */
4485 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4486 SCIP_DECL_CONSENABLE ((*consenable)) /**< enabling notification method */
4487 )
4488{
4489 assert(conshdlr != NULL);
4490
4491 conshdlr->consenable = consenable;
4492}
4493
4494/** sets disabling notification method of constraint handler */
4496 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4497 SCIP_DECL_CONSDISABLE ((*consdisable)) /**< disabling notification method */
4498 )
4499{
4500 assert(conshdlr != NULL);
4501
4502 conshdlr->consdisable = consdisable;
4503}
4504
4505/** sets variable deletion method of constraint handler */
4507 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4508 SCIP_DECL_CONSDELVARS ((*consdelvars)) /**< variable deletion method */
4509 )
4510{
4511 assert(conshdlr != NULL);
4512
4513 conshdlr->consdelvars = consdelvars;
4514}
4515
4516/** sets constraint display method of constraint handler */
4518 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4519 SCIP_DECL_CONSPRINT ((*consprint)) /**< constraint display method */
4520 )
4521{
4522 assert(conshdlr != NULL);
4523
4524 conshdlr->consprint = consprint;
4525}
4526
4527/** sets constraint parsing method of constraint handler */
4529 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4530 SCIP_DECL_CONSPARSE ((*consparse)) /**< constraint parsing method */
4531 )
4532{
4533 assert(conshdlr != NULL);
4534
4535 conshdlr->consparse = consparse;
4536}
4537
4538/** sets constraint variable getter method of constraint handler */
4540 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4541 SCIP_DECL_CONSGETVARS ((*consgetvars)) /**< constraint variable getter method */
4542 )
4543{
4544 assert(conshdlr != NULL);
4545
4546 conshdlr->consgetvars = consgetvars;
4547}
4548
4549/** sets constraint variable number getter method of constraint handler */
4551 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4552 SCIP_DECL_CONSGETNVARS((*consgetnvars)) /**< constraint variable number getter method */
4553 )
4554{
4555 assert(conshdlr != NULL);
4556
4557 conshdlr->consgetnvars = consgetnvars;
4558}
4559
4560/** sets diving enforcement method of constraint handler */
4562 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4563 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)) /**< constraint handler diving solution enforcement method */
4564 )
4565{
4566 assert(conshdlr != NULL);
4567
4568 conshdlr->consgetdivebdchgs = consgetdivebdchgs;
4569}
4570
4571/** sets permutation symmetry detection graph getter method of constraint handler */
4573 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4574 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)) /**< constraint permutation symmetry detection graph
4575 * getter method */
4576 )
4577{
4578 assert(conshdlr != NULL);
4579
4580 conshdlr->consgetpermsymgraph = consgetpermsymgraph;
4581}
4582
4583/** sets signed permutation symmetry detection graph getter method of constraint handler */
4585 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4586 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)) /**< constraint permutation symmetry detection
4587 * graph getter method */
4588 )
4589{
4590 assert(conshdlr != NULL);
4591
4592 conshdlr->consgetsignedpermsymgraph = consgetsignedpermsymgraph;
4593}
4594
4595/** gets array with constraints of constraint handler; the first SCIPconshdlrGetNActiveConss() entries are the active
4596 * constraints, the last SCIPconshdlrGetNConss() - SCIPconshdlrGetNActiveConss() constraints are deactivated
4597 *
4598 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4599 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4600 */
4602 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4603 )
4604{
4605 assert(conshdlr != NULL);
4606
4607 return conshdlr->conss;
4608}
4609
4610/** gets array with enforced constraints of constraint handler; this is local information */
4612 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4613 )
4614{
4615 assert(conshdlr != NULL);
4616
4617 return conshdlr->enfoconss;
4618}
4619
4620/** gets array with checked constraints of constraint handler; this is local information */
4622 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4623 )
4624{
4625 assert(conshdlr != NULL);
4626
4627 return conshdlr->checkconss;
4628}
4629
4630/** gets array with delayed update constraints
4631 *
4632 * @attention Usually, there should be no need to access this array. Use this only if you are absolutely sure what you are doing.
4633 */
4635 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4636 )
4637{
4638 assert(conshdlr != NULL);
4639
4640 return conshdlr->updateconss;
4641}
4642
4643/** gets total number of existing transformed constraints of constraint handler */
4645 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4646 )
4647{
4648 assert(conshdlr != NULL);
4649
4650 return conshdlr->nconss;
4651}
4652
4653/** gets number of enforced constraints of constraint handler; this is local information */
4655 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4656 )
4657{
4658 assert(conshdlr != NULL);
4659
4660 return conshdlr->nenfoconss;
4661}
4662
4663/** gets number of checked constraints of constraint handler; this is local information */
4665 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4666 )
4667{
4668 assert(conshdlr != NULL);
4669
4670 return conshdlr->ncheckconss;
4671}
4672
4673/** gets number of active constraints of constraint handler
4674 *
4675 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4676 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4677 */
4679 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4680 )
4681{
4682 assert(conshdlr != NULL);
4683
4684 return conshdlr->nactiveconss;
4685}
4686
4687/** gets number of enabled constraints of constraint handler */
4689 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4690 )
4691{
4692 assert(conshdlr != NULL);
4693
4694 return conshdlr->nenabledconss;
4695}
4696
4697/** gets number of constraints that have delayed updates */
4699 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4700 )
4701{
4702 assert(conshdlr != NULL);
4703
4704 return conshdlr->nupdateconss;
4705}
4706
4707/** enables or disables all clocks of \p conshdlr, depending on the value of the flag */
4709 SCIP_CONSHDLR* conshdlr, /**< the constraint handler for which all clocks should be enabled or disabled */
4710 SCIP_Bool enable /**< should the clocks of the constraint handler be enabled? */
4711 )
4712{
4713 assert(conshdlr != NULL);
4714
4715 SCIPclockEnableOrDisable(conshdlr->setuptime, enable);
4716 SCIPclockEnableOrDisable(conshdlr->checktime, enable);
4717 SCIPclockEnableOrDisable(conshdlr->enfolptime, enable);
4718 SCIPclockEnableOrDisable(conshdlr->enfopstime, enable);
4719 SCIPclockEnableOrDisable(conshdlr->enforelaxtime, enable);
4720 SCIPclockEnableOrDisable(conshdlr->presoltime, enable);
4721 SCIPclockEnableOrDisable(conshdlr->proptime, enable);
4722 SCIPclockEnableOrDisable(conshdlr->resproptime, enable);
4723 SCIPclockEnableOrDisable(conshdlr->sbproptime, enable);
4724 SCIPclockEnableOrDisable(conshdlr->sepatime, enable);
4725}
4726
4727/** gets time in seconds used for setting up this constraint handler for new stages */
4729 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4730 )
4731{
4732 assert(conshdlr != NULL);
4733
4734 return SCIPclockGetTime(conshdlr->setuptime);
4735}
4736
4737/** gets time in seconds used for presolving in this constraint handler */
4739 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4740 )
4741{
4742 assert(conshdlr != NULL);
4743
4744 return SCIPclockGetTime(conshdlr->presoltime);
4745}
4746
4747/** gets time in seconds used for separation in this constraint handler */
4749 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4750 )
4751{
4752 assert(conshdlr != NULL);
4753
4754 return SCIPclockGetTime(conshdlr->sepatime);
4755}
4756
4757/** gets time in seconds used for LP enforcement in this constraint handler */
4759 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4760 )
4761{
4762 assert(conshdlr != NULL);
4763
4764 return SCIPclockGetTime(conshdlr->enfolptime);
4765}
4766
4767/** gets time in seconds used for pseudo enforcement in this constraint handler */
4769 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4770 )
4771{
4772 assert(conshdlr != NULL);
4773
4774 return SCIPclockGetTime(conshdlr->enfopstime);
4775}
4776
4777/** gets time in seconds used for relaxation enforcement in this constraint handler */
4779 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4780 )
4781{
4782 assert(conshdlr != NULL);
4783
4784 return SCIPclockGetTime(conshdlr->enforelaxtime);
4785}
4786
4787/** gets time in seconds used for propagation in this constraint handler */
4789 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4790 )
4791{
4792 assert(conshdlr != NULL);
4793
4794 return SCIPclockGetTime(conshdlr->proptime);
4795}
4796
4797/** gets time in seconds used for propagation in this constraint handler during strong branching */
4799 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4800 )
4801{
4802 assert(conshdlr != NULL);
4803
4804 return SCIPclockGetTime(conshdlr->sbproptime);
4805}
4806
4807/** gets time in seconds used for feasibility checking in this constraint handler */
4809 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4810 )
4811{
4812 assert(conshdlr != NULL);
4813
4814 return SCIPclockGetTime(conshdlr->checktime);
4815}
4816
4817/** gets time in seconds used for resolving propagation in this constraint handler */
4819 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4820 )
4821{
4822 assert(conshdlr != NULL);
4823
4824 return SCIPclockGetTime(conshdlr->resproptime);
4825}
4826
4827/** gets number of calls to the constraint handler's separation method */
4829 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4830 )
4831{
4832 assert(conshdlr != NULL);
4833
4834 return conshdlr->nsepacalls;
4835}
4836
4837/** gets number of calls to the constraint handler's LP enforcing method */
4839 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4840 )
4841{
4842 assert(conshdlr != NULL);
4843
4844 return conshdlr->nenfolpcalls;
4845}
4846
4847/** gets number of calls to the constraint handler's pseudo enforcing method */
4849 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4850 )
4851{
4852 assert(conshdlr != NULL);
4853
4854 return conshdlr->nenfopscalls;
4855}
4856
4857/** gets number of calls to the constraint handler's relaxation enforcing method */
4859 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4860 )
4861{
4862 assert(conshdlr != NULL);
4863
4864 return conshdlr->nenforelaxcalls;
4865}
4866
4867/** gets number of calls to the constraint handler's propagation method */
4869 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4870 )
4871{
4872 assert(conshdlr != NULL);
4873
4874 return conshdlr->npropcalls;
4875}
4876
4877/** gets number of calls to the constraint handler's checking method */
4879 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4880 )
4881{
4882 assert(conshdlr != NULL);
4883
4884 return conshdlr->ncheckcalls;
4885}
4886
4887/** gets number of calls to the constraint handler's resolve propagation method */
4889 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4890 )
4891{
4892 assert(conshdlr != NULL);
4893
4894 return conshdlr->nrespropcalls;
4895}
4896
4897/** gets total number of times, this constraint handler detected a cutoff */
4899 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4900 )
4901{
4902 assert(conshdlr != NULL);
4903
4904 return conshdlr->ncutoffs;
4905}
4906
4907/** gets total number of cuts found by this constraint handler */
4909 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4910 )
4911{
4912 assert(conshdlr != NULL);
4913
4914 return conshdlr->ncutsfound;
4915}
4916
4917/** gets total number of cuts found by this constraint handler applied to lp */
4919 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4920 )
4921{
4922 assert(conshdlr != NULL);
4923
4924 return conshdlr->ncutsapplied;
4925}
4926
4927/** increase count of applied cuts */
4929 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4930 )
4931{
4932 assert(conshdlr != NULL);
4933
4934 ++conshdlr->ncutsapplied;
4935}
4936
4937/** increase count of found cuts */
4939 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4940 )
4941{
4942 assert(conshdlr != NULL);
4943
4944 ++conshdlr->ncutsfound;
4945}
4946
4947/** gets total number of additional constraints added by this constraint handler */
4949 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4950 )
4951{
4952 assert(conshdlr != NULL);
4953
4954 return conshdlr->nconssfound;
4955}
4956
4957/** gets total number of domain reductions found by this constraint handler */
4959 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4960 )
4961{
4962 assert(conshdlr != NULL);
4963
4964 return conshdlr->ndomredsfound;
4965}
4966
4967/** gets number of children created by this constraint handler */
4969 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4970 )
4971{
4972 assert(conshdlr != NULL);
4973
4974 return conshdlr->nchildren;
4975}
4976
4977/** gets maximum number of active constraints of constraint handler existing at the same time */
4979 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4980 )
4981{
4982 assert(conshdlr != NULL);
4983
4984 return conshdlr->maxnactiveconss;
4985}
4986
4987/** gets initial number of active constraints of constraint handler */
4989 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4990 )
4991{
4992 assert(conshdlr != NULL);
4993
4994 return conshdlr->startnactiveconss;
4995}
4996
4997/** gets number of variables fixed in presolving method of constraint handler */
4999 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5000 )
5001{
5002 assert(conshdlr != NULL);
5003
5004 return conshdlr->nfixedvars;
5005}
5006
5007/** gets number of variables aggregated in presolving method of constraint handler */
5009 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5010 )
5011{
5012 assert(conshdlr != NULL);
5013
5014 return conshdlr->naggrvars;
5015}
5016
5017/** gets number of variable types changed in presolving method of constraint handler */
5019 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5020 )
5021{
5022 assert(conshdlr != NULL);
5023
5024 return conshdlr->nchgvartypes;
5025}
5026
5027/** gets number of bounds changed in presolving method of constraint handler */
5029 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5030 )
5031{
5032 assert(conshdlr != NULL);
5033
5034 return conshdlr->nchgbds;
5035}
5036
5037/** gets number of holes added to domains of variables in presolving method of constraint handler */
5039 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5040 )
5041{
5042 assert(conshdlr != NULL);
5043
5044 return conshdlr->naddholes;
5045}
5046
5047/** gets number of constraints deleted in presolving method of constraint handler */
5049 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5050 )
5051{
5052 assert(conshdlr != NULL);
5053
5054 return conshdlr->ndelconss;
5055}
5056
5057/** gets number of constraints added in presolving method of constraint handler */
5059 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5060 )
5061{
5062 assert(conshdlr != NULL);
5063
5064 return conshdlr->naddconss;
5065}
5066
5067/** gets number of constraints upgraded in presolving method of constraint handler */
5069 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5070 )
5071{
5072 assert(conshdlr != NULL);
5073
5074 return conshdlr->nupgdconss;
5075}
5076
5077/** gets number of coefficients changed in presolving method of constraint handler */
5079 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5080 )
5081{
5082 assert(conshdlr != NULL);
5083
5084 return conshdlr->nchgcoefs;
5085}
5086
5087/** gets number of constraint sides changed in presolving method of constraint handler */
5089 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5090 )
5091{
5092 assert(conshdlr != NULL);
5093
5094 return conshdlr->nchgsides;
5095}
5096
5097/** gets number of times the presolving method of the constraint handler was called and tried to find reductions */
5099 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5100 )
5101{
5102 assert(conshdlr != NULL);
5103
5104 return conshdlr->npresolcalls;
5105}
5106
5107/** gets separation priority of constraint handler */
5109 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5110 )
5111{
5112 assert(conshdlr != NULL);
5113
5114 return conshdlr->sepapriority;
5115}
5116
5117/** gets enforcing priority of constraint handler */
5119 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5120 )
5121{
5122 assert(conshdlr != NULL);
5123
5124 return conshdlr->enfopriority;
5125}
5126
5127/** gets checking priority of constraint handler */
5129 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5130 )
5131{
5132 assert(conshdlr != NULL);
5133
5134 return conshdlr->checkpriority;
5135}
5136
5137/** gets separation frequency of constraint handler */
5139 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5140 )
5141{
5142 assert(conshdlr != NULL);
5143
5144 return conshdlr->sepafreq;
5145}
5146
5147/** gets propagation frequency of constraint handler */
5149 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5150 )
5151{
5152 assert(conshdlr != NULL);
5153
5154 return conshdlr->propfreq;
5155}
5156
5157/** gets frequency of constraint handler for eager evaluations in separation, propagation and enforcement */
5159 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5160 )
5161{
5162 assert(conshdlr != NULL);
5163
5164 return conshdlr->eagerfreq;
5165}
5166
5167/** does the constraint handler need a constraint in order to be called? */
5169 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5170 )
5171{
5172 assert(conshdlr != NULL);
5173
5174 return conshdlr->needscons;
5175}
5176
5177/** does the constraint handler perform presolving? */
5179 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5180 )
5181{
5182 assert(conshdlr != NULL);
5183
5184 return (conshdlr->conspresol != NULL);
5185}
5186
5187/** should separation method be delayed, if other separators found cuts? */
5189 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5190 )
5191{
5192 assert(conshdlr != NULL);
5193
5194 return conshdlr->delaysepa;
5195}
5196
5197/** should propagation method be delayed, if other propagators found reductions? */
5199 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5200 )
5201{
5202 assert(conshdlr != NULL);
5203
5204 return conshdlr->delayprop;
5205}
5206
5207/** was LP separation method delayed at the last call? */
5209 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5210 )
5211{
5212 assert(conshdlr != NULL);
5213
5214 return conshdlr->sepalpwasdelayed;
5215}
5216
5217/** was primal solution separation method delayed at the last call? */
5219 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5220 )
5221{
5222 assert(conshdlr != NULL);
5223
5224 return conshdlr->sepasolwasdelayed;
5225}
5226
5227/** was propagation method delayed at the last call? */
5229 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5230 )
5231{
5232 assert(conshdlr != NULL);
5233
5234 return conshdlr->propwasdelayed;
5235}
5236
5237/** is constraint handler initialized? */
5239 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5240 )
5241{
5242 assert(conshdlr != NULL);
5243
5244 return conshdlr->initialized;
5245}
5246
5247/** does the constraint handler have a copy function? */
5249 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5250 )
5251{
5252 assert(conshdlr != NULL);
5253
5254 return (conshdlr->conshdlrcopy != NULL);
5255}
5256
5257/** returns the timing mask of the propagation method of the constraint handler */
5259 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5260 )
5261{
5262 assert(conshdlr != NULL);
5263
5264 return conshdlr->proptiming;
5265}
5266
5267/** sets the timing mask of the propagation method of the constraint handler */
5269 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5270 SCIP_PROPTIMING proptiming /**< timing mask to be set */
5271 )
5272{
5273 assert(conshdlr != NULL);
5274
5275 conshdlr->proptiming = proptiming;
5276}
5277
5278
5279/** returns the timing mask of the presolving method of the constraint handler */
5281 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5282 )
5283{
5284 assert(conshdlr != NULL);
5285
5286 return conshdlr->presoltiming;
5287}
5288
5289/** sets the timing mask of the presolving method of the constraint handler */
5291 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5292 SCIP_PRESOLTIMING presoltiming /** timing mask to be set */
5293 )
5294{
5295 assert(conshdlr != NULL);
5296
5297 conshdlr->presoltiming = presoltiming;
5298}
5299
5300/** returns whether conshdlr supports permutation symmetry detection */
5302 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5303 )
5304{
5305 assert(conshdlr != NULL);
5306
5307 return conshdlr->consgetpermsymgraph != NULL;
5308}
5309
5310/** returns whether conshdlr supports signed permutation symmetry detection */
5312 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5313 )
5314{
5315 assert(conshdlr != NULL);
5316
5317 return conshdlr->consgetsignedpermsymgraph != NULL;
5318}
5319
5320/*
5321 * Constraint set change methods
5322 */
5323
5324/** creates empty constraint set change data */
5325static
5327 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5328 BMS_BLKMEM* blkmem /**< block memory */
5329 )
5330{
5331 assert(conssetchg != NULL);
5332 assert(blkmem != NULL);
5333
5334 SCIP_ALLOC( BMSallocBlockMemory(blkmem, conssetchg) );
5335 (*conssetchg)->addedconss = NULL;
5336 (*conssetchg)->disabledconss = NULL;
5337 (*conssetchg)->addedconsssize = 0;
5338 (*conssetchg)->naddedconss = 0;
5339 (*conssetchg)->disabledconsssize = 0;
5340 (*conssetchg)->ndisabledconss = 0;
5341
5342 return SCIP_OKAY;
5343}
5344
5345/** releases all constraints of the constraint set change data */
5346static
5348 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data */
5349 BMS_BLKMEM* blkmem, /**< block memory */
5350 SCIP_SET* set /**< global SCIP settings */
5351 )
5352{
5353 int i;
5354
5355 assert(conssetchg != NULL);
5356
5357 /* release constraints */
5358 for( i = 0; i < conssetchg->naddedconss; ++i )
5359 {
5360 if( conssetchg->addedconss[i] != NULL )
5361 {
5362 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[i], blkmem, set) );
5363 }
5364 }
5365 for( i = 0; i < conssetchg->ndisabledconss; ++i )
5366 {
5367 if( conssetchg->disabledconss[i] != NULL )
5368 {
5369 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[i], blkmem, set) );
5370 }
5371 }
5372
5373 return SCIP_OKAY;
5374}
5375
5376/** frees constraint set change data and releases all included constraints */
5378 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change */
5379 BMS_BLKMEM* blkmem, /**< block memory */
5380 SCIP_SET* set /**< global SCIP settings */
5381 )
5382{
5383 assert(conssetchg != NULL);
5384 assert(blkmem != NULL);
5385
5386 if( *conssetchg != NULL )
5387 {
5388 /* release constraints */
5389 SCIP_CALL( conssetchgRelease(*conssetchg, blkmem, set) );
5390
5391 /* free memory */
5392 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->addedconss, (*conssetchg)->addedconsssize);
5393 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->disabledconss, (*conssetchg)->disabledconsssize);
5394 BMSfreeBlockMemory(blkmem, conssetchg);
5395 }
5396
5397 return SCIP_OKAY;
5398}
5399
5400/** ensures, that addedconss array can store at least num entries */
5401static
5403 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5404 BMS_BLKMEM* blkmem, /**< block memory */
5405 SCIP_SET* set, /**< global SCIP settings */
5406 int num /**< minimum number of entries to store */
5407 )
5408{
5409 assert(conssetchg != NULL);
5410
5411 if( num > conssetchg->addedconsssize )
5412 {
5413 int newsize;
5414
5415 newsize = SCIPsetCalcMemGrowSize(set, num);
5416 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->addedconss, conssetchg->addedconsssize, newsize) );
5417 conssetchg->addedconsssize = newsize;
5418 }
5419 assert(num <= conssetchg->addedconsssize);
5420
5421 return SCIP_OKAY;
5422}
5423
5424/** ensures, that disabledconss array can store at least num entries */
5425static
5427 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5428 BMS_BLKMEM* blkmem, /**< block memory */
5429 SCIP_SET* set, /**< global SCIP settings */
5430 int num /**< minimum number of entries to store */
5431 )
5432{
5433 assert(conssetchg != NULL);
5434
5435 if( num > conssetchg->disabledconsssize )
5436 {
5437 int newsize;
5438
5439 newsize = SCIPsetCalcMemGrowSize(set, num);
5440 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->disabledconss, conssetchg->disabledconsssize, newsize) );
5441 conssetchg->disabledconsssize = newsize;
5442 }
5443 assert(num <= conssetchg->disabledconsssize);
5444
5445 return SCIP_OKAY;
5446}
5447
5448/** adds constraint addition to constraint set changes, and captures constraint; activates constraint if the
5449 * constraint set change data is currently active
5450 */
5452 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5453 BMS_BLKMEM* blkmem, /**< block memory */
5454 SCIP_SET* set, /**< global SCIP settings */
5455 SCIP_STAT* stat, /**< dynamic problem statistics */
5456 SCIP_CONS* cons, /**< added constraint */
5457 int depth, /**< depth of constraint set change's node */
5458 SCIP_Bool focusnode, /**< does the constraint set change belong to the focus node? */
5459 SCIP_Bool active /**< is the constraint set change currently active? */
5460 )
5461{
5462 assert(conssetchg != NULL);
5463 assert(cons != NULL);
5464
5465 /* if constraint set change doesn't exist, create it */
5466 if( *conssetchg == NULL )
5467 {
5468 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5469 }
5470
5471 /* add constraint to the addedconss array */
5472 SCIP_CALL( conssetchgEnsureAddedconssSize(*conssetchg, blkmem, set, (*conssetchg)->naddedconss+1) );
5473 (*conssetchg)->addedconss[(*conssetchg)->naddedconss] = cons;
5474 (*conssetchg)->naddedconss++;
5475
5476 /* undelete constraint, if it was globally deleted in the past */
5477 cons->deleted = FALSE;
5478
5479 /* capture constraint */
5480 SCIPconsCapture(cons);
5481
5482 /* activate constraint, if node is active */
5483 if( active && !SCIPconsIsActive(cons) )
5484 {
5485 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5486 assert(SCIPconsIsActive(cons));
5487
5488 /* remember, that this constraint set change data was responsible for the constraint's addition */
5489 cons->addconssetchg = *conssetchg;
5490 cons->addarraypos = (*conssetchg)->naddedconss-1;
5491 }
5492
5493 return SCIP_OKAY;
5494}
5495
5496/** adds constraint disabling to constraint set changes, and captures constraint */
5498 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5499 BMS_BLKMEM* blkmem, /**< block memory */
5500 SCIP_SET* set, /**< global SCIP settings */
5501 SCIP_CONS* cons /**< disabled constraint */
5502 )
5503{
5504 assert(conssetchg != NULL);
5505 assert(cons != NULL);
5506
5507 /* if constraint set change doesn't exist, create it */
5508 if( *conssetchg == NULL )
5509 {
5510 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5511 }
5512
5513 /* add constraint to the disabledconss array */
5514 SCIP_CALL( conssetchgEnsureDisabledconssSize(*conssetchg, blkmem, set, (*conssetchg)->ndisabledconss+1) );
5515 (*conssetchg)->disabledconss[(*conssetchg)->ndisabledconss] = cons;
5516 (*conssetchg)->ndisabledconss++;
5517
5518 /* capture constraint */
5519 SCIPconsCapture(cons);
5520
5521 return SCIP_OKAY;
5522}
5523
5524/** deactivates, deletes, and releases constraint from the addedconss array of the constraint set change data */
5525static
5527 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to delete constraint from */
5528 BMS_BLKMEM* blkmem, /**< block memory */
5529 SCIP_SET* set, /**< global SCIP settings */
5530 int arraypos /**< position of constraint in disabledconss array */
5531 )
5532{
5533 SCIP_CONS* cons;
5534
5535 assert(conssetchg != NULL);
5536 assert(conssetchg->addedconss != NULL);
5537 assert(0 <= arraypos && arraypos < conssetchg->naddedconss);
5538
5539 cons = conssetchg->addedconss[arraypos];
5540 assert(cons != NULL);
5541
5542 SCIPsetDebugMsg(set, "delete added constraint <%s> at position %d from constraint set change data\n", cons->name, arraypos);
5543
5544 /* remove the link to the constraint set change data */
5545 if( cons->addconssetchg == conssetchg )
5546 {
5547 cons->addconssetchg = NULL;
5548 cons->addarraypos = -1;
5549 }
5550
5551 /* release constraint */
5552 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[arraypos], blkmem, set) );
5553
5554 /* we want to keep the order of the constraint additions: move all subsequent constraints one slot to the front */
5555 for( ; arraypos < conssetchg->naddedconss-1; ++arraypos )
5556 {
5557 conssetchg->addedconss[arraypos] = conssetchg->addedconss[arraypos+1];
5558 assert(conssetchg->addedconss[arraypos] != NULL);
5559 if( conssetchg->addedconss[arraypos]->addconssetchg == conssetchg )
5560 {
5561 assert(conssetchg->addedconss[arraypos]->addarraypos == arraypos+1);
5562 conssetchg->addedconss[arraypos]->addarraypos = arraypos;
5563 }
5564 }
5565 conssetchg->naddedconss--;
5566
5567 return SCIP_OKAY;
5568}
5569
5570/** deletes and releases deactivated constraint from the disabledconss array of the constraint set change data */
5571static
5573 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5574 BMS_BLKMEM* blkmem, /**< block memory */
5575 SCIP_SET* set, /**< global SCIP settings */
5576 int arraypos /**< position of constraint in disabledconss array */
5577 )
5578{
5579 assert(conssetchg != NULL);
5580 assert(0 <= arraypos && arraypos < conssetchg->ndisabledconss);
5581 assert(conssetchg->disabledconss[arraypos] != NULL);
5582
5583 SCIPsetDebugMsg(set, "delete disabled constraint <%s> at position %d from constraint set change data\n",
5584 conssetchg->disabledconss[arraypos]->name, arraypos);
5585
5586 /* release constraint */
5587 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[arraypos], blkmem, set) );
5588
5589 /* we want to keep the order of the constraint disablings: move all subsequent constraints one slot to the front */
5590 for( ; arraypos < conssetchg->ndisabledconss-1; ++arraypos )
5591 {
5592 conssetchg->disabledconss[arraypos] = conssetchg->disabledconss[arraypos+1];
5593 assert(conssetchg->disabledconss[arraypos] != NULL);
5594 }
5595 conssetchg->ndisabledconss--;
5596
5597 return SCIP_OKAY;
5598}
5599
5600/** gets added constraints data for a constraint set change */
5602 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to get data from */
5603 SCIP_CONS*** conss, /**< reference to constraints array added in the conssetchg, or NULL */
5604 int* nconss /**< reference to store the size of the constraints array, or NULL */
5605 )
5606{
5607 assert(conssetchg != NULL);
5608 if( conss != NULL )
5609 *conss = conssetchg->addedconss;
5610 if( nconss != NULL )
5611 *nconss = conssetchg->naddedconss;
5612}
5613
5614/** applies constraint set change */
5616 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5617 BMS_BLKMEM* blkmem, /**< block memory */
5618 SCIP_SET* set, /**< global SCIP settings */
5619 SCIP_STAT* stat, /**< dynamic problem statistics */
5620 int depth, /**< depth of constraint set change's node */
5621 SCIP_Bool focusnode /**< does the constraint set change belong to the focus node? */
5622 )
5623{
5624 SCIP_CONS* cons;
5625 int i;
5626
5627 if( conssetchg == NULL )
5628 return SCIP_OKAY;
5629
5630 SCIPsetDebugMsg(set, "applying constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5631 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5632
5633 /* apply constraint additions */
5634 i = 0;
5635 while( i < conssetchg->naddedconss )
5636 {
5637 cons = conssetchg->addedconss[i];
5638 assert(cons != NULL);
5639 assert(!cons->update);
5640
5641 /* if constraint is already active, or if constraint is globally deleted, it can be removed from addedconss array */
5642 if( cons->active || cons->deleted )
5643 {
5644 /* delete constraint from addedcons array, the empty slot is now used by the next constraint,
5645 * and naddedconss was decreased, so do not increase i
5646 */
5647 SCIP_CALL( conssetchgDelAddedCons(conssetchg, blkmem, set, i) );
5648 }
5649 else
5650 {
5651 assert(cons->addconssetchg == NULL);
5652 assert(cons->addarraypos == -1);
5653
5654 /* activate constraint */
5655 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5656 assert(cons->active);
5657 assert(!cons->update);
5658
5659 /* remember, that this constraint set change data was responsible for the constraint's addition */
5660 cons->addconssetchg = conssetchg;
5661 cons->addarraypos = i;
5662
5663 ++i; /* handle the next constraint */
5664 }
5665 }
5666
5667 /* apply constraint disablings */
5668 i = 0;
5669 while( i < conssetchg->ndisabledconss )
5670 {
5671 cons = conssetchg->disabledconss[i];
5672 assert(cons != NULL);
5673 assert(!cons->update);
5674
5675 /* if the constraint is disabled, we can permanently remove it from the disabledconss array */
5676 if( !cons->enabled )
5677 {
5678 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5679 cons->name, cons->conshdlr->name);
5680
5681 /* release and remove constraint from the disabledconss array, the empty slot is now used by the next constraint
5682 * and ndisabledconss was decreased, so do not increase i
5683 */
5684 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5685 }
5686 else
5687 {
5688 assert(cons->addarraypos >= 0);
5689 assert(!cons->deleted); /* deleted constraints must not be enabled! */
5690 SCIP_CALL( SCIPconsDisable(conssetchg->disabledconss[i], set, stat) );
5691 assert(!cons->update);
5692 assert(!cons->enabled);
5693
5694 ++i; /* handle the next constraint */
5695 }
5696 }
5697
5698 return SCIP_OKAY;
5699}
5700
5701/** undoes constraint set change */
5703 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to undo */
5704 BMS_BLKMEM* blkmem, /**< block memory */
5705 SCIP_SET* set, /**< global SCIP settings */
5706 SCIP_STAT* stat /**< dynamic problem statistics */
5707 )
5708{
5709 SCIP_CONS* cons;
5710 int i;
5711
5712 if( conssetchg == NULL )
5713 return SCIP_OKAY;
5714
5715 SCIPsetDebugMsg(set, "undoing constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5716 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5717
5718 /* undo constraint disablings */
5719 for( i = conssetchg->ndisabledconss-1; i >= 0; --i )
5720 {
5721 cons = conssetchg->disabledconss[i];
5722 assert(cons != NULL);
5723 assert(!cons->update);
5724
5725 /* If the constraint is inactive, we can permanently remove it from the disabledconss array. It was deactivated
5726 * in the subtree of the current node but not reactivated on the switching way back to the current node, which
5727 * means, the deactivation was more global (i.e. valid on a higher level node) than the current node and the
5728 * disabling at the current node doesn't have any effect anymore.
5729 * If the constraint is already enabled, we need not to do anything. This may happen on a path A -> B,
5730 * if the constraint is disabled at node B, and while processing the subtree of B, it is also disabled at
5731 * the more global node A. Then on the switching path back to A, the constraint is enabled at node B (which is
5732 * actually wrong, since it now should be disabled in the whole subtree of A, but we cannot know this), and
5733 * again enabled at node A (where enabling is ignored). If afterwards, a subnode of B is processed, the
5734 * switching disables the constraint in node A, and the disabling is then removed from node B.
5735 */
5736 if( !cons->active )
5737 {
5738 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5739 cons->name, cons->conshdlr->name);
5740
5741 /* release and remove constraint from the disabledconss array */
5742 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5743 }
5744 else if( !cons->enabled )
5745 {
5746 assert(cons->addarraypos >= 0);
5747 assert(!cons->deleted); /* deleted constraints must not be active! */
5748 SCIP_CALL( SCIPconsEnable(cons, set, stat) );
5749 assert(!cons->update);
5750 assert(!cons->active || cons->enabled);
5751 }
5752 }
5753
5754 /* undo constraint additions */
5755 for( i = conssetchg->naddedconss-1; i >= 0; --i )
5756 {
5757 cons = conssetchg->addedconss[i];
5758 assert(cons != NULL);
5759 assert(!cons->update);
5760
5761 /* If the constraint is already deactivated, we need not to do anything. This may happen on a path A -> B,
5762 * if the constraint is added at node B, and while processing the subtree of B, it is also added at
5763 * the more global node A. Then on the switching path back to A, the node is deactivated at node B (which is
5764 * actually wrong, since it now should be active in the whole subtree of A, but we cannot know this), and
5765 * again deactivated at node A (where deactivation is ignored). If afterwards, a subnode of B is processed, the
5766 * switching activates the constraint in node A, and the activation is then removed from node B.
5767 */
5768 if( cons->active )
5769 {
5770 assert(cons->addconssetchg == conssetchg);
5771 assert(cons->addarraypos == i);
5772
5773 /* deactivate constraint */
5774 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
5775
5776 /* unlink the constraint and the constraint set change */
5777 cons->addconssetchg = NULL;
5778 cons->addarraypos = -1;
5779 }
5780 assert(!cons->active);
5781 assert(!cons->update);
5782 }
5783
5784 return SCIP_OKAY;
5785}
5786
5787/** applies constraint set change to the global problem and deletes the constraint set change data */
5789 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5790 BMS_BLKMEM* blkmem, /**< block memory */
5791 SCIP_SET* set, /**< global SCIP settings */
5792 SCIP_STAT* stat, /**< dynamic problem statistics */
5793 SCIP_PROB* prob, /**< problem data */
5794 SCIP_REOPT* reopt /**< reoptimization data */
5795 )
5796{
5797 SCIP_CONS* cons;
5798 int i;
5799
5800 assert(conssetchg != NULL);
5801
5802 /* nothing to do on empty constraint set change data */
5803 if( *conssetchg == NULL )
5804 return SCIP_OKAY;
5805
5806 SCIPsetDebugMsg(set, "moving constraint set changes at %p to global problem: %d constraint additions, %d constraint disablings\n",
5807 (void*)*conssetchg, (*conssetchg)->naddedconss, (*conssetchg)->ndisabledconss);
5808
5809 /* apply constraint additions to the global problem (loop backwards, because then conssetchgDelAddedCons() is
5810 * more efficient)
5811 */
5812 for( i = (*conssetchg)->naddedconss-1; i >= 0; --i )
5813 {
5814 cons = (*conssetchg)->addedconss[i];
5815 assert(cons != NULL);
5816 assert(!cons->update);
5817
5818 /* only move constraints that are not sticking at the current node */
5819 if( !SCIPconsIsStickingAtNode(cons) )
5820 {
5821 /* because we first have to delete the constraint, we have to capture it in order to not loose it */
5822 SCIPconsCapture(cons);
5823
5824 /* delete constraint addition from constraint set change data */
5825 SCIP_CALL( conssetchgDelAddedCons(*conssetchg, blkmem, set, i) );
5826
5827 /* don't move deleted constraints to the global problem */
5828 if( !cons->deleted )
5829 {
5830 SCIP_CALL( SCIPprobAddCons(prob, set, stat, cons) );
5831 }
5832
5833 /* release constraint */
5834 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
5835 }
5836 }
5837
5838 /* apply constraint disablings to the global problem (loop backwards, because then conssetchgDelDisabledCons() is
5839 * more efficient)
5840 */
5841 for( i = (*conssetchg)->ndisabledconss-1; i >= 0; --i )
5842 {
5843 cons = (*conssetchg)->disabledconss[i];
5844 assert(cons != NULL);
5845 assert(!cons->update);
5846
5847 /* only delete constraints that are not sticking at the current node */
5848 if( !SCIPconsIsStickingAtNode(cons) )
5849 {
5850 /* globally delete constraint */
5851 if( !cons->deleted )
5852 {
5853 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
5854 }
5855
5856 /* release and remove constraint from the disabledconss array */
5857 SCIP_CALL( conssetchgDelDisabledCons(*conssetchg, blkmem, set, i) );
5858 }
5859 }
5860
5861 if( (*conssetchg)->naddedconss == 0 && (*conssetchg)->ndisabledconss == 0 )
5862 {
5863 /* free empty constraint set change data */
5864 SCIP_CALL( SCIPconssetchgFree(conssetchg, blkmem, set) );
5865 }
5866
5867 return SCIP_OKAY;
5868}
5869
5870
5871
5872
5873/*
5874 * Constraint methods
5875 */
5876
5877/** creates and captures a constraint, and inserts it into the conss array of its constraint handler
5878 *
5879 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, a LP or pseudo solution
5880 * may be declared feasible even if it violates this particular constraint.
5881 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
5882 * local constraint is redundant due to the variable's local bounds.
5883 */
5885 SCIP_CONS** cons, /**< pointer to constraint */
5886 BMS_BLKMEM* blkmem, /**< block memory */
5887 SCIP_SET* set, /**< global SCIP settings */
5888 const char* name, /**< name of constraint */
5889 SCIP_CONSHDLR* conshdlr, /**< constraint handler for this constraint */
5890 SCIP_CONSDATA* consdata, /**< data for this specific constraint */
5891 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
5892 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
5893 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
5894 * Usually set to TRUE. */
5895 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
5896 * TRUE for model constraints, FALSE for additional, redundant constraints. */
5897 SCIP_Bool check, /**< should the constraint be checked for feasibility?
5898 * TRUE for model constraints, FALSE for additional, redundant constraints. */
5899 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
5900 * Usually set to TRUE. */
5901 SCIP_Bool local, /**< is constraint only valid locally?
5902 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
5903 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
5904 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
5905 * adds coefficients to this constraint. */
5906 SCIP_Bool dynamic, /**< is constraint subject to aging?
5907 * Usually set to FALSE. Set to TRUE for own cuts which
5908 * are separated as constraints. */
5909 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
5910 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
5911 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
5912 * if it may be moved to a more global node?
5913 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
5914 SCIP_Bool original, /**< is constraint belonging to the original problem? */
5915 SCIP_Bool deleteconsdata /**< has the constraint data to be deleted if constraint is freed? */
5916 )
5917{
5918 int i;
5919
5920 assert(cons != NULL);
5921 assert(blkmem != NULL);
5922 assert(set != NULL);
5923 assert(name != NULL);
5924 assert(conshdlr != NULL);
5925 assert(!original || deleteconsdata);
5926
5927 /* create constraint data */
5928 SCIP_ALLOC( BMSallocBlockMemory(blkmem, cons) );
5929 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &(*cons)->name, name, strlen(name)+1) );
5930#ifndef NDEBUG
5931 (*cons)->scip = set->scip;
5932#endif
5933 (*cons)->conshdlr = conshdlr;
5934 (*cons)->consdata = consdata;
5935 (*cons)->transorigcons = NULL;
5936 (*cons)->addconssetchg = NULL;
5937 (*cons)->addarraypos = -1;
5938 (*cons)->consspos = -1;
5939 (*cons)->initconsspos = -1;
5940 (*cons)->sepaconsspos = -1;
5941 (*cons)->enfoconsspos = -1;
5942 (*cons)->checkconsspos = -1;
5943 (*cons)->propconsspos = -1;
5944 (*cons)->activedepth = -2;
5945 (*cons)->validdepth = (local ? -1 : 0);
5946 (*cons)->age = 0.0;
5947 (*cons)->nuses = 0;
5948 (*cons)->nupgradelocks = 0;
5949 (*cons)->initial = initial;
5950 (*cons)->separate = separate;
5951 (*cons)->enforce = enforce;
5952 (*cons)->check = check;
5953 (*cons)->propagate = propagate;
5954 (*cons)->sepaenabled = separate;
5955 (*cons)->propenabled = propagate;
5956 (*cons)->local = local;
5957 (*cons)->modifiable = modifiable;
5958 (*cons)->dynamic = dynamic;
5959 (*cons)->removable = removable;
5960 (*cons)->stickingatnode = stickingatnode;
5961 (*cons)->original = original;
5962 (*cons)->deleteconsdata = deleteconsdata;
5963 (*cons)->active = FALSE;
5964 (*cons)->conflict = FALSE;
5965 (*cons)->enabled = FALSE;
5966 (*cons)->obsolete = FALSE;
5967 (*cons)->markpropagate = TRUE;
5968 (*cons)->deleted = FALSE;
5969 (*cons)->update = FALSE;
5970 (*cons)->updateinsert = FALSE;
5971 (*cons)->updateactivate = FALSE;
5972 (*cons)->updatedeactivate = FALSE;
5973 (*cons)->updateenable = FALSE;
5974 (*cons)->updatedisable = FALSE;
5975 (*cons)->updatesepaenable = FALSE;
5976 (*cons)->updatesepadisable = FALSE;
5977 (*cons)->updatepropenable = FALSE;
5978 (*cons)->updatepropdisable = FALSE;
5979 (*cons)->updateobsolete = FALSE;
5980 (*cons)->updatemarkpropagate = FALSE;
5981 (*cons)->updateunmarkpropagate = FALSE;
5982 (*cons)->updatefree = FALSE;
5983 (*cons)->updateactfocus = FALSE;
5984
5985 for( i = 0; i < NLOCKTYPES; i++ )
5986 {
5987 (*cons)->nlockspos[i] = 0;
5988 (*cons)->nlocksneg[i] = 0;
5989 }
5990
5991 /* capture constraint */
5992 SCIPconsCapture(*cons);
5993
5994 /* insert the constraint as inactive constraint into the transformed constraints array */
5995 if( !original )
5996 {
5997 /* check, if inserting constraint should be delayed */
5998 if( conshdlrAreUpdatesDelayed(conshdlr) )
5999 {
6000 SCIPsetDebugMsg(set, " -> delaying insertion of constraint <%s>\n", (*cons)->name);
6001 (*cons)->updateinsert = TRUE;
6002 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6003 assert((*cons)->update);
6004 assert((*cons)->nuses == 2);
6005 }
6006 else
6007 {
6008 SCIP_CALL( conshdlrAddCons(conshdlr, set, *cons) );
6009 }
6010 }
6011
6012 checkConssArrays(conshdlr);
6013
6014 return SCIP_OKAY;
6015}
6016
6017/** copies source constraint of source SCIP into the target constraint for the target SCIP, using the variable map for
6018 * mapping the variables of the source SCIP to the variables of the target SCIP; if the copying process was successful
6019 * a constraint is created and captured;
6020 *
6021 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6022 * may be declared feasible even if it violates this particular constraint.
6023 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6024 * local constraint is redundant due to the variable's local bounds.
6025 */
6027 SCIP_CONS** cons, /**< pointer to store the created target constraint */
6028 SCIP_SET* set, /**< global SCIP settings of the target SCIP */
6029 const char* name, /**< name of constraint, or NULL if the name of the source constraint should be used */
6030 SCIP* sourcescip, /**< source SCIP data structure */
6031 SCIP_CONSHDLR* sourceconshdlr, /**< source constraint handler for this constraint */
6032 SCIP_CONS* sourcecons, /**< source constraint of the source SCIP */
6033 SCIP_HASHMAP* varmap, /**< a SCIP_HASHMAP mapping variables of the source SCIP to corresponding
6034 * variables of the target SCIP */
6035 SCIP_HASHMAP* consmap, /**< a hashmap to store the mapping of source constraints to the corresponding
6036 * target constraints, must not be NULL! */
6037 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP? */
6038 SCIP_Bool separate, /**< should the constraint be separated during LP processing? */
6039 SCIP_Bool enforce, /**< should the constraint be enforced during node processing? */
6040 SCIP_Bool check, /**< should the constraint be checked for feasibility? */
6041 SCIP_Bool propagate, /**< should the constraint be propagated during node processing? */
6042 SCIP_Bool local, /**< is constraint only valid locally? */
6043 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)? */
6044 SCIP_Bool dynamic, /**< is constraint subject to aging? */
6045 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup? */
6046 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6047 * if it may be moved to a more global node? */
6048 SCIP_Bool global, /**< create a global or a local copy? */
6049 SCIP_Bool* valid /**< pointer to store whether the copying was valid or not */
6050 )
6051{
6052 assert(cons != NULL);
6053 assert(set != NULL);
6054 assert(sourcescip != NULL);
6055 assert(sourceconshdlr != NULL);
6056 assert(sourcecons != NULL);
6057 assert(varmap != NULL);
6058 assert(consmap != NULL);
6059 assert(valid != NULL);
6060
6061 /* if constraint handler does not support copying, success will return false. Constraints handlers have to actively set this to true. */
6062 (*valid) = FALSE;
6063
6064 if( sourceconshdlr->conscopy != NULL )
6065 {
6066 SCIP_CALL( sourceconshdlr->conscopy(set->scip, cons, name, sourcescip, sourceconshdlr, sourcecons, varmap, consmap,
6067 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, global, valid) );
6068 }
6069
6070 return SCIP_OKAY;
6071}
6072
6073
6074/** parses constraint information (in cip format) out of a string; if the parsing process was successful a constraint is
6075 * created, captured, and inserted into the conss array of its constraint handler.
6076 *
6077 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6078 * may be declared feasible even if it violates this particular constraint.
6079 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6080 * local constraint is redundant due to the variable's local bounds.
6081 */
6083 SCIP_CONS** cons, /**< pointer to constraint */
6084 SCIP_SET* set, /**< global SCIP settings */
6085 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler of target SCIP */
6086 const char* str, /**< string to parse for constraint */
6087 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
6088 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
6089 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
6090 * Usually set to TRUE. */
6091 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
6092 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6093 SCIP_Bool check, /**< should the constraint be checked for feasibility?
6094 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6095 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
6096 * Usually set to TRUE. */
6097 SCIP_Bool local, /**< is constraint only valid locally?
6098 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
6099 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
6100 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
6101 * adds coefficients to this constraint. */
6102 SCIP_Bool dynamic, /**< is constraint subject to aging?
6103 * Usually set to FALSE. Set to TRUE for own cuts which
6104 * are separated as constraints. */
6105 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
6106 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
6107 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6108 * if it may be moved to a more global node?
6109 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
6110 SCIP_Bool* success /**< pointer store if the paring process was successful */
6111 )
6112{
6113 SCIP_CONSHDLR* conshdlr;
6114 char conshdlrname[SCIP_MAXSTRLEN];
6115 char consname[SCIP_MAXSTRLEN];
6116 char* endptr;
6117
6118 assert(cons != NULL);
6119 assert(set != NULL);
6120
6121 (*success) = FALSE;
6122
6123 /* scan constraint handler name */
6124 assert(str != NULL);
6125 SCIPstrCopySection(str, '[', ']', conshdlrname, SCIP_MAXSTRLEN, &endptr);
6126 if ( endptr == NULL || endptr == str )
6127 {
6128 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint handler name.\n");
6129 return SCIP_OKAY;
6130 }
6131 assert(endptr != NULL);
6132 SCIPsetDebugMsg(set, "constraint handler name <%s>\n", conshdlrname);
6133
6134 /* scan constraint name */
6135 SCIPstrCopySection(endptr, '<', '>', consname, SCIP_MAXSTRLEN, &endptr);
6136 if ( endptr == NULL || endptr == str )
6137 {
6138 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint name.\n");
6139 return SCIP_OKAY;
6140 }
6141 assert(endptr != NULL);
6142 SCIPsetDebugMsg(set, "constraint name <%s>\n", consname);
6143
6144 str = endptr;
6145
6146 /* skip white space */
6147 SCIP_CALL( SCIPskipSpace((char**)&str) );
6148
6149 /* check for colon */
6150 if( *str != ':' )
6151 {
6152 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find colon ':' after constraint name.\n");
6153 return SCIP_OKAY;
6154 }
6155
6156 /* skip colon */
6157 ++str;
6158
6159 /* skip white space */
6160 SCIP_CALL( SCIPskipSpace((char**)&str) );
6161
6162 /* check if a constraint handler with parsed name exists */
6163 conshdlr = SCIPsetFindConshdlr(set, conshdlrname);
6164
6165 if( conshdlr == NULL )
6166 {
6167 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> doesn't exist in SCIP data structure\n", conshdlrname);
6168 }
6169 else
6170 {
6171 assert( conshdlr != NULL );
6172 if ( conshdlr->consparse == NULL )
6173 {
6174 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> does not support parsing constraints\n", conshdlrname);
6175 }
6176 else
6177 {
6178 SCIP_CALL( conshdlr->consparse(set->scip, conshdlr, cons, consname, str,
6179 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, success) );
6180 }
6181 }
6182
6183 return SCIP_OKAY;
6184}
6185
6186/** change name of given constraint */
6188 SCIP_CONS* cons, /**< problem constraint */
6189 BMS_BLKMEM* blkmem, /**< block memory buffer */
6190 const char* name /**< new name of constraint */
6191 )
6192{
6193 assert(cons != NULL);
6194 assert(cons->name != NULL);
6195
6196 /* free old constraint name */
6197 BMSfreeBlockMemoryArray(blkmem, &cons->name, strlen(cons->name)+1);
6198
6199 /* copy new constraint name */
6200 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &cons->name, name, strlen(name)+1) );
6201
6202 return SCIP_OKAY;
6203}
6204
6205
6206/** frees a constraint and removes it from the conss array of its constraint handler */
6208 SCIP_CONS** cons, /**< constraint to free */
6209 BMS_BLKMEM* blkmem, /**< block memory buffer */
6210 SCIP_SET* set /**< global SCIP settings */
6211 )
6212{
6213 assert(cons != NULL);
6214 assert(*cons != NULL);
6215 assert((*cons)->conshdlr != NULL);
6216 assert((*cons)->nuses == 0);
6217 assert(!(*cons)->active);
6218 assert(!(*cons)->update);
6219 assert(!(*cons)->original || (*cons)->transorigcons == NULL);
6220 assert(blkmem != NULL);
6221 assert(set != NULL);
6222 assert((*cons)->scip == set->scip);
6223
6224 SCIPsetDebugMsg(set, "freeing constraint <%s> at conss pos %d of handler <%s>\n",
6225 (*cons)->name, (*cons)->consspos, (*cons)->conshdlr->name);
6226
6227 /* free constraint data */
6228 if( (*cons)->conshdlr->consdelete != NULL && (*cons)->consdata != NULL && (*cons)->deleteconsdata )
6229 {
6230 SCIP_CALL( (*cons)->conshdlr->consdelete(set->scip, (*cons)->conshdlr, *cons, &(*cons)->consdata) );
6231 }
6232 else if( !(*cons)->deleteconsdata )
6233 (*cons)->consdata = NULL;
6234 assert((*cons)->consdata == NULL);
6235
6236 /* unlink transformed and original constraint */
6237 if( (*cons)->transorigcons != NULL )
6238 {
6239 assert(!(*cons)->original);
6240 assert((*cons)->transorigcons->original);
6241 assert((*cons)->transorigcons->transorigcons == *cons);
6242
6243 (*cons)->transorigcons->transorigcons = NULL;
6244 }
6245
6246 /* remove constraint from the transformed constraints array */
6247 if( !(*cons)->original )
6248 {
6249 conshdlrDelCons((*cons)->conshdlr, *cons);
6250 checkConssArrays((*cons)->conshdlr);
6251 }
6252 assert((*cons)->consspos == -1);
6253
6254 /* free constraint */
6255 BMSfreeBlockMemoryArray(blkmem, &(*cons)->name, strlen((*cons)->name)+1);
6256 BMSfreeBlockMemory(blkmem, cons);
6257
6258 return SCIP_OKAY;
6259}
6260
6261/** increases usage counter of constraint */
6263 SCIP_CONS* cons /**< constraint */
6264 )
6265{
6266 assert(cons != NULL);
6267 assert(cons->nuses >= 0);
6268
6269 SCIPdebugMessage("capture constraint <%s> with nuses=%d, cons pointer %p\n", cons->name, cons->nuses, (void*)cons);
6270 cons->nuses++;
6271}
6272
6273/** decreases usage counter of constraint, and frees memory if necessary */
6275 SCIP_CONS** cons, /**< pointer to constraint */
6276 BMS_BLKMEM* blkmem, /**< block memory */
6277 SCIP_SET* set /**< global SCIP settings */
6278 )
6279{
6280 assert(blkmem != NULL);
6281 assert(cons != NULL);
6282 assert(*cons != NULL);
6283 assert((*cons)->conshdlr != NULL);
6284 assert((*cons)->nuses >= 1);
6285 assert(set != NULL);
6286 assert((*cons)->scip == set->scip);
6287
6288 SCIPsetDebugMsg(set, "release constraint <%s> with nuses=%d, cons pointer %p\n", (*cons)->name, (*cons)->nuses, (void*)(*cons));
6289 (*cons)->nuses--;
6290 if( (*cons)->nuses == 0 )
6291 {
6292 assert(!(*cons)->active || (*cons)->updatedeactivate);
6293
6294 /* check, if freeing constraint should be delayed */
6295 if( conshdlrAreUpdatesDelayed((*cons)->conshdlr) )
6296 {
6297 SCIPsetDebugMsg(set, " -> delaying freeing constraint <%s>\n", (*cons)->name);
6298 (*cons)->updatefree = TRUE;
6299 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6300 assert((*cons)->update);
6301 assert((*cons)->nuses == 1);
6302 }
6303 else
6304 {
6305 SCIP_CALL( SCIPconsFree(cons, blkmem, set) );
6306 }
6307 }
6308 *cons = NULL;
6309
6310 return SCIP_OKAY;
6311}
6312
6313/** outputs constraint information to file stream */
6315 SCIP_CONS* cons, /**< constraint to print */
6316 SCIP_SET* set, /**< global SCIP settings */
6317 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
6318 FILE* file /**< output file (or NULL for standard output) */
6319 )
6320{
6321 SCIP_CONSHDLR* conshdlr;
6322
6323 assert(cons != NULL);
6324 assert(set != NULL);
6325 assert(cons->scip == set->scip);
6326
6327 conshdlr = cons->conshdlr;
6328 assert(conshdlr != NULL);
6329
6330 SCIPmessageFPrintInfo(messagehdlr, file, " [%s] <%s>: ", conshdlr->name, cons->name);
6331
6332 if( conshdlr->consprint != NULL )
6333 {
6334 SCIP_CALL( conshdlr->consprint(set->scip, conshdlr, cons, file) );
6335 }
6336 else
6337 SCIPmessageFPrintInfo(messagehdlr, file, "constraint handler <%s> doesn't support printing constraint", conshdlr->name);
6338
6339 return SCIP_OKAY;
6340}
6341
6342/** method to collect the variables of a constraint
6343 *
6344 * If the number of variables is greater than the available slots in the variable array, nothing happens except that
6345 * the success point is set to FALSE. With the method SCIPconsGetNVars() it is possible to get the number of variables
6346 * a constraint has in its scope.
6347 *
6348 * @note The success pointer indicates if all variables were copied into the vars arrray.
6349 *
6350 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6351 * set to FALSE.
6352 */
6354 SCIP_CONS* cons, /**< constraint to get variables for */
6355 SCIP_SET* set, /**< global SCIP settings */
6356 SCIP_VAR** vars, /**< array to store the involved variable of the constraint */
6357 int varssize, /**< available slots in vars array which is needed to check if the array is large enough */
6358 SCIP_Bool* success /**< pointer to store whether the variables are successfully copied */
6359 )
6360{
6361 SCIP_CONSHDLR* conshdlr;
6362
6363 assert(cons != NULL);
6364 assert(set != NULL);
6365 assert(cons->scip == set->scip);
6366
6367 conshdlr = cons->conshdlr;
6368 assert(conshdlr != NULL);
6369
6370 if( conshdlr->consgetvars != NULL )
6371 {
6372 SCIP_CALL( conshdlr->consgetvars(set->scip, conshdlr, cons, vars, varssize, success) );
6373 }
6374 else
6375 {
6376 (*success) = FALSE;
6377 }
6378
6379 return SCIP_OKAY;
6380}
6381
6382/** method to collect the number of variables of a constraint
6383 *
6384 * @note The success pointer indicates if the contraint handler was able to return the number of variables
6385 *
6386 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6387 * set to FALSE
6388 */
6390 SCIP_CONS* cons, /**< constraint to get number of variables for */
6391 SCIP_SET* set, /**< global SCIP settings */
6392 int* nvars, /**< pointer to store the number of variables */
6393 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the number of variables */
6394 )
6395{
6396 SCIP_CONSHDLR* conshdlr;
6397
6398 assert(cons != NULL);
6399 assert(set != NULL);
6400 assert(cons->scip == set->scip);
6401
6402 conshdlr = cons->conshdlr;
6403 assert(conshdlr != NULL);
6404
6405 if( conshdlr->consgetnvars != NULL )
6406 {
6407 SCIP_CALL( conshdlr->consgetnvars(set->scip, conshdlr, cons, nvars, success) );
6408 }
6409 else
6410 {
6411 (*nvars) = 0;
6412 (*success) = FALSE;
6413 }
6414
6415 return SCIP_OKAY;
6416}
6417
6418/** method to collect the permutation symmetry detection graph of a constraint
6419 *
6420 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6421 *
6422 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6423 */
6425 SCIP_CONS* cons, /**< constraint to get graph for */
6426 SCIP_SET* set, /**< global SCIP settings */
6427 SYM_GRAPH* graph, /**< symmetry detection graph */
6428 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6429 )
6430{
6431 SCIP_CONSHDLR* conshdlr;
6432
6433 assert(cons != NULL);
6434 assert(set != NULL);
6435 assert(cons->scip == set->scip);
6436 assert(success != NULL);
6437
6438 conshdlr = cons->conshdlr;
6439 assert(conshdlr != NULL);
6440
6441 if( conshdlr->consgetpermsymgraph != NULL )
6442 {
6443 SCIP_CALL( conshdlr->consgetpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6444 }
6445 else
6446 *success = FALSE;
6447
6448 return SCIP_OKAY;
6449}
6450
6451/** method to collect the signed permutation symmetry detection graph of a constraint
6452 *
6453 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6454 *
6455 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6456 */
6458 SCIP_CONS* cons, /**< constraint to get graph for */
6459 SCIP_SET* set, /**< global SCIP settings */
6460 SYM_GRAPH* graph, /**< symmetry detection graph */
6461 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6462 )
6463{
6464 SCIP_CONSHDLR* conshdlr;
6465
6466 assert(cons != NULL);
6467 assert(set != NULL);
6468 assert(cons->scip == set->scip);
6469 assert(success != NULL);
6470
6471 conshdlr = cons->conshdlr;
6472 assert(conshdlr != NULL);
6473
6474 if( conshdlr->consgetsignedpermsymgraph != NULL )
6475 {
6476 SCIP_CALL( conshdlr->consgetsignedpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6477 }
6478 else
6479 *success = FALSE;
6480
6481 return SCIP_OKAY;
6482}
6483
6484/** globally removes constraint from all subproblems; removes constraint from the constraint set change data of the
6485 * node, where it was created, or from the problem, if it was a problem constraint
6486 */
6488 SCIP_CONS* cons, /**< constraint to delete */
6489 BMS_BLKMEM* blkmem, /**< block memory */
6490 SCIP_SET* set, /**< global SCIP settings */
6491 SCIP_STAT* stat, /**< dynamic problem statistics */
6492 SCIP_PROB* prob, /**< problem data */
6493 SCIP_REOPT* reopt /**< reoptimization data */
6494 )
6495{
6496 assert(cons != NULL);
6497 assert(cons->conshdlr != NULL);
6498 assert(!cons->active || cons->updatedeactivate || cons->addarraypos >= 0);
6499 assert(set != NULL);
6500 assert(cons->scip == set->scip);
6501
6502 SCIPsetDebugMsg(set, "globally deleting constraint <%s> (delay updates: %d)\n",
6503 cons->name, cons->conshdlr->delayupdatecount);
6504
6505 /* mark constraint deleted */
6506 cons->deleted = TRUE;
6507
6508 /* deactivate constraint, if it is currently active */
6509 if( cons->active && !cons->updatedeactivate )
6510 {
6511 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
6512 }
6513 else
6514 cons->updateactivate = FALSE;
6515
6516 if( set->reopt_enable && !SCIPreoptConsCanBeDeleted(reopt, cons) )
6517 return SCIP_OKAY;
6518
6519 assert(!cons->active || cons->updatedeactivate);
6520 assert(!cons->enabled || cons->updatedeactivate);
6521
6522 /* remove formerly active constraint from the conssetchg's addedconss / prob's conss array */
6523 if( cons->addarraypos >= 0 )
6524 {
6525 if( cons->addconssetchg == NULL )
6526 {
6527 /* remove problem constraint from the problem */
6528 SCIP_CALL( SCIPprobDelCons(prob, blkmem, set, stat, cons) );
6529 }
6530 else
6531 {
6532 assert(cons->addconssetchg->addedconss != NULL);
6533 assert(0 <= cons->addarraypos && cons->addarraypos < cons->addconssetchg->naddedconss);
6534 assert(cons->addconssetchg->addedconss[cons->addarraypos] == cons);
6535
6536 /* remove constraint from the constraint set change addedconss array */
6538 }
6539 }
6540
6541 return SCIP_OKAY;
6542}
6543
6544/** gets and captures transformed constraint of a given original constraint; if the constraint is not yet transformed,
6545 * a new transformed constraint for this constraint is created
6546 */
6548 SCIP_CONS* origcons, /**< original constraint */
6549 BMS_BLKMEM* blkmem, /**< block memory buffer */
6550 SCIP_SET* set, /**< global SCIP settings */
6551 SCIP_CONS** transcons /**< pointer to store the transformed constraint */
6552 )
6553{
6554 assert(origcons != NULL);
6555 assert(set != NULL);
6556 assert(origcons->scip == set->scip);
6557 assert(origcons->conshdlr != NULL);
6558 assert(origcons->original);
6559 assert(transcons != NULL);
6560
6561 /* check, if the constraint is already transformed */
6562 if( origcons->transorigcons != NULL )
6563 {
6564 *transcons = origcons->transorigcons;
6565 SCIPconsCapture(*transcons);
6566 }
6567 else
6568 {
6569 /* create transformed constraint */
6570 if( origcons->conshdlr->constrans != NULL )
6571 {
6572 /* use constraint handler's own method to transform constraint */
6573 SCIP_CALL( origcons->conshdlr->constrans(set->scip, origcons->conshdlr, origcons, transcons) );
6574 }
6575 else
6576 {
6577 /* create new constraint with a pointer copy of the constraint data */
6578 SCIP_CALL( SCIPconsCreate(transcons, blkmem, set, origcons->name, origcons->conshdlr, origcons->consdata, origcons->initial,
6579 origcons->separate, origcons->enforce, origcons->check, origcons->propagate,
6580 origcons->local, origcons->modifiable, origcons->dynamic, origcons->removable, origcons->stickingatnode,
6581 FALSE, FALSE) );
6582 }
6583
6584 /* link original and transformed constraint */
6585 origcons->transorigcons = *transcons;
6586 (*transcons)->transorigcons = origcons;
6587
6588 /* copy the number of upgradelocks */
6589 (*transcons)->nupgradelocks = origcons->nupgradelocks; /*lint !e732*/
6590 }
6591 assert(*transcons != NULL);
6592
6593 return SCIP_OKAY;
6594}
6595
6596/** sets the initial flag of the given constraint */
6598 SCIP_CONS* cons, /**< constraint */
6599 SCIP_SET* set, /**< global SCIP settings */
6600 SCIP_STAT* stat, /**< dynamic problem statistics */
6601 SCIP_Bool initial /**< new value */
6602 )
6603{
6604 assert(cons != NULL);
6605 assert(set != NULL);
6606 assert(cons->scip == set->scip);
6607
6608 if( cons->initial != initial )
6609 {
6610 cons->initial = initial;
6611 if( !cons->original )
6612 {
6613 if( cons->initial )
6614 {
6615 SCIP_CALL( conshdlrAddInitcons(SCIPconsGetHdlr(cons), set, stat, cons) );
6616 }
6617 else
6618 {
6619 if( cons->initconsspos >= 0 )
6620 {
6622 }
6623 }
6624 }
6625 }
6626
6627 return SCIP_OKAY;
6628}
6629
6630/** sets the separate flag of the given constraint */
6632 SCIP_CONS* cons, /**< constraint */
6633 SCIP_SET* set, /**< global SCIP settings */
6634 SCIP_Bool separate /**< new value */
6635 )
6636{
6637 assert(cons != NULL);
6638 assert(set != NULL);
6639 assert(cons->scip == set->scip);
6640
6641 if( cons->separate != separate )
6642 {
6644 {
6645 cons->separate = separate;
6646 }
6647 else if( cons->enabled && cons->sepaenabled )
6648 {
6649 if( separate )
6650 {
6651 cons->separate = separate;
6652 SCIP_CALL( conshdlrAddSepacons(cons->conshdlr, set, cons) );
6653 }
6654 else
6655 {
6656 conshdlrDelSepacons(cons->conshdlr, cons);
6657 cons->separate = separate;
6658 }
6659 }
6660 }
6661
6662 return SCIP_OKAY;
6663}
6664
6665/** sets the enforce flag of the given constraint */
6667 SCIP_CONS* cons, /**< constraint */
6668 SCIP_SET* set, /**< global SCIP settings */
6669 SCIP_Bool enforce /**< new value */
6670 )
6671{
6672 assert(cons != NULL);
6673 assert(set != NULL);
6674 assert(cons->scip == set->scip);
6675
6676 if( cons->enforce != enforce )
6677 {
6679 {
6680 cons->enforce = enforce;
6681 }
6682 else if( cons->enabled )
6683 {
6684 if( enforce )
6685 {
6686 cons->enforce = enforce;
6687 SCIP_CALL( conshdlrAddEnfocons(cons->conshdlr, set, cons) );
6688 }
6689 else
6690 {
6691 conshdlrDelEnfocons(cons->conshdlr, cons);
6692 cons->enforce = enforce;
6693 }
6694 }
6695 }
6696
6697 return SCIP_OKAY;
6698}
6699
6700/** sets the check flag of the given constraint */
6702 SCIP_CONS* cons, /**< constraint */
6703 SCIP_SET* set, /**< global SCIP settings */
6704 SCIP_Bool check /**< new value */
6705 )
6706{
6707 assert(cons != NULL);
6708 assert(set != NULL);
6709 assert(cons->scip == set->scip);
6710
6711 if( cons->check != check )
6712 {
6713 cons->check = check;
6714
6715 if( !cons->original )
6716 {
6717 /* if constraint is a problem constraint, update variable roundings locks */
6718 if( cons->addconssetchg == NULL && cons->addarraypos >= 0 )
6719 {
6720 if( cons->check )
6721 {
6723 }
6724 else
6725 {
6727 }
6728 }
6729
6730 /* if constraint is active, update the checkconss array of the constraint handler */
6731 if( cons->active )
6732 {
6733 if( cons->check )
6734 {
6735 SCIP_CALL( conshdlrAddCheckcons(cons->conshdlr, set, cons) );
6736 }
6737 else
6738 {
6739 conshdlrDelCheckcons(cons->conshdlr, cons);
6740 }
6741 }
6742 }
6743 }
6744
6745 return SCIP_OKAY;
6746}
6747
6748/** sets the propagate flag of the given constraint */
6750 SCIP_CONS* cons, /**< constraint */
6751 SCIP_SET* set, /**< global SCIP settings */
6752 SCIP_Bool propagate /**< new value */
6753 )
6754{
6755 assert(cons != NULL);
6756 assert(set != NULL);
6757 assert(cons->scip == set->scip);
6758
6759 if( cons->propagate != propagate )
6760 {
6762 {
6763 cons->propagate = propagate;
6764 }
6765 else if( cons->enabled && cons->propenabled )
6766 {
6767 if( propagate )
6768 {
6769 cons->propagate = propagate;
6770 SCIP_CALL( conshdlrAddPropcons(cons->conshdlr, set, cons) );
6771 }
6772 else
6773 {
6774 conshdlrDelPropcons(cons->conshdlr, cons);
6775 cons->propagate = propagate;
6776 }
6777 }
6778 }
6779
6780 return SCIP_OKAY;
6781}
6782
6783/** sets the local flag of the given constraint */
6785 SCIP_CONS* cons, /**< constraint */
6786 SCIP_Bool local /**< new value */
6787 )
6788{
6789 assert(cons != NULL);
6790
6791 cons->local = local;
6792 if( !local )
6793 cons->validdepth = 0;
6794}
6795
6796/** sets the modifiable flag of the given constraint */
6798 SCIP_CONS* cons, /**< constraint */
6799 SCIP_Bool modifiable /**< new value */
6800 )
6801{
6802 assert(cons != NULL);
6803
6804 cons->modifiable = modifiable;
6805}
6806
6807/** sets the dynamic flag of the given constraint */
6809 SCIP_CONS* cons, /**< constraint */
6810 SCIP_Bool dynamic /**< new value */
6811 )
6812{
6813 assert(cons != NULL);
6814
6815 cons->dynamic = dynamic;
6816}
6817
6818/** sets the removable flag of the given constraint */
6820 SCIP_CONS* cons, /**< constraint */
6821 SCIP_Bool removable /**< new value */
6822 )
6823{
6824 assert(cons != NULL);
6825
6826 cons->removable = removable;
6827}
6828
6829/** sets the stickingatnode flag of the given constraint */
6831 SCIP_CONS* cons, /**< constraint */
6832 SCIP_Bool stickingatnode /**< new value */
6833 )
6834{
6835 assert(cons != NULL);
6836
6837 cons->stickingatnode = stickingatnode;
6838}
6839
6840/** gives the constraint a new name; ATTENTION: to old pointer is over written that might
6841 * result in a memory leakage */
6843 SCIP_CONS* cons, /**< constraint */
6844 const char* name /**< new name of constraint */
6845 )
6846{
6847 assert( cons != NULL );
6848 assert( name != NULL );
6849
6850 cons->name = (char*)name;
6851}
6852
6853/** gets associated transformed constraint of an original constraint, or NULL if no associated transformed constraint
6854 * exists
6855 */
6857 SCIP_CONS* cons /**< constraint */
6858 )
6859{
6860 assert(cons->original);
6861
6862 return cons->transorigcons;
6863}
6864
6865/** activates constraint or marks constraint to be activated in next update */
6867 SCIP_CONS* cons, /**< constraint */
6868 SCIP_SET* set, /**< global SCIP settings */
6869 SCIP_STAT* stat, /**< dynamic problem statistics */
6870 int depth, /**< depth in the tree where the constraint activation takes place, or -1 for global problem */
6871 SCIP_Bool focusnode /**< does the constraint activation take place at the focus node? */
6872 )
6873{
6874 assert(cons != NULL);
6875 assert(!cons->original);
6876 assert(!cons->active);
6877 assert(!cons->updateactivate);
6878 assert(!cons->updatedeactivate);
6879 assert(!cons->updateenable);
6880 assert(!cons->updatedisable);
6881 assert(!cons->updateobsolete);
6882 assert(!cons->updatefree);
6883 assert(cons->activedepth == -2);
6884 assert(cons->conshdlr != NULL);
6885 assert(set != NULL);
6886 assert(cons->scip == set->scip);
6887
6889 {
6890 SCIPsetDebugMsg(set, "delayed activation of constraint <%s> in constraint handler <%s> (depth %d)\n",
6891 cons->name, cons->conshdlr->name, depth);
6892 cons->updateactivate = TRUE;
6893 cons->activedepth = depth;
6894 cons->updateactfocus = focusnode;
6896 assert(cons->update);
6897 }
6898 else
6899 {
6900 SCIP_CALL( conshdlrActivateCons(cons->conshdlr, set, stat, cons, depth, focusnode) );
6901 assert(cons->active);
6902 }
6903
6904 return SCIP_OKAY;
6905}
6906
6907/** deactivates constraint or marks constraint to be deactivated in next update */
6909 SCIP_CONS* cons, /**< constraint */
6910 SCIP_SET* set, /**< global SCIP settings */
6911 SCIP_STAT* stat /**< dynamic problem statistics */
6912 )
6913{
6914 assert(cons != NULL);
6915 assert(!cons->original);
6916 assert(cons->active);
6917 assert(!cons->updateactivate);
6918 assert(!cons->updatedeactivate);
6919 assert(cons->activedepth >= -1);
6920 assert(cons->conshdlr != NULL);
6921 assert(set != NULL);
6922 assert(cons->scip == set->scip);
6923
6925 {
6926 SCIPsetDebugMsg(set, "delayed deactivation of constraint <%s> in constraint handler <%s>\n",
6927 cons->name, cons->conshdlr->name);
6928 cons->updatedeactivate = TRUE;
6929 cons->activedepth = -2;
6931 assert(cons->update);
6932 }
6933 else
6934 {
6935 SCIP_CALL( conshdlrDeactivateCons(cons->conshdlr, set, stat, cons) );
6936 assert(!cons->active);
6937 }
6938
6939 return SCIP_OKAY;
6940}
6941
6942/** enables constraint's separation, enforcing, and propagation capabilities or marks them to be enabled in next update */
6944 SCIP_CONS* cons, /**< constraint */
6945 SCIP_SET* set, /**< global SCIP settings */
6946 SCIP_STAT* stat /**< dynamic problem statistics */
6947 )
6948{
6949 assert(cons != NULL);
6950 assert(!cons->original);
6951 assert(cons->conshdlr != NULL);
6952 assert(set != NULL);
6953 assert(cons->scip == set->scip);
6954
6955 if( !cons->active || cons->updatedeactivate || cons->updateenable || (cons->enabled && !cons->updatedisable) )
6956 return SCIP_OKAY;
6957
6958 assert(!cons->updateactivate);
6959
6961 {
6962 cons->updateenable = TRUE;
6964 assert(cons->update);
6965 }
6966 else
6967 {
6968 SCIP_CALL( conshdlrEnableCons(cons->conshdlr, set, stat, cons) );
6969 assert(cons->enabled);
6970 }
6971
6972 return SCIP_OKAY;
6973}
6974
6975/** disables constraint's separation, enforcing, and propagation capabilities or marks them to be disabled in next update */
6977 SCIP_CONS* cons, /**< constraint */
6978 SCIP_SET* set, /**< global SCIP settings */
6979 SCIP_STAT* stat /**< dynamic problem statistics */
6980 )
6981{
6982 assert(cons != NULL);
6983 assert(!cons->original);
6984 assert(cons->conshdlr != NULL);
6985 assert(set != NULL);
6986 assert(cons->scip == set->scip);
6987
6988 if( cons->updatedisable || (!cons->enabled && !cons->updateenable) )
6989 return SCIP_OKAY;
6990
6991 assert(cons->active);
6992 assert(!cons->updateactivate);
6993
6995 {
6996 cons->updatedisable = TRUE;
6998 assert(cons->update);
6999 }
7000 else
7001 {
7002 SCIP_CALL( conshdlrDisableCons(cons->conshdlr, set, stat, cons) );
7003 assert(!cons->enabled);
7004 }
7005
7006 return SCIP_OKAY;
7007}
7008
7009/** enables constraint's separation capabilities or marks them to be enabled in next update */
7011 SCIP_CONS* cons, /**< constraint */
7012 SCIP_SET* set /**< global SCIP settings */
7013 )
7014{
7015 assert(cons != NULL);
7016 assert(cons->conshdlr != NULL);
7017 assert(set != NULL);
7018 assert(cons->scip == set->scip);
7019
7020 if( cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable) )
7021 return SCIP_OKAY;
7022
7024 {
7025 cons->updatesepadisable = FALSE;
7026 cons->updatesepaenable = TRUE;
7028 assert(cons->update);
7029 }
7030 else
7031 {
7033 assert(cons->sepaenabled);
7034 }
7035
7036 return SCIP_OKAY;
7037}
7038
7039/** disables constraint's separation capabilities or marks them to be disabled in next update */
7041 SCIP_CONS* cons, /**< constraint */
7042 SCIP_SET* set /**< global SCIP settings */
7043 )
7044{
7045 assert(cons != NULL);
7046 assert(cons->conshdlr != NULL);
7047
7048 if( cons->updatesepadisable || (!cons->sepaenabled && !cons->updatesepaenable) )
7049 return SCIP_OKAY;
7050
7052 {
7053 cons->updatesepaenable = FALSE;
7054 cons->updatesepadisable = TRUE;
7056 assert(cons->update);
7057 }
7058 else
7059 {
7061 assert(!cons->sepaenabled);
7062 }
7063
7064 return SCIP_OKAY;
7065}
7066
7067/** enables constraint's propagation capabilities or marks them to be enabled in next update */
7069 SCIP_CONS* cons, /**< constraint */
7070 SCIP_SET* set /**< global SCIP settings */
7071 )
7072{
7073 assert(cons != NULL);
7074 assert(cons->conshdlr != NULL);
7075 assert(set != NULL);
7076 assert(cons->scip == set->scip);
7077
7078 if( cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable) )
7079 return SCIP_OKAY;
7080
7082 {
7083 cons->updatepropdisable = FALSE;
7084 cons->updatepropenable = TRUE;
7086 assert(cons->update);
7087 }
7088 else
7089 {
7091 assert(cons->propenabled);
7092 }
7093
7094 return SCIP_OKAY;
7095}
7096
7097/** disables constraint's propagation capabilities or marks them to be disabled in next update */
7099 SCIP_CONS* cons, /**< constraint */
7100 SCIP_SET* set /**< global SCIP settings */
7101 )
7102{
7103 assert(cons != NULL);
7104 assert(cons->conshdlr != NULL);
7105 assert(set != NULL);
7106 assert(cons->scip == set->scip);
7107
7108 if( cons->updatepropdisable || (!cons->propenabled && !cons->updatepropenable) )
7109 return SCIP_OKAY;
7110
7112 {
7113 cons->updatepropenable = FALSE;
7114 cons->updatepropdisable = TRUE;
7116 assert(cons->update);
7117 }
7118 else
7119 {
7121 assert(!cons->propenabled);
7122 }
7123
7124 return SCIP_OKAY;
7125}
7126
7127/** marks the constraint to be a conflict */
7129 SCIP_CONS* cons /**< constraint */
7130 )
7131{
7132 assert(cons != NULL);
7133
7134 cons->conflict = TRUE;
7135}
7136
7137/** marks the constraint to be propagated (update might be delayed) */
7139 SCIP_CONS* cons, /**< constraint */
7140 SCIP_SET* set /**< global SCIP settings */
7141 )
7142{
7143 assert(cons != NULL);
7144 assert(cons->conshdlr != NULL);
7145 assert(set != NULL);
7146 assert(cons->scip == set->scip);
7147
7148 if( cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate) )
7149 return SCIP_OKAY;
7150
7152 {
7154 cons->updatemarkpropagate = TRUE;
7156 assert(cons->update);
7157 }
7158 else
7159 {
7161 assert(cons->markpropagate || !cons->enabled);
7162 }
7163
7164 return SCIP_OKAY;
7165}
7166
7167/** unmarks the constraint to be propagated (update might be delayed) */
7169 SCIP_CONS* cons, /**< constraint */
7170 SCIP_SET* set /**< global SCIP settings */
7171 )
7172{
7173 assert(cons != NULL);
7174 assert(cons->conshdlr != NULL);
7175 assert(set != NULL);
7176 assert(cons->scip == set->scip);
7177
7178 if( cons->updateunmarkpropagate || (!cons->markpropagate && !cons->updatemarkpropagate) )
7179 return SCIP_OKAY;
7180
7182 {
7183 cons->updatemarkpropagate = FALSE;
7186 assert(cons->update);
7187 }
7188 else
7189 {
7191 assert(!cons->markpropagate || !cons->enabled);
7192 }
7193
7194 return SCIP_OKAY;
7195}
7196
7197/** adds given value to age of constraint, but age can never become negative;
7198 * should be called
7199 * - in constraint separation, if no cut was found for this constraint,
7200 * - in constraint enforcing, if constraint was feasible, and
7201 * - in constraint propagation, if no domain reduction was deduced;
7202 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7203 * in next update
7204 */
7206 SCIP_CONS* cons, /**< constraint */
7207 BMS_BLKMEM* blkmem, /**< block memory */
7208 SCIP_SET* set, /**< global SCIP settings */
7209 SCIP_STAT* stat, /**< dynamic problem statistics */
7210 SCIP_PROB* prob, /**< problem data */
7211 SCIP_Real deltaage, /**< value to add to the constraint's age */
7212 SCIP_REOPT* reopt /**< reoptimization data */
7213 )
7214{
7215 assert(cons != NULL);
7216 assert(cons->conshdlr != NULL);
7217 assert(!cons->updateactivate);
7218 assert(set != NULL);
7219 assert(cons->scip == set->scip);
7220
7221 /* no aging in presolving */
7222 if( set->stage == SCIP_STAGE_PRESOLVING )
7223 return SCIP_OKAY;
7224
7225 SCIPsetDebugMsg(set, "adding %g to age (%g) of constraint <%s> of handler <%s>\n",
7226 deltaage, cons->age, cons->name, cons->conshdlr->name);
7227
7228 cons->age += deltaage;
7229 cons->age = MAX(cons->age, 0.0);
7230
7231 if( !cons->original )
7232 {
7233 if( !cons->check && consExceedsAgelimit(cons, set) )
7234 {
7235 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
7236 }
7237 else if( !cons->obsolete && consExceedsObsoleteage(cons, set) )
7238 {
7240 {
7241 cons->updateobsolete = TRUE;
7243 assert(cons->update);
7244 }
7245 else
7246 {
7248 assert(cons->obsolete);
7249 }
7250 }
7251 }
7252
7253 return SCIP_OKAY;
7254}
7255
7256/** increases age of constraint by 1.0;
7257 * should be called
7258 * - in constraint separation, if no cut was found for this constraint,
7259 * - in constraint enforcing, if constraint was feasible, and
7260 * - in constraint propagation, if no domain reduction was deduced;
7261 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7262 * in next update
7263 */
7265 SCIP_CONS* cons, /**< constraint */
7266 BMS_BLKMEM* blkmem, /**< block memory */
7267 SCIP_SET* set, /**< global SCIP settings */
7268 SCIP_STAT* stat, /**< dynamic problem statistics */
7269 SCIP_PROB* prob, /**< problem data */
7270 SCIP_REOPT* reopt /**< reoptimization data */
7271 )
7272{
7273 SCIP_CALL( SCIPconsAddAge(cons, blkmem, set, stat, prob, 1.0, reopt) );
7274
7275 return SCIP_OKAY;
7276}
7277
7278/** resets age of constraint to zero;
7279 * should be called
7280 * - in constraint separation, if a cut was found for this constraint,
7281 * - in constraint enforcing, if the constraint was violated, and
7282 * - in constraint propagation, if a domain reduction was deduced;
7283 * if it was obsolete, makes constraint useful again or marks constraint to be made useful again in next update
7284 */
7286 SCIP_CONS* cons, /**< constraint */
7287 SCIP_SET* set /**< global SCIP settings */
7288 )
7289{
7290 assert(cons != NULL);
7291 assert(cons->conshdlr != NULL);
7292 assert(!cons->updateactivate);
7293 assert(set != NULL);
7294 assert(cons->scip == set->scip);
7295
7296 SCIPsetDebugMsg(set, "resetting age %g of constraint <%s> of handler <%s>\n", cons->age, cons->name, cons->conshdlr->name);
7297
7299 cons->age = 0.0;
7300
7301 if( cons->obsolete )
7302 {
7303 assert(!cons->original);
7305 {
7306 cons->updateobsolete = TRUE;
7308 assert(cons->update);
7309 }
7310 else
7311 {
7313 assert(!cons->obsolete);
7314 }
7315 }
7316
7317 return SCIP_OKAY;
7318}
7319
7320/** resolves the given conflicting bound, that was deduced by the given constraint, by putting all "reason" bounds
7321 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
7322 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
7323 *
7324 * @note it is sufficient to explain the relaxed bound change
7325 */
7327 SCIP_CONS* cons, /**< constraint that deduced the assignment */
7328 SCIP_SET* set, /**< global SCIP settings */
7329 SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
7330 int inferinfo, /**< user inference information attached to the bound change */
7331 SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
7332 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
7333 SCIP_Real relaxedbd, /**< the relaxed bound */
7334 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7335 )
7336{
7337 SCIP_CONSHDLR* conshdlr;
7338
7339 assert(set != NULL);
7340 assert(cons != NULL);
7341 assert((inferboundtype == SCIP_BOUNDTYPE_LOWER
7342 && SCIPgetVarLbAtIndex(set->scip, infervar, bdchgidx, TRUE) > SCIPvarGetLbGlobal(infervar))
7343 || (inferboundtype == SCIP_BOUNDTYPE_UPPER
7344 && SCIPgetVarUbAtIndex(set->scip, infervar, bdchgidx, TRUE) < SCIPvarGetUbGlobal(infervar)));
7345 assert(result != NULL);
7346 assert(cons->scip == set->scip);
7347
7348 *result = SCIP_DIDNOTRUN;
7349
7350 conshdlr = cons->conshdlr;
7351 assert(conshdlr != NULL);
7352
7353 if( conshdlr->consresprop != NULL )
7354 {
7355 /* start timing */
7356 SCIPclockStart(conshdlr->resproptime, set);
7357
7358 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, inferboundtype, bdchgidx,
7359 relaxedbd, result) );
7360
7361 /* stop timing */
7362 SCIPclockStop(conshdlr->resproptime, set);
7363
7364 /* update statistics */
7365 conshdlr->nrespropcalls++;
7366
7367 /* check result code */
7368 if( *result != SCIP_SUCCESS && *result != SCIP_DIDNOTFIND )
7369 {
7370 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7371 conshdlr->name, *result);
7372 return SCIP_INVALIDRESULT;
7373 }
7374 }
7375 else
7376 {
7377 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> is not implemented\n",
7378 conshdlr->name);
7379 return SCIP_PLUGINNOTFOUND;
7380 }
7381
7382 return SCIP_OKAY;
7383}
7384
7385/** adds given values to lock status of the constraint and updates the locks of the given locktype of the involved variables */
7387 SCIP_CONS* cons, /**< constraint */
7388 SCIP_SET* set, /**< global SCIP settings */
7389 SCIP_LOCKTYPE locktype, /**< type of variable locks */
7390 int nlockspos, /**< increase in number of rounding locks for constraint */
7391 int nlocksneg /**< increase in number of rounding locks for constraint's negation */
7392 )
7393{
7394 int oldnlockspos;
7395 int oldnlocksneg;
7396 int updlockpos;
7397 int updlockneg;
7398
7399 assert(cons != NULL);
7400 assert(cons->conshdlr != NULL);
7401 assert(cons->conshdlr->conslock != NULL);
7402 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
7403 assert(cons->nlockspos[locktype] >= 0);
7404 assert(cons->nlocksneg[locktype] >= 0);
7405 assert(-2 <= nlockspos && nlockspos <= 2);
7406 assert(-2 <= nlocksneg && nlocksneg <= 2);
7407 assert(set != NULL);
7408 assert(cons->scip == set->scip);
7409
7410 /* update the rounding locks */
7411 oldnlockspos = cons->nlockspos[locktype];
7412 oldnlocksneg = cons->nlocksneg[locktype];
7413 cons->nlockspos[locktype] += nlockspos;
7414 cons->nlocksneg[locktype] += nlocksneg;
7415 assert(cons->nlockspos[locktype] >= 0);
7416 assert(cons->nlocksneg[locktype] >= 0);
7417
7418 /* check, if the constraint switched from unlocked to locked, or from locked to unlocked */
7419 updlockpos = (int)(cons->nlockspos[locktype] > 0) - (int)(oldnlockspos > 0);
7420 updlockneg = (int)(cons->nlocksneg[locktype] > 0) - (int)(oldnlocksneg > 0);
7421
7422 /* lock the variables, if the constraint switched from unlocked to locked or from locked to unlocked */
7423 if( updlockpos != 0 || updlockneg != 0 )
7424 {
7425 SCIP_CALL( cons->conshdlr->conslock(set->scip, cons->conshdlr, cons, locktype, updlockpos, updlockneg) );
7426 }
7427
7428 return SCIP_OKAY;
7429}
7430
7431/** checks single constraint for feasibility of the given solution */
7433 SCIP_CONS* cons, /**< constraint to check */
7434 SCIP_SET* set, /**< global SCIP settings */
7435 SCIP_SOL* sol, /**< primal CIP solution */
7436 SCIP_Bool checkintegrality, /**< Has integrality to be checked? */
7437 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
7438 SCIP_Bool printreason, /**< Should the reason for the violation be printed? */
7439 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7440 )
7441{
7442 SCIP_CONSHDLR* conshdlr;
7443
7444 assert(cons != NULL);
7445 assert(set != NULL);
7446 assert(cons->scip == set->scip);
7447 assert(result != NULL);
7448
7449 conshdlr = cons->conshdlr;
7450 assert(conshdlr != NULL);
7451
7452 /* call external method */
7453 assert(conshdlr->conscheck != NULL);
7454
7455 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, &cons, 1, sol, checkintegrality, checklprows, printreason,
7456 FALSE, result) );
7457 SCIPsetDebugMsg(set, " -> checking returned result <%d>\n", *result);
7458
7459 if( *result != SCIP_INFEASIBLE && *result != SCIP_FEASIBLE )
7460 {
7461 SCIPerrorMessage("feasibility check of constraint handler <%s> on constraint <%s> returned invalid result <%d>\n",
7462 conshdlr->name, cons->name, *result);
7463 return SCIP_INVALIDRESULT;
7464 }
7465
7466 return SCIP_OKAY;
7467}
7468
7469/** enforces single constraint for a given pseudo solution */
7471 SCIP_CONS* cons, /**< constraint to enforce */
7472 SCIP_SET* set, /**< global SCIP settings */
7473 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7474 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
7475 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7476 )
7477{
7478 SCIP_CONSHDLR* conshdlr;
7479
7480 assert(cons != NULL);
7481 assert(set != NULL);
7482 assert(cons->scip == set->scip);
7483 assert(result != NULL);
7484
7485 conshdlr = cons->conshdlr;
7486 assert(conshdlr != NULL);
7487
7488 /* call external method */
7489 assert(conshdlr->consenfops != NULL);
7490
7491 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, &cons, 1, 1, solinfeasible, objinfeasible, result) );
7492 SCIPsetDebugMsg(set, " -> enfops returned result <%d>\n", *result);
7493
7494 if( *result != SCIP_CUTOFF
7495 && *result != SCIP_CONSADDED
7496 && *result != SCIP_REDUCEDDOM
7497 && *result != SCIP_BRANCHED
7498 && *result != SCIP_SOLVELP
7499 && *result != SCIP_INFEASIBLE
7500 && *result != SCIP_FEASIBLE
7501 && *result != SCIP_DIDNOTRUN )
7502 {
7503 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
7504 conshdlr->name, *result);
7505 return SCIP_INVALIDRESULT;
7506 }
7507
7508 /* do not update statistics */
7509
7510 return SCIP_OKAY;
7511}
7512
7513/** enforces single constraint for a given LP solution */
7515 SCIP_CONS* cons, /**< constraint to enforce */
7516 SCIP_SET* set, /**< global SCIP settings */
7517 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7518 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7519 )
7520{
7521 SCIP_CONSHDLR* conshdlr;
7522
7523 assert(cons != NULL);
7524 assert(set != NULL);
7525 assert(cons->scip == set->scip);
7526 assert(result != NULL);
7527
7528 conshdlr = cons->conshdlr;
7529 assert(conshdlr != NULL);
7530
7531 /* call external method */
7532 assert(conshdlr->consenfolp != NULL);
7533
7534 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, &cons, 1, 1, solinfeasible, result) );
7535 SCIPsetDebugMsg(set, " -> enfolp returned result <%d>\n", *result);
7536
7537 if( *result != SCIP_CUTOFF
7538 && *result != SCIP_CONSADDED
7539 && *result != SCIP_REDUCEDDOM
7540 && *result != SCIP_BRANCHED
7541 && *result != SCIP_SEPARATED
7542 && *result != SCIP_INFEASIBLE
7543 && *result != SCIP_FEASIBLE)
7544 {
7545 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP returned invalid result <%d>\n",
7546 conshdlr->name, *result);
7547 return SCIP_INVALIDRESULT;
7548 }
7549
7550 /* do not update statistics */
7551
7552 return SCIP_OKAY;
7553}
7554
7555/** enforces single constraint for a given relaxation solution */
7557 SCIP_CONS* cons, /**< constraint to enforce */
7558 SCIP_SET* set, /**< global SCIP settings */
7559 SCIP_SOL* sol, /**< solution to be enforced */
7560 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7561 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7562 )
7563{
7564 SCIP_CONSHDLR* conshdlr;
7565
7566 assert(cons != NULL);
7567 assert(set != NULL);
7568 assert(cons->scip == set->scip);
7569 assert(sol != NULL);
7570 assert(result != NULL);
7571
7572 conshdlr = cons->conshdlr;
7573 assert(conshdlr != NULL);
7574
7575 /* call external method */
7576 assert(conshdlr->consenfolp != NULL);
7577
7578 SCIP_CALL( conshdlr->consenforelax(set->scip, sol, conshdlr, &cons, 1, 1, solinfeasible, result) );
7579 SCIPdebugMessage(" -> enforelax returned result <%d>\n", *result);
7580
7581 if( *result != SCIP_CUTOFF
7582 && *result != SCIP_CONSADDED
7583 && *result != SCIP_REDUCEDDOM
7584 && *result != SCIP_BRANCHED
7585 && *result != SCIP_SEPARATED
7586 && *result != SCIP_INFEASIBLE
7587 && *result != SCIP_FEASIBLE)
7588 {
7589 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation returned invalid result <%d>\n",
7590 conshdlr->name, *result);
7591 return SCIP_INVALIDRESULT;
7592 }
7593
7594 /* do not update statistics */
7595
7596 return SCIP_OKAY;
7597}
7598
7599/** calls LP initialization method for single constraint */
7601 SCIP_CONS* cons, /**< constraint to initialize */
7602 SCIP_SET* set, /**< global SCIP settings */
7603 SCIP_Bool* infeasible /**< pointer to store whether infeasibility was detected while building the LP */
7604 )
7605{
7606 SCIP_CONSHDLR* conshdlr;
7607
7608 assert(cons != NULL);
7609 assert(set != NULL);
7610 assert(infeasible != NULL);
7611 assert(cons->scip == set->scip);
7612
7613 conshdlr = cons->conshdlr;
7614 assert(conshdlr != NULL);
7615
7616 /* call external method */
7617 if( conshdlr->consinitlp != NULL )
7618 {
7619 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &cons, 1, infeasible) );
7620 }
7621
7622 return SCIP_OKAY;
7623}
7624
7625/** calls separation method of single constraint for LP solution */
7627 SCIP_CONS* cons, /**< constraint to separate */
7628 SCIP_SET* set, /**< global SCIP settings */
7629 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7630 )
7631{
7632 SCIP_CONSHDLR* conshdlr;
7633
7634 assert(cons != NULL);
7635 assert(set != NULL);
7636 assert(cons->scip == set->scip);
7637 assert(result != NULL);
7638
7639 conshdlr = cons->conshdlr;
7640 assert(conshdlr != NULL);
7641
7642 /* call external method */
7643 if( conshdlr->conssepalp != NULL )
7644 {
7645 SCIP_CALL( conshdlr->conssepalp(set->scip, conshdlr, &cons, 1, 1, result) );
7646 SCIPsetDebugMsg(set, " -> sepalp returned result <%d>\n", *result);
7647
7648 if( *result != SCIP_CUTOFF
7649 && *result != SCIP_CONSADDED
7650 && *result != SCIP_REDUCEDDOM
7651 && *result != SCIP_SEPARATED
7652 && *result != SCIP_NEWROUND
7653 && *result != SCIP_DIDNOTFIND
7654 && *result != SCIP_DIDNOTRUN
7655 && *result != SCIP_DELAYED )
7656 {
7657 SCIPerrorMessage("separation method of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name,
7658 *result);
7659 return SCIP_INVALIDRESULT;
7660 }
7661 }
7662
7663 return SCIP_OKAY;
7664}
7665
7666/** calls separation method of single constraint for given primal solution */
7668 SCIP_CONS* cons, /**< constraint to separate */
7669 SCIP_SET* set, /**< global SCIP settings */
7670 SCIP_SOL* sol, /**< primal solution that should be separated */
7671 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7672 )
7673{
7674 SCIP_CONSHDLR* conshdlr;
7675
7676 assert(cons != NULL);
7677 assert(set != NULL);
7678 assert(cons->scip == set->scip);
7679 assert(sol != NULL);
7680 assert(result != NULL);
7681
7682 conshdlr = cons->conshdlr;
7683 assert(conshdlr != NULL);
7684
7685 /* call external method */
7686 if( conshdlr->conssepasol != NULL )
7687 {
7688 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, &cons, 1, 1, sol, result) );
7689 SCIPsetDebugMsg(set, " -> sepasol returned result <%d>\n", *result);
7690
7691 if( *result != SCIP_CUTOFF
7692 && *result != SCIP_CONSADDED
7693 && *result != SCIP_REDUCEDDOM
7694 && *result != SCIP_SEPARATED
7695 && *result != SCIP_NEWROUND
7696 && *result != SCIP_DIDNOTFIND
7697 && *result != SCIP_DIDNOTRUN
7698 && *result != SCIP_DELAYED )
7699 {
7700 SCIPerrorMessage("separation method of constraint handler for arbitrary primal solution <%s> returned invalid result <%d>\n",
7701 conshdlr->name, *result);
7702 return SCIP_INVALIDRESULT;
7703 }
7704 }
7705
7706 return SCIP_OKAY;
7707}
7708
7709/** calls domain propagation method of single constraint */
7711 SCIP_CONS* cons, /**< constraint to propagate */
7712 SCIP_SET* set, /**< global SCIP settings */
7713 SCIP_PROPTIMING proptiming, /**< current point in the node solving loop */
7714 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7715 )
7716{
7717 SCIP_CONSHDLR* conshdlr;
7718
7719 assert(cons != NULL);
7720 assert(set != NULL);
7721 assert(cons->scip == set->scip);
7722 assert(result != NULL);
7723
7724 conshdlr = cons->conshdlr;
7725 assert(conshdlr != NULL);
7726
7727 /* call external method */
7728 if( conshdlr->consprop != NULL )
7729 {
7730 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, &cons, 1, 1, 1, proptiming, result) );
7731 SCIPsetDebugMsg(set, " -> prop returned result <%d>\n", *result);
7732
7733 if( *result != SCIP_CUTOFF
7734 && *result != SCIP_CONSADDED
7735 && *result != SCIP_REDUCEDDOM
7736 && *result != SCIP_DIDNOTFIND
7737 && *result != SCIP_DIDNOTRUN
7738 && *result != SCIP_DELAYED )
7739 {
7740 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
7741 conshdlr->name, *result);
7742 return SCIP_INVALIDRESULT;
7743 }
7744 }
7745
7746 return SCIP_OKAY;
7747}
7748
7749/** resolves propagation conflict of single constraint */
7751 SCIP_CONS* cons, /**< constraint to resolve conflict for */
7752 SCIP_SET* set, /**< global SCIP settings */
7753 SCIP_VAR* infervar, /**< the conflict variable whose bound change has to be resolved */
7754 int inferinfo, /**< the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call */
7755 SCIP_BOUNDTYPE boundtype, /**< the type of the changed bound (lower or upper bound) */
7756 SCIP_BDCHGIDX* bdchgidx, /**< the index of the bound change, representing the point of time where the change took place */
7757 SCIP_Real relaxedbd, /**< the relaxed bound which is sufficient to be explained */
7758 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7759 )
7760{
7761 SCIP_CONSHDLR* conshdlr;
7762
7763 assert(cons != NULL);
7764 assert(set != NULL);
7765 assert(cons->scip == set->scip);
7766 assert(result != NULL);
7767 assert(infervar != NULL);
7768 assert(bdchgidx != NULL);
7769
7770 conshdlr = cons->conshdlr;
7771 assert(conshdlr != NULL);
7772
7773 /* call external method */
7774 if( conshdlr->consresprop != NULL )
7775 {
7776 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, boundtype, bdchgidx, relaxedbd, result) );
7777 SCIPsetDebugMsg(set, " -> resprop returned result <%d>\n", *result);
7778
7779 if( *result != SCIP_SUCCESS
7780 && *result != SCIP_DIDNOTFIND )
7781 {
7782 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7783 conshdlr->name, *result);
7784 return SCIP_INVALIDRESULT;
7785 }
7786 }
7787
7788 return SCIP_OKAY;
7789}
7790
7791/** presolves single constraint */
7793 SCIP_CONS* cons, /**< constraint to presolve */
7794 SCIP_SET* set, /**< global SCIP settings */
7795 int nrounds, /**< number of presolving rounds already done */
7796 SCIP_PRESOLTIMING timing, /**< current presolving timing */
7797 int nnewfixedvars, /**< number of variables fixed since the last call to the presolving method */
7798 int nnewaggrvars, /**< number of variables aggregated since the last call to the presolving method */
7799 int nnewchgvartypes, /**< number of variable type changes since the last call to the presolving method */
7800 int nnewchgbds, /**< number of variable bounds tightened since the last call to the presolving method */
7801 int nnewholes, /**< number of domain holes added since the last call to the presolving method */
7802 int nnewdelconss, /**< number of deleted constraints since the last call to the presolving method */
7803 int nnewaddconss, /**< number of added constraints since the last call to the presolving method */
7804 int nnewupgdconss, /**< number of upgraded constraints since the last call to the presolving method */
7805 int nnewchgcoefs, /**< number of changed coefficients since the last call to the presolving method */
7806 int nnewchgsides, /**< number of changed left or right hand sides since the last call to the presolving method */
7807 int* nfixedvars, /**< pointer to count total number of variables fixed of all presolvers */
7808 int* naggrvars, /**< pointer to count total number of variables aggregated of all presolvers */
7809 int* nchgvartypes, /**< pointer to count total number of variable type changes of all presolvers */
7810 int* nchgbds, /**< pointer to count total number of variable bounds tightened of all presolvers */
7811 int* naddholes, /**< pointer to count total number of domain holes added of all presolvers */
7812 int* ndelconss, /**< pointer to count total number of deleted constraints of all presolvers */
7813 int* naddconss, /**< pointer to count total number of added constraints of all presolvers */
7814 int* nupgdconss, /**< pointer to count total number of upgraded constraints of all presolvers */
7815 int* nchgcoefs, /**< pointer to count total number of changed coefficients of all presolvers */
7816 int* nchgsides, /**< pointer to count total number of changed left/right hand sides of all presolvers */
7817 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7818 )
7819{
7820 SCIP_CONSHDLR* conshdlr;
7821
7822 assert(cons != NULL);
7823 assert(set != NULL);
7824 assert(cons->scip == set->scip);
7825 assert(nfixedvars != NULL);
7826 assert(naggrvars != NULL);
7827 assert(nchgvartypes != NULL);
7828 assert(nchgbds != NULL);
7829 assert(naddholes != NULL);
7830 assert(ndelconss != NULL);
7831 assert(naddconss != NULL);
7832 assert(nupgdconss != NULL);
7833 assert(nchgcoefs != NULL);
7834 assert(nchgsides != NULL);
7835 assert(result != NULL);
7836
7837 conshdlr = cons->conshdlr;
7838 assert(conshdlr != NULL);
7839
7840 /* call external method */
7841 if( conshdlr->conspresol != NULL )
7842 {
7843 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, &cons, 1, nrounds, timing,
7844 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewholes, nnewdelconss, nnewaddconss,
7845 nnewupgdconss, nnewchgcoefs, nnewchgsides, nfixedvars, naggrvars, nchgvartypes,
7846 nchgbds, naddholes, ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
7847 SCIPsetDebugMsg(set, " -> presol returned result <%d>\n", *result);
7848
7849 if( *result != SCIP_UNBOUNDED
7850 && *result != SCIP_CUTOFF
7851 && *result != SCIP_SUCCESS
7852 && *result != SCIP_DIDNOTFIND
7853 && *result != SCIP_DIDNOTRUN
7854 && *result != SCIP_DELAYED )
7855 {
7856 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
7857 conshdlr->name, *result);
7858 return SCIP_INVALIDRESULT;
7859 }
7860 }
7861
7862 return SCIP_OKAY;
7863}
7864
7865/** calls constraint activation notification method of single constraint */
7867 SCIP_CONS* cons, /**< constraint to notify */
7868 SCIP_SET* set /**< global SCIP settings */
7869 )
7870{
7871 SCIP_CONSHDLR* conshdlr;
7872
7873 assert(cons != NULL);
7874 assert(set != NULL);
7875 assert(cons->scip == set->scip);
7876
7877 conshdlr = cons->conshdlr;
7878 assert(conshdlr != NULL);
7879
7880 /* call external method */
7881 if( conshdlr->consactive != NULL )
7882 {
7883 SCIP_CALL( conshdlr->consactive(set->scip, conshdlr, cons) );
7884 }
7885
7886 return SCIP_OKAY;
7887}
7888
7889/** calls constraint deactivation notification method of single constraint */
7891 SCIP_CONS* cons, /**< constraint to notify */
7892 SCIP_SET* set /**< global SCIP settings */
7893 )
7894{
7895 SCIP_CONSHDLR* conshdlr;
7896
7897 assert(cons != NULL);
7898 assert(set != NULL);
7899 assert(cons->scip == set->scip);
7900
7901 conshdlr = cons->conshdlr;
7902 assert(conshdlr != NULL);
7903
7904 /* call external method */
7905 if( conshdlr->consdeactive != NULL )
7906 {
7907 SCIP_CALL( conshdlr->consdeactive(set->scip, conshdlr, cons) );
7908 }
7909
7910 return SCIP_OKAY;
7911}
7912
7913
7914
7915/*
7916 * Hash functions
7917 */
7918
7919/** gets the key (i.e. the name) of the given constraint */
7920SCIP_DECL_HASHGETKEY(SCIPhashGetKeyCons)
7921{ /*lint --e{715}*/
7922 SCIP_CONS* cons = (SCIP_CONS*)elem;
7923
7924 assert(cons != NULL);
7925 return cons->name;
7926}
7927
7928
7929/*
7930 * method for arrays of contraint handlers
7931 */
7932
7933/** ensures size of storage for propagable constraints with a minimum size of num */
7934static
7936 SCIP_SET* set, /**< global SCIP settings */
7937 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
7938 int num /**< minimum number of entries to store */
7939 )
7940{
7941 assert(set != NULL);
7942 assert(conshdlr != NULL);
7943
7944 if( num > conshdlr->storedpropconsssize )
7945 {
7946 int newsize;
7947
7948 newsize = SCIPsetCalcMemGrowSize(set, num);
7949 SCIP_ALLOC( BMSreallocMemoryArray(&(conshdlr->storedpropconss), newsize) );
7950
7951 conshdlr->storedpropconsssize = newsize;
7952 }
7953 assert(num <= conshdlr->storedpropconsssize);
7954
7955 return SCIP_OKAY;
7956}
7957
7958/** stores all constraints marked for propagation away when probing is started */
7960 SCIP_SET* set, /**< global SCIP settings */
7961 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
7962 int nconshdlrs /**< number of contraint handlers */
7963 )
7964{
7965 SCIP_CONSHDLR* conshdlr;
7966 int c;
7967
7968 assert(set != NULL);
7969 assert(conshdlrs != NULL || nconshdlrs == 0);
7970
7971 for( c = nconshdlrs - 1; c >= 0; --c )
7972 {
7973 conshdlr = conshdlrs[c]; /*lint !e613*/
7974 assert(conshdlr != NULL);
7975 assert(conshdlr->storednmarkedpropconss == 0);
7976
7977 if( conshdlr->nmarkedpropconss > 0 )
7978 {
7979 int v;
7980
7981 SCIP_CALL( ensurePropagationStorage(set, conshdlr, conshdlr->nmarkedpropconss) );
7982 BMScopyMemoryArray(conshdlr->storedpropconss, conshdlr->propconss, conshdlr->nmarkedpropconss);
7983
7984 conshdlr->storednmarkedpropconss = conshdlr->nmarkedpropconss;
7985 conshdlr->storedpropdomchgcount = conshdlr->lastpropdomchgcount;
7986
7987 for( v = conshdlr->storednmarkedpropconss - 1; v >= 0; --v )
7988 {
7989 SCIPconsCapture(conshdlr->storedpropconss[v]);
7990 }
7991 /* assert(conshdlr->nmarkedpropconss == 0); this assert does not hold if updates are delayed */
7992 }
7993 }
7994
7995 return SCIP_OKAY;
7996}
7997
7998/** reset all constraints marked for propagation when probing was finished */
8000 SCIP_SET* set, /**< global SCIP settings */
8001 BMS_BLKMEM* blkmem, /**< block memory */
8002 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
8003 int nconshdlrs /**< number of contraint handlers */
8004 )
8005{
8006 SCIP_CONSHDLR* conshdlr;
8007 int c;
8008
8009 assert(set != NULL);
8010 assert(blkmem != NULL);
8011 assert(conshdlrs != NULL || nconshdlrs == 0);
8012
8013 for( c = nconshdlrs - 1; c >= 0; --c )
8014 {
8015 conshdlr = conshdlrs[c]; /*lint !e613*/
8016 assert(conshdlr != NULL);
8017
8018 if( conshdlr->storednmarkedpropconss > 0 )
8019 {
8020#ifndef NDEBUG
8021 int ndisabled = 0;
8022#endif
8023 int v;
8024
8025 for( v = conshdlr->nmarkedpropconss - 1; v >= 0; --v )
8026 {
8028 }
8029
8030 /* mark all previously marked constraint, which were marked before probing */
8031 for( v = 0; v < conshdlr->storednmarkedpropconss; ++v )
8032 {
8033 SCIP_CONS* cons = conshdlr->storedpropconss[v];
8034 assert(cons != NULL);
8035
8036 if( cons->enabled && cons->propagate && cons->propenabled )
8037 {
8039 }
8040#ifndef NDEBUG
8041 else
8042 ++ndisabled;
8043#endif
8044 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
8045 } /*lint !e438*/
8046
8047 assert(conshdlr->storednmarkedpropconss - ndisabled <= conshdlr->npropconss);
8048 assert(conshdlr->nmarkedpropconss + ndisabled >= conshdlr->storednmarkedpropconss || (conshdlrAreUpdatesDelayed(conshdlr) && conshdlr->nupdateconss + ndisabled >= conshdlr->storednmarkedpropconss));
8049
8050 conshdlr->lastpropdomchgcount = conshdlr->storedpropdomchgcount;
8051 conshdlr->storednmarkedpropconss = 0;
8052 }
8053 }
8054
8055 return SCIP_OKAY;
8056}
8057
8058/** create linear constraint statistics */
8060 SCIP* scip, /**< scip data structure */
8061 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8062 )
8063{
8064 assert(linconsstats != NULL);
8065
8066 SCIP_CALL( SCIPallocBlockMemory(scip, linconsstats) );
8067
8068 return SCIP_OKAY;
8069}
8070
8071/** free linear constraint statistics */
8073 SCIP* scip, /**< scip data structure */
8074 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8075 )
8076{
8077 assert(linconsstats != NULL);
8078 assert(*linconsstats != NULL);
8079
8080 SCIPfreeBlockMemory(scip, linconsstats);
8081}
8082
8083/** resets linear constraint statistics */
8085 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8086 )
8087{
8089 linconsstats->sum = 0;
8090}
8091
8092/** returns the number of occurrences of a specific type of linear constraint */
8094 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8095 SCIP_LINCONSTYPE linconstype /**< linear constraint type */
8096 )
8097{
8098 assert(linconsstats != NULL);
8099 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8100 assert(linconsstats->counter != NULL);
8101
8102 return linconsstats->counter[(int)linconstype];
8103}
8104
8105/** returns the total number of classified constraints */
8107 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8108 )
8109{
8110 assert(linconsstats != NULL);
8111
8112 return linconsstats->sum;
8113}
8114
8115/** increases the number of occurrences of a specific type of linear constraint */
8117 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8118 SCIP_LINCONSTYPE linconstype, /**< linear constraint type */
8119 int increment /**< positive increment */
8120 )
8121{
8122 assert(linconsstats != NULL);
8123 assert(increment >= 1);
8124 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8125 assert(linconsstats->counter != NULL);
8126
8127 linconsstats->counter[(int)linconstype] += increment;
8128 linconsstats->sum += increment;
8129}
8130
8131/** print linear constraint classification statistics */
8133 SCIP* scip, /**< scip data structure */
8134 FILE* file, /**< file handle or NULL to print to standard out */
8135 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8136 )
8137{
8138 assert(scip != NULL);
8139 assert(linconsstats != NULL);
8140
8141 /* print statistics */
8142 SCIPinfoMessage(scip, file, "\n");
8143 SCIPinfoMessage(scip, file, "%-19s : %10s\n", "Linear cons types", "count");
8144 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "total", SCIPlinConsStatsGetSum(linconsstats));
8145 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "empty", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EMPTY));
8146 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "free", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_FREE));
8147 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "singleton", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SINGLETON));
8148 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "aggregation", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_AGGREGATION));
8149 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "precedence", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_PRECEDENCE));
8150 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "varbound", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_VARBOUND));
8151 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpartition", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPARTITION));
8152 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPACKING));
8153 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setcovering", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETCOVERING));
8154 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "cardinality", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_CARDINALITY));
8155 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "invknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INVKNAPSACK));
8156 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "eqknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EQKNAPSACK));
8157 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "binpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_BINPACKING));
8158 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "knapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_KNAPSACK));
8159 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "intknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INTKNAPSACK));
8160 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "mixedbinary", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_MIXEDBINARY));
8161 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "general", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_GENERAL));
8162 SCIPinfoMessage(scip, file, "\n");
8163}
8164
8165/*
8166 * simple functions implemented as defines
8167 */
8168
8169/* In debug mode, the following methods are implemented as function calls to ensure
8170 * type validity.
8171 * In optimized mode, the methods are implemented as defines to improve performance.
8172 * However, we want to have them in the library anyways, so we have to undef the defines.
8173 */
8174
8175#undef SCIPconsGetName
8176#undef SCIPconsGetPos
8177#undef SCIPconsGetHdlr
8178#undef SCIPconsGetData
8179#undef SCIPconsGetNUses
8180#undef SCIPconsGetActiveDepth
8181#undef SCIPconsGetValidDepth
8182#undef SCIPconsIsActive
8183#undef SCIPconsIsEnabled
8184#undef SCIPconsIsSeparationEnabled
8185#undef SCIPconsIsPropagationEnabled
8186#undef SCIPconsIsDeleted
8187#undef SCIPconsIsObsolete
8188#undef SCIPconsIsConflict
8189#undef SCIPconsGetAge
8190#undef SCIPconsIsInitial
8191#undef SCIPconsIsSeparated
8192#undef SCIPconsIsEnforced
8193#undef SCIPconsIsChecked
8194#undef SCIPconsIsMarkedPropagate
8195#undef SCIPconsIsPropagated
8196#undef SCIPconsIsGlobal
8197#undef SCIPconsIsLocal
8198#undef SCIPconsIsModifiable
8199#undef SCIPconsIsDynamic
8200#undef SCIPconsIsRemovable
8201#undef SCIPconsIsStickingAtNode
8202#undef SCIPconsIsInProb
8203#undef SCIPconsIsOriginal
8204#undef SCIPconsIsTransformed
8205#undef SCIPconsIsLockedPos
8206#undef SCIPconsIsLockedNeg
8207#undef SCIPconsIsLocked
8208#undef SCIPconsGetNLocksPos
8209#undef SCIPconsGetNLocksNeg
8210#undef SCIPconsIsLockedTypePos
8211#undef SCIPconsIsLockedTypeNeg
8212#undef SCIPconsIsLockedType
8213#undef SCIPconsGetNLocksTypePos
8214#undef SCIPconsGetNLocksTypeNeg
8215#undef SCIPconsIsAdded
8216#undef SCIPconsGetNUpgradeLocks
8217
8218/** returns the name of the constraint
8219 *
8220 * @note to change the name of a constraint, use SCIPchgConsName() from scip.h
8221 */
8223 SCIP_CONS* cons /**< constraint */
8224 )
8225{
8226 assert(cons != NULL);
8227
8228 return cons->name;
8229}
8230
8231/** returns the position of constraint in the corresponding handler's conss array */
8233 SCIP_CONS* cons /**< constraint */
8234 )
8235{
8236 assert(cons != NULL);
8237
8238 return cons->consspos;
8239}
8240
8241/** returns the constraint handler of the constraint */
8243 SCIP_CONS* cons /**< constraint */
8244 )
8245{
8246 assert(cons != NULL);
8247
8248 return cons->conshdlr;
8249}
8250
8251/** returns the constraint data field of the constraint */
8253 SCIP_CONS* cons /**< constraint */
8254 )
8255{
8256 assert(cons != NULL);
8257
8258 return cons->consdata;
8259}
8260
8261/** gets number of times, the constraint is currently captured */
8263 SCIP_CONS* cons /**< constraint */
8264 )
8265{
8266 assert(cons != NULL);
8267
8268 return cons->nuses;
8269}
8270
8271/** for an active constraint, returns the depth in the tree at which the constraint was activated */
8273 SCIP_CONS* cons /**< constraint */
8274 )
8275{
8276 assert(cons != NULL);
8277 assert(SCIPconsIsActive(cons));
8278
8279 return cons->activedepth;
8280}
8281
8282/** returns TRUE iff constraint is active in the current node */
8284 SCIP_CONS* cons /**< constraint */
8285 )
8286{
8287 assert(cons != NULL);
8288
8289 return cons->updateactivate || (cons->active && !cons->updatedeactivate);
8290}
8291
8292/** returns TRUE iff constraint is active in the current node */
8294 SCIP_CONS* cons /**< constraint */
8295 )
8296{
8297 assert(cons != NULL);
8298
8299 return cons->updatedeactivate;
8300}
8301
8302/** returns the depth in the tree at which the constraint is valid; returns INT_MAX, if the constraint is local
8303 * and currently not active
8304 */
8306 SCIP_CONS* cons /**< constraint */
8307 )
8308{
8309 assert(cons != NULL);
8310 assert(cons->validdepth == 0 || cons->local);
8311
8312 return (!cons->local ? 0
8313 : !SCIPconsIsActive(cons) ? INT_MAX
8314 : cons->validdepth == -1 ? SCIPconsGetActiveDepth(cons)
8315 : cons->validdepth);
8316}
8317
8318/** returns TRUE iff constraint is enabled in the current node */
8320 SCIP_CONS* cons /**< constraint */
8321 )
8322{
8323 assert(cons != NULL);
8324
8325 return cons->updateenable || (cons->enabled && !cons->updatedisable);
8326}
8327
8328/** returns TRUE iff constraint's separation is enabled in the current node */
8330 SCIP_CONS* cons /**< constraint */
8331 )
8332{
8333 assert(cons != NULL);
8334
8335 return SCIPconsIsEnabled(cons)
8336 && (cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable));
8337}
8338
8339/** returns TRUE iff constraint's propagation is enabled in the current node */
8341 SCIP_CONS* cons /**< constraint */
8342 )
8343{
8344 assert(cons != NULL);
8345
8346 return SCIPconsIsEnabled(cons)
8347 && (cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable));
8348}
8349
8350/** returns TRUE iff constraint is deleted or marked to be deleted */
8352 SCIP_CONS* cons /**< constraint */
8353 )
8354{
8355 assert(cons != NULL);
8356
8357 return cons->deleted;
8358}
8359
8360/** returns TRUE iff constraint is marked obsolete */
8362 SCIP_CONS* cons /**< constraint */
8363 )
8364{
8365 assert(cons != NULL);
8366
8367 return cons->updateobsolete || cons->obsolete;
8368}
8369
8370/** returns TRUE iff constraint is marked as a conflict */
8372 SCIP_CONS* cons /**< constraint */
8373 )
8374{
8375 assert(cons != NULL);
8376
8377 return cons->conflict;
8378}
8379
8380/** gets age of constraint */
8382 SCIP_CONS* cons /**< constraint */
8383 )
8384{
8385 assert(cons != NULL);
8386
8387 return cons->age;
8388}
8389
8390/** returns TRUE iff the LP relaxation of constraint should be in the initial LP */
8392 SCIP_CONS* cons /**< constraint */
8393 )
8394{
8395 assert(cons != NULL);
8396
8397 return cons->initial;
8398}
8399
8400/** returns TRUE iff constraint should be separated during LP processing */
8402 SCIP_CONS* cons /**< constraint */
8403 )
8404{
8405 assert(cons != NULL);
8406
8407 return cons->separate;
8408}
8409
8410/** returns TRUE iff constraint should be enforced during node processing */
8412 SCIP_CONS* cons /**< constraint */
8413 )
8414{
8415 assert(cons != NULL);
8416
8417 return cons->enforce;
8418}
8419
8420/** returns TRUE iff constraint should be checked for feasibility */
8422 SCIP_CONS* cons /**< constraint */
8423 )
8424{
8425 assert(cons != NULL);
8426
8427 return cons->check;
8428}
8429
8430/** returns whether the constraint is marked for propagation */
8432 SCIP_CONS* cons /**< constraint */
8433 )
8434{
8435 assert(cons != NULL);
8436
8437 return (cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate));
8438}
8439
8440/** returns TRUE iff constraint should be propagated during node processing */
8442 SCIP_CONS* cons /**< constraint */
8443 )
8444{
8445 assert(cons != NULL);
8446
8447 return cons->propagate;
8448}
8449
8450/** returns TRUE iff constraint is globally valid */
8452 SCIP_CONS* cons /**< constraint */
8453 )
8454{
8455 assert(cons != NULL);
8456
8457 return !cons->local;
8458}
8459
8460/** returns TRUE iff constraint is only locally valid or not added to any (sub)problem */
8462 SCIP_CONS* cons /**< constraint */
8463 )
8464{
8465 assert(cons != NULL);
8466
8467 return cons->local;
8468}
8469
8470/** returns TRUE iff constraint is modifiable (subject to column generation) */
8472 SCIP_CONS* cons /**< constraint */
8473 )
8474{
8475 assert(cons != NULL);
8476
8477 return cons->modifiable;
8478}
8479
8480/** returns TRUE iff constraint is subject to aging */
8482 SCIP_CONS* cons /**< constraint */
8483 )
8484{
8485 assert(cons != NULL);
8486
8487 return cons->dynamic;
8488}
8489
8490/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8492 SCIP_CONS* cons /**< constraint */
8493 )
8494{
8495 assert(cons != NULL);
8496
8497 return cons->removable;
8498}
8499
8500/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8502 SCIP_CONS* cons /**< constraint */
8503 )
8504{
8505 assert(cons != NULL);
8506
8507 return cons->stickingatnode;
8508}
8509
8510/** returns TRUE iff constraint belongs to the global problem */
8512 SCIP_CONS* cons /**< constraint */
8513 )
8514{
8515 assert(cons != NULL);
8516
8517 return (cons->addconssetchg == NULL && cons->addarraypos >= 0);
8518}
8519
8520/** returns TRUE iff constraint is belonging to original space */
8522 SCIP_CONS* cons /**< constraint */
8523 )
8524{
8525 assert(cons != NULL);
8526
8527 return cons->original;
8528}
8529
8530/** returns TRUE iff constraint is belonging to transformed space */
8532 SCIP_CONS* cons /**< constraint */
8533 )
8534{
8535 assert(cons != NULL);
8536
8537 return !cons->original;
8538}
8539
8540/** returns TRUE iff roundings for variables in constraint are locked */
8542 SCIP_CONS* cons /**< constraint */
8543 )
8544{
8545 assert(cons != NULL);
8546
8547 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0);
8548}
8549
8550/** returns TRUE iff roundings for variables in constraint's negation are locked */
8552 SCIP_CONS* cons /**< constraint */
8553 )
8554{
8555 assert(cons != NULL);
8556
8557 return (cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8558}
8559
8560/** returns TRUE iff roundings for variables in constraint or in constraint's negation are locked */
8562 SCIP_CONS* cons /**< constraint */
8563 )
8564{
8565 assert(cons != NULL);
8566
8567 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0 || cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8568}
8569
8570/** get number of times the roundings for variables in constraint are locked */
8572 SCIP_CONS* cons /**< constraint */
8573 )
8574{
8575 assert(cons != NULL);
8576
8577 return cons->nlockspos[SCIP_LOCKTYPE_MODEL];
8578}
8579
8580/** get number of times the roundings for variables in constraint's negation are locked */
8582 SCIP_CONS* cons /**< constraint */
8583 )
8584{
8585 assert(cons != NULL);
8586
8587 return cons->nlocksneg[SCIP_LOCKTYPE_MODEL];
8588}
8589
8590/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8592 SCIP_CONS* cons, /**< constraint */
8593 SCIP_LOCKTYPE locktype /**< variable lock type */
8594 )
8595{
8596 assert(cons != NULL);
8597 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8598
8599 return (cons->nlockspos[locktype] > 0);
8600}
8601
8602/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8604 SCIP_CONS* cons, /**< constraint */
8605 SCIP_LOCKTYPE locktype /**< variable lock type */
8606 )
8607{
8608 assert(cons != NULL);
8609 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8610
8611 return (cons->nlocksneg[locktype] > 0);
8612}
8613
8614/** returns TRUE iff roundings of given locktype for variables in constraint or in constraint's negation are locked */
8616 SCIP_CONS* cons, /**< constraint */
8617 SCIP_LOCKTYPE locktype /**< variable lock type */
8618 )
8619{
8620 assert(cons != NULL);
8621 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8622
8623 return (cons->nlockspos[locktype] > 0 || cons->nlocksneg[locktype] > 0);
8624}
8625
8626/** get number of times the roundings of given locktype for variables in constraint are locked */
8628 SCIP_CONS* cons, /**< constraint */
8629 SCIP_LOCKTYPE locktype /**< variable lock type */
8630 )
8631{
8632 assert(cons != NULL);
8633 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8634
8635 return cons->nlockspos[locktype];
8636}
8637
8638/** get number of times the roundings of given locktype for variables in constraint's negation are locked */
8640 SCIP_CONS* cons, /**< constraint */
8641 SCIP_LOCKTYPE locktype /**< variable lock type */
8642 )
8643{
8644 assert(cons != NULL);
8645 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8646
8647 return cons->nlocksneg[locktype];
8648}
8649
8650/** returns if the constraint was already added to a SCIP instance */
8652 SCIP_CONS* cons /**< constraint */
8653 )
8654{
8655 assert(cons != NULL);
8656
8657 return (cons->addarraypos >= 0);
8658}
8659
8660/** adds locks to (dis-)allow upgrading of constraint */
8662 SCIP_CONS* cons, /**< constraint to add locks */
8663 int nlocks /**< number of locks to add */
8664 )
8665{
8666 assert(cons != NULL);
8667
8668 assert(cons->nupgradelocks < (1 << 28) - nlocks); /*lint !e574*/
8669 cons->nupgradelocks += (unsigned int) nlocks;
8670}
8671
8672/** gets number of locks against upgrading the constraint, 0 means this constraint can be upgraded */
8674 SCIP_CONS* cons /**< constraint */
8675 )
8676{
8677 assert(cons != NULL);
8678
8679 return (int) cons->nupgradelocks;
8680}
SCIP_DECL_CONSENFOPS(ConshdlrSubtour::scip_enfops)
SCIP_DECL_CONSSEPASOL(ConshdlrSubtour::scip_sepasol)
SCIP_DECL_CONSLOCK(ConshdlrSubtour::scip_lock)
SCIP_DECL_CONSDELETE(ConshdlrSubtour::scip_delete)
SCIP_DECL_CONSCOPY(ConshdlrSubtour::scip_copy)
SCIP_DECL_CONSSEPALP(ConshdlrSubtour::scip_sepalp)
SCIP_DECL_CONSTRANS(ConshdlrSubtour::scip_trans)
SCIP_DECL_CONSDELVARS(ConshdlrSubtour::scip_delvars)
SCIP_DECL_CONSPRINT(ConshdlrSubtour::scip_print)
SCIP_DECL_CONSCHECK(ConshdlrSubtour::scip_check)
SCIP_DECL_CONSPROP(ConshdlrSubtour::scip_prop)
SCIP_DECL_CONSENFOLP(ConshdlrSubtour::scip_enfolp)
static GRAPHNODE ** active
int SCIPbranchcandGetNPseudoCands(SCIP_BRANCHCAND *branchcand)
Definition: branch.c:852
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:7959
static SCIP_RETCODE conshdlrAddInitcons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition: cons.c:816
void SCIPconshdlrSetFree(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSFREE((*consfree)))
Definition: cons.c:4312
SCIP_RETCODE SCIPconsAddLocks(SCIP_CONS *cons, SCIP_SET *set, SCIP_LOCKTYPE locktype, int nlockspos, int nlocksneg)
Definition: cons.c:7386
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:2877
void SCIPconshdlrSetInitsol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINITSOL((*consinitsol)))
Definition: cons.c:4345
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:6082
SCIP_RETCODE SCIPconssetchgUndo(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:5702
SCIP_RETCODE SCIPconsEnableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7010
static SCIP_RETCODE conssetchgEnsureAddedconssSize(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition: cons.c:5402
void SCIPconshdlrSetTrans(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSTRANS((*constrans)))
Definition: cons.c:4429
SCIP_RETCODE SCIPconshdlrSetPresol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRESOL((*conspresol)), int maxprerounds, SCIP_PRESOLTIMING presoltiming)
Definition: cons.c:4389
void SCIPconshdlrIncNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4938
SCIP_RETCODE SCIPconshdlrInit(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:2411
static SCIP_RETCODE conssetchgDelAddedCons(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int arraypos)
Definition: cons.c:5526
static SCIP_RETCODE conshdlrEnableCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition: cons.c:1404
void SCIPconsMarkConflict(SCIP_CONS *cons)
Definition: cons.c:7128
SCIP_RETCODE SCIPconsEnable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6943
void SCIPconsCapture(SCIP_CONS *cons)
Definition: cons.c:6262
SCIP_RETCODE SCIPconsProp(SCIP_CONS *cons, SCIP_SET *set, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
Definition: cons.c:7710
static SCIP_RETCODE conssetchgCreate(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem)
Definition: cons.c:5326
SCIP_RETCODE SCIPconsPrint(SCIP_CONS *cons, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition: cons.c:6314
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:5884
void SCIPconshdlrIncNAppliedCuts(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4928
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 SCIPconsSetLocal(SCIP_CONS *cons, SCIP_Bool local)
Definition: cons.c:6784
SCIP_RETCODE SCIPconsMarkPropagate(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7138
void SCIPconshdlrSetInit(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINIT((*consinit)))
Definition: cons.c:4323
void SCIPconshdlrSetDelete(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDELETE((*consdelete)))
Definition: cons.c:4418
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:3163
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
static SCIP_RETCODE conssetchgEnsureDisabledconssSize(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition: cons.c:5426
SCIP_RETCODE SCIPconsDeactivate(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6908
void SCIPconshdlrSetParse(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPARSE((*consparse)))
Definition: cons.c:4528
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:2733
void SCIPconshdlrSetGetPermsymGraph(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)))
Definition: cons.c:4572
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:3034
void SCIPconshdlrSetGetNVars(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETNVARS((*consgetnvars)))
Definition: cons.c:4550
SCIP_RETCODE SCIPconsDisable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6976
SCIP_RETCODE SCIPconsDeactive(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7890
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:4175
void SCIPconshdlrSetActive(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSACTIVE((*consactive)))
Definition: cons.c:4462
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:3355
SCIP_RETCODE SCIPconsGetPermsymGraph(SCIP_CONS *cons, SCIP_SET *set, SYM_GRAPH *graph, SCIP_Bool *success)
Definition: cons.c:6424
SCIP_RETCODE SCIPconsGetNVars(SCIP_CONS *cons, SCIP_SET *set, int *nvars, SCIP_Bool *success)
Definition: cons.c:6389
static SCIP_RETCODE conshdlrEnsureUpdateconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition: cons.c:218
void SCIPconshdlrSetInitpre(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINITPRE((*consinitpre)))
Definition: cons.c:4367
void SCIPconsSetStickingAtNode(SCIP_CONS *cons, SCIP_Bool stickingatnode)
Definition: cons.c:6830
SCIP_RETCODE SCIPconsSetSeparated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool separate)
Definition: cons.c:6631
#define checkConssArrays(conshdlr)
Definition: cons.c:247
SCIP_RETCODE SCIPconsSepalp(SCIP_CONS *cons, SCIP_SET *set, SCIP_RESULT *result)
Definition: cons.c:7626
static SCIP_RETCODE conssetchgRelease(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:5347
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:7470
SCIP_RETCODE SCIPconsActive(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7866
#define AGERESETAVG_AGELIMIT
Definition: cons.c:58
SCIP_RETCODE SCIPconsResetAge(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7285
static SCIP_RETCODE conshdlrEnsureInitconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition: cons.c:98
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:7935
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:7750
void SCIPconsSetRemovable(SCIP_CONS *cons, SCIP_Bool removable)
Definition: cons.c:6819
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:2286
void SCIPconshdlrEnableOrDisableClocks(SCIP_CONSHDLR *conshdlr, SCIP_Bool enable)
Definition: cons.c:4708
static SCIP_RETCODE conssetchgDelDisabledCons(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int arraypos)
Definition: cons.c:5572
SCIP_RETCODE SCIPconsTransform(SCIP_CONS *origcons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_CONS **transcons)
Definition: cons.c:6547
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:7432
#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:5451
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:2770
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
void SCIPconshdlrSetDisable(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDISABLE((*consdisable)))
Definition: cons.c:4495
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:7205
void SCIPconshdlrSetGetSignedPermsymGraph(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)))
Definition: cons.c:4584
SCIP_RETCODE SCIPconsEnablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7068
static void conshdlrDelCheckcons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition: cons.c:1130
static void conshdlrDelayUpdates(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:1883
SCIP_DECL_HASHGETKEY(SCIPhashGetKeyCons)
Definition: cons.c:7920
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:7514
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:6597
SCIP_RETCODE SCIPconssetchgFree(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:5377
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:6187
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:7264
void SCIPconshdlrSetExitsol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSEXITSOL((*consexitsol)))
Definition: cons.c:4356
static SCIP_Bool consExceedsObsoleteage(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:371
SCIP_RETCODE SCIPconshdlrInitpre(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:2567
void SCIPconsSetDynamic(SCIP_CONS *cons, SCIP_Bool dynamic)
Definition: cons.c:6808
SCIP_RETCODE SCIPconsSepasol(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_RESULT *result)
Definition: cons.c:7667
SCIP_RETCODE SCIPconsFree(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:6207
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:5497
SCIP_RETCODE SCIPconsDelete(SCIP_CONS *cons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition: cons.c:6487
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:7792
SCIP_RETCODE SCIPconsDisablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7098
void SCIPconshdlrSetResprop(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSRESPROP((*consresprop)))
Definition: cons.c:4451
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:6026
static void conshdlrDelCons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition: cons.c:796
SCIP_RETCODE SCIPconsRelease(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:6274
void SCIPconshdlrSetInitlp(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINITLP((*consinitlp)))
Definition: cons.c:4440
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:7326
SCIP_RETCODE SCIPconsSetPropagated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool propagate)
Definition: cons.c:6749
SCIP_RETCODE SCIPconsDisableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7040
void SCIPconshdlrSetGetDiveBdChgs(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)))
Definition: cons.c:4561
static SCIP_RETCODE conshdlrEnsureSepaconssMem(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, int num)
Definition: cons.c:122
SCIP_RETCODE SCIPconsGetSignedPermsymGraph(SCIP_CONS *cons, SCIP_SET *set, SYM_GRAPH *graph, SCIP_Bool *success)
Definition: cons.c:6457
#define AGERESETAVG_INIT
Definition: cons.c:55
SCIP_RETCODE SCIPconshdlrUnlockVars(SCIP_CONSHDLR *conshdlr, SCIP_SET *set)
Definition: cons.c:4190
SCIP_RETCODE SCIPconsSetChecked(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool check)
Definition: cons.c:6701
SCIP_RETCODE SCIPconsInitlp(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool *infeasible)
Definition: cons.c:7600
SCIP_RETCODE SCIPconsEnforelax(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition: cons.c:7556
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:7999
void SCIPconshdlrSetExit(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSEXIT((*consexit)))
Definition: cons.c:4334
SCIP_RETCODE SCIPconshdlrCopyInclude(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_Bool *valid)
Definition: cons.c:1980
SCIP_RETCODE SCIPconsActivate(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool focusnode)
Definition: cons.c:6866
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
void SCIPconshdlrSetCopy(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), SCIP_DECL_CONSCOPY((*conscopy)))
Definition: cons.c:4297
void SCIPconshdlrSetDelvars(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDELVARS((*consdelvars)))
Definition: cons.c:4506
static void conshdlrDelSepacons(SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons)
Definition: cons.c:931
void SCIPconshdlrSetEnable(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSENABLE((*consenable)))
Definition: cons.c:4484
SCIP_CONS * SCIPconsGetTransformed(SCIP_CONS *cons)
Definition: cons.c:6856
#define AGERESETAVG_DECAY
Definition: cons.c:57
void SCIPconshdlrSetPrint(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRINT((*consprint)))
Definition: cons.c:4517
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:3830
SCIP_RETCODE SCIPconsUnmarkPropagate(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7168
SCIP_RETCODE SCIPconshdlrGetDiveBoundChanges(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_DIVESET *diveset, SCIP_SOL *sol, SCIP_Bool *success, SCIP_Bool *infeasible)
Definition: cons.c:3533
static void conshdlrUpdateAgeresetavg(SCIP_CONSHDLR *conshdlr, SCIP_Real age)
Definition: cons.c:343
void SCIPconshdlrSetDeactive(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDEACTIVE((*consdeactive)))
Definition: cons.c:4473
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:4001
SCIP_RETCODE SCIPconsGetVars(SCIP_CONS *cons, SCIP_SET *set, SCIP_VAR **vars, int varssize, SCIP_Bool *success)
Definition: cons.c:6353
void SCIPconsSetNamePointer(SCIP_CONS *cons, const char *name)
Definition: cons.c:6842
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:3560
SCIP_RETCODE SCIPconssetchgApply(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, int depth, SCIP_Bool focusnode)
Definition: cons.c:5615
SCIP_RETCODE SCIPconshdlrDelVars(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:4144
SCIP_RETCODE SCIPconsSetEnforced(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool enforce)
Definition: cons.c:6666
void SCIPconsSetModifiable(SCIP_CONS *cons, SCIP_Bool modifiable)
Definition: cons.c:6797
void SCIPconshdlrSetGetVars(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETVARS((*consgetvars)))
Definition: cons.c:4539
static SCIP_RETCODE conshdlrDeactivateCons(SCIP_CONSHDLR *conshdlr, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition: cons.c:1607
void SCIPconshdlrSetExitpre(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSEXITPRE((*consexitpre)))
Definition: cons.c:4378
SCIP_RETCODE SCIPconshdlrExitpre(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:2653
SCIP_RETCODE SCIPconshdlrInitsol(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:2693
SCIP_RETCODE SCIPconssetchgMakeGlobal(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition: cons.c:5788
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:3768
SCIP_RETCODE SCIPconshdlrExit(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:2524
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:2366
internal methods for constraints and constraint handlers
common defines and data types used in all packages of SCIP
#define NULL
Definition: def.h:266
#define SCIP_MAXSTRLEN
Definition: def.h:287
#define SCIP_Longint
Definition: def.h:157
#define SCIP_MAXTREEDEPTH
Definition: def.h:315
#define SCIP_Bool
Definition: def.h:91
#define MIN(x, y)
Definition: def.h:242
#define SCIP_ALLOC(x)
Definition: def.h:384
#define SCIP_Real
Definition: def.h:172
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define MAX(x, y)
Definition: def.h:238
#define SCIP_CALL(x)
Definition: def.h:373
#define SCIP_CALL_FINALLY(x, y)
Definition: def.h:415
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
Definition: scip_message.c:208
int SCIPconshdlrGetNCheckConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4664
void SCIPconshdlrSetData(SCIP_CONSHDLR *conshdlr, SCIP_CONSHDLRDATA *conshdlrdata)
Definition: cons.c:4235
int SCIPconshdlrGetMaxNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4978
SCIP_Real SCIPconshdlrGetCheckTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4808
SCIP_PROPTIMING SCIPconshdlrGetPropTiming(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5258
SCIP_Bool SCIPconshdlrWasSolSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5218
SCIP_Longint SCIPconshdlrGetNCheckCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4878
SCIP_CONS ** SCIPconshdlrGetCheckConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4621
int SCIPconshdlrGetNChgSides(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5088
SCIP_Real SCIPconshdlrGetPresolTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4738
int SCIPconshdlrGetEagerFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5158
SCIP_Bool SCIPconshdlrDoesPresolve(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5178
void SCIPconshdlrSetProp(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING timingmask)
Definition: cons.c:4267
int SCIPconshdlrGetNFixedVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4998
SCIP_PRESOLTIMING SCIPconshdlrGetPresolTiming(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5280
SCIP_Real SCIPconshdlrGetEnfoLPTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4758
int SCIPconshdlrGetNPresolCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5098
SCIP_Longint SCIPconshdlrGetNDomredsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4958
int SCIPconshdlrGetSepaPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5108
SCIP_Longint SCIPconshdlrGetNCutsApplied(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4918
int SCIPconshdlrGetNChgCoefs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5078
void SCIPconshdlrSetPresolTiming(SCIP_CONSHDLR *conshdlr, SCIP_PRESOLTIMING presoltiming)
Definition: cons.c:5290
int SCIPconshdlrGetNUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4698
SCIP_CONS ** SCIPconshdlrGetEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4611
void SCIPconshdlrSetSepa(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), int sepafreq, int sepapriority, SCIP_Bool delaysepa)
Definition: cons.c:4246
SCIP_Real SCIPconshdlrGetStrongBranchPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4798
void SCIPconshdlrSetEnforelax(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSENFORELAX((*consenforelax)))
Definition: cons.c:4286
SCIP_Longint SCIPconshdlrGetNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4908
SCIP_Bool SCIPconshdlrSupportsSignedPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5311
SCIP_Bool SCIPconshdlrIsPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5198
SCIP_Real SCIPconshdlrGetPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4788
void SCIPconssetchgGetAddedConsData(SCIP_CONSSETCHG *conssetchg, SCIP_CONS ***conss, int *nconss)
Definition: cons.c:5601
SCIP_Real SCIPconshdlrGetEnfoPSTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4768
int SCIPconshdlrGetPropFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5148
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4644
SCIP_Longint SCIPconshdlrGetNCutoffs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4898
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4205
int SCIPconshdlrGetNEnabledConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4688
SCIP_CONS ** SCIPconshdlrGetUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4634
SCIP_Bool SCIPconshdlrIsSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5188
SCIP_Longint SCIPconshdlrGetNSepaCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4828
int SCIPconshdlrGetNDelConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5048
SCIP_DECL_SORTPTRCOMP(SCIPconshdlrCompSepa)
Definition: cons.c:1956
SCIP_Bool SCIPconshdlrWasLPSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5208
SCIP_Longint SCIPconshdlrGetNChildren(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4968
SCIP_Real SCIPconshdlrGetEnfoRelaxTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4778
void SCIPconshdlrSetPropTiming(SCIP_CONSHDLR *conshdlr, SCIP_PROPTIMING proptiming)
Definition: cons.c:5268
SCIP_Bool SCIPconshdlrNeedsCons(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5168
int SCIPconshdlrGetNAggrVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5008
SCIP_Longint SCIPconshdlrGetNEnfoPSCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4848
int SCIPconshdlrGetNAddHoles(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5038
int SCIPconshdlrGetNEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4654
SCIP_Bool SCIPconshdlrIsInitialized(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5238
int SCIPconshdlrGetNUpgdConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5068
int SCIPconshdlrGetStartNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4988
SCIP_Bool SCIPconshdlrWasPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5228
int SCIPconshdlrGetNAddConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5058
SCIP_Bool SCIPconshdlrSupportsPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5301
int SCIPconshdlrGetNChgBds(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5028
const char * SCIPconshdlrGetDesc(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4215
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4225
SCIP_Longint SCIPconshdlrGetNConssFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4948
int SCIPconshdlrGetNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4678
int SCIPconshdlrGetCheckPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5128
int SCIPconshdlrGetSepaFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5138
SCIP_Longint SCIPconshdlrGetNPropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4868
SCIP_Longint SCIPconshdlrGetNEnfoLPCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4838
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4601
int SCIPconshdlrGetEnfoPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5118
SCIP_Real SCIPconshdlrGetSetupTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4728
SCIP_Longint SCIPconshdlrGetNRespropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4888
SCIP_Real SCIPconshdlrGetSepaTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4748
SCIP_Bool SCIPconshdlrIsClonable(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5248
int SCIPconshdlrGetNChgVarTypes(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5018
SCIP_Real SCIPconshdlrGetRespropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4818
SCIP_Longint SCIPconshdlrGetNEnfoRelaxCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4858
SCIP_Bool SCIPconsIsLockedNeg(SCIP_CONS *cons)
Definition: cons.c:8551
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
Definition: cons.c:8252
void SCIPconsAddUpgradeLocks(SCIP_CONS *cons, int nlocks)
Definition: cons.c:8661
int SCIPconsGetPos(SCIP_CONS *cons)
Definition: cons.c:8232
SCIP_Bool SCIPconsIsConflict(SCIP_CONS *cons)
Definition: cons.c:8371
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
Definition: cons.c:8481
SCIP_Real SCIPconsGetAge(SCIP_CONS *cons)
Definition: cons.c:8381
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
Definition: cons.c:8242
int SCIPconsGetActiveDepth(SCIP_CONS *cons)
Definition: cons.c:8272
SCIP_Bool SCIPconsIsLockedPos(SCIP_CONS *cons)
Definition: cons.c:8541
SCIP_Bool SCIPconsIsPropagationEnabled(SCIP_CONS *cons)
Definition: cons.c:8340
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
Definition: cons.c:8391
int SCIPconsGetNUpgradeLocks(SCIP_CONS *cons)
Definition: cons.c:8673
SCIP_Bool SCIPconsIsMarkedPropagate(SCIP_CONS *cons)
Definition: cons.c:8431
int SCIPconsGetNLocksTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8639
int SCIPconsGetValidDepth(SCIP_CONS *cons)
Definition: cons.c:8305
SCIP_Bool SCIPconsIsOriginal(SCIP_CONS *cons)
Definition: cons.c:8521
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
Definition: cons.c:8421
SCIP_Bool SCIPconsIsDeleted(SCIP_CONS *cons)
Definition: cons.c:8351
SCIP_Bool SCIPconsIsUpdatedeactivate(SCIP_CONS *cons)
Definition: cons.c:8293
SCIP_Bool SCIPconsIsTransformed(SCIP_CONS *cons)
Definition: cons.c:8531
int SCIPconsGetNLocksPos(SCIP_CONS *cons)
Definition: cons.c:8571
SCIP_Bool SCIPconsIsLockedType(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8615
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
Definition: cons.c:8411
SCIP_Bool SCIPconsIsInProb(SCIP_CONS *cons)
Definition: cons.c:8511
SCIP_Bool SCIPconsIsGlobal(SCIP_CONS *cons)
Definition: cons.c:8451
SCIP_Bool SCIPconsIsActive(SCIP_CONS *cons)
Definition: cons.c:8283
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
Definition: cons.c:8441
SCIP_Bool SCIPconsIsLocal(SCIP_CONS *cons)
Definition: cons.c:8461
int SCIPconsGetNLocksNeg(SCIP_CONS *cons)
Definition: cons.c:8581
int SCIPconsGetNUses(SCIP_CONS *cons)
Definition: cons.c:8262
SCIP_Bool SCIPconsIsLockedTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8591
SCIP_Bool SCIPconsIsEnabled(SCIP_CONS *cons)
Definition: cons.c:8319
const char * SCIPconsGetName(SCIP_CONS *cons)
Definition: cons.c:8222
SCIP_Bool SCIPconsIsLocked(SCIP_CONS *cons)
Definition: cons.c:8561
SCIP_Bool SCIPconsIsSeparationEnabled(SCIP_CONS *cons)
Definition: cons.c:8329
SCIP_Bool SCIPconsIsLockedTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8603
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
Definition: cons.c:8471
SCIP_Bool SCIPconsIsAdded(SCIP_CONS *cons)
Definition: cons.c:8651
SCIP_Bool SCIPconsIsObsolete(SCIP_CONS *cons)
Definition: cons.c:8361
SCIP_Bool SCIPconsIsStickingAtNode(SCIP_CONS *cons)
Definition: cons.c:8501
int SCIPconsGetNLocksTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8627
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
Definition: cons.c:8401
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
Definition: cons.c:8491
#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:8106
void SCIPlinConsStatsIncTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype, int increment)
Definition: cons.c:8116
int SCIPlinConsStatsGetTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype)
Definition: cons.c:8093
void SCIPlinConsStatsFree(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition: cons.c:8072
void SCIPlinConsStatsReset(SCIP_LINCONSSTATS *linconsstats)
Definition: cons.c:8084
void SCIPprintLinConsStats(SCIP *scip, FILE *file, SCIP_LINCONSSTATS *linconsstats)
Definition: cons.c:8132
SCIP_RETCODE SCIPlinConsStatsCreate(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition: cons.c:8059
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
Definition: var.c:18096
SCIP_Real SCIPgetVarUbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
Definition: scip_var.c:2128
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
Definition: var.c:18086
SCIP_Real SCIPgetVarLbAtIndex(SCIP *scip, SCIP_VAR *var, SCIP_BDCHGIDX *bdchgidx, SCIP_Bool after)
Definition: scip_var.c:1992
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10880
void SCIPstrCopySection(const char *str, char startchar, char endchar, char *token, int size, char **endptr)
Definition: misc.c:11038
SCIP_RETCODE SCIPskipSpace(char **s)
Definition: misc.c:10869
static const char * paramname[]
Definition: lpi_msk.c:5171
#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:1390
SCIP_RETCODE SCIPprobAddCons(SCIP_PROB *prob, SCIP_SET *set, SCIP_STAT *stat, SCIP_CONS *cons)
Definition: prob.c:1319
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:8316
data structures and methods for collecting reoptimization information
SCIP callable library.
int SCIPsepastoreGetNCuts(SCIP_SEPASTORE *sepastore)
Definition: sepastore.c:1149
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:2984
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:2962
SCIP_CONSHDLR * SCIPsetFindConshdlr(SCIP_SET *set, const char *name)
Definition: set.c:3985
SCIP_STAGE SCIPsetGetStage(SCIP_SET *set)
Definition: set.c:2952
int SCIPsetCalcMemGrowSize(SCIP_SET *set, int num)
Definition: set.c:5764
internal methods for global SCIP settings
#define SCIPsetDebugMsg
Definition: set.h:1784
internal methods for problem statistics
SCIP_CONS ** addedconss
Definition: struct_cons.h:117
SCIP_CONS ** disabledconss
Definition: struct_cons.h:118
unsigned int nupgradelocks
Definition: struct_cons.h:107
unsigned int initial
Definition: struct_cons.h:68
int nlocksneg[NLOCKTYPES]
Definition: struct_cons.h:64
unsigned int updatefree
Definition: struct_cons.h:103
unsigned int updatesepaenable
Definition: struct_cons.h:98
int validdepth
Definition: struct_cons.h:66
SCIP_CONSDATA * consdata
Definition: struct_cons.h:51
unsigned int enabled
Definition: struct_cons.h:88
int enfoconsspos
Definition: struct_cons.h:60
SCIP_Real age
Definition: struct_cons.h:48
unsigned int dynamic
Definition: struct_cons.h:77
int addarraypos
Definition: struct_cons.h:56
unsigned int propagate
Definition: struct_cons.h:72
unsigned int updateobsolete
Definition: struct_cons.h:102
unsigned int updatesepadisable
Definition: struct_cons.h:99
SCIP_CONSSETCHG * addconssetchg
Definition: struct_cons.h:54
char * name
Definition: struct_cons.h:49
unsigned int updateenable
Definition: struct_cons.h:96
unsigned int updateactfocus
Definition: struct_cons.h:104
int sepaconsspos
Definition: struct_cons.h:59
unsigned int updateunmarkpropagate
Definition: struct_cons.h:106
unsigned int deleted
Definition: struct_cons.h:91
unsigned int updateactivate
Definition: struct_cons.h:94
unsigned int local
Definition: struct_cons.h:75
SCIP_CONS * transorigcons
Definition: struct_cons.h:52
int propconsspos
Definition: struct_cons.h:62
SCIP * scip
Definition: struct_cons.h:110
unsigned int updatedisable
Definition: struct_cons.h:97
unsigned int updatedeactivate
Definition: struct_cons.h:95
int activedepth
Definition: struct_cons.h:65
unsigned int active
Definition: struct_cons.h:82
unsigned int removable
Definition: struct_cons.h:78
unsigned int updatepropenable
Definition: struct_cons.h:100
unsigned int enforce
Definition: struct_cons.h:70
SCIP_CONSHDLR * conshdlr
Definition: struct_cons.h:50
unsigned int modifiable
Definition: struct_cons.h:76
int checkconsspos
Definition: struct_cons.h:61
unsigned int conflict
Definition: struct_cons.h:87
unsigned int original
Definition: struct_cons.h:80
unsigned int separate
Definition: struct_cons.h:69
unsigned int sepaenabled
Definition: struct_cons.h:73
int consspos
Definition: struct_cons.h:57
unsigned int obsolete
Definition: struct_cons.h:89
unsigned int update
Definition: struct_cons.h:92
int initconsspos
Definition: struct_cons.h:58
unsigned int stickingatnode
Definition: struct_cons.h:79
unsigned int propenabled
Definition: struct_cons.h:74
unsigned int check
Definition: struct_cons.h:71
int nlockspos[NLOCKTYPES]
Definition: struct_cons.h:63
unsigned int markpropagate
Definition: struct_cons.h:90
unsigned int updatemarkpropagate
Definition: struct_cons.h:105
unsigned int updatepropdisable
Definition: struct_cons.h:101
unsigned int updateinsert
Definition: struct_cons.h:93
SCIP_Longint nsepacalls
Definition: struct_cons.h:128
SCIP_CONS ** conss
Definition: struct_cons.h:190
int nusefulcheckconss
Definition: struct_cons.h:242
SCIP_CONS ** checkconss
Definition: struct_cons.h:197
int nusefulenfoconss
Definition: struct_cons.h:239
SCIP_CLOCK * presoltime
Definition: struct_cons.h:204
SCIP_RESULT lastenfolpresult
Definition: struct_cons.h:149
SCIP_Longint ndomredsfound
Definition: struct_cons.h:139
SCIP_PRESOLTIMING presoltiming
Definition: struct_cons.h:287
SCIP_CLOCK * enfopstime
Definition: struct_cons.h:207
SCIP_Longint lastenfolpdomchgcount
Definition: struct_cons.h:143
SCIP_CLOCK * enforelaxtime
Definition: struct_cons.h:208
int nusefulsepaconss
Definition: struct_cons.h:236
SCIP_Bool delayprop
Definition: struct_cons.h:278
int storednmarkedpropconss
Definition: struct_cons.h:248
SCIP_CLOCK * enfolptime
Definition: struct_cons.h:206
SCIP_Longint nenfolpcalls
Definition: struct_cons.h:129
SCIP_Longint ncutoffs
Definition: struct_cons.h:135
int storedpropconsssize
Definition: struct_cons.h:247
SCIP_CLOCK * proptime
Definition: struct_cons.h:209
SCIP_Longint ncheckcalls
Definition: struct_cons.h:133
SCIP_CLOCK * checktime
Definition: struct_cons.h:211
SCIP_RESULT lastenfopsresult
Definition: struct_cons.h:150
SCIP_Bool initialized
Definition: struct_cons.h:283
SCIP_Bool duringsepa
Definition: struct_cons.h:284
SCIP_CLOCK * sbproptime
Definition: struct_cons.h:210
int nusefulpropconss
Definition: struct_cons.h:246
SCIP_Longint nenforelaxcalls
Definition: struct_cons.h:131
SCIP_Longint lastsepalpcount
Definition: struct_cons.h:213
SCIP_Longint lastenfolplpcount
Definition: struct_cons.h:214
int lastnusefulpropconss
Definition: struct_cons.h:252
SCIP_Bool sepasolwasdelayed
Definition: struct_cons.h:281
SCIP_Bool propwasdelayed
Definition: struct_cons.h:282
SCIP_Bool sepalpwasdelayed
Definition: struct_cons.h:280
SCIP_Longint ncutsapplied
Definition: struct_cons.h:137
SCIP_CLOCK * resproptime
Definition: struct_cons.h:212
SCIP_RESULT lastenforelaxresult
Definition: struct_cons.h:151
int lastnusefulenfoconss
Definition: struct_cons.h:254
int nmarkedpropconss
Definition: struct_cons.h:245
int startnactiveconss
Definition: struct_cons.h:228
SCIP_Longint nchildren
Definition: struct_cons.h:140
SCIP_Longint nenfopscalls
Definition: struct_cons.h:130
SCIP_Longint lastenforelaxrelaxcount
Definition: struct_cons.h:215
SCIP_Bool needscons
Definition: struct_cons.h:279
int delayupdatecount
Definition: struct_cons.h:276
SCIP_Real ageresetavg
Definition: struct_cons.h:152
SCIP_Longint storedpropdomchgcount
Definition: struct_cons.h:142
SCIP_CONS ** sepaconss
Definition: struct_cons.h:195
SCIP_Longint lastenfolpnode
Definition: struct_cons.h:146
SCIP_PROPTIMING proptiming
Definition: struct_cons.h:286
SCIP_Bool delaysepa
Definition: struct_cons.h:277
SCIP_CONS ** enfoconss
Definition: struct_cons.h:196
SCIP_Longint lastenforelaxnode
Definition: struct_cons.h:148
SCIP_CONS ** initconss
Definition: struct_cons.h:194
SCIP_CONS ** storedpropconss
Definition: struct_cons.h:199
SCIP_Bool duringprop
Definition: struct_cons.h:285
SCIP_Longint lastpropdomchgcount
Definition: struct_cons.h:141
SCIP_Longint ncutsfound
Definition: struct_cons.h:136
SCIP_Longint lastenfopsnode
Definition: struct_cons.h:147
SCIP_Longint lastenforelaxdomchgcount
Definition: struct_cons.h:145
SCIP_Longint nrespropcalls
Definition: struct_cons.h:134
SCIP_Longint npropcalls
Definition: struct_cons.h:132
SCIP_CONSHDLRDATA * conshdlrdata
Definition: struct_cons.h:189
SCIP_CLOCK * sepatime
Definition: struct_cons.h:205
SCIP_CONS ** propconss
Definition: struct_cons.h:198
SCIP_CONS ** updateconss
Definition: struct_cons.h:202
int lastnusefulsepaconss
Definition: struct_cons.h:253
int lastnchgvartypes
Definition: struct_cons.h:257
SCIP_CLOCK * setuptime
Definition: struct_cons.h:203
SCIP_Longint nconssfound
Definition: struct_cons.h:138
SCIP_Longint lastenfopsdomchgcount
Definition: struct_cons.h:144
int counter[SCIP_NLINCONSTYPES]
Definition: struct_cons.h:293
SCIP_Longint nnodes
Definition: struct_stat.h:82
SCIP_Longint domchgcount
Definition: struct_stat.h:114
SCIP_Longint lpcount
Definition: struct_stat.h:190
SCIP_Longint nprobholechgs
Definition: struct_stat.h:118
SCIP_Longint ninitconssadded
Definition: struct_stat.h:123
SCIP_Longint relaxcount
Definition: struct_stat.h:191
SCIP_Longint nboundchgs
Definition: struct_stat.h:115
SCIP_Longint nholechgs
Definition: struct_stat.h:116
int nenabledconss
Definition: struct_stat.h:240
int nactiveconss
Definition: struct_stat.h:239
SCIP_Longint nprobboundchgs
Definition: struct_stat.h:117
int nchildren
Definition: struct_tree.h:223
datastructures for constraints and constraint handlers
Definition: heur_padm.c:135
SCIP_Bool SCIPtreeProbing(SCIP_TREE *tree)
Definition: tree.c:8385
int SCIPtreeGetCurrentDepth(SCIP_TREE *tree)
Definition: tree.c:8503
internal methods for branch and bound tree
@ SCIP_CLOCKTYPE_DEFAULT
Definition: type_clock.h:43
#define SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH(x)
Definition: type_cons.h:955
#define SCIP_DECL_CONSGETPERMSYMGRAPH(x)
Definition: type_cons.h:937
#define SCIP_DECL_CONSINITPRE(x)
Definition: type_cons.h:156
#define SCIP_DECL_CONSEXIT(x)
Definition: type_cons.h:136
#define SCIP_DECL_CONSGETVARS(x)
Definition: type_cons.h:866
#define SCIP_DECL_CONSINITSOL(x)
Definition: type_cons.h:201
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
Definition: type_cons.h:64
#define SCIP_DECL_CONSDISABLE(x)
Definition: type_cons.h:735
#define SCIP_DECL_CONSENFORELAX(x)
Definition: type_cons.h:388
#define SCIP_DECL_CONSGETDIVEBDCHGS(x)
Definition: type_cons.h:919
#define SCIP_DECL_CONSGETNVARS(x)
Definition: type_cons.h:884
#define SCIP_DECL_CONSRESPROP(x)
Definition: type_cons.h:611
@ 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:690
#define SCIP_DECL_CONSPARSE(x)
Definition: type_cons.h:844
#define SCIP_DECL_CONSDEACTIVE(x)
Definition: type_cons.h:705
#define SCIP_DECL_CONSPRESOL(x)
Definition: type_cons.h:560
#define SCIP_DECL_CONSENABLE(x)
Definition: type_cons.h:720
#define SCIP_DECL_CONSINITLP(x)
Definition: type_cons.h:259
#define SCIP_DECL_CONSEXITPRE(x)
Definition: type_cons.h:180
#define SCIP_DECL_CONSINIT(x)
Definition: type_cons.h:126
struct SCIP_ConsData SCIP_CONSDATA
Definition: type_cons.h:65
#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
enum SCIP_LinConstype SCIP_LINCONSTYPE
Definition: type_cons.h:91
@ SCIP_BOUNDTYPE_UPPER
Definition: type_lp.h:57
@ SCIP_BOUNDTYPE_LOWER
Definition: type_lp.h:56
enum SCIP_BoundType SCIP_BOUNDTYPE
Definition: type_lp.h:59
@ 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
Definition: type_retcode.h:53
@ SCIP_PLUGINNOTFOUND
Definition: type_retcode.h:54
@ SCIP_PARAMETERWRONGVAL
Definition: type_retcode.h:57
@ SCIP_OKAY
Definition: type_retcode.h:42
@ SCIP_INVALIDCALL
Definition: type_retcode.h:51
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
@ SCIP_STAGE_PROBLEM
Definition: type_set.h:45
@ SCIP_STAGE_PRESOLVING
Definition: type_set.h:49
#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:74
#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:67
#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:65
#define SCIP_PROPTIMING_ALWAYS
Definition: type_timing.h:72
#define SCIP_PROPTIMING_DURINGLPLOOP
Definition: type_timing.h:66
#define NLOCKTYPES
Definition: type_var.h:94
enum SCIP_LockType SCIP_LOCKTYPE
Definition: type_var.h:100
@ SCIP_LOCKTYPE_MODEL
Definition: type_var.h:97
internal methods for problem variables