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"
63 #define GAPTOLCHANGE 1
64 #define FEASTOLCHANGE 1
65 #define PENALTYBOUNDTOL 1E-3
68 #define INFEASFEASTOLCHANGE 0.1
69 #define INFEASMINFEASTOL 1E-9
71 #define MIN_LAMBDASTAR 1e0
72 #define MAX_LAMBDASTAR 1e8
73 #define LAMBDASTAR_FACTOR 1e0
74 #define LAMBDASTAR_TWOPOINTS TRUE
75 #define LAMBDASTAR_THRESHOLD 1e1
76 #define LAMBDASTAR_LOW 1.5
77 #define LAMBDASTAR_HIGH 1e5
79 #define MIN_PENALTYPARAM 1e5
80 #define MAX_PENALTYPARAM 1e12
81 #define PENALTYPARAM_FACTOR 1e1
82 #define MAX_MAXPENALTYPARAM 1e15
83 #define MAXPENALTYPARAM_FACTOR 1e6
86 #define BMS_CALL(x) do \
90 SCIPerrorMessage("No memory in function call.\n"); \
91 return SCIP_NOMEMORY; \
97 #define CHECK_IF_SOLVED(sdpisolver) do \
99 if (!(sdpisolver->solved)) \
101 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
102 return SCIP_LPERROR; \
108 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
110 if (!(sdpisolver->solved)) \
112 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
120 struct SCIP_SDPiSolver
122 SCIP_MESSAGEHDLR* messagehdlr;
128 int* inputtosdpamapper;
131 int* sdpatoinputmapper;
132 SCIP_Real* fixedvarsval;
133 SCIP_Real fixedvarsobjcontr;
138 int* inputtovbmapper;
144 int* rowtoinputmapper;
145 int* inputtoblockmapper;
146 int** blockindmapper;
155 SCIP_Real sdpsolverfeastol;
163 SCIP_Real lambdastar;
164 SCIP_Real* preoptimalsol;
165 SCIP_Real** preoptimalsolx;
166 SCIP_Bool preoptimalsolexists;
167 SCIP_Real preoptimalgap;
184 assert( sdpisolver != NULL );
185 assert( lb < ub + sdpisolver->feastol );
187 return (ub-lb <= sdpisolver->epsilon);
190 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
198 SCIP_Real penaltyparam,
206 int* sdpconstnblocknonz,
210 SCIP_Real** sdpconstval,
212 int** sdpnblockvarnonz,
222 int* blockindchanges,
236 char phase_string[15];
239 assert( feastol != NULL );
243 SCIP_Real* solvector;
245 SCIP_Bool infeasible;
248 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
249 nvarspointer = nvars;
251 assert( nvarspointer == nvars );
254 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
255 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
256 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
257 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
259 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
263 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
270 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
272 #ifdef SCIP_MORE_DEBUG
273 sdpisolver->sdpa->printParameters(stdout);
275 sdpisolver->sdpa->setInitPoint(
false);
276 #ifdef SDPA_RESETPARAMS
277 sdpisolver->sdpa->resetParameters();
279 sdpisolver->sdpa->initializeSolve();
281 sdpisolver->sdpa->solve();
284 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
285 sdpisolver->nsdpcalls += 1;
289 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
290 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
295 sdpisolver->solved = FALSE;
296 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
326 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
339 assert( sdpisolver != NULL );
340 return (
void*) sdpisolver->sdpa;
388 SCIP_MESSAGEHDLR* messagehdlr,
393 assert( sdpisolver != NULL );
394 assert( blkmem != NULL );
395 assert( bufmem != NULL );
397 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
399 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
401 (*sdpisolver)->messagehdlr = messagehdlr;
402 (*sdpisolver)->blkmem = blkmem;
403 (*sdpisolver)->bufmem = bufmem;
406 (*sdpisolver)->sdpa = NULL;
408 (*sdpisolver)->nvars = 0;
409 (*sdpisolver)->nactivevars = 0;
410 (*sdpisolver)->nsdpblocks = 0;
411 (*sdpisolver)->inputtosdpamapper = NULL;
412 (*sdpisolver)->sdpatoinputmapper = NULL;
413 (*sdpisolver)->inputtoblockmapper = NULL;
414 (*sdpisolver)->blockindmapper = NULL;
415 (*sdpisolver)->rowmapper = NULL;
416 (*sdpisolver)->rowtoinputmapper = NULL;
417 (*sdpisolver)->fixedvarsval = NULL;
418 (*sdpisolver)->fixedvarsobjcontr = 0.0;
419 (*sdpisolver)->objcoefs = NULL;
420 (*sdpisolver)->nvarbounds = 0;
421 (*sdpisolver)->varboundpos = NULL;
422 (*sdpisolver)->inputtovbmapper = NULL;
423 (*sdpisolver)->solved = FALSE;
424 (*sdpisolver)->timelimit = FALSE;
425 (*sdpisolver)->sdpcounter = 0;
426 (*sdpisolver)->niterations = 0;
427 (*sdpisolver)->nsdpcalls = 0;
428 (*sdpisolver)->ninputlpcons = 0;
429 (*sdpisolver)->nsdpalpcons = 0;
431 (*sdpisolver)->epsilon = 1e-9;
432 (*sdpisolver)->gaptol = 1e-4;
433 (*sdpisolver)->feastol = 1e-6;
434 (*sdpisolver)->sdpsolverfeastol = 1e-6;
436 (*sdpisolver)->sdpinfo = FALSE;
439 (*sdpisolver)->preoptimalsolexists = FALSE;
440 (*sdpisolver)->preoptimalgap = -1.0;
454 assert( sdpisolver != NULL );
455 assert( *sdpisolver != NULL );
457 SCIPdebugMessage(
"Freeing SDPISolver\n");
459 if ( (*sdpisolver)->sdpa != NULL )
461 nsdpblocks = (*sdpisolver)->sdpa->getBlockType((*sdpisolver)->sdpa->getBlockNumber()) == SDPA::LP ?
462 (*sdpisolver)->sdpa->getBlockNumber() - 1 : (*sdpisolver)->sdpa->getBlockNumber();
463 for (b = 0; b < nsdpblocks; b++)
465 blocksize = (*sdpisolver)->sdpa->getBlockSize(b + 1);
467 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->blockindmapper[b]), blocksize);
470 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
472 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[b]), blocksize * blocksize);
476 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
478 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[nsdpblocks + 1]), 2 * (*sdpisolver)->nsdpalpcons + (*sdpisolver)->nvarbounds);
479 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolx, nsdpblocks + 1);
481 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->blockindmapper, nsdpblocks);
485 if ( (*sdpisolver)->sdpa != NULL)
486 delete (*sdpisolver)->sdpa;
488 if ( (*sdpisolver)->nactivevars > 0 && (*sdpisolver)->preoptimalgap > 0.0 )
490 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
493 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtoblockmapper, (*sdpisolver)->nsdpblocks);
495 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowtoinputmapper, 2 * (*sdpisolver)->nsdpalpcons);
497 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowmapper, 2 * (*sdpisolver)->ninputlpcons);
499 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
501 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtovbmapper, 2 * (*sdpisolver)->nvars);
503 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
505 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
507 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
509 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
511 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
521 assert( sdpisolver != NULL );
523 sdpisolver->sdpcounter++;
533 assert( sdpisolver != NULL );
535 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
536 sdpisolver->sdpcounter = 0;
576 int* sdpconstnblocknonz,
580 SCIP_Real** sdpconstval,
582 int** sdpnblockvarnonz,
592 int* blockindchanges,
598 int* lprownactivevars,
604 int* startZnblocknonz,
610 SCIP_Real** startZval,
612 int* startXnblocknonz,
618 SCIP_Real** startXval,
625 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
626 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
627 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval,
628 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
629 timelimit, NULL, NULL);
656 SCIP_Real penaltyparam,
667 int* sdpconstnblocknonz,
671 SCIP_Real** sdpconstval,
673 int** sdpnblockvarnonz,
683 int* blockindchanges,
695 int* startZnblocknonz,
701 SCIP_Real** startZval,
703 int* startXnblocknonz,
709 SCIP_Real** startXval,
716 SCIP_Bool* penaltybound
721 SCIP_Real* sdpavarbounds;
739 SCIP_Bool newlyallocated;
742 char phase_string[15];
745 assert( sdpisolver != NULL );
746 assert( penaltyparam > -1 * sdpisolver->epsilon );
747 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
749 assert( obj != NULL );
750 assert( lb != NULL );
751 assert( ub != NULL );
752 assert( nsdpblocks >= 0 );
753 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
754 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
755 assert( sdpconstnnonz >= 0 );
756 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
757 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
758 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
759 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
760 assert( sdpnnonz >= 0 );
761 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
762 assert( nsdpblocks == 0 || sdpvar != NULL );
763 assert( nsdpblocks == 0 || sdprow != NULL );
764 assert( nsdpblocks == 0 || sdpcol != NULL );
765 assert( nsdpblocks == 0 || sdpval != NULL );
766 assert( nsdpblocks == 0 || indchanges != NULL );
767 assert( nsdpblocks == 0 || nremovedinds != NULL );
768 assert( nsdpblocks == 0 || blockindchanges != NULL );
769 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
770 assert( nlpcons >= 0 );
771 assert( noldlpcons >= nlpcons );
772 assert( nlpcons == 0 || lplhs != NULL );
773 assert( nlpcons == 0 || lprhs != NULL );
774 assert( nlpcons == 0 || rownactivevars != NULL );
775 assert( lpnnonz >= 0 );
776 assert( nlpcons == 0 || lprow != NULL );
777 assert( nlpcons == 0 || lpcol != NULL );
778 assert( nlpcons == 0 || lpval != NULL );
779 assert( startZnblocknonz == NULL || startZrow != NULL );
780 assert( startZnblocknonz == NULL || startZcol != NULL );
781 assert( startZnblocknonz == NULL || startZval != NULL );
782 assert( startXnblocknonz == NULL || startXrow != NULL );
783 assert( startXnblocknonz == NULL || startXcol != NULL );
784 assert( startXnblocknonz == NULL || startXval != NULL );
786 sdpisolver->niterations = 0;
787 sdpisolver->nsdpcalls = 0;
788 sdpisolver->feasorig = FALSE;
791 if ( timelimit <= 0.0 )
793 sdpisolver->solved = FALSE;
794 sdpisolver->timelimit = TRUE;
798 sdpisolver->timelimit = FALSE;
810 if ( penaltyparam < sdpisolver->epsilon )
811 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
813 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
816 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
817 sdpisolver->rbound = rbound;
821 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
822 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
823 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
824 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
826 oldnvars = sdpisolver->nvars;
827 oldnactivevars = sdpisolver->nactivevars;
828 oldsdpalplength = 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds;
829 sdpisolver->nvars = nvars;
830 sdpisolver->nactivevars = 0;
834 sdpisolver->fixedvarsobjcontr = 0.0;
835 for (i = 0; i < nvars; i++)
837 if (
isFixed(sdpisolver, lb[i], ub[i]) )
839 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
840 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
842 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
843 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
847 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
848 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
849 sdpisolver->nactivevars++;
850 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
851 #ifdef SCIP_MORE_DEBUG
852 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
856 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
860 sdpisolver->fixedvarsobjcontr = 0.0;
863 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
864 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
865 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
868 if ( nsdpblocks != sdpisolver->nsdpblocks )
870 if ( sdpisolver->inputtoblockmapper == NULL )
872 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), nsdpblocks) );
876 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), sdpisolver->nsdpblocks, nsdpblocks) );
881 if ( sdpisolver->nactivevars != oldnactivevars && sdpisolver->preoptimalgap >= 0.0 )
883 if ( oldnactivevars == 0 )
885 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
889 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
892 sdpisolver->preoptimalsolexists = FALSE;
894 sdpisolver->nsdpblocks = nsdpblocks;
897 if ( sdpisolver->sdpa == NULL )
903 nsdpasdpblocks = (sdpisolver->sdpa->getBlockType(sdpisolver->sdpa->getBlockNumber()) == SDPA::LP ?
904 sdpisolver->sdpa->getBlockNumber() - 1 : sdpisolver->sdpa->getBlockNumber());
908 if ( nsdpblocks - nremovedblocks != nsdpasdpblocks )
910 if ( sdpisolver->blockindmapper == NULL )
912 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper), nsdpblocks - nremovedblocks) );
913 newlyallocated = TRUE;
914 if ( sdpisolver->preoptimalgap >= 0.0 )
917 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx), nsdpblocks - nremovedblocks + 1) );
924 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
926 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->blockindmapper[block]), sdpisolver->sdpa->getBlockSize(block + 1));
928 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper),
929 nsdpasdpblocks, nsdpblocks - nremovedblocks) );
930 newlyallocated = FALSE;
932 if ( sdpisolver->preoptimalgap >= 0.0 )
935 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
937 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[block]), sdpisolver->sdpa->getBlockSize(block + 1));
939 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx),
940 nsdpasdpblocks, nsdpblocks - nremovedblocks + 1) );
945 newlyallocated = FALSE;
949 for (block = 0; block < nsdpblocks; block++)
951 if ( blockindchanges[block] > -1 )
953 sdpisolver->inputtoblockmapper[block] = ind + 1;
956 if ( newlyallocated )
958 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]), sdpblocksizes[block] - nremovedinds[block]) );
959 if ( sdpisolver->preoptimalgap >= 0.0 )
961 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
962 (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
965 else if ( (
long long) (sdpblocksizes[block] - nremovedinds[block]) != sdpisolver->sdpa->getBlockSize(ind + 1) )
967 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]),
968 (
int) sdpisolver->sdpa->getBlockSize(ind + 1), sdpblocksizes[block] - nremovedinds[block]) );
969 if ( sdpisolver->preoptimalgap >= 0.0 )
971 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
972 (
int) sdpisolver->sdpa->getBlockSize(ind + 1) * sdpisolver->sdpa->getBlockSize(ind + 1), (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
977 for (i = 0; i < sdpblocksizes[block]; i++)
979 if ( indchanges[ind][i] > -1 )
981 sdpisolver->blockindmapper[ind][blockind] = i;
982 assert( i - indchanges[ind][i] == blockind );
986 assert( blockind == sdpblocksizes[block] - nremovedinds[block] );
990 sdpisolver->inputtoblockmapper[block] = -1;
994 if ( sdpisolver->sdpa != 0 )
997 delete sdpisolver->sdpa;
998 sdpisolver->sdpa =
new SDPA();
1001 sdpisolver->sdpa =
new SDPA();
1002 assert( sdpisolver->sdpa != 0 );
1007 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1011 feastol = FEASTOLCHANGE * FEASTOLCHANGE * sdpisolver->sdpsolverfeastol;
1012 SCIPdebugMessage(
"Start solving process with stable settings\n");
1016 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
1017 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1018 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1019 feastol = sdpisolver->sdpsolverfeastol;
1020 SCIPdebugMessage(
"Start solving process with fast settings\n");
1024 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1026 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1027 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1029 SCIPdebugMessage(
"Start solving process with medium settings\n");
1033 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
1034 return SCIP_LPERROR;
1036 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1041 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1043 sdpisolver->sdpa->setParameterUpperBound(1e8);
1046 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1050 #ifdef SCIP_MORE_DEBUG
1051 sdpisolver->sdpa->printParameters(stdout);
1055 sdpisolver->nvarbounds = 0;
1056 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
1058 if ( sdpisolver->nvars != oldnvars )
1060 if ( sdpisolver->inputtovbmapper == NULL )
1062 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * sdpisolver->nvars) );
1066 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * oldnvars, 2 * sdpisolver->nvars) );
1069 assert( sdpisolver->inputtovbmapper != NULL );
1072 for (i = 0; i < 2 * sdpisolver->nvars; i++)
1073 sdpisolver->inputtovbmapper[i] = -1;
1075 if ( sdpisolver->nactivevars != oldnactivevars )
1077 if ( sdpisolver->varboundpos == NULL )
1079 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
1083 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
1086 assert( sdpisolver->varboundpos != NULL );
1088 for (i = 0; i < sdpisolver->nactivevars; i++)
1090 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
1093 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
1094 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
1095 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i]] = sdpisolver->nvarbounds;
1096 (sdpisolver->nvarbounds)++;
1100 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
1101 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
1102 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i] + 1] = sdpisolver->nvarbounds;
1103 (sdpisolver->nvarbounds)++;
1107 if ( noldlpcons > 0 )
1110 if ( sdpisolver->ninputlpcons != noldlpcons )
1112 if ( sdpisolver->rowmapper == NULL )
1114 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2*noldlpcons) );
1118 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2 * sdpisolver->ninputlpcons, 2*noldlpcons) );
1121 assert( sdpisolver->rowmapper != NULL );
1124 if ( sdpisolver->nsdpalpcons != nlpcons )
1126 if ( sdpisolver->rowtoinputmapper == NULL )
1128 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * nlpcons) );
1132 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * sdpisolver->nsdpalpcons, 2 * nlpcons) );
1135 assert( sdpisolver->rowtoinputmapper != NULL );
1137 sdpisolver->ninputlpcons = noldlpcons;
1138 sdpisolver->nsdpalpcons = nlpcons;
1143 for (i = 0; i < noldlpcons; i++)
1145 if ( rownactivevars[i] >= 2 )
1149 sdpisolver->rowmapper[2*i] = pos;
1150 sdpisolver->rowtoinputmapper[pos - 1] = 2*i;
1154 sdpisolver->rowmapper[2*i] = -1;
1157 sdpisolver->rowmapper[2*i + 1] = pos;
1158 sdpisolver->rowtoinputmapper[pos - 1] = 2*i + 1;
1162 sdpisolver->rowmapper[2*i + 1] = -1;
1168 sdpisolver->rowmapper[2*i] = -1;
1169 sdpisolver->rowmapper[2*i + 1] = -1;
1173 assert( nlpineqs <= 2*nlpcons );
1179 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1180 sdpisolver->nvarbounds++;
1182 if ( sdpisolver->sdpinfo )
1183 sdpisolver->sdpa->setDisplay(stdout);
1185 sdpisolver->sdpa->setDisplay(0);
1187 #ifdef SCIP_MORE_DEBUG
1188 FILE* fpOut = fopen(
"output.tmp",
"w");
1191 sdpisolver->sdpa->setResultFile(fpOut);
1195 if ( sdpisolver->preoptimalgap >= 0.0 )
1197 if ( newlyallocated )
1199 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]),
1200 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1204 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]), oldsdpalplength,
1205 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1210 if ( penaltyparam < sdpisolver->epsilon )
1211 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
1213 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
1216 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
1217 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
1220 for (block = 0; block < nsdpblocks; block++)
1222 if ( blockindchanges[block] >= 0 )
1224 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
1225 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
1226 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
1227 (
long long) sdpblocksizes[block] - nremovedinds[block]);
1228 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
1231 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1234 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
1235 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
1236 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
1237 -(nlpineqs + sdpisolver->nvarbounds));
1240 sdpisolver->sdpa->initializeUpperTriangleSpace();
1243 for (i = 0; i < sdpisolver->nactivevars; i++)
1248 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
1249 #ifdef SCIP_MORE_DEBUG
1250 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
1251 sdpisolver->sdpatoinputmapper[i], i+1);
1254 if ( penaltyparam >= sdpisolver->epsilon )
1255 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
1259 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1260 sdpisolver->sdpa->setInitPoint(
true);
1262 sdpisolver->sdpa->setInitPoint(
false);
1270 assert( nsdpblocks > 0 );
1271 assert( sdpnblockvarnonz != NULL );
1272 assert( sdpnblockvars != NULL );
1273 assert( sdpcol != NULL );
1274 assert( sdprow != NULL );
1275 assert( sdpval != NULL );
1276 assert( sdpvar != NULL );
1277 assert( indchanges != NULL );
1278 assert( nremovedinds != NULL );
1280 for (block = 0; block < nsdpblocks; block++)
1283 if ( blockindchanges[block] == -1 )
1285 #ifdef SCIP_MORE_DEBUG
1286 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
1289 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
1291 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
1293 #ifdef SCIP_MORE_DEBUG
1294 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
1295 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
1301 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1304 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1306 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
1307 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
1309 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
1310 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
1313 #ifdef SCIP_MORE_DEBUG
1314 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
1315 sdpval[block][blockvar][k],
1316 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1317 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1318 sdpisolver->sdpcounter);
1321 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
1322 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1323 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1324 sdpval[block][blockvar][k], checkinput);
1329 if ( penaltyparam >= sdpisolver->epsilon )
1331 #ifdef SCIP_MORE_DEBUG
1332 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
1334 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1336 #ifdef SCIP_MORE_DEBUG
1337 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
1340 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
1341 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
1348 if ( sdpconstnnonz > 0 )
1350 assert( nsdpblocks > 0 );
1351 assert( sdpconstnblocknonz!= NULL );
1352 assert( sdpconstcol != NULL );
1353 assert( sdpconstrow != NULL );
1354 assert( sdpconstval != NULL );
1356 for (block = 0; block < nsdpblocks; block++)
1358 if ( blockindchanges[block] == -1 )
1360 #ifdef SCIP_MORE_DEBUG
1361 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
1363 for (k = 0; k < sdpconstnblocknonz[block]; k++)
1366 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
1368 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
1369 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
1371 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
1372 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
1375 #ifdef SCIP_MORE_DEBUG
1376 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
1377 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1378 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1379 sdpisolver->sdpcounter);
1381 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
1382 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1383 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1384 sdpconstval[block][k], checkinput);
1389 #ifdef SCIP_MORE_DEBUG
1390 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
1394 for (i = 0; i < lpnnonz; i++)
1396 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
1397 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1398 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1401 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1404 assert( rownactivevars[lprow[i]] > 0 );
1405 if ( rownactivevars[lprow[i]] > 1 )
1407 if ( lprow[i] > lastrow )
1411 if ( penaltyparam >= sdpisolver->epsilon )
1414 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1416 #ifdef SCIP_MORE_DEBUG
1417 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1418 sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], sdpisolver->sdpcounter);
1422 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1423 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], 1.0, checkinput);
1427 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1429 #ifdef SCIP_MORE_DEBUG
1430 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1431 sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
1435 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1436 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], 1.0, checkinput);
1441 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1443 #ifdef SCIP_MORE_DEBUG
1444 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1445 lpval[i], sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1448 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1449 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], lpval[i], checkinput);
1452 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1454 #ifdef SCIP_MORE_DEBUG
1455 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1456 -1 * lpval[i], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1460 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1461 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
1469 for (i = 0; i < nlpcons; i++)
1474 #ifdef SCIP_MORE_DEBUG
1475 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1478 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1479 (
long long) lpconsind, lplhs[i], checkinput);
1486 #ifdef SCIP_MORE_DEBUG
1487 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1491 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1492 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1497 assert( lpconsind == nlpineqs + 1 );
1500 #ifdef SCIP_MORE_DEBUG
1503 for (i = 0; i < lpnnonz; i++)
1506 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1508 if ( rownactivevars[lprow[i]] > 1 )
1510 if ( lprow[i] > lastrow )
1515 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1517 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1522 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"%f <= ", lplhs[ind]);
1524 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1531 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1533 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1535 assert( ind == nlpcons - 1 );
1540 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1542 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1545 if ( sdpisolver->varboundpos[i] < 0 )
1549 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1550 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1552 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1555 #ifdef SCIP_MORE_DEBUG
1556 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1557 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1558 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1560 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1561 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1566 #ifdef SCIP_MORE_DEBUG
1567 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1568 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1569 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1579 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1580 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1582 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1585 #ifdef SCIP_MORE_DEBUG
1586 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1587 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1588 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1590 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1591 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1596 #ifdef SCIP_MORE_DEBUG
1597 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1598 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1599 sdpisolver->varboundpos[i]);
1605 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1608 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1609 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1610 #ifdef SCIP_MORE_DEBUG
1611 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1616 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds);
1619 sdpisolver->sdpa->initializeUpperTriangle();
1620 sdpisolver->sdpa->initializeSolve();
1623 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1629 for (i = 1; i <= sdpisolver->nactivevars; i++)
1630 sdpisolver->sdpa->inputInitXVec((
long long) i, starty[sdpisolver->sdpatoinputmapper[i - 1]]);
1633 for (b = 0; b < nsdpblocks; b++)
1635 if ( blockindchanges[b] > -1)
1637 for (i = 0; i < startZnblocknonz[b]; i++)
1639 if ( indchanges[b][startZrow[b][i]] > -1 && indchanges[b][startZcol[b][i]] > -1 )
1641 sdpisolver->sdpa->inputInitXMat((
long long) b + 1 - blockindchanges[b], (
long long) startZrow[b][i] + 1 - indchanges[b][startZrow[b][i]],
1642 (
long long) startZcol[b][i] + 1 - indchanges[b][startZcol[b][i]], startZval[b][i]);
1649 for (i = 0; i < startZnblocknonz[nsdpblocks]; i++)
1651 assert( startZrow[nsdpblocks][i] == startZcol[nsdpblocks][i] );
1653 if ( startZrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1655 sdpaind = sdpisolver->rowmapper[startZrow[nsdpblocks][i]];
1657 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startZval[nsdpblocks][i]);
1661 varboundind = sdpisolver->inputtovbmapper[startZrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1662 if ( varboundind > -1 )
1664 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1665 nlpineqs + varboundind + 1, startZval[nsdpblocks][i]);
1671 for (b = 0; b < nsdpblocks; b++)
1673 if ( blockindchanges[b] > -1)
1675 for (i = 0; i < startXnblocknonz[b]; i++)
1677 if ( indchanges[b][startXrow[b][i]] > -1 && indchanges[b][startXcol[b][i]] > -1 )
1679 sdpisolver->sdpa->inputInitYMat((
long long) b + 1 - blockindchanges[b], (
long long) startXrow[b][i] + 1 - indchanges[b][startXrow[b][i]],
1680 (
long long) startXcol[b][i] + 1 - indchanges[b][startXcol[b][i]], startXval[b][i]);
1687 for (i = 0; i < startXnblocknonz[nsdpblocks]; i++)
1689 assert( startXrow[nsdpblocks][i] == startXcol[nsdpblocks][i] );
1691 if ( startXrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1693 sdpaind = sdpisolver->rowmapper[startXrow[nsdpblocks][i]];
1695 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startXval[nsdpblocks][i]);
1699 varboundind = sdpisolver->inputtovbmapper[startXrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1700 if ( varboundind > -1 )
1702 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1703 nlpineqs + varboundind + 1, startXval[nsdpblocks][i]);
1708 else if ( penaltyparam >= sdpisolver->epsilon )
1709 SCIPdebugMessage(
"Skipping insertion of starting point for penalty formulation.\n");
1711 #ifdef SCIP_DEBUG_PRINTTOFILE
1713 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1714 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1717 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1726 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->preoptimalgap);
1727 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->preoptimalgap);
1728 sdpisolver->sdpa->solve();
1733 SCIPdebugMessage(
"Saving preoptimal solution for warmstarting purposes\n");
1734 sdpasol = sdpisolver->sdpa->getResultXVec();
1737 for (i = 0; i < sdpisolver->nactivevars; i++)
1738 sdpisolver->preoptimalsol[i] = sdpasol[i];
1741 for (b = 0; b < sdpisolver->sdpa->getBlockNumber(); b++)
1743 sdpasol = sdpisolver->sdpa->getResultYMat(b + 1);
1744 sdpablocksize = sdpisolver->sdpa->getBlockSize(b + 1);
1745 if ( sdpisolver->sdpa->getBlockType(b + 1) == SDPA::LP )
1748 for (i = 0; i < sdpablocksize; i++)
1749 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1754 for (i = 0; i < sdpablocksize * sdpablocksize; i++)
1755 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1759 sdpisolver->preoptimalsolexists = TRUE;
1763 SCIPdebugMessage(
"Solving to gaptol failed! No preoptimal solution available.\n");
1767 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1770 sdpisolver->sdpa->setInitPoint(
true);
1771 sdpisolver->sdpa->copyCurrentToInit();
1772 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1773 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1774 sdpisolver->sdpa->solve();
1777 sdpisolver->sdpa->solve();
1779 sdpisolver->solved = TRUE;
1782 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1783 sdpisolver->nsdpcalls += 1;
1787 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1788 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1794 else if ( penaltyparam >= sdpisolver->epsilon )
1799 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1800 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1801 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1808 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1811 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1812 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1813 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1814 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1817 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1819 sdpisolver->sdpa->setParameterUpperBound(1e8);
1822 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1824 #ifdef SCIP_MORE_DEBUG
1825 sdpisolver->sdpa->printParameters(stdout);
1827 sdpisolver->sdpa->setInitPoint(
false);
1828 #ifdef SDPA_RESETPARAMS
1829 sdpisolver->sdpa->resetParameters();
1831 sdpisolver->sdpa->initializeSolve();
1833 sdpisolver->sdpa->solve();
1834 sdpisolver->solved = TRUE;
1837 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1838 sdpisolver->nsdpcalls += 1;
1846 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1847 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1852 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1853 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1854 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1861 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1864 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1867 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1870 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1872 sdpisolver->sdpa->setParameterUpperBound(1e8);
1875 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1877 #ifdef SCIP_MORE_DEBUG
1878 sdpisolver->sdpa->printParameters(stdout);
1880 sdpisolver->sdpa->setInitPoint(
false);
1881 #ifdef SDPA_RESETPARAMS
1882 sdpisolver->sdpa->resetParameters();
1884 sdpisolver->sdpa->initializeSolve();
1886 sdpisolver->sdpa->solve();
1887 sdpisolver->solved = TRUE;
1890 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1891 sdpisolver->nsdpcalls += 1;
1899 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1900 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1905 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1906 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1907 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1910 #ifdef SCIP_MORE_DEBUG
1911 (void) fclose(fpOut);
1915 if ( penaltyparam >= sdpisolver->epsilon )
1921 SCIP_Real trace = 0.0;
1924 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1926 sdpasol = sdpisolver->sdpa->getResultXVec();
1929 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1934 sdpisolver->feasorig = *feasorig;
1938 if ( ! *feasorig && penaltybound != NULL )
1942 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1947 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1948 for (b = 1; b <= nblockssdpa; b++)
1951 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1952 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1953 assert( nrow >= 0 );
1956 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1959 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1965 for (i = 0; i < nrow; i++)
1966 trace += X[i + i*nrow];
1973 if ( penaltybound != NULL )
1974 *penaltybound = TRUE;
1975 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1976 trace, penaltyparam);
1978 else if ( penaltybound != NULL )
1979 *penaltybound = FALSE;
2005 assert( sdpisolver != NULL );
2006 return sdpisolver->solved;
2019 SDPA::PhaseType phasetype;
2021 assert( sdpisolver != NULL );
2022 assert( sdpisolver->sdpa != NULL);
2025 phasetype = sdpisolver->sdpa->getPhaseValue();
2027 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2036 SCIP_Bool* primalfeasible,
2037 SCIP_Bool* dualfeasible
2040 SDPA::PhaseType phasetype;
2042 assert( sdpisolver != NULL );
2043 assert( sdpisolver->sdpa != NULL );
2044 assert( primalfeasible != NULL );
2045 assert( dualfeasible != NULL );
2048 phasetype = sdpisolver->sdpa->getPhaseValue();
2050 switch ( phasetype )
2053 *primalfeasible = TRUE;
2054 *dualfeasible = TRUE;
2057 *primalfeasible = TRUE;
2058 *dualfeasible = TRUE;
2060 case SDPA::pFEAS_dINF:
2061 *primalfeasible = TRUE;
2062 *dualfeasible = FALSE;
2064 case SDPA::pINF_dFEAS:
2065 *primalfeasible = FALSE;
2066 *dualfeasible = TRUE;
2069 *primalfeasible = TRUE;
2070 *dualfeasible = FALSE;
2071 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
2074 *primalfeasible = FALSE;
2075 *dualfeasible = TRUE;
2076 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
2079 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
2080 return SCIP_LPERROR;
2092 SDPA::PhaseType phasetype;
2094 assert( sdpisolver != NULL );
2095 assert( sdpisolver->sdpa != NULL );
2098 phasetype = sdpisolver->sdpa->getPhaseValue();
2100 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2102 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
2105 else if ( phasetype == SDPA::pFEAS_dINF )
2107 else if ( phasetype == SDPA::pUNBD )
2109 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2122 SDPA::PhaseType phasetype;
2124 assert( sdpisolver != NULL );
2125 assert( sdpisolver->sdpa != NULL );
2128 phasetype = sdpisolver->sdpa->getPhaseValue();
2130 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2132 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
2135 else if ( phasetype == SDPA::pINF_dFEAS )
2137 else if ( phasetype == SDPA::dUNBD )
2139 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2152 SDPA::PhaseType phasetype;
2154 assert( sdpisolver != NULL );
2155 assert( sdpisolver->sdpa != NULL );
2158 phasetype = sdpisolver->sdpa->getPhaseValue();
2160 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2162 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2165 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
2167 else if ( phasetype == SDPA::dUNBD )
2169 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2182 SDPA::PhaseType phasetype;
2184 assert( sdpisolver != NULL );
2185 assert( sdpisolver->sdpa != NULL);
2188 phasetype = sdpisolver->sdpa->getPhaseValue();
2190 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2192 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
2195 else if ( phasetype == SDPA::pINF_dFEAS )
2197 else if ( phasetype == SDPA::dUNBD )
2199 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2212 SDPA::PhaseType phasetype;
2214 assert( sdpisolver != NULL );
2215 assert( sdpisolver->sdpa != NULL);
2218 phasetype = sdpisolver->sdpa->getPhaseValue();
2220 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2222 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
2225 else if ( phasetype == SDPA::pFEAS_dINF )
2227 else if ( phasetype == SDPA::pUNBD )
2229 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2242 SDPA::PhaseType phasetype;
2244 assert( sdpisolver != NULL );
2245 assert( sdpisolver->sdpa != NULL);
2248 phasetype = sdpisolver->sdpa->getPhaseValue();
2250 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2252 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2255 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2257 else if ( phasetype == SDPA::dUNBD )
2259 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2271 SDPA::PhaseType phasetype;
2273 assert( sdpisolver != NULL );
2274 assert( sdpisolver->sdpa != NULL );
2277 phasetype = sdpisolver->sdpa->getPhaseValue();
2279 if ( phasetype == SDPA::pdOPT )
2290 SDPA::PhaseType phasetype;
2292 assert( sdpisolver != NULL );
2293 assert( sdpisolver->sdpa != NULL );
2296 phasetype = sdpisolver->sdpa->getPhaseValue();
2298 if ( phasetype == SDPA::pUNBD )
2309 SDPA::PhaseType phasetype;
2311 assert( sdpisolver != NULL );
2312 assert( sdpisolver->sdpa != NULL);
2315 phasetype = sdpisolver->sdpa->getPhaseValue();
2317 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2319 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
2331 assert( sdpisolver != NULL );
2333 return sdpisolver->timelimit;
2350 SDPA::PhaseType phasetype;
2352 assert( sdpisolver != NULL );
2353 assert( sdpisolver->sdpa != NULL );
2355 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
2358 phasetype = sdpisolver->sdpa->getPhaseValue();
2360 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
2362 if ( phasetype == SDPA::pdINF )
2364 if ( phasetype == SDPA::pUNBD )
2366 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2377 SDPA::PhaseType phasetype;
2379 assert( sdpisolver != NULL );
2380 assert( sdpisolver->sdpa != NULL );
2382 if ( ! sdpisolver->solved )
2385 phasetype = sdpisolver->sdpa->getPhaseValue();
2387 if ( phasetype == SDPA::pdOPT )
2399 SDPA::PhaseType phasetype;
2401 assert( sdpisolver != NULL );
2402 assert( sdpisolver->sdpa != NULL );
2404 if ( sdpisolver->timelimit )
2407 if ( ! sdpisolver->solved )
2410 phasetype = sdpisolver->sdpa->getPhaseValue();
2414 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
2426 SCIPdebugMessage(
"Not implemented yet\n");
2428 return SCIP_LPERROR;
2437 assert( sdpisolver != NULL );
2438 assert( sdpisolver->sdpa != NULL );
2439 assert( objval != NULL );
2442 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2444 *objval = sdpisolver->sdpa->getPrimalObj();
2446 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2447 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2448 if ( gap > sdpisolver->gaptol )
2450 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2451 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2462 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2463 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2464 sdpasol = sdpisolver->sdpa->getResultXVec();
2467 for (v = 0; v < sdpisolver->nactivevars; v++)
2468 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2472 *objval += sdpisolver->fixedvarsobjcontr;
2492 assert( sdpisolver != NULL );
2493 assert( sdpisolver->sdpa != NULL );
2494 assert( dualsollength != NULL );
2497 if ( objval != NULL )
2499 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2501 *objval = sdpisolver->sdpa->getPrimalObj();
2503 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2504 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2505 if ( gap > sdpisolver->gaptol )
2507 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2508 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2516 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2517 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2518 sdpasol = sdpisolver->sdpa->getResultXVec();
2521 for (v = 0; v < sdpisolver->nactivevars; v++)
2522 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2526 *objval += sdpisolver->fixedvarsobjcontr;
2529 if ( *dualsollength > 0 )
2531 assert( dualsol != NULL );
2532 if ( *dualsollength < sdpisolver->nvars )
2534 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2535 *dualsollength = sdpisolver->nvars;
2541 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2542 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2543 sdpasol = sdpisolver->sdpa->getResultXVec();
2545 for (v = 0; v < sdpisolver->nvars; v++)
2547 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2550 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2555 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2556 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2567 int* startXnblocknonz
2579 assert( sdpisolver != NULL );
2580 assert( nblocks > 0 );
2581 assert( startXnblocknonz != NULL );
2584 if ( ! sdpisolver->preoptimalsolexists )
2586 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2587 startXnblocknonz[0] = -1;
2591 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2593 SCIPerrorMessage(
"SCIPsdpiSolverGetPreoptimalPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2594 return SCIP_LPERROR;
2598 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2600 sdpablock = sdpisolver->inputtoblockmapper[b];
2602 startXnblocknonz[b] = 0;
2604 if ( sdpablock != -1 )
2606 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2609 for (r = 0; r < blocksize; r++)
2611 for (c = r; c < blocksize; c++)
2613 sdpaind = r + blocksize * c;
2615 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2616 startXnblocknonz[b]++;
2623 startXnblocknonz[nblocks - 1] = 0;
2624 sdpablock = sdpisolver->sdpa->getBlockNumber();
2626 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2628 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2630 for (i = 0; i < blocksize; i++)
2632 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2633 startXnblocknonz[b]++;
2655 int* startXnblocknonz,
2659 SCIP_Real** startXval
2670 SCIP_Bool msgthrown;
2672 assert( sdpisolver != NULL );
2673 assert( success != NULL );
2674 assert( dualsol != NULL );
2675 assert( dualsollength != NULL );
2676 assert( *dualsollength >= 0 );
2677 assert( startXnblocknonz != NULL || nblocks == -1 );
2678 assert( startXrow != NULL || nblocks == -1 );
2679 assert( startXcol != NULL || nblocks == -1 );
2680 assert( startXval != NULL || nblocks == -1 );
2682 if ( ! sdpisolver->preoptimalsolexists )
2684 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2689 if ( *dualsollength < sdpisolver->nvars )
2691 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2693 *dualsollength = sdpisolver->nvars;
2697 for (v = 0; v < sdpisolver->nvars; v++)
2699 if (sdpisolver->inputtosdpamapper[v] > 0)
2702 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtosdpamapper[v] - 1];
2707 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2711 *dualsollength = sdpisolver->nvars;
2716 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2718 sdpablock = sdpisolver->inputtoblockmapper[b];
2722 if ( sdpablock != -1 )
2725 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2729 for (r = 0; r < blocksize; r++)
2731 for (c = r; c < blocksize; c++)
2733 sdpaind = r + blocksize * c;
2735 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2737 if ( blocknnonz < startXnblocknonz[b] )
2739 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2740 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2741 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind];
2748 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2756 startXnblocknonz[b] = blocknnonz;
2759 startXnblocknonz[b] = 0;
2766 sdpablock = sdpisolver->sdpa->getBlockNumber();
2768 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2773 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2776 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
2778 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2780 if ( blocknnonz < startXnblocknonz[b] )
2782 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2783 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2784 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2792 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2800 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
2802 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2804 if ( blocknnonz < startXnblocknonz[b] )
2809 vbpos = i - (blocksize - sdpisolver->nvarbounds);
2812 if ( sdpisolver->varboundpos[vbpos] > 0 )
2813 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
2815 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
2816 startXrow[b][blocknnonz] = inputpos;
2817 startXcol[b][blocknnonz] = inputpos;
2818 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2826 SCIPdebugMessage(
"Insufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2832 startXnblocknonz[b] = blocknnonz;
2835 startXnblocknonz[b] = 0;
2863 assert( sdpisolver != NULL );
2864 assert( sdpisolver->sdpa != NULL );
2865 assert( lbvars != NULL );
2866 assert( ubvars != NULL );
2867 assert( arraylength != NULL );
2868 assert( *arraylength >= 0 );
2872 if ( *arraylength < sdpisolver->nvars )
2874 *arraylength = sdpisolver->nvars;
2875 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2880 for (i = 0; i < sdpisolver->nvars; i++)
2887 if ( sdpisolver->nvarbounds == 0 )
2889 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
2894 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2895 if ( ! (sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP) )
2902 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
2903 assert( nlpcons >= 0 );
2905 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
2908 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2910 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
2912 if ( sdpisolver->varboundpos[i] < 0 )
2916 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2922 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2933 int* startXnblocknonz
2945 assert( sdpisolver != NULL );
2946 assert( nblocks > 0 );
2947 assert( startXnblocknonz != NULL );
2950 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2952 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2953 return SCIP_LPERROR;
2957 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2959 sdpablock = sdpisolver->inputtoblockmapper[b];
2961 startXnblocknonz[b] = 0;
2963 if ( sdpablock != -1 )
2965 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2966 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2969 for (r = 0; r < blocksize; r++)
2971 for (c = r; c < blocksize; c++)
2973 sdpaind = r + blocksize * c;
2975 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2976 startXnblocknonz[b]++;
2983 startXnblocknonz[nblocks - 1] = 0;
2984 sdpablock = sdpisolver->sdpa->getBlockNumber();
2986 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2988 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2989 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2991 for (i = 0; i < blocksize; i++)
2993 if ( REALABS(X[i]) > sdpisolver->epsilon )
2994 startXnblocknonz[b]++;
3008 int* startXnblocknonz,
3012 SCIP_Real** startXval
3023 SCIP_Bool msgthrown;
3025 assert( sdpisolver != NULL );
3026 assert( nblocks > 0 );
3027 assert( startXnblocknonz != NULL );
3028 assert( startXrow != NULL );
3029 assert( startXcol != NULL );
3030 assert( startXval != NULL );
3035 if ( nblocks != sdpisolver->nsdpblocks + 1 )
3037 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
3038 return SCIP_LPERROR;
3042 for (b = 0; b < sdpisolver->nsdpblocks; b++)
3044 sdpablock = sdpisolver->inputtoblockmapper[b];
3048 if ( sdpablock != -1 )
3050 X = sdpisolver->sdpa->getResultYMat(sdpablock);
3051 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3055 for (r = 0; r < blocksize; r++)
3057 for (c = r; c < blocksize; c++)
3059 sdpaind = r + blocksize * c;
3061 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
3063 if ( blocknnonz < startXnblocknonz[b] )
3065 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
3066 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
3067 startXval[b][blocknnonz] = X[sdpaind];
3074 SCIPdebugMessage(
"Insufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
3082 startXnblocknonz[b] = blocknnonz;
3085 startXnblocknonz[b] = 0;
3090 sdpablock = sdpisolver->sdpa->getBlockNumber();
3092 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3096 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3097 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3100 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
3102 if ( REALABS(X[i]) > sdpisolver->epsilon )
3104 if ( blocknnonz < startXnblocknonz[b] )
3106 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3107 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3108 startXval[b][blocknnonz] = X[i];
3116 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3124 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
3126 if ( REALABS(X[i]) > sdpisolver->epsilon )
3128 if ( blocknnonz < startXnblocknonz[b] )
3133 vbpos = i - (blocksize - sdpisolver->nvarbounds);
3136 if ( sdpisolver->varboundpos[vbpos] > 0 )
3137 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
3139 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
3140 startXrow[b][blocknnonz] = inputpos;
3141 startXcol[b][blocknnonz] = inputpos;
3142 startXval[b][blocknnonz] = X[i];
3150 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3156 startXnblocknonz[b] = blocknnonz;
3159 startXnblocknonz[b] = 0;
3177 assert( sdpisolver != NULL );
3178 assert( sdpisolver->sdpa != NULL );
3180 nblocks = (int) sdpisolver->sdpa->getBlockNumber();
3184 for (b = 0; b < nblocks; b++)
3187 blocksize = (int) sdpisolver->sdpa->getBlockSize((
long long) b + 1);
3188 arraylength = sdpisolver->sdpa->getBlockType((
long long) b + 1) == SDPA::LP ? blocksize : (blocksize * (blocksize + 1) / 2);
3191 X = sdpisolver->sdpa->getResultYMat((
long long) b + 1);
3192 for (i = 0; i < arraylength; i++)
3194 if ( X[i] > maxentry )
3208 assert( sdpisolver != NULL );
3209 assert( sdpisolver->sdpa != NULL );
3210 assert( iterations != NULL );
3212 *iterations = sdpisolver->niterations;
3223 assert( sdpisolver != NULL );
3224 assert( sdpisolver->sdpa != NULL );
3225 assert( calls != NULL );
3227 *calls = sdpisolver->nsdpcalls;
3238 assert( sdpisolver != NULL );
3239 assert( usedsetting != NULL );
3242 *usedsetting = sdpisolver->usedsetting;
3283 assert( sdpisolver != NULL );
3284 assert( dval != NULL );
3289 *dval = sdpisolver->epsilon;
3292 *dval = sdpisolver->gaptol;
3295 *dval = sdpisolver->feastol;
3298 *dval = sdpisolver->sdpsolverfeastol;
3302 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3305 *dval = sdpisolver->objlimit;
3308 *dval = sdpisolver->lambdastar;
3311 *dval = sdpisolver->preoptimalgap;
3314 return SCIP_PARAMETERUNKNOWN;
3327 assert( sdpisolver != NULL );
3332 sdpisolver->epsilon = dval;
3333 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
3336 sdpisolver->gaptol = dval;
3337 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
3340 sdpisolver->feastol = dval;
3341 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
3344 sdpisolver->sdpsolverfeastol = dval;
3345 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
3348 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3351 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
3352 sdpisolver->objlimit = dval;
3355 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
3356 sdpisolver->lambdastar = dval;
3359 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
3360 sdpisolver->preoptimalgap = dval;
3363 return SCIP_PARAMETERUNKNOWN;
3376 assert( sdpisolver != NULL );
3381 *ival = (int) sdpisolver->sdpinfo;
3382 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
3385 return SCIP_PARAMETERUNKNOWN;
3398 assert( sdpisolver != NULL );
3403 sdpisolver->sdpinfo = (SCIP_Bool) ival;
3404 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
3407 return SCIP_PARAMETERUNKNOWN;
3421 assert( sdpisolver != NULL );
3426 #ifdef LAMBDASTAR_TWOPOINTS
3447 sdpisolver->lambdastar = compval;
3448 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
3458 SCIP_Real* penaltyparam
3463 assert( sdpisolver != NULL );
3464 assert( penaltyparam != NULL );
3480 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
3481 *penaltyparam = compval;
3489 SCIP_Real penaltyparam,
3490 SCIP_Real* maxpenaltyparam
3495 assert( sdpisolver != NULL );
3496 assert( maxpenaltyparam != NULL );
3502 *maxpenaltyparam = compval;
3503 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
3532 SCIPdebugMessage(
"Not implemented yet\n");
3533 return SCIP_LPERROR;
3542 assert( fname != NULL );
3544 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)