50 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
51 #include "sdpa_call.h"
52 #pragma GCC diagnostic warning "-Wstrict-prototypes"
54 #include "blockmemshell/memory.h"
56 #include "scip/pub_misc.h"
58 #include "scip/pub_message.h"
65 #define GAPTOLCHANGE 1
66 #define FEASTOLCHANGE 1
67 #define PENALTYBOUNDTOL 1E-3
70 #define INFEASFEASTOLCHANGE 0.1
71 #define INFEASMINFEASTOL 1E-9
73 #define MIN_LAMBDASTAR 1e0
74 #define MAX_LAMBDASTAR 1e8
75 #define LAMBDASTAR_FACTOR 1e0
76 #define LAMBDASTAR_TWOPOINTS TRUE
77 #define LAMBDASTAR_THRESHOLD 1e1
78 #define LAMBDASTAR_LOW 1.5
79 #define LAMBDASTAR_HIGH 1e5
81 #define MIN_PENALTYPARAM 1e5
82 #define MAX_PENALTYPARAM 1e12
83 #define PENALTYPARAM_FACTOR 1e1
84 #define MAX_MAXPENALTYPARAM 1e15
85 #define MAXPENALTYPARAM_FACTOR 1e6
89 #define BMS_CALL(x) do \
93 SCIPerrorMessage("No memory in function call.\n"); \
94 return SCIP_NOMEMORY; \
100 #define CHECK_IF_SOLVED(sdpisolver) do \
102 if (!(sdpisolver->solved)) \
104 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
105 return SCIP_LPERROR; \
111 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
113 if (!(sdpisolver->solved)) \
115 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
123 struct SCIP_SDPiSolver
125 SCIP_MESSAGEHDLR* messagehdlr;
131 int* inputtosdpamapper;
134 int* sdpatoinputmapper;
135 SCIP_Real* fixedvarsval;
136 SCIP_Real fixedvarsobjcontr;
141 int* inputtovbmapper;
147 int* rowtoinputmapper;
148 int* inputtoblockmapper;
149 int** blockindmapper;
158 SCIP_Real sdpsolverfeastol;
166 SCIP_Real lambdastar;
167 SCIP_Real* preoptimalsol;
168 SCIP_Real** preoptimalsolx;
169 SCIP_Bool preoptimalsolexists;
170 SCIP_Real preoptimalgap;
187 assert( sdpisolver != NULL );
188 assert( lb < ub + sdpisolver->feastol );
190 return (ub-lb <= sdpisolver->epsilon);
193 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
202 SCIP_Real penaltyparam,
210 int* sdpconstnblocknonz,
214 SCIP_Real** sdpconstval,
216 int** sdpnblockvarnonz,
226 int* blockindchanges,
240 char phase_string[15];
243 assert( feastol != NULL );
247 SCIP_Real* solvector;
249 SCIP_Bool infeasible;
252 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
253 nvarspointer = nvars;
255 assert( nvarspointer == nvars );
258 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
259 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
260 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
261 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
263 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
267 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
274 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
276 #ifdef SCIP_MORE_DEBUG
277 sdpisolver->sdpa->printParameters(stdout);
279 sdpisolver->sdpa->setInitPoint(
false);
280 #ifdef SDPA_RESETPARAMS
281 sdpisolver->sdpa->resetParameters();
283 sdpisolver->sdpa->initializeSolve();
285 sdpisolver->sdpa->solve();
288 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
289 sdpisolver->nsdpcalls += 1;
293 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
294 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
299 sdpisolver->solved = FALSE;
300 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
330 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
343 assert( sdpisolver != NULL );
344 return (
void*) sdpisolver->sdpa;
392 SCIP_MESSAGEHDLR* messagehdlr,
397 assert( sdpisolver != NULL );
398 assert( blkmem != NULL );
399 assert( bufmem != NULL );
401 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
403 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
405 (*sdpisolver)->messagehdlr = messagehdlr;
406 (*sdpisolver)->blkmem = blkmem;
407 (*sdpisolver)->bufmem = bufmem;
410 (*sdpisolver)->sdpa = NULL;
412 (*sdpisolver)->nvars = 0;
413 (*sdpisolver)->nactivevars = 0;
414 (*sdpisolver)->nsdpblocks = 0;
415 (*sdpisolver)->inputtosdpamapper = NULL;
416 (*sdpisolver)->sdpatoinputmapper = NULL;
417 (*sdpisolver)->inputtoblockmapper = NULL;
418 (*sdpisolver)->blockindmapper = NULL;
419 (*sdpisolver)->rowmapper = NULL;
420 (*sdpisolver)->rowtoinputmapper = NULL;
421 (*sdpisolver)->fixedvarsval = NULL;
422 (*sdpisolver)->fixedvarsobjcontr = 0.0;
423 (*sdpisolver)->objcoefs = NULL;
424 (*sdpisolver)->nvarbounds = 0;
425 (*sdpisolver)->varboundpos = NULL;
426 (*sdpisolver)->inputtovbmapper = NULL;
427 (*sdpisolver)->solved = FALSE;
428 (*sdpisolver)->timelimit = FALSE;
429 (*sdpisolver)->sdpcounter = 0;
430 (*sdpisolver)->niterations = 0;
431 (*sdpisolver)->nsdpcalls = 0;
432 (*sdpisolver)->ninputlpcons = 0;
433 (*sdpisolver)->nsdpalpcons = 0;
435 (*sdpisolver)->epsilon = 1e-9;
436 (*sdpisolver)->gaptol = 1e-4;
437 (*sdpisolver)->feastol = 1e-6;
438 (*sdpisolver)->sdpsolverfeastol = 1e-6;
440 (*sdpisolver)->sdpinfo = FALSE;
443 (*sdpisolver)->preoptimalsolexists = FALSE;
444 (*sdpisolver)->preoptimalgap = -1.0;
458 assert( sdpisolver != NULL );
459 assert( *sdpisolver != NULL );
461 SCIPdebugMessage(
"Freeing SDPISolver\n");
463 if ( (*sdpisolver)->sdpa != NULL )
465 nsdpblocks = (*sdpisolver)->sdpa->getBlockType((*sdpisolver)->sdpa->getBlockNumber()) == SDPA::LP ?
466 (*sdpisolver)->sdpa->getBlockNumber() - 1 : (*sdpisolver)->sdpa->getBlockNumber();
468 for (b = 0; b < nsdpblocks; b++)
470 blocksize = (*sdpisolver)->sdpa->getBlockSize(b + 1);
472 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->blockindmapper[b]), blocksize);
475 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
477 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[b]), blocksize * blocksize);
481 if ( (*sdpisolver)->preoptimalgap >= 0.0 )
483 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[nsdpblocks + 1]), 2 * (*sdpisolver)->nsdpalpcons + (*sdpisolver)->nvarbounds);
484 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolx, nsdpblocks + 1);
486 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->blockindmapper, nsdpblocks);
490 if ( (*sdpisolver)->sdpa != NULL)
491 delete (*sdpisolver)->sdpa;
493 if ( (*sdpisolver)->nactivevars > 0 && (*sdpisolver)->preoptimalgap > 0.0 )
495 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
498 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtoblockmapper, (*sdpisolver)->nsdpblocks);
500 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowtoinputmapper, 2 * (*sdpisolver)->nsdpalpcons);
501 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowmapper, 2 * (*sdpisolver)->ninputlpcons);
502 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
503 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtovbmapper, 2 * (*sdpisolver)->nvars);
504 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
505 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
506 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
507 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
508 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
518 assert( sdpisolver != NULL );
520 sdpisolver->sdpcounter++;
530 assert( sdpisolver != NULL );
532 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
533 sdpisolver->sdpcounter = 0;
573 int* sdpconstnblocknonz,
577 SCIP_Real** sdpconstval,
579 int** sdpnblockvarnonz,
589 int* blockindchanges,
595 int* lprownactivevars,
601 int* startZnblocknonz,
607 SCIP_Real** startZval,
609 int* startXnblocknonz,
615 SCIP_Real** startXval,
622 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
623 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
624 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval,
625 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
626 timelimit, NULL, NULL);
653 SCIP_Real penaltyparam,
664 int* sdpconstnblocknonz,
668 SCIP_Real** sdpconstval,
670 int** sdpnblockvarnonz,
680 int* blockindchanges,
692 int* startZnblocknonz,
698 SCIP_Real** startZval,
700 int* startXnblocknonz,
706 SCIP_Real** startXval,
713 SCIP_Bool* penaltybound
718 SCIP_Real* sdpavarbounds;
736 SCIP_Bool newlyallocated;
739 char phase_string[15];
742 assert( sdpisolver != NULL );
743 assert( penaltyparam > -1 * sdpisolver->epsilon );
744 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
746 assert( obj != NULL );
747 assert( lb != NULL );
748 assert( ub != NULL );
749 assert( nsdpblocks >= 0 );
750 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
751 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
752 assert( sdpconstnnonz >= 0 );
753 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
754 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
755 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
756 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
757 assert( sdpnnonz >= 0 );
758 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
759 assert( nsdpblocks == 0 || sdpvar != NULL );
760 assert( nsdpblocks == 0 || sdprow != NULL );
761 assert( nsdpblocks == 0 || sdpcol != NULL );
762 assert( nsdpblocks == 0 || sdpval != NULL );
763 assert( nsdpblocks == 0 || indchanges != NULL );
764 assert( nsdpblocks == 0 || nremovedinds != NULL );
765 assert( nsdpblocks == 0 || blockindchanges != NULL );
766 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
767 assert( nlpcons >= 0 );
768 assert( noldlpcons >= nlpcons );
769 assert( nlpcons == 0 || lplhs != NULL );
770 assert( nlpcons == 0 || lprhs != NULL );
771 assert( nlpcons == 0 || rownactivevars != NULL );
772 assert( lpnnonz >= 0 );
773 assert( nlpcons == 0 || lprow != NULL );
774 assert( nlpcons == 0 || lpcol != NULL );
775 assert( nlpcons == 0 || lpval != NULL );
776 assert( startZnblocknonz == NULL || startZrow != NULL );
777 assert( startZnblocknonz == NULL || startZcol != NULL );
778 assert( startZnblocknonz == NULL || startZval != NULL );
779 assert( startXnblocknonz == NULL || startXrow != NULL );
780 assert( startXnblocknonz == NULL || startXcol != NULL );
781 assert( startXnblocknonz == NULL || startXval != NULL );
783 sdpisolver->niterations = 0;
784 sdpisolver->nsdpcalls = 0;
785 sdpisolver->feasorig = FALSE;
788 if ( timelimit <= 0.0 )
790 sdpisolver->solved = FALSE;
791 sdpisolver->timelimit = TRUE;
795 sdpisolver->timelimit = FALSE;
807 if ( penaltyparam < sdpisolver->epsilon )
808 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
810 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
813 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
814 sdpisolver->rbound = rbound;
818 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
819 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
820 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
821 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
823 oldnvars = sdpisolver->nvars;
824 oldnactivevars = sdpisolver->nactivevars;
825 oldsdpalplength = 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds;
826 sdpisolver->nvars = nvars;
827 sdpisolver->nactivevars = 0;
831 sdpisolver->fixedvarsobjcontr = 0.0;
832 for (i = 0; i < nvars; i++)
834 if (
isFixed(sdpisolver, lb[i], ub[i]) )
836 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
837 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
839 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
840 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
844 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
845 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
846 sdpisolver->nactivevars++;
847 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
848 #ifdef SCIP_MORE_DEBUG
849 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
853 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
857 sdpisolver->fixedvarsobjcontr = 0.0;
860 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
861 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
862 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
865 if ( nsdpblocks != sdpisolver->nsdpblocks )
867 if ( sdpisolver->inputtoblockmapper == NULL )
869 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), nsdpblocks) );
873 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtoblockmapper), sdpisolver->nsdpblocks, nsdpblocks) );
878 if ( sdpisolver->nactivevars != oldnactivevars && sdpisolver->preoptimalgap >= 0.0 )
880 if ( oldnactivevars == 0 )
882 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
886 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
889 sdpisolver->preoptimalsolexists = FALSE;
891 sdpisolver->nsdpblocks = nsdpblocks;
894 if ( sdpisolver->sdpa == NULL )
900 nsdpasdpblocks = (sdpisolver->sdpa->getBlockType(sdpisolver->sdpa->getBlockNumber()) == SDPA::LP ?
901 sdpisolver->sdpa->getBlockNumber() - 1 : sdpisolver->sdpa->getBlockNumber());
905 if ( nsdpblocks - nremovedblocks != nsdpasdpblocks )
907 if ( sdpisolver->blockindmapper == NULL )
909 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->blockindmapper), nsdpblocks - nremovedblocks) );
910 newlyallocated = TRUE;
911 if ( sdpisolver->preoptimalgap >= 0.0 )
914 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);
1038 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1040 sdpisolver->sdpa->setParameterUpperBound(1e8);
1043 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1047 #ifdef SCIP_MORE_DEBUG
1048 sdpisolver->sdpa->printParameters(stdout);
1052 sdpisolver->nvarbounds = 0;
1053 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
1055 if ( sdpisolver->nvars != oldnvars )
1057 if ( sdpisolver->inputtovbmapper == NULL )
1059 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * sdpisolver->nvars) );
1063 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtovbmapper), 2 * oldnvars, 2 * sdpisolver->nvars) );
1066 assert( sdpisolver->inputtovbmapper != NULL );
1069 for (i = 0; i < 2 * sdpisolver->nvars; i++)
1070 sdpisolver->inputtovbmapper[i] = -1;
1072 if ( sdpisolver->nactivevars != oldnactivevars )
1074 if ( sdpisolver->varboundpos == NULL )
1076 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
1080 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
1083 assert( sdpisolver->varboundpos != NULL );
1085 for (i = 0; i < sdpisolver->nactivevars; i++)
1087 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
1090 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
1091 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
1092 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i]] = sdpisolver->nvarbounds;
1093 (sdpisolver->nvarbounds)++;
1097 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
1098 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
1099 sdpisolver->inputtovbmapper[2 * sdpisolver->sdpatoinputmapper[i] + 1] = sdpisolver->nvarbounds;
1100 (sdpisolver->nvarbounds)++;
1104 if ( noldlpcons > 0 )
1107 if ( sdpisolver->ninputlpcons != noldlpcons )
1109 if ( sdpisolver->rowmapper == NULL )
1111 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2*noldlpcons) );
1115 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowmapper), 2 * sdpisolver->ninputlpcons, 2*noldlpcons) );
1118 assert( sdpisolver->rowmapper != NULL );
1121 if ( sdpisolver->nsdpalpcons != nlpcons )
1123 if ( sdpisolver->rowtoinputmapper == NULL )
1125 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * nlpcons) );
1129 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->rowtoinputmapper), 2 * sdpisolver->nsdpalpcons, 2 * nlpcons) );
1132 assert( sdpisolver->rowtoinputmapper != NULL );
1134 sdpisolver->ninputlpcons = noldlpcons;
1135 sdpisolver->nsdpalpcons = nlpcons;
1140 for (i = 0; i < noldlpcons; i++)
1142 if ( rownactivevars[i] >= 2 )
1146 sdpisolver->rowmapper[2*i] = pos;
1147 sdpisolver->rowtoinputmapper[pos - 1] = 2*i;
1151 sdpisolver->rowmapper[2*i] = -1;
1154 sdpisolver->rowmapper[2*i + 1] = pos;
1155 sdpisolver->rowtoinputmapper[pos - 1] = 2*i + 1;
1159 sdpisolver->rowmapper[2*i + 1] = -1;
1165 sdpisolver->rowmapper[2*i] = -1;
1166 sdpisolver->rowmapper[2*i + 1] = -1;
1170 assert( nlpineqs <= 2*nlpcons );
1176 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1177 sdpisolver->nvarbounds++;
1179 if ( sdpisolver->sdpinfo )
1180 sdpisolver->sdpa->setDisplay(stdout);
1182 sdpisolver->sdpa->setDisplay(0);
1184 #ifdef SCIP_MORE_DEBUG
1185 FILE* fpOut = fopen(
"output.tmp",
"w");
1188 sdpisolver->sdpa->setResultFile(fpOut);
1192 if ( sdpisolver->preoptimalgap >= 0.0 )
1194 if ( newlyallocated )
1196 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]),
1197 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1201 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsolx[nsdpblocks - nremovedblocks]), oldsdpalplength,
1202 2 * sdpisolver->nsdpalpcons + sdpisolver->nvarbounds) );
1207 if ( penaltyparam < sdpisolver->epsilon )
1208 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
1210 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
1213 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
1214 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
1217 for (block = 0; block < nsdpblocks; block++)
1219 if ( blockindchanges[block] >= 0 )
1221 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
1222 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
1223 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
1224 (
long long) sdpblocksizes[block] - nremovedinds[block]);
1225 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
1228 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1231 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
1232 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
1233 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
1234 -(nlpineqs + sdpisolver->nvarbounds));
1237 sdpisolver->sdpa->initializeUpperTriangleSpace();
1240 for (i = 0; i < sdpisolver->nactivevars; i++)
1245 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
1246 #ifdef SCIP_MORE_DEBUG
1247 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
1248 sdpisolver->sdpatoinputmapper[i], i+1);
1251 if ( penaltyparam >= sdpisolver->epsilon )
1252 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
1256 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1257 sdpisolver->sdpa->setInitPoint(
true);
1259 sdpisolver->sdpa->setInitPoint(
false);
1267 assert( nsdpblocks > 0 );
1268 assert( sdpnblockvarnonz != NULL );
1269 assert( sdpnblockvars != NULL );
1270 assert( sdpcol != NULL );
1271 assert( sdprow != NULL );
1272 assert( sdpval != NULL );
1273 assert( sdpvar != NULL );
1274 assert( indchanges != NULL );
1275 assert( nremovedinds != NULL );
1277 for (block = 0; block < nsdpblocks; block++)
1280 if ( blockindchanges[block] == -1 )
1282 #ifdef SCIP_MORE_DEBUG
1283 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
1286 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
1288 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
1290 #ifdef SCIP_MORE_DEBUG
1291 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
1292 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
1298 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1301 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1303 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
1304 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
1306 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
1307 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
1310 #ifdef SCIP_MORE_DEBUG
1311 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
1312 sdpval[block][blockvar][k],
1313 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1314 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1315 sdpisolver->sdpcounter);
1318 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
1319 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
1320 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1321 sdpval[block][blockvar][k], checkinput);
1326 if ( penaltyparam >= sdpisolver->epsilon )
1328 #ifdef SCIP_MORE_DEBUG
1329 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
1331 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1333 #ifdef SCIP_MORE_DEBUG
1334 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
1337 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
1338 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
1345 if ( sdpconstnnonz > 0 )
1347 assert( nsdpblocks > 0 );
1348 assert( sdpconstnblocknonz!= NULL );
1349 assert( sdpconstcol != NULL );
1350 assert( sdpconstrow != NULL );
1351 assert( sdpconstval != NULL );
1353 for (block = 0; block < nsdpblocks; block++)
1355 if ( blockindchanges[block] == -1 )
1357 #ifdef SCIP_MORE_DEBUG
1358 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
1360 for (k = 0; k < sdpconstnblocknonz[block]; k++)
1363 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
1365 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
1366 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
1368 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
1369 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
1372 #ifdef SCIP_MORE_DEBUG
1373 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
1374 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1375 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1376 sdpisolver->sdpcounter);
1378 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
1379 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1380 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1381 sdpconstval[block][k], checkinput);
1386 #ifdef SCIP_MORE_DEBUG
1387 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
1391 for (i = 0; i < lpnnonz; i++)
1393 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
1394 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1395 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1398 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1401 assert( rownactivevars[lprow[i]] > 0 );
1402 if ( rownactivevars[lprow[i]] > 1 )
1404 if ( lprow[i] > lastrow )
1408 if ( penaltyparam >= sdpisolver->epsilon )
1411 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1413 #ifdef SCIP_MORE_DEBUG
1414 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1415 sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], sdpisolver->sdpcounter);
1419 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1420 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], 1.0, checkinput);
1424 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1426 #ifdef SCIP_MORE_DEBUG
1427 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1428 sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
1432 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1433 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], 1.0, checkinput);
1438 if ( sdpisolver->rowmapper[2*lastrow] > -1 )
1440 #ifdef SCIP_MORE_DEBUG
1441 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1442 lpval[i], sdpisolver->rowmapper[2*lastrow], sdpisolver->rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1445 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1446 (
long long) sdpisolver->rowmapper[2*lastrow], (
long long) sdpisolver->rowmapper[2*lastrow], lpval[i], checkinput);
1449 if ( sdpisolver->rowmapper[2*lastrow + 1] > -1 )
1451 #ifdef SCIP_MORE_DEBUG
1452 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1453 -1 * lpval[i], sdpisolver->rowmapper[2*lastrow + 1], sdpisolver->rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1457 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1458 (
long long) sdpisolver->rowmapper[2*lastrow + 1], (
long long) sdpisolver->rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
1466 for (i = 0; i < nlpcons; i++)
1471 #ifdef SCIP_MORE_DEBUG
1472 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1475 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1476 (
long long) lpconsind, lplhs[i], checkinput);
1483 #ifdef SCIP_MORE_DEBUG
1484 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1488 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1489 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1494 assert( lpconsind == nlpineqs + 1 );
1497 #ifdef SCIP_MORE_DEBUG
1500 for (i = 0; i < lpnnonz; i++)
1503 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1505 if ( rownactivevars[lprow[i]] > 1 )
1507 if ( lprow[i] > lastrow )
1512 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1514 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1519 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"%f <= ", lplhs[ind]);
1521 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1528 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1530 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1532 assert( ind == nlpcons - 1 );
1537 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1539 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1542 if ( sdpisolver->varboundpos[i] < 0 )
1546 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1547 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1549 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1552 #ifdef SCIP_MORE_DEBUG
1553 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1554 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1555 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1557 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1558 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1563 #ifdef SCIP_MORE_DEBUG
1564 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1565 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1566 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1576 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1577 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1579 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1582 #ifdef SCIP_MORE_DEBUG
1583 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1584 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1585 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1587 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1588 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1593 #ifdef SCIP_MORE_DEBUG
1594 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1595 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1596 sdpisolver->varboundpos[i]);
1602 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1605 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1606 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1607 #ifdef SCIP_MORE_DEBUG
1608 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1613 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds);
1616 sdpisolver->sdpa->initializeUpperTriangle();
1617 sdpisolver->sdpa->initializeSolve();
1620 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1626 for (i = 1; i <= sdpisolver->nactivevars; i++)
1627 sdpisolver->sdpa->inputInitXVec((
long long) i, starty[sdpisolver->sdpatoinputmapper[i - 1]]);
1630 for (b = 0; b < nsdpblocks; b++)
1632 if ( blockindchanges[b] > -1)
1634 for (i = 0; i < startZnblocknonz[b]; i++)
1636 if ( indchanges[b][startZrow[b][i]] > -1 && indchanges[b][startZcol[b][i]] > -1 )
1638 sdpisolver->sdpa->inputInitXMat((
long long) b + 1 - blockindchanges[b], (
long long) startZrow[b][i] + 1 - indchanges[b][startZrow[b][i]],
1639 (
long long) startZcol[b][i] + 1 - indchanges[b][startZcol[b][i]], startZval[b][i]);
1646 for (i = 0; i < startZnblocknonz[nsdpblocks]; i++)
1648 assert( startZrow[nsdpblocks][i] == startZcol[nsdpblocks][i] );
1650 if ( startZrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1652 sdpaind = sdpisolver->rowmapper[startZrow[nsdpblocks][i]];
1654 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startZval[nsdpblocks][i]);
1658 varboundind = sdpisolver->inputtovbmapper[startZrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1659 if ( varboundind > -1 )
1661 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1662 nlpineqs + varboundind + 1, startZval[nsdpblocks][i]);
1668 for (b = 0; b < nsdpblocks; b++)
1670 if ( blockindchanges[b] > -1)
1672 for (i = 0; i < startXnblocknonz[b]; i++)
1674 if ( indchanges[b][startXrow[b][i]] > -1 && indchanges[b][startXcol[b][i]] > -1 )
1676 sdpisolver->sdpa->inputInitYMat((
long long) b + 1 - blockindchanges[b], (
long long) startXrow[b][i] + 1 - indchanges[b][startXrow[b][i]],
1677 (
long long) startXcol[b][i] + 1 - indchanges[b][startXcol[b][i]], startXval[b][i]);
1684 for (i = 0; i < startXnblocknonz[nsdpblocks]; i++)
1686 assert( startXrow[nsdpblocks][i] == startXcol[nsdpblocks][i] );
1688 if ( startXrow[nsdpblocks][i] < 2 * sdpisolver->ninputlpcons )
1690 sdpaind = sdpisolver->rowmapper[startXrow[nsdpblocks][i]];
1692 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startXval[nsdpblocks][i]);
1696 varboundind = sdpisolver->inputtovbmapper[startXrow[nsdpblocks][i] - 2 * sdpisolver->ninputlpcons];
1697 if ( varboundind > -1 )
1699 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1700 nlpineqs + varboundind + 1, startXval[nsdpblocks][i]);
1705 else if ( penaltyparam >= sdpisolver->epsilon )
1706 SCIPdebugMessage(
"Skipping insertion of starting point for penalty formulation.\n");
1708 #ifdef SCIP_DEBUG_PRINTTOFILE
1710 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1711 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1714 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1723 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->preoptimalgap);
1724 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->preoptimalgap);
1725 sdpisolver->sdpa->solve();
1730 SCIPdebugMessage(
"Saving preoptimal solution for warmstarting purposes\n");
1731 sdpasol = sdpisolver->sdpa->getResultXVec();
1734 for (i = 0; i < sdpisolver->nactivevars; i++)
1735 sdpisolver->preoptimalsol[i] = sdpasol[i];
1738 for (b = 0; b < sdpisolver->sdpa->getBlockNumber(); b++)
1740 sdpasol = sdpisolver->sdpa->getResultYMat(b + 1);
1741 sdpablocksize = sdpisolver->sdpa->getBlockSize(b + 1);
1742 if ( sdpisolver->sdpa->getBlockType(b + 1) == SDPA::LP )
1745 for (i = 0; i < sdpablocksize; i++)
1746 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1751 for (i = 0; i < sdpablocksize * sdpablocksize; i++)
1752 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1756 sdpisolver->preoptimalsolexists = TRUE;
1760 SCIPdebugMessage(
"Solving to gaptol failed! No preoptimal solution available.\n");
1764 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1767 sdpisolver->sdpa->setInitPoint(
true);
1768 sdpisolver->sdpa->copyCurrentToInit();
1769 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1770 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1771 sdpisolver->sdpa->solve();
1774 sdpisolver->sdpa->solve();
1776 sdpisolver->solved = TRUE;
1779 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1780 sdpisolver->nsdpcalls += 1;
1784 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1785 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1791 else if ( penaltyparam >= sdpisolver->epsilon )
1796 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1797 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1798 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1805 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1808 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1809 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1810 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1811 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1814 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1816 sdpisolver->sdpa->setParameterUpperBound(1e8);
1819 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1821 #ifdef SCIP_MORE_DEBUG
1822 sdpisolver->sdpa->printParameters(stdout);
1824 sdpisolver->sdpa->setInitPoint(
false);
1825 #ifdef SDPA_RESETPARAMS
1826 sdpisolver->sdpa->resetParameters();
1828 sdpisolver->sdpa->initializeSolve();
1830 sdpisolver->sdpa->solve();
1831 sdpisolver->solved = TRUE;
1834 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1835 sdpisolver->nsdpcalls += 1;
1843 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1844 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1849 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1850 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1851 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1858 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1861 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1864 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1867 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1869 sdpisolver->sdpa->setParameterUpperBound(1e8);
1872 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1874 #ifdef SCIP_MORE_DEBUG
1875 sdpisolver->sdpa->printParameters(stdout);
1877 sdpisolver->sdpa->setInitPoint(
false);
1878 #ifdef SDPA_RESETPARAMS
1879 sdpisolver->sdpa->resetParameters();
1881 sdpisolver->sdpa->initializeSolve();
1883 sdpisolver->sdpa->solve();
1884 sdpisolver->solved = TRUE;
1887 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1888 sdpisolver->nsdpcalls += 1;
1896 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1897 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1902 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1903 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1904 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1907 #ifdef SCIP_MORE_DEBUG
1908 (void) fclose(fpOut);
1912 if ( penaltyparam >= sdpisolver->epsilon )
1918 SCIP_Real trace = 0.0;
1921 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1923 sdpasol = sdpisolver->sdpa->getResultXVec();
1926 assert( feasorig != NULL );
1927 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1932 sdpisolver->feasorig = *feasorig;
1936 if ( ! *feasorig && penaltybound != NULL )
1940 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1945 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1946 for (b = 1; b <= nblockssdpa; b++)
1949 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1950 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1951 assert( nrow >= 0 );
1954 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1957 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1963 for (i = 0; i < nrow; i++)
1964 trace += X[i + i*nrow];
1971 if ( penaltybound != NULL )
1972 *penaltybound = TRUE;
1973 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1974 trace, penaltyparam);
1976 else if ( penaltybound != NULL )
1977 *penaltybound = FALSE;
2003 assert( sdpisolver != NULL );
2004 return sdpisolver->solved;
2017 SDPA::PhaseType phasetype;
2019 assert( sdpisolver != NULL );
2020 assert( sdpisolver->sdpa != NULL);
2023 phasetype = sdpisolver->sdpa->getPhaseValue();
2025 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2034 SCIP_Bool* primalfeasible,
2035 SCIP_Bool* dualfeasible
2038 SDPA::PhaseType phasetype;
2040 assert( sdpisolver != NULL );
2041 assert( sdpisolver->sdpa != NULL );
2042 assert( primalfeasible != NULL );
2043 assert( dualfeasible != NULL );
2046 phasetype = sdpisolver->sdpa->getPhaseValue();
2048 switch ( phasetype )
2051 *primalfeasible = TRUE;
2052 *dualfeasible = TRUE;
2055 *primalfeasible = TRUE;
2056 *dualfeasible = TRUE;
2058 case SDPA::pFEAS_dINF:
2059 *primalfeasible = TRUE;
2060 *dualfeasible = FALSE;
2062 case SDPA::pINF_dFEAS:
2063 *primalfeasible = FALSE;
2064 *dualfeasible = TRUE;
2067 *primalfeasible = TRUE;
2068 *dualfeasible = FALSE;
2069 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
2072 *primalfeasible = FALSE;
2073 *dualfeasible = TRUE;
2074 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
2077 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
2078 return SCIP_LPERROR;
2091 SDPA::PhaseType phasetype;
2093 assert( sdpisolver != NULL );
2094 assert( sdpisolver->sdpa != NULL );
2097 phasetype = sdpisolver->sdpa->getPhaseValue();
2099 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2101 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
2104 else if ( phasetype == SDPA::pFEAS_dINF )
2106 else if ( phasetype == SDPA::pUNBD )
2108 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");
2153 SDPA::PhaseType phasetype;
2155 assert( sdpisolver != NULL );
2156 assert( sdpisolver->sdpa != NULL );
2159 phasetype = sdpisolver->sdpa->getPhaseValue();
2161 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2163 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2166 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
2168 else if ( phasetype == SDPA::dUNBD )
2170 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2184 SDPA::PhaseType phasetype;
2186 assert( sdpisolver != NULL );
2187 assert( sdpisolver->sdpa != NULL);
2190 phasetype = sdpisolver->sdpa->getPhaseValue();
2192 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2194 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
2197 else if ( phasetype == SDPA::pINF_dFEAS )
2199 else if ( phasetype == SDPA::dUNBD )
2201 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2215 SDPA::PhaseType phasetype;
2217 assert( sdpisolver != NULL );
2218 assert( sdpisolver->sdpa != NULL);
2221 phasetype = sdpisolver->sdpa->getPhaseValue();
2223 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2225 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
2228 else if ( phasetype == SDPA::pFEAS_dINF )
2230 else if ( phasetype == SDPA::pUNBD )
2232 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2246 SDPA::PhaseType phasetype;
2248 assert( sdpisolver != NULL );
2249 assert( sdpisolver->sdpa != NULL);
2252 phasetype = sdpisolver->sdpa->getPhaseValue();
2254 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2256 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2259 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2261 else if ( phasetype == SDPA::dUNBD )
2263 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2275 SDPA::PhaseType phasetype;
2277 assert( sdpisolver != NULL );
2278 assert( sdpisolver->sdpa != NULL );
2281 phasetype = sdpisolver->sdpa->getPhaseValue();
2283 if ( phasetype == SDPA::pdOPT )
2294 SDPA::PhaseType phasetype;
2296 assert( sdpisolver != NULL );
2297 assert( sdpisolver->sdpa != NULL );
2300 phasetype = sdpisolver->sdpa->getPhaseValue();
2302 if ( phasetype == SDPA::pUNBD )
2313 SDPA::PhaseType phasetype;
2315 assert( sdpisolver != NULL );
2316 assert( sdpisolver->sdpa != NULL);
2319 phasetype = sdpisolver->sdpa->getPhaseValue();
2321 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2323 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
2335 assert( sdpisolver != NULL );
2337 return sdpisolver->timelimit;
2355 SDPA::PhaseType phasetype;
2357 assert( sdpisolver != NULL );
2358 assert( sdpisolver->sdpa != NULL );
2360 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
2363 phasetype = sdpisolver->sdpa->getPhaseValue();
2365 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
2367 if ( phasetype == SDPA::pdINF )
2369 if ( phasetype == SDPA::pUNBD )
2371 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2382 SDPA::PhaseType phasetype;
2384 assert( sdpisolver != NULL );
2385 assert( sdpisolver->sdpa != NULL );
2387 if ( ! sdpisolver->solved )
2390 phasetype = sdpisolver->sdpa->getPhaseValue();
2392 if ( phasetype == SDPA::pdOPT )
2405 SDPA::PhaseType phasetype;
2407 assert( sdpisolver != NULL );
2408 assert( sdpisolver->sdpa != NULL );
2410 if ( sdpisolver->timelimit )
2413 if ( ! sdpisolver->solved )
2416 phasetype = sdpisolver->sdpa->getPhaseValue();
2420 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
2432 SCIPdebugMessage(
"Not implemented yet\n");
2434 return SCIP_LPERROR;
2443 assert( sdpisolver != NULL );
2444 assert( sdpisolver->sdpa != NULL );
2445 assert( objval != NULL );
2448 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2450 *objval = sdpisolver->sdpa->getPrimalObj();
2452 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2453 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2454 if ( gap > sdpisolver->gaptol )
2456 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2457 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2468 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2469 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2470 sdpasol = sdpisolver->sdpa->getResultXVec();
2473 for (v = 0; v < sdpisolver->nactivevars; v++)
2474 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2478 *objval += sdpisolver->fixedvarsobjcontr;
2498 assert( sdpisolver != NULL );
2499 assert( sdpisolver->sdpa != NULL );
2500 assert( dualsollength != NULL );
2503 if ( objval != NULL )
2505 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2507 *objval = sdpisolver->sdpa->getPrimalObj();
2509 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2510 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2511 if ( gap > sdpisolver->gaptol )
2513 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2514 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2522 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2523 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2524 sdpasol = sdpisolver->sdpa->getResultXVec();
2527 for (v = 0; v < sdpisolver->nactivevars; v++)
2528 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2532 *objval += sdpisolver->fixedvarsobjcontr;
2535 if ( *dualsollength > 0 )
2537 assert( dualsol != NULL );
2538 if ( *dualsollength < sdpisolver->nvars )
2540 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2541 *dualsollength = sdpisolver->nvars;
2547 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2548 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2549 sdpasol = sdpisolver->sdpa->getResultXVec();
2551 for (v = 0; v < sdpisolver->nvars; v++)
2553 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2556 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2561 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2562 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2573 int* startXnblocknonz
2585 assert( sdpisolver != NULL );
2586 assert( nblocks > 0 );
2587 assert( startXnblocknonz != NULL );
2590 if ( ! sdpisolver->preoptimalsolexists )
2592 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2593 startXnblocknonz[0] = -1;
2597 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2599 SCIPerrorMessage(
"SCIPsdpiSolverGetPreoptimalPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2600 return SCIP_LPERROR;
2604 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2606 sdpablock = sdpisolver->inputtoblockmapper[b];
2608 startXnblocknonz[b] = 0;
2610 if ( sdpablock != -1 )
2612 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2615 for (r = 0; r < blocksize; r++)
2617 for (c = r; c < blocksize; c++)
2619 sdpaind = r + blocksize * c;
2621 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2622 startXnblocknonz[b]++;
2629 startXnblocknonz[nblocks - 1] = 0;
2630 sdpablock = sdpisolver->sdpa->getBlockNumber();
2632 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2634 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2636 for (i = 0; i < blocksize; i++)
2638 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2639 startXnblocknonz[b]++;
2661 int* startXnblocknonz,
2665 SCIP_Real** startXval
2676 SCIP_Bool msgthrown = FALSE;
2678 assert( sdpisolver != NULL );
2679 assert( success != NULL );
2680 assert( dualsol != NULL );
2681 assert( dualsollength != NULL );
2682 assert( *dualsollength >= 0 );
2683 assert( startXnblocknonz != NULL || nblocks == -1 );
2684 assert( startXrow != NULL || nblocks == -1 );
2685 assert( startXcol != NULL || nblocks == -1 );
2686 assert( startXval != NULL || nblocks == -1 );
2688 if ( ! sdpisolver->preoptimalsolexists )
2690 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2695 if ( *dualsollength < sdpisolver->nvars )
2697 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2699 *dualsollength = sdpisolver->nvars;
2703 for (v = 0; v < sdpisolver->nvars; v++)
2705 if (sdpisolver->inputtosdpamapper[v] > 0)
2708 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtosdpamapper[v] - 1];
2713 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2717 *dualsollength = sdpisolver->nvars;
2721 assert( startXnblocknonz != NULL );
2722 assert( startXrow != NULL );
2723 assert( startXcol != NULL );
2724 assert( startXval != NULL );
2727 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2729 assert( startXrow[b] != NULL );
2730 assert( startXcol[b] != NULL );
2731 assert( startXval[b] != NULL );
2733 sdpablock = sdpisolver->inputtoblockmapper[b];
2737 if ( sdpablock != -1 )
2740 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2744 for (r = 0; r < blocksize; r++)
2746 for (c = r; c < blocksize; c++)
2748 sdpaind = r + blocksize * c;
2750 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2752 if ( blocknnonz < startXnblocknonz[b] )
2754 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2755 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2756 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind];
2763 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2771 startXnblocknonz[b] = blocknnonz;
2774 startXnblocknonz[b] = 0;
2781 sdpablock = sdpisolver->sdpa->getBlockNumber();
2783 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2788 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2791 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
2793 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2795 if ( blocknnonz < startXnblocknonz[b] )
2797 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2798 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2799 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2807 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2815 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
2817 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][i]) > sdpisolver->epsilon )
2819 if ( blocknnonz < startXnblocknonz[b] )
2824 vbpos = i - (blocksize - sdpisolver->nvarbounds);
2827 if ( sdpisolver->varboundpos[vbpos] > 0 )
2828 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
2830 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
2831 startXrow[b][blocknnonz] = inputpos;
2832 startXcol[b][blocknnonz] = inputpos;
2833 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][i];
2841 SCIPdebugMessage(
"Insufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2847 startXnblocknonz[b] = blocknnonz;
2850 startXnblocknonz[b] = 0;
2878 assert( sdpisolver != NULL );
2879 assert( sdpisolver->sdpa != NULL );
2880 assert( lbvars != NULL );
2881 assert( ubvars != NULL );
2882 assert( arraylength != NULL );
2883 assert( *arraylength >= 0 );
2887 if ( *arraylength < sdpisolver->nvars )
2889 *arraylength = sdpisolver->nvars;
2890 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2895 for (i = 0; i < sdpisolver->nvars; i++)
2902 if ( sdpisolver->nvarbounds == 0 )
2904 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
2909 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2910 if ( ! (sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP) )
2917 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
2918 assert( nlpcons >= 0 );
2920 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
2923 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2925 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
2927 if ( sdpisolver->varboundpos[i] < 0 )
2931 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2937 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2948 int* startXnblocknonz
2960 assert( sdpisolver != NULL );
2961 assert( nblocks > 0 );
2962 assert( startXnblocknonz != NULL );
2965 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2967 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2968 return SCIP_LPERROR;
2972 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2974 sdpablock = sdpisolver->inputtoblockmapper[b];
2976 startXnblocknonz[b] = 0;
2978 if ( sdpablock != -1 )
2980 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2981 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
2984 for (r = 0; r < blocksize; r++)
2986 for (c = r; c < blocksize; c++)
2988 sdpaind = r + blocksize * c;
2990 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2991 startXnblocknonz[b]++;
2998 startXnblocknonz[nblocks - 1] = 0;
2999 sdpablock = sdpisolver->sdpa->getBlockNumber();
3001 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3003 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3004 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3006 for (i = 0; i < blocksize; i++)
3008 if ( REALABS(X[i]) > sdpisolver->epsilon )
3009 startXnblocknonz[b]++;
3025 int* startXnblocknonz,
3029 SCIP_Real** startXval
3040 SCIP_Bool msgthrown = FALSE;
3042 assert( sdpisolver != NULL );
3043 assert( nblocks > 0 );
3044 assert( startXnblocknonz != NULL );
3045 assert( startXrow != NULL );
3046 assert( startXcol != NULL );
3047 assert( startXval != NULL );
3050 if ( nblocks != sdpisolver->nsdpblocks + 1 )
3052 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
3053 return SCIP_LPERROR;
3057 for (b = 0; b < sdpisolver->nsdpblocks; b++)
3059 sdpablock = sdpisolver->inputtoblockmapper[b];
3063 if ( sdpablock != -1 )
3065 X = sdpisolver->sdpa->getResultYMat(sdpablock);
3066 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3070 for (r = 0; r < blocksize; r++)
3072 for (c = r; c < blocksize; c++)
3074 sdpaind = r + blocksize * c;
3076 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
3078 if ( blocknnonz < startXnblocknonz[b] )
3080 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
3081 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
3082 startXval[b][blocknnonz] = X[sdpaind];
3089 SCIPdebugMessage(
"Insufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
3097 startXnblocknonz[b] = blocknnonz;
3100 startXnblocknonz[b] = 0;
3105 sdpablock = sdpisolver->sdpa->getBlockNumber();
3107 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
3111 X = sdpisolver->sdpa->getResultXMat(sdpablock);
3112 blocksize = sdpisolver->sdpa->getBlockSize(sdpablock);
3115 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
3117 if ( REALABS(X[i]) > sdpisolver->epsilon )
3119 if ( blocknnonz < startXnblocknonz[b] )
3121 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3122 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3123 startXval[b][blocknnonz] = X[i];
3131 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3139 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
3141 if ( REALABS(X[i]) > sdpisolver->epsilon )
3143 if ( blocknnonz < startXnblocknonz[b] )
3148 vbpos = i - (blocksize - sdpisolver->nvarbounds);
3151 if ( sdpisolver->varboundpos[vbpos] > 0 )
3152 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
3154 inputpos = 2 * sdpisolver->ninputlpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
3155 startXrow[b][blocknnonz] = inputpos;
3156 startXcol[b][blocknnonz] = inputpos;
3157 startXval[b][blocknnonz] = X[i];
3165 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3171 startXnblocknonz[b] = blocknnonz;
3174 startXnblocknonz[b] = 0;
3192 assert( sdpisolver != NULL );
3193 assert( sdpisolver->sdpa != NULL );
3195 nblocks = (int) sdpisolver->sdpa->getBlockNumber();
3199 for (b = 0; b < nblocks; b++)
3202 blocksize = (int) sdpisolver->sdpa->getBlockSize((
long long) b + 1);
3203 arraylength = sdpisolver->sdpa->getBlockType((
long long) b + 1) == SDPA::LP ? blocksize : (blocksize * (blocksize + 1) / 2);
3206 X = sdpisolver->sdpa->getResultYMat((
long long) b + 1);
3207 for (i = 0; i < arraylength; i++)
3209 if ( X[i] > maxentry )
3223 assert( sdpisolver != NULL );
3224 assert( sdpisolver->sdpa != NULL );
3225 assert( iterations != NULL );
3227 *iterations = sdpisolver->niterations;
3238 assert( sdpisolver != NULL );
3239 assert( sdpisolver->sdpa != NULL );
3240 assert( calls != NULL );
3242 *calls = sdpisolver->nsdpcalls;
3253 assert( sdpisolver != NULL );
3254 assert( usedsetting != NULL );
3257 *usedsetting = sdpisolver->usedsetting;
3298 assert( sdpisolver != NULL );
3299 assert( dval != NULL );
3304 *dval = sdpisolver->epsilon;
3307 *dval = sdpisolver->gaptol;
3310 *dval = sdpisolver->feastol;
3313 *dval = sdpisolver->sdpsolverfeastol;
3317 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3320 *dval = sdpisolver->objlimit;
3323 *dval = sdpisolver->lambdastar;
3326 *dval = sdpisolver->preoptimalgap;
3329 return SCIP_PARAMETERUNKNOWN;
3342 assert( sdpisolver != NULL );
3347 sdpisolver->epsilon = dval;
3348 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
3351 sdpisolver->gaptol = dval;
3352 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
3355 sdpisolver->feastol = dval;
3356 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
3359 sdpisolver->sdpsolverfeastol = dval;
3360 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
3363 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3366 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
3367 sdpisolver->objlimit = dval;
3370 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
3371 sdpisolver->lambdastar = dval;
3374 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
3375 sdpisolver->preoptimalgap = dval;
3378 return SCIP_PARAMETERUNKNOWN;
3391 assert( sdpisolver != NULL );
3396 *ival = (int) sdpisolver->sdpinfo;
3397 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
3400 return SCIP_PARAMETERUNKNOWN;
3413 assert( sdpisolver != NULL );
3418 sdpisolver->sdpinfo = (SCIP_Bool) ival;
3419 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
3422 return SCIP_PARAMETERUNKNOWN;
3436 assert( sdpisolver != NULL );
3441 #ifdef LAMBDASTAR_TWOPOINTS
3462 sdpisolver->lambdastar = compval;
3463 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
3473 SCIP_Real* penaltyparam
3478 assert( sdpisolver != NULL );
3479 assert( penaltyparam != NULL );
3495 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
3496 *penaltyparam = compval;
3504 SCIP_Real penaltyparam,
3505 SCIP_Real* maxpenaltyparam
3510 assert( sdpisolver != NULL );
3511 assert( maxpenaltyparam != NULL );
3517 *maxpenaltyparam = compval;
3518 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
3547 SCIPdebugMessage(
"Not implemented yet\n");
3548 return SCIP_LPERROR;
3557 assert( fname != NULL );
3559 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)