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 assert( *nfixedvars - conshdlr->lastnfixedvars >= 0 );
4109 assert( *naggrvars - conshdlr->lastnaggrvars >= 0 );
4110 assert( *nchgvartypes - conshdlr->lastnchgvartypes >= 0 );
4111 assert( *nchgbds - conshdlr->lastnchgbds >= 0 );
4112 assert( *naddholes - conshdlr->lastnaddholes >= 0 );
4113 assert( *ndelconss - conshdlr->lastndelconss >= 0 );
4114 assert( *naddconss - conshdlr->lastnaddconss >= 0 );
4115 assert( *nupgdconss - conshdlr->lastnupgdconss >= 0 );
4116 assert( *nchgcoefs - conshdlr->lastnchgcoefs >= 0 );
4117 assert( *nchgsides - conshdlr->lastnchgsides >= 0 );
4118
4119 conshdlr->nfixedvars += *nfixedvars - conshdlr->lastnfixedvars;
4120 conshdlr->naggrvars += *naggrvars - conshdlr->lastnaggrvars;
4121 conshdlr->nchgvartypes += *nchgvartypes - conshdlr->lastnchgvartypes;
4122 conshdlr->nchgbds += *nchgbds - conshdlr->lastnchgbds;
4123 conshdlr->naddholes += *naddholes - conshdlr->lastnaddholes;
4124 conshdlr->ndelconss += *ndelconss - conshdlr->lastndelconss;
4125 conshdlr->naddconss += *naddconss - conshdlr->lastnaddconss;
4126 conshdlr->nupgdconss += *nupgdconss - conshdlr->lastnupgdconss;
4127 conshdlr->nchgcoefs += *nchgcoefs - conshdlr->lastnchgcoefs;
4128 conshdlr->nchgsides += *nchgsides - conshdlr->lastnchgsides;
4129
4130 /* check result code of callback method */
4131 if( *result != SCIP_CUTOFF
4132 && *result != SCIP_UNBOUNDED
4133 && *result != SCIP_SUCCESS
4134 && *result != SCIP_DIDNOTFIND
4135 && *result != SCIP_DIDNOTRUN
4136 && *result != SCIP_DELAYED )
4137 {
4138 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
4139 conshdlr->name, *result);
4140 return SCIP_INVALIDRESULT;
4141 }
4142
4143 /* increase the number of calls, if the presolving method tried to find reductions */
4144 if( *result != SCIP_DIDNOTRUN )
4145 ++(conshdlr->npresolcalls);
4146 }
4147
4148 SCIPsetDebugMsg(set, "after presolving %d constraints left of handler <%s>\n", conshdlr->nactiveconss, conshdlr->name);
4149 }
4150
4151 return SCIP_OKAY;
4152}
4153
4154/** calls variable deletion method of constraint handler */
4156 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4157 BMS_BLKMEM* blkmem, /**< block memory */
4158 SCIP_SET* set, /**< global SCIP settings */
4159 SCIP_STAT* stat /**< dynamic problem statistics */
4160 )
4161{
4162 assert(conshdlr != NULL);
4163 assert(set != NULL);
4164
4165 if( conshdlr->consdelvars != NULL )
4166 {
4167 SCIPsetDebugMsg(set, "deleting variables in constraints of handler <%s>\n", conshdlr->name);
4168
4169 /* during constraint processing, constraints of this handler may be deleted, activated, deactivated,
4170 * enabled, disabled, marked obsolete or useful, which would change the conss array given to the
4171 * external method; to avoid this, these changes will be buffered and processed after the method call
4172 */
4173 conshdlrDelayUpdates(conshdlr);
4174
4175 /* call external method */
4176 SCIP_CALL( conshdlr->consdelvars(set->scip, conshdlr, conshdlr->conss, conshdlr->nconss) );
4177
4178 /* perform the cached constraint updates */
4179 SCIP_CALL( conshdlrForceUpdates(conshdlr, blkmem, set, stat) );
4180 }
4181
4182 return SCIP_OKAY;
4183}
4184
4185/** locks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4187 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4188 SCIP_SET* set /**< global SCIP settings */
4189 )
4190{
4191 assert(conshdlr != NULL);
4192 assert(conshdlr->conslock != NULL);
4193 assert(!conshdlr->needscons);
4194
4195 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, +1, 0) );
4196
4197 return SCIP_OKAY;
4198}
4199
4200/** unlocks rounding of variables involved in the given constraint constraint handler that doesn't need constraints */
4202 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4203 SCIP_SET* set /**< global SCIP settings */
4204 )
4205{
4206 assert(conshdlr != NULL);
4207 assert(conshdlr->conslock != NULL);
4208 assert(!conshdlr->needscons);
4209
4210 SCIP_CALL( conshdlr->conslock(set->scip, conshdlr, NULL, SCIP_LOCKTYPE_MODEL, -1, 0) );
4211
4212 return SCIP_OKAY;
4213}
4214
4215/** gets name of constraint handler */
4217 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4218 )
4219{
4220 assert(conshdlr != NULL);
4221
4222 return conshdlr->name;
4223}
4224
4225/** gets description of constraint handler */
4227 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4228 )
4229{
4230 assert(conshdlr != NULL);
4231
4232 return conshdlr->desc;
4233}
4234
4235/** gets user data of constraint handler */
4237 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4238 )
4239{
4240 assert(conshdlr != NULL);
4241
4242 return conshdlr->conshdlrdata;
4243}
4244
4245/** sets user data of constraint handler; user has to free old data in advance! */
4247 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4248 SCIP_CONSHDLRDATA* conshdlrdata /**< new constraint handler user data */
4249 )
4250{
4251 assert(conshdlr != NULL);
4252
4253 conshdlr->conshdlrdata = conshdlrdata;
4254}
4255
4256/** sets all separation related callbacks of the constraint handler */
4258 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4259 SCIP_DECL_CONSSEPALP ((*conssepalp)), /**< separate cutting planes for LP solution */
4260 SCIP_DECL_CONSSEPASOL ((*conssepasol)), /**< separate cutting planes for arbitrary primal solution */
4261 int sepafreq, /**< frequency for separating cuts; zero means to separate only in the root node */
4262 int sepapriority, /**< priority of the constraint handler for separation */
4263 SCIP_Bool delaysepa /**< should separation method be delayed, if other separators found cuts? */
4264 )
4265{
4266 assert(conshdlr != NULL);
4267
4268 assert(conssepalp != NULL || conssepasol != NULL || sepafreq == -1);
4269
4270 conshdlr->conssepalp = conssepalp;
4271 conshdlr->conssepasol = conssepasol;
4272 conshdlr->sepafreq = sepafreq;
4273 conshdlr->sepapriority = sepapriority;
4274 conshdlr->delaysepa = delaysepa;
4275}
4276
4277/** sets both the propagation callback and the propagation frequency of the constraint handler */
4279 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4280 SCIP_DECL_CONSPROP ((*consprop)), /**< propagate variable domains */
4281 int propfreq, /**< frequency for propagating domains; zero means only preprocessing propagation */
4282 SCIP_Bool delayprop, /**< should propagation method be delayed, if other propagators found reductions? */
4283 SCIP_PROPTIMING timingmask /**< positions in the node solving loop where propagators should be executed */
4284 )
4285{
4286 assert(conshdlr != NULL);
4287
4288 assert(consprop != NULL || propfreq == -1);
4289
4290 conshdlr->consprop = consprop;
4291 conshdlr->propfreq = propfreq;
4292 conshdlr->delayprop = delayprop;
4293 conshdlr->proptiming = timingmask;
4294}
4295
4296/** sets copy method of both the constraint handler and each associated constraint */
4298 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4299 SCIP_DECL_CONSENFORELAX ((*consenforelax)) /**< constraint copying method */
4300 )
4301{
4302 assert(conshdlr != NULL);
4303
4304 conshdlr->consenforelax = consenforelax;
4305}
4306
4307/** sets copy method of both the constraint handler and each associated constraint */
4309 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4310 SCIP_DECL_CONSHDLRCOPY((*conshdlrcopy)), /**< copy method of constraint handler or NULL if you don't want to copy your plugin into sub-SCIPs */
4311 SCIP_DECL_CONSCOPY ((*conscopy)) /**< constraint copying method */
4312 )
4313{
4314 assert(conshdlr != NULL);
4315
4316 assert(!conshdlr->needscons || (conshdlrcopy == NULL) == (conscopy == NULL));
4317
4318 conshdlr->conshdlrcopy = conshdlrcopy;
4319 conshdlr->conscopy = conscopy;
4320}
4321
4322/** sets destructor method of constraint handler */
4324 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4325 SCIP_DECL_CONSFREE ((*consfree)) /**< destructor of constraint handler */
4326 )
4327{
4328 assert(conshdlr != NULL);
4329
4330 conshdlr->consfree = consfree;
4331}
4332
4333/** sets initialization method of constraint handler */
4335 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4336 SCIP_DECL_CONSINIT ((*consinit)) /**< initialize constraint handler */
4337 )
4338{
4339 assert(conshdlr != NULL);
4340
4341 conshdlr->consinit = consinit;
4342}
4343
4344/** sets deinitialization method of constraint handler */
4346 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4347 SCIP_DECL_CONSEXIT ((*consexit)) /**< deinitialize constraint handler */
4348 )
4349{
4350 assert(conshdlr != NULL);
4351
4352 conshdlr->consexit = consexit;
4353}
4354
4355/** sets solving process initialization method of constraint handler */
4357 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4358 SCIP_DECL_CONSINITSOL((*consinitsol)) /**< solving process initialization method of constraint handler */
4359 )
4360{
4361 assert(conshdlr != NULL);
4362
4363 conshdlr->consinitsol = consinitsol;
4364}
4365
4366/** sets solving process deinitialization method of constraint handler */
4368 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4369 SCIP_DECL_CONSEXITSOL ((*consexitsol)) /**< solving process deinitialization method of constraint handler */
4370 )
4371{
4372 assert(conshdlr != NULL);
4373
4374 conshdlr->consexitsol = consexitsol;
4375}
4376
4377/** sets preprocessing initialization method of constraint handler */
4379 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4380 SCIP_DECL_CONSINITPRE((*consinitpre)) /**< preprocessing initialization method of constraint handler */
4381 )
4382{
4383 assert(conshdlr != NULL);
4384
4385 conshdlr->consinitpre = consinitpre;
4386}
4387
4388/** sets preprocessing deinitialization method of constraint handler */
4390 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4391 SCIP_DECL_CONSEXITPRE((*consexitpre)) /**< preprocessing deinitialization method of constraint handler */
4392 )
4393{
4394 assert(conshdlr != NULL);
4395
4396 conshdlr->consexitpre = consexitpre;
4397}
4398
4399/** sets presolving method of constraint handler */
4401 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4402 SCIP_DECL_CONSPRESOL ((*conspresol)), /**< presolving method of constraint handler */
4403 int maxprerounds, /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
4404 SCIP_PRESOLTIMING presoltiming /**< timing mask of the constraint handler's presolving method */
4405 )
4406{
4407 assert(conshdlr != NULL);
4408
4409 conshdlr->conspresol = conspresol;
4410 conshdlr->maxprerounds = maxprerounds;
4411
4412 /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate
4413 * error message
4414 */
4415 if( presoltiming < SCIP_PRESOLTIMING_FAST || presoltiming > SCIP_PRESOLTIMING_MAX )
4416 {
4417 SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate "
4418 "'SCIP_PRESOLTIMING' for <%s> constraint handler instead.\n", conshdlr->name);
4419
4421 }
4422
4423 conshdlr->presoltiming = presoltiming;
4424
4425 return SCIP_OKAY;
4426}
4427
4428/** sets method of constraint handler to free specific constraint data */
4430 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4431 SCIP_DECL_CONSDELETE ((*consdelete)) /**< free specific constraint data */
4432 )
4433{
4434 assert(conshdlr != NULL);
4435
4436 conshdlr->consdelete = consdelete;
4437}
4438
4439/** sets method of constraint handler to transform constraint data into data belonging to the transformed problem */
4441 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4442 SCIP_DECL_CONSTRANS ((*constrans)) /**< transform constraint data into data belonging to the transformed problem */
4443 )
4444{
4445 assert(conshdlr != NULL);
4446
4447 conshdlr->constrans = constrans;
4448}
4449
4450/** sets method of constraint handler to initialize LP with relaxations of "initial" constraints */
4452 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4453 SCIP_DECL_CONSINITLP ((*consinitlp)) /**< initialize LP with relaxations of "initial" constraints */
4454 )
4455{
4456 assert(conshdlr != NULL);
4457
4458 conshdlr->consinitlp = consinitlp;
4459}
4460
4461/** sets propagation conflict resolving method of constraint handler */
4463 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4464 SCIP_DECL_CONSRESPROP ((*consresprop)) /**< propagation conflict resolving method */
4465 )
4466{
4467 assert(conshdlr != NULL);
4468
4469 conshdlr->consresprop = consresprop;
4470}
4471
4472/** sets activation notification method of constraint handler */
4474 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4475 SCIP_DECL_CONSACTIVE ((*consactive)) /**< activation notification method */
4476 )
4477{
4478 assert(conshdlr != NULL);
4479
4480 conshdlr->consactive = consactive;
4481}
4482
4483/** sets deactivation notification method of constraint handler */
4485 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4486 SCIP_DECL_CONSDEACTIVE((*consdeactive)) /**< deactivation notification method */
4487 )
4488{
4489 assert(conshdlr != NULL);
4490
4491 conshdlr->consdeactive = consdeactive;
4492}
4493
4494/** sets enabling notification method of constraint handler */
4496 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4497 SCIP_DECL_CONSENABLE ((*consenable)) /**< enabling notification method */
4498 )
4499{
4500 assert(conshdlr != NULL);
4501
4502 conshdlr->consenable = consenable;
4503}
4504
4505/** sets disabling notification method of constraint handler */
4507 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4508 SCIP_DECL_CONSDISABLE ((*consdisable)) /**< disabling notification method */
4509 )
4510{
4511 assert(conshdlr != NULL);
4512
4513 conshdlr->consdisable = consdisable;
4514}
4515
4516/** sets variable deletion method of constraint handler */
4518 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4519 SCIP_DECL_CONSDELVARS ((*consdelvars)) /**< variable deletion method */
4520 )
4521{
4522 assert(conshdlr != NULL);
4523
4524 conshdlr->consdelvars = consdelvars;
4525}
4526
4527/** sets constraint display method of constraint handler */
4529 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4530 SCIP_DECL_CONSPRINT ((*consprint)) /**< constraint display method */
4531 )
4532{
4533 assert(conshdlr != NULL);
4534
4535 conshdlr->consprint = consprint;
4536}
4537
4538/** sets constraint parsing method of constraint handler */
4540 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4541 SCIP_DECL_CONSPARSE ((*consparse)) /**< constraint parsing method */
4542 )
4543{
4544 assert(conshdlr != NULL);
4545
4546 conshdlr->consparse = consparse;
4547}
4548
4549/** sets constraint variable getter method of constraint handler */
4551 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4552 SCIP_DECL_CONSGETVARS ((*consgetvars)) /**< constraint variable getter method */
4553 )
4554{
4555 assert(conshdlr != NULL);
4556
4557 conshdlr->consgetvars = consgetvars;
4558}
4559
4560/** sets constraint variable number getter method of constraint handler */
4562 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4563 SCIP_DECL_CONSGETNVARS((*consgetnvars)) /**< constraint variable number getter method */
4564 )
4565{
4566 assert(conshdlr != NULL);
4567
4568 conshdlr->consgetnvars = consgetnvars;
4569}
4570
4571/** sets diving enforcement method of constraint handler */
4573 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4574 SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)) /**< constraint handler diving solution enforcement method */
4575 )
4576{
4577 assert(conshdlr != NULL);
4578
4579 conshdlr->consgetdivebdchgs = consgetdivebdchgs;
4580}
4581
4582/** sets permutation symmetry detection graph getter method of constraint handler */
4584 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4585 SCIP_DECL_CONSGETPERMSYMGRAPH((*consgetpermsymgraph)) /**< constraint permutation symmetry detection graph
4586 * getter method */
4587 )
4588{
4589 assert(conshdlr != NULL);
4590
4591 conshdlr->consgetpermsymgraph = consgetpermsymgraph;
4592}
4593
4594/** sets signed permutation symmetry detection graph getter method of constraint handler */
4596 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
4597 SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)) /**< constraint permutation symmetry detection
4598 * graph getter method */
4599 )
4600{
4601 assert(conshdlr != NULL);
4602
4603 conshdlr->consgetsignedpermsymgraph = consgetsignedpermsymgraph;
4604}
4605
4606/** gets array with constraints of constraint handler; the first SCIPconshdlrGetNActiveConss() entries are the active
4607 * constraints, the last SCIPconshdlrGetNConss() - SCIPconshdlrGetNActiveConss() constraints are deactivated
4608 *
4609 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4610 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4611 */
4613 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4614 )
4615{
4616 assert(conshdlr != NULL);
4617
4618 return conshdlr->conss;
4619}
4620
4621/** gets array with enforced constraints of constraint handler; this is local information */
4623 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4624 )
4625{
4626 assert(conshdlr != NULL);
4627
4628 return conshdlr->enfoconss;
4629}
4630
4631/** gets array with checked constraints of constraint handler; this is local information */
4633 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4634 )
4635{
4636 assert(conshdlr != NULL);
4637
4638 return conshdlr->checkconss;
4639}
4640
4641/** gets array with delayed update constraints
4642 *
4643 * @attention Usually, there should be no need to access this array. Use this only if you are absolutely sure what you are doing.
4644 */
4646 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4647 )
4648{
4649 assert(conshdlr != NULL);
4650
4651 return conshdlr->updateconss;
4652}
4653
4654/** gets total number of existing transformed constraints of constraint handler */
4656 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4657 )
4658{
4659 assert(conshdlr != NULL);
4660
4661 return conshdlr->nconss;
4662}
4663
4664/** gets number of enforced constraints of constraint handler; this is local information */
4666 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4667 )
4668{
4669 assert(conshdlr != NULL);
4670
4671 return conshdlr->nenfoconss;
4672}
4673
4674/** gets number of checked constraints of constraint handler; this is local information */
4676 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4677 )
4678{
4679 assert(conshdlr != NULL);
4680
4681 return conshdlr->ncheckconss;
4682}
4683
4684/** gets number of active constraints of constraint handler
4685 *
4686 * @note A constraint is active if it is global and was not removed or it was added locally (in that case the local
4687 * flag is TRUE) and the current node belongs to the corresponding sub tree.
4688 */
4690 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4691 )
4692{
4693 assert(conshdlr != NULL);
4694
4695 return conshdlr->nactiveconss;
4696}
4697
4698/** gets number of enabled constraints of constraint handler */
4700 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4701 )
4702{
4703 assert(conshdlr != NULL);
4704
4705 return conshdlr->nenabledconss;
4706}
4707
4708/** gets number of constraints that have delayed updates */
4710 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4711 )
4712{
4713 assert(conshdlr != NULL);
4714
4715 return conshdlr->nupdateconss;
4716}
4717
4718/** enables or disables all clocks of \p conshdlr, depending on the value of the flag */
4720 SCIP_CONSHDLR* conshdlr, /**< the constraint handler for which all clocks should be enabled or disabled */
4721 SCIP_Bool enable /**< should the clocks of the constraint handler be enabled? */
4722 )
4723{
4724 assert(conshdlr != NULL);
4725
4726 SCIPclockEnableOrDisable(conshdlr->setuptime, enable);
4727 SCIPclockEnableOrDisable(conshdlr->checktime, enable);
4728 SCIPclockEnableOrDisable(conshdlr->enfolptime, enable);
4729 SCIPclockEnableOrDisable(conshdlr->enfopstime, enable);
4730 SCIPclockEnableOrDisable(conshdlr->enforelaxtime, enable);
4731 SCIPclockEnableOrDisable(conshdlr->presoltime, enable);
4732 SCIPclockEnableOrDisable(conshdlr->proptime, enable);
4733 SCIPclockEnableOrDisable(conshdlr->resproptime, enable);
4734 SCIPclockEnableOrDisable(conshdlr->sbproptime, enable);
4735 SCIPclockEnableOrDisable(conshdlr->sepatime, enable);
4736}
4737
4738/** gets time in seconds used for setting up this constraint handler for new stages */
4740 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4741 )
4742{
4743 assert(conshdlr != NULL);
4744
4745 return SCIPclockGetTime(conshdlr->setuptime);
4746}
4747
4748/** gets time in seconds used for presolving in this constraint handler */
4750 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4751 )
4752{
4753 assert(conshdlr != NULL);
4754
4755 return SCIPclockGetTime(conshdlr->presoltime);
4756}
4757
4758/** gets time in seconds used for separation in this constraint handler */
4760 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4761 )
4762{
4763 assert(conshdlr != NULL);
4764
4765 return SCIPclockGetTime(conshdlr->sepatime);
4766}
4767
4768/** gets time in seconds used for LP enforcement in this constraint handler */
4770 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4771 )
4772{
4773 assert(conshdlr != NULL);
4774
4775 return SCIPclockGetTime(conshdlr->enfolptime);
4776}
4777
4778/** gets time in seconds used for pseudo enforcement in this constraint handler */
4780 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4781 )
4782{
4783 assert(conshdlr != NULL);
4784
4785 return SCIPclockGetTime(conshdlr->enfopstime);
4786}
4787
4788/** gets time in seconds used for relaxation enforcement in this constraint handler */
4790 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4791 )
4792{
4793 assert(conshdlr != NULL);
4794
4795 return SCIPclockGetTime(conshdlr->enforelaxtime);
4796}
4797
4798/** gets time in seconds used for propagation in this constraint handler */
4800 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4801 )
4802{
4803 assert(conshdlr != NULL);
4804
4805 return SCIPclockGetTime(conshdlr->proptime);
4806}
4807
4808/** gets time in seconds used for propagation in this constraint handler during strong branching */
4810 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4811 )
4812{
4813 assert(conshdlr != NULL);
4814
4815 return SCIPclockGetTime(conshdlr->sbproptime);
4816}
4817
4818/** gets time in seconds used for feasibility checking in this constraint handler */
4820 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4821 )
4822{
4823 assert(conshdlr != NULL);
4824
4825 return SCIPclockGetTime(conshdlr->checktime);
4826}
4827
4828/** gets time in seconds used for resolving propagation in this constraint handler */
4830 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4831 )
4832{
4833 assert(conshdlr != NULL);
4834
4835 return SCIPclockGetTime(conshdlr->resproptime);
4836}
4837
4838/** gets number of calls to the constraint handler's separation method */
4840 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4841 )
4842{
4843 assert(conshdlr != NULL);
4844
4845 return conshdlr->nsepacalls;
4846}
4847
4848/** gets number of calls to the constraint handler's LP enforcing method */
4850 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4851 )
4852{
4853 assert(conshdlr != NULL);
4854
4855 return conshdlr->nenfolpcalls;
4856}
4857
4858/** gets number of calls to the constraint handler's pseudo enforcing method */
4860 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4861 )
4862{
4863 assert(conshdlr != NULL);
4864
4865 return conshdlr->nenfopscalls;
4866}
4867
4868/** gets number of calls to the constraint handler's relaxation enforcing method */
4870 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4871 )
4872{
4873 assert(conshdlr != NULL);
4874
4875 return conshdlr->nenforelaxcalls;
4876}
4877
4878/** gets number of calls to the constraint handler's propagation method */
4880 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4881 )
4882{
4883 assert(conshdlr != NULL);
4884
4885 return conshdlr->npropcalls;
4886}
4887
4888/** gets number of calls to the constraint handler's checking method */
4890 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4891 )
4892{
4893 assert(conshdlr != NULL);
4894
4895 return conshdlr->ncheckcalls;
4896}
4897
4898/** gets number of calls to the constraint handler's resolve propagation method */
4900 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4901 )
4902{
4903 assert(conshdlr != NULL);
4904
4905 return conshdlr->nrespropcalls;
4906}
4907
4908/** gets total number of times, this constraint handler detected a cutoff */
4910 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4911 )
4912{
4913 assert(conshdlr != NULL);
4914
4915 return conshdlr->ncutoffs;
4916}
4917
4918/** gets total number of cuts found by this constraint handler */
4920 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4921 )
4922{
4923 assert(conshdlr != NULL);
4924
4925 return conshdlr->ncutsfound;
4926}
4927
4928/** gets total number of cuts found by this constraint handler applied to lp */
4930 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4931 )
4932{
4933 assert(conshdlr != NULL);
4934
4935 return conshdlr->ncutsapplied;
4936}
4937
4938/** increase count of applied cuts */
4940 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4941 )
4942{
4943 assert(conshdlr != NULL);
4944
4945 ++conshdlr->ncutsapplied;
4946}
4947
4948/** increase count of found cuts */
4950 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4951 )
4952{
4953 assert(conshdlr != NULL);
4954
4955 ++conshdlr->ncutsfound;
4956}
4957
4958/** gets total number of additional constraints added by this constraint handler */
4960 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4961 )
4962{
4963 assert(conshdlr != NULL);
4964
4965 return conshdlr->nconssfound;
4966}
4967
4968/** gets total number of domain reductions found by this constraint handler */
4970 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4971 )
4972{
4973 assert(conshdlr != NULL);
4974
4975 return conshdlr->ndomredsfound;
4976}
4977
4978/** gets number of children created by this constraint handler */
4980 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4981 )
4982{
4983 assert(conshdlr != NULL);
4984
4985 return conshdlr->nchildren;
4986}
4987
4988/** gets maximum number of active constraints of constraint handler existing at the same time */
4990 SCIP_CONSHDLR* conshdlr /**< constraint handler */
4991 )
4992{
4993 assert(conshdlr != NULL);
4994
4995 return conshdlr->maxnactiveconss;
4996}
4997
4998/** gets initial number of active constraints of constraint handler */
5000 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5001 )
5002{
5003 assert(conshdlr != NULL);
5004
5005 return conshdlr->startnactiveconss;
5006}
5007
5008/** gets number of variables fixed in presolving method of constraint handler */
5010 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5011 )
5012{
5013 assert(conshdlr != NULL);
5014
5015 return conshdlr->nfixedvars;
5016}
5017
5018/** gets number of variables aggregated in presolving method of constraint handler */
5020 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5021 )
5022{
5023 assert(conshdlr != NULL);
5024
5025 return conshdlr->naggrvars;
5026}
5027
5028/** gets number of variable types changed in presolving method of constraint handler */
5030 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5031 )
5032{
5033 assert(conshdlr != NULL);
5034
5035 return conshdlr->nchgvartypes;
5036}
5037
5038/** gets number of bounds changed in presolving method of constraint handler */
5040 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5041 )
5042{
5043 assert(conshdlr != NULL);
5044
5045 return conshdlr->nchgbds;
5046}
5047
5048/** gets number of holes added to domains of variables in presolving method of constraint handler */
5050 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5051 )
5052{
5053 assert(conshdlr != NULL);
5054
5055 return conshdlr->naddholes;
5056}
5057
5058/** gets number of constraints deleted in presolving method of constraint handler */
5060 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5061 )
5062{
5063 assert(conshdlr != NULL);
5064
5065 return conshdlr->ndelconss;
5066}
5067
5068/** gets number of constraints added in presolving method of constraint handler */
5070 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5071 )
5072{
5073 assert(conshdlr != NULL);
5074
5075 return conshdlr->naddconss;
5076}
5077
5078/** gets number of constraints upgraded in presolving method of constraint handler */
5080 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5081 )
5082{
5083 assert(conshdlr != NULL);
5084
5085 return conshdlr->nupgdconss;
5086}
5087
5088/** gets number of coefficients changed in presolving method of constraint handler */
5090 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5091 )
5092{
5093 assert(conshdlr != NULL);
5094
5095 return conshdlr->nchgcoefs;
5096}
5097
5098/** gets number of constraint sides changed in presolving method of constraint handler */
5100 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5101 )
5102{
5103 assert(conshdlr != NULL);
5104
5105 return conshdlr->nchgsides;
5106}
5107
5108/** gets number of times the presolving method of the constraint handler was called and tried to find reductions */
5110 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5111 )
5112{
5113 assert(conshdlr != NULL);
5114
5115 return conshdlr->npresolcalls;
5116}
5117
5118/** gets separation priority of constraint handler */
5120 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5121 )
5122{
5123 assert(conshdlr != NULL);
5124
5125 return conshdlr->sepapriority;
5126}
5127
5128/** gets enforcing priority of constraint handler */
5130 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5131 )
5132{
5133 assert(conshdlr != NULL);
5134
5135 return conshdlr->enfopriority;
5136}
5137
5138/** gets checking priority of constraint handler */
5140 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5141 )
5142{
5143 assert(conshdlr != NULL);
5144
5145 return conshdlr->checkpriority;
5146}
5147
5148/** gets separation frequency of constraint handler */
5150 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5151 )
5152{
5153 assert(conshdlr != NULL);
5154
5155 return conshdlr->sepafreq;
5156}
5157
5158/** gets propagation frequency of constraint handler */
5160 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5161 )
5162{
5163 assert(conshdlr != NULL);
5164
5165 return conshdlr->propfreq;
5166}
5167
5168/** gets frequency of constraint handler for eager evaluations in separation, propagation and enforcement */
5170 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5171 )
5172{
5173 assert(conshdlr != NULL);
5174
5175 return conshdlr->eagerfreq;
5176}
5177
5178/** does the constraint handler need a constraint in order to be called? */
5180 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5181 )
5182{
5183 assert(conshdlr != NULL);
5184
5185 return conshdlr->needscons;
5186}
5187
5188/** does the constraint handler perform presolving? */
5190 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5191 )
5192{
5193 assert(conshdlr != NULL);
5194
5195 return (conshdlr->conspresol != NULL);
5196}
5197
5198/** should separation method be delayed, if other separators found cuts? */
5200 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5201 )
5202{
5203 assert(conshdlr != NULL);
5204
5205 return conshdlr->delaysepa;
5206}
5207
5208/** should propagation method be delayed, if other propagators found reductions? */
5210 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5211 )
5212{
5213 assert(conshdlr != NULL);
5214
5215 return conshdlr->delayprop;
5216}
5217
5218/** was LP separation method delayed at the last call? */
5220 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5221 )
5222{
5223 assert(conshdlr != NULL);
5224
5225 return conshdlr->sepalpwasdelayed;
5226}
5227
5228/** was primal solution separation method delayed at the last call? */
5230 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5231 )
5232{
5233 assert(conshdlr != NULL);
5234
5235 return conshdlr->sepasolwasdelayed;
5236}
5237
5238/** was propagation method delayed at the last call? */
5240 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5241 )
5242{
5243 assert(conshdlr != NULL);
5244
5245 return conshdlr->propwasdelayed;
5246}
5247
5248/** is constraint handler initialized? */
5250 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5251 )
5252{
5253 assert(conshdlr != NULL);
5254
5255 return conshdlr->initialized;
5256}
5257
5258/** does the constraint handler have a copy function? */
5260 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5261 )
5262{
5263 assert(conshdlr != NULL);
5264
5265 return (conshdlr->conshdlrcopy != NULL);
5266}
5267
5268/** returns the timing mask of the propagation method of the constraint handler */
5270 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5271 )
5272{
5273 assert(conshdlr != NULL);
5274
5275 return conshdlr->proptiming;
5276}
5277
5278/** sets the timing mask of the propagation method of the constraint handler */
5280 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5281 SCIP_PROPTIMING proptiming /**< timing mask to be set */
5282 )
5283{
5284 assert(conshdlr != NULL);
5285
5286 conshdlr->proptiming = proptiming;
5287}
5288
5289
5290/** returns the timing mask of the presolving method of the constraint handler */
5292 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5293 )
5294{
5295 assert(conshdlr != NULL);
5296
5297 return conshdlr->presoltiming;
5298}
5299
5300/** sets the timing mask of the presolving method of the constraint handler */
5302 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
5303 SCIP_PRESOLTIMING presoltiming /** timing mask to be set */
5304 )
5305{
5306 assert(conshdlr != NULL);
5307
5308 conshdlr->presoltiming = presoltiming;
5309}
5310
5311/** returns whether conshdlr supports permutation symmetry detection */
5313 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5314 )
5315{
5316 assert(conshdlr != NULL);
5317
5318 return conshdlr->consgetpermsymgraph != NULL;
5319}
5320
5321/** returns whether conshdlr supports signed permutation symmetry detection */
5323 SCIP_CONSHDLR* conshdlr /**< constraint handler */
5324 )
5325{
5326 assert(conshdlr != NULL);
5327
5328 return conshdlr->consgetsignedpermsymgraph != NULL;
5329}
5330
5331/*
5332 * Constraint set change methods
5333 */
5334
5335/** creates empty constraint set change data */
5336static
5338 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5339 BMS_BLKMEM* blkmem /**< block memory */
5340 )
5341{
5342 assert(conssetchg != NULL);
5343 assert(blkmem != NULL);
5344
5345 SCIP_ALLOC( BMSallocBlockMemory(blkmem, conssetchg) );
5346 (*conssetchg)->addedconss = NULL;
5347 (*conssetchg)->disabledconss = NULL;
5348 (*conssetchg)->addedconsssize = 0;
5349 (*conssetchg)->naddedconss = 0;
5350 (*conssetchg)->disabledconsssize = 0;
5351 (*conssetchg)->ndisabledconss = 0;
5352
5353 return SCIP_OKAY;
5354}
5355
5356/** releases all constraints of the constraint set change data */
5357static
5359 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data */
5360 BMS_BLKMEM* blkmem, /**< block memory */
5361 SCIP_SET* set /**< global SCIP settings */
5362 )
5363{
5364 int i;
5365
5366 assert(conssetchg != NULL);
5367
5368 /* release constraints */
5369 for( i = 0; i < conssetchg->naddedconss; ++i )
5370 {
5371 if( conssetchg->addedconss[i] != NULL )
5372 {
5373 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[i], blkmem, set) );
5374 }
5375 }
5376 for( i = 0; i < conssetchg->ndisabledconss; ++i )
5377 {
5378 if( conssetchg->disabledconss[i] != NULL )
5379 {
5380 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[i], blkmem, set) );
5381 }
5382 }
5383
5384 return SCIP_OKAY;
5385}
5386
5387/** frees constraint set change data and releases all included constraints */
5389 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change */
5390 BMS_BLKMEM* blkmem, /**< block memory */
5391 SCIP_SET* set /**< global SCIP settings */
5392 )
5393{
5394 assert(conssetchg != NULL);
5395 assert(blkmem != NULL);
5396
5397 if( *conssetchg != NULL )
5398 {
5399 /* release constraints */
5400 SCIP_CALL( conssetchgRelease(*conssetchg, blkmem, set) );
5401
5402 /* free memory */
5403 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->addedconss, (*conssetchg)->addedconsssize);
5404 BMSfreeBlockMemoryArrayNull(blkmem, &(*conssetchg)->disabledconss, (*conssetchg)->disabledconsssize);
5405 BMSfreeBlockMemory(blkmem, conssetchg);
5406 }
5407
5408 return SCIP_OKAY;
5409}
5410
5411/** ensures, that addedconss array can store at least num entries */
5412static
5414 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5415 BMS_BLKMEM* blkmem, /**< block memory */
5416 SCIP_SET* set, /**< global SCIP settings */
5417 int num /**< minimum number of entries to store */
5418 )
5419{
5420 assert(conssetchg != NULL);
5421
5422 if( num > conssetchg->addedconsssize )
5423 {
5424 int newsize;
5425
5426 newsize = SCIPsetCalcMemGrowSize(set, num);
5427 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->addedconss, conssetchg->addedconsssize, newsize) );
5428 conssetchg->addedconsssize = newsize;
5429 }
5430 assert(num <= conssetchg->addedconsssize);
5431
5432 return SCIP_OKAY;
5433}
5434
5435/** ensures, that disabledconss array can store at least num entries */
5436static
5438 SCIP_CONSSETCHG* conssetchg, /**< constraint set change data structure */
5439 BMS_BLKMEM* blkmem, /**< block memory */
5440 SCIP_SET* set, /**< global SCIP settings */
5441 int num /**< minimum number of entries to store */
5442 )
5443{
5444 assert(conssetchg != NULL);
5445
5446 if( num > conssetchg->disabledconsssize )
5447 {
5448 int newsize;
5449
5450 newsize = SCIPsetCalcMemGrowSize(set, num);
5451 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &conssetchg->disabledconss, conssetchg->disabledconsssize, newsize) );
5452 conssetchg->disabledconsssize = newsize;
5453 }
5454 assert(num <= conssetchg->disabledconsssize);
5455
5456 return SCIP_OKAY;
5457}
5458
5459/** adds constraint addition to constraint set changes, and captures constraint; activates constraint if the
5460 * constraint set change data is currently active
5461 */
5463 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5464 BMS_BLKMEM* blkmem, /**< block memory */
5465 SCIP_SET* set, /**< global SCIP settings */
5466 SCIP_STAT* stat, /**< dynamic problem statistics */
5467 SCIP_CONS* cons, /**< added constraint */
5468 int depth, /**< depth of constraint set change's node */
5469 SCIP_Bool focusnode, /**< does the constraint set change belong to the focus node? */
5470 SCIP_Bool active /**< is the constraint set change currently active? */
5471 )
5472{
5473 assert(conssetchg != NULL);
5474 assert(cons != NULL);
5475
5476 /* if constraint set change doesn't exist, create it */
5477 if( *conssetchg == NULL )
5478 {
5479 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5480 }
5481
5482 /* add constraint to the addedconss array */
5483 SCIP_CALL( conssetchgEnsureAddedconssSize(*conssetchg, blkmem, set, (*conssetchg)->naddedconss+1) );
5484 (*conssetchg)->addedconss[(*conssetchg)->naddedconss] = cons;
5485 (*conssetchg)->naddedconss++;
5486
5487 /* undelete constraint, if it was globally deleted in the past */
5488 cons->deleted = FALSE;
5489
5490 /* capture constraint */
5491 SCIPconsCapture(cons);
5492
5493 /* activate constraint, if node is active */
5494 if( active && !SCIPconsIsActive(cons) )
5495 {
5496 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5497 assert(SCIPconsIsActive(cons));
5498
5499 /* remember, that this constraint set change data was responsible for the constraint's addition */
5500 cons->addconssetchg = *conssetchg;
5501 cons->addarraypos = (*conssetchg)->naddedconss-1;
5502 }
5503
5504 return SCIP_OKAY;
5505}
5506
5507/** adds constraint disabling to constraint set changes, and captures constraint */
5509 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data structure */
5510 BMS_BLKMEM* blkmem, /**< block memory */
5511 SCIP_SET* set, /**< global SCIP settings */
5512 SCIP_CONS* cons /**< disabled constraint */
5513 )
5514{
5515 assert(conssetchg != NULL);
5516 assert(cons != NULL);
5517
5518 /* if constraint set change doesn't exist, create it */
5519 if( *conssetchg == NULL )
5520 {
5521 SCIP_CALL( conssetchgCreate(conssetchg, blkmem) );
5522 }
5523
5524 /* add constraint to the disabledconss array */
5525 SCIP_CALL( conssetchgEnsureDisabledconssSize(*conssetchg, blkmem, set, (*conssetchg)->ndisabledconss+1) );
5526 (*conssetchg)->disabledconss[(*conssetchg)->ndisabledconss] = cons;
5527 (*conssetchg)->ndisabledconss++;
5528
5529 /* capture constraint */
5530 SCIPconsCapture(cons);
5531
5532 return SCIP_OKAY;
5533}
5534
5535/** deactivates, deletes, and releases constraint from the addedconss array of the constraint set change data */
5536static
5538 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to delete constraint from */
5539 BMS_BLKMEM* blkmem, /**< block memory */
5540 SCIP_SET* set, /**< global SCIP settings */
5541 int arraypos /**< position of constraint in disabledconss array */
5542 )
5543{
5544 SCIP_CONS* cons;
5545
5546 assert(conssetchg != NULL);
5547 assert(conssetchg->addedconss != NULL);
5548 assert(0 <= arraypos && arraypos < conssetchg->naddedconss);
5549
5550 cons = conssetchg->addedconss[arraypos];
5551 assert(cons != NULL);
5552
5553 SCIPsetDebugMsg(set, "delete added constraint <%s> at position %d from constraint set change data\n", cons->name, arraypos);
5554
5555 /* remove the link to the constraint set change data */
5556 if( cons->addconssetchg == conssetchg )
5557 {
5558 cons->addconssetchg = NULL;
5559 cons->addarraypos = -1;
5560 }
5561
5562 /* release constraint */
5563 SCIP_CALL( SCIPconsRelease(&conssetchg->addedconss[arraypos], blkmem, set) );
5564
5565 /* we want to keep the order of the constraint additions: move all subsequent constraints one slot to the front */
5566 for( ; arraypos < conssetchg->naddedconss-1; ++arraypos )
5567 {
5568 conssetchg->addedconss[arraypos] = conssetchg->addedconss[arraypos+1];
5569 assert(conssetchg->addedconss[arraypos] != NULL);
5570 if( conssetchg->addedconss[arraypos]->addconssetchg == conssetchg )
5571 {
5572 assert(conssetchg->addedconss[arraypos]->addarraypos == arraypos+1);
5573 conssetchg->addedconss[arraypos]->addarraypos = arraypos;
5574 }
5575 }
5576 conssetchg->naddedconss--;
5577
5578 return SCIP_OKAY;
5579}
5580
5581/** deletes and releases deactivated constraint from the disabledconss array of the constraint set change data */
5582static
5584 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5585 BMS_BLKMEM* blkmem, /**< block memory */
5586 SCIP_SET* set, /**< global SCIP settings */
5587 int arraypos /**< position of constraint in disabledconss array */
5588 )
5589{
5590 assert(conssetchg != NULL);
5591 assert(0 <= arraypos && arraypos < conssetchg->ndisabledconss);
5592 assert(conssetchg->disabledconss[arraypos] != NULL);
5593
5594 SCIPsetDebugMsg(set, "delete disabled constraint <%s> at position %d from constraint set change data\n",
5595 conssetchg->disabledconss[arraypos]->name, arraypos);
5596
5597 /* release constraint */
5598 SCIP_CALL( SCIPconsRelease(&conssetchg->disabledconss[arraypos], blkmem, set) );
5599
5600 /* we want to keep the order of the constraint disablings: move all subsequent constraints one slot to the front */
5601 for( ; arraypos < conssetchg->ndisabledconss-1; ++arraypos )
5602 {
5603 conssetchg->disabledconss[arraypos] = conssetchg->disabledconss[arraypos+1];
5604 assert(conssetchg->disabledconss[arraypos] != NULL);
5605 }
5606 conssetchg->ndisabledconss--;
5607
5608 return SCIP_OKAY;
5609}
5610
5611/** gets added constraints data for a constraint set change */
5613 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to get data from */
5614 SCIP_CONS*** conss, /**< reference to constraints array added in the conssetchg, or NULL */
5615 int* nconss /**< reference to store the size of the constraints array, or NULL */
5616 )
5617{
5618 assert(conssetchg != NULL);
5619 if( conss != NULL )
5620 *conss = conssetchg->addedconss;
5621 if( nconss != NULL )
5622 *nconss = conssetchg->naddedconss;
5623}
5624
5625/** applies constraint set change */
5627 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to apply */
5628 BMS_BLKMEM* blkmem, /**< block memory */
5629 SCIP_SET* set, /**< global SCIP settings */
5630 SCIP_STAT* stat, /**< dynamic problem statistics */
5631 int depth, /**< depth of constraint set change's node */
5632 SCIP_Bool focusnode /**< does the constraint set change belong to the focus node? */
5633 )
5634{
5635 SCIP_CONS* cons;
5636 int i;
5637
5638 if( conssetchg == NULL )
5639 return SCIP_OKAY;
5640
5641 SCIPsetDebugMsg(set, "applying constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5642 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5643
5644 /* apply constraint additions */
5645 i = 0;
5646 while( i < conssetchg->naddedconss )
5647 {
5648 cons = conssetchg->addedconss[i];
5649 assert(cons != NULL);
5650 assert(!cons->update);
5651
5652 /* if constraint is already active, or if constraint is globally deleted, it can be removed from addedconss array */
5653 if( cons->active || cons->deleted )
5654 {
5655 /* delete constraint from addedcons array, the empty slot is now used by the next constraint,
5656 * and naddedconss was decreased, so do not increase i
5657 */
5658 SCIP_CALL( conssetchgDelAddedCons(conssetchg, blkmem, set, i) );
5659 }
5660 else
5661 {
5662 assert(cons->addconssetchg == NULL);
5663 assert(cons->addarraypos == -1);
5664
5665 /* activate constraint */
5666 SCIP_CALL( SCIPconsActivate(cons, set, stat, depth, focusnode) );
5667 assert(cons->active);
5668 assert(!cons->update);
5669
5670 /* remember, that this constraint set change data was responsible for the constraint's addition */
5671 cons->addconssetchg = conssetchg;
5672 cons->addarraypos = i;
5673
5674 ++i; /* handle the next constraint */
5675 }
5676 }
5677
5678 /* apply constraint disablings */
5679 i = 0;
5680 while( i < conssetchg->ndisabledconss )
5681 {
5682 cons = conssetchg->disabledconss[i];
5683 assert(cons != NULL);
5684 assert(!cons->update);
5685
5686 /* if the constraint is disabled, we can permanently remove it from the disabledconss array */
5687 if( !cons->enabled )
5688 {
5689 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5690 cons->name, cons->conshdlr->name);
5691
5692 /* release and remove constraint from the disabledconss array, the empty slot is now used by the next constraint
5693 * and ndisabledconss was decreased, so do not increase i
5694 */
5695 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5696 }
5697 else
5698 {
5699 assert(cons->addarraypos >= 0);
5700 assert(!cons->deleted); /* deleted constraints must not be enabled! */
5701 SCIP_CALL( SCIPconsDisable(conssetchg->disabledconss[i], set, stat) );
5702 assert(!cons->update);
5703 assert(!cons->enabled);
5704
5705 ++i; /* handle the next constraint */
5706 }
5707 }
5708
5709 return SCIP_OKAY;
5710}
5711
5712/** undoes constraint set change */
5714 SCIP_CONSSETCHG* conssetchg, /**< constraint set change to undo */
5715 BMS_BLKMEM* blkmem, /**< block memory */
5716 SCIP_SET* set, /**< global SCIP settings */
5717 SCIP_STAT* stat /**< dynamic problem statistics */
5718 )
5719{
5720 SCIP_CONS* cons;
5721 int i;
5722
5723 if( conssetchg == NULL )
5724 return SCIP_OKAY;
5725
5726 SCIPsetDebugMsg(set, "undoing constraint set changes at %p: %d constraint additions, %d constraint disablings\n",
5727 (void*)conssetchg, conssetchg->naddedconss, conssetchg->ndisabledconss);
5728
5729 /* undo constraint disablings */
5730 for( i = conssetchg->ndisabledconss-1; i >= 0; --i )
5731 {
5732 cons = conssetchg->disabledconss[i];
5733 assert(cons != NULL);
5734 assert(!cons->update);
5735
5736 /* If the constraint is inactive, we can permanently remove it from the disabledconss array. It was deactivated
5737 * in the subtree of the current node but not reactivated on the switching way back to the current node, which
5738 * means, the deactivation was more global (i.e. valid on a higher level node) than the current node and the
5739 * disabling at the current node doesn't have any effect anymore.
5740 * If the constraint is already enabled, we need not to do anything. This may happen on a path A -> B,
5741 * if the constraint is disabled at node B, and while processing the subtree of B, it is also disabled at
5742 * the more global node A. Then on the switching path back to A, the constraint is enabled at node B (which is
5743 * actually wrong, since it now should be disabled in the whole subtree of A, but we cannot know this), and
5744 * again enabled at node A (where enabling is ignored). If afterwards, a subnode of B is processed, the
5745 * switching disables the constraint in node A, and the disabling is then removed from node B.
5746 */
5747 if( !cons->active )
5748 {
5749 SCIPsetDebugMsg(set, "constraint <%s> of handler <%s> was deactivated -> remove it from disabledconss array\n",
5750 cons->name, cons->conshdlr->name);
5751
5752 /* release and remove constraint from the disabledconss array */
5753 SCIP_CALL( conssetchgDelDisabledCons(conssetchg, blkmem, set, i) );
5754 }
5755 else if( !cons->enabled )
5756 {
5757 assert(cons->addarraypos >= 0);
5758 assert(!cons->deleted); /* deleted constraints must not be active! */
5759 SCIP_CALL( SCIPconsEnable(cons, set, stat) );
5760 assert(!cons->update);
5761 assert(!cons->active || cons->enabled);
5762 }
5763 }
5764
5765 /* undo constraint additions */
5766 for( i = conssetchg->naddedconss-1; i >= 0; --i )
5767 {
5768 cons = conssetchg->addedconss[i];
5769 assert(cons != NULL);
5770 assert(!cons->update);
5771
5772 /* If the constraint is already deactivated, we need not to do anything. This may happen on a path A -> B,
5773 * if the constraint is added at node B, and while processing the subtree of B, it is also added at
5774 * the more global node A. Then on the switching path back to A, the node is deactivated at node B (which is
5775 * actually wrong, since it now should be active in the whole subtree of A, but we cannot know this), and
5776 * again deactivated at node A (where deactivation is ignored). If afterwards, a subnode of B is processed, the
5777 * switching activates the constraint in node A, and the activation is then removed from node B.
5778 */
5779 if( cons->active )
5780 {
5781 assert(cons->addconssetchg == conssetchg);
5782 assert(cons->addarraypos == i);
5783
5784 /* deactivate constraint */
5785 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
5786
5787 /* unlink the constraint and the constraint set change */
5788 cons->addconssetchg = NULL;
5789 cons->addarraypos = -1;
5790 }
5791 assert(!cons->active);
5792 assert(!cons->update);
5793 }
5794
5795 return SCIP_OKAY;
5796}
5797
5798/** applies constraint set change to the global problem and deletes the constraint set change data */
5800 SCIP_CONSSETCHG** conssetchg, /**< pointer to constraint set change data */
5801 BMS_BLKMEM* blkmem, /**< block memory */
5802 SCIP_SET* set, /**< global SCIP settings */
5803 SCIP_STAT* stat, /**< dynamic problem statistics */
5804 SCIP_PROB* prob, /**< problem data */
5805 SCIP_REOPT* reopt /**< reoptimization data */
5806 )
5807{
5808 SCIP_CONS* cons;
5809 int i;
5810
5811 assert(conssetchg != NULL);
5812
5813 /* nothing to do on empty constraint set change data */
5814 if( *conssetchg == NULL )
5815 return SCIP_OKAY;
5816
5817 SCIPsetDebugMsg(set, "moving constraint set changes at %p to global problem: %d constraint additions, %d constraint disablings\n",
5818 (void*)*conssetchg, (*conssetchg)->naddedconss, (*conssetchg)->ndisabledconss);
5819
5820 /* apply constraint additions to the global problem (loop backwards, because then conssetchgDelAddedCons() is
5821 * more efficient)
5822 */
5823 for( i = (*conssetchg)->naddedconss-1; i >= 0; --i )
5824 {
5825 cons = (*conssetchg)->addedconss[i];
5826 assert(cons != NULL);
5827 assert(!cons->update);
5828
5829 /* only move constraints that are not sticking at the current node */
5830 if( !SCIPconsIsStickingAtNode(cons) )
5831 {
5832 /* because we first have to delete the constraint, we have to capture it in order to not loose it */
5833 SCIPconsCapture(cons);
5834
5835 /* delete constraint addition from constraint set change data */
5836 SCIP_CALL( conssetchgDelAddedCons(*conssetchg, blkmem, set, i) );
5837
5838 /* don't move deleted constraints to the global problem */
5839 if( !cons->deleted )
5840 {
5841 SCIP_CALL( SCIPprobAddCons(prob, set, stat, cons) );
5842 }
5843
5844 /* release constraint */
5845 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
5846 }
5847 }
5848
5849 /* apply constraint disablings to the global problem (loop backwards, because then conssetchgDelDisabledCons() is
5850 * more efficient)
5851 */
5852 for( i = (*conssetchg)->ndisabledconss-1; i >= 0; --i )
5853 {
5854 cons = (*conssetchg)->disabledconss[i];
5855 assert(cons != NULL);
5856 assert(!cons->update);
5857
5858 /* only delete constraints that are not sticking at the current node */
5859 if( !SCIPconsIsStickingAtNode(cons) )
5860 {
5861 /* globally delete constraint */
5862 if( !cons->deleted )
5863 {
5864 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
5865 }
5866
5867 /* release and remove constraint from the disabledconss array */
5868 SCIP_CALL( conssetchgDelDisabledCons(*conssetchg, blkmem, set, i) );
5869 }
5870 }
5871
5872 if( (*conssetchg)->naddedconss == 0 && (*conssetchg)->ndisabledconss == 0 )
5873 {
5874 /* free empty constraint set change data */
5875 SCIP_CALL( SCIPconssetchgFree(conssetchg, blkmem, set) );
5876 }
5877
5878 return SCIP_OKAY;
5879}
5880
5881
5882
5883
5884/*
5885 * Constraint methods
5886 */
5887
5888/** creates and captures a constraint, and inserts it into the conss array of its constraint handler
5889 *
5890 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, a LP or pseudo solution
5891 * may be declared feasible even if it violates this particular constraint.
5892 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
5893 * local constraint is redundant due to the variable's local bounds.
5894 */
5896 SCIP_CONS** cons, /**< pointer to constraint */
5897 BMS_BLKMEM* blkmem, /**< block memory */
5898 SCIP_SET* set, /**< global SCIP settings */
5899 const char* name, /**< name of constraint */
5900 SCIP_CONSHDLR* conshdlr, /**< constraint handler for this constraint */
5901 SCIP_CONSDATA* consdata, /**< data for this specific constraint */
5902 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
5903 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
5904 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
5905 * Usually set to TRUE. */
5906 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
5907 * TRUE for model constraints, FALSE for additional, redundant constraints. */
5908 SCIP_Bool check, /**< should the constraint be checked for feasibility?
5909 * TRUE for model constraints, FALSE for additional, redundant constraints. */
5910 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
5911 * Usually set to TRUE. */
5912 SCIP_Bool local, /**< is constraint only valid locally?
5913 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
5914 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
5915 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
5916 * adds coefficients to this constraint. */
5917 SCIP_Bool dynamic, /**< is constraint subject to aging?
5918 * Usually set to FALSE. Set to TRUE for own cuts which
5919 * are separated as constraints. */
5920 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
5921 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
5922 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
5923 * if it may be moved to a more global node?
5924 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
5925 SCIP_Bool original, /**< is constraint belonging to the original problem? */
5926 SCIP_Bool deleteconsdata /**< has the constraint data to be deleted if constraint is freed? */
5927 )
5928{
5929 int i;
5930
5931 assert(cons != NULL);
5932 assert(blkmem != NULL);
5933 assert(set != NULL);
5934 assert(name != NULL);
5935 assert(conshdlr != NULL);
5936 assert(!original || deleteconsdata);
5937
5938 /* create constraint data */
5939 SCIP_ALLOC( BMSallocBlockMemory(blkmem, cons) );
5940 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &(*cons)->name, name, strlen(name)+1) );
5941#ifndef NDEBUG
5942 (*cons)->scip = set->scip;
5943#endif
5944 (*cons)->conshdlr = conshdlr;
5945 (*cons)->consdata = consdata;
5946 (*cons)->transorigcons = NULL;
5947 (*cons)->addconssetchg = NULL;
5948 (*cons)->addarraypos = -1;
5949 (*cons)->consspos = -1;
5950 (*cons)->initconsspos = -1;
5951 (*cons)->sepaconsspos = -1;
5952 (*cons)->enfoconsspos = -1;
5953 (*cons)->checkconsspos = -1;
5954 (*cons)->propconsspos = -1;
5955 (*cons)->activedepth = -2;
5956 (*cons)->validdepth = (local ? -1 : 0);
5957 (*cons)->age = 0.0;
5958 (*cons)->nuses = 0;
5959 (*cons)->nupgradelocks = 0;
5960 (*cons)->initial = initial;
5961 (*cons)->separate = separate;
5962 (*cons)->enforce = enforce;
5963 (*cons)->check = check;
5964 (*cons)->propagate = propagate;
5965 (*cons)->sepaenabled = separate;
5966 (*cons)->propenabled = propagate;
5967 (*cons)->local = local;
5968 (*cons)->modifiable = modifiable;
5969 (*cons)->dynamic = dynamic;
5970 (*cons)->removable = removable;
5971 (*cons)->stickingatnode = stickingatnode;
5972 (*cons)->original = original;
5973 (*cons)->deleteconsdata = deleteconsdata;
5974 (*cons)->active = FALSE;
5975 (*cons)->conflict = FALSE;
5976 (*cons)->enabled = FALSE;
5977 (*cons)->obsolete = FALSE;
5978 (*cons)->markpropagate = TRUE;
5979 (*cons)->deleted = FALSE;
5980 (*cons)->update = FALSE;
5981 (*cons)->updateinsert = FALSE;
5982 (*cons)->updateactivate = FALSE;
5983 (*cons)->updatedeactivate = FALSE;
5984 (*cons)->updateenable = FALSE;
5985 (*cons)->updatedisable = FALSE;
5986 (*cons)->updatesepaenable = FALSE;
5987 (*cons)->updatesepadisable = FALSE;
5988 (*cons)->updatepropenable = FALSE;
5989 (*cons)->updatepropdisable = FALSE;
5990 (*cons)->updateobsolete = FALSE;
5991 (*cons)->updatemarkpropagate = FALSE;
5992 (*cons)->updateunmarkpropagate = FALSE;
5993 (*cons)->updatefree = FALSE;
5994 (*cons)->updateactfocus = FALSE;
5995
5996 for( i = 0; i < NLOCKTYPES; i++ )
5997 {
5998 (*cons)->nlockspos[i] = 0;
5999 (*cons)->nlocksneg[i] = 0;
6000 }
6001
6002 /* capture constraint */
6003 SCIPconsCapture(*cons);
6004
6005 /* insert the constraint as inactive constraint into the transformed constraints array */
6006 if( !original )
6007 {
6008 /* check, if inserting constraint should be delayed */
6009 if( conshdlrAreUpdatesDelayed(conshdlr) )
6010 {
6011 SCIPsetDebugMsg(set, " -> delaying insertion of constraint <%s>\n", (*cons)->name);
6012 (*cons)->updateinsert = TRUE;
6013 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6014 assert((*cons)->update);
6015 assert((*cons)->nuses == 2);
6016 }
6017 else
6018 {
6019 SCIP_CALL( conshdlrAddCons(conshdlr, set, *cons) );
6020 }
6021 }
6022
6023 checkConssArrays(conshdlr);
6024
6025 return SCIP_OKAY;
6026}
6027
6028/** copies source constraint of source SCIP into the target constraint for the target SCIP, using the variable map for
6029 * mapping the variables of the source SCIP to the variables of the target SCIP; if the copying process was successful
6030 * a constraint is created and captured;
6031 *
6032 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6033 * may be declared feasible even if it violates this particular constraint.
6034 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6035 * local constraint is redundant due to the variable's local bounds.
6036 */
6038 SCIP_CONS** cons, /**< pointer to store the created target constraint */
6039 SCIP_SET* set, /**< global SCIP settings of the target SCIP */
6040 const char* name, /**< name of constraint, or NULL if the name of the source constraint should be used */
6041 SCIP* sourcescip, /**< source SCIP data structure */
6042 SCIP_CONSHDLR* sourceconshdlr, /**< source constraint handler for this constraint */
6043 SCIP_CONS* sourcecons, /**< source constraint of the source SCIP */
6044 SCIP_HASHMAP* varmap, /**< a SCIP_HASHMAP mapping variables of the source SCIP to corresponding
6045 * variables of the target SCIP */
6046 SCIP_HASHMAP* consmap, /**< a hashmap to store the mapping of source constraints to the corresponding
6047 * target constraints, must not be NULL! */
6048 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP? */
6049 SCIP_Bool separate, /**< should the constraint be separated during LP processing? */
6050 SCIP_Bool enforce, /**< should the constraint be enforced during node processing? */
6051 SCIP_Bool check, /**< should the constraint be checked for feasibility? */
6052 SCIP_Bool propagate, /**< should the constraint be propagated during node processing? */
6053 SCIP_Bool local, /**< is constraint only valid locally? */
6054 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)? */
6055 SCIP_Bool dynamic, /**< is constraint subject to aging? */
6056 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup? */
6057 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6058 * if it may be moved to a more global node? */
6059 SCIP_Bool global, /**< create a global or a local copy? */
6060 SCIP_Bool* valid /**< pointer to store whether the copying was valid or not */
6061 )
6062{
6063 assert(cons != NULL);
6064 assert(set != NULL);
6065 assert(sourcescip != NULL);
6066 assert(sourceconshdlr != NULL);
6067 assert(sourcecons != NULL);
6068 assert(varmap != NULL);
6069 assert(consmap != NULL);
6070 assert(valid != NULL);
6071
6072 /* if constraint handler does not support copying, success will return false. Constraints handlers have to actively set this to true. */
6073 (*valid) = FALSE;
6074
6075 if( sourceconshdlr->conscopy != NULL )
6076 {
6077 SCIP_CALL( sourceconshdlr->conscopy(set->scip, cons, name, sourcescip, sourceconshdlr, sourcecons, varmap, consmap,
6078 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, global, valid) );
6079 }
6080
6081 return SCIP_OKAY;
6082}
6083
6084
6085/** parses constraint information (in cip format) out of a string; if the parsing process was successful a constraint is
6086 * created, captured, and inserted into the conss array of its constraint handler.
6087 *
6088 * @warning If a constraint is marked to be checked for feasibility but not to be enforced, an LP or pseudo solution
6089 * may be declared feasible even if it violates this particular constraint.
6090 * This constellation should only be used, if no LP or pseudo solution can violate the constraint -- e.g. if a
6091 * local constraint is redundant due to the variable's local bounds.
6092 */
6094 SCIP_CONS** cons, /**< pointer to constraint */
6095 SCIP_SET* set, /**< global SCIP settings */
6096 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler of target SCIP */
6097 const char* str, /**< string to parse for constraint */
6098 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
6099 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
6100 SCIP_Bool separate, /**< should the constraint be separated during LP processing?
6101 * Usually set to TRUE. */
6102 SCIP_Bool enforce, /**< should the constraint be enforced during node processing?
6103 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6104 SCIP_Bool check, /**< should the constraint be checked for feasibility?
6105 * TRUE for model constraints, FALSE for additional, redundant constraints. */
6106 SCIP_Bool propagate, /**< should the constraint be propagated during node processing?
6107 * Usually set to TRUE. */
6108 SCIP_Bool local, /**< is constraint only valid locally?
6109 * Usually set to FALSE. Has to be set to TRUE, e.g., for branching constraints. */
6110 SCIP_Bool modifiable, /**< is constraint modifiable (subject to column generation)?
6111 * Usually set to FALSE. In column generation applications, set to TRUE if pricing
6112 * adds coefficients to this constraint. */
6113 SCIP_Bool dynamic, /**< is constraint subject to aging?
6114 * Usually set to FALSE. Set to TRUE for own cuts which
6115 * are separated as constraints. */
6116 SCIP_Bool removable, /**< should the relaxation be removed from the LP due to aging or cleanup?
6117 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
6118 SCIP_Bool stickingatnode, /**< should the constraint always be kept at the node where it was added, even
6119 * if it may be moved to a more global node?
6120 * Usually set to FALSE. Set to TRUE to for constraints that represent node data. */
6121 SCIP_Bool* success /**< pointer store if the paring process was successful */
6122 )
6123{
6124 SCIP_CONSHDLR* conshdlr;
6125 char conshdlrname[SCIP_MAXSTRLEN];
6126 char consname[SCIP_MAXSTRLEN];
6127 char* endptr;
6128
6129 assert(cons != NULL);
6130 assert(set != NULL);
6131
6132 (*success) = FALSE;
6133
6134 /* scan constraint handler name */
6135 assert(str != NULL);
6136 SCIPstrCopySection(str, '[', ']', conshdlrname, SCIP_MAXSTRLEN, &endptr);
6137 if ( endptr == NULL || endptr == str )
6138 {
6139 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint handler name.\n");
6140 return SCIP_OKAY;
6141 }
6142 assert(endptr != NULL);
6143 SCIPsetDebugMsg(set, "constraint handler name <%s>\n", conshdlrname);
6144
6145 /* scan constraint name */
6146 SCIPstrCopySection(endptr, '<', '>', consname, SCIP_MAXSTRLEN, &endptr);
6147 if ( endptr == NULL || endptr == str )
6148 {
6149 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find constraint name.\n");
6150 return SCIP_OKAY;
6151 }
6152 assert(endptr != NULL);
6153 SCIPsetDebugMsg(set, "constraint name <%s>\n", consname);
6154
6155 str = endptr;
6156
6157 /* skip white space */
6158 SCIP_CALL( SCIPskipSpace((char**)&str) );
6159
6160 /* check for colon */
6161 if( *str != ':' )
6162 {
6163 SCIPmessagePrintWarning(messagehdlr, "Syntax error: Could not find colon ':' after constraint name.\n");
6164 return SCIP_OKAY;
6165 }
6166
6167 /* skip colon */
6168 ++str;
6169
6170 /* skip white space */
6171 SCIP_CALL( SCIPskipSpace((char**)&str) );
6172
6173 /* check if a constraint handler with parsed name exists */
6174 conshdlr = SCIPsetFindConshdlr(set, conshdlrname);
6175
6176 if( conshdlr == NULL )
6177 {
6178 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> doesn't exist in SCIP data structure\n", conshdlrname);
6179 }
6180 else
6181 {
6182 assert( conshdlr != NULL );
6183 if ( conshdlr->consparse == NULL )
6184 {
6185 SCIPmessagePrintWarning(messagehdlr, "constraint handler <%s> does not support parsing constraints\n", conshdlrname);
6186 }
6187 else
6188 {
6189 SCIP_CALL( conshdlr->consparse(set->scip, conshdlr, cons, consname, str,
6190 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, stickingatnode, success) );
6191 }
6192 }
6193
6194 return SCIP_OKAY;
6195}
6196
6197/** change name of given constraint */
6199 SCIP_CONS* cons, /**< problem constraint */
6200 BMS_BLKMEM* blkmem, /**< block memory buffer */
6201 const char* name /**< new name of constraint */
6202 )
6203{
6204 assert(cons != NULL);
6205 assert(cons->name != NULL);
6206
6207 /* free old constraint name */
6208 BMSfreeBlockMemoryArray(blkmem, &cons->name, strlen(cons->name)+1);
6209
6210 /* copy new constraint name */
6211 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &cons->name, name, strlen(name)+1) );
6212
6213 return SCIP_OKAY;
6214}
6215
6216
6217/** frees a constraint and removes it from the conss array of its constraint handler */
6219 SCIP_CONS** cons, /**< constraint to free */
6220 BMS_BLKMEM* blkmem, /**< block memory buffer */
6221 SCIP_SET* set /**< global SCIP settings */
6222 )
6223{
6224 assert(cons != NULL);
6225 assert(*cons != NULL);
6226 assert((*cons)->conshdlr != NULL);
6227 assert((*cons)->nuses == 0);
6228 assert(!(*cons)->active);
6229 assert(!(*cons)->update);
6230 assert(!(*cons)->original || (*cons)->transorigcons == NULL);
6231 assert(blkmem != NULL);
6232 assert(set != NULL);
6233 assert((*cons)->scip == set->scip);
6234
6235 SCIPsetDebugMsg(set, "freeing constraint <%s> at conss pos %d of handler <%s>\n",
6236 (*cons)->name, (*cons)->consspos, (*cons)->conshdlr->name);
6237
6238 /* free constraint data */
6239 if( (*cons)->conshdlr->consdelete != NULL && (*cons)->consdata != NULL && (*cons)->deleteconsdata )
6240 {
6241 SCIP_CALL( (*cons)->conshdlr->consdelete(set->scip, (*cons)->conshdlr, *cons, &(*cons)->consdata) );
6242 }
6243 else if( !(*cons)->deleteconsdata )
6244 (*cons)->consdata = NULL;
6245 assert((*cons)->consdata == NULL);
6246
6247 /* unlink transformed and original constraint */
6248 if( (*cons)->transorigcons != NULL )
6249 {
6250 assert(!(*cons)->original);
6251 assert((*cons)->transorigcons->original);
6252 assert((*cons)->transorigcons->transorigcons == *cons);
6253
6254 (*cons)->transorigcons->transorigcons = NULL;
6255 }
6256
6257 /* remove constraint from the transformed constraints array */
6258 if( !(*cons)->original )
6259 {
6260 conshdlrDelCons((*cons)->conshdlr, *cons);
6261 checkConssArrays((*cons)->conshdlr);
6262 }
6263 assert((*cons)->consspos == -1);
6264
6265 /* free constraint */
6266 BMSfreeBlockMemoryArray(blkmem, &(*cons)->name, strlen((*cons)->name)+1);
6267 BMSfreeBlockMemory(blkmem, cons);
6268
6269 return SCIP_OKAY;
6270}
6271
6272/** increases usage counter of constraint */
6274 SCIP_CONS* cons /**< constraint */
6275 )
6276{
6277 assert(cons != NULL);
6278 assert(cons->nuses >= 0);
6279
6280 SCIPdebugMessage("capture constraint <%s> with nuses=%d, cons pointer %p\n", cons->name, cons->nuses, (void*)cons);
6281 cons->nuses++;
6282}
6283
6284/** decreases usage counter of constraint, and frees memory if necessary */
6286 SCIP_CONS** cons, /**< pointer to constraint */
6287 BMS_BLKMEM* blkmem, /**< block memory */
6288 SCIP_SET* set /**< global SCIP settings */
6289 )
6290{
6291 assert(blkmem != NULL);
6292 assert(cons != NULL);
6293 assert(*cons != NULL);
6294 assert((*cons)->conshdlr != NULL);
6295 assert((*cons)->nuses >= 1);
6296 assert(set != NULL);
6297 assert((*cons)->scip == set->scip);
6298
6299 SCIPsetDebugMsg(set, "release constraint <%s> with nuses=%d, cons pointer %p\n", (*cons)->name, (*cons)->nuses, (void*)(*cons));
6300 (*cons)->nuses--;
6301 if( (*cons)->nuses == 0 )
6302 {
6303 assert(!(*cons)->active || (*cons)->updatedeactivate);
6304
6305 /* check, if freeing constraint should be delayed */
6306 if( conshdlrAreUpdatesDelayed((*cons)->conshdlr) )
6307 {
6308 SCIPsetDebugMsg(set, " -> delaying freeing constraint <%s>\n", (*cons)->name);
6309 (*cons)->updatefree = TRUE;
6310 SCIP_CALL( conshdlrAddUpdateCons((*cons)->conshdlr, set, *cons) );
6311 assert((*cons)->update);
6312 assert((*cons)->nuses == 1);
6313 }
6314 else
6315 {
6316 SCIP_CALL( SCIPconsFree(cons, blkmem, set) );
6317 }
6318 }
6319 *cons = NULL;
6320
6321 return SCIP_OKAY;
6322}
6323
6324/** outputs constraint information to file stream */
6326 SCIP_CONS* cons, /**< constraint to print */
6327 SCIP_SET* set, /**< global SCIP settings */
6328 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
6329 FILE* file /**< output file (or NULL for standard output) */
6330 )
6331{
6332 SCIP_CONSHDLR* conshdlr;
6333
6334 assert(cons != NULL);
6335 assert(set != NULL);
6336 assert(cons->scip == set->scip);
6337
6338 conshdlr = cons->conshdlr;
6339 assert(conshdlr != NULL);
6340
6341 SCIPmessageFPrintInfo(messagehdlr, file, " [%s] <%s>: ", conshdlr->name, cons->name);
6342
6343 if( conshdlr->consprint != NULL )
6344 {
6345 SCIP_CALL( conshdlr->consprint(set->scip, conshdlr, cons, file) );
6346 }
6347 else
6348 SCIPmessageFPrintInfo(messagehdlr, file, "constraint handler <%s> doesn't support printing constraint", conshdlr->name);
6349
6350 return SCIP_OKAY;
6351}
6352
6353/** method to collect the variables of a constraint
6354 *
6355 * If the number of variables is greater than the available slots in the variable array, nothing happens except that
6356 * the success point is set to FALSE. With the method SCIPconsGetNVars() it is possible to get the number of variables
6357 * a constraint has in its scope.
6358 *
6359 * @note The success pointer indicates if all variables were copied into the vars arrray.
6360 *
6361 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6362 * set to FALSE.
6363 */
6365 SCIP_CONS* cons, /**< constraint to get variables for */
6366 SCIP_SET* set, /**< global SCIP settings */
6367 SCIP_VAR** vars, /**< array to store the involved variable of the constraint */
6368 int varssize, /**< available slots in vars array which is needed to check if the array is large enough */
6369 SCIP_Bool* success /**< pointer to store whether the variables are successfully copied */
6370 )
6371{
6372 SCIP_CONSHDLR* conshdlr;
6373
6374 assert(cons != NULL);
6375 assert(set != NULL);
6376 assert(cons->scip == set->scip);
6377
6378 conshdlr = cons->conshdlr;
6379 assert(conshdlr != NULL);
6380
6381 if( conshdlr->consgetvars != NULL )
6382 {
6383 SCIP_CALL( conshdlr->consgetvars(set->scip, conshdlr, cons, vars, varssize, success) );
6384 }
6385 else
6386 {
6387 (*success) = FALSE;
6388 }
6389
6390 return SCIP_OKAY;
6391}
6392
6393/** method to collect the number of variables of a constraint
6394 *
6395 * @note The success pointer indicates if the contraint handler was able to return the number of variables
6396 *
6397 * @note It might be that a constraint handler does not support this functionality, in that case the success pointer is
6398 * set to FALSE
6399 */
6401 SCIP_CONS* cons, /**< constraint to get number of variables for */
6402 SCIP_SET* set, /**< global SCIP settings */
6403 int* nvars, /**< pointer to store the number of variables */
6404 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the number of variables */
6405 )
6406{
6407 SCIP_CONSHDLR* conshdlr;
6408
6409 assert(cons != NULL);
6410 assert(set != NULL);
6411 assert(cons->scip == set->scip);
6412
6413 conshdlr = cons->conshdlr;
6414 assert(conshdlr != NULL);
6415
6416 if( conshdlr->consgetnvars != NULL )
6417 {
6418 SCIP_CALL( conshdlr->consgetnvars(set->scip, conshdlr, cons, nvars, success) );
6419 }
6420 else
6421 {
6422 (*nvars) = 0;
6423 (*success) = FALSE;
6424 }
6425
6426 return SCIP_OKAY;
6427}
6428
6429/** method to collect the permutation symmetry detection graph of a constraint
6430 *
6431 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6432 *
6433 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6434 */
6436 SCIP_CONS* cons, /**< constraint to get graph for */
6437 SCIP_SET* set, /**< global SCIP settings */
6438 SYM_GRAPH* graph, /**< symmetry detection graph */
6439 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6440 )
6441{
6442 SCIP_CONSHDLR* conshdlr;
6443
6444 assert(cons != NULL);
6445 assert(set != NULL);
6446 assert(cons->scip == set->scip);
6447 assert(success != NULL);
6448
6449 conshdlr = cons->conshdlr;
6450 assert(conshdlr != NULL);
6451
6452 if( conshdlr->consgetpermsymgraph != NULL )
6453 {
6454 SCIP_CALL( conshdlr->consgetpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6455 }
6456 else
6457 *success = FALSE;
6458
6459 return SCIP_OKAY;
6460}
6461
6462/** method to collect the signed permutation symmetry detection graph of a constraint
6463 *
6464 * @note The success pointer indicates whether the constraint handler was able to return the graph.
6465 *
6466 * @note If a constraint handler does not support this functionality, the success pointer is set to FALSE.
6467 */
6469 SCIP_CONS* cons, /**< constraint to get graph for */
6470 SCIP_SET* set, /**< global SCIP settings */
6471 SYM_GRAPH* graph, /**< symmetry detection graph */
6472 SCIP_Bool* success /**< pointer to store whether the constraint successfully returned the graph */
6473 )
6474{
6475 SCIP_CONSHDLR* conshdlr;
6476
6477 assert(cons != NULL);
6478 assert(set != NULL);
6479 assert(cons->scip == set->scip);
6480 assert(success != NULL);
6481
6482 conshdlr = cons->conshdlr;
6483 assert(conshdlr != NULL);
6484
6485 if( conshdlr->consgetsignedpermsymgraph != NULL )
6486 {
6487 SCIP_CALL( conshdlr->consgetsignedpermsymgraph(set->scip, conshdlr, cons, graph, success) );
6488 }
6489 else
6490 *success = FALSE;
6491
6492 return SCIP_OKAY;
6493}
6494
6495/** globally removes constraint from all subproblems; removes constraint from the constraint set change data of the
6496 * node, where it was created, or from the problem, if it was a problem constraint
6497 */
6499 SCIP_CONS* cons, /**< constraint to delete */
6500 BMS_BLKMEM* blkmem, /**< block memory */
6501 SCIP_SET* set, /**< global SCIP settings */
6502 SCIP_STAT* stat, /**< dynamic problem statistics */
6503 SCIP_PROB* prob, /**< problem data */
6504 SCIP_REOPT* reopt /**< reoptimization data */
6505 )
6506{
6507 assert(cons != NULL);
6508 assert(cons->conshdlr != NULL);
6509 assert(!cons->active || cons->updatedeactivate || cons->addarraypos >= 0);
6510 assert(set != NULL);
6511 assert(cons->scip == set->scip);
6512
6513 SCIPsetDebugMsg(set, "globally deleting constraint <%s> (delay updates: %d)\n",
6514 cons->name, cons->conshdlr->delayupdatecount);
6515
6516 /* mark constraint deleted */
6517 cons->deleted = TRUE;
6518
6519 /* deactivate constraint, if it is currently active */
6520 if( cons->active && !cons->updatedeactivate )
6521 {
6522 SCIP_CALL( SCIPconsDeactivate(cons, set, stat) );
6523 }
6524 else
6525 cons->updateactivate = FALSE;
6526
6527 if( set->reopt_enable && !SCIPreoptConsCanBeDeleted(reopt, cons) )
6528 return SCIP_OKAY;
6529
6530 assert(!cons->active || cons->updatedeactivate);
6531 assert(!cons->enabled || cons->updatedeactivate);
6532
6533 /* remove formerly active constraint from the conssetchg's addedconss / prob's conss array */
6534 if( cons->addarraypos >= 0 )
6535 {
6536 if( cons->addconssetchg == NULL )
6537 {
6538 /* remove problem constraint from the problem */
6539 SCIP_CALL( SCIPprobDelCons(prob, blkmem, set, stat, cons) );
6540 }
6541 else
6542 {
6543 assert(cons->addconssetchg->addedconss != NULL);
6544 assert(0 <= cons->addarraypos && cons->addarraypos < cons->addconssetchg->naddedconss);
6545 assert(cons->addconssetchg->addedconss[cons->addarraypos] == cons);
6546
6547 /* remove constraint from the constraint set change addedconss array */
6549 }
6550 }
6551
6552 return SCIP_OKAY;
6553}
6554
6555/** gets and captures transformed constraint of a given original constraint; if the constraint is not yet transformed,
6556 * a new transformed constraint for this constraint is created
6557 */
6559 SCIP_CONS* origcons, /**< original constraint */
6560 BMS_BLKMEM* blkmem, /**< block memory buffer */
6561 SCIP_SET* set, /**< global SCIP settings */
6562 SCIP_CONS** transcons /**< pointer to store the transformed constraint */
6563 )
6564{
6565 assert(origcons != NULL);
6566 assert(set != NULL);
6567 assert(origcons->scip == set->scip);
6568 assert(origcons->conshdlr != NULL);
6569 assert(origcons->original);
6570 assert(transcons != NULL);
6571
6572 /* check, if the constraint is already transformed */
6573 if( origcons->transorigcons != NULL )
6574 {
6575 *transcons = origcons->transorigcons;
6576 SCIPconsCapture(*transcons);
6577 }
6578 else
6579 {
6580 /* create transformed constraint */
6581 if( origcons->conshdlr->constrans != NULL )
6582 {
6583 /* use constraint handler's own method to transform constraint */
6584 SCIP_CALL( origcons->conshdlr->constrans(set->scip, origcons->conshdlr, origcons, transcons) );
6585 }
6586 else
6587 {
6588 /* create new constraint with a pointer copy of the constraint data */
6589 SCIP_CALL( SCIPconsCreate(transcons, blkmem, set, origcons->name, origcons->conshdlr, origcons->consdata, origcons->initial,
6590 origcons->separate, origcons->enforce, origcons->check, origcons->propagate,
6591 origcons->local, origcons->modifiable, origcons->dynamic, origcons->removable, origcons->stickingatnode,
6592 FALSE, FALSE) );
6593 }
6594
6595 /* link original and transformed constraint */
6596 origcons->transorigcons = *transcons;
6597 (*transcons)->transorigcons = origcons;
6598
6599 /* copy the number of upgradelocks */
6600 (*transcons)->nupgradelocks = origcons->nupgradelocks; /*lint !e732*/
6601 }
6602 assert(*transcons != NULL);
6603
6604 return SCIP_OKAY;
6605}
6606
6607/** sets the initial flag of the given constraint */
6609 SCIP_CONS* cons, /**< constraint */
6610 SCIP_SET* set, /**< global SCIP settings */
6611 SCIP_STAT* stat, /**< dynamic problem statistics */
6612 SCIP_Bool initial /**< new value */
6613 )
6614{
6615 assert(cons != NULL);
6616 assert(set != NULL);
6617 assert(cons->scip == set->scip);
6618
6619 if( cons->initial != initial )
6620 {
6621 cons->initial = initial;
6622 if( !cons->original )
6623 {
6624 if( cons->initial )
6625 {
6626 SCIP_CALL( conshdlrAddInitcons(SCIPconsGetHdlr(cons), set, stat, cons) );
6627 }
6628 else
6629 {
6630 if( cons->initconsspos >= 0 )
6631 {
6633 }
6634 }
6635 }
6636 }
6637
6638 return SCIP_OKAY;
6639}
6640
6641/** sets the separate flag of the given constraint */
6643 SCIP_CONS* cons, /**< constraint */
6644 SCIP_SET* set, /**< global SCIP settings */
6645 SCIP_Bool separate /**< new value */
6646 )
6647{
6648 assert(cons != NULL);
6649 assert(set != NULL);
6650 assert(cons->scip == set->scip);
6651
6652 if( cons->separate != separate )
6653 {
6655 {
6656 cons->separate = separate;
6657 }
6658 else if( cons->enabled && cons->sepaenabled )
6659 {
6660 if( separate )
6661 {
6662 cons->separate = separate;
6663 SCIP_CALL( conshdlrAddSepacons(cons->conshdlr, set, cons) );
6664 }
6665 else
6666 {
6667 conshdlrDelSepacons(cons->conshdlr, cons);
6668 cons->separate = separate;
6669 }
6670 }
6671 }
6672
6673 return SCIP_OKAY;
6674}
6675
6676/** sets the enforce flag of the given constraint */
6678 SCIP_CONS* cons, /**< constraint */
6679 SCIP_SET* set, /**< global SCIP settings */
6680 SCIP_Bool enforce /**< new value */
6681 )
6682{
6683 assert(cons != NULL);
6684 assert(set != NULL);
6685 assert(cons->scip == set->scip);
6686
6687 if( cons->enforce != enforce )
6688 {
6690 {
6691 cons->enforce = enforce;
6692 }
6693 else if( cons->enabled )
6694 {
6695 if( enforce )
6696 {
6697 cons->enforce = enforce;
6698 SCIP_CALL( conshdlrAddEnfocons(cons->conshdlr, set, cons) );
6699 }
6700 else
6701 {
6702 conshdlrDelEnfocons(cons->conshdlr, cons);
6703 cons->enforce = enforce;
6704 }
6705 }
6706 }
6707
6708 return SCIP_OKAY;
6709}
6710
6711/** sets the check flag of the given constraint */
6713 SCIP_CONS* cons, /**< constraint */
6714 SCIP_SET* set, /**< global SCIP settings */
6715 SCIP_Bool check /**< new value */
6716 )
6717{
6718 assert(cons != NULL);
6719 assert(set != NULL);
6720 assert(cons->scip == set->scip);
6721
6722 if( cons->check != check )
6723 {
6724 cons->check = check;
6725
6726 if( !cons->original )
6727 {
6728 /* if constraint is a problem constraint, update variable roundings locks */
6729 if( cons->addconssetchg == NULL && cons->addarraypos >= 0 )
6730 {
6731 if( cons->check )
6732 {
6734 }
6735 else
6736 {
6738 }
6739 }
6740
6741 /* if constraint is active, update the checkconss array of the constraint handler */
6742 if( cons->active )
6743 {
6744 if( cons->check )
6745 {
6746 SCIP_CALL( conshdlrAddCheckcons(cons->conshdlr, set, cons) );
6747 }
6748 else
6749 {
6750 conshdlrDelCheckcons(cons->conshdlr, cons);
6751 }
6752 }
6753 }
6754 }
6755
6756 return SCIP_OKAY;
6757}
6758
6759/** sets the propagate flag of the given constraint */
6761 SCIP_CONS* cons, /**< constraint */
6762 SCIP_SET* set, /**< global SCIP settings */
6763 SCIP_Bool propagate /**< new value */
6764 )
6765{
6766 assert(cons != NULL);
6767 assert(set != NULL);
6768 assert(cons->scip == set->scip);
6769
6770 if( cons->propagate != propagate )
6771 {
6773 {
6774 cons->propagate = propagate;
6775 }
6776 else if( cons->enabled && cons->propenabled )
6777 {
6778 if( propagate )
6779 {
6780 cons->propagate = propagate;
6781 SCIP_CALL( conshdlrAddPropcons(cons->conshdlr, set, cons) );
6782 }
6783 else
6784 {
6785 conshdlrDelPropcons(cons->conshdlr, cons);
6786 cons->propagate = propagate;
6787 }
6788 }
6789 }
6790
6791 return SCIP_OKAY;
6792}
6793
6794/** sets the local flag of the given constraint */
6796 SCIP_CONS* cons, /**< constraint */
6797 SCIP_Bool local /**< new value */
6798 )
6799{
6800 assert(cons != NULL);
6801
6802 cons->local = local;
6803 if( !local )
6804 cons->validdepth = 0;
6805}
6806
6807/** sets the modifiable flag of the given constraint */
6809 SCIP_CONS* cons, /**< constraint */
6810 SCIP_Bool modifiable /**< new value */
6811 )
6812{
6813 assert(cons != NULL);
6814
6815 cons->modifiable = modifiable;
6816}
6817
6818/** sets the dynamic flag of the given constraint */
6820 SCIP_CONS* cons, /**< constraint */
6821 SCIP_Bool dynamic /**< new value */
6822 )
6823{
6824 assert(cons != NULL);
6825
6826 cons->dynamic = dynamic;
6827}
6828
6829/** sets the removable flag of the given constraint */
6831 SCIP_CONS* cons, /**< constraint */
6832 SCIP_Bool removable /**< new value */
6833 )
6834{
6835 assert(cons != NULL);
6836
6837 cons->removable = removable;
6838}
6839
6840/** sets the stickingatnode flag of the given constraint */
6842 SCIP_CONS* cons, /**< constraint */
6843 SCIP_Bool stickingatnode /**< new value */
6844 )
6845{
6846 assert(cons != NULL);
6847
6848 cons->stickingatnode = stickingatnode;
6849}
6850
6851/** gives the constraint a new name; ATTENTION: to old pointer is over written that might
6852 * result in a memory leakage */
6854 SCIP_CONS* cons, /**< constraint */
6855 const char* name /**< new name of constraint */
6856 )
6857{
6858 assert( cons != NULL );
6859 assert( name != NULL );
6860
6861 cons->name = (char*)name;
6862}
6863
6864/** gets associated transformed constraint of an original constraint, or NULL if no associated transformed constraint
6865 * exists
6866 */
6868 SCIP_CONS* cons /**< constraint */
6869 )
6870{
6871 assert(cons->original);
6872
6873 return cons->transorigcons;
6874}
6875
6876/** activates constraint or marks constraint to be activated in next update */
6878 SCIP_CONS* cons, /**< constraint */
6879 SCIP_SET* set, /**< global SCIP settings */
6880 SCIP_STAT* stat, /**< dynamic problem statistics */
6881 int depth, /**< depth in the tree where the constraint activation takes place, or -1 for global problem */
6882 SCIP_Bool focusnode /**< does the constraint activation take place at the focus node? */
6883 )
6884{
6885 assert(cons != NULL);
6886 assert(!cons->original);
6887 assert(!cons->active);
6888 assert(!cons->updateactivate);
6889 assert(!cons->updatedeactivate);
6890 assert(!cons->updateenable);
6891 assert(!cons->updatedisable);
6892 assert(!cons->updateobsolete);
6893 assert(!cons->updatefree);
6894 assert(cons->activedepth == -2);
6895 assert(cons->conshdlr != NULL);
6896 assert(set != NULL);
6897 assert(cons->scip == set->scip);
6898
6900 {
6901 SCIPsetDebugMsg(set, "delayed activation of constraint <%s> in constraint handler <%s> (depth %d)\n",
6902 cons->name, cons->conshdlr->name, depth);
6903 cons->updateactivate = TRUE;
6904 cons->activedepth = depth;
6905 cons->updateactfocus = focusnode;
6907 assert(cons->update);
6908 }
6909 else
6910 {
6911 SCIP_CALL( conshdlrActivateCons(cons->conshdlr, set, stat, cons, depth, focusnode) );
6912 assert(cons->active);
6913 }
6914
6915 return SCIP_OKAY;
6916}
6917
6918/** deactivates constraint or marks constraint to be deactivated in next update */
6920 SCIP_CONS* cons, /**< constraint */
6921 SCIP_SET* set, /**< global SCIP settings */
6922 SCIP_STAT* stat /**< dynamic problem statistics */
6923 )
6924{
6925 assert(cons != NULL);
6926 assert(!cons->original);
6927 assert(cons->active);
6928 assert(!cons->updateactivate);
6929 assert(!cons->updatedeactivate);
6930 assert(cons->activedepth >= -1);
6931 assert(cons->conshdlr != NULL);
6932 assert(set != NULL);
6933 assert(cons->scip == set->scip);
6934
6936 {
6937 SCIPsetDebugMsg(set, "delayed deactivation of constraint <%s> in constraint handler <%s>\n",
6938 cons->name, cons->conshdlr->name);
6939 cons->updatedeactivate = TRUE;
6940 cons->activedepth = -2;
6942 assert(cons->update);
6943 }
6944 else
6945 {
6946 SCIP_CALL( conshdlrDeactivateCons(cons->conshdlr, set, stat, cons) );
6947 assert(!cons->active);
6948 }
6949
6950 return SCIP_OKAY;
6951}
6952
6953/** enables constraint's separation, enforcing, and propagation capabilities or marks them to be enabled in next update */
6955 SCIP_CONS* cons, /**< constraint */
6956 SCIP_SET* set, /**< global SCIP settings */
6957 SCIP_STAT* stat /**< dynamic problem statistics */
6958 )
6959{
6960 assert(cons != NULL);
6961 assert(!cons->original);
6962 assert(cons->conshdlr != NULL);
6963 assert(set != NULL);
6964 assert(cons->scip == set->scip);
6965
6966 if( !cons->active || cons->updatedeactivate || cons->updateenable || (cons->enabled && !cons->updatedisable) )
6967 return SCIP_OKAY;
6968
6969 assert(!cons->updateactivate);
6970
6972 {
6973 cons->updateenable = TRUE;
6975 assert(cons->update);
6976 }
6977 else
6978 {
6979 SCIP_CALL( conshdlrEnableCons(cons->conshdlr, set, stat, cons) );
6980 assert(cons->enabled);
6981 }
6982
6983 return SCIP_OKAY;
6984}
6985
6986/** disables constraint's separation, enforcing, and propagation capabilities or marks them to be disabled in next update */
6988 SCIP_CONS* cons, /**< constraint */
6989 SCIP_SET* set, /**< global SCIP settings */
6990 SCIP_STAT* stat /**< dynamic problem statistics */
6991 )
6992{
6993 assert(cons != NULL);
6994 assert(!cons->original);
6995 assert(cons->conshdlr != NULL);
6996 assert(set != NULL);
6997 assert(cons->scip == set->scip);
6998
6999 if( cons->updatedisable || (!cons->enabled && !cons->updateenable) )
7000 return SCIP_OKAY;
7001
7002 assert(cons->active);
7003 assert(!cons->updateactivate);
7004
7006 {
7007 cons->updatedisable = TRUE;
7009 assert(cons->update);
7010 }
7011 else
7012 {
7013 SCIP_CALL( conshdlrDisableCons(cons->conshdlr, set, stat, cons) );
7014 assert(!cons->enabled);
7015 }
7016
7017 return SCIP_OKAY;
7018}
7019
7020/** enables constraint's separation capabilities or marks them to be enabled in next update */
7022 SCIP_CONS* cons, /**< constraint */
7023 SCIP_SET* set /**< global SCIP settings */
7024 )
7025{
7026 assert(cons != NULL);
7027 assert(cons->conshdlr != NULL);
7028 assert(set != NULL);
7029 assert(cons->scip == set->scip);
7030
7031 if( cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable) )
7032 return SCIP_OKAY;
7033
7035 {
7036 cons->updatesepadisable = FALSE;
7037 cons->updatesepaenable = TRUE;
7039 assert(cons->update);
7040 }
7041 else
7042 {
7044 assert(cons->sepaenabled);
7045 }
7046
7047 return SCIP_OKAY;
7048}
7049
7050/** disables constraint's separation capabilities or marks them to be disabled in next update */
7052 SCIP_CONS* cons, /**< constraint */
7053 SCIP_SET* set /**< global SCIP settings */
7054 )
7055{
7056 assert(cons != NULL);
7057 assert(cons->conshdlr != NULL);
7058
7059 if( cons->updatesepadisable || (!cons->sepaenabled && !cons->updatesepaenable) )
7060 return SCIP_OKAY;
7061
7063 {
7064 cons->updatesepaenable = FALSE;
7065 cons->updatesepadisable = TRUE;
7067 assert(cons->update);
7068 }
7069 else
7070 {
7072 assert(!cons->sepaenabled);
7073 }
7074
7075 return SCIP_OKAY;
7076}
7077
7078/** enables constraint's propagation capabilities or marks them to be enabled in next update */
7080 SCIP_CONS* cons, /**< constraint */
7081 SCIP_SET* set /**< global SCIP settings */
7082 )
7083{
7084 assert(cons != NULL);
7085 assert(cons->conshdlr != NULL);
7086 assert(set != NULL);
7087 assert(cons->scip == set->scip);
7088
7089 if( cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable) )
7090 return SCIP_OKAY;
7091
7093 {
7094 cons->updatepropdisable = FALSE;
7095 cons->updatepropenable = TRUE;
7097 assert(cons->update);
7098 }
7099 else
7100 {
7102 assert(cons->propenabled);
7103 }
7104
7105 return SCIP_OKAY;
7106}
7107
7108/** disables constraint's propagation capabilities or marks them to be disabled in next update */
7110 SCIP_CONS* cons, /**< constraint */
7111 SCIP_SET* set /**< global SCIP settings */
7112 )
7113{
7114 assert(cons != NULL);
7115 assert(cons->conshdlr != NULL);
7116 assert(set != NULL);
7117 assert(cons->scip == set->scip);
7118
7119 if( cons->updatepropdisable || (!cons->propenabled && !cons->updatepropenable) )
7120 return SCIP_OKAY;
7121
7123 {
7124 cons->updatepropenable = FALSE;
7125 cons->updatepropdisable = TRUE;
7127 assert(cons->update);
7128 }
7129 else
7130 {
7132 assert(!cons->propenabled);
7133 }
7134
7135 return SCIP_OKAY;
7136}
7137
7138/** marks the constraint to be a conflict */
7140 SCIP_CONS* cons /**< constraint */
7141 )
7142{
7143 assert(cons != NULL);
7144
7145 cons->conflict = TRUE;
7146}
7147
7148/** marks the constraint to be propagated (update might be delayed) */
7150 SCIP_CONS* cons, /**< constraint */
7151 SCIP_SET* set /**< global SCIP settings */
7152 )
7153{
7154 assert(cons != NULL);
7155 assert(cons->conshdlr != NULL);
7156 assert(set != NULL);
7157 assert(cons->scip == set->scip);
7158
7159 if( cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate) )
7160 return SCIP_OKAY;
7161
7163 {
7165 cons->updatemarkpropagate = TRUE;
7167 assert(cons->update);
7168 }
7169 else
7170 {
7172 assert(cons->markpropagate || !cons->enabled);
7173 }
7174
7175 return SCIP_OKAY;
7176}
7177
7178/** unmarks the constraint to be propagated (update might be delayed) */
7180 SCIP_CONS* cons, /**< constraint */
7181 SCIP_SET* set /**< global SCIP settings */
7182 )
7183{
7184 assert(cons != NULL);
7185 assert(cons->conshdlr != NULL);
7186 assert(set != NULL);
7187 assert(cons->scip == set->scip);
7188
7189 if( cons->updateunmarkpropagate || (!cons->markpropagate && !cons->updatemarkpropagate) )
7190 return SCIP_OKAY;
7191
7193 {
7194 cons->updatemarkpropagate = FALSE;
7197 assert(cons->update);
7198 }
7199 else
7200 {
7202 assert(!cons->markpropagate || !cons->enabled);
7203 }
7204
7205 return SCIP_OKAY;
7206}
7207
7208/** adds given value to age of constraint, but age can never become negative;
7209 * should be called
7210 * - in constraint separation, if no cut was found for this constraint,
7211 * - in constraint enforcing, if constraint was feasible, and
7212 * - in constraint propagation, if no domain reduction was deduced;
7213 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7214 * in next update
7215 */
7217 SCIP_CONS* cons, /**< constraint */
7218 BMS_BLKMEM* blkmem, /**< block memory */
7219 SCIP_SET* set, /**< global SCIP settings */
7220 SCIP_STAT* stat, /**< dynamic problem statistics */
7221 SCIP_PROB* prob, /**< problem data */
7222 SCIP_Real deltaage, /**< value to add to the constraint's age */
7223 SCIP_REOPT* reopt /**< reoptimization data */
7224 )
7225{
7226 assert(cons != NULL);
7227 assert(cons->conshdlr != NULL);
7228 assert(!cons->updateactivate);
7229 assert(set != NULL);
7230 assert(cons->scip == set->scip);
7231
7232 /* no aging in presolving */
7233 if( set->stage == SCIP_STAGE_PRESOLVING )
7234 return SCIP_OKAY;
7235
7236 SCIPsetDebugMsg(set, "adding %g to age (%g) of constraint <%s> of handler <%s>\n",
7237 deltaage, cons->age, cons->name, cons->conshdlr->name);
7238
7239 cons->age += deltaage;
7240 cons->age = MAX(cons->age, 0.0);
7241
7242 if( !cons->original )
7243 {
7244 if( !cons->check && consExceedsAgelimit(cons, set) )
7245 {
7246 SCIP_CALL( SCIPconsDelete(cons, blkmem, set, stat, prob, reopt) );
7247 }
7248 else if( !cons->obsolete && consExceedsObsoleteage(cons, set) )
7249 {
7251 {
7252 cons->updateobsolete = TRUE;
7254 assert(cons->update);
7255 }
7256 else
7257 {
7259 assert(cons->obsolete);
7260 }
7261 }
7262 }
7263
7264 return SCIP_OKAY;
7265}
7266
7267/** increases age of constraint by 1.0;
7268 * should be called
7269 * - in constraint separation, if no cut was found for this constraint,
7270 * - in constraint enforcing, if constraint was feasible, and
7271 * - in constraint propagation, if no domain reduction was deduced;
7272 * if it's age exceeds the constraint age limit, makes constraint obsolete or marks constraint to be made obsolete
7273 * in next update
7274 */
7276 SCIP_CONS* cons, /**< constraint */
7277 BMS_BLKMEM* blkmem, /**< block memory */
7278 SCIP_SET* set, /**< global SCIP settings */
7279 SCIP_STAT* stat, /**< dynamic problem statistics */
7280 SCIP_PROB* prob, /**< problem data */
7281 SCIP_REOPT* reopt /**< reoptimization data */
7282 )
7283{
7284 SCIP_CALL( SCIPconsAddAge(cons, blkmem, set, stat, prob, 1.0, reopt) );
7285
7286 return SCIP_OKAY;
7287}
7288
7289/** resets age of constraint to zero;
7290 * should be called
7291 * - in constraint separation, if a cut was found for this constraint,
7292 * - in constraint enforcing, if the constraint was violated, and
7293 * - in constraint propagation, if a domain reduction was deduced;
7294 * if it was obsolete, makes constraint useful again or marks constraint to be made useful again in next update
7295 */
7297 SCIP_CONS* cons, /**< constraint */
7298 SCIP_SET* set /**< global SCIP settings */
7299 )
7300{
7301 assert(cons != NULL);
7302 assert(cons->conshdlr != NULL);
7303 assert(!cons->updateactivate);
7304 assert(set != NULL);
7305 assert(cons->scip == set->scip);
7306
7307 SCIPsetDebugMsg(set, "resetting age %g of constraint <%s> of handler <%s>\n", cons->age, cons->name, cons->conshdlr->name);
7308
7310 cons->age = 0.0;
7311
7312 if( cons->obsolete )
7313 {
7314 assert(!cons->original);
7316 {
7317 cons->updateobsolete = TRUE;
7319 assert(cons->update);
7320 }
7321 else
7322 {
7324 assert(!cons->obsolete);
7325 }
7326 }
7327
7328 return SCIP_OKAY;
7329}
7330
7331/** resolves the given conflicting bound, that was deduced by the given constraint, by putting all "reason" bounds
7332 * leading to the deduction into the conflict queue with calls to SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(),
7333 * SCIPaddConflictRelaxedLb(), SCIPaddConflictRelaxedUb(), SCIPaddConflictRelaxedBd(), or SCIPaddConflictBinvar();
7334 *
7335 * @note it is sufficient to explain the relaxed bound change
7336 */
7338 SCIP_CONS* cons, /**< constraint that deduced the assignment */
7339 SCIP_SET* set, /**< global SCIP settings */
7340 SCIP_VAR* infervar, /**< variable whose bound was deduced by the constraint */
7341 int inferinfo, /**< user inference information attached to the bound change */
7342 SCIP_BOUNDTYPE inferboundtype, /**< bound that was deduced (lower or upper bound) */
7343 SCIP_BDCHGIDX* bdchgidx, /**< bound change index, representing the point of time where change took place */
7344 SCIP_Real relaxedbd, /**< the relaxed bound */
7345 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7346 )
7347{
7348 SCIP_CONSHDLR* conshdlr;
7349
7350 assert(set != NULL);
7351 assert(cons != NULL);
7352 assert((inferboundtype == SCIP_BOUNDTYPE_LOWER
7353 && SCIPgetVarLbAtIndex(set->scip, infervar, bdchgidx, TRUE) > SCIPvarGetLbGlobal(infervar))
7354 || (inferboundtype == SCIP_BOUNDTYPE_UPPER
7355 && SCIPgetVarUbAtIndex(set->scip, infervar, bdchgidx, TRUE) < SCIPvarGetUbGlobal(infervar)));
7356 assert(result != NULL);
7357 assert(cons->scip == set->scip);
7358
7359 *result = SCIP_DIDNOTRUN;
7360
7361 conshdlr = cons->conshdlr;
7362 assert(conshdlr != NULL);
7363
7364 if( conshdlr->consresprop != NULL )
7365 {
7366 /* start timing */
7367 SCIPclockStart(conshdlr->resproptime, set);
7368
7369 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, inferboundtype, bdchgidx,
7370 relaxedbd, result) );
7371
7372 /* stop timing */
7373 SCIPclockStop(conshdlr->resproptime, set);
7374
7375 /* update statistics */
7376 conshdlr->nrespropcalls++;
7377
7378 /* check result code */
7379 if( *result != SCIP_SUCCESS && *result != SCIP_DIDNOTFIND )
7380 {
7381 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7382 conshdlr->name, *result);
7383 return SCIP_INVALIDRESULT;
7384 }
7385 }
7386 else
7387 {
7388 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> is not implemented\n",
7389 conshdlr->name);
7390 return SCIP_PLUGINNOTFOUND;
7391 }
7392
7393 return SCIP_OKAY;
7394}
7395
7396/** adds given values to lock status of the constraint and updates the locks of the given locktype of the involved variables */
7398 SCIP_CONS* cons, /**< constraint */
7399 SCIP_SET* set, /**< global SCIP settings */
7400 SCIP_LOCKTYPE locktype, /**< type of variable locks */
7401 int nlockspos, /**< increase in number of rounding locks for constraint */
7402 int nlocksneg /**< increase in number of rounding locks for constraint's negation */
7403 )
7404{
7405 int oldnlockspos;
7406 int oldnlocksneg;
7407 int updlockpos;
7408 int updlockneg;
7409
7410 assert(cons != NULL);
7411 assert(cons->conshdlr != NULL);
7412 assert(cons->conshdlr->conslock != NULL);
7413 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
7414 assert(cons->nlockspos[locktype] >= 0);
7415 assert(cons->nlocksneg[locktype] >= 0);
7416 assert(-2 <= nlockspos && nlockspos <= 2);
7417 assert(-2 <= nlocksneg && nlocksneg <= 2);
7418 assert(set != NULL);
7419 assert(cons->scip == set->scip);
7420
7421 /* update the rounding locks */
7422 oldnlockspos = cons->nlockspos[locktype];
7423 oldnlocksneg = cons->nlocksneg[locktype];
7424 cons->nlockspos[locktype] += nlockspos;
7425 cons->nlocksneg[locktype] += nlocksneg;
7426 assert(cons->nlockspos[locktype] >= 0);
7427 assert(cons->nlocksneg[locktype] >= 0);
7428
7429 /* check, if the constraint switched from unlocked to locked, or from locked to unlocked */
7430 updlockpos = (int)(cons->nlockspos[locktype] > 0) - (int)(oldnlockspos > 0);
7431 updlockneg = (int)(cons->nlocksneg[locktype] > 0) - (int)(oldnlocksneg > 0);
7432
7433 /* lock the variables, if the constraint switched from unlocked to locked or from locked to unlocked */
7434 if( updlockpos != 0 || updlockneg != 0 )
7435 {
7436 SCIP_CALL( cons->conshdlr->conslock(set->scip, cons->conshdlr, cons, locktype, updlockpos, updlockneg) );
7437 }
7438
7439 return SCIP_OKAY;
7440}
7441
7442/** checks single constraint for feasibility of the given solution */
7444 SCIP_CONS* cons, /**< constraint to check */
7445 SCIP_SET* set, /**< global SCIP settings */
7446 SCIP_SOL* sol, /**< primal CIP solution */
7447 SCIP_Bool checkintegrality, /**< Has integrality to be checked? */
7448 SCIP_Bool checklprows, /**< Do constraints represented by rows in the current LP have to be checked? */
7449 SCIP_Bool printreason, /**< Should the reason for the violation be printed? */
7450 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7451 )
7452{
7453 SCIP_CONSHDLR* conshdlr;
7454
7455 assert(cons != NULL);
7456 assert(set != NULL);
7457 assert(cons->scip == set->scip);
7458 assert(result != NULL);
7459
7460 conshdlr = cons->conshdlr;
7461 assert(conshdlr != NULL);
7462
7463 /* call external method */
7464 assert(conshdlr->conscheck != NULL);
7465
7466 SCIP_CALL( conshdlr->conscheck(set->scip, conshdlr, &cons, 1, sol, checkintegrality, checklprows, printreason,
7467 FALSE, result) );
7468 SCIPsetDebugMsg(set, " -> checking returned result <%d>\n", *result);
7469
7470 if( *result != SCIP_INFEASIBLE && *result != SCIP_FEASIBLE )
7471 {
7472 SCIPerrorMessage("feasibility check of constraint handler <%s> on constraint <%s> returned invalid result <%d>\n",
7473 conshdlr->name, cons->name, *result);
7474 return SCIP_INVALIDRESULT;
7475 }
7476
7477 return SCIP_OKAY;
7478}
7479
7480/** enforces single constraint for a given pseudo solution */
7482 SCIP_CONS* cons, /**< constraint to enforce */
7483 SCIP_SET* set, /**< global SCIP settings */
7484 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7485 SCIP_Bool objinfeasible, /**< is the solution infeasible anyway due to violating lower objective bound? */
7486 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7487 )
7488{
7489 SCIP_CONSHDLR* conshdlr;
7490
7491 assert(cons != NULL);
7492 assert(set != NULL);
7493 assert(cons->scip == set->scip);
7494 assert(result != NULL);
7495
7496 conshdlr = cons->conshdlr;
7497 assert(conshdlr != NULL);
7498
7499 /* call external method */
7500 assert(conshdlr->consenfops != NULL);
7501
7502 SCIP_CALL( conshdlr->consenfops(set->scip, conshdlr, &cons, 1, 1, solinfeasible, objinfeasible, result) );
7503 SCIPsetDebugMsg(set, " -> enfops returned result <%d>\n", *result);
7504
7505 if( *result != SCIP_CUTOFF
7506 && *result != SCIP_CONSADDED
7507 && *result != SCIP_REDUCEDDOM
7508 && *result != SCIP_BRANCHED
7509 && *result != SCIP_SOLVELP
7510 && *result != SCIP_INFEASIBLE
7511 && *result != SCIP_FEASIBLE
7512 && *result != SCIP_DIDNOTRUN )
7513 {
7514 SCIPerrorMessage("enforcing method of constraint handler <%s> for pseudo solutions returned invalid result <%d>\n",
7515 conshdlr->name, *result);
7516 return SCIP_INVALIDRESULT;
7517 }
7518
7519 /* do not update statistics */
7520
7521 return SCIP_OKAY;
7522}
7523
7524/** enforces single constraint for a given LP solution */
7526 SCIP_CONS* cons, /**< constraint to enforce */
7527 SCIP_SET* set, /**< global SCIP settings */
7528 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7529 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7530 )
7531{
7532 SCIP_CONSHDLR* conshdlr;
7533
7534 assert(cons != NULL);
7535 assert(set != NULL);
7536 assert(cons->scip == set->scip);
7537 assert(result != NULL);
7538
7539 conshdlr = cons->conshdlr;
7540 assert(conshdlr != NULL);
7541
7542 /* call external method */
7543 assert(conshdlr->consenfolp != NULL);
7544
7545 SCIP_CALL( conshdlr->consenfolp(set->scip, conshdlr, &cons, 1, 1, solinfeasible, result) );
7546 SCIPsetDebugMsg(set, " -> enfolp returned result <%d>\n", *result);
7547
7548 if( *result != SCIP_CUTOFF
7549 && *result != SCIP_CONSADDED
7550 && *result != SCIP_REDUCEDDOM
7551 && *result != SCIP_BRANCHED
7552 && *result != SCIP_SEPARATED
7553 && *result != SCIP_INFEASIBLE
7554 && *result != SCIP_FEASIBLE)
7555 {
7556 SCIPerrorMessage("enforcing method of constraint handler <%s> for LP returned invalid result <%d>\n",
7557 conshdlr->name, *result);
7558 return SCIP_INVALIDRESULT;
7559 }
7560
7561 /* do not update statistics */
7562
7563 return SCIP_OKAY;
7564}
7565
7566/** enforces single constraint for a given relaxation solution */
7568 SCIP_CONS* cons, /**< constraint to enforce */
7569 SCIP_SET* set, /**< global SCIP settings */
7570 SCIP_SOL* sol, /**< solution to be enforced */
7571 SCIP_Bool solinfeasible, /**< was the solution already declared infeasible by a constraint handler? */
7572 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7573 )
7574{
7575 SCIP_CONSHDLR* conshdlr;
7576
7577 assert(cons != NULL);
7578 assert(set != NULL);
7579 assert(cons->scip == set->scip);
7580 assert(sol != NULL);
7581 assert(result != NULL);
7582
7583 conshdlr = cons->conshdlr;
7584 assert(conshdlr != NULL);
7585
7586 /* call external method */
7587 assert(conshdlr->consenfolp != NULL);
7588
7589 SCIP_CALL( conshdlr->consenforelax(set->scip, sol, conshdlr, &cons, 1, 1, solinfeasible, result) );
7590 SCIPdebugMessage(" -> enforelax returned result <%d>\n", *result);
7591
7592 if( *result != SCIP_CUTOFF
7593 && *result != SCIP_CONSADDED
7594 && *result != SCIP_REDUCEDDOM
7595 && *result != SCIP_BRANCHED
7596 && *result != SCIP_SEPARATED
7597 && *result != SCIP_INFEASIBLE
7598 && *result != SCIP_FEASIBLE)
7599 {
7600 SCIPerrorMessage("enforcing method of constraint handler <%s> for relaxation returned invalid result <%d>\n",
7601 conshdlr->name, *result);
7602 return SCIP_INVALIDRESULT;
7603 }
7604
7605 /* do not update statistics */
7606
7607 return SCIP_OKAY;
7608}
7609
7610/** calls LP initialization method for single constraint */
7612 SCIP_CONS* cons, /**< constraint to initialize */
7613 SCIP_SET* set, /**< global SCIP settings */
7614 SCIP_Bool* infeasible /**< pointer to store whether infeasibility was detected while building the LP */
7615 )
7616{
7617 SCIP_CONSHDLR* conshdlr;
7618
7619 assert(cons != NULL);
7620 assert(set != NULL);
7621 assert(infeasible != NULL);
7622 assert(cons->scip == set->scip);
7623
7624 conshdlr = cons->conshdlr;
7625 assert(conshdlr != NULL);
7626
7627 /* call external method */
7628 if( conshdlr->consinitlp != NULL )
7629 {
7630 SCIP_CALL( conshdlr->consinitlp(set->scip, conshdlr, &cons, 1, infeasible) );
7631 }
7632
7633 return SCIP_OKAY;
7634}
7635
7636/** calls separation method of single constraint for LP solution */
7638 SCIP_CONS* cons, /**< constraint to separate */
7639 SCIP_SET* set, /**< global SCIP settings */
7640 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7641 )
7642{
7643 SCIP_CONSHDLR* conshdlr;
7644
7645 assert(cons != NULL);
7646 assert(set != NULL);
7647 assert(cons->scip == set->scip);
7648 assert(result != NULL);
7649
7650 conshdlr = cons->conshdlr;
7651 assert(conshdlr != NULL);
7652
7653 /* call external method */
7654 if( conshdlr->conssepalp != NULL )
7655 {
7656 SCIP_CALL( conshdlr->conssepalp(set->scip, conshdlr, &cons, 1, 1, result) );
7657 SCIPsetDebugMsg(set, " -> sepalp returned result <%d>\n", *result);
7658
7659 if( *result != SCIP_CUTOFF
7660 && *result != SCIP_CONSADDED
7661 && *result != SCIP_REDUCEDDOM
7662 && *result != SCIP_SEPARATED
7663 && *result != SCIP_NEWROUND
7664 && *result != SCIP_DIDNOTFIND
7665 && *result != SCIP_DIDNOTRUN
7666 && *result != SCIP_DELAYED )
7667 {
7668 SCIPerrorMessage("separation method of constraint handler <%s> returned invalid result <%d>\n", conshdlr->name,
7669 *result);
7670 return SCIP_INVALIDRESULT;
7671 }
7672 }
7673
7674 return SCIP_OKAY;
7675}
7676
7677/** calls separation method of single constraint for given primal solution */
7679 SCIP_CONS* cons, /**< constraint to separate */
7680 SCIP_SET* set, /**< global SCIP settings */
7681 SCIP_SOL* sol, /**< primal solution that should be separated */
7682 SCIP_RESULT* result /**< pointer to store the result of the separation call */
7683 )
7684{
7685 SCIP_CONSHDLR* conshdlr;
7686
7687 assert(cons != NULL);
7688 assert(set != NULL);
7689 assert(cons->scip == set->scip);
7690 assert(sol != NULL);
7691 assert(result != NULL);
7692
7693 conshdlr = cons->conshdlr;
7694 assert(conshdlr != NULL);
7695
7696 /* call external method */
7697 if( conshdlr->conssepasol != NULL )
7698 {
7699 SCIP_CALL( conshdlr->conssepasol(set->scip, conshdlr, &cons, 1, 1, sol, result) );
7700 SCIPsetDebugMsg(set, " -> sepasol returned result <%d>\n", *result);
7701
7702 if( *result != SCIP_CUTOFF
7703 && *result != SCIP_CONSADDED
7704 && *result != SCIP_REDUCEDDOM
7705 && *result != SCIP_SEPARATED
7706 && *result != SCIP_NEWROUND
7707 && *result != SCIP_DIDNOTFIND
7708 && *result != SCIP_DIDNOTRUN
7709 && *result != SCIP_DELAYED )
7710 {
7711 SCIPerrorMessage("separation method of constraint handler for arbitrary primal solution <%s> returned invalid result <%d>\n",
7712 conshdlr->name, *result);
7713 return SCIP_INVALIDRESULT;
7714 }
7715 }
7716
7717 return SCIP_OKAY;
7718}
7719
7720/** calls domain propagation method of single constraint */
7722 SCIP_CONS* cons, /**< constraint to propagate */
7723 SCIP_SET* set, /**< global SCIP settings */
7724 SCIP_PROPTIMING proptiming, /**< current point in the node solving loop */
7725 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7726 )
7727{
7728 SCIP_CONSHDLR* conshdlr;
7729
7730 assert(cons != NULL);
7731 assert(set != NULL);
7732 assert(cons->scip == set->scip);
7733 assert(result != NULL);
7734
7735 conshdlr = cons->conshdlr;
7736 assert(conshdlr != NULL);
7737
7738 /* call external method */
7739 if( conshdlr->consprop != NULL )
7740 {
7741 SCIP_CALL( conshdlr->consprop(set->scip, conshdlr, &cons, 1, 1, 1, proptiming, result) );
7742 SCIPsetDebugMsg(set, " -> prop returned result <%d>\n", *result);
7743
7744 if( *result != SCIP_CUTOFF
7745 && *result != SCIP_CONSADDED
7746 && *result != SCIP_REDUCEDDOM
7747 && *result != SCIP_DIDNOTFIND
7748 && *result != SCIP_DIDNOTRUN
7749 && *result != SCIP_DELAYED )
7750 {
7751 SCIPerrorMessage("propagation method of constraint handler <%s> returned invalid result <%d>\n",
7752 conshdlr->name, *result);
7753 return SCIP_INVALIDRESULT;
7754 }
7755 }
7756
7757 return SCIP_OKAY;
7758}
7759
7760/** resolves propagation conflict of single constraint */
7762 SCIP_CONS* cons, /**< constraint to resolve conflict for */
7763 SCIP_SET* set, /**< global SCIP settings */
7764 SCIP_VAR* infervar, /**< the conflict variable whose bound change has to be resolved */
7765 int inferinfo, /**< the user information passed to the corresponding SCIPinferVarLbCons() or SCIPinferVarUbCons() call */
7766 SCIP_BOUNDTYPE boundtype, /**< the type of the changed bound (lower or upper bound) */
7767 SCIP_BDCHGIDX* bdchgidx, /**< the index of the bound change, representing the point of time where the change took place */
7768 SCIP_Real relaxedbd, /**< the relaxed bound which is sufficient to be explained */
7769 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7770 )
7771{
7772 SCIP_CONSHDLR* conshdlr;
7773
7774 assert(cons != NULL);
7775 assert(set != NULL);
7776 assert(cons->scip == set->scip);
7777 assert(result != NULL);
7778 assert(infervar != NULL);
7779 assert(bdchgidx != NULL);
7780
7781 conshdlr = cons->conshdlr;
7782 assert(conshdlr != NULL);
7783
7784 /* call external method */
7785 if( conshdlr->consresprop != NULL )
7786 {
7787 SCIP_CALL( conshdlr->consresprop(set->scip, conshdlr, cons, infervar, inferinfo, boundtype, bdchgidx, relaxedbd, result) );
7788 SCIPsetDebugMsg(set, " -> resprop returned result <%d>\n", *result);
7789
7790 if( *result != SCIP_SUCCESS
7791 && *result != SCIP_DIDNOTFIND )
7792 {
7793 SCIPerrorMessage("propagation conflict resolving method of constraint handler <%s> returned invalid result <%d>\n",
7794 conshdlr->name, *result);
7795 return SCIP_INVALIDRESULT;
7796 }
7797 }
7798
7799 return SCIP_OKAY;
7800}
7801
7802/** presolves single constraint */
7804 SCIP_CONS* cons, /**< constraint to presolve */
7805 SCIP_SET* set, /**< global SCIP settings */
7806 int nrounds, /**< number of presolving rounds already done */
7807 SCIP_PRESOLTIMING timing, /**< current presolving timing */
7808 int nnewfixedvars, /**< number of variables fixed since the last call to the presolving method */
7809 int nnewaggrvars, /**< number of variables aggregated since the last call to the presolving method */
7810 int nnewchgvartypes, /**< number of variable type changes since the last call to the presolving method */
7811 int nnewchgbds, /**< number of variable bounds tightened since the last call to the presolving method */
7812 int nnewholes, /**< number of domain holes added since the last call to the presolving method */
7813 int nnewdelconss, /**< number of deleted constraints since the last call to the presolving method */
7814 int nnewaddconss, /**< number of added constraints since the last call to the presolving method */
7815 int nnewupgdconss, /**< number of upgraded constraints since the last call to the presolving method */
7816 int nnewchgcoefs, /**< number of changed coefficients since the last call to the presolving method */
7817 int nnewchgsides, /**< number of changed left or right hand sides since the last call to the presolving method */
7818 int* nfixedvars, /**< pointer to count total number of variables fixed of all presolvers */
7819 int* naggrvars, /**< pointer to count total number of variables aggregated of all presolvers */
7820 int* nchgvartypes, /**< pointer to count total number of variable type changes of all presolvers */
7821 int* nchgbds, /**< pointer to count total number of variable bounds tightened of all presolvers */
7822 int* naddholes, /**< pointer to count total number of domain holes added of all presolvers */
7823 int* ndelconss, /**< pointer to count total number of deleted constraints of all presolvers */
7824 int* naddconss, /**< pointer to count total number of added constraints of all presolvers */
7825 int* nupgdconss, /**< pointer to count total number of upgraded constraints of all presolvers */
7826 int* nchgcoefs, /**< pointer to count total number of changed coefficients of all presolvers */
7827 int* nchgsides, /**< pointer to count total number of changed left/right hand sides of all presolvers */
7828 SCIP_RESULT* result /**< pointer to store the result of the callback method */
7829 )
7830{
7831 SCIP_CONSHDLR* conshdlr;
7832
7833 assert(cons != NULL);
7834 assert(set != NULL);
7835 assert(cons->scip == set->scip);
7836 assert(nfixedvars != NULL);
7837 assert(naggrvars != NULL);
7838 assert(nchgvartypes != NULL);
7839 assert(nchgbds != NULL);
7840 assert(naddholes != NULL);
7841 assert(ndelconss != NULL);
7842 assert(naddconss != NULL);
7843 assert(nupgdconss != NULL);
7844 assert(nchgcoefs != NULL);
7845 assert(nchgsides != NULL);
7846 assert(result != NULL);
7847
7848 conshdlr = cons->conshdlr;
7849 assert(conshdlr != NULL);
7850
7851 /* call external method */
7852 if( conshdlr->conspresol != NULL )
7853 {
7854 SCIP_CALL( conshdlr->conspresol(set->scip, conshdlr, &cons, 1, nrounds, timing,
7855 nnewfixedvars, nnewaggrvars, nnewchgvartypes, nnewchgbds, nnewholes, nnewdelconss, nnewaddconss,
7856 nnewupgdconss, nnewchgcoefs, nnewchgsides, nfixedvars, naggrvars, nchgvartypes,
7857 nchgbds, naddholes, ndelconss, naddconss, nupgdconss, nchgcoefs, nchgsides, result) );
7858 SCIPsetDebugMsg(set, " -> presol returned result <%d>\n", *result);
7859
7860 if( *result != SCIP_UNBOUNDED
7861 && *result != SCIP_CUTOFF
7862 && *result != SCIP_SUCCESS
7863 && *result != SCIP_DIDNOTFIND
7864 && *result != SCIP_DIDNOTRUN
7865 && *result != SCIP_DELAYED )
7866 {
7867 SCIPerrorMessage("presolving method of constraint handler <%s> returned invalid result <%d>\n",
7868 conshdlr->name, *result);
7869 return SCIP_INVALIDRESULT;
7870 }
7871 }
7872
7873 return SCIP_OKAY;
7874}
7875
7876/** calls constraint activation notification method of single constraint */
7878 SCIP_CONS* cons, /**< constraint to notify */
7879 SCIP_SET* set /**< global SCIP settings */
7880 )
7881{
7882 SCIP_CONSHDLR* conshdlr;
7883
7884 assert(cons != NULL);
7885 assert(set != NULL);
7886 assert(cons->scip == set->scip);
7887
7888 conshdlr = cons->conshdlr;
7889 assert(conshdlr != NULL);
7890
7891 /* call external method */
7892 if( conshdlr->consactive != NULL )
7893 {
7894 SCIP_CALL( conshdlr->consactive(set->scip, conshdlr, cons) );
7895 }
7896
7897 return SCIP_OKAY;
7898}
7899
7900/** calls constraint deactivation notification method of single constraint */
7902 SCIP_CONS* cons, /**< constraint to notify */
7903 SCIP_SET* set /**< global SCIP settings */
7904 )
7905{
7906 SCIP_CONSHDLR* conshdlr;
7907
7908 assert(cons != NULL);
7909 assert(set != NULL);
7910 assert(cons->scip == set->scip);
7911
7912 conshdlr = cons->conshdlr;
7913 assert(conshdlr != NULL);
7914
7915 /* call external method */
7916 if( conshdlr->consdeactive != NULL )
7917 {
7918 SCIP_CALL( conshdlr->consdeactive(set->scip, conshdlr, cons) );
7919 }
7920
7921 return SCIP_OKAY;
7922}
7923
7924
7925
7926/*
7927 * Hash functions
7928 */
7929
7930/** gets the key (i.e. the name) of the given constraint */
7931SCIP_DECL_HASHGETKEY(SCIPhashGetKeyCons)
7932{ /*lint --e{715}*/
7933 SCIP_CONS* cons = (SCIP_CONS*)elem;
7934
7935 assert(cons != NULL);
7936 return cons->name;
7937}
7938
7939
7940/*
7941 * method for arrays of contraint handlers
7942 */
7943
7944/** ensures size of storage for propagable constraints with a minimum size of num */
7945static
7947 SCIP_SET* set, /**< global SCIP settings */
7948 SCIP_CONSHDLR* conshdlr, /**< constraint handler */
7949 int num /**< minimum number of entries to store */
7950 )
7951{
7952 assert(set != NULL);
7953 assert(conshdlr != NULL);
7954
7955 if( num > conshdlr->storedpropconsssize )
7956 {
7957 int newsize;
7958
7959 newsize = SCIPsetCalcMemGrowSize(set, num);
7960 SCIP_ALLOC( BMSreallocMemoryArray(&(conshdlr->storedpropconss), newsize) );
7961
7962 conshdlr->storedpropconsssize = newsize;
7963 }
7964 assert(num <= conshdlr->storedpropconsssize);
7965
7966 return SCIP_OKAY;
7967}
7968
7969/** stores all constraints marked for propagation away when probing is started */
7971 SCIP_SET* set, /**< global SCIP settings */
7972 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
7973 int nconshdlrs /**< number of contraint handlers */
7974 )
7975{
7976 SCIP_CONSHDLR* conshdlr;
7977 int c;
7978
7979 assert(set != NULL);
7980 assert(conshdlrs != NULL || nconshdlrs == 0);
7981
7982 for( c = nconshdlrs - 1; c >= 0; --c )
7983 {
7984 conshdlr = conshdlrs[c]; /*lint !e613*/
7985 assert(conshdlr != NULL);
7986 assert(conshdlr->storednmarkedpropconss == 0);
7987
7988 if( conshdlr->nmarkedpropconss > 0 )
7989 {
7990 int v;
7991
7992 SCIP_CALL( ensurePropagationStorage(set, conshdlr, conshdlr->nmarkedpropconss) );
7993 BMScopyMemoryArray(conshdlr->storedpropconss, conshdlr->propconss, conshdlr->nmarkedpropconss);
7994
7995 conshdlr->storednmarkedpropconss = conshdlr->nmarkedpropconss;
7996 conshdlr->storedpropdomchgcount = conshdlr->lastpropdomchgcount;
7997
7998 for( v = conshdlr->storednmarkedpropconss - 1; v >= 0; --v )
7999 {
8000 SCIPconsCapture(conshdlr->storedpropconss[v]);
8001 }
8002 /* assert(conshdlr->nmarkedpropconss == 0); this assert does not hold if updates are delayed */
8003 }
8004 }
8005
8006 return SCIP_OKAY;
8007}
8008
8009/** reset all constraints marked for propagation when probing was finished */
8011 SCIP_SET* set, /**< global SCIP settings */
8012 BMS_BLKMEM* blkmem, /**< block memory */
8013 SCIP_CONSHDLR** conshdlrs, /**< all constraint handlers */
8014 int nconshdlrs /**< number of contraint handlers */
8015 )
8016{
8017 SCIP_CONSHDLR* conshdlr;
8018 int c;
8019
8020 assert(set != NULL);
8021 assert(blkmem != NULL);
8022 assert(conshdlrs != NULL || nconshdlrs == 0);
8023
8024 for( c = nconshdlrs - 1; c >= 0; --c )
8025 {
8026 conshdlr = conshdlrs[c]; /*lint !e613*/
8027 assert(conshdlr != NULL);
8028
8029 if( conshdlr->storednmarkedpropconss > 0 )
8030 {
8031#ifndef NDEBUG
8032 int ndisabled = 0;
8033#endif
8034 int v;
8035
8036 for( v = conshdlr->nmarkedpropconss - 1; v >= 0; --v )
8037 {
8039 }
8040
8041 /* mark all previously marked constraint, which were marked before probing */
8042 for( v = 0; v < conshdlr->storednmarkedpropconss; ++v )
8043 {
8044 SCIP_CONS* cons = conshdlr->storedpropconss[v];
8045 assert(cons != NULL);
8046
8047 if( cons->enabled && cons->propagate && cons->propenabled )
8048 {
8050 }
8051#ifndef NDEBUG
8052 else
8053 ++ndisabled;
8054#endif
8055 SCIP_CALL( SCIPconsRelease(&cons, blkmem, set) );
8056 } /*lint !e438*/
8057
8058 assert(conshdlr->storednmarkedpropconss - ndisabled <= conshdlr->npropconss);
8059 assert(conshdlr->nmarkedpropconss + ndisabled >= conshdlr->storednmarkedpropconss || (conshdlrAreUpdatesDelayed(conshdlr) && conshdlr->nupdateconss + ndisabled >= conshdlr->storednmarkedpropconss));
8060
8061 conshdlr->lastpropdomchgcount = conshdlr->storedpropdomchgcount;
8062 conshdlr->storednmarkedpropconss = 0;
8063 }
8064 }
8065
8066 return SCIP_OKAY;
8067}
8068
8069/** create linear constraint statistics */
8071 SCIP* scip, /**< scip data structure */
8072 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8073 )
8074{
8075 assert(linconsstats != NULL);
8076
8077 SCIP_CALL( SCIPallocBlockMemory(scip, linconsstats) );
8078
8079 return SCIP_OKAY;
8080}
8081
8082/** free linear constraint statistics */
8084 SCIP* scip, /**< scip data structure */
8085 SCIP_LINCONSSTATS** linconsstats /**< pointer to linear constraint classification statistics */
8086 )
8087{
8088 assert(linconsstats != NULL);
8089 assert(*linconsstats != NULL);
8090
8091 SCIPfreeBlockMemory(scip, linconsstats);
8092}
8093
8094/** resets linear constraint statistics */
8096 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8097 )
8098{
8100 linconsstats->sum = 0;
8101}
8102
8103/** returns the number of occurrences of a specific type of linear constraint */
8105 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8106 SCIP_LINCONSTYPE linconstype /**< linear constraint type */
8107 )
8108{
8109 assert(linconsstats != NULL);
8110 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8111 assert(linconsstats->counter != NULL);
8112
8113 return linconsstats->counter[(int)linconstype];
8114}
8115
8116/** returns the total number of classified constraints */
8118 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8119 )
8120{
8121 assert(linconsstats != NULL);
8122
8123 return linconsstats->sum;
8124}
8125
8126/** increases the number of occurrences of a specific type of linear constraint */
8128 SCIP_LINCONSSTATS* linconsstats, /**< linear constraint classification statistics */
8129 SCIP_LINCONSTYPE linconstype, /**< linear constraint type */
8130 int increment /**< positive increment */
8131 )
8132{
8133 assert(linconsstats != NULL);
8134 assert(increment >= 1);
8135 assert(0 <= (int)linconstype && (int)linconstype < SCIP_NLINCONSTYPES); /*lint !e587 !e685 !e568*/
8136 assert(linconsstats->counter != NULL);
8137
8138 linconsstats->counter[(int)linconstype] += increment;
8139 linconsstats->sum += increment;
8140}
8141
8142/** print linear constraint classification statistics */
8144 SCIP* scip, /**< scip data structure */
8145 FILE* file, /**< file handle or NULL to print to standard out */
8146 SCIP_LINCONSSTATS* linconsstats /**< linear constraint classification statistics */
8147 )
8148{
8149 assert(scip != NULL);
8150 assert(linconsstats != NULL);
8151
8152 /* print statistics */
8153 SCIPinfoMessage(scip, file, "\n");
8154 SCIPinfoMessage(scip, file, "%-19s : %10s\n", "Linear cons types", "count");
8155 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "total", SCIPlinConsStatsGetSum(linconsstats));
8156 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "empty", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EMPTY));
8157 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "free", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_FREE));
8158 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "singleton", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SINGLETON));
8159 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "aggregation", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_AGGREGATION));
8160 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "precedence", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_PRECEDENCE));
8161 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "varbound", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_VARBOUND));
8162 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpartition", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPARTITION));
8163 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETPACKING));
8164 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "setcovering", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_SETCOVERING));
8165 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "cardinality", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_CARDINALITY));
8166 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "invknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INVKNAPSACK));
8167 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "eqknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_EQKNAPSACK));
8168 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "binpacking", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_BINPACKING));
8169 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "knapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_KNAPSACK));
8170 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "intknapsack", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_INTKNAPSACK));
8171 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "mixedbinary", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_MIXEDBINARY));
8172 SCIPinfoMessage(scip, file, " %-17s : %10d\n", "general", SCIPlinConsStatsGetTypeCount(linconsstats, SCIP_LINCONSTYPE_GENERAL));
8173 SCIPinfoMessage(scip, file, "\n");
8174}
8175
8176/*
8177 * simple functions implemented as defines
8178 */
8179
8180/* In debug mode, the following methods are implemented as function calls to ensure
8181 * type validity.
8182 * In optimized mode, the methods are implemented as defines to improve performance.
8183 * However, we want to have them in the library anyways, so we have to undef the defines.
8184 */
8185
8186#undef SCIPconsGetName
8187#undef SCIPconsGetPos
8188#undef SCIPconsGetHdlr
8189#undef SCIPconsGetData
8190#undef SCIPconsGetNUses
8191#undef SCIPconsGetActiveDepth
8192#undef SCIPconsGetValidDepth
8193#undef SCIPconsIsActive
8194#undef SCIPconsIsEnabled
8195#undef SCIPconsIsSeparationEnabled
8196#undef SCIPconsIsPropagationEnabled
8197#undef SCIPconsIsDeleted
8198#undef SCIPconsIsObsolete
8199#undef SCIPconsIsConflict
8200#undef SCIPconsGetAge
8201#undef SCIPconsIsInitial
8202#undef SCIPconsIsSeparated
8203#undef SCIPconsIsEnforced
8204#undef SCIPconsIsChecked
8205#undef SCIPconsIsMarkedPropagate
8206#undef SCIPconsIsPropagated
8207#undef SCIPconsIsGlobal
8208#undef SCIPconsIsLocal
8209#undef SCIPconsIsModifiable
8210#undef SCIPconsIsDynamic
8211#undef SCIPconsIsRemovable
8212#undef SCIPconsIsStickingAtNode
8213#undef SCIPconsIsInProb
8214#undef SCIPconsIsOriginal
8215#undef SCIPconsIsTransformed
8216#undef SCIPconsIsLockedPos
8217#undef SCIPconsIsLockedNeg
8218#undef SCIPconsIsLocked
8219#undef SCIPconsGetNLocksPos
8220#undef SCIPconsGetNLocksNeg
8221#undef SCIPconsIsLockedTypePos
8222#undef SCIPconsIsLockedTypeNeg
8223#undef SCIPconsIsLockedType
8224#undef SCIPconsGetNLocksTypePos
8225#undef SCIPconsGetNLocksTypeNeg
8226#undef SCIPconsIsAdded
8227#undef SCIPconsGetNUpgradeLocks
8228
8229/** returns the name of the constraint
8230 *
8231 * @note to change the name of a constraint, use SCIPchgConsName() from scip.h
8232 */
8234 SCIP_CONS* cons /**< constraint */
8235 )
8236{
8237 assert(cons != NULL);
8238
8239 return cons->name;
8240}
8241
8242/** returns the position of constraint in the corresponding handler's conss array */
8244 SCIP_CONS* cons /**< constraint */
8245 )
8246{
8247 assert(cons != NULL);
8248
8249 return cons->consspos;
8250}
8251
8252/** returns the constraint handler of the constraint */
8254 SCIP_CONS* cons /**< constraint */
8255 )
8256{
8257 assert(cons != NULL);
8258
8259 return cons->conshdlr;
8260}
8261
8262/** returns the constraint data field of the constraint */
8264 SCIP_CONS* cons /**< constraint */
8265 )
8266{
8267 assert(cons != NULL);
8268
8269 return cons->consdata;
8270}
8271
8272/** gets number of times, the constraint is currently captured */
8274 SCIP_CONS* cons /**< constraint */
8275 )
8276{
8277 assert(cons != NULL);
8278
8279 return cons->nuses;
8280}
8281
8282/** for an active constraint, returns the depth in the tree at which the constraint was activated */
8284 SCIP_CONS* cons /**< constraint */
8285 )
8286{
8287 assert(cons != NULL);
8288 assert(SCIPconsIsActive(cons));
8289
8290 return cons->activedepth;
8291}
8292
8293/** returns TRUE iff constraint is active in the current node */
8295 SCIP_CONS* cons /**< constraint */
8296 )
8297{
8298 assert(cons != NULL);
8299
8300 return cons->updateactivate || (cons->active && !cons->updatedeactivate);
8301}
8302
8303/** returns TRUE iff constraint is active in the current node */
8305 SCIP_CONS* cons /**< constraint */
8306 )
8307{
8308 assert(cons != NULL);
8309
8310 return cons->updatedeactivate;
8311}
8312
8313/** returns the depth in the tree at which the constraint is valid; returns INT_MAX, if the constraint is local
8314 * and currently not active
8315 */
8317 SCIP_CONS* cons /**< constraint */
8318 )
8319{
8320 assert(cons != NULL);
8321 assert(cons->validdepth == 0 || cons->local);
8322
8323 return (!cons->local ? 0
8324 : !SCIPconsIsActive(cons) ? INT_MAX
8325 : cons->validdepth == -1 ? SCIPconsGetActiveDepth(cons)
8326 : cons->validdepth);
8327}
8328
8329/** returns TRUE iff constraint is enabled in the current node */
8331 SCIP_CONS* cons /**< constraint */
8332 )
8333{
8334 assert(cons != NULL);
8335
8336 return cons->updateenable || (cons->enabled && !cons->updatedisable);
8337}
8338
8339/** returns TRUE iff constraint's separation is enabled in the current node */
8341 SCIP_CONS* cons /**< constraint */
8342 )
8343{
8344 assert(cons != NULL);
8345
8346 return SCIPconsIsEnabled(cons)
8347 && (cons->updatesepaenable || (cons->sepaenabled && !cons->updatesepadisable));
8348}
8349
8350/** returns TRUE iff constraint's propagation is enabled in the current node */
8352 SCIP_CONS* cons /**< constraint */
8353 )
8354{
8355 assert(cons != NULL);
8356
8357 return SCIPconsIsEnabled(cons)
8358 && (cons->updatepropenable || (cons->propenabled && !cons->updatepropdisable));
8359}
8360
8361/** returns TRUE iff constraint is deleted or marked to be deleted */
8363 SCIP_CONS* cons /**< constraint */
8364 )
8365{
8366 assert(cons != NULL);
8367
8368 return cons->deleted;
8369}
8370
8371/** returns TRUE iff constraint is marked obsolete */
8373 SCIP_CONS* cons /**< constraint */
8374 )
8375{
8376 assert(cons != NULL);
8377
8378 return cons->updateobsolete || cons->obsolete;
8379}
8380
8381/** returns TRUE iff constraint is marked as a conflict */
8383 SCIP_CONS* cons /**< constraint */
8384 )
8385{
8386 assert(cons != NULL);
8387
8388 return cons->conflict;
8389}
8390
8391/** gets age of constraint */
8393 SCIP_CONS* cons /**< constraint */
8394 )
8395{
8396 assert(cons != NULL);
8397
8398 return cons->age;
8399}
8400
8401/** returns TRUE iff the LP relaxation of constraint should be in the initial LP */
8403 SCIP_CONS* cons /**< constraint */
8404 )
8405{
8406 assert(cons != NULL);
8407
8408 return cons->initial;
8409}
8410
8411/** returns TRUE iff constraint should be separated during LP processing */
8413 SCIP_CONS* cons /**< constraint */
8414 )
8415{
8416 assert(cons != NULL);
8417
8418 return cons->separate;
8419}
8420
8421/** returns TRUE iff constraint should be enforced during node processing */
8423 SCIP_CONS* cons /**< constraint */
8424 )
8425{
8426 assert(cons != NULL);
8427
8428 return cons->enforce;
8429}
8430
8431/** returns TRUE iff constraint should be checked for feasibility */
8433 SCIP_CONS* cons /**< constraint */
8434 )
8435{
8436 assert(cons != NULL);
8437
8438 return cons->check;
8439}
8440
8441/** returns whether the constraint is marked for propagation */
8443 SCIP_CONS* cons /**< constraint */
8444 )
8445{
8446 assert(cons != NULL);
8447
8448 return (cons->updatemarkpropagate || (cons->markpropagate && !cons->updateunmarkpropagate));
8449}
8450
8451/** returns TRUE iff constraint should be propagated during node processing */
8453 SCIP_CONS* cons /**< constraint */
8454 )
8455{
8456 assert(cons != NULL);
8457
8458 return cons->propagate;
8459}
8460
8461/** returns TRUE iff constraint is globally valid */
8463 SCIP_CONS* cons /**< constraint */
8464 )
8465{
8466 assert(cons != NULL);
8467
8468 return !cons->local;
8469}
8470
8471/** returns TRUE iff constraint is only locally valid or not added to any (sub)problem */
8473 SCIP_CONS* cons /**< constraint */
8474 )
8475{
8476 assert(cons != NULL);
8477
8478 return cons->local;
8479}
8480
8481/** returns TRUE iff constraint is modifiable (subject to column generation) */
8483 SCIP_CONS* cons /**< constraint */
8484 )
8485{
8486 assert(cons != NULL);
8487
8488 return cons->modifiable;
8489}
8490
8491/** returns TRUE iff constraint is subject to aging */
8493 SCIP_CONS* cons /**< constraint */
8494 )
8495{
8496 assert(cons != NULL);
8497
8498 return cons->dynamic;
8499}
8500
8501/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8503 SCIP_CONS* cons /**< constraint */
8504 )
8505{
8506 assert(cons != NULL);
8507
8508 return cons->removable;
8509}
8510
8511/** returns TRUE iff constraint's relaxation should be removed from the LP due to aging or cleanup */
8513 SCIP_CONS* cons /**< constraint */
8514 )
8515{
8516 assert(cons != NULL);
8517
8518 return cons->stickingatnode;
8519}
8520
8521/** returns TRUE iff constraint belongs to the global problem */
8523 SCIP_CONS* cons /**< constraint */
8524 )
8525{
8526 assert(cons != NULL);
8527
8528 return (cons->addconssetchg == NULL && cons->addarraypos >= 0);
8529}
8530
8531/** returns TRUE iff constraint is belonging to original space */
8533 SCIP_CONS* cons /**< constraint */
8534 )
8535{
8536 assert(cons != NULL);
8537
8538 return cons->original;
8539}
8540
8541/** returns TRUE iff constraint is belonging to transformed space */
8543 SCIP_CONS* cons /**< constraint */
8544 )
8545{
8546 assert(cons != NULL);
8547
8548 return !cons->original;
8549}
8550
8551/** returns TRUE iff roundings for variables in constraint are locked */
8553 SCIP_CONS* cons /**< constraint */
8554 )
8555{
8556 assert(cons != NULL);
8557
8558 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0);
8559}
8560
8561/** returns TRUE iff roundings for variables in constraint's negation are locked */
8563 SCIP_CONS* cons /**< constraint */
8564 )
8565{
8566 assert(cons != NULL);
8567
8568 return (cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8569}
8570
8571/** returns TRUE iff roundings for variables in constraint or in constraint's negation are locked */
8573 SCIP_CONS* cons /**< constraint */
8574 )
8575{
8576 assert(cons != NULL);
8577
8578 return (cons->nlockspos[SCIP_LOCKTYPE_MODEL] > 0 || cons->nlocksneg[SCIP_LOCKTYPE_MODEL] > 0);
8579}
8580
8581/** get number of times the roundings for variables in constraint are locked */
8583 SCIP_CONS* cons /**< constraint */
8584 )
8585{
8586 assert(cons != NULL);
8587
8588 return cons->nlockspos[SCIP_LOCKTYPE_MODEL];
8589}
8590
8591/** get number of times the roundings for variables in constraint's negation are locked */
8593 SCIP_CONS* cons /**< constraint */
8594 )
8595{
8596 assert(cons != NULL);
8597
8598 return cons->nlocksneg[SCIP_LOCKTYPE_MODEL];
8599}
8600
8601/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8603 SCIP_CONS* cons, /**< constraint */
8604 SCIP_LOCKTYPE locktype /**< variable lock type */
8605 )
8606{
8607 assert(cons != NULL);
8608 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8609
8610 return (cons->nlockspos[locktype] > 0);
8611}
8612
8613/** returns TRUE iff roundings of the given locktype for variables in constraint are locked */
8615 SCIP_CONS* cons, /**< constraint */
8616 SCIP_LOCKTYPE locktype /**< variable lock type */
8617 )
8618{
8619 assert(cons != NULL);
8620 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8621
8622 return (cons->nlocksneg[locktype] > 0);
8623}
8624
8625/** returns TRUE iff roundings of given locktype for variables in constraint or in constraint's negation are locked */
8627 SCIP_CONS* cons, /**< constraint */
8628 SCIP_LOCKTYPE locktype /**< variable lock type */
8629 )
8630{
8631 assert(cons != NULL);
8632 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8633
8634 return (cons->nlockspos[locktype] > 0 || cons->nlocksneg[locktype] > 0);
8635}
8636
8637/** get number of times the roundings of given locktype for variables in constraint are locked */
8639 SCIP_CONS* cons, /**< constraint */
8640 SCIP_LOCKTYPE locktype /**< variable lock type */
8641 )
8642{
8643 assert(cons != NULL);
8644 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8645
8646 return cons->nlockspos[locktype];
8647}
8648
8649/** get number of times the roundings of given locktype for variables in constraint's negation are locked */
8651 SCIP_CONS* cons, /**< constraint */
8652 SCIP_LOCKTYPE locktype /**< variable lock type */
8653 )
8654{
8655 assert(cons != NULL);
8656 assert((int)locktype >= 0 && (int)locktype < (int)NLOCKTYPES); /*lint !e685 !e568 !e587 !e650*/
8657
8658 return cons->nlocksneg[locktype];
8659}
8660
8661/** returns if the constraint was already added to a SCIP instance */
8663 SCIP_CONS* cons /**< constraint */
8664 )
8665{
8666 assert(cons != NULL);
8667
8668 return (cons->addarraypos >= 0);
8669}
8670
8671/** adds locks to (dis-)allow upgrading of constraint */
8673 SCIP_CONS* cons, /**< constraint to add locks */
8674 int nlocks /**< number of locks to add */
8675 )
8676{
8677 assert(cons != NULL);
8678
8679 assert(cons->nupgradelocks < (1 << 28) - nlocks); /*lint !e574*/
8680 cons->nupgradelocks += (unsigned int) nlocks;
8681}
8682
8683/** gets number of locks against upgrading the constraint, 0 means this constraint can be upgraded */
8685 SCIP_CONS* cons /**< constraint */
8686 )
8687{
8688 assert(cons != NULL);
8689
8690 return (int) cons->nupgradelocks;
8691}
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:7970
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:4323
SCIP_RETCODE SCIPconsAddLocks(SCIP_CONS *cons, SCIP_SET *set, SCIP_LOCKTYPE locktype, int nlockspos, int nlocksneg)
Definition: cons.c:7397
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:4356
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:6093
SCIP_RETCODE SCIPconssetchgUndo(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:5713
SCIP_RETCODE SCIPconsEnableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7021
static SCIP_RETCODE conssetchgEnsureAddedconssSize(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition: cons.c:5413
void SCIPconshdlrSetTrans(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSTRANS((*constrans)))
Definition: cons.c:4440
SCIP_RETCODE SCIPconshdlrSetPresol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRESOL((*conspresol)), int maxprerounds, SCIP_PRESOLTIMING presoltiming)
Definition: cons.c:4400
void SCIPconshdlrIncNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4949
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:5537
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:7139
SCIP_RETCODE SCIPconsEnable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6954
void SCIPconsCapture(SCIP_CONS *cons)
Definition: cons.c:6273
SCIP_RETCODE SCIPconsProp(SCIP_CONS *cons, SCIP_SET *set, SCIP_PROPTIMING proptiming, SCIP_RESULT *result)
Definition: cons.c:7721
static SCIP_RETCODE conssetchgCreate(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem)
Definition: cons.c:5337
SCIP_RETCODE SCIPconsPrint(SCIP_CONS *cons, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition: cons.c:6325
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:5895
void SCIPconshdlrIncNAppliedCuts(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4939
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:6795
SCIP_RETCODE SCIPconsMarkPropagate(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7149
void SCIPconshdlrSetInit(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINIT((*consinit)))
Definition: cons.c:4334
void SCIPconshdlrSetDelete(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDELETE((*consdelete)))
Definition: cons.c:4429
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:5437
SCIP_RETCODE SCIPconsDeactivate(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6919
void SCIPconshdlrSetParse(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPARSE((*consparse)))
Definition: cons.c:4539
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:4583
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:4561
SCIP_RETCODE SCIPconsDisable(SCIP_CONS *cons, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:6987
SCIP_RETCODE SCIPconsDeactive(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7901
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:4186
void SCIPconshdlrSetActive(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSACTIVE((*consactive)))
Definition: cons.c:4473
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:6435
SCIP_RETCODE SCIPconsGetNVars(SCIP_CONS *cons, SCIP_SET *set, int *nvars, SCIP_Bool *success)
Definition: cons.c:6400
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:4378
void SCIPconsSetStickingAtNode(SCIP_CONS *cons, SCIP_Bool stickingatnode)
Definition: cons.c:6841
SCIP_RETCODE SCIPconsSetSeparated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool separate)
Definition: cons.c:6642
#define checkConssArrays(conshdlr)
Definition: cons.c:247
SCIP_RETCODE SCIPconsSepalp(SCIP_CONS *cons, SCIP_SET *set, SCIP_RESULT *result)
Definition: cons.c:7637
static SCIP_RETCODE conssetchgRelease(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:5358
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:7481
SCIP_RETCODE SCIPconsActive(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7877
#define AGERESETAVG_AGELIMIT
Definition: cons.c:58
SCIP_RETCODE SCIPconsResetAge(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7296
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:7946
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:7761
void SCIPconsSetRemovable(SCIP_CONS *cons, SCIP_Bool removable)
Definition: cons.c:6830
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:4719
static SCIP_RETCODE conssetchgDelDisabledCons(SCIP_CONSSETCHG *conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set, int arraypos)
Definition: cons.c:5583
SCIP_RETCODE SCIPconsTransform(SCIP_CONS *origcons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_CONS **transcons)
Definition: cons.c:6558
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:7443
#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:5462
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:4506
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:7216
void SCIPconshdlrSetGetSignedPermsymGraph(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH((*consgetsignedpermsymgraph)))
Definition: cons.c:4595
SCIP_RETCODE SCIPconsEnablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7079
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:7931
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:7525
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:6608
SCIP_RETCODE SCIPconssetchgFree(SCIP_CONSSETCHG **conssetchg, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:5388
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:6198
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:7275
void SCIPconshdlrSetExitsol(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSEXITSOL((*consexitsol)))
Definition: cons.c:4367
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:6819
SCIP_RETCODE SCIPconsSepasol(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_RESULT *result)
Definition: cons.c:7678
SCIP_RETCODE SCIPconsFree(SCIP_CONS **cons, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: cons.c:6218
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:5508
SCIP_RETCODE SCIPconsDelete(SCIP_CONS *cons, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_REOPT *reopt)
Definition: cons.c:6498
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:7803
SCIP_RETCODE SCIPconsDisablePropagation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7109
void SCIPconshdlrSetResprop(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSRESPROP((*consresprop)))
Definition: cons.c:4462
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:6037
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:6285
void SCIPconshdlrSetInitlp(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSINITLP((*consinitlp)))
Definition: cons.c:4451
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:7337
SCIP_RETCODE SCIPconsSetPropagated(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool propagate)
Definition: cons.c:6760
SCIP_RETCODE SCIPconsDisableSeparation(SCIP_CONS *cons, SCIP_SET *set)
Definition: cons.c:7051
void SCIPconshdlrSetGetDiveBdChgs(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETDIVEBDCHGS((*consgetdivebdchgs)))
Definition: cons.c:4572
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:6468
#define AGERESETAVG_INIT
Definition: cons.c:55
SCIP_RETCODE SCIPconshdlrUnlockVars(SCIP_CONSHDLR *conshdlr, SCIP_SET *set)
Definition: cons.c:4201
SCIP_RETCODE SCIPconsSetChecked(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool check)
Definition: cons.c:6712
SCIP_RETCODE SCIPconsInitlp(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool *infeasible)
Definition: cons.c:7611
SCIP_RETCODE SCIPconsEnforelax(SCIP_CONS *cons, SCIP_SET *set, SCIP_SOL *sol, SCIP_Bool solinfeasible, SCIP_RESULT *result)
Definition: cons.c:7567
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:8010
void SCIPconshdlrSetExit(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSEXIT((*consexit)))
Definition: cons.c:4345
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:6877
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:4308
void SCIPconshdlrSetDelvars(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSDELVARS((*consdelvars)))
Definition: cons.c:4517
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:4495
SCIP_CONS * SCIPconsGetTransformed(SCIP_CONS *cons)
Definition: cons.c:6867
#define AGERESETAVG_DECAY
Definition: cons.c:57
void SCIPconshdlrSetPrint(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPRINT((*consprint)))
Definition: cons.c:4528
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:7179
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:4484
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:6364
void SCIPconsSetNamePointer(SCIP_CONS *cons, const char *name)
Definition: cons.c:6853
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:5626
SCIP_RETCODE SCIPconshdlrDelVars(SCIP_CONSHDLR *conshdlr, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: cons.c:4155
SCIP_RETCODE SCIPconsSetEnforced(SCIP_CONS *cons, SCIP_SET *set, SCIP_Bool enforce)
Definition: cons.c:6677
void SCIPconsSetModifiable(SCIP_CONS *cons, SCIP_Bool modifiable)
Definition: cons.c:6808
void SCIPconshdlrSetGetVars(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSGETVARS((*consgetvars)))
Definition: cons.c:4550
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:4389
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:5799
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:262
#define SCIP_MAXSTRLEN
Definition: def.h:283
#define SCIP_Longint
Definition: def.h:157
#define SCIP_MAXTREEDEPTH
Definition: def.h:311
#define SCIP_Bool
Definition: def.h:91
#define MIN(x, y)
Definition: def.h:238
#define SCIP_ALLOC(x)
Definition: def.h:380
#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:234
#define SCIP_CALL(x)
Definition: def.h:369
#define SCIP_CALL_FINALLY(x, y)
Definition: def.h:411
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
Definition: scip_message.c:208
int SCIPconshdlrGetNCheckConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4675
void SCIPconshdlrSetData(SCIP_CONSHDLR *conshdlr, SCIP_CONSHDLRDATA *conshdlrdata)
Definition: cons.c:4246
int SCIPconshdlrGetMaxNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4989
SCIP_Real SCIPconshdlrGetCheckTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4819
SCIP_PROPTIMING SCIPconshdlrGetPropTiming(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5269
SCIP_Bool SCIPconshdlrWasSolSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5229
SCIP_Longint SCIPconshdlrGetNCheckCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4889
SCIP_CONS ** SCIPconshdlrGetCheckConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4632
int SCIPconshdlrGetNChgSides(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5099
SCIP_Real SCIPconshdlrGetPresolTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4749
int SCIPconshdlrGetEagerFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5169
SCIP_Bool SCIPconshdlrDoesPresolve(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5189
void SCIPconshdlrSetProp(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING timingmask)
Definition: cons.c:4278
int SCIPconshdlrGetNFixedVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5009
SCIP_PRESOLTIMING SCIPconshdlrGetPresolTiming(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5291
SCIP_Real SCIPconshdlrGetEnfoLPTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4769
int SCIPconshdlrGetNPresolCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5109
SCIP_Longint SCIPconshdlrGetNDomredsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4969
int SCIPconshdlrGetSepaPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5119
SCIP_Longint SCIPconshdlrGetNCutsApplied(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4929
int SCIPconshdlrGetNChgCoefs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5089
void SCIPconshdlrSetPresolTiming(SCIP_CONSHDLR *conshdlr, SCIP_PRESOLTIMING presoltiming)
Definition: cons.c:5301
int SCIPconshdlrGetNUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4709
SCIP_CONS ** SCIPconshdlrGetEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4622
void SCIPconshdlrSetSepa(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSSEPALP((*conssepalp)), SCIP_DECL_CONSSEPASOL((*conssepasol)), int sepafreq, int sepapriority, SCIP_Bool delaysepa)
Definition: cons.c:4257
SCIP_Real SCIPconshdlrGetStrongBranchPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4809
void SCIPconshdlrSetEnforelax(SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSENFORELAX((*consenforelax)))
Definition: cons.c:4297
SCIP_Longint SCIPconshdlrGetNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4919
SCIP_Bool SCIPconshdlrSupportsSignedPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5322
SCIP_Bool SCIPconshdlrIsPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5209
SCIP_Real SCIPconshdlrGetPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4799
void SCIPconssetchgGetAddedConsData(SCIP_CONSSETCHG *conssetchg, SCIP_CONS ***conss, int *nconss)
Definition: cons.c:5612
SCIP_Real SCIPconshdlrGetEnfoPSTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4779
int SCIPconshdlrGetPropFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5159
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4655
SCIP_Longint SCIPconshdlrGetNCutoffs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4909
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4216
int SCIPconshdlrGetNEnabledConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4699
SCIP_CONS ** SCIPconshdlrGetUpdateConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4645
SCIP_Bool SCIPconshdlrIsSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5199
SCIP_Longint SCIPconshdlrGetNSepaCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4839
int SCIPconshdlrGetNDelConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5059
SCIP_DECL_SORTPTRCOMP(SCIPconshdlrCompSepa)
Definition: cons.c:1956
SCIP_Bool SCIPconshdlrWasLPSeparationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5219
SCIP_Longint SCIPconshdlrGetNChildren(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4979
SCIP_Real SCIPconshdlrGetEnfoRelaxTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4789
void SCIPconshdlrSetPropTiming(SCIP_CONSHDLR *conshdlr, SCIP_PROPTIMING proptiming)
Definition: cons.c:5279
SCIP_Bool SCIPconshdlrNeedsCons(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5179
int SCIPconshdlrGetNAggrVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5019
SCIP_Longint SCIPconshdlrGetNEnfoPSCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4859
int SCIPconshdlrGetNAddHoles(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5049
int SCIPconshdlrGetNEnfoConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4665
SCIP_Bool SCIPconshdlrIsInitialized(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5249
int SCIPconshdlrGetNUpgdConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5079
int SCIPconshdlrGetStartNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4999
SCIP_Bool SCIPconshdlrWasPropagationDelayed(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5239
int SCIPconshdlrGetNAddConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5069
SCIP_Bool SCIPconshdlrSupportsPermsymDetection(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5312
int SCIPconshdlrGetNChgBds(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5039
const char * SCIPconshdlrGetDesc(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4226
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4236
SCIP_Longint SCIPconshdlrGetNConssFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4959
int SCIPconshdlrGetNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4689
int SCIPconshdlrGetCheckPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5139
int SCIPconshdlrGetSepaFreq(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5149
SCIP_Longint SCIPconshdlrGetNPropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4879
SCIP_Longint SCIPconshdlrGetNEnfoLPCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4849
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4612
int SCIPconshdlrGetEnfoPriority(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5129
SCIP_Real SCIPconshdlrGetSetupTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4739
SCIP_Longint SCIPconshdlrGetNRespropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4899
SCIP_Real SCIPconshdlrGetSepaTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4759
SCIP_Bool SCIPconshdlrIsClonable(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5259
int SCIPconshdlrGetNChgVarTypes(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5029
SCIP_Real SCIPconshdlrGetRespropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4829
SCIP_Longint SCIPconshdlrGetNEnfoRelaxCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4869
SCIP_Bool SCIPconsIsLockedNeg(SCIP_CONS *cons)
Definition: cons.c:8562
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
Definition: cons.c:8263
void SCIPconsAddUpgradeLocks(SCIP_CONS *cons, int nlocks)
Definition: cons.c:8672
int SCIPconsGetPos(SCIP_CONS *cons)
Definition: cons.c:8243
SCIP_Bool SCIPconsIsConflict(SCIP_CONS *cons)
Definition: cons.c:8382
SCIP_Bool SCIPconsIsDynamic(SCIP_CONS *cons)
Definition: cons.c:8492
SCIP_Real SCIPconsGetAge(SCIP_CONS *cons)
Definition: cons.c:8392
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
Definition: cons.c:8253
int SCIPconsGetActiveDepth(SCIP_CONS *cons)
Definition: cons.c:8283
SCIP_Bool SCIPconsIsLockedPos(SCIP_CONS *cons)
Definition: cons.c:8552
SCIP_Bool SCIPconsIsPropagationEnabled(SCIP_CONS *cons)
Definition: cons.c:8351
SCIP_Bool SCIPconsIsInitial(SCIP_CONS *cons)
Definition: cons.c:8402
int SCIPconsGetNUpgradeLocks(SCIP_CONS *cons)
Definition: cons.c:8684
SCIP_Bool SCIPconsIsMarkedPropagate(SCIP_CONS *cons)
Definition: cons.c:8442
int SCIPconsGetNLocksTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8650
int SCIPconsGetValidDepth(SCIP_CONS *cons)
Definition: cons.c:8316
SCIP_Bool SCIPconsIsOriginal(SCIP_CONS *cons)
Definition: cons.c:8532
SCIP_Bool SCIPconsIsChecked(SCIP_CONS *cons)
Definition: cons.c:8432
SCIP_Bool SCIPconsIsDeleted(SCIP_CONS *cons)
Definition: cons.c:8362
SCIP_Bool SCIPconsIsUpdatedeactivate(SCIP_CONS *cons)
Definition: cons.c:8304
SCIP_Bool SCIPconsIsTransformed(SCIP_CONS *cons)
Definition: cons.c:8542
int SCIPconsGetNLocksPos(SCIP_CONS *cons)
Definition: cons.c:8582
SCIP_Bool SCIPconsIsLockedType(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8626
SCIP_Bool SCIPconsIsEnforced(SCIP_CONS *cons)
Definition: cons.c:8422
SCIP_Bool SCIPconsIsInProb(SCIP_CONS *cons)
Definition: cons.c:8522
SCIP_Bool SCIPconsIsGlobal(SCIP_CONS *cons)
Definition: cons.c:8462
SCIP_Bool SCIPconsIsActive(SCIP_CONS *cons)
Definition: cons.c:8294
SCIP_Bool SCIPconsIsPropagated(SCIP_CONS *cons)
Definition: cons.c:8452
SCIP_Bool SCIPconsIsLocal(SCIP_CONS *cons)
Definition: cons.c:8472
int SCIPconsGetNLocksNeg(SCIP_CONS *cons)
Definition: cons.c:8592
int SCIPconsGetNUses(SCIP_CONS *cons)
Definition: cons.c:8273
SCIP_Bool SCIPconsIsLockedTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8602
SCIP_Bool SCIPconsIsEnabled(SCIP_CONS *cons)
Definition: cons.c:8330
const char * SCIPconsGetName(SCIP_CONS *cons)
Definition: cons.c:8233
SCIP_Bool SCIPconsIsLocked(SCIP_CONS *cons)
Definition: cons.c:8572
SCIP_Bool SCIPconsIsSeparationEnabled(SCIP_CONS *cons)
Definition: cons.c:8340
SCIP_Bool SCIPconsIsLockedTypeNeg(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8614
SCIP_Bool SCIPconsIsModifiable(SCIP_CONS *cons)
Definition: cons.c:8482
SCIP_Bool SCIPconsIsAdded(SCIP_CONS *cons)
Definition: cons.c:8662
SCIP_Bool SCIPconsIsObsolete(SCIP_CONS *cons)
Definition: cons.c:8372
SCIP_Bool SCIPconsIsStickingAtNode(SCIP_CONS *cons)
Definition: cons.c:8512
int SCIPconsGetNLocksTypePos(SCIP_CONS *cons, SCIP_LOCKTYPE locktype)
Definition: cons.c:8638
SCIP_Bool SCIPconsIsSeparated(SCIP_CONS *cons)
Definition: cons.c:8412
SCIP_Bool SCIPconsIsRemovable(SCIP_CONS *cons)
Definition: cons.c:8502
#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:8117
void SCIPlinConsStatsIncTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype, int increment)
Definition: cons.c:8127
int SCIPlinConsStatsGetTypeCount(SCIP_LINCONSSTATS *linconsstats, SCIP_LINCONSTYPE linconstype)
Definition: cons.c:8104
void SCIPlinConsStatsFree(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition: cons.c:8083
void SCIPlinConsStatsReset(SCIP_LINCONSSTATS *linconsstats)
Definition: cons.c:8095
void SCIPprintLinConsStats(SCIP *scip, FILE *file, SCIP_LINCONSSTATS *linconsstats)
Definition: cons.c:8143
SCIP_RETCODE SCIPlinConsStatsCreate(SCIP *scip, SCIP_LINCONSSTATS **linconsstats)
Definition: cons.c:8070
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
Definition: var.c:18106
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:18096
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:10878
void SCIPstrCopySection(const char *str, char startchar, char endchar, char *token, int size, char **endptr)
Definition: misc.c:11036
SCIP_RETCODE SCIPskipSpace(char **s)
Definition: misc.c:10867
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:8300
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:8405
int SCIPtreeGetCurrentDepth(SCIP_TREE *tree)
Definition: tree.c:8523
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