Skip to content

Commit 431df1a

Browse files
committed
Merge remote-tracking branch 'origin/v10-minor'
2 parents 16defaa + 7a011cc commit 431df1a

File tree

10 files changed

+100
-61
lines changed

10 files changed

+100
-61
lines changed

check/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ if(SCIP_WITH_EXACTSOLVE)
345345
if(SCIP_WITH_ZIMPL)
346346
list(APPEND
347347
instances_MIPEX
348-
"instances/MIPEX/misc03.zpl\;3360"
348+
# instance misc03p1 appended later
349349
"instances/MIPEX/rgn.zpl\;2054999981/25000000"
350350
"instances/MIPEX/stein27.zpl\;18"
351351
)
@@ -1349,6 +1349,15 @@ if(SCIP_WITH_EXACTSOLVE)
13491349
endforeach(extension)
13501350
endforeach(instance)
13511351
#
1352+
# append ZIMPL instances with objective constant (not compatible with the readertest)
1353+
#
1354+
if(SCIP_WITH_ZIMPL)
1355+
list(APPEND
1356+
instances_MIPEX
1357+
"instances/MIPEX/misc03p1.zpl\;3360.1"
1358+
)
1359+
endif()
1360+
#
13521361
# second test without certification
13531362
#
13541363
foreach(instance ${instances_MIPEX})

check/instances/MIPEX/misc03.zpl renamed to check/instances/MIPEX/misc03p1.zpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2829,7 +2829,7 @@ var y[<v> in CVAR] real >= if lower[v] > -1e20 then lower[v] else -infinity end
28292829
minimize obj: sum <r,"N"> in ROW : (
28302830
sum <r,c,a> in NZO with <c> in IVAR: objsen * a * x[c]
28312831
+ sum <r,c,a> in NZO with <c> in CVAR: objsen * a * y[c]
2832-
);
2832+
) + 0.1;
28332833
subto ce: forall <r,"E"> in ROW do
28342834
if <r> in RANGEROW and sgn(range[r]) > 0 then
28352835
rhs[r] <=

src/scip/primal.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,7 @@ void SCIPprimalAddOrigObjoffset(
726726

727727
assert(primal != NULL);
728728
assert(set != NULL);
729+
assert(!set->exact_enable);
729730
assert(SCIPsetGetStage(set) == SCIP_STAGE_PROBLEM);
730731

731732
#ifndef NDEBUG
@@ -758,6 +759,7 @@ void SCIPprimalAddOrigObjoffsetExact(
758759

759760
assert(primal != NULL);
760761
assert(set != NULL);
762+
assert(set->exact_enable);
761763
assert(SCIPsetGetStage(set) == SCIP_STAGE_PROBLEM);
762764

763765
#ifndef NDEBUG

src/scip/prob.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,6 @@ SCIP_RETCODE SCIPprobCreate(
336336
(*prob)->maxnconss = 0;
337337
(*prob)->startnvars = 0;
338338
(*prob)->startnconss = 0;
339-
(*prob)->objsense = SCIP_OBJSENSE_MINIMIZE;
340-
(*prob)->objoffset = 0.0;
341-
(*prob)->objscale = 1.0;
342339
(*prob)->objlim = SCIP_INVALID;
343340
(*prob)->dualbound = SCIP_INVALID;
344341
(*prob)->objisintegral = FALSE;
@@ -347,13 +344,16 @@ SCIP_RETCODE SCIPprobCreate(
347344
(*prob)->permuted = FALSE;
348345
(*prob)->consschecksorted = FALSE;
349346
(*prob)->conscompression = FALSE;
347+
(*prob)->objsense = SCIP_OBJSENSE_MINIMIZE;
348+
(*prob)->objoffset = 0.0;
349+
(*prob)->objscale = 1.0;
350350
if( set->exact_enable )
351351
{
352352
SCIP_CALL( SCIPrationalCreateBlock(blkmem, &(*prob)->objoffsetexact) );
353353
SCIP_CALL( SCIPrationalCreateBlock(blkmem, &(*prob)->objscaleexact) );
354354

355-
SCIPrationalSetReal((*prob)->objoffsetexact, 0.0);
356-
SCIPrationalSetReal((*prob)->objscaleexact, 1.0);
355+
SCIPrationalSetReal((*prob)->objoffsetexact, (*prob)->objoffset);
356+
SCIPrationalSetReal((*prob)->objscaleexact, (*prob)->objscale);
357357
}
358358
else
359359
{
@@ -1672,6 +1672,7 @@ void SCIPprobAddObjoffset(
16721672
)
16731673
{
16741674
assert(prob != NULL);
1675+
assert(prob->objoffsetexact == NULL);
16751676

16761677
SCIPdebugMessage("adding %g to real objective offset %g\n", addval, prob->objoffset);
16771678

@@ -1692,6 +1693,7 @@ void SCIPprobAddObjoffsetExact(
16921693
SCIPrationalDebugMessage("adding %q to exact objective offset %q\n", addval, prob->objoffsetexact);
16931694

16941695
SCIPrationalAdd(prob->objoffsetexact, prob->objoffsetexact, addval);
1696+
prob->objoffset = SCIPrationalGetReal(prob->objoffsetexact);
16951697

16961698
SCIPrationalDebugMessage("new objective offset %q\n", prob->objoffsetexact);
16971699
}
@@ -2002,6 +2004,8 @@ SCIP_RETCODE probScaleObjExact(
20022004
}
20032005
SCIPrationalMult(transprob->objoffsetexact, transprob->objoffsetexact, intscalar);
20042006
SCIPrationalDiv(transprob->objscaleexact, transprob->objscaleexact, intscalar);
2007+
transprob->objoffset = SCIPrationalGetReal(transprob->objoffsetexact);
2008+
transprob->objscale = SCIPrationalGetReal(transprob->objscaleexact);
20052009
transprob->objisintegral = TRUE;
20062010
SCIPrationalDebugMessage("integral objective scalar: objscale=%q\n", transprob->objscaleexact);
20072011

@@ -2525,18 +2529,15 @@ SCIP_Real SCIPprobExternObjval(
25252529
assert(transprob != NULL);
25262530
assert(transprob->transformed);
25272531
assert(transprob->objscale > 0.0);
2532+
assert(origprob->objoffsetexact == NULL || origprob->objoffset == SCIPrationalGetReal(origprob->objoffsetexact)); /*lint !e777*/
2533+
assert(origprob->objscaleexact == NULL || origprob->objscale == SCIPrationalGetReal(origprob->objscaleexact)); /*lint !e777*/
2534+
assert(transprob->objoffsetexact == NULL || transprob->objoffset == SCIPrationalGetReal(transprob->objoffsetexact)); /*lint !e777*/
2535+
assert(transprob->objscaleexact == NULL || transprob->objscale == SCIPrationalGetReal(transprob->objscaleexact)); /*lint !e777*/
25282536

25292537
if( SCIPsetIsInfinity(set, objval) )
25302538
return (SCIP_Real)transprob->objsense * SCIPsetInfinity(set);
25312539
else if( SCIPsetIsInfinity(set, -objval) )
25322540
return -(SCIP_Real)transprob->objsense * SCIPsetInfinity(set);
2533-
else if( origprob->objoffsetexact != NULL )
2534-
{
2535-
assert(set->exact_enable);
2536-
assert(transprob->objscaleexact != NULL);
2537-
assert(transprob->objoffsetexact != NULL);
2538-
return (SCIP_Real)transprob->objsense * SCIPrationalGetReal(transprob->objscaleexact) * (objval + SCIPrationalGetReal(transprob->objoffsetexact)) + SCIPrationalGetReal(origprob->objoffsetexact);
2539-
}
25402541
else
25412542
return (SCIP_Real)transprob->objsense * transprob->objscale * (objval + transprob->objoffset) + origprob->objoffset;
25422543
}
@@ -2581,18 +2582,15 @@ SCIP_Real SCIPprobInternObjval(
25812582
assert(transprob != NULL);
25822583
assert(transprob->transformed);
25832584
assert(transprob->objscale > 0.0);
2585+
assert(origprob->objoffsetexact == NULL || origprob->objoffset == SCIPrationalGetReal(origprob->objoffsetexact)); /*lint !e777*/
2586+
assert(origprob->objscaleexact == NULL || origprob->objscale == SCIPrationalGetReal(origprob->objscaleexact)); /*lint !e777*/
2587+
assert(transprob->objoffsetexact == NULL || transprob->objoffset == SCIPrationalGetReal(transprob->objoffsetexact)); /*lint !e777*/
2588+
assert(transprob->objscaleexact == NULL || transprob->objscale == SCIPrationalGetReal(transprob->objscaleexact)); /*lint !e777*/
25842589

25852590
if( SCIPsetIsInfinity(set, objval) )
25862591
return (SCIP_Real)transprob->objsense * SCIPsetInfinity(set);
25872592
else if( SCIPsetIsInfinity(set, -objval) )
25882593
return -(SCIP_Real)transprob->objsense * SCIPsetInfinity(set);
2589-
else if( origprob->objoffsetexact != NULL )
2590-
{
2591-
assert(set->exact_enable);
2592-
assert(transprob->objscaleexact != NULL);
2593-
assert(transprob->objoffsetexact != NULL);
2594-
return (SCIP_Real)transprob->objsense * (objval - SCIPrationalGetReal(origprob->objoffsetexact)) / SCIPrationalGetReal(transprob->objscaleexact) - SCIPrationalGetReal(transprob->objoffsetexact);
2595-
}
25962594
else
25972595
return (SCIP_Real)transprob->objsense * (objval - origprob->objoffset) / transprob->objscale - transprob->objoffset;
25982596
}
@@ -2998,7 +2996,6 @@ SCIP_Real SCIPprobGetObjoffset(
29982996
)
29992997
{
30002998
assert(prob != NULL);
3001-
assert(prob->objoffsetexact == NULL);
30022999

30033000
return prob->objoffset;
30043001
}
@@ -3009,7 +3006,6 @@ SCIP_Real SCIPprobGetObjscale(
30093006
)
30103007
{
30113008
assert(prob != NULL);
3012-
assert(prob->objscaleexact == NULL);
30133009

30143010
return prob->objscale;
30153011
}

src/scip/reader.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -518,29 +518,27 @@ SCIP_RETCODE SCIPreaderWrite(
518518
SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(set->scip), &objoffsetexact) );
519519
SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(set->scip), &objscaleexact) );
520520

521-
/* floating-point values should not be used, so set to dummy values */
522-
objoffset = 0.0;
523-
objscale = 1.0;
524521
SCIPrationalSetRational(objoffsetexact, SCIPprobGetObjoffsetExact(prob));
525522
SCIPrationalSetRational(objscaleexact, SCIPprobGetObjscaleExact(prob));
526523

527524
/* adapt exact objective scale for transformed problem (for the original no change is necessary) */
528525
if( SCIPprobIsTransformed(prob) && SCIPprobGetObjsense(prob) == SCIP_OBJSENSE_MAXIMIZE )
529526
SCIPrationalMultReal(objscaleexact, objscaleexact, -1.0);
530527
}
531-
/* get real objective offset and scale */
528+
/* only real objective offset and scale */
532529
else
533530
{
534-
objoffset = SCIPprobGetObjoffset(prob);
535-
objscale = SCIPprobGetObjscale(prob);
536531
objoffsetexact = NULL;
537532
objscaleexact = NULL;
538-
539-
/* adapt real objective scale for transformed problem (for the original no change is necessary) */
540-
if( SCIPprobIsTransformed(prob) && SCIPprobGetObjsense(prob) == SCIP_OBJSENSE_MAXIMIZE )
541-
objscale *= -1.0;
542533
}
543534

535+
objoffset = SCIPprobGetObjoffset(prob);
536+
objscale = SCIPprobGetObjscale(prob);
537+
538+
/* adapt real objective scale for transformed problem (for the original no change is necessary) */
539+
if( SCIPprobIsTransformed(prob) && SCIPprobGetObjsense(prob) == SCIP_OBJSENSE_MAXIMIZE )
540+
objscale *= -1.0;
541+
544542
/* call reader to write problem */
545543
retcode = reader->readerwrite(set->scip, reader, file, filename, SCIPprobGetName(prob), SCIPprobGetData(prob),
546544
SCIPprobIsTransformed(prob), SCIPprobGetObjsense(prob), objoffset, objscale, objoffsetexact, objscaleexact,

src/scip/reader_zpl.c

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,14 @@ SCIP_RETCODE createProb(
214214
if( usestartsol )
215215
{
216216
/* create primal solution */
217-
SCIP_CALL( SCIPcreateSol(scip, &readerdata->sol, NULL) );
217+
if( SCIPisExact(scip) )
218+
{
219+
SCIP_CALL( SCIPcreateSolExact(scip, &readerdata->sol, NULL) );
220+
}
221+
else
222+
{
223+
SCIP_CALL( SCIPcreateSol(scip, &readerdata->sol, NULL) );
224+
}
218225
readerdata->valid = TRUE;
219226
}
220227

@@ -939,8 +946,6 @@ SCIP_RETCODE addObjTerm(
939946
const Term* term /**< term to use */
940947
)
941948
{
942-
SCIP_Real objoffset;
943-
944949
if( term_is_linear(term) )
945950
{
946951
int i;
@@ -955,8 +960,8 @@ SCIP_RETCODE addObjTerm(
955960
scipvar = (SCIP_VAR*)mono_get_var(term_get_element(term, i), 0);
956961
if( SCIPisExact(scip) )
957962
{
958-
char str[SCIP_MAXSTRLEN];
959963
SCIP_RATIONAL* scipvalrat;
964+
char str[SCIP_MAXSTRLEN];
960965

961966
RcreateNumb(SCIPblkmem(scip), &scipvalrat, mono_get_coeff(term_get_element(term, i)));
962967
SCIPrationalAdd(scipvalrat, scipvalrat, SCIPvarGetObjExact(scipvar));
@@ -1013,8 +1018,18 @@ SCIP_RETCODE addObjTerm(
10131018
SCIP_CALL( SCIPreleaseVar(scip, &objvar) );
10141019
}
10151020

1016-
objoffset = numb_todbl(term_get_constant(term));
1017-
SCIP_CALL( SCIPaddOrigObjoffset(scip, objoffset) );
1021+
if( SCIPisExact(scip) )
1022+
{
1023+
SCIP_RATIONAL* scipvalrat;
1024+
1025+
RcreateNumb(SCIPblkmem(scip), &scipvalrat, term_get_constant(term));
1026+
SCIP_CALL( SCIPaddOrigObjoffsetExact(scip, scipvalrat) );
1027+
SCIPrationalFreeBlock(SCIPblkmem(scip), &scipvalrat);
1028+
}
1029+
else
1030+
{
1031+
SCIP_CALL( SCIPaddOrigObjoffset(scip, (SCIP_Real)numb_todbl(term_get_constant(term))) );
1032+
}
10181033

10191034
return SCIP_OKAY;
10201035
}
@@ -1243,7 +1258,18 @@ SCIP_RETCODE addVar(
12431258
(void*)readerdata->sol, SCIPvarGetName(var), (SCIP_Real)numb_todbl(startval));
12441259

12451260
/* set value within the primal solution candidate */
1246-
SCIP_CALL( SCIPsetSolVal(scip, readerdata->sol, var, (SCIP_Real)numb_todbl(startval)) );
1261+
if( SCIPsolIsExact(readerdata->sol) )
1262+
{
1263+
SCIP_RATIONAL* solrat;
1264+
1265+
RcreateNumb(SCIPblkmem(scip), &solrat, startval);
1266+
SCIP_CALL( SCIPsetSolValExact(scip, readerdata->sol, var, solrat) );
1267+
SCIPrationalFreeBlock(SCIPblkmem(scip), &solrat);
1268+
}
1269+
else
1270+
{
1271+
SCIP_CALL( SCIPsetSolVal(scip, readerdata->sol, var, (SCIP_Real)numb_todbl(startval)) );
1272+
}
12471273
}
12481274
}
12491275

src/scip/scip_prob.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,15 +1462,15 @@ SCIP_RETCODE SCIPaddObjoffset(
14621462
* @pre This method can be called if @p scip is in one of the following stages:
14631463
* - \ref SCIP_STAGE_PROBLEM
14641464
*/
1465-
SCIP_RETCODE SCIPaddOrigObjoffset(
1465+
SCIP_RETCODE SCIPaddOrigObjoffsetExact(
14661466
SCIP* scip, /**< SCIP data structure */
1467-
SCIP_Real addval /**< value to add to objective offset */
1467+
SCIP_RATIONAL* addval /**< value to add to objective offset */
14681468
)
14691469
{
1470-
SCIP_CALL( SCIPcheckStage(scip, "SCIPaddOrigObjoffset", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
1470+
SCIP_CALL( SCIPcheckStage(scip, "SCIPaddOrigObjoffsetExact", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
14711471

1472-
SCIPprobAddObjoffset(scip->origprob, addval);
1473-
SCIPprimalAddOrigObjoffset(scip->origprimal, scip->set, addval);
1472+
SCIPprobAddObjoffsetExact(scip->origprob, addval);
1473+
SCIPprimalAddOrigObjoffsetExact(scip->origprimal, scip->set, addval);
14741474

14751475
return SCIP_OKAY;
14761476
}
@@ -1483,15 +1483,29 @@ SCIP_RETCODE SCIPaddOrigObjoffset(
14831483
* @pre This method can be called if @p scip is in one of the following stages:
14841484
* - \ref SCIP_STAGE_PROBLEM
14851485
*/
1486-
SCIP_RETCODE SCIPaddOrigObjoffsetExact(
1486+
SCIP_RETCODE SCIPaddOrigObjoffset(
14871487
SCIP* scip, /**< SCIP data structure */
1488-
SCIP_RATIONAL* addval /**< value to add to objective offset */
1488+
SCIP_Real addval /**< value to add to objective offset */
14891489
)
14901490
{
1491-
SCIP_CALL( SCIPcheckStage(scip, "SCIPaddOrigObjoffsetExact", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
1491+
SCIP_CALL( SCIPcheckStage(scip, "SCIPaddOrigObjoffset", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
14921492

1493-
SCIPprobAddObjoffsetExact(scip->origprob, addval);
1494-
SCIPprimalAddOrigObjoffsetExact(scip->origprimal, scip->set, addval);
1493+
if( SCIPisExact(scip) )
1494+
{
1495+
SCIP_RATIONAL* addvalexact;
1496+
1497+
SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(scip), &addvalexact) );
1498+
1499+
SCIPrationalSetReal(addvalexact, addval);
1500+
SCIP_CALL( SCIPaddOrigObjoffsetExact(scip, addvalexact) );
1501+
1502+
SCIPrationalFreeBuffer(SCIPbuffer(scip), &addvalexact);
1503+
1504+
return SCIP_OKAY;
1505+
}
1506+
1507+
SCIPprobAddObjoffset(scip->origprob, addval);
1508+
SCIPprimalAddOrigObjoffset(scip->origprimal, scip->set, addval);
14951509

14961510
return SCIP_OKAY;
14971511
}

src/scip/scip_prob.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,9 +572,9 @@ SCIP_RETCODE SCIPaddObjoffset(
572572
* - \ref SCIP_STAGE_PROBLEM
573573
*/
574574
SCIP_EXPORT
575-
SCIP_RETCODE SCIPaddOrigObjoffset(
575+
SCIP_RETCODE SCIPaddOrigObjoffsetExact(
576576
SCIP* scip, /**< SCIP data structure */
577-
SCIP_Real addval /**< value to add to objective offset */
577+
SCIP_RATIONAL* addval /**< value to add to objective offset */
578578
);
579579

580580
/** adds offset of objective function to original problem and to all existing solution in original space
@@ -586,9 +586,9 @@ SCIP_RETCODE SCIPaddOrigObjoffset(
586586
* - \ref SCIP_STAGE_PROBLEM
587587
*/
588588
SCIP_EXPORT
589-
SCIP_RETCODE SCIPaddOrigObjoffsetExact(
589+
SCIP_RETCODE SCIPaddOrigObjoffset(
590590
SCIP* scip, /**< SCIP data structure */
591-
SCIP_RATIONAL* addval /**< value to add to objective offset */
591+
SCIP_Real addval /**< value to add to objective offset */
592592
);
593593

594594
/** returns the objective offset of the original problem

src/scip/scip_solve.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2550,7 +2550,7 @@ SCIP_RETCODE SCIPpresolve(
25502550
SCIPmessagePrintVerbInfo(scip->messagehdlr, scip->set->disp_verblevel, SCIP_VERBLEVEL_HIGH,
25512551
"transformed objective value is always integral (scale: ");
25522552

2553-
if( SCIPisExact(scip) )
2553+
if( scip->transprob->objscaleexact != NULL )
25542554
{
25552555
SCIPrationalPrintVerbInfo(scip->messagehdlr, scip->set->disp_verblevel, SCIP_VERBLEVEL_HIGH,
25562556
scip->transprob->objscaleexact);

0 commit comments

Comments
 (0)