54 #pragma GCC diagnostic ignored "-Wcast-qual" 55 #pragma GCC diagnostic ignored "-Wpedantic" 56 #include "sdpa_call.h" 57 #pragma GCC diagnostic warning "-Wcast-qual" 58 #pragma GCC diagnostic warning "-Wpedantic" 60 #include "blockmemshell/memory.h" 62 #include "scip/pub_misc.h" 64 #include "scip/pub_message.h" 71 #define GAPTOLCHANGE 1 72 #define FEASTOLCHANGE 1 73 #define PENALTYBOUNDTOL 1E-3 76 #define INFEASFEASTOLCHANGE 0.1 77 #define INFEASMINFEASTOL 1E-9 79 #define MIN_LAMBDASTAR 1e-6 80 #define MAX_LAMBDASTAR 1e8 81 #define LAMBDASTAR_FACTOR 1e0 82 #define LAMBDASTAR_TWOPOINTS TRUE 83 #define LAMBDASTAR_THRESHOLD 1e1 84 #define LAMBDASTAR_LOW 1.5 85 #define LAMBDASTAR_HIGH 1e5 86 #define LAMBDASTAR_DEFAULT 1e2 88 #define MIN_PENALTYPARAM 1e5 89 #define MAX_PENALTYPARAM 1e12 90 #define PENALTYPARAM_FACTOR 1e1 91 #define MAX_MAXPENALTYPARAM 1e15 92 #define MAXPENALTYPARAM_FACTOR 1e6 96 #define BMS_CALL(x) do \ 100 SCIPerrorMessage("No memory in function call.\n"); \ 101 return SCIP_NOMEMORY; \ 107 #define CHECK_IF_SOLVED(sdpisolver) do \ 109 if (!(sdpisolver->solved)) \ 111 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 112 return SCIP_LPERROR; \ 118 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \ 120 if (!(sdpisolver->solved)) \ 122 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 130 struct SCIP_SDPiSolver
132 SCIP_MESSAGEHDLR* messagehdlr;
139 int* inputtosdpamapper;
142 int* sdpatoinputmapper;
143 SCIP_Real* fixedvarsval;
144 SCIP_Real fixedvarsobjcontr;
149 int* inputtovbmapper;
154 int* maxsdpblocksizes;
157 int* rowtoinputmapper;
158 int* inputtoblockmapper;
159 int** blockindmapper;
168 SCIP_Real sdpsolverfeastol;
176 SCIP_Real lambdastar;
177 SCIP_Real* preoptimalsol;
178 SCIP_Real** preoptimalsolx;
179 SCIP_Real* preoptimalsolxlp;
180 SCIP_Bool preoptimalsolexists;
181 SCIP_Real preoptimalgap;
199 assert( sdpisolver != NULL );
200 assert( lb < ub + sdpisolver->feastol );
202 return (ub-lb <= sdpisolver->epsilon);
205 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon) 219 assert( initsize >= 0 );
223 initsize = MAX(initsize, SCIP_DEFAULT_MEM_ARRAYGROWINIT);
228 while ( size < num && size > oldsize )
231 size = (int)(SCIP_DEFAULT_MEM_ARRAYGROWFAC * size + initsize);
235 if ( size <= oldsize )
238 assert( size >= initsize );
239 assert( size >= num );
252 SCIP_Bool usepreoptimalsol
256 int oldmaxnsdpblocks;
262 assert( sdpisolver != NULL );
264 oldmaxnlpcons = sdpisolver->maxnlpcons;
265 oldmaxnvars = sdpisolver->maxnvars;
268 if ( nvars > sdpisolver->maxnvars )
272 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->inputtosdpamapper, sdpisolver->maxnvars, newsize) );
273 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->sdpatoinputmapper, sdpisolver->maxnvars, newsize) );
274 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->fixedvarsval, sdpisolver->maxnvars, newsize) );
275 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->objcoefs, sdpisolver->maxnvars, newsize) );
276 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->inputtovbmapper, 2 * sdpisolver->maxnvars, 2 * newsize) );
277 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->varboundpos, 2 * sdpisolver->maxnvars, 2 * newsize) );
279 if ( usepreoptimalsol )
281 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->preoptimalsol, sdpisolver->maxnvars, newsize) );
284 sdpisolver->maxnvars = newsize;
288 if ( nsdpblocks > sdpisolver->maxnsdpblocks )
290 oldmaxnsdpblocks = sdpisolver->maxnsdpblocks;
291 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->inputtoblockmapper, sdpisolver->maxnsdpblocks, nsdpblocks) );
292 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->blockindmapper, sdpisolver->maxnsdpblocks, nsdpblocks) );
293 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->maxsdpblocksizes, sdpisolver->maxnsdpblocks, nsdpblocks) );
294 if ( usepreoptimalsol )
296 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->preoptimalsolx, sdpisolver->maxnsdpblocks, nsdpblocks) );
298 sdpisolver->maxnsdpblocks = nsdpblocks;
300 for (b = 0; b < oldmaxnsdpblocks; ++b)
302 blocksize = sdpblocksizes[b];
303 if ( blocksize > sdpisolver->maxsdpblocksizes[b] )
305 BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->blockindmapper[b], sdpisolver->maxsdpblocksizes[b], blocksize);
307 if ( usepreoptimalsol )
309 BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->preoptimalsolx[b], sdpisolver->maxsdpblocksizes[b] * sdpisolver->maxsdpblocksizes[b], blocksize * blocksize);
311 sdpisolver->maxsdpblocksizes[b] = blocksize;
315 for (b = oldmaxnsdpblocks; b < nsdpblocks; ++b)
317 blocksize = sdpblocksizes[b];
318 BMSallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->blockindmapper[b], blocksize);
319 if ( usepreoptimalsol )
321 BMSallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->preoptimalsolx[b], blocksize * blocksize);
323 sdpisolver->maxsdpblocksizes[b] = blocksize;
328 if ( nlpcons > sdpisolver->maxnlpcons )
330 newsize =
calcGrowSize(sdpisolver->maxnlpcons, nlpcons);
331 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->rowmapper, 2 * sdpisolver->maxnlpcons, 2 * newsize) );
332 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->rowtoinputmapper, 2 * sdpisolver->maxnlpcons, 2 * newsize) );
333 sdpisolver->maxnlpcons = newsize;
337 if ( usepreoptimalsol && ( nlpcons > oldmaxnlpcons || nvars > oldmaxnvars ) )
339 assert( nlpcons <= sdpisolver->maxnlpcons );
340 assert( nvars <= sdpisolver->maxnvars );
342 BMSreallocBlockMemoryArray(sdpisolver->blkmem, &sdpisolver->preoptimalsolxlp, 2 * (oldmaxnlpcons + oldmaxnvars), 2 * (sdpisolver->maxnlpcons + sdpisolver->maxnvars));
355 SCIP_Real penaltyparam,
363 int* sdpconstnblocknonz,
367 SCIP_Real** sdpconstval,
369 int** sdpnblockvarnonz,
379 int* blockindchanges,
392 char phase_string[15];
395 assert( feastol != NULL );
396 assert( gaptol != NULL );
398 if ( penaltyparam >= sdpisolver->epsilon )
403 SCIP_Real* solvector;
406 SCIP_Bool infeasible;
407 SCIP_Bool solveagain = FALSE;
411 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
412 nvarspointer = nvars;
414 assert( nvarspointer == nvars );
417 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
418 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
419 indchanges, nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
420 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
421 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
428 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance to %g.\n", *feastol);
429 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
435 dualobj = sdpisolver->sdpa->getPrimalObj();
436 primalobj = sdpisolver->sdpa->getDualObj();
437 if ( REALABS(dualobj - primalobj) >= sdpisolver->gaptol )
443 SCIPdebugMessage(
"Solution feasible, but duality gap is too large, changing SDPA gap tolerance to %g.\n", *gaptol);
444 sdpisolver->sdpa->setParameterEpsilonStar(*gaptol);
451 #ifdef SCIP_MORE_DEBUG 452 sdpisolver->sdpa->printParameters(stdout);
454 sdpisolver->sdpa->setInitPoint(
false);
455 #ifdef SDPA_RESETPARAMS 456 sdpisolver->sdpa->resetParameters();
458 sdpisolver->sdpa->initializeSolve();
460 sdpisolver->sdpa->solve();
463 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
464 ++sdpisolver->nsdpcalls;
468 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
469 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
476 sdpisolver->solved = FALSE;
477 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance!\n");
507 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
520 assert( sdpisolver != NULL );
521 return (
void*) sdpisolver->sdpa;
553 SCIP_MESSAGEHDLR* messagehdlr,
558 assert( sdpisolver != NULL );
559 assert( blkmem != NULL );
560 assert( bufmem != NULL );
562 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
564 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
566 (*sdpisolver)->messagehdlr = messagehdlr;
567 (*sdpisolver)->blkmem = blkmem;
568 (*sdpisolver)->bufmem = bufmem;
571 (*sdpisolver)->sdpa = NULL;
573 (*sdpisolver)->nvars = 0;
574 (*sdpisolver)->maxnvars = 0;
575 (*sdpisolver)->nactivevars = 0;
576 (*sdpisolver)->nsdpblocks = 0;
577 (*sdpisolver)->maxnsdpblocks = 0;
578 (*sdpisolver)->inputtosdpamapper = NULL;
579 (*sdpisolver)->sdpatoinputmapper = NULL;
580 (*sdpisolver)->inputtoblockmapper = NULL;
581 (*sdpisolver)->blockindmapper = NULL;
582 (*sdpisolver)->maxsdpblocksizes = NULL;
583 (*sdpisolver)->maxnlpcons = 0;
584 (*sdpisolver)->rowmapper = NULL;
585 (*sdpisolver)->rowtoinputmapper = NULL;
586 (*sdpisolver)->fixedvarsval = NULL;
587 (*sdpisolver)->fixedvarsobjcontr = 0.0;
588 (*sdpisolver)->objcoefs = NULL;
589 (*sdpisolver)->nvarbounds = 0;
590 (*sdpisolver)->varboundpos = NULL;
591 (*sdpisolver)->inputtovbmapper = NULL;
592 (*sdpisolver)->solved = FALSE;
593 (*sdpisolver)->timelimit = FALSE;
594 (*sdpisolver)->sdpcounter = 0;
595 (*sdpisolver)->niterations = 0;
596 (*sdpisolver)->nsdpcalls = 0;
597 (*sdpisolver)->nsdpalpcons = 0;
599 (*sdpisolver)->epsilon = 1e-9;
600 (*sdpisolver)->gaptol = 1e-6;
601 (*sdpisolver)->feastol = 1e-6;
602 (*sdpisolver)->sdpsolverfeastol = 1e-6;
604 (*sdpisolver)->sdpinfo = FALSE;
608 (*sdpisolver)->preoptimalsol = NULL;
609 (*sdpisolver)->preoptimalsolx = NULL;
610 (*sdpisolver)->preoptimalsolxlp = NULL;
611 (*sdpisolver)->preoptimalsolexists = FALSE;
612 (*sdpisolver)->preoptimalgap = -1.0;
614 (*sdpisolver)->nthreads = -1;
627 assert( sdpisolver != NULL );
628 assert( *sdpisolver != NULL );
630 SCIPdebugMessage(
"Freeing SDPISolver\n");
632 for (b = 0; b < (*sdpisolver)->maxnsdpblocks; b++)
634 blocksize = (*sdpisolver)->maxsdpblocksizes[b];
635 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->blockindmapper[b]), blocksize);
637 if ( (*sdpisolver)->preoptimalsolx != NULL )
639 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &((*sdpisolver)->preoptimalsolx[b]), blocksize * blocksize);
642 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolxlp, 2 * ((*sdpisolver)->maxnlpcons + (*sdpisolver)->maxnvars));
645 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsolx, (*sdpisolver)->maxnsdpblocks);
646 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->blockindmapper, (*sdpisolver)->maxnsdpblocks);
647 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->maxsdpblocksizes, (*sdpisolver)->maxnsdpblocks);
650 if ( (*sdpisolver)->sdpa != NULL)
651 delete (*sdpisolver)->sdpa;
653 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->maxnvars);
654 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtoblockmapper, (*sdpisolver)->maxnsdpblocks);
656 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowtoinputmapper, 2 * (*sdpisolver)->maxnlpcons);
657 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->rowmapper, 2 * (*sdpisolver)->maxnlpcons);
659 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->maxnvars);
660 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtovbmapper, 2 * (*sdpisolver)->maxnvars);
661 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->maxnvars);
662 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->maxnvars);
663 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->maxnvars);
664 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->maxnvars);
665 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
675 assert( sdpisolver != NULL );
677 sdpisolver->sdpcounter++;
687 assert( sdpisolver != NULL );
689 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
690 sdpisolver->sdpcounter = 0;
730 int* sdpconstnblocknonz,
734 SCIP_Real** sdpconstval,
736 int** sdpnblockvarnonz,
746 int* blockindchanges,
756 int* startZnblocknonz,
762 SCIP_Real** startZval,
764 int* startXnblocknonz,
770 SCIP_Real** startXval,
778 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
779 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
780 nremovedinds, blockindchanges, nremovedblocks, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
781 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
782 timelimit, usedsdpitime, NULL, NULL);
809 SCIP_Real penaltyparam,
820 int* sdpconstnblocknonz,
824 SCIP_Real** sdpconstval,
826 int** sdpnblockvarnonz,
836 int* blockindchanges,
846 int* startZnblocknonz,
852 SCIP_Real** startZval,
854 int* startXnblocknonz,
860 SCIP_Real** startXval,
868 SCIP_Bool* penaltybound
874 SCIP_Real solvertimelimit;
875 SCIP_Bool usepreoptimalsol;
886 char phase_string[15];
889 assert( sdpisolver != NULL );
890 assert( penaltyparam > -1 * sdpisolver->epsilon );
891 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
893 assert( obj != NULL );
894 assert( lb != NULL );
895 assert( ub != NULL );
896 assert( nsdpblocks >= 0 );
897 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
898 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
899 assert( sdpconstnnonz >= 0 );
900 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
901 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
902 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
903 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
904 assert( sdpnnonz >= 0 );
905 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
906 assert( nsdpblocks == 0 || sdpvar != NULL );
907 assert( nsdpblocks == 0 || sdprow != NULL );
908 assert( nsdpblocks == 0 || sdpcol != NULL );
909 assert( nsdpblocks == 0 || sdpval != NULL );
910 assert( nsdpblocks == 0 || indchanges != NULL );
911 assert( nsdpblocks == 0 || nremovedinds != NULL );
912 assert( nsdpblocks == 0 || blockindchanges != NULL );
913 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
914 assert( nlpcons >= 0 );
915 assert( nlpcons == 0 || lplhs != NULL );
916 assert( nlpcons == 0 || lprhs != NULL );
917 assert( lpnnonz >= 0 );
918 assert( nlpcons == 0 || lprow != NULL );
919 assert( nlpcons == 0 || lpcol != NULL );
920 assert( nlpcons == 0 || lpval != NULL );
921 assert( startZnblocknonz == NULL || startZrow != NULL );
922 assert( startZnblocknonz == NULL || startZcol != NULL );
923 assert( startZnblocknonz == NULL || startZval != NULL );
924 assert( startXnblocknonz == NULL || startXrow != NULL );
925 assert( startXnblocknonz == NULL || startXcol != NULL );
926 assert( startXnblocknonz == NULL || startXval != NULL );
928 sdpisolver->niterations = 0;
929 sdpisolver->nsdpcalls = 0;
930 sdpisolver->feasorig = FALSE;
933 solvertimelimit = timelimit;
937 if ( solvertimelimit <= 0.0 )
939 sdpisolver->solved = FALSE;
940 sdpisolver->timelimit = TRUE;
944 sdpisolver->timelimit = FALSE;
956 if ( penaltyparam < sdpisolver->epsilon )
957 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
959 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
962 if ( sdpisolver->sdpa != 0 )
965 delete sdpisolver->sdpa;
967 sdpisolver->sdpa =
new SDPA();
968 assert( sdpisolver->sdpa != 0 );
971 if ( sdpisolver->nthreads > 0 )
974 openblas_set_num_threads(sdpisolver->nthreads);
976 sdpisolver->sdpa->setNumThreads(sdpisolver->nthreads);
980 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
981 sdpisolver->rbound = rbound;
983 if ( sdpisolver->preoptimalgap >= 0.0 )
984 usepreoptimalsol = TRUE;
986 usepreoptimalsol = FALSE;
991 assert( sdpisolver->nvars <= sdpisolver->maxnvars );
992 sdpisolver->nvars = nvars;
993 sdpisolver->nactivevars = 0;
994 sdpisolver->nvarbounds = 0;
995 sdpisolver->preoptimalsolexists = FALSE;
996 sdpisolver->nsdpblocks = nsdpblocks;
997 sdpisolver->nsdpalpcons = nlpcons;
998 nsdpablocks = nsdpblocks - nremovedblocks;
1002 sdpisolver->fixedvarsobjcontr = 0.0;
1003 for (i = 0; i < nvars; i++)
1005 if (
isFixed(sdpisolver, lb[i], ub[i]) )
1007 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
1008 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
1010 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
1011 SCIPdebugMessage(
"Fixing variable %d locally to %g in SDPA.\n", i, lb[i]);
1012 sdpisolver->inputtovbmapper[2 * i] = -1;
1013 sdpisolver->inputtovbmapper[2 * i + 1] = -1;
1017 #ifdef SCIP_MORE_DEBUG 1018 SCIPdebugMessage(
"Variable %d becomes variable %d in SDPA.\n", i, sdpisolver->nactivevars + 1);
1020 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
1021 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars + 1;
1022 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
1026 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(sdpisolver->nactivevars + 1);
1027 sdpisolver->inputtovbmapper[2 * i] = sdpisolver->nvarbounds++;
1032 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(sdpisolver->nactivevars + 1);
1033 sdpisolver->inputtovbmapper[2 * i + 1] = sdpisolver->nvarbounds++;
1036 sdpisolver->nactivevars++;
1039 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
1040 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nactivevars );
1043 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1044 sdpisolver->nvarbounds++;
1048 sdpisolver->fixedvarsobjcontr = 0.0;
1052 for (i = 0; i < nlpcons; i++)
1057 sdpisolver->rowmapper[2 * i] = nlpineqs + 1;
1058 sdpisolver->rowtoinputmapper[nlpineqs] = 2 * i;
1062 sdpisolver->rowmapper[2 * i] = -1;
1067 sdpisolver->rowmapper[2*i + 1] = nlpineqs + 1;
1068 sdpisolver->rowtoinputmapper[nlpineqs] = 2 * i + 1;
1072 sdpisolver->rowmapper[2*i + 1] = -1;
1074 assert( nlpineqs <= 2*nlpcons );
1078 assert( nsdpblocks <= sdpisolver->maxnsdpblocks );
1079 for (b = 0; b < nsdpblocks; ++b)
1081 if ( blockindchanges[b] >= 0 )
1085 sdpisolver->inputtoblockmapper[b] = ind + 1;
1087 for (i = 0; i < sdpblocksizes[b]; i++)
1089 if ( indchanges[b][i] >= 0 )
1091 assert( ind <= nsdpblocks );
1092 sdpisolver->blockindmapper[ind][blockind] = i;
1093 assert( i - indchanges[b][i] == blockind );
1097 assert( blockind == sdpblocksizes[b] - nremovedinds[b] );
1101 sdpisolver->inputtoblockmapper[b] = -1;
1105 if ( penaltyparam < sdpisolver->epsilon )
1106 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
1108 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
1111 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1112 sdpisolver->sdpa->inputBlockNumber((
long long) (nsdpablocks + 1));
1114 sdpisolver->sdpa->inputBlockNumber((
long long) (nsdpablocks));
1117 for (b = 0; b < nsdpblocks; ++b)
1119 if ( blockindchanges[b] >= 0 )
1122 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d.\n", b, b - blockindchanges[b] + 1, sdpblocksizes[b] - nremovedinds[b]);
1123 sdpisolver->sdpa->inputBlockSize((
long long) (b - blockindchanges[b] + 1), (
long long) (sdpblocksizes[b] - nremovedinds[b]));
1124 sdpisolver->sdpa->inputBlockType((
long long) (b - blockindchanges[b] + 1), SDPA::SDP);
1129 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
1132 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpablocks + 1, nlpineqs + sdpisolver->nvarbounds);
1133 sdpisolver->sdpa->inputBlockSize((
long long) (nsdpablocks + 1), (
long long) -(nlpineqs + sdpisolver->nvarbounds));
1134 sdpisolver->sdpa->inputBlockType((
long long) (nsdpablocks + 1), SDPA::LP);
1138 sdpisolver->sdpa->initializeUpperTriangleSpace();
1143 for (i = 0; i < sdpisolver->nactivevars; i++)
1146 sdpisolver->sdpa->inputCVec((
long long) (i + 1), obj[sdpisolver->sdpatoinputmapper[i]]);
1150 if ( penaltyparam >= sdpisolver->epsilon )
1151 sdpisolver->sdpa->inputCVec((
long long) (sdpisolver->nactivevars + 1), penaltyparam);
1159 assert( nsdpblocks > 0 );
1160 assert( sdpnblockvarnonz != NULL );
1161 assert( sdpnblockvars != NULL );
1162 assert( sdpcol != NULL );
1163 assert( sdprow != NULL );
1164 assert( sdpval != NULL );
1165 assert( sdpvar != NULL );
1166 assert( indchanges != NULL );
1167 assert( nremovedinds != NULL );
1169 for (b = 0; b < nsdpblocks; ++b)
1172 if ( blockindchanges[b] < 0 )
1175 assert( b - blockindchanges[b] + 1 <= nsdpablocks );
1178 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
1180 v = sdpisolver->inputtosdpamapper[sdpvar[b][blockvar]];
1185 assert( v <= sdpisolver->nactivevars );
1187 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
1190 assert( 0 <= indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
1191 assert( 0 <= indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
1193 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
1194 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
1197 sdpisolver->sdpa->inputElement((
long long) v, (
long long) (b - blockindchanges[b] + 1),
1198 (
long long) (sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]] + 1),
1199 (
long long) (sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]] + 1),
1200 sdpval[b][blockvar][k], checkinput);
1206 if ( penaltyparam >= sdpisolver->epsilon )
1208 for (i = 0; i < sdpblocksizes[b] - nremovedinds[b]; i++)
1210 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (b - blockindchanges[b] + 1),
1211 (
long long) (i + 1), (
long long) (i + 1), 1.0, checkinput);
1218 if ( sdpconstnnonz > 0 )
1220 assert( nsdpblocks > 0 );
1221 assert( sdpconstnblocknonz!= NULL );
1222 assert( sdpconstcol != NULL );
1223 assert( sdpconstrow != NULL );
1224 assert( sdpconstval != NULL );
1226 for (b = 0; b < nsdpblocks; ++b)
1228 if ( blockindchanges[b] < 0 )
1231 for (k = 0; k < sdpconstnblocknonz[b]; k++)
1234 assert( -1 < indchanges[b][sdpconstrow[b][k]] && indchanges[b][sdpconstrow[b][k]] <= sdpconstrow[b][k] );
1235 assert( -1 < indchanges[b][sdpconstcol[b][k]] && indchanges[b][sdpconstcol[b][k]] <= sdpconstcol[b][k] );
1237 assert( 0 <= sdpconstrow[b][k] && sdpconstrow[b][k] < sdpblocksizes[b] );
1238 assert( 0 <= sdpconstcol[b][k] && sdpconstcol[b][k] < sdpblocksizes[b] );
1241 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) (b - blockindchanges[b] + 1),
1242 (
long long) (sdpconstcol[b][k] - indchanges[b][sdpconstcol[b][k]] + 1),
1243 (
long long) (sdpconstrow[b][k] - indchanges[b][sdpconstrow[b][k]] + 1),
1244 sdpconstval[b][k], checkinput);
1252 SCIP_Bool lhspresent = FALSE;
1253 SCIP_Bool rhspresent = FALSE;
1254 long long lhsrhscnt = 1;
1258 for (i = 0; i < lpnnonz; i++)
1260 assert( i == 0 || lprow[i-1] <= lprow[i] );
1261 assert( 0 <= lprow[i] && lprow[i] < nlpcons );
1262 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1263 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1266 if ( lprow[i] > lastrow )
1271 assert( 0 <= lastrow && lastrow < nlpcons );
1274 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, lplhs[lastrow], checkinput);
1277 if ( penaltyparam >= sdpisolver->epsilon )
1280 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, 1.0, checkinput);
1287 assert( 0 <= lastrow && lastrow < nlpcons );
1290 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, - lprhs[lastrow], checkinput);
1293 if ( penaltyparam >= sdpisolver->epsilon )
1297 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, 1.0, checkinput);
1317 v = sdpisolver->inputtosdpamapper[lpcol[i]];
1324 sdpisolver->sdpa->inputElement((
long long) v, (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, lpval[i], checkinput);
1331 sdpisolver->sdpa->inputElement((
long long) v, (
long long) (nsdpablocks + 1), lhsrhscnt + lhspresent, lhsrhscnt + lhspresent, - lpval[i], checkinput);
1339 assert( 0 <= lastrow && lastrow < nlpcons );
1340 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, lplhs[lastrow], checkinput);
1341 if ( penaltyparam >= sdpisolver->epsilon )
1342 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, 1.0, checkinput);
1348 assert( 0 <= lastrow && lastrow < nlpcons );
1349 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, - lprhs[lastrow], checkinput);
1350 if ( penaltyparam >= sdpisolver->epsilon )
1351 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (nsdpablocks + 1), lhsrhscnt, lhsrhscnt, 1.0, checkinput);
1355 assert( lhsrhscnt == (
long long) nlpineqs + 1 );
1359 if ( sdpisolver->nvarbounds > 0 )
1361 long long varboundcnt;
1364 varboundcnt = (
long long) nlpineqs + 1;
1366 for (i = 0; i < nvars; i++)
1368 v = sdpisolver->inputtosdpamapper[i];
1371 assert( 0 < v && v <= sdpisolver->nactivevars );
1375 sdpisolver->sdpa->inputElement((
long long) v, (
long long) (nsdpablocks + 1), varboundcnt, varboundcnt, 1.0, checkinput);
1377 if ( REALABS(lb[i]) > sdpisolver->epsilon )
1380 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), varboundcnt, varboundcnt, lb[i], checkinput);
1388 sdpisolver->sdpa->inputElement((
long long) v, (
long long) (nsdpablocks + 1), varboundcnt, varboundcnt, -1.0, checkinput);
1390 if ( REALABS(ub[i]) > sdpisolver->epsilon )
1393 sdpisolver->sdpa->inputElement(0LL, (
long long) (nsdpablocks + 1), varboundcnt, varboundcnt, -ub[i], checkinput);
1400 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1403 sdpisolver->sdpa->inputElement((
long long) (sdpisolver->nactivevars + 1), (
long long) (nsdpablocks + 1), varboundcnt, varboundcnt, 1.0, checkinput);
1406 assert( varboundcnt == nlpineqs + 1 + sdpisolver->nvarbounds );
1413 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1417 feastol = FEASTOLCHANGE * FEASTOLCHANGE * sdpisolver->sdpsolverfeastol;
1418 gaptol = sdpisolver->gaptol;
1419 SCIPdebugMessage(
"Start solving process with stable settings ...\n");
1423 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
1424 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1425 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1426 feastol = sdpisolver->sdpsolverfeastol;
1427 gaptol = sdpisolver->gaptol;
1428 SCIPdebugMessage(
"Start solving process with fast settings\n");
1432 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1434 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1435 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1437 gaptol = sdpisolver->gaptol;
1438 SCIPdebugMessage(
"Start solving process with medium settings ...\n");
1442 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
1443 return SCIP_LPERROR;
1446 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1450 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1452 sdpisolver->sdpa->setParameterUpperBound(1e8);
1455 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1459 #ifdef SCIP_MORE_DEBUG 1460 sdpisolver->sdpa->printParameters(stdout);
1463 if ( sdpisolver->sdpinfo )
1464 sdpisolver->sdpa->setDisplay(stdout);
1466 sdpisolver->sdpa->setDisplay(0);
1468 #ifdef SCIP_MORE_DEBUG 1469 FILE* fpOut = fopen(
"output.tmp",
"w");
1472 sdpisolver->sdpa->setResultFile(fpOut);
1476 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1477 sdpisolver->sdpa->setInitPoint(
true);
1479 sdpisolver->sdpa->setInitPoint(
false);
1482 if ( starty != NULL && startZnblocknonz != NULL && startXnblocknonz != NULL && penaltyparam < sdpisolver->epsilon )
1488 for (i = 1; i <= sdpisolver->nactivevars; i++)
1489 sdpisolver->sdpa->inputInitXVec((
long long) i, starty[sdpisolver->sdpatoinputmapper[i - 1]]);
1492 for (b = 0; b < nsdpblocks; b++)
1494 if ( blockindchanges[b] >= 0 )
1496 for (i = 0; i < startZnblocknonz[b]; i++)
1498 if ( indchanges[b][startZrow[b][i]] > -1 && indchanges[b][startZcol[b][i]] > -1 )
1500 sdpisolver->sdpa->inputInitXMat((
long long) b + 1 - blockindchanges[b], (
long long) startZrow[b][i] + 1 - indchanges[b][startZrow[b][i]],
1501 (
long long) startZcol[b][i] + 1 - indchanges[b][startZcol[b][i]], startZval[b][i]);
1508 for (i = 0; i < startZnblocknonz[nsdpblocks]; i++)
1510 assert( startZrow[nsdpblocks][i] == startZcol[nsdpblocks][i] );
1512 if ( startZrow[nsdpblocks][i] < 2 * sdpisolver->nsdpalpcons )
1514 sdpaind = sdpisolver->rowmapper[startZrow[nsdpblocks][i]];
1516 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startZval[nsdpblocks][i]);
1520 varboundind = sdpisolver->inputtovbmapper[startZrow[nsdpblocks][i] - 2 * sdpisolver->nsdpalpcons];
1521 if ( varboundind > -1 )
1523 sdpisolver->sdpa->inputInitXMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1524 nlpineqs + varboundind + 1, startZval[nsdpblocks][i]);
1530 for (b = 0; b < nsdpblocks; b++)
1532 if ( blockindchanges[b] >= 0 )
1534 for (i = 0; i < startXnblocknonz[b]; i++)
1536 if ( indchanges[b][startXrow[b][i]] > -1 && indchanges[b][startXcol[b][i]] > -1 )
1538 sdpisolver->sdpa->inputInitYMat((
long long) b + 1 - blockindchanges[b], (
long long) startXrow[b][i] + 1 - indchanges[b][startXrow[b][i]],
1539 (
long long) startXcol[b][i] + 1 - indchanges[b][startXcol[b][i]], startXval[b][i]);
1546 for (i = 0; i < startXnblocknonz[nsdpblocks]; i++)
1548 assert( startXrow[nsdpblocks][i] == startXcol[nsdpblocks][i] );
1550 if ( startXrow[nsdpblocks][i] < 2 * sdpisolver->nsdpalpcons )
1552 sdpaind = sdpisolver->rowmapper[startXrow[nsdpblocks][i]];
1554 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, sdpaind, sdpaind, startXval[nsdpblocks][i]);
1558 varboundind = sdpisolver->inputtovbmapper[startXrow[nsdpblocks][i] - 2 * sdpisolver->nsdpalpcons];
1559 if ( varboundind > -1 )
1561 sdpisolver->sdpa->inputInitYMat((
long long) nsdpblocks + 1, nlpineqs + varboundind + 1,
1562 nlpineqs + varboundind + 1, startXval[nsdpblocks][i]);
1567 else if ( penaltyparam >= sdpisolver->epsilon )
1568 SCIPdebugMessage(
"Skipping insertion of starting point for penalty formulation.\n");
1571 sdpisolver->sdpa->initializeUpperTriangle(checkinput);
1572 sdpisolver->sdpa->initializeSolve();
1574 #ifdef SCIP_DEBUG_PRINTTOFILE 1576 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1577 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1580 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d) ...\n", sdpisolver->sdpcounter);
1589 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->preoptimalgap);
1590 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->preoptimalgap);
1591 sdpisolver->sdpa->solve();
1596 SCIPdebugMessage(
"Saving preoptimal solution for warmstarting purposes\n");
1597 sdpasol = sdpisolver->sdpa->getResultXVec();
1600 for (i = 0; i < sdpisolver->nactivevars; i++)
1601 sdpisolver->preoptimalsol[i] = sdpasol[i];
1604 for (b = 0; b < sdpisolver->sdpa->getBlockNumber(); b++)
1606 sdpasol = sdpisolver->sdpa->getResultYMat(b + 1);
1607 sdpablocksize = (int) sdpisolver->sdpa->getBlockSize(b + 1);
1608 assert( sdpablocksize <= 2 * (sdpisolver->maxnlpcons + sdpisolver->maxnvars) );
1609 if ( sdpisolver->sdpa->getBlockType(b + 1) == SDPA::LP )
1612 for (i = 0; i < sdpablocksize; i++)
1613 sdpisolver->preoptimalsolxlp[i] = sdpasol[i];
1618 for (i = 0; i < sdpablocksize * sdpablocksize; i++)
1619 sdpisolver->preoptimalsolx[b][i] = sdpasol[i];
1623 sdpisolver->preoptimalsolexists = TRUE;
1627 SCIPdebugMessage(
"Solving to gaptol failed! No preoptimal solution available.\n");
1631 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1634 sdpisolver->sdpa->setInitPoint(
true);
1635 sdpisolver->sdpa->copyCurrentToInit();
1636 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
1637 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
1638 sdpisolver->sdpa->solve();
1641 sdpisolver->sdpa->solve();
1643 sdpisolver->solved = TRUE;
1646 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1647 ++sdpisolver->nsdpcalls;
1651 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1652 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1658 else if ( penaltyparam >= sdpisolver->epsilon )
1663 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1664 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1665 nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval, &feastol, &gaptol) );
1672 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1675 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1676 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1677 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1678 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1682 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1684 sdpisolver->sdpa->setParameterUpperBound(1e8);
1687 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1689 #ifdef SCIP_MORE_DEBUG 1690 sdpisolver->sdpa->printParameters(stdout);
1692 sdpisolver->sdpa->setInitPoint(
false);
1693 #ifdef SDPA_RESETPARAMS 1694 sdpisolver->sdpa->resetParameters();
1696 sdpisolver->sdpa->initializeSolve();
1698 sdpisolver->sdpa->solve();
1699 sdpisolver->solved = TRUE;
1702 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1703 ++sdpisolver->nsdpcalls;
1711 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1712 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1717 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1718 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1719 nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval, &feastol, &gaptol) );
1726 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1729 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1732 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1736 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1738 sdpisolver->sdpa->setParameterUpperBound(1e8);
1741 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1743 #ifdef SCIP_MORE_DEBUG 1744 sdpisolver->sdpa->printParameters(stdout);
1746 sdpisolver->sdpa->setInitPoint(
false);
1747 #ifdef SDPA_RESETPARAMS 1748 sdpisolver->sdpa->resetParameters();
1750 sdpisolver->sdpa->initializeSolve();
1752 sdpisolver->sdpa->solve();
1753 sdpisolver->solved = TRUE;
1756 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1757 ++sdpisolver->nsdpcalls;
1765 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1766 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1771 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1772 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1773 nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval, &feastol, &gaptol) );
1776 #ifdef SCIP_MORE_DEBUG 1777 (void) fclose(fpOut);
1781 if ( penaltyparam >= sdpisolver->epsilon )
1787 SCIP_Real trace = 0.0;
1790 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1792 sdpasol = sdpisolver->sdpa->getResultXVec();
1795 assert( feasorig != NULL );
1796 if ( sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol )
1804 sdpisolver->feasorig = *feasorig;
1808 if ( ! *feasorig && penaltybound != NULL )
1811 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1816 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1817 for (b = 1; b <= nblockssdpa; b++)
1820 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1821 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1822 assert( nrow >= 0 );
1825 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1828 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1834 for (i = 0; i < nrow; i++)
1835 trace += X[i + i*nrow];
1842 if ( penaltybound != NULL )
1843 *penaltybound = TRUE;
1845 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1846 trace, penaltyparam);
1848 else if ( penaltybound != NULL )
1849 *penaltybound = FALSE;
1875 assert( sdpisolver != NULL );
1876 return sdpisolver->solved;
1889 SDPA::PhaseType phasetype;
1891 assert( sdpisolver != NULL );
1892 assert( sdpisolver->sdpa != NULL);
1895 phasetype = sdpisolver->sdpa->getPhaseValue();
1897 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1906 SCIP_Bool* primalfeasible,
1907 SCIP_Bool* dualfeasible
1910 SDPA::PhaseType phasetype;
1912 assert( sdpisolver != NULL );
1913 assert( sdpisolver->sdpa != NULL );
1914 assert( primalfeasible != NULL );
1915 assert( dualfeasible != NULL );
1918 phasetype = sdpisolver->sdpa->getPhaseValue();
1920 switch ( phasetype )
1923 *primalfeasible = TRUE;
1924 *dualfeasible = TRUE;
1927 *primalfeasible = TRUE;
1928 *dualfeasible = TRUE;
1930 case SDPA::pFEAS_dINF:
1931 *primalfeasible = TRUE;
1932 *dualfeasible = FALSE;
1934 case SDPA::pINF_dFEAS:
1935 *primalfeasible = FALSE;
1936 *dualfeasible = TRUE;
1939 *primalfeasible = TRUE;
1940 *dualfeasible = FALSE;
1941 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
1944 *primalfeasible = FALSE;
1945 *dualfeasible = TRUE;
1946 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
1949 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
1950 return SCIP_LPERROR;
1963 SDPA::PhaseType phasetype;
1965 assert( sdpisolver != NULL );
1966 assert( sdpisolver->sdpa != NULL );
1969 phasetype = sdpisolver->sdpa->getPhaseValue();
1971 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1973 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
1976 else if ( phasetype == SDPA::pFEAS_dINF )
1978 else if ( phasetype == SDPA::pUNBD )
1980 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1994 SDPA::PhaseType phasetype;
1996 assert( sdpisolver != NULL );
1997 assert( sdpisolver->sdpa != NULL );
2000 phasetype = sdpisolver->sdpa->getPhaseValue();
2002 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2004 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
2007 else if ( phasetype == SDPA::pINF_dFEAS )
2009 else if ( phasetype == SDPA::dUNBD )
2011 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2025 SDPA::PhaseType phasetype;
2027 assert( sdpisolver != NULL );
2028 assert( sdpisolver->sdpa != NULL );
2031 phasetype = sdpisolver->sdpa->getPhaseValue();
2033 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2035 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2038 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
2040 else if ( phasetype == SDPA::pUNBD )
2042 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2056 SDPA::PhaseType phasetype;
2058 assert( sdpisolver != NULL );
2059 assert( sdpisolver->sdpa != NULL);
2062 phasetype = sdpisolver->sdpa->getPhaseValue();
2064 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2066 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
2069 else if ( phasetype == SDPA::pINF_dFEAS )
2071 else if ( phasetype == SDPA::dUNBD )
2073 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2087 SDPA::PhaseType phasetype;
2089 assert( sdpisolver != NULL );
2090 assert( sdpisolver->sdpa != NULL);
2093 phasetype = sdpisolver->sdpa->getPhaseValue();
2095 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
2097 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible.\n");
2100 else if ( phasetype == SDPA::pFEAS_dINF )
2102 else if ( phasetype == SDPA::pUNBD )
2104 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
2118 SDPA::PhaseType phasetype;
2120 assert( sdpisolver != NULL );
2121 assert( sdpisolver->sdpa != NULL);
2124 phasetype = sdpisolver->sdpa->getPhaseValue();
2126 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
2128 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
2131 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2133 else if ( phasetype == SDPA::dUNBD )
2135 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
2147 SDPA::PhaseType phasetype;
2149 assert( sdpisolver != NULL );
2150 assert( sdpisolver->sdpa != NULL );
2153 phasetype = sdpisolver->sdpa->getPhaseValue();
2155 if ( phasetype == SDPA::pdOPT )
2166 SDPA::PhaseType phasetype;
2168 assert( sdpisolver != NULL );
2169 assert( sdpisolver->sdpa != NULL );
2172 phasetype = sdpisolver->sdpa->getPhaseValue();
2174 if ( phasetype == SDPA::pUNBD )
2185 SDPA::PhaseType phasetype;
2187 assert( sdpisolver != NULL );
2188 assert( sdpisolver->sdpa != NULL);
2191 phasetype = sdpisolver->sdpa->getPhaseValue();
2193 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2195 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
2207 assert( sdpisolver != NULL );
2209 return sdpisolver->timelimit;
2227 SDPA::PhaseType phasetype;
2229 assert( sdpisolver != NULL );
2230 assert( sdpisolver->sdpa != NULL );
2232 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
2235 phasetype = sdpisolver->sdpa->getPhaseValue();
2237 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
2239 if ( phasetype == SDPA::pdINF )
2241 if ( phasetype == SDPA::pUNBD )
2243 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
2254 SDPA::PhaseType phasetype;
2256 assert( sdpisolver != NULL );
2257 assert( sdpisolver->sdpa != NULL );
2259 if ( ! sdpisolver->solved )
2262 phasetype = sdpisolver->sdpa->getPhaseValue();
2264 if ( phasetype == SDPA::pdOPT )
2277 SDPA::PhaseType phasetype;
2279 assert( sdpisolver != NULL );
2280 assert( sdpisolver->sdpa != NULL );
2282 if ( sdpisolver->timelimit )
2285 if ( ! sdpisolver->solved )
2288 phasetype = sdpisolver->sdpa->getPhaseValue();
2292 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
2304 SCIPdebugMessage(
"Not implemented yet\n");
2306 return SCIP_LPERROR;
2315 assert( sdpisolver != NULL );
2316 assert( sdpisolver->sdpa != NULL );
2317 assert( objval != NULL );
2320 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2322 *objval = sdpisolver->sdpa->getPrimalObj();
2324 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2325 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2326 if ( gap > sdpisolver->gaptol )
2328 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, " 2329 "but primal objective is %g with duality gap %g!\n", *objval, primalval, gap );
2340 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2341 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2342 sdpasol = sdpisolver->sdpa->getResultXVec();
2345 for (v = 0; v < sdpisolver->nactivevars; v++)
2346 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2350 *objval += sdpisolver->fixedvarsobjcontr;
2370 assert( sdpisolver != NULL );
2371 assert( sdpisolver->sdpa != NULL );
2372 assert( dualsollength != NULL );
2375 if ( objval != NULL )
2377 if ( sdpisolver->penalty && ! sdpisolver->feasorig )
2379 *objval = sdpisolver->sdpa->getPrimalObj();
2381 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2382 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2383 if ( gap > sdpisolver->gaptol )
2385 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, " 2386 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2394 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2395 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2396 sdpasol = sdpisolver->sdpa->getResultXVec();
2399 for (v = 0; v < sdpisolver->nactivevars; v++)
2400 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2404 *objval += sdpisolver->fixedvarsobjcontr;
2407 if ( *dualsollength > 0 )
2409 assert( dualsol != NULL );
2410 if ( *dualsollength < sdpisolver->nvars )
2412 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2413 *dualsollength = sdpisolver->nvars;
2419 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2420 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2421 sdpasol = sdpisolver->sdpa->getResultXVec();
2423 for (v = 0; v < sdpisolver->nvars; v++)
2425 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2428 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2433 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2434 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2445 int* startXnblocknonz
2457 assert( sdpisolver != NULL );
2458 assert( nblocks > 0 );
2459 assert( startXnblocknonz != NULL );
2462 if ( ! sdpisolver->preoptimalsolexists )
2464 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2465 startXnblocknonz[0] = -1;
2469 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2471 SCIPerrorMessage(
"SCIPsdpiSolverGetPreoptimalPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2472 return SCIP_LPERROR;
2476 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2478 sdpablock = sdpisolver->inputtoblockmapper[b];
2480 startXnblocknonz[b] = 0;
2482 if ( sdpablock != -1 )
2484 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2487 for (r = 0; r < blocksize; r++)
2489 for (c = r; c < blocksize; c++)
2491 sdpaind = r + blocksize * c;
2493 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2494 startXnblocknonz[b]++;
2501 startXnblocknonz[nblocks - 1] = 0;
2502 sdpablock = (int) sdpisolver->sdpa->getBlockNumber();
2504 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2506 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2508 for (i = 0; i < blocksize; i++)
2510 if ( REALABS(sdpisolver->preoptimalsolxlp[i]) > sdpisolver->epsilon )
2511 startXnblocknonz[b]++;
2533 int* startXnblocknonz,
2537 SCIP_Real** startXval
2548 SCIP_Bool msgthrown = FALSE;
2550 assert( sdpisolver != NULL );
2551 assert( success != NULL );
2552 assert( dualsol != NULL );
2553 assert( dualsollength != NULL );
2554 assert( *dualsollength >= 0 );
2555 assert( startXnblocknonz != NULL || nblocks == -1 );
2556 assert( startXrow != NULL || nblocks == -1 );
2557 assert( startXcol != NULL || nblocks == -1 );
2558 assert( startXval != NULL || nblocks == -1 );
2560 if ( ! sdpisolver->preoptimalsolexists )
2562 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2567 if ( *dualsollength < sdpisolver->nvars )
2569 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2571 *dualsollength = sdpisolver->nvars;
2575 for (v = 0; v < sdpisolver->nvars; v++)
2577 if (sdpisolver->inputtosdpamapper[v] > 0)
2580 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtosdpamapper[v] - 1];
2585 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2589 *dualsollength = sdpisolver->nvars;
2593 assert( startXnblocknonz != NULL );
2594 assert( startXrow != NULL );
2595 assert( startXcol != NULL );
2596 assert( startXval != NULL );
2599 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2601 assert( startXrow[b] != NULL );
2602 assert( startXcol[b] != NULL );
2603 assert( startXval[b] != NULL );
2605 sdpablock = sdpisolver->inputtoblockmapper[b];
2609 if ( sdpablock != -1 )
2612 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2616 for (r = 0; r < blocksize; r++)
2618 for (c = r; c < blocksize; c++)
2620 sdpaind = r + blocksize * c;
2622 if ( REALABS(sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind]) > sdpisolver->epsilon )
2624 if ( blocknnonz < startXnblocknonz[b] )
2626 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2627 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2628 startXval[b][blocknnonz] = sdpisolver->preoptimalsolx[sdpablock - 1][sdpaind];
2635 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2643 startXnblocknonz[b] = blocknnonz;
2646 startXnblocknonz[b] = 0;
2653 sdpablock = (int) sdpisolver->sdpa->getBlockNumber();
2655 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2660 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2663 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
2665 if ( REALABS(sdpisolver->preoptimalsolxlp[i]) > sdpisolver->epsilon )
2667 if ( blocknnonz < startXnblocknonz[b] )
2669 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2670 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
2671 startXval[b][blocknnonz] = sdpisolver->preoptimalsolxlp[i];
2679 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2687 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
2689 if ( REALABS(sdpisolver->preoptimalsolxlp[i]) > sdpisolver->epsilon )
2691 if ( blocknnonz < startXnblocknonz[b] )
2696 vbpos = i - (blocksize - sdpisolver->nvarbounds);
2699 if ( sdpisolver->varboundpos[vbpos] > 0 )
2700 inputpos = 2 * sdpisolver->nsdpalpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
2702 inputpos = 2 * sdpisolver->nsdpalpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
2703 startXrow[b][blocknnonz] = inputpos;
2704 startXcol[b][blocknnonz] = inputpos;
2705 startXval[b][blocknnonz] = sdpisolver->preoptimalsolxlp[i];
2713 SCIPdebugMessage(
"Insufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
2719 startXnblocknonz[b] = blocknnonz;
2722 startXnblocknonz[b] = 0;
2747 SDPA_INT lpblockind;
2753 assert( sdpisolver != NULL );
2754 assert( sdpisolver->sdpa != NULL );
2755 assert( lbvars != NULL );
2756 assert( ubvars != NULL );
2757 assert( arraylength != NULL );
2758 assert( *arraylength >= 0 );
2762 if ( *arraylength < sdpisolver->nvars )
2764 *arraylength = sdpisolver->nvars;
2765 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2770 for (i = 0; i < sdpisolver->nvars; i++)
2777 if ( sdpisolver->nvarbounds == 0 )
2779 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector!\n");
2784 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2785 if ( sdpisolver->sdpa->getBlockType(lpblockind) != SDPA::LP )
2792 nlpcons = (int) sdpisolver->sdpa->getBlockSize(lpblockind);
2793 assert( nlpcons >= 0 );
2795 X = sdpisolver->sdpa->getResultYMat(lpblockind);
2798 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2801 if ( sdpisolver->penalty )
2803 for (i = 0; i < sdpisolver->nvarbounds - penoffset; i++)
2806 if ( sdpisolver->varboundpos[i] < 0 )
2808 sdpapos = -sdpisolver->varboundpos[i] - 1;
2809 assert( 0 <= sdpapos && sdpapos < sdpisolver->nactivevars );
2810 pos = sdpisolver->sdpatoinputmapper[sdpapos];
2811 assert( 0 <= pos && pos < sdpisolver->nvars );
2813 lbvars[pos] = X[nlpcons - sdpisolver->nvarbounds + i];
2817 sdpapos = sdpisolver->varboundpos[i] - 1;
2818 assert( 0 <= sdpapos && sdpapos < sdpisolver->nactivevars );
2819 pos = sdpisolver->sdpatoinputmapper[sdpapos];
2820 assert( 0 <= pos && pos < sdpisolver->nvars );
2822 ubvars[pos] = X[nlpcons - sdpisolver->nvarbounds + i];
2833 int* startXnblocknonz
2845 assert( sdpisolver != NULL );
2846 assert( nblocks > 0 );
2847 assert( startXnblocknonz != NULL );
2850 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2852 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2853 return SCIP_LPERROR;
2857 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2859 sdpablock = sdpisolver->inputtoblockmapper[b];
2861 startXnblocknonz[b] = 0;
2863 if ( sdpablock != -1 )
2865 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2866 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2869 for (r = 0; r < blocksize; r++)
2871 for (c = r; c < blocksize; c++)
2873 sdpaind = r + blocksize * c;
2875 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2876 startXnblocknonz[b]++;
2883 startXnblocknonz[nblocks - 1] = 0;
2884 sdpablock = (int) sdpisolver->sdpa->getBlockNumber();
2886 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2888 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2889 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2891 for (i = 0; i < blocksize; i++)
2893 if ( REALABS(X[i]) > sdpisolver->epsilon )
2894 startXnblocknonz[b]++;
2910 int* startXnblocknonz,
2914 SCIP_Real** startXval
2925 SCIP_Bool msgthrown = FALSE;
2927 assert( sdpisolver != NULL );
2928 assert( nblocks > 0 );
2929 assert( startXnblocknonz != NULL );
2930 assert( startXrow != NULL );
2931 assert( startXcol != NULL );
2932 assert( startXval != NULL );
2935 if ( nblocks != sdpisolver->nsdpblocks + 1 )
2937 SCIPerrorMessage(
"SCIPsdpiSolverGetPrimalNonzeros expected nblocks = %d but got %d\n", sdpisolver->nsdpblocks + 1, nblocks);
2938 return SCIP_LPERROR;
2942 for (b = 0; b < sdpisolver->nsdpblocks; b++)
2944 sdpablock = sdpisolver->inputtoblockmapper[b];
2948 if ( sdpablock != -1 )
2950 X = sdpisolver->sdpa->getResultYMat(sdpablock);
2951 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
2955 for (r = 0; r < blocksize; r++)
2957 for (c = r; c < blocksize; c++)
2959 sdpaind = r + blocksize * c;
2961 if ( REALABS(X[sdpaind]) > sdpisolver->epsilon )
2963 if ( blocknnonz < startXnblocknonz[b] )
2965 startXrow[b][blocknnonz] = sdpisolver->blockindmapper[b][c];
2966 startXcol[b][blocknnonz] = sdpisolver->blockindmapper[b][r];
2967 startXval[b][blocknnonz] = X[sdpaind];
2974 SCIPdebugMessage(
"Insufficient arraylength %d for block %d in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b], b);
2982 startXnblocknonz[b] = blocknnonz;
2985 startXnblocknonz[b] = 0;
2990 sdpablock = (int) sdpisolver->sdpa->getBlockNumber();
2992 if ( sdpisolver->sdpa->getBlockType(sdpablock) == SDPA::LP )
2996 X = sdpisolver->sdpa->getResultXMat(sdpablock);
2997 blocksize = (int) sdpisolver->sdpa->getBlockSize(sdpablock);
3000 for (i = 0; i < blocksize - sdpisolver->nvarbounds; i++)
3002 if ( REALABS(X[i]) > sdpisolver->epsilon )
3004 if ( blocknnonz < startXnblocknonz[b] )
3006 startXrow[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3007 startXcol[b][blocknnonz] = sdpisolver->rowtoinputmapper[i];
3008 startXval[b][blocknnonz] = X[i];
3016 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3024 for (i = blocksize - sdpisolver->nvarbounds; i < blocksize; i++)
3026 if ( REALABS(X[i]) > sdpisolver->epsilon )
3028 if ( blocknnonz < startXnblocknonz[b] )
3033 vbpos = i - (blocksize - sdpisolver->nvarbounds);
3036 if ( sdpisolver->varboundpos[vbpos] > 0 )
3037 inputpos = 2 * sdpisolver->nsdpalpcons + 2 * sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[vbpos] - 1] + 1;
3039 inputpos = 2 * sdpisolver->nsdpalpcons + 2 * sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[vbpos] - 1];
3040 startXrow[b][blocknnonz] = inputpos;
3041 startXcol[b][blocknnonz] = inputpos;
3042 startXval[b][blocknnonz] = X[i];
3050 SCIPdebugMessage(
"Unsufficient arraylength %d for LP block & varbounds in SCIPsdpiSolverGetPrimalMatrix!\n", startXnblocknonz[b]);
3056 startXnblocknonz[b] = blocknnonz;
3059 startXnblocknonz[b] = 0;
3077 assert( sdpisolver != NULL );
3078 assert( sdpisolver->sdpa != NULL );
3080 nblocks = (int) sdpisolver->sdpa->getBlockNumber();
3084 for (b = 0; b < nblocks; b++)
3087 blocksize = (int) sdpisolver->sdpa->getBlockSize((
long long) b + 1);
3088 arraylength = sdpisolver->sdpa->getBlockType((
long long) b + 1) == SDPA::LP ? blocksize : (blocksize * (blocksize + 1) / 2);
3091 X = sdpisolver->sdpa->getResultYMat((
long long) b + 1);
3092 for (i = 0; i < arraylength; i++)
3094 if ( X[i] > maxentry )
3108 assert( sdpisolver != NULL );
3109 assert( opttime != NULL );
3123 assert( sdpisolver != NULL );
3124 assert( sdpisolver->sdpa != NULL );
3125 assert( iterations != NULL );
3127 *iterations = sdpisolver->niterations;
3138 assert( sdpisolver != NULL );
3139 assert( sdpisolver->sdpa != NULL );
3140 assert( calls != NULL );
3142 *calls = sdpisolver->nsdpcalls;
3153 assert( sdpisolver != NULL );
3154 assert( usedsetting != NULL );
3157 *usedsetting = sdpisolver->usedsetting;
3198 assert( sdpisolver != NULL );
3199 assert( dval != NULL );
3204 *dval = sdpisolver->epsilon;
3207 *dval = sdpisolver->gaptol;
3210 *dval = sdpisolver->feastol;
3213 *dval = sdpisolver->sdpsolverfeastol;
3217 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
3220 *dval = sdpisolver->objlimit;
3223 *dval = sdpisolver->lambdastar;
3226 *dval = sdpisolver->preoptimalgap;
3229 return SCIP_PARAMETERUNKNOWN;
3242 assert( sdpisolver != NULL );
3247 sdpisolver->epsilon = dval;
3248 SCIPdebugMessage(
"Setting sdpisolver epsilon to %g.\n", dval);
3251 sdpisolver->gaptol = dval;
3252 SCIPdebugMessage(
"Setting sdpisolver gaptol to %g.\n", dval);
3255 sdpisolver->feastol = dval;
3256 SCIPdebugMessage(
"Setting sdpisolver feastol to %g.\n", dval);
3259 sdpisolver->sdpsolverfeastol = dval;
3260 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %g.\n", dval);
3263 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA\n.");
3266 SCIPdebugMessage(
"Setting sdpisolver objlimit to %g.\n", dval);
3267 sdpisolver->objlimit = dval;
3270 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %g.\n", dval);
3271 sdpisolver->lambdastar = dval;
3274 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %g.\n", dval);
3275 sdpisolver->preoptimalgap = dval;
3278 return SCIP_PARAMETERUNKNOWN;
3291 assert( sdpisolver != NULL );
3296 *ival = (int) sdpisolver->sdpinfo;
3297 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
3300 *ival = sdpisolver->nthreads;
3301 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
3304 return SCIP_PARAMETERUNKNOWN;
3317 assert( sdpisolver != NULL );
3322 sdpisolver->sdpinfo = (SCIP_Bool) ival;
3323 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
3326 sdpisolver->nthreads = ival;
3327 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
3330 return SCIP_PARAMETERUNKNOWN;
3344 assert( sdpisolver != NULL );
3349 #ifdef LAMBDASTAR_TWOPOINTS 3370 sdpisolver->lambdastar = compval;
3371 SCIPdebugMessage(
"Setting lambdastar to %g.\n", compval);
3381 SCIP_Real* penaltyparam
3386 assert( sdpisolver != NULL );
3387 assert( penaltyparam != NULL );
3403 SCIPdebugMessage(
"Setting penalty parameter to %g.\n", compval);
3404 *penaltyparam = compval;
3412 SCIP_Real penaltyparam,
3413 SCIP_Real* maxpenaltyparam
3418 assert( sdpisolver != NULL );
3419 assert( maxpenaltyparam != NULL );
3425 *maxpenaltyparam = compval;
3426 SCIPdebugMessage(
"Setting maximum penalty parameter to %g.\n", compval);
3455 SCIPdebugMessage(
"Not implemented yet\n");
3456 return SCIP_LPERROR;
3465 assert( fname != NULL );
3467 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
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, SCIP_Real *lplhs, SCIP_Real *lprhs, 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, SDPI_CLOCK *usedsdpitime)
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
#define INFEASFEASTOLCHANGE
static SCIP_RETCODE ensureMappingDataMemory(SCIP_SDPISOLVER *sdpisolver, int nvars, int nsdpblocks, int *sdpblocksizes, int nlpcons, SCIP_Bool usepreoptimalsol)
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(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, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
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)
#define LAMBDASTAR_DEFAULT
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)
static int calcGrowSize(int initsize, int num)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
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 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
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, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *feastol, SCIP_Real *gaptol)
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 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 SCIPsdpiSolverGetTime(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *opttime)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
SCIP_Real SDPIclockGetTime(SDPI_CLOCK *clck)
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)
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, SCIP_Real *lplhs, SCIP_Real *lprhs, 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, SDPI_CLOCK *usedsdpitime, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)