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"
61 #include "scip/pub_message.h"
64 #define GAPTOLCHANGE 1
65 #define FEASTOLCHANGE 1
66 #define PENALTYBOUNDTOL 1E-3
69 #define INFEASFEASTOLCHANGE 0.1
70 #define INFEASMINFEASTOL 1E-9
72 #define MIN_LAMBDASTAR 1e0
73 #define MAX_LAMBDASTAR 1e8
74 #define LAMBDASTAR_FACTOR 1e0
75 #define LAMBDASTAR_TWOPOINTS TRUE
76 #define LAMBDASTAR_THRESHOLD 1e1
77 #define LAMBDASTAR_LOW 1.5
78 #define LAMBDASTAR_HIGH 1e5
80 #define MIN_PENALTYPARAM 1e5
81 #define MAX_PENALTYPARAM 1e12
82 #define PENALTYPARAM_FACTOR 1e1
83 #define MAX_MAXPENALTYPARAM 1e15
84 #define MAXPENALTYPARAM_FACTOR 1e6
87 #define BMS_CALL(x) do \
91 SCIPerrorMessage("No memory in function call.\n"); \
92 return SCIP_NOMEMORY; \
98 #define CHECK_IF_SOLVED(sdpisolver) do \
100 if (!(sdpisolver->solved)) \
102 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
103 return SCIP_LPERROR; \
109 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
111 if (!(sdpisolver->solved)) \
113 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
121 struct SCIP_SDPiSolver
123 SCIP_MESSAGEHDLR* messagehdlr;
129 int* inputtosdpamapper;
132 int* sdpatoinputmapper;
133 SCIP_Real* fixedvarsval;
134 SCIP_Real fixedvarsobjcontr;
139 int* inputtovbmapper;
145 int* rowtoinputmapper;
146 int* inputtoblockmapper;
147 int** blockindmapper;
156 SCIP_Real sdpsolverfeastol;
164 SCIP_Real lambdastar;
165 SCIP_Real* preoptimalsol;
166 SCIP_Real** preoptimalsolx;
167 SCIP_Bool preoptimalsolexists;
168 SCIP_Real preoptimalgap;
185 assert( sdpisolver != NULL );
186 assert( lb < ub + sdpisolver->feastol );
188 return (ub-lb <= sdpisolver->epsilon);
191 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
199 SCIP_Real penaltyparam,
207 int* sdpconstnblocknonz,
211 SCIP_Real** sdpconstval,
213 int** sdpnblockvarnonz,
223 int* blockindchanges,
237 char phase_string[15];
240 assert( feastol != NULL );
244 SCIP_Real* solvector;
246 SCIP_Bool infeasible;
249 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
250 nvarspointer = nvars;
252 assert( nvarspointer == nvars );
255 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
256 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
257 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
258 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
260 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
264 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
271 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
273 #ifdef SCIP_MORE_DEBUG
274 sdpisolver->sdpa->printParameters(stdout);
276 sdpisolver->sdpa->setInitPoint(
false);
277 #ifdef SDPA_RESETPARAMS
278 sdpisolver->sdpa->resetParameters();
280 sdpisolver->sdpa->initializeSolve();
282 sdpisolver->sdpa->solve();
285 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
286 sdpisolver->nsdpcalls += 1;
290 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
291 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
296 sdpisolver->solved = FALSE;
297 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
327 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
340 assert( sdpisolver != NULL );
341 return (
void*) sdpisolver->sdpa;
389 SCIP_MESSAGEHDLR* messagehdlr,
394 assert( sdpisolver != NULL );
395 assert( blkmem != NULL );
396 assert( bufmem != NULL );
398 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
400 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
402 (*sdpisolver)->messagehdlr = messagehdlr;
403 (*sdpisolver)->blkmem = blkmem;
404 (*sdpisolver)->bufmem = bufmem;
407 (*sdpisolver)->sdpa = NULL;
409 (*sdpisolver)->nvars = 0;
410 (*sdpisolver)->nactivevars = 0;
411 (*sdpisolver)->nsdpblocks = 0;
412 (*sdpisolver)->inputtosdpamapper = NULL;
413 (*sdpisolver)->sdpatoinputmapper = NULL;
414 (*sdpisolver)->inputtoblockmapper = NULL;
415 (*sdpisolver)->blockindmapper = NULL;
416 (*sdpisolver)->rowmapper = NULL;
417 (*sdpisolver)->rowtoinputmapper = NULL;
418 (*sdpisolver)->fixedvarsval = NULL;
419 (*sdpisolver)->fixedvarsobjcontr = 0.0;
420 (*sdpisolver)->objcoefs = NULL;
421 (*sdpisolver)->nvarbounds = 0;
422 (*sdpisolver)->varboundpos = NULL;
423 (*sdpisolver)->inputtovbmapper = NULL;
424 (*sdpisolver)->solved = FALSE;
425 (*sdpisolver)->timelimit = FALSE;
426 (*sdpisolver)->sdpcounter = 0;
427 (*sdpisolver)->niterations = 0;
428 (*sdpisolver)->nsdpcalls = 0;
429 (*sdpisolver)->ninputlpcons = 0;
430 (*sdpisolver)->nsdpalpcons = 0;
432 (*sdpisolver)->epsilon = 1e-9;
433 (*sdpisolver)->gaptol = 1e-4;
434 (*sdpisolver)->feastol = 1e-6;
435 (*sdpisolver)->sdpsolverfeastol = 1e-6;
437 (*sdpisolver)->sdpinfo = FALSE;
440 (*sdpisolver)->preoptimalsolexists = FALSE;
441 (*sdpisolver)->preoptimalgap = -1.0;
455 assert( sdpisolver != NULL );
456 assert( *sdpisolver != NULL );
458 SCIPdebugMessage(
"Freeing SDPISolver\n");
460 if ( (*sdpisolver)->sdpa != NULL )
462 nsdpblocks = (*sdpisolver)->sdpa->getBlockType((*sdpisolver)->sdpa->getBlockNumber()) == SDPA::LP ?
463 (*sdpisolver)->sdpa->getBlockNumber() - 1 : (*sdpisolver)->sdpa->getBlockNumber();
464 for (b = 0; b < nsdpblocks; b++)
466 blocksize = (*sdpisolver)->sdpa->getBlockSize(b + 1);
468 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->blockindmapper[b]), blocksize);
471 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
473 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[b]), blocksize * blocksize);
477 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
479 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[nsdpblocks + 1]), 2 * (*sdpisolver)->nsdpalpcons + (*sdpisolver)->nvarbounds);
480 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolx, nsdpblocks + 1);
482 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->blockindmapper, nsdpblocks);
486 if ( (*sdpisolver)->sdpa != NULL)
487 delete (*sdpisolver)->sdpa;
489 if ( (*sdpisolver)->nactivevars > 0 && (*sdpisolver)->preoptimalgap > 0.0 )
491 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
494 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtoblockmapper, (*sdpisolver)->nsdpblocks);
496 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowtoinputmapper, 2 * (*sdpisolver)->nsdpalpcons);
498 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowmapper, 2 * (*sdpisolver)->ninputlpcons);
500 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
502 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtovbmapper, 2 * (*sdpisolver)->nvars);
504 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
506 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
508 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
510 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
512 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
522 assert( sdpisolver != NULL );
524 sdpisolver->sdpcounter++;
534 assert( sdpisolver != NULL );
536 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
537 sdpisolver->sdpcounter = 0;
577 int* sdpconstnblocknonz,
581 SCIP_Real** sdpconstval,
583 int** sdpnblockvarnonz,
593 int* blockindchanges,
599 int* lprownactivevars,
605 int* startZnblocknonz,
611 SCIP_Real** startZval,
613 int* startXnblocknonz,
619 SCIP_Real** startXval,
626 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
627 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
628 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval,
629 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
630 timelimit, NULL, NULL);
657 SCIP_Real penaltyparam,
668 int* sdpconstnblocknonz,
672 SCIP_Real** sdpconstval,
674 int** sdpnblockvarnonz,
684 int* blockindchanges,
696 int* startZnblocknonz,
702 SCIP_Real** startZval,
704 int* startXnblocknonz,
710 SCIP_Real** startXval,
717 SCIP_Bool* penaltybound
722 SCIP_Real* sdpavarbounds;
740 SCIP_Bool newlyallocated;
743 char phase_string[15];
746 assert( sdpisolver != NULL );
747 assert( penaltyparam > -1 * sdpisolver->epsilon );
748 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
750 assert( obj != NULL );
751 assert( lb != NULL );
752 assert( ub != NULL );
753 assert( nsdpblocks >= 0 );
754 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
755 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
756 assert( sdpconstnnonz >= 0 );
757 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
758 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
759 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
760 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
761 assert( sdpnnonz >= 0 );
762 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
763 assert( nsdpblocks == 0 || sdpvar != NULL );
764 assert( nsdpblocks == 0 || sdprow != NULL );
765 assert( nsdpblocks == 0 || sdpcol != NULL );
766 assert( nsdpblocks == 0 || sdpval != NULL );
767 assert( nsdpblocks == 0 || indchanges != NULL );
768 assert( nsdpblocks == 0 || nremovedinds != NULL );
769 assert( nsdpblocks == 0 || blockindchanges != NULL );
770 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
771 assert( nlpcons >= 0 );
772 assert( noldlpcons >= nlpcons );
773 assert( nlpcons == 0 || lplhs != NULL );
774 assert( nlpcons == 0 || lprhs != NULL );
775 assert( nlpcons == 0 || rownactivevars != NULL );
776 assert( lpnnonz >= 0 );
777 assert( nlpcons == 0 || lprow != NULL );
778 assert( nlpcons == 0 || lpcol != NULL );
779 assert( nlpcons == 0 || lpval != NULL );
780 assert( startZnblocknonz == NULL || startZrow != NULL );
781 assert( startZnblocknonz == NULL || startZcol != NULL );
782 assert( startZnblocknonz == NULL || startZval != NULL );
783 assert( startXnblocknonz == NULL || startXrow != NULL );
784 assert( startXnblocknonz == NULL || startXcol != NULL );
785 assert( startXnblocknonz == NULL || startXval != NULL );
787 sdpisolver->niterations = 0;
788 sdpisolver->nsdpcalls = 0;
789 sdpisolver->feasorig = FALSE;
792 if ( timelimit <= 0.0 )
794 sdpisolver->solved = FALSE;
795 sdpisolver->timelimit = TRUE;
799 sdpisolver->timelimit = FALSE;
811 if ( penaltyparam < sdpisolver->epsilon )
812 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
814 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
817 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
818 sdpisolver->rbound = rbound;
822 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
823 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
824 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
825 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
827 oldnvars = sdpisolver->nvars;
828 oldnactivevars = sdpisolver->nactivevars;
829 oldsdpalplength = 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds;
830 sdpisolver->nvars = nvars;
831 sdpisolver->nactivevars = 0;
835 sdpisolver->fixedvarsobjcontr = 0.0;
836 for (i = 0; i < nvars; i++)
838 if (
isFixed(sdpisolver, lb[i], ub[i]) )
840 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
841 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
843 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
844 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
848 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
849 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
850 sdpisolver->nactivevars++;
851 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
852 #ifdef SCIP_MORE_DEBUG
853 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
857 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
861 sdpisolver->fixedvarsobjcontr = 0.0;
864 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
865 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
866 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
869 if ( nsdpblocks != sdpisolver->nsdpblocks )
871 if ( sdpisolver->inputtoblockmapper == NULL )
873 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), nsdpblocks) );
877 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), sdpisolver->nsdpblocks, nsdpblocks) );
882 if ( sdpisolver->nactivevars != oldnactivevars && sdpisolver->preoptimalgap >= 0.0 )
884 if ( oldnactivevars == 0 )
886 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
890 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
893 sdpisolver->preoptimalsolexists = FALSE;
895 sdpisolver->nsdpblocks = nsdpblocks;
898 if ( sdpisolver->sdpa == NULL )
904 nsdpasdpblocks = (sdpisolver->sdpa->getBlockType(sdpisolver->sdpa->getBlockNumber()) == SDPA::LP ?
905 sdpisolver->sdpa->getBlockNumber() - 1 : sdpisolver->sdpa->getBlockNumber());
909 if ( nsdpblocks - nremovedblocks != nsdpasdpblocks )
911 if ( sdpisolver->blockindmapper == NULL )
913 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper), nsdpblocks - nremovedblocks) );
914 newlyallocated = TRUE;
915 if ( sdpisolver->preoptimalgap >= 0.0 )
918 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx), nsdpblocks - nremovedblocks + 1) );
925 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
927 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->blockindmapper[block]), sdpisolver->sdpa->getBlockSize(block + 1));
929 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper),
930 nsdpasdpblocks, nsdpblocks - nremovedblocks) );
931 newlyallocated = FALSE;
933 if ( sdpisolver->preoptimalgap >= 0.0 )
936 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
938 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[block]), sdpisolver->sdpa->getBlockSize(block + 1));
940 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx),
941 nsdpasdpblocks, nsdpblocks - nremovedblocks + 1) );
946 newlyallocated = FALSE;
950 for (block = 0; block < nsdpblocks; block++)
952 if ( blockindchanges[block] > -1 )
954 sdpisolver->inputtoblockmapper[block] = ind + 1;
957 if ( newlyallocated )
959 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]), sdpblocksizes[block] - nremovedinds[block]) );
960 if ( sdpisolver->preoptimalgap >= 0.0 )
962 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
963 (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
966 else if ( (
long long) (sdpblocksizes[block] - nremovedinds[block]) != sdpisolver->sdpa->getBlockSize(ind + 1) )
968 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]),
969 (
int) sdpisolver->sdpa->getBlockSize(ind + 1), sdpblocksizes[block] - nremovedinds[block]) );
970 if ( sdpisolver->preoptimalgap >= 0.0 )
972 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
973 (
int) sdpisolver->sdpa->getBlockSize(ind + 1) * sdpisolver->sdpa->getBlockSize(ind + 1), (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
978 for (i = 0; i < sdpblocksizes[block]; i++)
980 if ( indchanges[ind][i] > -1 )
982 sdpisolver->blockindmapper[ind][blockind] = i;
983 assert( i - indchanges[ind][i] == blockind );
987 assert( blockind == sdpblocksizes[block] - nremovedinds[block] );
991 sdpisolver->inputtoblockmapper[block] = -1;
995 if ( sdpisolver->sdpa != 0 )
998 delete sdpisolver->sdpa;
999 sdpisolver->sdpa =
new SDPA();
1002 sdpisolver->sdpa =
new SDPA();
1003 assert( sdpisolver->sdpa != 0 );
1008 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1012 feastol = FEASTOLCHANGE * FEASTOLCHANGE * sdpisolver->sdpsolverfeastol;
1013 SCIPdebugMessage(
"Start solving process with stable settings\n");
1017 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
1018 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1019 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1020 feastol = sdpisolver->sdpsolverfeastol;
1021 SCIPdebugMessage(
"Start solving process with fast settings\n");
1025 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1027 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1028 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1030 SCIPdebugMessage(
"Start solving process with medium settings\n");
1034 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
1035 return SCIP_LPERROR;
1037 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1042 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1044 sdpisolver->sdpa->setParameterUpperBound(1e8);
1047 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1051 #ifdef SCIP_MORE_DEBUG
1052 sdpisolver->sdpa->printParameters(stdout);
1056 sdpisolver->nvarbounds = 0;
1057 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
1059 if ( sdpisolver->nvars != oldnvars )
1061 if ( sdpisolver->inputtovbmapper == NULL )
1063 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * sdpisolver->nvars) );
1067 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * oldnvars, 2 * sdpisolver->nvars) );
1070 assert( sdpisolver->inputtovbmapper != NULL );
1073 for (i = 0; i < 2 * sdpisolver->nvars; i++)
1074 sdpisolver->inputtovbmapper[i] = -1;
1076 if ( sdpisolver->nactivevars != oldnactivevars )
1078 if ( sdpisolver->varboundpos == NULL )
1080 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
1084 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
1087 assert( sdpisolver->varboundpos != NULL );
1089 for (i = 0; i < sdpisolver->nactivevars; i++)
1091 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
1094 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
1095 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
1096 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i]] = sdpisolver->nvarbounds;
1097 (sdpisolver->nvarbounds)++;
1101 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
1102 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
1103 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i] + 1] = sdpisolver->nvarbounds;
1104 (sdpisolver->nvarbounds)++;
1108 if ( noldlpcons > 0 )
1111 if ( sdpisolver->ninputlpcons != noldlpcons )
1113 if ( sdpisolver->rowmapper == NULL )
1115 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2*noldlpcons) );
1119 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2 * sdpisolver->ninputlpcons, 2*noldlpcons) );
1122 assert( sdpisolver->rowmapper != NULL );
1125 if ( sdpisolver->nsdpalpcons != nlpcons )
1127 if ( sdpisolver->rowtoinputmapper == NULL )
1129 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * nlpcons) );
1133 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * sdpisolver->nsdpalpcons, 2 * nlpcons) );
1136 assert( sdpisolver->rowtoinputmapper != NULL );
1138 sdpisolver->ninputlpcons = noldlpcons;
1139 sdpisolver->nsdpalpcons = nlpcons;
1144 for (i = 0; i < noldlpcons; i++)
1146 if ( rownactivevars[i] >= 2 )
1150 sdpisolver->rowmapper[2*i] = pos;
1151 sdpisolver->rowtoinputmapper[pos - 1] = 2*i;
1155 sdpisolver->rowmapper[2*i] = -1;
1158 sdpisolver->rowmapper[2*i + 1] = pos;
1159 sdpisolver->rowtoinputmapper[pos - 1] = 2*i + 1;
1163 sdpisolver->rowmapper[2*i + 1] = -1;
1169 sdpisolver->rowmapper[2*i] = -1;
1170 sdpisolver->rowmapper[2*i + 1] = -1;
1174 assert( nlpineqs <= 2*nlpcons );
1180 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1181 sdpisolver->nvarbounds++;
1183 if ( sdpisolver->sdpinfo )
1184 sdpisolver->sdpa->setDisplay(stdout);
1186 sdpisolver->sdpa->setDisplay(0);
1188 #ifdef SCIP_MORE_DEBUG
1189 FILE* fpOut = fopen(
"output.tmp",
"w");
1192 sdpisolver->sdpa->setResultFile(fpOut);
1196 if ( sdpisolver->preoptimalgap >= 0.0 )
1198 if ( newlyallocated )
1200 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]),
1201 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1205 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]), oldsdpalplength,
1206 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1211 if ( penaltyparam < sdpisolver->epsilon )
1212 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
1214 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
1217 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
1218 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
1221 for (block = 0; block < nsdpblocks; block++)
1223 if ( blockindchanges[block] >= 0 )
1225 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
1226 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
1227 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
1228 (
long long) sdpblocksizes[block] - nremovedinds[block]);
1229 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
1232 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1235 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
1236 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
1237 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
1238 -(nlpineqs + sdpisolver->nvarbounds));
1241 sdpisolver->sdpa->initializeUpperTriangleSpace();
1244 for (i = 0; i < sdpisolver->nactivevars; i++)
1249 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
1250 #ifdef SCIP_MORE_DEBUG
1251 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
1252 sdpisolver->sdpatoinputmapper[i], i+1);
1255 if ( penaltyparam >= sdpisolver->epsilon )
1256 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
1260 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1261 sdpisolver->sdpa->setInitPoint(
true);
1263 sdpisolver->sdpa->setInitPoint(
false);
1271 assert( nsdpblocks > 0 );
1272 assert( sdpnblockvarnonz != NULL );
1273 assert( sdpnblockvars != NULL );
1274 assert( sdpcol != NULL );
1275 assert( sdprow != NULL );
1276 assert( sdpval != NULL );
1277 assert( sdpvar != NULL );
1278 assert( indchanges != NULL );
1279 assert( nremovedinds != NULL );
1281 for (block = 0; block < nsdpblocks; block++)
1284 if ( blockindchanges[block] == -1 )
1286 #ifdef SCIP_MORE_DEBUG
1287 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
1290 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
1292 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
1294 #ifdef SCIP_MORE_DEBUG
1295 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
1296 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
1302 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1305 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1307 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
1308 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
1310 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
1311 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
1314 #ifdef SCIP_MORE_DEBUG
1315 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
1316 sdpval[block][blockvar][k],
1317 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1318 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1319 sdpisolver->sdpcounter);
1322 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
1323 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1324 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1325 sdpval[block][blockvar][k], checkinput);
1330 if ( penaltyparam >= sdpisolver->epsilon )
1332 #ifdef SCIP_MORE_DEBUG
1333 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
1335 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1337 #ifdef SCIP_MORE_DEBUG
1338 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
1341 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
1342 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
1349 if ( sdpconstnnonz > 0 )
1351 assert( nsdpblocks > 0 );
1352 assert( sdpconstnblocknonz!= NULL );
1353 assert( sdpconstcol != NULL );
1354 assert( sdpconstrow != NULL );
1355 assert( sdpconstval != NULL );
1357 for (block = 0; block < nsdpblocks; block++)
1359 if ( blockindchanges[block] == -1 )
1361 #ifdef SCIP_MORE_DEBUG
1362 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
1364 for (k = 0; k < sdpconstnblocknonz[block]; k++)
1367 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
1369 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
1370 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
1372 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
1373 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
1376 #ifdef SCIP_MORE_DEBUG
1377 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
1378 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1379 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1380 sdpisolver->sdpcounter);
1382 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
1383 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1384 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1385 sdpconstval[block][k], checkinput);
1390 #ifdef SCIP_MORE_DEBUG
1391 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
1395 for (i = 0; i < lpnnonz; i++)
1397 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
1398 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1399 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1402 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1405 assert( rownactivevars[lprow[i]] > 0 );
1406 if ( rownactivevars[lprow[i]] > 1 )
1408 if ( lprow[i] > lastrow )
1412 if ( penaltyparam >= sdpisolver->epsilon )
1415 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1417 #ifdef SCIP_MORE_DEBUG
1418 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1419 sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], sdpisolver->sdpcounter);
1423 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1424 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], 1.0, checkinput);
1428 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1430 #ifdef SCIP_MORE_DEBUG
1431 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1432 sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
1436 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1437 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], 1.0, checkinput);
1442 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1444 #ifdef SCIP_MORE_DEBUG
1445 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1446 lpval[i], sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1449 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1450 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], lpval[i], checkinput);
1453 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1455 #ifdef SCIP_MORE_DEBUG
1456 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1457 -1 * lpval[i], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1461 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1462 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
1470 for (i = 0; i < nlpcons; i++)
1475 #ifdef SCIP_MORE_DEBUG
1476 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1479 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1480 (
long long) lpconsind, lplhs[i], checkinput);
1487 #ifdef SCIP_MORE_DEBUG
1488 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1492 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1493 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1498 assert( lpconsind == nlpineqs + 1 );
1501 #ifdef SCIP_MORE_DEBUG
1504 for (i = 0; i < lpnnonz; i++)
1507 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1509 if ( rownactivevars[lprow[i]] > 1 )
1511 if ( lprow[i] > lastrow )
1516 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1518 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1523 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"%f <= ", lplhs[ind]);
1525 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1532 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1534 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1536 assert( ind == nlpcons - 1 );
1541 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1543 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1546 if ( sdpisolver->varboundpos[i] < 0 )
1550 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1551 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1553 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1556 #ifdef SCIP_MORE_DEBUG
1557 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1558 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1559 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1561 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1562 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1567 #ifdef SCIP_MORE_DEBUG
1568 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1569 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1570 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1580 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1581 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1583 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1586 #ifdef SCIP_MORE_DEBUG
1587 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1588 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1589 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1591 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1592 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1597 #ifdef SCIP_MORE_DEBUG
1598 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1599 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1600 sdpisolver->varboundpos[i]);
1606 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1609 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1610 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1611 #ifdef SCIP_MORE_DEBUG
1612 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1617 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds);
1620 sdpisolver->sdpa->initializeUpperTriangle();
1621 sdpisolver->sdpa->initializeSolve();
1624 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1630 for (i = 1; i <= sdpisolver->nactivevars; i++)
1631 sdpisolver->sdpa->inputInitXVec((
long long) i, starty[sdpisolver->sdpatoinputmapper[i - 1]]);
1634 for (b = 0; b < nsdpblocks; b++)
1636 if ( blockindchanges[b] > -1)
1638 for (i = 0; i < startZnblocknonz[b]; i++)
1640 if ( indchanges[b][startZrow[b][i]] > -1 && indchanges[b][startZcol[b][i]] > -1 )
1642 sdpisolver->sdpa->inputInitXMat((
long long) b + 1 - blockindchanges[b], (
long long) startZrow[b][i] + 1 - indchanges[b][startZrow[b][i]],
1643 (
long long) startZcol[b][i] + 1 - indchanges[b][startZcol[b][i]], startZval[b][i]);
1650 for (i = 0; i < startZnblocknonz[nsdpblocks]; i++)
1652 assert( startZrow[nsdpblocks][i] == startZcol[nsdpblocks][i] );
1654 if ( startZrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1656 sdpaind = sdpisolver->rowmapper[startZrow[nsdpblocks][i]];
1658 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startZval[nsdpblocks][i]);
1662 varboundind = sdpisolver->inputtovbmapper[startZrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1663 if ( varboundind > -1 )
1665 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1666 nlpineqs + varboundind + 1, startZval[nsdpblocks][i]);
1672 for (b = 0; b < nsdpblocks; b++)
1674 if ( blockindchanges[b] > -1)
1676 for (i = 0; i < startXnblocknonz[b]; i++)
1678 if ( indchanges[b][startXrow[b][i]] > -1 && indchanges[b][startXcol[b][i]] > -1 )
1680 sdpisolver->sdpa->inputInitYMat((
long long) b + 1 - blockindchanges[b], (
long long) startXrow[b][i] + 1 - indchanges[b][startXrow[b][i]],
1681 (
long long) startXcol[b][i] + 1 - indchanges[b][startXcol[b][i]], startXval[b][i]);
1688 for (i = 0; i < startXnblocknonz[nsdpblocks]; i++)
1690 assert( startXrow[nsdpblocks][i] == startXcol[nsdpblocks][i] );
1692 if ( startXrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1694 sdpaind = sdpisolver->rowmapper[startXrow[nsdpblocks][i]];
1696 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startXval[nsdpblocks][i]);
1700 varboundind = sdpisolver->inputtovbmapper[startXrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1701 if ( varboundind > -1 )
1703 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1704 nlpineqs + varboundind + 1, startXval[nsdpblocks][i]);
1709 else if ( penaltyparam >= sdpisolver->epsilon )
1710 SCIPdebugMessage(
"Skipping insertion of starting point for penalty formulation.\n");
1712 #ifdef SCIP_DEBUG_PRINTTOFILE
1714 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1715 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1718 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1727 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->preoptimalgap);
1728 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->preoptimalgap);
1729 sdpisolver->sdpa->solve();
1734 SCIPdebugMessage(
"Saving preoptimal solution for warmstarting purposes\n");
1735 sdpasol = sdpisolver->sdpa->getResultXVec();
1738 for (i = 0; i < sdpisolver->nactivevars; i++)
1739 sdpisolver->preoptimalsol[i] = sdpasol[i];
1742 for (b = 0; b < sdpisolver->sdpa->getBlockNumber(); b++)
1744 sdpasol = sdpisolver->sdpa->getResultYMat(b + 1);
1745 sdpablocksize = sdpisolver->sdpa->getBlockSize(b + 1);
1746 if ( sdpisolver->sdpa->getBlockType(b + 1) == SDPA::LP )
1749 for (i = 0; i < sdpablocksize; i++)
1750 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1755 for (i = 0; i < sdpablocksize * sdpablocksize; i++)
1756 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1760 sdpisolver->preoptimalsolexists = TRUE;
1764 SCIPdebugMessage(
"Solving to gaptol failed! No preoptimal solution available.\n");
1768 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1771 sdpisolver->sdpa->setInitPoint(
true);
1772 sdpisolver->sdpa->copyCurrentToInit();
1773 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1774 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1775 sdpisolver->sdpa->solve();
1778 sdpisolver->sdpa->solve();
1780 sdpisolver->solved = TRUE;
1783 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1784 sdpisolver->nsdpcalls += 1;
1788 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1789 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1795 else if ( penaltyparam >= sdpisolver->epsilon )
1800 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1801 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1802 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1809 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1812 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1813 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1814 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1815 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1818 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1820 sdpisolver->sdpa->setParameterUpperBound(1e8);
1823 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1825 #ifdef SCIP_MORE_DEBUG
1826 sdpisolver->sdpa->printParameters(stdout);
1828 sdpisolver->sdpa->setInitPoint(
false);
1829 #ifdef SDPA_RESETPARAMS
1830 sdpisolver->sdpa->resetParameters();
1832 sdpisolver->sdpa->initializeSolve();
1834 sdpisolver->sdpa->solve();
1835 sdpisolver->solved = TRUE;
1838 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1839 sdpisolver->nsdpcalls += 1;
1847 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1848 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1853 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1854 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1855 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1862 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1865 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1868 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1871 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1873 sdpisolver->sdpa->setParameterUpperBound(1e8);
1876 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1878 #ifdef SCIP_MORE_DEBUG
1879 sdpisolver->sdpa->printParameters(stdout);
1881 sdpisolver->sdpa->setInitPoint(
false);
1882 #ifdef SDPA_RESETPARAMS
1883 sdpisolver->sdpa->resetParameters();
1885 sdpisolver->sdpa->initializeSolve();
1887 sdpisolver->sdpa->solve();
1888 sdpisolver->solved = TRUE;
1891 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1892 sdpisolver->nsdpcalls += 1;
1900 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1901 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1906 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1907 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1908 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1911 #ifdef SCIP_MORE_DEBUG
1912 (void) fclose(fpOut);
1916 if ( penaltyparam >= sdpisolver->epsilon )
1922 SCIP_Real trace = 0.0;
1925 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1927 sdpasol = sdpisolver->sdpa->getResultXVec();
1930 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1935 sdpisolver->feasorig = *feasorig;
1939 if ( ! *feasorig && penaltybound != NULL )
1943 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1948 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1949 for (b = 1; b <= nblockssdpa; b++)
1952 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1953 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1954 assert( nrow >= 0 );
1957 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1960 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1966 for (i = 0; i < nrow; i++)
1967 trace += X[i + i*nrow];
1974 if ( penaltybound != NULL )
1975 *penaltybound = TRUE;
1976 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1977 trace, penaltyparam);
1979 else if ( penaltybound != NULL )
1980 *penaltybound = FALSE;
2006 assert( sdpisolver != NULL );
2007 return sdpisolver->solved;
2020 SDPA::PhaseType phasetype;
2022 assert( sdpisolver != NULL );
2023 assert( sdpisolver->sdpa != NULL);
2026 phasetype = sdpisolver->sdpa->getPhaseValue();
2028 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2037 SCIP_Bool* primalfeasible,
2038 SCIP_Bool* dualfeasible
2041 SDPA::PhaseType phasetype;
2043 assert( sdpisolver != NULL );
2044 assert( sdpisolver->sdpa != NULL );
2045 assert( primalfeasible != NULL );
2046 assert( dualfeasible != NULL );
2049 phasetype = sdpisolver->sdpa->getPhaseValue();
2051 switch ( phasetype )
2054 *primalfeasible = TRUE;
2055 *dualfeasible = TRUE;
2058 *primalfeasible = TRUE;
2059 *dualfeasible = TRUE;
2061 case SDPA::pFEAS_dINF:
2062 *primalfeasible = TRUE;
2063 *dualfeasible = FALSE;
2065 case SDPA::pINF_dFEAS:
2066 *primalfeasible = FALSE;
2067 *dualfeasible = TRUE;
2070 *primalfeasible = TRUE;
2071 *dualfeasible = FALSE;
2072 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
2075 *primalfeasible = FALSE;
2076 *dualfeasible = TRUE;
2077 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
2080 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
2081 return SCIP_LPERROR;
2093 SDPA::PhaseType phasetype;
2095 assert( sdpisolver != NULL );
2096 assert( sdpisolver->sdpa != NULL );
2099 phasetype = sdpisolver->sdpa->getPhaseValue();
2101 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2103 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
2106 else if ( phasetype == SDPA::pFEAS_dINF )
2108 else if ( phasetype == SDPA::pUNBD )
2110 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2123 SDPA::PhaseType phasetype;
2125 assert( sdpisolver != NULL );
2126 assert( sdpisolver->sdpa != NULL );
2129 phasetype = sdpisolver->sdpa->getPhaseValue();
2131 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2133 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
2136 else if ( phasetype == SDPA::pINF_dFEAS )
2138 else if ( phasetype == SDPA::dUNBD )
2140 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2153 SDPA::PhaseType phasetype;
2155 assert( sdpisolver != NULL );
2156 assert( sdpisolver->sdpa != NULL );
2159 phasetype = sdpisolver->sdpa->getPhaseValue();
2161 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2163 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2166 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
2168 else if ( phasetype == SDPA::dUNBD )
2170 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2183 SDPA::PhaseType phasetype;
2185 assert( sdpisolver != NULL );
2186 assert( sdpisolver->sdpa != NULL);
2189 phasetype = sdpisolver->sdpa->getPhaseValue();
2191 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2193 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
2196 else if ( phasetype == SDPA::pINF_dFEAS )
2198 else if ( phasetype == SDPA::dUNBD )
2200 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2213 SDPA::PhaseType phasetype;
2215 assert( sdpisolver != NULL );
2216 assert( sdpisolver->sdpa != NULL);
2219 phasetype = sdpisolver->sdpa->getPhaseValue();
2221 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2223 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
2226 else if ( phasetype == SDPA::pFEAS_dINF )
2228 else if ( phasetype == SDPA::pUNBD )
2230 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2243 SDPA::PhaseType phasetype;
2245 assert( sdpisolver != NULL );
2246 assert( sdpisolver->sdpa != NULL);
2249 phasetype = sdpisolver->sdpa->getPhaseValue();
2251 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2253 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2256 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2258 else if ( phasetype == SDPA::dUNBD )
2260 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2272 SDPA::PhaseType phasetype;
2274 assert( sdpisolver != NULL );
2275 assert( sdpisolver->sdpa != NULL );
2278 phasetype = sdpisolver->sdpa->getPhaseValue();
2280 if ( phasetype == SDPA::pdOPT )
2291 SDPA::PhaseType phasetype;
2293 assert( sdpisolver != NULL );
2294 assert( sdpisolver->sdpa != NULL );
2297 phasetype = sdpisolver->sdpa->getPhaseValue();
2299 if ( phasetype == SDPA::pUNBD )
2310 SDPA::PhaseType phasetype;
2312 assert( sdpisolver != NULL );
2313 assert( sdpisolver->sdpa != NULL);
2316 phasetype = sdpisolver->sdpa->getPhaseValue();
2318 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2320 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
2332 assert( sdpisolver != NULL );
2334 return sdpisolver->timelimit;
2351 SDPA::PhaseType phasetype;
2353 assert( sdpisolver != NULL );
2354 assert( sdpisolver->sdpa != NULL );
2356 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
2359 phasetype = sdpisolver->sdpa->getPhaseValue();
2361 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
2363 if ( phasetype == SDPA::pdINF )
2365 if ( phasetype == SDPA::pUNBD )
2367 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2378 SDPA::PhaseType phasetype;
2380 assert( sdpisolver != NULL );
2381 assert( sdpisolver->sdpa != NULL );
2383 if ( ! sdpisolver->solved )
2386 phasetype = sdpisolver->sdpa->getPhaseValue();
2388 if ( phasetype == SDPA::pdOPT )
2400 SDPA::PhaseType phasetype;
2402 assert( sdpisolver != NULL );
2403 assert( sdpisolver->sdpa != NULL );
2405 if ( sdpisolver->timelimit )
2408 if ( ! sdpisolver->solved )
2411 phasetype = sdpisolver->sdpa->getPhaseValue();
2415 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
2427 SCIPdebugMessage(
"Not implemented yet\n");
2429 return SCIP_LPERROR;
2438 assert( sdpisolver != NULL );
2439 assert( sdpisolver->sdpa != NULL );
2440 assert( objval != NULL );
2443 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2445 *objval = sdpisolver->sdpa->getPrimalObj();
2447 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2448 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2449 if ( gap > sdpisolver->gaptol )
2451 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2452 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2463 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2464 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2465 sdpasol = sdpisolver->sdpa->getResultXVec();
2468 for (v = 0; v < sdpisolver->nactivevars; v++)
2469 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2473 *objval += sdpisolver->fixedvarsobjcontr;
2493 assert( sdpisolver != NULL );
2494 assert( sdpisolver->sdpa != NULL );
2495 assert( dualsollength != NULL );
2498 if ( objval != NULL )
2500 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2502 *objval = sdpisolver->sdpa->getPrimalObj();
2504 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2505 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2506 if ( gap > sdpisolver->gaptol )
2508 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2509 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2517 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2518 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2519 sdpasol = sdpisolver->sdpa->getResultXVec();
2522 for (v = 0; v < sdpisolver->nactivevars; v++)
2523 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2527 *objval += sdpisolver->fixedvarsobjcontr;
2530 if ( *dualsollength > 0 )
2532 assert( dualsol != NULL );
2533 if ( *dualsollength < sdpisolver->nvars )
2535 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2536 *dualsollength = sdpisolver->nvars;
2542 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2543 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2544 sdpasol = sdpisolver->sdpa->getResultXVec();
2546 for (v = 0; v < sdpisolver->nvars; v++)
2548 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2551 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2556 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2557 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2568 int* startXnblocknonz
2580 assert( sdpisolver != NULL );
2581 assert( nblocks > 0 );
2582 assert( startXnblocknonz != NULL );
2585 if ( ! sdpisolver->preoptimalsolexists )
2587 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2588 startXnblocknonz[0] = -1;
2592 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2594 SCIPerrorMessage(
"SCIPsdpiSolverGetPreoptimalPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2595 return SCIP_LPERROR;
2599 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2601 sdpablock = sdpisolver->inputtoblockmapper[b];
2603 startXnblocknonz[b] = 0;
2605 if ( sdpablock != -1 )
2607 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2610 for (r = 0; r < blocksize; r++)
2612 for (c = r; c < blocksize; c++)
2614 sdpaind = r + blocksize * c;
2616 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2617 startXnblocknonz[b]++;
2624 startXnblocknonz[nblocks - 1] = 0;
2625 sdpablock = sdpisolver->sdpa->getBlockNumber();
2627 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2629 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2631 for (i = 0; i < blocksize; i++)
2633 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2634 startXnblocknonz[b]++;
2656 int* startXnblocknonz,
2660 SCIP_Real** startXval
2671 SCIP_Bool msgthrown;
2673 assert( sdpisolver != NULL );
2674 assert( success != NULL );
2675 assert( dualsol != NULL );
2676 assert( dualsollength != NULL );
2677 assert( *dualsollength >= 0 );
2678 assert( startXnblocknonz != NULL || nblocks == -1 );
2679 assert( startXrow != NULL || nblocks == -1 );
2680 assert( startXcol != NULL || nblocks == -1 );
2681 assert( startXval != NULL || nblocks == -1 );
2683 if ( ! sdpisolver->preoptimalsolexists )
2685 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2690 if ( *dualsollength < sdpisolver->nvars )
2692 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2694 *dualsollength = sdpisolver->nvars;
2698 for (v = 0; v < sdpisolver->nvars; v++)
2700 if (sdpisolver->inputtosdpamapper[v] > 0)
2703 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtosdpamapper[v] - 1];
2708 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2712 *dualsollength = sdpisolver->nvars;
2717 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2719 sdpablock = sdpisolver->inputtoblockmapper[b];
2723 if ( sdpablock != -1 )
2726 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2730 for (r = 0; r < blocksize; r++)
2732 for (c = r; c < blocksize; c++)
2734 sdpaind = r + blocksize * c;
2736 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2738 if ( blocknnonz < startXnblocknonz[b] )
2740 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2741 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2742 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind];
2749 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2757 startXnblocknonz[b] = blocknnonz;
2760 startXnblocknonz[b] = 0;
2767 sdpablock = sdpisolver->sdpa->getBlockNumber();
2769 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2774 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2777 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
2779 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2781 if ( blocknnonz < startXnblocknonz[b] )
2783 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2784 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2785 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2793 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2801 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
2803 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2805 if ( blocknnonz < startXnblocknonz[b] )
2810 vbpos = i - (blocksize - sdpisolver->nvarbounds);
2813 if ( sdpisolver->varboundpos[vbpos] > 0 )
2814 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
2816 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
2817 startXrow[b][blocknnonz] = inputpos;
2818 startXcol[b][blocknnonz] = inputpos;
2819 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2827 SCIPdebugMessage(
"Insufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2833 startXnblocknonz[b] = blocknnonz;
2836 startXnblocknonz[b] = 0;
2864 assert( sdpisolver != NULL );
2865 assert( sdpisolver->sdpa != NULL );
2866 assert( lbvars != NULL );
2867 assert( ubvars != NULL );
2868 assert( arraylength != NULL );
2869 assert( *arraylength >= 0 );
2873 if ( *arraylength < sdpisolver->nvars )
2875 *arraylength = sdpisolver->nvars;
2876 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2881 for (i = 0; i < sdpisolver->nvars; i++)
2888 if ( sdpisolver->nvarbounds == 0 )
2890 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
2895 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2896 if ( ! (sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP) )
2903 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
2904 assert( nlpcons >= 0 );
2906 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
2909 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2911 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
2913 if ( sdpisolver->varboundpos[i] < 0 )
2917 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2923 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2934 int* startXnblocknonz
2946 assert( sdpisolver != NULL );
2947 assert( nblocks > 0 );
2948 assert( startXnblocknonz != NULL );
2951 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2953 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2954 return SCIP_LPERROR;
2958 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2960 sdpablock = sdpisolver->inputtoblockmapper[b];
2962 startXnblocknonz[b] = 0;
2964 if ( sdpablock != -1 )
2966 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2967 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2970 for (r = 0; r < blocksize; r++)
2972 for (c = r; c < blocksize; c++)
2974 sdpaind = r + blocksize * c;
2976 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2977 startXnblocknonz[b]++;
2984 startXnblocknonz[nblocks - 1] = 0;
2985 sdpablock = sdpisolver->sdpa->getBlockNumber();
2987 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2989 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2990 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2992 for (i = 0; i < blocksize; i++)
2994 if ( REALABS(X[i]) > sdpisolver->epsilon )
2995 startXnblocknonz[b]++;
3009 int* startXnblocknonz,
3013 SCIP_Real** startXval
3024 SCIP_Bool msgthrown;
3026 assert( sdpisolver != NULL );
3027 assert( nblocks > 0 );
3028 assert( startXnblocknonz != NULL );
3029 assert( startXrow != NULL );
3030 assert( startXcol != NULL );
3031 assert( startXval != NULL );
3036 if ( nblocks != sdpisolver->nsdpblocks + 1 )
3038 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
3039 return SCIP_LPERROR;
3043 for (b = 0; b < sdpisolver->nsdpblocks; b++)
3045 sdpablock = sdpisolver->inputtoblockmapper[b];
3049 if ( sdpablock != -1 )
3051 X = sdpisolver->sdpa->getResultYMat(sdpablock);
3052 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3056 for (r = 0; r < blocksize; r++)
3058 for (c = r; c < blocksize; c++)
3060 sdpaind = r + blocksize * c;
3062 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
3064 if ( blocknnonz < startXnblocknonz[b] )
3066 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
3067 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
3068 startXval[b][blocknnonz] = X[sdpaind];
3075 SCIPdebugMessage(
"Insufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
3083 startXnblocknonz[b] = blocknnonz;
3086 startXnblocknonz[b] = 0;
3091 sdpablock = sdpisolver->sdpa->getBlockNumber();
3093 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3097 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3098 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3101 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
3103 if ( REALABS(X[i]) > sdpisolver->epsilon )
3105 if ( blocknnonz < startXnblocknonz[b] )
3107 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3108 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3109 startXval[b][blocknnonz] = X[i];
3117 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3125 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
3127 if ( REALABS(X[i]) > sdpisolver->epsilon )
3129 if ( blocknnonz < startXnblocknonz[b] )
3134 vbpos = i - (blocksize - sdpisolver->nvarbounds);
3137 if ( sdpisolver->varboundpos[vbpos] > 0 )
3138 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
3140 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
3141 startXrow[b][blocknnonz] = inputpos;
3142 startXcol[b][blocknnonz] = inputpos;
3143 startXval[b][blocknnonz] = X[i];
3151 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3157 startXnblocknonz[b] = blocknnonz;
3160 startXnblocknonz[b] = 0;
3178 assert( sdpisolver != NULL );
3179 assert( sdpisolver->sdpa != NULL );
3181 nblocks = (int) sdpisolver->sdpa->getBlockNumber();
3185 for (b = 0; b < nblocks; b++)
3188 blocksize = (int) sdpisolver->sdpa->getBlockSize((
long long) b + 1);
3189 arraylength = sdpisolver->sdpa->getBlockType((
long long) b + 1) == SDPA::LP ? blocksize : (blocksize * (blocksize + 1) / 2);
3192 X = sdpisolver->sdpa->getResultYMat((
long long) b + 1);
3193 for (i = 0; i < arraylength; i++)
3195 if ( X[i] > maxentry )
3209 assert( sdpisolver != NULL );
3210 assert( sdpisolver->sdpa != NULL );
3211 assert( iterations != NULL );
3213 *iterations = sdpisolver->niterations;
3224 assert( sdpisolver != NULL );
3225 assert( sdpisolver->sdpa != NULL );
3226 assert( calls != NULL );
3228 *calls = sdpisolver->nsdpcalls;
3239 assert( sdpisolver != NULL );
3240 assert( usedsetting != NULL );
3243 *usedsetting = sdpisolver->usedsetting;
3284 assert( sdpisolver != NULL );
3285 assert( dval != NULL );
3290 *dval = sdpisolver->epsilon;
3293 *dval = sdpisolver->gaptol;
3296 *dval = sdpisolver->feastol;
3299 *dval = sdpisolver->sdpsolverfeastol;
3303 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3306 *dval = sdpisolver->objlimit;
3309 *dval = sdpisolver->lambdastar;
3312 *dval = sdpisolver->preoptimalgap;
3315 return SCIP_PARAMETERUNKNOWN;
3328 assert( sdpisolver != NULL );
3333 sdpisolver->epsilon = dval;
3334 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
3337 sdpisolver->gaptol = dval;
3338 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
3341 sdpisolver->feastol = dval;
3342 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
3345 sdpisolver->sdpsolverfeastol = dval;
3346 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
3349 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3352 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
3353 sdpisolver->objlimit = dval;
3356 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
3357 sdpisolver->lambdastar = dval;
3360 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
3361 sdpisolver->preoptimalgap = dval;
3364 return SCIP_PARAMETERUNKNOWN;
3377 assert( sdpisolver != NULL );
3382 *ival = (int) sdpisolver->sdpinfo;
3383 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
3386 return SCIP_PARAMETERUNKNOWN;
3399 assert( sdpisolver != NULL );
3404 sdpisolver->sdpinfo = (SCIP_Bool) ival;
3405 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
3408 return SCIP_PARAMETERUNKNOWN;
3422 assert( sdpisolver != NULL );
3427 #ifdef LAMBDASTAR_TWOPOINTS
3448 sdpisolver->lambdastar = compval;
3449 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
3459 SCIP_Real* penaltyparam
3464 assert( sdpisolver != NULL );
3465 assert( penaltyparam != NULL );
3481 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
3482 *penaltyparam = compval;
3490 SCIP_Real penaltyparam,
3491 SCIP_Real* maxpenaltyparam
3496 assert( sdpisolver != NULL );
3497 assert( maxpenaltyparam != NULL );
3503 *maxpenaltyparam = compval;
3504 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
3533 SCIPdebugMessage(
"Not implemented yet\n");
3534 return SCIP_LPERROR;
3543 assert( fname != NULL );
3545 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
const char * SCIPsdpiSolverGetSolverName(void)
static SCIP_RETCODE checkFeastolAndResolve(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, int nvars, 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 nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *feastol)
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)
#define INFEASFEASTOLCHANGE
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(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 *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
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_RETCODE SCIPsdpiSolverGetPrimalMatrix(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverFeastol(void)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
#define LAMBDASTAR_THRESHOLD
SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
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)
SCIP_RETCODE SCIPsdpSolcheckerCheck(BMS_BUFMEM *bufmem, int nvars, 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 nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
#define LAMBDASTAR_FACTOR
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
checks a given SDP solution for feasibility
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverGaptol(void)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success, SCIP_Real *dualsol, int *dualsollength, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
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 *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit)
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 SCIPsdpiSolverGetPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
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)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetMaxPrimalEntry(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)