50 #pragma GCC diagnostic ignored "-Wcast-qual" 51 #pragma GCC diagnostic ignored "-Wpedantic" 52 #include "sdpa_call.h" 53 #pragma GCC diagnostic warning "-Wcast-qual" 54 #pragma GCC diagnostic warning "-Wpedantic" 56 #include "blockmemshell/memory.h" 58 #include "scip/pub_misc.h" 60 #include "scip/pub_message.h" 67 #define GAPTOLCHANGE 1 68 #define FEASTOLCHANGE 1 69 #define PENALTYBOUNDTOL 1E-3 72 #define INFEASFEASTOLCHANGE 0.1 73 #define INFEASMINFEASTOL 1E-9 75 #define MIN_LAMBDASTAR 1e0 76 #define MAX_LAMBDASTAR 1e8 77 #define LAMBDASTAR_FACTOR 1e0 78 #define LAMBDASTAR_TWOPOINTS TRUE 79 #define LAMBDASTAR_THRESHOLD 1e1 80 #define LAMBDASTAR_LOW 1.5 81 #define LAMBDASTAR_HIGH 1e5 83 #define MIN_PENALTYPARAM 1e5 84 #define MAX_PENALTYPARAM 1e12 85 #define PENALTYPARAM_FACTOR 1e1 86 #define MAX_MAXPENALTYPARAM 1e15 87 #define MAXPENALTYPARAM_FACTOR 1e6 91 #define BMS_CALL(x) do \ 95 SCIPerrorMessage("No memory in function call.\n"); \ 96 return SCIP_NOMEMORY; \ 102 #define CHECK_IF_SOLVED(sdpisolver) do \ 104 if (!(sdpisolver->solved)) \ 106 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 107 return SCIP_LPERROR; \ 113 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \ 115 if (!(sdpisolver->solved)) \ 117 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 125 struct SCIP_SDPiSolver
127 SCIP_MESSAGEHDLR* messagehdlr;
133 int* inputtosdpamapper;
136 int* sdpatoinputmapper;
137 SCIP_Real* fixedvarsval;
138 SCIP_Real fixedvarsobjcontr;
143 int* inputtovbmapper;
149 int* rowtoinputmapper;
150 int* inputtoblockmapper;
151 int** blockindmapper;
160 SCIP_Real sdpsolverfeastol;
168 SCIP_Real lambdastar;
169 SCIP_Real* preoptimalsol;
170 SCIP_Real** preoptimalsolx;
171 SCIP_Bool preoptimalsolexists;
172 SCIP_Real preoptimalgap;
189 assert( sdpisolver != NULL );
190 assert( lb < ub + sdpisolver->feastol );
192 return (ub-lb <= sdpisolver->epsilon);
195 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon) 204 SCIP_Real penaltyparam,
212 int* sdpconstnblocknonz,
216 SCIP_Real** sdpconstval,
218 int** sdpnblockvarnonz,
228 int* blockindchanges,
242 char phase_string[15];
245 assert( feastol != NULL );
249 SCIP_Real* solvector;
251 SCIP_Bool infeasible;
254 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
255 nvarspointer = nvars;
257 assert( nvarspointer == nvars );
260 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
261 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
262 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
263 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
265 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
269 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
276 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
278 #ifdef SCIP_MORE_DEBUG 279 sdpisolver->sdpa->printParameters(stdout);
281 sdpisolver->sdpa->setInitPoint(
false);
282 #ifdef SDPA_RESETPARAMS 283 sdpisolver->sdpa->resetParameters();
285 sdpisolver->sdpa->initializeSolve();
287 sdpisolver->sdpa->solve();
290 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
291 sdpisolver->nsdpcalls += 1;
295 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
296 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
301 sdpisolver->solved = FALSE;
302 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
332 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
345 assert( sdpisolver != NULL );
346 return (
void*) sdpisolver->sdpa;
394 SCIP_MESSAGEHDLR* messagehdlr,
399 assert( sdpisolver != NULL );
400 assert( blkmem != NULL );
401 assert( bufmem != NULL );
403 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
405 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
407 (*sdpisolver)->messagehdlr = messagehdlr;
408 (*sdpisolver)->blkmem = blkmem;
409 (*sdpisolver)->bufmem = bufmem;
412 (*sdpisolver)->sdpa = NULL;
414 (*sdpisolver)->nvars = 0;
415 (*sdpisolver)->nactivevars = 0;
416 (*sdpisolver)->nsdpblocks = 0;
417 (*sdpisolver)->inputtosdpamapper = NULL;
418 (*sdpisolver)->sdpatoinputmapper = NULL;
419 (*sdpisolver)->inputtoblockmapper = NULL;
420 (*sdpisolver)->blockindmapper = NULL;
421 (*sdpisolver)->rowmapper = NULL;
422 (*sdpisolver)->rowtoinputmapper = NULL;
423 (*sdpisolver)->fixedvarsval = NULL;
424 (*sdpisolver)->fixedvarsobjcontr = 0.0;
425 (*sdpisolver)->objcoefs = NULL;
426 (*sdpisolver)->nvarbounds = 0;
427 (*sdpisolver)->varboundpos = NULL;
428 (*sdpisolver)->inputtovbmapper = NULL;
429 (*sdpisolver)->solved = FALSE;
430 (*sdpisolver)->timelimit = FALSE;
431 (*sdpisolver)->sdpcounter = 0;
432 (*sdpisolver)->niterations = 0;
433 (*sdpisolver)->nsdpcalls = 0;
434 (*sdpisolver)->ninputlpcons = 0;
435 (*sdpisolver)->nsdpalpcons = 0;
437 (*sdpisolver)->epsilon = 1e-9;
438 (*sdpisolver)->gaptol = 1e-4;
439 (*sdpisolver)->feastol = 1e-6;
440 (*sdpisolver)->sdpsolverfeastol = 1e-6;
442 (*sdpisolver)->sdpinfo = FALSE;
445 (*sdpisolver)->preoptimalsolexists = FALSE;
446 (*sdpisolver)->preoptimalgap = -1.0;
460 assert( sdpisolver != NULL );
461 assert( *sdpisolver != NULL );
463 SCIPdebugMessage(
"Freeing SDPISolver\n");
465 if ( (*sdpisolver)->sdpa != NULL )
467 nsdpblocks = (*sdpisolver)->sdpa->getBlockType((*sdpisolver)->sdpa->getBlockNumber()) == SDPA::LP ?
468 (*sdpisolver)->sdpa->getBlockNumber() - 1 : (*sdpisolver)->sdpa->getBlockNumber();
470 for (b = 0; b < nsdpblocks; b++)
472 blocksize = (*sdpisolver)->sdpa->getBlockSize(b + 1);
474 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->blockindmapper[b]), blocksize);
477 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
479 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[b]), blocksize * blocksize);
483 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
485 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[nsdpblocks + 1]), 2 * (*sdpisolver)->nsdpalpcons + (*sdpisolver)->nvarbounds);
486 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolx, nsdpblocks + 1);
488 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->blockindmapper, nsdpblocks);
492 if ( (*sdpisolver)->sdpa != NULL)
493 delete (*sdpisolver)->sdpa;
495 if ( (*sdpisolver)->nactivevars > 0 && (*sdpisolver)->preoptimalgap > 0.0 )
497 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
500 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtoblockmapper, (*sdpisolver)->nsdpblocks);
502 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowtoinputmapper, 2 * (*sdpisolver)->nsdpalpcons);
503 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowmapper, 2 * (*sdpisolver)->ninputlpcons);
504 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
505 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtovbmapper, 2 * (*sdpisolver)->nvars);
506 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
507 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
508 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
509 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
510 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
520 assert( sdpisolver != NULL );
522 sdpisolver->sdpcounter++;
532 assert( sdpisolver != NULL );
534 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
535 sdpisolver->sdpcounter = 0;
575 int* sdpconstnblocknonz,
579 SCIP_Real** sdpconstval,
581 int** sdpnblockvarnonz,
591 int* blockindchanges,
597 int* lprownactivevars,
603 int* startZnblocknonz,
609 SCIP_Real** startZval,
611 int* startXnblocknonz,
617 SCIP_Real** startXval,
624 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
625 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
626 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval,
627 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
628 timelimit, NULL, NULL);
655 SCIP_Real penaltyparam,
666 int* sdpconstnblocknonz,
670 SCIP_Real** sdpconstval,
672 int** sdpnblockvarnonz,
682 int* blockindchanges,
694 int* startZnblocknonz,
700 SCIP_Real** startZval,
702 int* startXnblocknonz,
708 SCIP_Real** startXval,
715 SCIP_Bool* penaltybound
720 SCIP_Real* sdpavarbounds;
738 SCIP_Bool newlyallocated;
741 char phase_string[15];
744 assert( sdpisolver != NULL );
745 assert( penaltyparam > -1 * sdpisolver->epsilon );
746 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
748 assert( obj != NULL );
749 assert( lb != NULL );
750 assert( ub != NULL );
751 assert( nsdpblocks >= 0 );
752 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
753 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
754 assert( sdpconstnnonz >= 0 );
755 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
756 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
757 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
758 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
759 assert( sdpnnonz >= 0 );
760 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
761 assert( nsdpblocks == 0 || sdpvar != NULL );
762 assert( nsdpblocks == 0 || sdprow != NULL );
763 assert( nsdpblocks == 0 || sdpcol != NULL );
764 assert( nsdpblocks == 0 || sdpval != NULL );
765 assert( nsdpblocks == 0 || indchanges != NULL );
766 assert( nsdpblocks == 0 || nremovedinds != NULL );
767 assert( nsdpblocks == 0 || blockindchanges != NULL );
768 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
769 assert( nlpcons >= 0 );
770 assert( noldlpcons >= nlpcons );
771 assert( nlpcons == 0 || lplhs != NULL );
772 assert( nlpcons == 0 || lprhs != NULL );
773 assert( nlpcons == 0 || rownactivevars != NULL );
774 assert( lpnnonz >= 0 );
775 assert( nlpcons == 0 || lprow != NULL );
776 assert( nlpcons == 0 || lpcol != NULL );
777 assert( nlpcons == 0 || lpval != NULL );
778 assert( startZnblocknonz == NULL || startZrow != NULL );
779 assert( startZnblocknonz == NULL || startZcol != NULL );
780 assert( startZnblocknonz == NULL || startZval != NULL );
781 assert( startXnblocknonz == NULL || startXrow != NULL );
782 assert( startXnblocknonz == NULL || startXcol != NULL );
783 assert( startXnblocknonz == NULL || startXval != NULL );
785 sdpisolver->niterations = 0;
786 sdpisolver->nsdpcalls = 0;
787 sdpisolver->feasorig = FALSE;
790 if ( timelimit <= 0.0 )
792 sdpisolver->solved = FALSE;
793 sdpisolver->timelimit = TRUE;
797 sdpisolver->timelimit = FALSE;
809 if ( penaltyparam < sdpisolver->epsilon )
810 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
812 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
815 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
816 sdpisolver->rbound = rbound;
820 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
821 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
822 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
823 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
825 oldnvars = sdpisolver->nvars;
826 oldnactivevars = sdpisolver->nactivevars;
827 oldsdpalplength = 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds;
828 sdpisolver->nvars = nvars;
829 sdpisolver->nactivevars = 0;
833 sdpisolver->fixedvarsobjcontr = 0.0;
834 for (i = 0; i < nvars; i++)
836 if (
isFixed(sdpisolver, lb[i], ub[i]) )
838 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
839 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
841 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
842 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
846 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
847 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
848 sdpisolver->nactivevars++;
849 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
850 #ifdef SCIP_MORE_DEBUG 851 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
855 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
859 sdpisolver->fixedvarsobjcontr = 0.0;
862 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
863 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
864 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
867 if ( nsdpblocks != sdpisolver->nsdpblocks )
869 if ( sdpisolver->inputtoblockmapper == NULL )
871 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), nsdpblocks) );
875 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), sdpisolver->nsdpblocks, nsdpblocks) );
880 if ( sdpisolver->nactivevars != oldnactivevars && sdpisolver->preoptimalgap >= 0.0 )
882 if ( oldnactivevars == 0 )
884 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
888 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
891 sdpisolver->preoptimalsolexists = FALSE;
893 sdpisolver->nsdpblocks = nsdpblocks;
896 if ( sdpisolver->sdpa == NULL )
902 nsdpasdpblocks = (sdpisolver->sdpa->getBlockType(sdpisolver->sdpa->getBlockNumber()) == SDPA::LP ?
903 sdpisolver->sdpa->getBlockNumber() - 1 : sdpisolver->sdpa->getBlockNumber());
906 if ( nsdpblocks - nremovedblocks != nsdpasdpblocks )
908 if ( sdpisolver->blockindmapper == NULL )
910 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper), nsdpblocks - nremovedblocks) );
911 newlyallocated = TRUE;
912 if ( sdpisolver->preoptimalgap >= 0.0 )
915 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx), nsdpblocks - nremovedblocks + 1) );
921 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
923 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->blockindmapper[block]), sdpisolver->sdpa->getBlockSize(block + 1));
925 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper),
926 nsdpasdpblocks, nsdpblocks - nremovedblocks) );
927 newlyallocated = FALSE;
929 if ( sdpisolver->preoptimalgap >= 0.0 )
932 for ( block = nsdpblocks - nremovedblocks; block < nsdpasdpblocks; block++ )
934 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[block]), sdpisolver->sdpa->getBlockSize(block + 1));
936 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx),
937 nsdpasdpblocks, nsdpblocks - nremovedblocks + 1) );
942 newlyallocated = FALSE;
946 for (block = 0; block < nsdpblocks; block++)
948 if ( blockindchanges[block] > -1 )
950 sdpisolver->inputtoblockmapper[block] = ind + 1;
953 if ( newlyallocated )
955 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]), sdpblocksizes[block] - nremovedinds[block]) );
956 if ( sdpisolver->preoptimalgap >= 0.0 )
958 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
959 (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
962 else if ( (
long long) (sdpblocksizes[block] - nremovedinds[block]) != sdpisolver->sdpa->getBlockSize(ind + 1) )
964 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper[ind]),
965 (
int) sdpisolver->sdpa->getBlockSize(ind + 1), sdpblocksizes[block] - nremovedinds[block]) );
966 if ( sdpisolver->preoptimalgap >= 0.0 )
968 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[ind]),
969 (
int) sdpisolver->sdpa->getBlockSize(ind + 1) * sdpisolver->sdpa->getBlockSize(ind + 1), (sdpblocksizes[block] - nremovedinds[block]) * (sdpblocksizes[block] - nremovedinds[block])) );
974 for (i = 0; i < sdpblocksizes[block]; i++)
976 if ( indchanges[ind][i] > -1 )
978 sdpisolver->blockindmapper[ind][blockind] = i;
979 assert( i - indchanges[ind][i] == blockind );
983 assert( blockind == sdpblocksizes[block] - nremovedinds[block] );
987 sdpisolver->inputtoblockmapper[block] = -1;
991 if ( sdpisolver->sdpa != 0 )
994 delete sdpisolver->sdpa;
995 sdpisolver->sdpa =
new SDPA();
998 sdpisolver->sdpa =
new SDPA();
999 assert( sdpisolver->sdpa != 0 );
1004 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1008 feastol = FEASTOLCHANGE * FEASTOLCHANGE * sdpisolver->sdpsolverfeastol;
1009 SCIPdebugMessage(
"Start solving process with stable settings\n");
1013 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
1014 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1015 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1016 feastol = sdpisolver->sdpsolverfeastol;
1017 SCIPdebugMessage(
"Start solving process with fast settings\n");
1021 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1023 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1024 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1026 SCIPdebugMessage(
"Start solving process with medium settings\n");
1030 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
1031 return SCIP_LPERROR;
1033 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1037 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1039 sdpisolver->sdpa->setParameterUpperBound(1e8);
1042 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1046 #ifdef SCIP_MORE_DEBUG 1047 sdpisolver->sdpa->printParameters(stdout);
1051 sdpisolver->nvarbounds = 0;
1052 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
1054 if ( sdpisolver->nvars != oldnvars )
1056 if ( sdpisolver->inputtovbmapper == NULL )
1058 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * sdpisolver->nvars) );
1062 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * oldnvars, 2 * sdpisolver->nvars) );
1065 assert( sdpisolver->inputtovbmapper != NULL );
1068 for (i = 0; i < 2 * sdpisolver->nvars; i++)
1069 sdpisolver->inputtovbmapper[i] = -1;
1071 if ( sdpisolver->nactivevars != oldnactivevars )
1073 if ( sdpisolver->varboundpos == NULL )
1075 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
1079 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
1082 assert( sdpisolver->varboundpos != NULL );
1084 for (i = 0; i < sdpisolver->nactivevars; i++)
1086 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
1089 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
1090 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
1091 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i]] = sdpisolver->nvarbounds;
1092 (sdpisolver->nvarbounds)++;
1096 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
1097 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
1098 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i] + 1] = sdpisolver->nvarbounds;
1099 (sdpisolver->nvarbounds)++;
1103 if ( noldlpcons > 0 )
1106 if ( sdpisolver->ninputlpcons != noldlpcons )
1108 if ( sdpisolver->rowmapper == NULL )
1110 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2*noldlpcons) );
1114 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2 * sdpisolver->ninputlpcons, 2*noldlpcons) );
1117 assert( sdpisolver->rowmapper != NULL );
1120 if ( sdpisolver->nsdpalpcons != nlpcons )
1122 if ( sdpisolver->rowtoinputmapper == NULL )
1124 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * nlpcons) );
1128 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * sdpisolver->nsdpalpcons, 2 * nlpcons) );
1131 assert( sdpisolver->rowtoinputmapper != NULL );
1133 sdpisolver->ninputlpcons = noldlpcons;
1134 sdpisolver->nsdpalpcons = nlpcons;
1139 for (i = 0; i < noldlpcons; i++)
1141 if ( rownactivevars[i] >= 2 )
1145 sdpisolver->rowmapper[2*i] = pos;
1146 sdpisolver->rowtoinputmapper[pos - 1] = 2*i;
1150 sdpisolver->rowmapper[2*i] = -1;
1153 sdpisolver->rowmapper[2*i + 1] = pos;
1154 sdpisolver->rowtoinputmapper[pos - 1] = 2*i + 1;
1158 sdpisolver->rowmapper[2*i + 1] = -1;
1164 sdpisolver->rowmapper[2*i] = -1;
1165 sdpisolver->rowmapper[2*i + 1] = -1;
1169 assert( nlpineqs <= 2*nlpcons );
1175 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1176 sdpisolver->nvarbounds++;
1178 if ( sdpisolver->sdpinfo )
1179 sdpisolver->sdpa->setDisplay(stdout);
1181 sdpisolver->sdpa->setDisplay(0);
1183 #ifdef SCIP_MORE_DEBUG 1184 FILE* fpOut = fopen(
"output.tmp",
"w");
1187 sdpisolver->sdpa->setResultFile(fpOut);
1191 if ( sdpisolver->preoptimalgap >= 0.0 )
1193 if ( newlyallocated )
1195 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]),
1196 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1200 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]), oldsdpalplength,
1201 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1206 if ( penaltyparam < sdpisolver->epsilon )
1207 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
1209 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
1212 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
1213 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
1216 for (block = 0; block < nsdpblocks; block++)
1218 if ( blockindchanges[block] >= 0 )
1220 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
1221 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
1222 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
1223 (
long long) sdpblocksizes[block] - nremovedinds[block]);
1224 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
1227 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1230 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
1231 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
1232 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
1233 -(nlpineqs + sdpisolver->nvarbounds));
1236 sdpisolver->sdpa->initializeUpperTriangleSpace();
1239 for (i = 0; i < sdpisolver->nactivevars; i++)
1244 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
1245 #ifdef SCIP_MORE_DEBUG 1246 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
1247 sdpisolver->sdpatoinputmapper[i], i+1);
1250 if ( penaltyparam >= sdpisolver->epsilon )
1251 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
1255 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1256 sdpisolver->sdpa->setInitPoint(
true);
1258 sdpisolver->sdpa->setInitPoint(
false);
1266 assert( nsdpblocks > 0 );
1267 assert( sdpnblockvarnonz != NULL );
1268 assert( sdpnblockvars != NULL );
1269 assert( sdpcol != NULL );
1270 assert( sdprow != NULL );
1271 assert( sdpval != NULL );
1272 assert( sdpvar != NULL );
1273 assert( indchanges != NULL );
1274 assert( nremovedinds != NULL );
1276 for (block = 0; block < nsdpblocks; block++)
1279 if ( blockindchanges[block] == -1 )
1281 #ifdef SCIP_MORE_DEBUG 1282 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
1285 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
1287 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
1289 #ifdef SCIP_MORE_DEBUG 1290 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
1291 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
1297 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1300 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1302 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
1303 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
1305 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
1306 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
1309 #ifdef SCIP_MORE_DEBUG 1310 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
1311 sdpval[block][blockvar][k],
1312 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1313 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1314 sdpisolver->sdpcounter);
1317 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
1318 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1319 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1320 sdpval[block][blockvar][k], checkinput);
1325 if ( penaltyparam >= sdpisolver->epsilon )
1327 #ifdef SCIP_MORE_DEBUG 1328 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
1330 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1332 #ifdef SCIP_MORE_DEBUG 1333 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
1336 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
1337 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
1344 if ( sdpconstnnonz > 0 )
1346 assert( nsdpblocks > 0 );
1347 assert( sdpconstnblocknonz!= NULL );
1348 assert( sdpconstcol != NULL );
1349 assert( sdpconstrow != NULL );
1350 assert( sdpconstval != NULL );
1352 for (block = 0; block < nsdpblocks; block++)
1354 if ( blockindchanges[block] == -1 )
1356 #ifdef SCIP_MORE_DEBUG 1357 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
1359 for (k = 0; k < sdpconstnblocknonz[block]; k++)
1362 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
1364 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
1365 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
1367 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
1368 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
1371 #ifdef SCIP_MORE_DEBUG 1372 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
1373 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1374 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1375 sdpisolver->sdpcounter);
1377 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
1378 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1379 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1380 sdpconstval[block][k], checkinput);
1385 #ifdef SCIP_MORE_DEBUG 1386 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
1390 for (i = 0; i < lpnnonz; i++)
1392 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
1393 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1394 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1397 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1400 assert( rownactivevars[lprow[i]] > 0 );
1401 if ( rownactivevars[lprow[i]] > 1 )
1403 if ( lprow[i] > lastrow )
1407 if ( penaltyparam >= sdpisolver->epsilon )
1410 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1412 #ifdef SCIP_MORE_DEBUG 1413 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1414 sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], sdpisolver->sdpcounter);
1418 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1419 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], 1.0, checkinput);
1423 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1425 #ifdef SCIP_MORE_DEBUG 1426 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1427 sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
1431 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1432 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], 1.0, checkinput);
1437 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1439 #ifdef SCIP_MORE_DEBUG 1440 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1441 lpval[i], sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1444 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1445 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], lpval[i], checkinput);
1448 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1450 #ifdef SCIP_MORE_DEBUG 1451 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1452 -1 * lpval[i], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1456 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1457 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
1465 for (i = 0; i < nlpcons; i++)
1470 #ifdef SCIP_MORE_DEBUG 1471 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1474 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1475 (
long long) lpconsind, lplhs[i], checkinput);
1482 #ifdef SCIP_MORE_DEBUG 1483 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1487 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1488 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1493 assert( lpconsind == nlpineqs + 1 );
1496 #ifdef SCIP_MORE_DEBUG 1499 for (i = 0; i < lpnnonz; i++)
1502 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1504 if ( rownactivevars[lprow[i]] > 1 )
1506 if ( lprow[i] > lastrow )
1511 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1513 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1518 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"%f <= ", lplhs[ind]);
1520 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1527 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1529 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1531 assert( ind == nlpcons - 1 );
1536 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1538 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1541 if ( sdpisolver->varboundpos[i] < 0 )
1545 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1546 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1548 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1551 #ifdef SCIP_MORE_DEBUG 1552 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1553 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1554 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1556 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1557 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1562 #ifdef SCIP_MORE_DEBUG 1563 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1564 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1565 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1575 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1576 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1578 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1581 #ifdef SCIP_MORE_DEBUG 1582 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1583 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1584 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1586 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1587 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1592 #ifdef SCIP_MORE_DEBUG 1593 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1594 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1595 sdpisolver->varboundpos[i]);
1601 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1604 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1605 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1606 #ifdef SCIP_MORE_DEBUG 1607 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1612 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds);
1615 sdpisolver->sdpa->initializeUpperTriangle();
1616 sdpisolver->sdpa->initializeSolve();
1619 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1625 for (i = 1; i <= sdpisolver->nactivevars; i++)
1626 sdpisolver->sdpa->inputInitXVec((
long long) i, starty[sdpisolver->sdpatoinputmapper[i - 1]]);
1629 for (b = 0; b < nsdpblocks; b++)
1631 if ( blockindchanges[b] > -1)
1633 for (i = 0; i < startZnblocknonz[b]; i++)
1635 if ( indchanges[b][startZrow[b][i]] > -1 && indchanges[b][startZcol[b][i]] > -1 )
1637 sdpisolver->sdpa->inputInitXMat((
long long) b + 1 - blockindchanges[b], (
long long) startZrow[b][i] + 1 - indchanges[b][startZrow[b][i]],
1638 (
long long) startZcol[b][i] + 1 - indchanges[b][startZcol[b][i]], startZval[b][i]);
1645 for (i = 0; i < startZnblocknonz[nsdpblocks]; i++)
1647 assert( startZrow[nsdpblocks][i] == startZcol[nsdpblocks][i] );
1649 if ( startZrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1651 sdpaind = sdpisolver->rowmapper[startZrow[nsdpblocks][i]];
1653 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startZval[nsdpblocks][i]);
1657 varboundind = sdpisolver->inputtovbmapper[startZrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1658 if ( varboundind > -1 )
1660 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1661 nlpineqs + varboundind + 1, startZval[nsdpblocks][i]);
1667 for (b = 0; b < nsdpblocks; b++)
1669 if ( blockindchanges[b] > -1)
1671 for (i = 0; i < startXnblocknonz[b]; i++)
1673 if ( indchanges[b][startXrow[b][i]] > -1 && indchanges[b][startXcol[b][i]] > -1 )
1675 sdpisolver->sdpa->inputInitYMat((
long long) b + 1 - blockindchanges[b], (
long long) startXrow[b][i] + 1 - indchanges[b][startXrow[b][i]],
1676 (
long long) startXcol[b][i] + 1 - indchanges[b][startXcol[b][i]], startXval[b][i]);
1683 for (i = 0; i < startXnblocknonz[nsdpblocks]; i++)
1685 assert( startXrow[nsdpblocks][i] == startXcol[nsdpblocks][i] );
1687 if ( startXrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1689 sdpaind = sdpisolver->rowmapper[startXrow[nsdpblocks][i]];
1691 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startXval[nsdpblocks][i]);
1695 varboundind = sdpisolver->inputtovbmapper[startXrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1696 if ( varboundind > -1 )
1698 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1699 nlpineqs + varboundind + 1, startXval[nsdpblocks][i]);
1704 else if ( penaltyparam >= sdpisolver->epsilon )
1705 SCIPdebugMessage(
"Skipping insertion of starting point for penalty formulation.\n");
1707 #ifdef SCIP_DEBUG_PRINTTOFILE 1709 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1710 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1713 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1722 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->preoptimalgap);
1723 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->preoptimalgap);
1724 sdpisolver->sdpa->solve();
1729 SCIPdebugMessage(
"Saving preoptimal solution for warmstarting purposes\n");
1730 sdpasol = sdpisolver->sdpa->getResultXVec();
1733 for (i = 0; i < sdpisolver->nactivevars; i++)
1734 sdpisolver->preoptimalsol[i] = sdpasol[i];
1737 for (b = 0; b < sdpisolver->sdpa->getBlockNumber(); b++)
1739 sdpasol = sdpisolver->sdpa->getResultYMat(b + 1);
1740 sdpablocksize = sdpisolver->sdpa->getBlockSize(b + 1);
1741 if ( sdpisolver->sdpa->getBlockType(b + 1) == SDPA::LP )
1744 for (i = 0; i < sdpablocksize; i++)
1745 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1750 for (i = 0; i < sdpablocksize * sdpablocksize; i++)
1751 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1755 sdpisolver->preoptimalsolexists = TRUE;
1759 SCIPdebugMessage(
"Solving to gaptol failed! No preoptimal solution available.\n");
1763 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1766 sdpisolver->sdpa->setInitPoint(
true);
1767 sdpisolver->sdpa->copyCurrentToInit();
1768 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1769 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1770 sdpisolver->sdpa->solve();
1773 sdpisolver->sdpa->solve();
1775 sdpisolver->solved = TRUE;
1778 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1779 sdpisolver->nsdpcalls += 1;
1783 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1784 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1790 else if ( penaltyparam >= sdpisolver->epsilon )
1795 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1796 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1797 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1804 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1807 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1808 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1809 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1810 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1813 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1815 sdpisolver->sdpa->setParameterUpperBound(1e8);
1818 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1820 #ifdef SCIP_MORE_DEBUG 1821 sdpisolver->sdpa->printParameters(stdout);
1823 sdpisolver->sdpa->setInitPoint(
false);
1824 #ifdef SDPA_RESETPARAMS 1825 sdpisolver->sdpa->resetParameters();
1827 sdpisolver->sdpa->initializeSolve();
1829 sdpisolver->sdpa->solve();
1830 sdpisolver->solved = TRUE;
1833 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1834 sdpisolver->nsdpcalls += 1;
1842 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1843 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1848 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1849 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1850 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1857 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1860 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1863 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1866 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1868 sdpisolver->sdpa->setParameterUpperBound(1e8);
1871 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1873 #ifdef SCIP_MORE_DEBUG 1874 sdpisolver->sdpa->printParameters(stdout);
1876 sdpisolver->sdpa->setInitPoint(
false);
1877 #ifdef SDPA_RESETPARAMS 1878 sdpisolver->sdpa->resetParameters();
1880 sdpisolver->sdpa->initializeSolve();
1882 sdpisolver->sdpa->solve();
1883 sdpisolver->solved = TRUE;
1886 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1887 sdpisolver->nsdpcalls += 1;
1895 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1896 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1901 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1902 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1903 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1906 #ifdef SCIP_MORE_DEBUG 1907 (void) fclose(fpOut);
1911 if ( penaltyparam >= sdpisolver->epsilon )
1917 SCIP_Real trace = 0.0;
1920 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1922 sdpasol = sdpisolver->sdpa->getResultXVec();
1925 assert( feasorig != NULL );
1926 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1931 sdpisolver->feasorig = *feasorig;
1935 if ( ! *feasorig && penaltybound != NULL )
1939 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1944 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1945 for (b = 1; b <= nblockssdpa; b++)
1948 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1949 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1950 assert( nrow >= 0 );
1953 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1956 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1962 for (i = 0; i < nrow; i++)
1963 trace += X[i + i*nrow];
1970 if ( penaltybound != NULL )
1971 *penaltybound = TRUE;
1972 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1973 trace, penaltyparam);
1975 else if ( penaltybound != NULL )
1976 *penaltybound = FALSE;
2002 assert( sdpisolver != NULL );
2003 return sdpisolver->solved;
2016 SDPA::PhaseType phasetype;
2018 assert( sdpisolver != NULL );
2019 assert( sdpisolver->sdpa != NULL);
2022 phasetype = sdpisolver->sdpa->getPhaseValue();
2024 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2033 SCIP_Bool* primalfeasible,
2034 SCIP_Bool* dualfeasible
2037 SDPA::PhaseType phasetype;
2039 assert( sdpisolver != NULL );
2040 assert( sdpisolver->sdpa != NULL );
2041 assert( primalfeasible != NULL );
2042 assert( dualfeasible != NULL );
2045 phasetype = sdpisolver->sdpa->getPhaseValue();
2047 switch ( phasetype )
2050 *primalfeasible = TRUE;
2051 *dualfeasible = TRUE;
2054 *primalfeasible = TRUE;
2055 *dualfeasible = TRUE;
2057 case SDPA::pFEAS_dINF:
2058 *primalfeasible = TRUE;
2059 *dualfeasible = FALSE;
2061 case SDPA::pINF_dFEAS:
2062 *primalfeasible = FALSE;
2063 *dualfeasible = TRUE;
2066 *primalfeasible = TRUE;
2067 *dualfeasible = FALSE;
2068 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
2071 *primalfeasible = FALSE;
2072 *dualfeasible = TRUE;
2073 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
2076 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
2077 return SCIP_LPERROR;
2090 SDPA::PhaseType phasetype;
2092 assert( sdpisolver != NULL );
2093 assert( sdpisolver->sdpa != NULL );
2096 phasetype = sdpisolver->sdpa->getPhaseValue();
2098 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2100 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
2103 else if ( phasetype == SDPA::pFEAS_dINF )
2105 else if ( phasetype == SDPA::pUNBD )
2107 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2121 SDPA::PhaseType phasetype;
2123 assert( sdpisolver != NULL );
2124 assert( sdpisolver->sdpa != NULL );
2127 phasetype = sdpisolver->sdpa->getPhaseValue();
2129 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2131 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
2134 else if ( phasetype == SDPA::pINF_dFEAS )
2136 else if ( phasetype == SDPA::dUNBD )
2138 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");
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");
2214 SDPA::PhaseType phasetype;
2216 assert( sdpisolver != NULL );
2217 assert( sdpisolver->sdpa != NULL);
2220 phasetype = sdpisolver->sdpa->getPhaseValue();
2222 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2224 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
2227 else if ( phasetype == SDPA::pFEAS_dINF )
2229 else if ( phasetype == SDPA::pUNBD )
2231 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2245 SDPA::PhaseType phasetype;
2247 assert( sdpisolver != NULL );
2248 assert( sdpisolver->sdpa != NULL);
2251 phasetype = sdpisolver->sdpa->getPhaseValue();
2253 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2255 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2258 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2260 else if ( phasetype == SDPA::dUNBD )
2262 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2274 SDPA::PhaseType phasetype;
2276 assert( sdpisolver != NULL );
2277 assert( sdpisolver->sdpa != NULL );
2280 phasetype = sdpisolver->sdpa->getPhaseValue();
2282 if ( phasetype == SDPA::pdOPT )
2293 SDPA::PhaseType phasetype;
2295 assert( sdpisolver != NULL );
2296 assert( sdpisolver->sdpa != NULL );
2299 phasetype = sdpisolver->sdpa->getPhaseValue();
2301 if ( phasetype == SDPA::pUNBD )
2312 SDPA::PhaseType phasetype;
2314 assert( sdpisolver != NULL );
2315 assert( sdpisolver->sdpa != NULL);
2318 phasetype = sdpisolver->sdpa->getPhaseValue();
2320 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2322 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
2334 assert( sdpisolver != NULL );
2336 return sdpisolver->timelimit;
2354 SDPA::PhaseType phasetype;
2356 assert( sdpisolver != NULL );
2357 assert( sdpisolver->sdpa != NULL );
2359 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
2362 phasetype = sdpisolver->sdpa->getPhaseValue();
2364 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
2366 if ( phasetype == SDPA::pdINF )
2368 if ( phasetype == SDPA::pUNBD )
2370 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2381 SDPA::PhaseType phasetype;
2383 assert( sdpisolver != NULL );
2384 assert( sdpisolver->sdpa != NULL );
2386 if ( ! sdpisolver->solved )
2389 phasetype = sdpisolver->sdpa->getPhaseValue();
2391 if ( phasetype == SDPA::pdOPT )
2404 SDPA::PhaseType phasetype;
2406 assert( sdpisolver != NULL );
2407 assert( sdpisolver->sdpa != NULL );
2409 if ( sdpisolver->timelimit )
2412 if ( ! sdpisolver->solved )
2415 phasetype = sdpisolver->sdpa->getPhaseValue();
2419 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
2431 SCIPdebugMessage(
"Not implemented yet\n");
2433 return SCIP_LPERROR;
2442 assert( sdpisolver != NULL );
2443 assert( sdpisolver->sdpa != NULL );
2444 assert( objval != NULL );
2447 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2449 *objval = sdpisolver->sdpa->getPrimalObj();
2451 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2452 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2453 if ( gap > sdpisolver->gaptol )
2455 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, " 2456 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2467 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2468 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2469 sdpasol = sdpisolver->sdpa->getResultXVec();
2472 for (v = 0; v < sdpisolver->nactivevars; v++)
2473 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2477 *objval += sdpisolver->fixedvarsobjcontr;
2497 assert( sdpisolver != NULL );
2498 assert( sdpisolver->sdpa != NULL );
2499 assert( dualsollength != NULL );
2502 if ( objval != NULL )
2504 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2506 *objval = sdpisolver->sdpa->getPrimalObj();
2508 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2509 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2510 if ( gap > sdpisolver->gaptol )
2512 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, " 2513 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2521 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2522 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2523 sdpasol = sdpisolver->sdpa->getResultXVec();
2526 for (v = 0; v < sdpisolver->nactivevars; v++)
2527 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2531 *objval += sdpisolver->fixedvarsobjcontr;
2534 if ( *dualsollength > 0 )
2536 assert( dualsol != NULL );
2537 if ( *dualsollength < sdpisolver->nvars )
2539 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2540 *dualsollength = sdpisolver->nvars;
2546 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2547 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2548 sdpasol = sdpisolver->sdpa->getResultXVec();
2550 for (v = 0; v < sdpisolver->nvars; v++)
2552 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2555 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2560 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2561 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2572 int* startXnblocknonz
2584 assert( sdpisolver != NULL );
2585 assert( nblocks > 0 );
2586 assert( startXnblocknonz != NULL );
2589 if ( ! sdpisolver->preoptimalsolexists )
2591 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2592 startXnblocknonz[0] = -1;
2596 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2598 SCIPerrorMessage(
"SCIPsdpiSolverGetPreoptimalPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2599 return SCIP_LPERROR;
2603 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2605 sdpablock = sdpisolver->inputtoblockmapper[b];
2607 startXnblocknonz[b] = 0;
2609 if ( sdpablock != -1 )
2611 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2614 for (r = 0; r < blocksize; r++)
2616 for (c = r; c < blocksize; c++)
2618 sdpaind = r + blocksize * c;
2620 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2621 startXnblocknonz[b]++;
2628 startXnblocknonz[nblocks - 1] = 0;
2629 sdpablock = sdpisolver->sdpa->getBlockNumber();
2631 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2633 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2635 for (i = 0; i < blocksize; i++)
2637 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2638 startXnblocknonz[b]++;
2660 int* startXnblocknonz,
2664 SCIP_Real** startXval
2675 SCIP_Bool msgthrown = FALSE;
2677 assert( sdpisolver != NULL );
2678 assert( success != NULL );
2679 assert( dualsol != NULL );
2680 assert( dualsollength != NULL );
2681 assert( *dualsollength >= 0 );
2682 assert( startXnblocknonz != NULL || nblocks == -1 );
2683 assert( startXrow != NULL || nblocks == -1 );
2684 assert( startXcol != NULL || nblocks == -1 );
2685 assert( startXval != NULL || nblocks == -1 );
2687 if ( ! sdpisolver->preoptimalsolexists )
2689 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2694 if ( *dualsollength < sdpisolver->nvars )
2696 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2698 *dualsollength = sdpisolver->nvars;
2702 for (v = 0; v < sdpisolver->nvars; v++)
2704 if (sdpisolver->inputtosdpamapper[v] > 0)
2707 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtosdpamapper[v] - 1];
2712 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2716 *dualsollength = sdpisolver->nvars;
2720 assert( startXnblocknonz != NULL );
2721 assert( startXrow != NULL );
2722 assert( startXcol != NULL );
2723 assert( startXval != NULL );
2726 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2728 assert( startXrow[b] != NULL );
2729 assert( startXcol[b] != NULL );
2730 assert( startXval[b] != NULL );
2732 sdpablock = sdpisolver->inputtoblockmapper[b];
2736 if ( sdpablock != -1 )
2739 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2743 for (r = 0; r < blocksize; r++)
2745 for (c = r; c < blocksize; c++)
2747 sdpaind = r + blocksize * c;
2749 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2751 if ( blocknnonz < startXnblocknonz[b] )
2753 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2754 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2755 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind];
2762 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2770 startXnblocknonz[b] = blocknnonz;
2773 startXnblocknonz[b] = 0;
2780 sdpablock = sdpisolver->sdpa->getBlockNumber();
2782 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2787 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2790 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
2792 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2794 if ( blocknnonz < startXnblocknonz[b] )
2796 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2797 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2798 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2806 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2814 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
2816 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2818 if ( blocknnonz < startXnblocknonz[b] )
2823 vbpos = i - (blocksize - sdpisolver->nvarbounds);
2826 if ( sdpisolver->varboundpos[vbpos] > 0 )
2827 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
2829 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
2830 startXrow[b][blocknnonz] = inputpos;
2831 startXcol[b][blocknnonz] = inputpos;
2832 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2840 SCIPdebugMessage(
"Insufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2846 startXnblocknonz[b] = blocknnonz;
2849 startXnblocknonz[b] = 0;
2877 assert( sdpisolver != NULL );
2878 assert( sdpisolver->sdpa != NULL );
2879 assert( lbvars != NULL );
2880 assert( ubvars != NULL );
2881 assert( arraylength != NULL );
2882 assert( *arraylength >= 0 );
2886 if ( *arraylength < sdpisolver->nvars )
2888 *arraylength = sdpisolver->nvars;
2889 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2894 for (i = 0; i < sdpisolver->nvars; i++)
2901 if ( sdpisolver->nvarbounds == 0 )
2903 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
2908 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2909 if ( ! (sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP) )
2916 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
2917 assert( nlpcons >= 0 );
2919 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
2922 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2924 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
2926 if ( sdpisolver->varboundpos[i] < 0 )
2930 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2936 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2947 int* startXnblocknonz
2959 assert( sdpisolver != NULL );
2960 assert( nblocks > 0 );
2961 assert( startXnblocknonz != NULL );
2964 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2966 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2967 return SCIP_LPERROR;
2971 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2973 sdpablock = sdpisolver->inputtoblockmapper[b];
2975 startXnblocknonz[b] = 0;
2977 if ( sdpablock != -1 )
2979 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2980 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2983 for (r = 0; r < blocksize; r++)
2985 for (c = r; c < blocksize; c++)
2987 sdpaind = r + blocksize * c;
2989 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2990 startXnblocknonz[b]++;
2997 startXnblocknonz[nblocks - 1] = 0;
2998 sdpablock = sdpisolver->sdpa->getBlockNumber();
3000 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3002 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3003 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3005 for (i = 0; i < blocksize; i++)
3007 if ( REALABS(X[i]) > sdpisolver->epsilon )
3008 startXnblocknonz[b]++;
3024 int* startXnblocknonz,
3028 SCIP_Real** startXval
3039 SCIP_Bool msgthrown = FALSE;
3041 assert( sdpisolver != NULL );
3042 assert( nblocks > 0 );
3043 assert( startXnblocknonz != NULL );
3044 assert( startXrow != NULL );
3045 assert( startXcol != NULL );
3046 assert( startXval != NULL );
3049 if ( nblocks != sdpisolver->nsdpblocks + 1 )
3051 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
3052 return SCIP_LPERROR;
3056 for (b = 0; b < sdpisolver->nsdpblocks; b++)
3058 sdpablock = sdpisolver->inputtoblockmapper[b];
3062 if ( sdpablock != -1 )
3064 X = sdpisolver->sdpa->getResultYMat(sdpablock);
3065 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3069 for (r = 0; r < blocksize; r++)
3071 for (c = r; c < blocksize; c++)
3073 sdpaind = r + blocksize * c;
3075 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
3077 if ( blocknnonz < startXnblocknonz[b] )
3079 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
3080 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
3081 startXval[b][blocknnonz] = X[sdpaind];
3088 SCIPdebugMessage(
"Insufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
3096 startXnblocknonz[b] = blocknnonz;
3099 startXnblocknonz[b] = 0;
3104 sdpablock = sdpisolver->sdpa->getBlockNumber();
3106 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3110 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3111 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3114 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
3116 if ( REALABS(X[i]) > sdpisolver->epsilon )
3118 if ( blocknnonz < startXnblocknonz[b] )
3120 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3121 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3122 startXval[b][blocknnonz] = X[i];
3130 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3138 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
3140 if ( REALABS(X[i]) > sdpisolver->epsilon )
3142 if ( blocknnonz < startXnblocknonz[b] )
3147 vbpos = i - (blocksize - sdpisolver->nvarbounds);
3150 if ( sdpisolver->varboundpos[vbpos] > 0 )
3151 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
3153 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
3154 startXrow[b][blocknnonz] = inputpos;
3155 startXcol[b][blocknnonz] = inputpos;
3156 startXval[b][blocknnonz] = X[i];
3164 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3170 startXnblocknonz[b] = blocknnonz;
3173 startXnblocknonz[b] = 0;
3191 assert( sdpisolver != NULL );
3192 assert( sdpisolver->sdpa != NULL );
3194 nblocks = (int) sdpisolver->sdpa->getBlockNumber();
3198 for (b = 0; b < nblocks; b++)
3201 blocksize = (int) sdpisolver->sdpa->getBlockSize((
long long) b + 1);
3202 arraylength = sdpisolver->sdpa->getBlockType((
long long) b + 1) == SDPA::LP ? blocksize : (blocksize * (blocksize + 1) / 2);
3205 X = sdpisolver->sdpa->getResultYMat((
long long) b + 1);
3206 for (i = 0; i < arraylength; i++)
3208 if ( X[i] > maxentry )
3222 assert( sdpisolver != NULL );
3223 assert( sdpisolver->sdpa != NULL );
3224 assert( iterations != NULL );
3226 *iterations = sdpisolver->niterations;
3237 assert( sdpisolver != NULL );
3238 assert( sdpisolver->sdpa != NULL );
3239 assert( calls != NULL );
3241 *calls = sdpisolver->nsdpcalls;
3252 assert( sdpisolver != NULL );
3253 assert( usedsetting != NULL );
3256 *usedsetting = sdpisolver->usedsetting;
3297 assert( sdpisolver != NULL );
3298 assert( dval != NULL );
3303 *dval = sdpisolver->epsilon;
3306 *dval = sdpisolver->gaptol;
3309 *dval = sdpisolver->feastol;
3312 *dval = sdpisolver->sdpsolverfeastol;
3316 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3319 *dval = sdpisolver->objlimit;
3322 *dval = sdpisolver->lambdastar;
3325 *dval = sdpisolver->preoptimalgap;
3328 return SCIP_PARAMETERUNKNOWN;
3341 assert( sdpisolver != NULL );
3346 sdpisolver->epsilon = dval;
3347 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
3350 sdpisolver->gaptol = dval;
3351 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
3354 sdpisolver->feastol = dval;
3355 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
3358 sdpisolver->sdpsolverfeastol = dval;
3359 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
3362 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3365 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
3366 sdpisolver->objlimit = dval;
3369 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
3370 sdpisolver->lambdastar = dval;
3373 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
3374 sdpisolver->preoptimalgap = dval;
3377 return SCIP_PARAMETERUNKNOWN;
3390 assert( sdpisolver != NULL );
3395 *ival = (int) sdpisolver->sdpinfo;
3396 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
3399 return SCIP_PARAMETERUNKNOWN;
3412 assert( sdpisolver != NULL );
3417 sdpisolver->sdpinfo = (SCIP_Bool) ival;
3418 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
3421 return SCIP_PARAMETERUNKNOWN;
3435 assert( sdpisolver != NULL );
3440 #ifdef LAMBDASTAR_TWOPOINTS 3461 sdpisolver->lambdastar = compval;
3462 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
3472 SCIP_Real* penaltyparam
3477 assert( sdpisolver != NULL );
3478 assert( penaltyparam != NULL );
3494 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
3495 *penaltyparam = compval;
3503 SCIP_Real penaltyparam,
3504 SCIP_Real* maxpenaltyparam
3509 assert( sdpisolver != NULL );
3510 assert( maxpenaltyparam != NULL );
3516 *maxpenaltyparam = compval;
3517 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
3546 SCIPdebugMessage(
"Not implemented yet\n");
3547 return SCIP_LPERROR;
3556 assert( fname != NULL );
3558 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)