Skip to content

Commit 10a5add

Browse files
Merge branch '3927-fix-presolver-milp-applies-tolerances-in-exact-mode-2' into 'master'
Correct violation message for "Presolver milp applies tolerances in exact mode" See merge request integer/scip!3873
2 parents ec1ecce + 4f9c567 commit 10a5add

File tree

4 files changed

+61
-71
lines changed

4 files changed

+61
-71
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ Fixed bugs
275275
to be stable around shortly representable numbers, and a numerical tolerance for comparing cutting plane efficacy for the aggregation
276276
separator is introduced.
277277
- accept fractional continuous implied integral variables in heuristic completesol
278+
- invalidate activity with contradicting infinity contributions
278279

279280
Miscellaneous
280281
-------------

src/scip/cons_exactlinear.c

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -978,16 +978,18 @@ SCIP_RETCODE consPrintConsSol(
978978

979979
if( sol != NULL )
980980
{
981-
if( !useexactsol )
982-
SCIPinfoMessage(scip, file, " (%+.9g)", SCIPgetSolVal(scip, sol, consdata->vars[v]));
983-
else
981+
SCIPinfoMessage(scip, file, " (");
982+
if( useexactsol )
984983
{
985984
SCIP_RATIONAL* tmp;
986985
SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(scip), &tmp) );
987986
SCIPgetSolValExact(scip, sol, consdata->vars[v], tmp);
988987
SCIPrationalMessage(SCIPgetMessagehdlr(scip), file, tmp);
989988
SCIPrationalFreeBuffer(SCIPbuffer(scip), &tmp);
990989
}
990+
else
991+
SCIPinfoMessage(scip, file, "%+.9g", SCIPgetSolVal(scip, sol, consdata->vars[v]));
992+
SCIPinfoMessage(scip, file, ")");
991993
}
992994
}
993995
}
@@ -1084,38 +1086,32 @@ void consdataComputePseudoActivity(
10841086

10851087
for( i = consdata->nvars - 1; i >= 0; --i )
10861088
{
1089+
bound = SCIPvarGetBestBoundLocalExact(consdata->vars[i]);
10871090
val = consdata->vals[i];
1088-
bound = (SCIPvarGetBestBoundType(consdata->vars[i]) == SCIP_BOUNDTYPE_LOWER) ? SCIPvarGetLbLocalExact(consdata->vars[i]) : SCIPvarGetUbLocalExact(consdata->vars[i]);
1091+
assert(!SCIPrationalIsZero(val));
10891092

1090-
if( SCIPrationalIsInfinity(bound) )
1093+
if( SCIPrationalIsNegInfinity(bound) )
10911094
{
1092-
if( SCIPrationalIsPositive(val) )
1093-
pseudoactivityposinf++;
1095+
if( SCIPrationalIsNegative(val) )
1096+
++pseudoactivityposinf;
10941097
else
1095-
pseudoactivityneginf++;
1098+
++pseudoactivityneginf;
10961099
}
1097-
else
1100+
else if( SCIPrationalIsInfinity(bound) )
10981101
{
1099-
if( SCIPrationalIsNegInfinity(bound) )
1100-
{
1101-
if( SCIPrationalIsPositive(val) )
1102-
pseudoactivityneginf++;
1103-
else
1104-
pseudoactivityposinf++;
1105-
}
1102+
if( SCIPrationalIsNegative(val) )
1103+
++pseudoactivityneginf;
11061104
else
1107-
{
1108-
SCIPrationalAddProd(pseudoactivity, val, bound);
1109-
}
1105+
++pseudoactivityposinf;
11101106
}
1107+
else
1108+
SCIPrationalAddProd(pseudoactivity, val, bound);
11111109
}
11121110

1113-
if( pseudoactivityneginf > 0 && pseudoactivityposinf > 0 )
1114-
/** @todo introduce a rational equivalent of SCIP_INVALID (maybe an additional flag in SCIP_RATIONAL) */
1115-
return;
1116-
else if( pseudoactivityneginf > 0 )
1111+
/* set pseudo activity to infeasible infinity for contradicting contributions */
1112+
if( pseudoactivityneginf > 0 && ( pseudoactivityposinf == 0 || !SCIPrationalIsNegInfinity(consdata->lhs) ) )
11171113
SCIPrationalSetNegInfinity(pseudoactivity);
1118-
else if( pseudoactivityposinf > 0 )
1114+
else if( pseudoactivityposinf > 0 && ( pseudoactivityneginf == 0 || !SCIPrationalIsInfinity(consdata->rhs) ) )
11191115
SCIPrationalSetInfinity(pseudoactivity);
11201116
}
11211117

@@ -2800,10 +2796,8 @@ void consdataGetActivity(
28002796
else
28012797
SCIPrationalSetReal(solval, SCIPgetSolVal(scip, sol, consdata->vars[v]));
28022798

2803-
if( SCIPrationalIsNegative(consdata->vals[v]) )
2804-
negsign = TRUE;
2805-
else
2806-
negsign = FALSE;
2799+
assert(!SCIPrationalIsZero(consdata->vals[v]));
2800+
negsign = SCIPrationalIsNegative(consdata->vals[v]);
28072801

28082802
if( (SCIPrationalIsInfinity(solval) && !negsign) || (SCIPrationalIsNegInfinity(solval) && negsign) )
28092803
++nposinf;
@@ -2816,20 +2810,17 @@ void consdataGetActivity(
28162810
}
28172811
assert(nneginf >= 0 && nposinf >= 0);
28182812

2819-
SCIPrationalFreeBuffer(SCIPbuffer(scip), &solval);
2820-
28212813
SCIPdebugMsg(scip, "activity of linear constraint: %.15g, %d positive infinity values, %d negative infinity values \n", SCIPrationalGetReal(activity), nposinf, nneginf);
28222814

2823-
/* check for amount of infinity values and correct the activity */
2824-
if( nposinf > 0 && nneginf > 0 )
2825-
/** @todo introduce a rational equivalent of SCIP_INVALID (maybe an additional flag in SCIP_RATIONAL) */
2826-
return;
2827-
else if( nposinf > 0 )
2828-
SCIPrationalSetInfinity(activity);
2829-
else if( nneginf > 0 )
2815+
/* set activity to infeasible infinity for contradicting contributions */
2816+
if( nneginf > 0 && ( nposinf == 0 || !SCIPrationalIsNegInfinity(consdata->lhs) ) )
28302817
SCIPrationalSetNegInfinity(activity);
2818+
else if( nposinf > 0 && ( nneginf == 0 || !SCIPrationalIsInfinity(consdata->rhs) ) )
2819+
SCIPrationalSetInfinity(activity);
28312820

28322821
SCIPrationalDebugMessage("corrected activity of linear constraint: %q\n", activity);
2822+
2823+
SCIPrationalFreeBuffer(SCIPbuffer(scip), &solval);
28332824
}
28342825
}
28352826

@@ -5708,20 +5699,20 @@ SCIP_DECL_CONSCHECK(consCheckExactLinear)
57085699
SCIP_CALL( consPrintConsSol(scip, conss[c], sol, checkexact, NULL ) );
57095700
SCIPinfoMessage(scip, NULL, ";\n");
57105701

5711-
if( SCIPrationalIsAbsInfinity(activity) ) /*lint !e777*/
5712-
SCIPinfoMessage(scip, NULL, "activity invalid due to positive and negative infinity contributions\n");
5702+
if( SCIPrationalIsAbsInfinity(activity) )
5703+
SCIPinfoMessage(scip, NULL, "activity invalid due to infinity contributions\n");
57135704
else if( SCIPrationalIsLT(activity, consdata->lhs) )
57145705
{
57155706
SCIPrationalDiff(activity, consdata->lhs, activity);
57165707
SCIPinfoMessage(scip, NULL, "violation: left hand side is violated by ");
5717-
SCIPrationalPrint(activity);
5708+
SCIPrationalMessage(SCIPgetMessagehdlr(scip), NULL, activity);
57185709
SCIPinfoMessage(scip, NULL, "\n");
57195710
}
57205711
else if( SCIPrationalIsGT(activity, consdata->rhs) )
57215712
{
57225713
SCIPrationalDiff(activity, activity, consdata->rhs);
57235714
SCIPinfoMessage(scip, NULL, "violation: right hand side is violated by ");
5724-
SCIPrationalPrint(activity);
5715+
SCIPrationalMessage(SCIPgetMessagehdlr(scip), NULL, activity);
57255716
SCIPinfoMessage(scip, NULL, "\n");
57265717
}
57275718

src/scip/cons_linear.c

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,29 +1268,29 @@ SCIP_Real consdataComputePseudoActivity(
12681268

12691269
for( i = consdata->nvars - 1; i >= 0; --i )
12701270
{
1271+
bound = SCIPvarGetBestBoundLocal(consdata->vars[i]);
12711272
val = consdata->vals[i];
1272-
bound = (SCIPvarGetBestBoundType(consdata->vars[i]) == SCIP_BOUNDTYPE_LOWER) ? SCIPvarGetLbLocal(consdata->vars[i]) : SCIPvarGetUbLocal(consdata->vars[i]);
1273-
if( SCIPisInfinity(scip, bound) )
1273+
assert(!SCIPisZero(scip, val));
1274+
1275+
if( SCIPisInfinity(scip, -bound) )
12741276
{
1275-
if( val > 0.0 )
1276-
pseudoactivityposinf++;
1277+
if( val < 0.0 )
1278+
++pseudoactivityposinf;
12771279
else
1278-
pseudoactivityneginf++;
1280+
++pseudoactivityneginf;
12791281
}
1280-
else
1282+
else if( SCIPisInfinity(scip, bound) )
12811283
{
1282-
if( SCIPisInfinity(scip, -bound) )
1283-
{
1284-
if( val > 0.0 )
1285-
pseudoactivityneginf++;
1286-
else
1287-
pseudoactivityposinf++;
1288-
}
1284+
if( val < 0.0 )
1285+
++pseudoactivityneginf;
12891286
else
1290-
pseudoactivity += val * bound;
1287+
++pseudoactivityposinf;
12911288
}
1289+
else
1290+
pseudoactivity += val * bound;
12921291
}
12931292

1293+
/* invalidate pseudo activity for contradicting contributions */
12941294
if( pseudoactivityneginf > 0 && pseudoactivityposinf > 0 )
12951295
return SCIP_INVALID;
12961296
else if( pseudoactivityneginf > 0 )
@@ -3045,10 +3045,8 @@ SCIP_Real consdataGetActivity(
30453045
{
30463046
solval = SCIPgetSolVal(scip, sol, consdata->vars[v]);
30473047

3048-
if( consdata->vals[v] < 0 )
3049-
negsign = TRUE;
3050-
else
3051-
negsign = FALSE;
3048+
assert(!SCIPisZero(scip, consdata->vals[v]));
3049+
negsign = consdata->vals[v] < 0.0;
30523050

30533051
if( (SCIPisInfinity(scip, solval) && !negsign) || (SCIPisInfinity(scip, -solval) && negsign) )
30543052
++nposinf;
@@ -3061,13 +3059,13 @@ SCIP_Real consdataGetActivity(
30613059

30623060
SCIPdebugMsg(scip, "activity of linear constraint: %.15g, %d positive infinity values, %d negative infinity values \n", activity, nposinf, nneginf);
30633061

3064-
/* check for amount of infinity values and correct the activity */
3062+
/* invalidate activity for contradicting contributions */
30653063
if( nposinf > 0 && nneginf > 0 )
3066-
activity = (consdata->rhs + consdata->lhs) / 2;
3067-
else if( nposinf > 0 )
3068-
activity = SCIPinfinity(scip);
3064+
activity = SCIP_INVALID;
30693065
else if( nneginf > 0 )
30703066
activity = -SCIPinfinity(scip);
3067+
else if( nposinf > 0 )
3068+
activity = SCIPinfinity(scip);
30713069

30723070
SCIPdebugMsg(scip, "corrected activity of linear constraint: %.15g\n", activity);
30733071
}
@@ -16206,8 +16204,8 @@ SCIP_DECL_CONSCHECK(consCheckLinear)
1620616204
SCIP_CALL( consPrintConsSol(scip, conss[c], sol, NULL ) );
1620716205
SCIPinfoMessage(scip, NULL, ";\n");
1620816206

16209-
if( activity == SCIP_INVALID ) /*lint !e777*/
16210-
SCIPinfoMessage(scip, NULL, "activity invalid due to positive and negative infinity contributions\n");
16207+
if( activity == SCIP_INVALID || SCIPisInfinity(scip, ABS(activity)) ) /*lint !e777*/
16208+
SCIPinfoMessage(scip, NULL, "activity invalid due to infinity contributions\n");
1621116209
else if( SCIPisFeasLT(scip, activity, consdata->lhs) )
1621216210
SCIPinfoMessage(scip, NULL, "violation: left hand side is violated by %.15g\n", consdata->lhs - activity);
1621316211
else if( SCIPisFeasGT(scip, activity, consdata->rhs) )

src/scip/var.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24384,7 +24384,7 @@ SCIP_RATIONAL* SCIPvarGetBestBoundGlobalExact(
2438424384
assert(var->exactdata->glbdom.ub != NULL);
2438524385
assert(var->exactdata->obj != NULL);
2438624386

24387-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24387+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2438824388
return var->exactdata->glbdom.lb;
2438924389
else
2439024390
return var->exactdata->glbdom.ub;
@@ -24414,7 +24414,7 @@ SCIP_RATIONAL* SCIPvarGetWorstBoundGlobalExact(
2441424414
assert(var->exactdata->glbdom.ub != NULL);
2441524415
assert(var->exactdata->obj != NULL);
2441624416

24417-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24417+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2441824418
return var->exactdata->glbdom.ub;
2441924419
else
2442024420
return var->exactdata->glbdom.lb;
@@ -24522,7 +24522,7 @@ SCIP_RATIONAL* SCIPvarGetBestBoundLocalExact(
2452224522
assert(var->exactdata->locdom.ub != NULL);
2452324523
assert(var->exactdata->obj != NULL);
2452424524

24525-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24525+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2452624526
return var->exactdata->locdom.lb;
2452724527
else
2452824528
return var->exactdata->locdom.ub;
@@ -24552,7 +24552,7 @@ SCIP_RATIONAL* SCIPvarGetWorstBoundLocalExact(
2455224552
assert(var->exactdata->locdom.ub != NULL);
2455324553
assert(var->exactdata->obj != NULL);
2455424554

24555-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24555+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2455624556
return var->exactdata->locdom.ub;
2455724557
else
2455824558
return var->exactdata->locdom.lb;
@@ -24580,7 +24580,7 @@ SCIP_BOUNDTYPE SCIPvarGetBestBoundTypeExact(
2458024580
assert(var->exactdata != NULL);
2458124581
assert(var->exactdata->obj != NULL);
2458224582

24583-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24583+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2458424584
return SCIP_BOUNDTYPE_LOWER;
2458524585
else
2458624586
return SCIP_BOUNDTYPE_UPPER;
@@ -24608,7 +24608,7 @@ SCIP_BOUNDTYPE SCIPvarGetWorstBoundTypeExact(
2460824608
assert(var->exactdata != NULL);
2460924609
assert(var->exactdata->obj != NULL);
2461024610

24611-
if( SCIPrationalIsPositive(var->exactdata->obj) || SCIPrationalIsZero(var->exactdata->obj) )
24611+
if( !SCIPrationalIsNegative(var->exactdata->obj) )
2461224612
return SCIP_BOUNDTYPE_UPPER;
2461324613
else
2461424614
return SCIP_BOUNDTYPE_LOWER;

0 commit comments

Comments
 (0)