53 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
54 #include "sdpa_call.h"
55 #pragma GCC diagnostic warning "-Wstrict-prototypes"
57 #include "blockmemshell/memory.h"
59 #include "scip/pub_misc.h"
62 #define EPSILONCHANGE 1
63 #define FEASTOLCHANGE 1
64 #define PENALTYBOUNDTOL 1E-3
67 #define MIN_LAMBDASTAR 1e0
68 #define MAX_LAMBDASTAR 1e8
69 #define LAMBDASTAR_FACTOR 1e0
70 #define LAMBDASTAR_TWOPOINTS TRUE
71 #define LAMBDASTAR_THRESHOLD 1e1
72 #define LAMBDASTAR_LOW 1.5
73 #define LAMBDASTAR_HIGH 1e5
75 #define MIN_PENALTYPARAM 1e5
76 #define MAX_PENALTYPARAM 1e12
77 #define PENALTYPARAM_FACTOR 1e1
78 #define MAX_MAXPENALTYPARAM 1e15
79 #define MAXPENALTYPARAM_FACTOR 1e6
82 #define BMS_CALL(x) do \
86 SCIPerrorMessage("No memory in function call.\n"); \
87 return SCIP_NOMEMORY; \
93 #define CHECK_IF_SOLVED(sdpisolver) do \
95 if (!(sdpisolver->solved)) \
97 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
98 return SCIP_LPERROR; \
104 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
106 if (!(sdpisolver->solved)) \
108 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
116 struct SCIP_SDPiSolver
118 SCIP_MESSAGEHDLR* messagehdlr;
123 int* inputtosdpamapper;
126 int* sdpatoinputmapper;
127 SCIP_Real* fixedvarsval;
128 SCIP_Real fixedvarsobjcontr;
144 SCIP_Real lambdastar;
161 assert( sdpisolver != NULL );
162 assert( lb < ub + sdpisolver->feastol );
164 return (REALABS(ub-lb) <= sdpisolver->feastol);
167 #define isFixed(sdpisolver,lb,ub) (REALABS(ub-lb) <= sdpisolver->feastol)
192 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
205 assert( sdpisolver != NULL );
206 return (
void*) sdpisolver->sdpa;
222 SCIP_MESSAGEHDLR* messagehdlr,
226 assert( sdpisolver != NULL );
227 assert( blkmem != NULL );
229 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
231 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
233 (*sdpisolver)->messagehdlr = messagehdlr;
234 (*sdpisolver)->blkmem = blkmem;
237 (*sdpisolver)->sdpa = NULL;
239 (*sdpisolver)->nvars = 0;
240 (*sdpisolver)->nactivevars = 0;
241 (*sdpisolver)->inputtosdpamapper = NULL;
242 (*sdpisolver)->sdpatoinputmapper = NULL;
243 (*sdpisolver)->fixedvarsval = NULL;
244 (*sdpisolver)->fixedvarsobjcontr = 0.0;
245 (*sdpisolver)->nvarbounds = 0;
246 (*sdpisolver)->varboundpos = NULL;
247 (*sdpisolver)->solved = FALSE;
248 (*sdpisolver)->timelimit = FALSE;
249 (*sdpisolver)->sdpcounter = 0;
250 (*sdpisolver)->niterations = 0;
251 (*sdpisolver)->nsdpcalls = 0;
253 (*sdpisolver)->epsilon = 1e-4;
254 (*sdpisolver)->feastol = 1e-6;
256 (*sdpisolver)->sdpinfo = FALSE;
267 assert( sdpisolver != NULL );
268 assert( *sdpisolver != NULL );
270 SCIPdebugMessage(
"Freeing SDPISolver\n");
273 if ( (*sdpisolver)->sdpa != NULL)
274 delete (*sdpisolver)->sdpa;
276 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nvars);
278 if ( (*sdpisolver)->nvars > 0 )
279 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
281 if ( (*sdpisolver)->nactivevars > 0 )
282 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
284 if ( (*sdpisolver)->nvars > (*sdpisolver)->nactivevars )
285 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
287 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
297 assert( sdpisolver != NULL );
299 sdpisolver->sdpcounter++;
309 assert( sdpisolver != NULL );
311 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
312 sdpisolver->sdpcounter = 0;
349 int* sdpconstnblocknonz,
353 SCIP_Real** sdpconstval,
355 int** sdpnblockvarnonz,
365 int* blockindchanges,
371 int* lprownactivevars,
382 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
383 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
384 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval, start,
385 startsettings, timelimit, NULL, NULL);
409 SCIP_Real penaltyparam,
420 int* sdpconstnblocknonz,
424 SCIP_Real** sdpconstval,
426 int** sdpnblockvarnonz,
436 int* blockindchanges,
453 SCIP_Bool* penaltybound
457 SCIP_Real* sdpavarbounds;
470 #ifdef SCIP_MORE_DEBUG
475 char phase_string[15];
478 assert( sdpisolver != NULL );
479 assert( penaltyparam > -1 * sdpisolver->epsilon );
480 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
482 assert( obj != NULL );
483 assert( lb != NULL );
484 assert( ub != NULL );
485 assert( nsdpblocks >= 0 );
486 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
487 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
488 assert( sdpconstnnonz >= 0 );
489 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
490 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
491 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
492 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
493 assert( sdpnnonz >= 0 );
494 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
495 assert( nsdpblocks == 0 || sdpvar != NULL );
496 assert( nsdpblocks == 0 || sdprow != NULL );
497 assert( nsdpblocks == 0 || sdpcol != NULL );
498 assert( nsdpblocks == 0 || sdpval != NULL );
499 assert( nsdpblocks == 0 || indchanges != NULL );
500 assert( nsdpblocks == 0 || nremovedinds != NULL );
501 assert( nsdpblocks == 0 || blockindchanges != NULL );
502 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
503 assert( nlpcons >= 0 );
504 assert( noldlpcons >= nlpcons );
505 assert( nlpcons == 0 || lplhs != NULL );
506 assert( nlpcons == 0 || lprhs != NULL );
507 assert( nlpcons == 0 || rownactivevars != NULL );
508 assert( lpnnonz >= 0 );
509 assert( nlpcons == 0 || lprow != NULL );
510 assert( nlpcons == 0 || lpcol != NULL );
511 assert( nlpcons == 0 || lpval != NULL );
513 sdpisolver->niterations = 0;
514 sdpisolver->nsdpcalls = 0;
517 if ( timelimit <= 0.0 )
519 sdpisolver->solved = FALSE;
520 sdpisolver->timelimit = TRUE;
524 sdpisolver->timelimit = FALSE;
536 if ( penaltyparam < sdpisolver->epsilon )
537 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
539 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
542 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
543 sdpisolver->rbound = rbound;
547 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
548 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
549 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
551 oldnvars = sdpisolver->nvars;
552 sdpisolver->nvars = nvars;
553 sdpisolver->nactivevars = 0;
557 sdpisolver->fixedvarsobjcontr = 0.0;
558 for (i = 0; i < nvars; i++)
560 if (
isFixed(sdpisolver, lb[i], ub[i]) )
562 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
563 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
565 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
566 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
570 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
571 sdpisolver->nactivevars++;
572 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
573 #ifdef SCIP_MORE_DEBUG
574 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
578 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
582 sdpisolver->fixedvarsobjcontr = 0.0;
585 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
586 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
589 if ( sdpisolver->sdpa != 0 )
592 delete sdpisolver->sdpa;
593 sdpisolver->sdpa =
new SDPA();
596 sdpisolver->sdpa =
new SDPA();
597 assert( sdpisolver->sdpa != 0 );
602 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
606 SCIPdebugMessage(
"Start solving process with stable settings\n");
610 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
611 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->epsilon);
612 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->feastol);
613 SCIPdebugMessage(
"Start solving process with fast settings\n");
617 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
619 sdpisolver->sdpa->setParameterEpsilonStar(
EPSILONCHANGE * sdpisolver->epsilon);
620 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->feastol);
621 SCIPdebugMessage(
"Start solving process with medium settings\n");
625 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
628 sdpisolver->sdpa->setParameterLowerBound(-1e20);
633 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
635 sdpisolver->sdpa->setParameterUpperBound(1e8);
636 #ifdef SCIP_MORE_DEBUG
637 sdpisolver->sdpa->printParameters(stdout);
641 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
644 sdpisolver->nvarbounds = 0;
645 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
647 if ( sdpisolver->nvars != oldnvars )
649 if ( sdpisolver->varboundpos == NULL )
651 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nvars) );
655 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), oldnvars, 2 * sdpisolver->nvars) );
658 assert( sdpisolver->varboundpos != NULL );
660 for (i = 0; i < sdpisolver->nactivevars; i++)
662 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
665 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
666 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
667 (sdpisolver->nvarbounds)++;
671 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
672 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
673 (sdpisolver->nvarbounds)++;
680 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2*noldlpcons) );
685 for (i = 0; i < noldlpcons; i++)
687 if ( rownactivevars[i] >= 2 )
691 rowmapper[2*i] = pos;
698 rowmapper[2*i + 1] = pos;
702 rowmapper[2*i + 1] = -1;
709 rowmapper[2*i + 1] = -1;
713 assert( nlpineqs <= 2*nlpcons );
719 if ( penaltyparam >= sdpisolver->epsilon && rbound )
720 sdpisolver->nvarbounds++;
722 if ( sdpisolver->sdpinfo )
723 sdpisolver->sdpa->setDisplay(stdout);
725 sdpisolver->sdpa->setDisplay(0);
727 #ifdef SCIP_MORE_DEBUG
728 FILE* fpOut = fopen(
"output.tmp",
"w");
731 sdpisolver->sdpa->setResultFile(fpOut);
735 if ( penaltyparam < sdpisolver->epsilon )
736 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
738 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
741 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
742 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
745 for (block = 0; block < nsdpblocks; block++)
747 if ( blockindchanges[block] >= 0 )
749 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
750 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
751 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
752 (
long long) sdpblocksizes[block] - nremovedinds[block]);
753 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
756 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
759 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
760 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
761 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
762 -(nlpineqs + sdpisolver->nvarbounds));
765 sdpisolver->sdpa->initializeUpperTriangleSpace();
768 for (i = 0; i < sdpisolver->nactivevars; i++)
773 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
774 #ifdef SCIP_MORE_DEBUG
775 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
776 sdpisolver->sdpatoinputmapper[i], i+1);
779 if ( penaltyparam >= sdpisolver->epsilon )
780 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
785 sdpisolver->sdpa->setInitPoint(
true);
787 sdpisolver->sdpa->setInitPoint(
false);
795 assert( nsdpblocks > 0 );
796 assert( sdpnblockvarnonz != NULL );
797 assert( sdpnblockvars != NULL );
798 assert( sdpcol != NULL );
799 assert( sdprow != NULL );
800 assert( sdpval != NULL );
801 assert( sdpvar != NULL );
802 assert( indchanges != NULL );
803 assert( nremovedinds != NULL );
805 for (block = 0; block < nsdpblocks; block++)
808 if ( blockindchanges[block] == -1 )
810 #ifdef SCIP_MORE_DEBUG
811 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
814 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
816 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
818 #ifdef SCIP_MORE_DEBUG
819 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
820 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
826 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
829 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
831 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
832 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
834 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
835 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
838 #ifdef SCIP_MORE_DEBUG
839 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
840 sdpval[block][blockvar][k],
841 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
842 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
843 sdpisolver->sdpcounter);
846 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
847 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
848 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
849 sdpval[block][blockvar][k], checkinput);
854 if ( penaltyparam >= sdpisolver->epsilon )
856 #ifdef SCIP_MORE_DEBUG
857 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
859 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
861 #ifdef SCIP_MORE_DEBUG
862 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
865 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
866 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
873 if ( sdpconstnnonz > 0 )
875 assert( nsdpblocks > 0 );
876 assert( sdpconstnblocknonz!= NULL );
877 assert( sdpconstcol != NULL );
878 assert( sdpconstrow != NULL );
879 assert( sdpconstval != NULL );
881 for (block = 0; block < nsdpblocks; block++)
883 if ( blockindchanges[block] == -1 )
885 #ifdef SCIP_MORE_DEBUG
886 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
888 for (k = 0; k < sdpconstnblocknonz[block]; k++)
891 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
893 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
894 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
896 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
897 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
900 #ifdef SCIP_MORE_DEBUG
901 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
902 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
903 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
904 sdpisolver->sdpcounter);
906 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
907 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
908 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
909 sdpconstval[block][k], checkinput);
914 #ifdef SCIP_MORE_DEBUG
915 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
919 for (i = 0; i < lpnnonz; i++)
921 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
922 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
923 assert( REALABS(lpval[i]) > sdpisolver->feastol );
926 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
929 assert( rownactivevars[lprow[i]] > 0 );
930 if ( rownactivevars[lprow[i]] > 1 )
932 if ( lprow[i] > lastrow )
936 if ( penaltyparam >= sdpisolver->epsilon )
939 if ( rowmapper[2*lastrow] > -1 )
941 #ifdef SCIP_MORE_DEBUG
942 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
943 rowmapper[2*lastrow], rowmapper[2*lastrow], sdpisolver->sdpcounter);
947 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
948 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], 1.0, checkinput);
952 if ( rowmapper[2*lastrow + 1] > -1 )
954 #ifdef SCIP_MORE_DEBUG
955 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
956 rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
960 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
961 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], 1.0, checkinput);
966 if ( rowmapper[2*lastrow] > -1 )
968 #ifdef SCIP_MORE_DEBUG
969 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
970 lpval[i], rowmapper[2*lastrow], rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
973 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
974 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], lpval[i], checkinput);
977 if ( rowmapper[2*lastrow + 1] > -1 )
979 #ifdef SCIP_MORE_DEBUG
980 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
981 -1 * lpval[i], rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
985 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
986 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
994 for (i = 0; i < nlpcons; i++)
999 #ifdef SCIP_MORE_DEBUG
1000 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1003 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1004 (
long long) lpconsind, lplhs[i], checkinput);
1011 #ifdef SCIP_MORE_DEBUG
1012 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1016 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1017 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1022 assert( lpconsind == nlpineqs + 1 );
1025 #ifdef SCIP_MORE_DEBUG
1028 for (i = 0; i < lpnnonz; i++)
1031 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1033 if ( rownactivevars[lprow[i]] > 1 )
1035 if ( lprow[i] > lastrow )
1040 SCIPmessagePrintInfo(sdpi->messagehdlr,
" <= %f\n", lprhs[ind]);
1042 SCIPmessagePrintInfo(sdpi->messagehdlr,
"\n");
1047 SCIPmessagePrintInfo(sdpi->messagehdlr,
"%f <= ", lplhs[ind]);
1049 SCIPmessagePrintInfo(sdpi->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1056 SCIPmessagePrintInfo(sdpi->messagehdlr,
" <= %f\n", lprhs[ind]);
1058 SCIPmessagePrintInfo(sdpi->messagehdlr,
"\n");
1060 assert( ind == nlpcons - 1 );
1065 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2 * noldlpcons);
1069 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1071 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1074 if ( sdpisolver->varboundpos[i] < 0 )
1078 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1079 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1081 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1084 #ifdef SCIP_MORE_DEBUG
1085 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1086 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1087 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1089 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1090 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1095 #ifdef SCIP_MORE_DEBUG
1096 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1097 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1098 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1108 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1109 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1111 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1114 #ifdef SCIP_MORE_DEBUG
1115 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1116 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1117 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1119 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1120 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1125 #ifdef SCIP_MORE_DEBUG
1126 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1127 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1128 sdpisolver->varboundpos[i]);
1134 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1137 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1138 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1139 #ifdef SCIP_MORE_DEBUG
1140 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1145 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars);
1148 sdpisolver->sdpa->initializeUpperTriangle();
1149 sdpisolver->sdpa->initializeSolve();
1152 if ( start != NULL && penaltyparam < sdpisolver->epsilon )
1154 SCIPdebugMessage(
"Starting with a previous solution is not yet tested for the interface, only x-vector is given, not y and Z");
1155 for (i = 1; i <= sdpisolver->nactivevars; i++)
1156 sdpisolver->sdpa->inputInitXVec((
long long) i, start[sdpisolver->sdpatoinputmapper[i] - 1]);
1158 else if ( penaltyparam >= sdpisolver->epsilon )
1159 SCIPdebugMessage(
"Skipping insertion of starting point, as this is not yet supported for penalty formulation.\n");
1161 #ifdef SCIP_DEBUG_PRINTTOFILE
1163 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1164 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1167 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1168 sdpisolver->sdpa->solve();
1169 sdpisolver->solved = TRUE;
1172 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1173 sdpisolver->nsdpcalls += 1;
1177 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1178 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1184 else if ( penaltyparam >= sdpisolver->epsilon )
1192 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1195 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1196 sdpisolver->sdpa->setParameterEpsilonStar(
EPSILONCHANGE * sdpisolver->epsilon);
1197 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->feastol);
1198 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1201 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1203 sdpisolver->sdpa->setParameterUpperBound(1e8);
1206 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1208 #ifdef SCIP_MORE_DEBUG
1209 sdpisolver->sdpa->printParameters(stdout);
1211 sdpisolver->sdpa->setInitPoint(
false);
1212 #ifdef SDPA_RESETPARAMS
1213 sdpisolver->sdpa->resetParameters();
1215 sdpisolver->sdpa->initializeSolve();
1217 sdpisolver->sdpa->solve();
1218 sdpisolver->solved = TRUE;
1221 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1222 sdpisolver->nsdpcalls += 1;
1230 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1231 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1238 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1241 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1244 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1247 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1249 sdpisolver->sdpa->setParameterUpperBound(1e8);
1252 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1254 #ifdef SCIP_MORE_DEBUG
1255 sdpisolver->sdpa->printParameters(stdout);
1257 sdpisolver->sdpa->setInitPoint(
false);
1258 #ifdef SDPA_RESETPARAMS
1259 sdpisolver->sdpa->resetParameters();
1261 sdpisolver->sdpa->initializeSolve();
1263 sdpisolver->sdpa->solve();
1264 sdpisolver->solved = TRUE;
1267 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1268 sdpisolver->nsdpcalls += 1;
1276 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1277 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1282 #ifdef SCIP_MORE_DEBUG
1283 (void) fclose(fpOut);
1287 if ( penaltyparam >= sdpisolver->epsilon )
1292 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1294 sdpasol = sdpisolver->sdpa->getResultXVec();
1297 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1301 if ( ! *feasorig && penaltybound != NULL )
1308 SCIP_Real trace = 0.0;
1310 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1315 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1316 for (b = 1; b <= nblockssdpa; b++)
1319 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1320 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1321 assert( nrow >= 0 );
1324 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1327 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1333 for (i = 0; i < nrow; i++)
1334 trace += X[i + i*nrow];
1341 if ( penaltybound != NULL )
1342 *penaltybound = TRUE;
1343 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1344 trace, penaltyparam);
1346 else if ( penaltybound != NULL )
1347 *penaltybound = FALSE;
1374 assert( sdpisolver != NULL );
1375 return sdpisolver->solved;
1388 SDPA::PhaseType phasetype;
1390 assert( sdpisolver != NULL );
1391 assert( sdpisolver->sdpa != NULL);
1394 phasetype = sdpisolver->sdpa->getPhaseValue();
1396 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1405 SCIP_Bool* primalfeasible,
1406 SCIP_Bool* dualfeasible
1409 SDPA::PhaseType phasetype;
1411 assert( sdpisolver != NULL );
1412 assert( sdpisolver->sdpa != NULL );
1413 assert( primalfeasible != NULL );
1414 assert( dualfeasible != NULL );
1417 phasetype = sdpisolver->sdpa->getPhaseValue();
1419 switch ( phasetype )
1422 *primalfeasible = TRUE;
1423 *dualfeasible = TRUE;
1426 *primalfeasible = TRUE;
1427 *dualfeasible = TRUE;
1429 case SDPA::pFEAS_dINF:
1430 *primalfeasible = TRUE;
1431 *dualfeasible = FALSE;
1433 case SDPA::pINF_dFEAS:
1434 *primalfeasible = FALSE;
1435 *dualfeasible = TRUE;
1438 *primalfeasible = TRUE;
1439 *dualfeasible = FALSE;
1440 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
1443 *primalfeasible = FALSE;
1444 *dualfeasible = TRUE;
1445 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
1448 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
1449 return SCIP_LPERROR;
1461 SDPA::PhaseType phasetype;
1463 assert( sdpisolver != NULL );
1464 assert( sdpisolver->sdpa != NULL );
1467 phasetype = sdpisolver->sdpa->getPhaseValue();
1469 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1471 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
1474 else if ( phasetype == SDPA::pFEAS_dINF )
1476 else if ( phasetype == SDPA::pUNBD )
1478 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1491 SDPA::PhaseType phasetype;
1493 assert( sdpisolver != NULL );
1494 assert( sdpisolver->sdpa != NULL );
1497 phasetype = sdpisolver->sdpa->getPhaseValue();
1499 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1501 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
1504 else if ( phasetype == SDPA::pINF_dFEAS )
1506 else if ( phasetype == SDPA::dUNBD )
1508 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1521 SDPA::PhaseType phasetype;
1523 assert( sdpisolver != NULL );
1524 assert( sdpisolver->sdpa != NULL );
1527 phasetype = sdpisolver->sdpa->getPhaseValue();
1529 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1531 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1534 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
1536 else if ( phasetype == SDPA::dUNBD )
1538 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1551 SDPA::PhaseType phasetype;
1553 assert( sdpisolver != NULL );
1554 assert( sdpisolver->sdpa != NULL);
1557 phasetype = sdpisolver->sdpa->getPhaseValue();
1559 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1561 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
1564 else if ( phasetype == SDPA::pINF_dFEAS )
1566 else if ( phasetype == SDPA::dUNBD )
1568 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1581 SDPA::PhaseType phasetype;
1583 assert( sdpisolver != NULL );
1584 assert( sdpisolver->sdpa != NULL);
1587 phasetype = sdpisolver->sdpa->getPhaseValue();
1589 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1591 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
1594 else if ( phasetype == SDPA::pFEAS_dINF )
1596 else if ( phasetype == SDPA::pUNBD )
1598 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1611 SDPA::PhaseType phasetype;
1613 assert( sdpisolver != NULL );
1614 assert( sdpisolver->sdpa != NULL);
1617 phasetype = sdpisolver->sdpa->getPhaseValue();
1619 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1621 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1624 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1626 else if ( phasetype == SDPA::dUNBD )
1628 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1640 SDPA::PhaseType phasetype;
1642 assert( sdpisolver != NULL );
1643 assert( sdpisolver->sdpa != NULL );
1646 phasetype = sdpisolver->sdpa->getPhaseValue();
1648 if ( phasetype == SDPA::pdOPT )
1659 SDPA::PhaseType phasetype;
1661 assert( sdpisolver != NULL );
1662 assert( sdpisolver->sdpa != NULL );
1665 phasetype = sdpisolver->sdpa->getPhaseValue();
1667 if ( phasetype == SDPA::pUNBD )
1678 SDPA::PhaseType phasetype;
1680 assert( sdpisolver != NULL );
1681 assert( sdpisolver->sdpa != NULL);
1684 phasetype = sdpisolver->sdpa->getPhaseValue();
1686 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1688 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
1700 assert( sdpisolver != NULL );
1702 return sdpisolver->timelimit;
1719 SDPA::PhaseType phasetype;
1721 assert( sdpisolver != NULL );
1722 assert( sdpisolver->sdpa != NULL );
1724 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
1727 phasetype = sdpisolver->sdpa->getPhaseValue();
1729 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
1731 if ( phasetype == SDPA::pdINF )
1733 if ( phasetype == SDPA::pUNBD)
1735 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1746 SDPA::PhaseType phasetype;
1748 assert( sdpisolver != NULL );
1749 assert( sdpisolver->sdpa != NULL );
1752 phasetype = sdpisolver->sdpa->getPhaseValue();
1754 if ( phasetype == SDPA::pdOPT )
1766 SDPA::PhaseType phasetype;
1768 assert( sdpisolver != NULL );
1769 assert( sdpisolver->sdpa != NULL );
1771 if ( sdpisolver->timelimit )
1776 phasetype = sdpisolver->sdpa->getPhaseValue();
1780 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
1792 SCIPdebugMessage(
"Not implemented yet\n");
1794 return SCIP_LPERROR;
1803 assert( sdpisolver != NULL );
1804 assert( sdpisolver->sdpa != NULL );
1805 assert( objval != NULL );
1808 *objval = sdpisolver->sdpa->getPrimalObj();
1811 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
1812 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
1813 if ( gap > sdpisolver->epsilon )
1814 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetObjval, "
1815 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
1819 *objval += sdpisolver->fixedvarsobjcontr;
1839 assert( sdpisolver != NULL );
1840 assert( sdpisolver->sdpa != NULL );
1841 assert( dualsollength != NULL );
1844 if ( objval != NULL )
1846 *objval = sdpisolver->sdpa->getPrimalObj();
1849 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
1850 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
1851 if ( gap > sdpisolver->epsilon )
1853 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
1854 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
1859 *objval += sdpisolver->fixedvarsobjcontr;
1862 if ( *dualsollength > 0 )
1864 assert( dualsol != NULL );
1865 if ( *dualsollength < sdpisolver->nvars )
1867 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
1868 *dualsollength = sdpisolver->nvars;
1874 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
1875 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
1876 sdpasol = sdpisolver->sdpa->getResultXVec();
1878 for (v = 0; v < sdpisolver->nvars; v++)
1880 if ( sdpisolver->inputtosdpamapper[v] > 0 )
1883 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
1888 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
1889 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
1916 assert( sdpisolver != NULL );
1917 assert( sdpisolver->sdpa != NULL );
1918 assert( lbvars != NULL );
1919 assert( ubvars != NULL );
1920 assert( arraylength != NULL );
1921 assert( *arraylength >= 0 );
1925 if ( *arraylength < sdpisolver->nvars )
1927 *arraylength = sdpisolver->nvars;
1928 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
1933 for (i = 0; i < sdpisolver->nvars; i++)
1940 if ( sdpisolver->nvarbounds == 0 )
1942 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
1947 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
1948 assert( sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP );
1949 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
1950 assert( nlpcons >= 0 );
1952 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
1955 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
1957 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
1959 if ( sdpisolver->varboundpos[i] < 0 )
1963 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
1969 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
1982 assert( sdpisolver != NULL );
1983 assert( sdpisolver->sdpa != NULL );
1984 assert( iterations != NULL );
1986 *iterations = sdpisolver->niterations;
1997 assert( sdpisolver != NULL );
1998 assert( sdpisolver->sdpa != NULL );
1999 assert( calls != NULL );
2001 *calls = sdpisolver->nsdpcalls;
2012 assert( sdpisolver != NULL );
2013 assert( usedsetting != NULL );
2016 *usedsetting = sdpisolver->usedsetting;
2057 assert( sdpisolver != NULL );
2058 assert( dval != NULL );
2063 *dval = sdpisolver->epsilon;
2066 *dval = sdpisolver->feastol;
2070 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
2073 *dval = sdpisolver->objlimit;
2076 *dval = sdpisolver->lambdastar;
2079 return SCIP_PARAMETERUNKNOWN;
2092 assert( sdpisolver != NULL );
2097 sdpisolver->epsilon = dval;
2098 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2101 sdpisolver->feastol = dval;
2102 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2105 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
2108 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2109 sdpisolver->objlimit = dval;
2112 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
2113 sdpisolver->lambdastar = dval;
2116 return SCIP_PARAMETERUNKNOWN;
2129 assert( sdpisolver != NULL );
2134 *ival = (int) sdpisolver->sdpinfo;
2135 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2138 return SCIP_PARAMETERUNKNOWN;
2151 assert( sdpisolver != NULL );
2156 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2157 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2160 return SCIP_PARAMETERUNKNOWN;
2174 assert( sdpisolver != NULL );
2179 #ifdef LAMBDASTAR_TWOPOINTS
2200 sdpisolver->lambdastar = compval;
2201 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
2211 SCIP_Real* penaltyparam
2216 assert( sdpisolver != NULL );
2217 assert( penaltyparam != NULL );
2233 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2234 *penaltyparam = compval;
2242 SCIP_Real penaltyparam,
2243 SCIP_Real* maxpenaltyparam
2248 assert( sdpisolver != NULL );
2249 assert( maxpenaltyparam != NULL );
2255 *maxpenaltyparam = compval;
2256 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2285 SCIPdebugMessage(
"Not implemented yet\n");
2286 return SCIP_LPERROR;
2295 assert( fname != NULL );
2297 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
#define PENALTYPARAM_FACTOR
const char * SCIPsdpiSolverGetSolverDesc(void)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
interface methods for specific SDP-solvers
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
#define MAXPENALTYPARAM_FACTOR
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
#define LAMBDASTAR_THRESHOLD
SCIP_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
#define LAMBDASTAR_FACTOR
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverLoadAndSolveWithPenalty(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Bool withobj, SCIP_Bool rbound, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverLoadAndSolve(SCIP_SDPISOLVER *sdpisolver, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *lprownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)