36 #include "scip/scipdefplugins.h"
38 #include "scip/cons_indicator.h"
46 return (SCIPvarGetStatus(var) != SCIP_VARSTATUS_FIXED)
47 && (SCIPvarIsActive(var) || SCIPvarGetStatus(var) == SCIP_VARSTATUS_AGGREGATED || SCIPvarGetStatus(var) == SCIP_VARSTATUS_MULTAGGR || SCIPvarGetStatus(var) == SCIP_VARSTATUS_NEGATED);
56 SCIP_CONSHDLR* conshdlr;
57 const char * conshdlrname;
59 conshdlr = SCIPconsGetHdlr(cons);
60 assert(conshdlr != NULL);
61 conshdlrname = SCIPconshdlrGetName(conshdlr);
63 if( strcmp(conshdlrname,
"linear") == 0 )
67 else if( strcmp(conshdlrname,
"setppc") == 0 )
69 switch ( SCIPgetTypeSetppc(scip, cons) ) {
70 case SCIP_SETPPCTYPE_COVERING:
72 case SCIP_SETPPCTYPE_PACKING:
74 case SCIP_SETPPCTYPE_PARTITIONING:
80 else if( strcmp(conshdlrname,
"logicor") == 0 )
84 else if( strcmp(conshdlrname,
"knapsack") == 0 )
88 else if( strcmp(conshdlrname,
"varbound") == 0 )
92 else if( strcmp(conshdlrname,
"SOS1") == 0 )
96 else if( strcmp(conshdlrname,
"SOS2") == 0 )
100 else if( strcmp(conshdlrname,
"indicator") == 0 )
115 SCIP_CONSHDLR* conshdlr;
116 const char * conshdlrname;
121 assert(scip != NULL);
122 assert(cons != NULL);
123 conshdlr = SCIPconsGetHdlr(cons);
124 assert(conshdlr != NULL);
125 conshdlrname = SCIPconshdlrGetName(conshdlr);
127 if( strcmp(conshdlrname,
"linear") == 0 )
129 return SCIPgetRhsLinear(scip, cons);
131 else if( strcmp(conshdlrname,
"setppc") == 0 )
133 switch ( SCIPgetTypeSetppc(scip, cons) ) {
134 case SCIP_SETPPCTYPE_PARTITIONING:
135 case SCIP_SETPPCTYPE_PACKING:
138 nconsvars = SCIPgetNVarsSetppc(scip, cons);
139 consvars = SCIPgetVarsSetppc(scip, cons);
141 for( i = 0; i < nconsvars; i++ )
143 if( SCIPvarIsNegated(consvars[i]) )
149 case SCIP_SETPPCTYPE_COVERING:
150 return SCIPinfinity(scip);
153 else if( strcmp(conshdlrname,
"logicor") == 0 )
155 return SCIPinfinity(scip);
157 else if( strcmp(conshdlrname,
"knapsack") == 0 )
159 rhs = SCIPgetCapacityKnapsack(scip, cons);
162 w = SCIPgetWeightsKnapsack(scip, cons);
163 consvars = SCIPgetVarsKnapsack(scip, cons);
164 nconsvars = SCIPgetNVarsKnapsack(scip, cons);
166 for( i = 0; i < nconsvars; i++ )
168 if( SCIPvarIsNegated(consvars[i]) )
174 else if( strcmp(conshdlrname,
"varbound") == 0 )
176 rhs = SCIPgetRhsVarbound(scip, cons);
178 if( SCIPvarIsNegated(SCIPgetVarVarbound(scip, cons)) && !SCIPisInfinity(scip, rhs) )
181 if( SCIPvarIsNegated(SCIPgetVbdvarVarbound(scip, cons)) && !SCIPisInfinity(scip, rhs) )
182 rhs -= SCIPgetVbdcoefVarbound(scip, cons);
186 else if( strcmp(conshdlrname,
"SOS1") == 0 )
188 SCIPdebugMessage(
"WARNING: SOS1 NOT IMPLEMENTED\n");
190 else if( strcmp(conshdlrname,
"SOS2") == 0 )
192 SCIPdebugMessage(
"WARNING: SOS2 NOT IMPLEMENTED\n");
194 else if( strcmp(conshdlrname,
"indicator") == 0 )
200 SCIPdebugMessage(
"WARNING: NOT IMPLEMENTED");
202 return -SCIPinfinity(scip);
211 SCIP_CONSHDLR* conshdlr;
212 const char * conshdlrname;
219 assert(scip != NULL);
220 assert(cons != NULL);
221 conshdlr = SCIPconsGetHdlr(cons);
222 assert(conshdlr != NULL);
223 conshdlrname = SCIPconshdlrGetName(conshdlr);
225 if( strcmp(conshdlrname,
"linear") == 0 )
227 return SCIPgetLhsLinear(scip, cons);
229 else if( strcmp(conshdlrname,
"setppc") == 0 )
231 switch ( SCIPgetTypeSetppc(scip, cons) ) {
232 case SCIP_SETPPCTYPE_PARTITIONING:
233 case SCIP_SETPPCTYPE_COVERING:
236 nconsvars = SCIPgetNVarsSetppc(scip, cons);
237 consvars = SCIPgetVarsSetppc(scip, cons);
239 for( i = 0; i < nconsvars; i++ )
241 if( SCIPvarIsNegated(consvars[i]) )
247 case SCIP_SETPPCTYPE_PACKING:
248 return -SCIPinfinity(scip);
251 else if( strcmp(conshdlrname,
"logicor") == 0 )
255 nconsvars = SCIPgetNVarsLogicor(scip, cons);
256 consvars = SCIPgetVarsLogicor(scip, cons);
258 for( i = 0; i < nconsvars; i++ )
260 if( SCIPvarIsNegated(consvars[i]) )
266 else if( strcmp(conshdlrname,
"knapsack") == 0 )
268 return -SCIPinfinity(scip);
270 else if( strcmp(conshdlrname,
"varbound") == 0 )
272 lhs = SCIPgetLhsVarbound(scip, cons);
274 if( SCIPvarIsNegated(SCIPgetVarVarbound(scip, cons)) && !SCIPisInfinity(scip, -lhs) )
277 if( SCIPvarIsNegated(SCIPgetVbdvarVarbound(scip, cons)) && !SCIPisInfinity(scip, -lhs) )
278 lhs -= SCIPgetVbdcoefVarbound(scip, cons);
282 else if( strcmp(conshdlrname,
"SOS1") == 0 )
284 SCIPdebugMessage(
"WARNING: SOS1 NOT IMPLEMENTED\n");
286 else if( strcmp(conshdlrname,
"SOS2") == 0 )
288 SCIPdebugMessage(
"WARNING: SOS2 NOT IMPLEMENTED\n");
290 else if( strcmp(conshdlrname,
"indicator") == 0 )
292 return -SCIPinfinity(scip);
296 SCIPdebugMessage(
"WARNING: NOT IMPLEMENTED");
298 return SCIPinfinity(scip);
308 SCIP_CONSHDLR* conshdlr;
309 const char * conshdlrname;
311 assert(scip != NULL);
312 assert(cons != NULL);
313 conshdlr = SCIPconsGetHdlr(cons);
314 assert(conshdlr != NULL);
315 conshdlrname = SCIPconshdlrGetName(conshdlr);
317 if( strcmp(conshdlrname,
"linear") == 0 )
319 return SCIPgetDualfarkasLinear(scip, cons);
321 else if( strcmp(conshdlrname,
"setppc") == 0 )
323 return SCIPgetDualfarkasSetppc(scip, cons);
325 else if( strcmp(conshdlrname,
"logicor") == 0 )
327 return SCIPgetDualfarkasLogicor(scip, cons);
329 else if( strcmp(conshdlrname,
"knapsack") == 0 )
331 return SCIPgetDualfarkasKnapsack(scip, cons);
333 else if( strcmp(conshdlrname,
"varbound") == 0 )
335 return SCIPgetDualfarkasVarbound(scip, cons);
337 else if( strcmp(conshdlrname,
"SOS1") == 0 )
339 SCIPdebugMessage(
"WARNING: SOS1 NOT IMPLEMENTED\n");
341 else if( strcmp(conshdlrname,
"SOS2") == 0 )
343 SCIPdebugMessage(
"WARNING: SOS2 NOT IMPLEMENTED\n");
345 else if( strcmp(conshdlrname,
"origbranch") == 0 )
347 SCIPdebugMessage(
"origbranch: return dualfarkas 0\n");
350 else if( strcmp(conshdlrname,
"masterbranch") == 0 )
352 SCIPdebugMessage(
"masterbranch: return dualsol 0\n");
355 else if( strcmp(conshdlrname,
"indicator") == 0 )
357 SCIPdebugMessage(
"WARNING: indicator conss NOT IMPLEMENTED");
361 SCIPdebugMessage(
"WARNING: NOT IMPLEMENTED");
363 return SCIPinfinity(scip);
373 SCIP_CONSHDLR* conshdlr;
374 const char * conshdlrname;
376 assert(scip != NULL);
377 assert(cons != NULL);
378 conshdlr = SCIPconsGetHdlr(cons);
379 assert(conshdlr != NULL);
380 conshdlrname = SCIPconshdlrGetName(conshdlr);
382 if( strcmp(conshdlrname,
"linear") == 0 )
384 return SCIPgetDualsolLinear(scip, cons);
386 else if( strcmp(conshdlrname,
"setppc") == 0 )
388 return SCIPgetDualsolSetppc(scip, cons);
390 else if( strcmp(conshdlrname,
"logicor") == 0 )
392 return SCIPgetDualsolLogicor(scip, cons);
394 else if( strcmp(conshdlrname,
"knapsack") == 0 )
396 return SCIPgetDualsolKnapsack(scip, cons);
398 else if( strcmp(conshdlrname,
"varbound") == 0 )
400 return SCIPgetDualsolVarbound(scip, cons);
402 else if( strcmp(conshdlrname,
"SOS1") == 0 )
404 SCIPdebugMessage(
"WARNING: SOS1 NOT IMPLEMENTED\n");
406 else if( strcmp(conshdlrname,
"SOS2") == 0 )
408 SCIPdebugMessage(
"WARNING: SOS2 NOT IMPLEMENTED\n");
410 else if( strcmp(conshdlrname,
"origbranch") == 0 )
412 SCIPdebugMessage(
"origbranch: return Dualsol 0\n");
415 else if( strcmp(conshdlrname,
"masterbranch") == 0 )
417 SCIPdebugMessage(
"masterbranch: return dualsol 0\n");
420 else if( strcmp(conshdlrname,
"indicator") == 0 )
422 SCIPdebugMessage(
"WARNING: indicator conss NOT IMPLEMENTED");
426 SCIPdebugMessage(
"WARNING: NOT IMPLEMENTED");
428 return SCIPinfinity(scip);
439 SCIP_CONSHDLR* conshdlr;
440 const char * conshdlrname;
442 assert(scip != NULL);
443 assert(cons != NULL);
444 conshdlr = SCIPconsGetHdlr(cons);
445 assert(conshdlr != NULL);
446 conshdlrname = SCIPconshdlrGetName(conshdlr);
450 if( strcmp(conshdlrname,
"linear") == 0 )
452 return SCIPgetNVarsLinear(scip, cons);
454 else if( strcmp(conshdlrname,
"setppc") == 0 )
456 return SCIPgetNVarsSetppc(scip, cons);
458 else if( strcmp(conshdlrname,
"logicor") == 0 )
460 return SCIPgetNVarsLogicor(scip, cons);
462 else if( strcmp(conshdlrname,
"knapsack") == 0 )
464 return SCIPgetNVarsKnapsack(scip, cons);
466 else if( strcmp(conshdlrname,
"varbound") == 0 )
470 else if( strcmp(conshdlrname,
"indicator") == 0 )
474 else if( strcmp(conshdlrname,
"SOS1") == 0 )
476 return SCIPgetNVarsSOS1(scip, cons);
478 else if( strcmp(conshdlrname,
"SOS2") == 0 )
480 return SCIPgetNVarsSOS2(scip, cons);
484 SCIPdebugMessage(
"WARNING: NOT IMPLEMENTED <%s>\n", conshdlrname);
498 SCIP_CONSHDLR* conshdlr;
499 const char * conshdlrname;
502 assert(scip != NULL);
503 assert(cons != NULL);
504 assert(vars != NULL);
507 conshdlr = SCIPconsGetHdlr(cons);
508 assert(conshdlr != NULL);
509 conshdlrname = SCIPconshdlrGetName(conshdlr);
511 if( strcmp(conshdlrname,
"linear") == 0 )
513 if( nvars < SCIPgetNVarsLinear(scip, cons) )
514 return SCIP_INVALIDDATA;
516 BMScopyMemoryArray(vars, SCIPgetVarsLinear(scip, cons), SCIPgetNVarsLinear(scip, cons));
518 else if( strcmp(conshdlrname,
"setppc") == 0 )
523 consvars = SCIPgetVarsSetppc(scip, cons);
524 nconsvars = SCIPgetNVarsSetppc(scip, cons);
526 if( nvars < nconsvars )
527 return SCIP_INVALIDDATA;
529 for( i = 0; i < nconsvars; i++ )
530 if( !SCIPvarIsNegated(consvars[i]) )
531 vars[i] = consvars[i];
533 vars[i] = SCIPvarGetNegatedVar(consvars[i]);
535 else if( strcmp(conshdlrname,
"logicor") == 0 )
540 consvars = SCIPgetVarsLogicor(scip, cons);
541 nconsvars = SCIPgetNVarsLogicor(scip, cons);
543 if( nvars < nconsvars )
544 return SCIP_INVALIDDATA;
546 for( i = 0; i < nconsvars; i++ )
547 if( !SCIPvarIsNegated(consvars[i]) )
548 vars[i] = consvars[i];
550 vars[i] = SCIPvarGetNegatedVar(consvars[i]);
552 else if( strcmp(conshdlrname,
"knapsack") == 0 )
557 consvars = SCIPgetVarsKnapsack(scip, cons);
558 nconsvars = SCIPgetNVarsKnapsack(scip, cons);
560 if( nvars < nconsvars )
561 return SCIP_INVALIDDATA;
563 for( i = 0; i < nconsvars; i++ )
564 if( !SCIPvarIsNegated(consvars[i]) )
565 vars[i] = consvars[i];
567 vars[i] = SCIPvarGetNegatedVar(consvars[i]);
569 else if( strcmp(conshdlrname,
"varbound") == 0 )
572 return SCIP_INVALIDDATA;
574 if( !SCIPvarIsNegated(SCIPgetVarVarbound(scip, cons)) )
575 vars[0] = SCIPgetVarVarbound(scip, cons);
577 vars[0] = SCIPvarGetNegatedVar(SCIPgetVarVarbound(scip, cons));
579 if( !SCIPvarIsNegated(SCIPgetVbdvarVarbound(scip, cons)) )
580 vars[1] = SCIPgetVbdvarVarbound(scip, cons);
582 vars[1] = SCIPvarGetNegatedVar(SCIPgetVbdvarVarbound(scip, cons));
584 else if( strcmp(conshdlrname,
"SOS1") == 0 )
586 if( nvars < SCIPgetNVarsSOS1(scip, cons) )
587 return SCIP_INVALIDDATA;
589 BMScopyMemoryArray(vars, SCIPgetVarsSOS1(scip, cons), nvars);
591 else if( strcmp(conshdlrname,
"SOS2") == 0 )
593 if( nvars < SCIPgetNVarsSOS2(scip, cons) )
594 return SCIP_INVALIDDATA;
596 BMScopyMemoryArray(vars, SCIPgetVarsSOS2(scip, cons), nvars);
598 else if( strcmp(conshdlrname,
"indicator") == 0 )
601 return SCIP_INVALIDDATA;
606 vars[0] = SCIPgetSlackVarIndicator(cons);
607 vars[1] = SCIPgetBinaryVarIndicator(cons);
611 SCIPwarningMessage(scip,
"WARNING: NOT IMPLEMENTED <%s>\n", conshdlrname);
628 SCIP_CONSHDLR* conshdlr;
629 const char* conshdlrname;
633 assert(scip != NULL);
634 assert(cons != NULL);
635 assert(vals != NULL);
638 conshdlr = SCIPconsGetHdlr(cons);
639 assert(conshdlr != NULL);
640 conshdlrname = SCIPconshdlrGetName(conshdlr);
642 if( strcmp(conshdlrname,
"linear") == 0 )
644 nvars = SCIPgetNVarsLinear(scip, cons);
646 return SCIP_INVALIDDATA;
648 BMScopyMemoryArray(vals, SCIPgetValsLinear(scip, cons), nvars);
650 else if( strcmp(conshdlrname,
"setppc") == 0 )
653 vars = SCIPgetVarsSetppc(scip, cons);
654 nvars = SCIPgetNVarsSetppc(scip, cons);
656 return SCIP_INVALIDDATA;
658 for( i = 0; i < nvals; i++ )
659 if( !SCIPvarIsNegated(vars[i]) )
664 else if( strcmp(conshdlrname,
"logicor") == 0 )
667 vars = SCIPgetVarsLogicor(scip, cons);
668 nvars = SCIPgetNVarsLogicor(scip, cons);
670 return SCIP_INVALIDDATA;
672 for( i = 0; i < nvals; i++ )
674 if( !SCIPvarIsNegated(vars[i]) )
680 else if( strcmp(conshdlrname,
"knapsack") == 0 )
685 SCIP_Longint * w = SCIPgetWeightsKnapsack(scip, cons);
686 vars = SCIPgetVarsKnapsack(scip, cons);
687 nvars = SCIPgetNVarsKnapsack(scip, cons);
689 return SCIP_INVALIDDATA;
691 for( i = 0; i < nvars; i++ )
693 if( !SCIPvarIsNegated(vars[i]) )
699 else if( strcmp(conshdlrname,
"varbound") == 0 )
703 return SCIP_INVALIDDATA;
705 if( !SCIPvarIsNegated(SCIPgetVarVarbound(scip, cons)) )
710 if( !SCIPvarIsNegated(SCIPgetVbdvarVarbound(scip, cons)) )
711 vals[1] = SCIPgetVbdcoefVarbound(scip, cons);
713 vals[1] = -SCIPgetVbdcoefVarbound(scip, cons);
715 else if( strcmp(conshdlrname,
"SOS1") == 0 )
718 SCIPerrorMessage(
"WARNING: SOS1 NOT IMPLEMENTED\n");
720 else if( strcmp(conshdlrname,
"SOS2") == 0 )
723 SCIPdebugMessage(
"WARNING: SOS2 NOT IMPLEMENTED\n");
725 else if( strcmp(conshdlrname,
"indicator") == 0 )
728 return SCIP_INVALIDDATA;
734 vals[1] = SCIPvarGetUbGlobal( SCIPgetSlackVarIndicator(cons) );
738 SCIPdebugMessage(
"WARNING: UNKNOWN NOT IMPLEMENTED: %s\n", conshdlrname);
752 assert(scip != NULL);
758 return !(SCIPisEQ(scip, lhs, rhs) || SCIPisInfinity(scip, -lhs) || SCIPisInfinity(scip, rhs) );
766 SCIP_SETPPCTYPE* setppctype
774 SCIP_Bool relevant = TRUE;
775 assert(scip != NULL);
776 assert(cons != NULL);
777 assert(setppctype != NULL);
779 *setppctype = SCIP_SETPPCTYPE_PACKING;
780 SCIPdebugMessage(
"cons %s is ", SCIPconsGetName(cons));
784 SCIPdebugPrintf(
"setcov, part or logicor.\n");
792 SCIP_CALL_ABORT( SCIPallocBufferArray(scip, &vars, nvars) );
793 SCIP_CALL_ABORT( SCIPallocBufferArray(scip, &vals, nvars) );
799 for( i = 0; i < nvars && relevant; ++i )
801 assert(vars != NULL);
802 assert(vals != NULL);
804 if( !SCIPvarIsBinary(vars[i]) )
806 SCIPdebugPrintf(
"(%s is not integral) ", SCIPvarGetName(vars[i]) );
809 if( !SCIPisEQ(scip, vals[i], 1.0) )
811 SCIPdebugPrintf(
"(coeff for var %s is %.2f != 1.0) ", SCIPvarGetName(vars[i]), vals[i] );
820 SCIPdebugPrintf(
"(lhs %.2f, rhs %.2f)", lhs, rhs);
822 if( SCIPisEQ(scip, lhs, 1.0) && SCIPisEQ(scip, rhs, 1.0) )
824 *setppctype = SCIP_SETPPCTYPE_PARTITIONING;
826 else if( SCIPisEQ(scip, lhs, 1.0) && SCIPisGE(scip, rhs, nvars*1.0) )
828 *setppctype = SCIP_SETPPCTYPE_COVERING;
830 else if( SCIPisLE(scip, lhs, 0.0) && SCIPisEQ(scip, rhs, 1.0) )
832 *setppctype = SCIP_SETPPCTYPE_PACKING;
841 SCIPfreeBufferArrayNull(scip, &vals);
842 SCIPfreeBufferArrayNull(scip, &vars);
844 SCIPdebugPrintf(
"%s master\n", relevant ?
"in" :
"not in");
859 SCIP_Bool relevant = TRUE;
860 assert(scip != NULL);
861 assert(cons != NULL);
863 SCIPdebugMessage(
"cons %s is ", SCIPconsGetName(cons));
874 SCIP_CALL_ABORT( SCIPallocBufferArray(scip, &vars, nvars) );
875 SCIP_CALL_ABORT( SCIPallocBufferArray(scip, &vals, nvars) );
881 for( i = 0; i < nvars && relevant; ++i )
883 assert(vars != NULL);
884 assert(vals != NULL);
891 if( !SCIPisEQ(scip, vals[i], 1.0) )
893 SCIPdebugPrintf(
"(coeff for var %s is %.2f != 1.0) ", SCIPvarGetName(vars[i]), vals[i] );
902 SCIPdebugPrintf(
"(lhs %.2f, rhs %.2f)", lhs, rhs);
904 if(! SCIPisFeasEQ(scip, lhs, rhs) )
911 SCIPfreeBufferArrayNull(scip, &vals);
912 SCIPfreeBufferArrayNull(scip, &vars);
914 SCIPdebugPrintf(
"%s master\n", relevant ?
"in" :
"not in");
925 assert(scip != NULL);
926 return (SCIPgetCurrentNode(scip) == SCIPgetRootNode(scip));