69 #include "blockmemshell/memory.h"
71 #include "scip/pub_misc.h"
80 #define MIN_PENALTYPARAM 1e5
81 #define MAX_PENALTYPARAM 1e10
82 #define PENALTYPARAM_FACTOR 1e6
83 #define MAX_MAXPENALTYPARAM 1e15
84 #define MAXPENALTYPARAM_FACTOR 1e6
85 #define TOLERANCE_FACTOR 0.1
86 #define PENALTYBOUNDTOL 1E-3
88 #define INFEASFEASTOLCHANGE 0.1
89 #define INFEASMINFEASTOL 1E-9
90 #define CONVERT_ABSOLUTE_TOLERANCES TRUE
93 struct SCIP_SDPiSolver
95 SCIP_MESSAGEHDLR* messagehdlr;
102 int* inputtomosekmapper;
105 int* mosektoinputmapper;
106 SCIP_Real* fixedvarsval;
107 SCIP_Real fixedvarsobjcontr;
119 SCIP_Real sdpsolverfeastol;
126 MSKrescodee terminationcode;
128 SCIP_Bool timelimitinitial;
139 #define MOSEK_CALL(x) do \
141 int _mosekerrorcode_; \
142 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
144 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
145 return SCIP_LPERROR; \
151 #define MOSEK_CALL_BOOL(x) do \
153 int _mosekerrorcode_; \
154 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
156 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
163 #define MOSEK_CALLM(x) do \
165 int _mosekerrorcode_; \
166 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
168 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
169 return SCIP_NOMEMORY; \
175 #define BMS_CALL(x) do \
179 SCIPerrorMessage("No memory in function call.\n"); \
180 return SCIP_NOMEMORY; \
186 #define TIMEOFDAY_CALL(x) do \
189 if ( (_errorcode_ = (x)) != 0 ) \
191 SCIPerrorMessage("Error in gettimeofday! \n"); \
198 #define CHECK_IF_SOLVED(sdpisolver) do \
200 if (!(sdpisolver->solved)) \
202 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
203 return SCIP_LPERROR; \
209 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
211 if (!(sdpisolver->solved)) \
213 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
239 assert( sdpisolver != NULL );
240 assert( lb < ub + sdpisolver->feastol );
242 return (ub-lb <= sdpisolver->epsilon);
245 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
255 char name[SCIP_MAXSTRLEN];
266 MSKrescodee rescodee;
271 rescodee = MSK_getversion(&major, &minor, &build, &revision);
273 if ( rescodee != MSK_RES_OK )
277 snprintfreturn = SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", major, minor, build, revision);
278 assert( snprintfreturn < SCIP_MAXSTRLEN );
280 (void) SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", major, minor, build, revision);
291 return "Homogeneous and self-dual interior-point solver for semidefinite programming developed by MOSEK ApS"
292 "(http://www.mosek.com)";
305 assert( sdpisolver != NULL );
354 SCIP_MESSAGEHDLR* messagehdlr,
359 assert( sdpisolver != NULL );
360 assert( blkmem != NULL );
361 assert( bufmem != NULL );
363 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
365 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
367 (*sdpisolver)->messagehdlr = messagehdlr;
368 (*sdpisolver)->blkmem = blkmem;
369 (*sdpisolver)->bufmem = bufmem;
371 MOSEK_CALLM( MSK_makeenv(&((*sdpisolver)->mskenv), NULL) );
374 (*sdpisolver)->msktask = NULL;
376 (*sdpisolver)->nvars = 0;
377 (*sdpisolver)->nactivevars = 0;
378 (*sdpisolver)->inputtomosekmapper = NULL;
379 (*sdpisolver)->mosektoinputmapper = NULL;
380 (*sdpisolver)->fixedvarsval = NULL;
381 (*sdpisolver)->fixedvarsobjcontr = 0.0;
382 (*sdpisolver)->objcoefs = NULL;
383 (*sdpisolver)->nvarbounds = 0;
384 (*sdpisolver)->varboundpos = NULL;
385 (*sdpisolver)->solved = FALSE;
386 (*sdpisolver)->sdpcounter = 0;
388 (*sdpisolver)->epsilon = 1e-9;
389 (*sdpisolver)->gaptol = 1e-4;
390 (*sdpisolver)->feastol = 1e-6;
391 (*sdpisolver)->sdpsolverfeastol = 1e-6;
393 (*sdpisolver)->sdpinfo = FALSE;
394 (*sdpisolver)->nthreads = -1;
395 (*sdpisolver)->timelimit = FALSE;
396 (*sdpisolver)->timelimitinitial = FALSE;
406 assert( sdpisolver != NULL );
407 assert( *sdpisolver != NULL );
409 SCIPdebugMessage(
"Freeing SDPISolver\n");
411 if ( ((*sdpisolver)->msktask) != NULL )
413 MOSEK_CALL( MSK_deletetask(&((*sdpisolver)->msktask)) );
416 if ( ((*sdpisolver)->mskenv) != NULL )
418 MOSEK_CALL( MSK_deleteenv(&((*sdpisolver)->mskenv)) );
421 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
422 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtomosekmapper, (*sdpisolver)->nvars);
423 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->mosektoinputmapper, (*sdpisolver)->nactivevars);
424 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
425 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
427 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
437 assert( sdpisolver != NULL );
439 sdpisolver->sdpcounter++;
449 assert( sdpisolver != NULL );
451 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
452 sdpisolver->sdpcounter = 0;
492 int* sdpconstnblocknonz,
496 SCIP_Real** sdpconstval,
498 int** sdpnblockvarnonz,
508 int* blockindchanges,
520 int* startZnblocknonz,
526 SCIP_Real** startZval,
528 int* startXnblocknonz,
534 SCIP_Real** startXval,
541 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
542 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
543 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
544 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
545 timelimit, NULL, NULL);
572 SCIP_Real penaltyparam,
583 int* sdpconstnblocknonz,
587 SCIP_Real** sdpconstval,
589 int** sdpnblockvarnonz,
599 int* blockindchanges,
611 int* startZnblocknonz,
617 SCIP_Real** startZval,
619 int* startXnblocknonz,
625 SCIP_Real** startXval,
632 SCIP_Bool* penaltybound
644 SCIP_Real* mosekvarbounds;
648 int* vartolhsrhsmapper;
652 int* mosekblocksizes;
659 struct timeval starttime;
660 struct timeval currenttime;
661 SCIP_Real startseconds;
662 SCIP_Real currentseconds;
663 SCIP_Real elapsedtime;
664 #ifdef SCIP_MORE_DEBUG
668 char varname[SCIP_MAXSTRLEN];
670 #if CONVERT_ABSOLUTE_TOLERANCES
671 SCIP_Real maxrhscoef;
674 assert( sdpisolver != NULL );
675 assert( sdpisolver->mskenv != NULL );
676 assert( penaltyparam > -1 * sdpisolver->epsilon );
677 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
679 assert( obj != NULL );
680 assert( lb != NULL );
681 assert( ub != NULL );
682 assert( nsdpblocks >= 0 );
683 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
684 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
685 assert( sdpconstnnonz >= 0 );
686 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
687 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
688 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
689 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
690 assert( sdpnnonz >= 0 );
691 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
692 assert( nsdpblocks == 0 || sdpvar != NULL );
693 assert( nsdpblocks == 0 || sdprow != NULL );
694 assert( nsdpblocks == 0 || sdpcol != NULL );
695 assert( nsdpblocks == 0 || sdpval != NULL );
696 assert( nsdpblocks == 0 || indchanges != NULL );
697 assert( nsdpblocks == 0 || nremovedinds != NULL );
698 assert( nsdpblocks == 0 || blockindchanges != NULL );
699 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
700 assert( nlpcons >= 0 );
701 assert( noldlpcons >= nlpcons );
702 assert( nlpcons == 0 || lplhs != NULL );
703 assert( nlpcons == 0 || lprhs != NULL );
704 assert( nlpcons == 0 || rownactivevars != NULL );
705 assert( lpnnonz >= 0 );
706 assert( nlpcons == 0 || lprow != NULL );
707 assert( nlpcons == 0 || lpcol != NULL );
708 assert( nlpcons == 0 || lpval != NULL );
711 if ( timelimit <= 0.0 )
713 sdpisolver->timelimit = TRUE;
714 sdpisolver->timelimitinitial = TRUE;
715 sdpisolver->solved = FALSE;
718 sdpisolver->timelimit = FALSE;
719 sdpisolver->timelimitinitial = FALSE;
720 sdpisolver->feasorig = FALSE;
726 #if CONVERT_ABSOLUTE_TOLERANCES
731 if ((sdpisolver->msktask) != NULL)
733 MOSEK_CALL( MSK_deletetask(&(sdpisolver->msktask)) );
735 if ( penaltyparam < sdpisolver->epsilon )
737 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
741 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars + 1, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
744 #ifdef SCIP_MORE_DEBUG
745 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
748 if ( sdpisolver->sdpinfo )
750 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
755 if ( sdpisolver->nthreads > 0 )
757 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_NUM_THREADS, sdpisolver->nthreads) );
762 if ( penaltyparam < sdpisolver->epsilon )
763 SCIPdebugMessage(
"Inserting Data into MOSEK for SDP (%d) \n", ++sdpisolver->sdpcounter);
765 SCIPdebugMessage(
"Inserting Data again into MOSEK for SDP (%d) \n", sdpisolver->sdpcounter);
768 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
769 sdpisolver->rbound = rbound;
773 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtomosekmapper), sdpisolver->nvars, nvars) );
774 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), sdpisolver->nactivevars, nvars) );
775 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
776 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
778 oldnactivevars = sdpisolver->nactivevars;
779 sdpisolver->nvars = nvars;
780 sdpisolver->nactivevars = 0;
784 sdpisolver->fixedvarsobjcontr = 0.0;
785 for (i = 0; i < nvars; i++)
787 if (
isFixed(sdpisolver, lb[i], ub[i]) )
789 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
790 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
792 sdpisolver->inputtomosekmapper[i] = -nfixedvars;
793 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in MOSEK\n", i, lb[i], sdpisolver->sdpcounter);
797 sdpisolver->mosektoinputmapper[sdpisolver->nactivevars] = i;
798 sdpisolver->inputtomosekmapper[i] = sdpisolver->nactivevars;
799 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
800 sdpisolver->nactivevars++;
801 #ifdef SCIP_MORE_DEBUG
802 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in MOSEK\n", i, sdpisolver->inputtomosekmapper[i], sdpisolver->sdpcounter);
806 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
810 sdpisolver->fixedvarsobjcontr = 0.0;
813 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
814 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
815 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), nvars, sdpisolver->nactivevars) );
818 sdpisolver->nvarbounds = 0;
819 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds, 2 * sdpisolver->nactivevars) );
821 if ( sdpisolver->nactivevars != oldnactivevars )
823 if ( sdpisolver->varboundpos == NULL )
825 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
829 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
832 assert( sdpisolver->varboundpos != NULL );
834 for (i = 0; i < sdpisolver->nactivevars; i++)
836 assert( 0 <= sdpisolver->mosektoinputmapper[i] && sdpisolver->mosektoinputmapper[i] < nvars );
839 mosekvarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->mosektoinputmapper[i]];
840 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
841 (sdpisolver->nvarbounds)++;
845 mosekvarbounds[sdpisolver->nvarbounds] = -1 * ub[sdpisolver->mosektoinputmapper[i]];
846 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
847 (sdpisolver->nvarbounds)++;
855 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartorowmapper, 2*noldlpcons) );
857 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartolhsrhsmapper, 2*noldlpcons) );
862 for (i = 0; i < noldlpcons; i++)
864 assert( newpos <= nlpcons );
865 if ( rownactivevars[i] >= 2 )
869 vartorowmapper[pos] = -(i+1);
870 vartolhsrhsmapper[pos] = newpos;
873 #if CONVERT_ABSOLUTE_TOLERANCES
875 if ( REALABS(lplhs[newpos]) > maxrhscoef )
876 maxrhscoef = REALABS(lplhs[newpos]);
882 vartorowmapper[pos] = i+1;
883 vartolhsrhsmapper[pos] = newpos;
886 #if CONVERT_ABSOLUTE_TOLERANCES
888 if ( REALABS(lprhs[newpos]) > maxrhscoef )
889 maxrhscoef = REALABS(lprhs[newpos]);
896 assert( nlpvars <= 2*nlpcons );
902 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekblocksizes, nsdpblocks - nremovedblocks) );
904 for (b = 0; b < nsdpblocks; b++)
906 if ( blockindchanges[b] > -1 )
908 assert( 0 <= blockindchanges[b] && blockindchanges[b] <= b && (b - blockindchanges[b]) <= (nsdpblocks - nremovedblocks) );
909 mosekblocksizes[b - blockindchanges[b]] = sdpblocksizes[b] - nremovedinds[b];
912 MOSEK_CALLM( MSK_appendbarvars(sdpisolver->msktask, nsdpblocks - nremovedblocks, mosekblocksizes) );
916 MOSEK_CALLM( MSK_appendvars(sdpisolver->msktask, nlpvars + sdpisolver->nvarbounds) );
919 for (v = 0; v < nlpvars + sdpisolver->nvarbounds; v++)
921 MOSEK_CALL( MSK_putvarbound(sdpisolver->msktask, v, MSK_BK_LO, 0.0, (
double) MSK_DPAR_DATA_TOL_BOUND_INF) );
925 MOSEK_CALLM( MSK_appendcons(sdpisolver->msktask, (penaltyparam < sdpisolver->epsilon) ? sdpisolver->nactivevars : sdpisolver->nactivevars + 1) );
930 if ( sdpconstnnonz > 0 )
932 for (b = 0; b < nsdpblocks; b++)
934 if ( blockindchanges[b] > -1 )
937 if ( nremovedinds[b] > 0 )
939 int* moseksdpconstrow;
940 int* moseksdpconstcol;
942 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow, sdpconstnblocknonz[b]) );
943 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol, sdpconstnblocknonz[b]) );
945 for (k = 0; k < sdpconstnblocknonz[b]; k++)
948 assert( -1 < indchanges[b][sdpconstrow[b][k]] && indchanges[b][sdpconstrow[b][k]] <= sdpconstrow[b][k] );
949 assert( -1 < indchanges[b][sdpconstcol[b][k]] && indchanges[b][sdpconstcol[b][k]] <= sdpconstcol[b][k] );
951 assert( 0 <= sdpconstrow[b][k] && sdpconstrow[b][k] <= sdpblocksizes[b] );
952 assert( 0 <= sdpconstcol[b][k] && sdpconstcol[b][k] <= sdpblocksizes[b] );
954 moseksdpconstrow[k] = sdpconstrow[b][k] - indchanges[b][sdpconstrow[b][k]];
955 moseksdpconstcol[k] = sdpconstcol[b][k] - indchanges[b][sdpconstcol[b][k]];
957 #if CONVERT_ABSOLUTE_TOLERANCES
959 if ( REALABS(sdpconstval[b][k]) > maxrhscoef )
960 maxrhscoef = REALABS(sdpconstval[b][k]);
964 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
965 moseksdpconstrow, moseksdpconstcol, sdpconstval[b], &ind) );
967 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol);
968 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow);
972 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
973 sdpconstrow[b], sdpconstcol[b], sdpconstval[b], &ind) );
975 MOSEK_CALL( MSK_putbarcj(sdpisolver->msktask, i, 1, &ind, &one) );
983 for (i = 0; i < nlpvars; i++)
985 if ( vartorowmapper[i] > 0 )
987 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, -1 * lprhs[vartolhsrhsmapper[i]]) );
988 #ifdef SCIP_MORE_DEBUG
990 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"rhs-%d", vartorowmapper[i] - 1);
991 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
996 assert( vartorowmapper[i] < 0 );
997 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, lplhs[vartolhsrhsmapper[i]]) );
998 #ifdef SCIP_MORE_DEBUG
1000 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lhs-%d", -1 * vartorowmapper[i] - 1);
1001 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
1007 for (i = 0; i < sdpisolver->nvarbounds; i++)
1009 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, nlpvars + i, mosekvarbounds[i]) );
1010 #ifdef SCIP_MORE_DEBUG
1011 if ( sdpisolver->varboundpos[i] < 0 )
1014 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lb-%d", sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] - 1]);
1015 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1019 assert( sdpisolver->varboundpos[i] > 0 );
1021 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"ub-%d", sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]);
1022 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1027 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds);
1030 MOSEK_CALL( MSK_putobjsense(sdpisolver->msktask, MSK_OBJECTIVE_SENSE_MAXIMIZE) );
1035 for (b = 0; b < nsdpblocks; b++)
1037 if ( blockindchanges[b] > -1 )
1039 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
1041 v = sdpisolver->inputtomosekmapper[sdpvar[b][blockvar]];
1046 assert( v < sdpisolver->nactivevars );
1048 if ( nremovedinds[b] > 0 )
1050 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, sdpnblockvarnonz[b][blockvar]) );
1051 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekcol, sdpnblockvarnonz[b][blockvar]) );
1053 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
1056 assert( -1 < indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
1057 assert( -1 < indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
1059 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
1060 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
1062 mosekrow[k] = sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]];
1063 mosekcol[k] = sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]];
1066 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1067 mosekrow, mosekcol, sdpval[b][blockvar], &ind) );
1069 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekcol);
1070 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekrow);
1074 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1075 sdprow[b][blockvar], sdpcol[b][blockvar], sdpval[b][blockvar], &ind) );
1078 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, v, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1085 if ( penaltyparam >= sdpisolver->epsilon )
1087 int* identityindices;
1088 SCIP_Real* identityvalues;
1090 for (b = 0; b < nsdpblocks; b++)
1092 if ( blockindchanges[b] > -1 )
1094 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityindices, mosekblocksizes[b - blockindchanges[b]]) );
1095 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityvalues, mosekblocksizes[b - blockindchanges[b]]) );
1097 for (i = 0; i < mosekblocksizes[b - blockindchanges[b]]; i++)
1099 identityindices[i] = i;
1100 identityvalues[i] = 1.0;
1102 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) mosekblocksizes[b - blockindchanges[b]],
1103 identityindices, identityindices, identityvalues, &ind) );
1104 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, sdpisolver->nactivevars, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1106 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityvalues);
1107 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityindices);
1113 if ( penaltyparam < sdpisolver->epsilon )
1115 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz) );
1116 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz) );
1121 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz + 1) );
1122 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz + 1) );
1126 for (i = 0; i < nlpvars; i++)
1128 if ( vartorowmapper[i] < 0 )
1133 while (ind < lpnnonz && lprow[ind] < -1 * vartorowmapper[i] - 1)
1136 while (ind < lpnnonz && lprow[ind] == -1 * vartorowmapper[i] - 1)
1138 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1141 mosekrow[mosekind] = v;
1142 mosekval[mosekind] = lpval[ind];
1147 assert( mosekind <= lpnnonz );
1151 assert( vartorowmapper[i] > 0 );
1153 if ( i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] )
1157 for (j = 0; j < (penaltyparam < sdpisolver->epsilon ? mosekind : mosekind - 1); j++)
1166 while (lprow[ind] < vartorowmapper[i] - 1)
1168 while (ind < lpnnonz && lprow[ind] == vartorowmapper[i] - 1)
1170 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1173 mosekrow[mosekind] = v;
1174 mosekval[mosekind] = -1 * lpval[ind];
1179 assert( mosekind <= lpnnonz );
1184 if ( penaltyparam >= sdpisolver->epsilon )
1188 if ( ! (i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] ))
1190 mosekrow[mosekind] = sdpisolver->nactivevars;
1191 mosekval[mosekind] = 1.0;
1194 assert( mosekind <= lpnnonz + 1 );
1197 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, i, mosekind, mosekrow, mosekval) );
1200 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekval);
1201 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekrow);
1204 for (i = 0; i < sdpisolver->nvarbounds; i++)
1206 if ( sdpisolver->varboundpos[i] < 0 )
1209 row =-1 * sdpisolver->varboundpos[i] - 1;
1215 assert( sdpisolver->varboundpos[i] > 0 );
1216 row = sdpisolver->varboundpos[i] - 1;
1219 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, nlpvars + i, 1, &row, &val) );
1223 for (i = 0; i < sdpisolver->nactivevars; i++)
1227 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, obj[sdpisolver->mosektoinputmapper[i]], obj[sdpisolver->mosektoinputmapper[i]]) );
1231 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, 0.0, 0.0) );
1233 #ifdef SCIP_MORE_DEBUG
1235 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"var-%d", sdpisolver->mosektoinputmapper[i]);
1236 MOSEK_CALL( MSK_putconname ( sdpisolver->msktask, i, varname) );
1241 if ( penaltyparam >= sdpisolver->epsilon )
1245 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_UP, (
double) -1 * MSK_DPAR_DATA_TOL_BOUND_INF, penaltyparam) );
1249 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_FX, penaltyparam, penaltyparam) );
1254 #ifdef SCIP_DEBUG_PRINTTOFILE
1259 #ifdef SCIP_MORE_DEBUG
1260 MOSEK_CALL( MSK_getnumcon (sdpisolver->msktask, &nmosekconss) );
1261 MOSEK_CALL( MSK_getnumvar (sdpisolver->msktask, &nmosekvars) );
1262 MOSEK_CALL( MSK_getnumcone (sdpisolver->msktask, &nmosekcones) );
1264 MOSEK_CALL( MSK_printdata (sdpisolver->msktask, MSK_STREAM_LOG, 0, nmosekconss, 0, nmosekvars, 0, nmosekcones, 1, 1, 1, 1, 1, 1, 1, 1) );
1265 #ifdef SCIP_PRINT_PARAMETERS
1266 MOSEK_CALL( MSK_printparam (sdpisolver->msktask) );
1271 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1274 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1276 elapsedtime = currentseconds - startseconds;
1278 if ( timelimit <= elapsedtime )
1280 sdpisolver->timelimit = TRUE;
1281 sdpisolver->solved = FALSE;
1290 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_PFEAS, sdpisolver->gaptol) );
1291 #if CONVERT_ABSOLUTE_TOLERANCES
1292 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1293 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1294 SCIPdebugMessage(
"Setting relative feasibility tolerance for MOSEK to %.10f / %f = %.12f\n", sdpisolver->sdpsolverfeastol,
1295 1+maxrhscoef, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef));
1297 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol) );
1298 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol) );
1300 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_MU_RED, sdpisolver->gaptol) );
1301 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, sdpisolver->gaptol) );
1305 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_OPTIMIZER_MAX_TIME, timelimit - elapsedtime) );
1311 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_UPPER_OBJ_CUT, sdpisolver->objlimit) );
1315 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1317 if ( sdpisolver->sdpinfo )
1319 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1320 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1323 SCIPdebugMessage(
"Solving problem using MOSEK, return code %d\n", sdpisolver->terminationcode);
1325 sdpisolver->solved = TRUE;
1327 sdpisolver->nsdpcalls = 1;
1328 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &(sdpisolver->niterations)) );
1332 #if CONVERT_ABSOLUTE_TOLERANCES
1333 feastol = sdpisolver->sdpsolverfeastol / (1 + maxrhscoef);
1335 feastol = sdpisolver->sdpsolverfeastol;
1340 SCIP_Real* solvector;
1342 SCIP_Bool infeasible;
1346 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1347 nvarspointer = nvars;
1349 assert( nvarspointer == nvars );
1352 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1353 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1354 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1355 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1357 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1361 SCIPdebugMessage(
"Solution feasible for MOSEK but outside feasibility tolerance, changing MOSEK feasibility tolerance from %f to %f\n",
1368 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, feastol) );
1369 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, feastol) );
1372 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1375 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1377 elapsedtime = currentseconds - startseconds;
1379 if ( timelimit <= elapsedtime )
1381 sdpisolver->timelimit = TRUE;
1382 sdpisolver->solved = FALSE;
1386 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1388 if ( sdpisolver->sdpinfo )
1390 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1391 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1395 sdpisolver->nsdpcalls++;
1396 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &newiterations) );
1397 sdpisolver->niterations += newiterations;
1401 sdpisolver->solved = FALSE;
1402 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"MOSEK failed to reach required feasibility tolerance! \n");
1412 if ( penaltyparam >= sdpisolver->epsilon && ( ! sdpisolver->timelimit ) && ( sdpisolver->terminationcode != MSK_RES_TRM_MAX_TIME ) )
1414 SCIP_Real* moseksol;
1415 SCIP_Real trace = 0.0;
1418 assert( feasorig != NULL );
1421 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->nactivevars + 1);
1423 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
1425 *feasorig = (moseksol[sdpisolver->nactivevars] < sdpisolver->feastol);
1430 sdpisolver->feasorig = *feasorig;
1433 if ( ! *feasorig && penaltybound != NULL )
1436 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", moseksol[sdpisolver->nactivevars]);
1441 for (b = 0; b < nsdpblocks; b++)
1443 if ( blockindchanges[b] > -1 )
1448 size = sdpblocksizes[b] - nremovedinds[b];
1450 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &X, 0.5 * size * (size + 1)) );
1451 MOSEK_CALL( MSK_getbarxj(sdpisolver->msktask, MSK_SOL_ITR, b - blockindchanges[b], X) );
1454 for (i = 0; i < size; i++)
1457 ind = 0.5 * i * (i + 3);
1458 assert( ind < 0.5 * size * (size + 1) );
1462 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &X);
1467 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &x, nlpvars + sdpisolver->nvarbounds) );
1469 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, x) );
1471 for (i = 0; i < nlpvars; i++)
1474 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &x);
1479 if ( penaltybound != NULL )
1480 *penaltybound = TRUE;
1481 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1482 trace, penaltyparam);
1484 else if ( penaltybound != NULL )
1485 *penaltybound = FALSE;
1487 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
1491 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekblocksizes);
1494 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartolhsrhsmapper);
1495 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartorowmapper);
1517 assert( sdpisolver != NULL );
1519 return sdpisolver->solved;
1534 assert( sdpisolver != NULL );
1537 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1541 case MSK_SOL_STA_UNKNOWN:
1542 case MSK_SOL_STA_PRIM_FEAS:
1543 case MSK_SOL_STA_DUAL_FEAS:
1544 case MSK_SOL_STA_NEAR_PRIM_FEAS:
1545 case MSK_SOL_STA_NEAR_DUAL_FEAS:
1547 case MSK_SOL_STA_OPTIMAL:
1548 case MSK_SOL_STA_NEAR_OPTIMAL:
1549 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1550 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1551 case MSK_SOL_STA_PRIM_INFEAS_CER:
1552 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1553 case MSK_SOL_STA_DUAL_INFEAS_CER:
1554 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1557 SCIPdebugMessage(
"Unknown return code in SCIPsdpiSolverFeasibilityKnown\n");
1565 SCIP_Bool* primalfeasible,
1566 SCIP_Bool* dualfeasible
1571 assert( sdpisolver != NULL );
1572 assert( primalfeasible != NULL );
1573 assert( dualfeasible != NULL );
1576 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1580 case MSK_SOL_STA_OPTIMAL:
1581 case MSK_SOL_STA_NEAR_OPTIMAL:
1582 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1583 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1584 *primalfeasible = TRUE;
1585 *dualfeasible = TRUE;
1587 case MSK_SOL_STA_PRIM_INFEAS_CER:
1588 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1589 *primalfeasible = FALSE;
1590 *dualfeasible = TRUE;
1592 case MSK_SOL_STA_DUAL_INFEAS_CER:
1593 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1594 *primalfeasible = TRUE;
1595 *dualfeasible = FALSE;
1598 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1599 return SCIP_LPERROR;
1613 assert( sdpisolver != NULL );
1616 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1620 case MSK_SOL_STA_DUAL_INFEAS_CER:
1621 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1623 case MSK_SOL_STA_OPTIMAL:
1624 case MSK_SOL_STA_NEAR_OPTIMAL:
1625 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1626 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1627 case MSK_SOL_STA_PRIM_INFEAS_CER:
1628 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1631 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1645 assert( sdpisolver != NULL );
1648 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1652 case MSK_SOL_STA_PRIM_INFEAS_CER:
1653 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1655 case MSK_SOL_STA_OPTIMAL:
1656 case MSK_SOL_STA_NEAR_OPTIMAL:
1657 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1658 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1659 case MSK_SOL_STA_DUAL_INFEAS_CER:
1660 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1663 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1677 assert( sdpisolver != NULL );
1680 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1684 case MSK_SOL_STA_OPTIMAL:
1685 case MSK_SOL_STA_NEAR_OPTIMAL:
1686 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1687 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1688 case MSK_SOL_STA_DUAL_INFEAS_CER:
1689 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1691 case MSK_SOL_STA_PRIM_INFEAS_CER:
1692 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1695 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1709 assert( sdpisolver != NULL );
1712 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1716 case MSK_SOL_STA_PRIM_INFEAS_CER:
1717 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1719 case MSK_SOL_STA_OPTIMAL:
1720 case MSK_SOL_STA_NEAR_OPTIMAL:
1721 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1722 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1723 case MSK_SOL_STA_DUAL_INFEAS_CER:
1724 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1727 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1741 assert( sdpisolver != NULL );
1744 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1748 case MSK_SOL_STA_DUAL_INFEAS_CER:
1749 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1751 case MSK_SOL_STA_OPTIMAL:
1752 case MSK_SOL_STA_NEAR_OPTIMAL:
1753 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1754 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1755 case MSK_SOL_STA_PRIM_INFEAS_CER:
1756 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1759 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1773 assert( sdpisolver != NULL );
1776 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1780 case MSK_SOL_STA_OPTIMAL:
1781 case MSK_SOL_STA_NEAR_OPTIMAL:
1782 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1783 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1784 case MSK_SOL_STA_PRIM_INFEAS_CER:
1785 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1787 case MSK_SOL_STA_DUAL_INFEAS_CER:
1788 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1791 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1802 assert( sdpisolver != NULL );
1804 if ( sdpisolver->timelimit )
1810 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL )
1815 SCIP_Real gapnormalization;
1817 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1822 case MSK_SOL_STA_UNKNOWN:
1823 case MSK_SOL_STA_PRIM_FEAS:
1824 case MSK_SOL_STA_DUAL_FEAS:
1825 case MSK_SOL_STA_NEAR_PRIM_FEAS:
1826 case MSK_SOL_STA_NEAR_DUAL_FEAS:
1828 case MSK_SOL_STA_OPTIMAL:
1829 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1830 case MSK_SOL_STA_PRIM_INFEAS_CER:
1831 case MSK_SOL_STA_DUAL_INFEAS_CER:
1832 case MSK_SOL_STA_NEAR_OPTIMAL:
1833 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1834 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1835 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1837 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, &dobj) );
1838 MOSEK_CALL( MSK_getprimalobj(sdpisolver->msktask, MSK_SOL_ITR, &pobj) );
1840 gapnormalization = dobj > pobj ? (pobj > 1.0 ? pobj : 1.0) : (dobj > 1.0 ? dobj : 1.0);
1841 if ( REALABS((pobj-dobj) / gapnormalization) < sdpisolver->gaptol )
1850 return sdpisolver->terminationcode == MSK_RES_OK;
1858 assert( sdpisolver != NULL );
1861 return sdpisolver->terminationcode == MSK_RES_TRM_OBJECTIVE_RANGE;
1869 assert( sdpisolver != NULL );
1872 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_ITERATIONS;
1880 assert( sdpisolver != NULL );
1882 if ( sdpisolver->timelimit )
1885 if ( ! sdpisolver->solved )
1888 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_TIME;
1905 assert( sdpisolver != NULL );
1907 if ( ! sdpisolver->solved )
1910 if ( sdpisolver->timelimit )
1913 switch ( sdpisolver->terminationcode )
1917 case MSK_RES_TRM_MAX_NUM_SETBACKS:
1918 case MSK_RES_TRM_NUMERICAL_PROBLEM:
1919 case MSK_RES_TRM_STALL:
1921 case MSK_RES_TRM_OBJECTIVE_RANGE:
1923 case MSK_RES_TRM_MAX_ITERATIONS:
1925 case MSK_RES_TRM_MAX_TIME:
1939 assert( sdpisolver != NULL );
1941 if ( sdpisolver->timelimit )
1946 if ( sdpisolver->terminationcode != MSK_RES_OK )
1949 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1951 if ( solstat != MSK_SOL_STA_OPTIMAL )
1963 assert( sdpisolver != NULL );
1965 if ( sdpisolver->timelimit )
1968 if ( ! sdpisolver->solved )
1980 SCIPdebugMessage(
"Not implemented yet\n");
1981 return SCIP_LPERROR;
1990 SCIP_Real* moseksol;
1992 assert( sdpisolver != NULL );
1994 assert( objval != NULL );
1996 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2000 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2008 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2009 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2012 for (v = 0; v < sdpisolver->nactivevars; v++)
2013 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2017 *objval += sdpisolver->fixedvarsobjcontr;
2019 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig)
2021 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2040 SCIP_Real* moseksol;
2042 assert( sdpisolver != NULL );
2044 assert( dualsollength != NULL );
2046 if ( *dualsollength > 0 )
2048 assert( dualsol != NULL );
2049 if ( *dualsollength < sdpisolver->nvars )
2051 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2052 *dualsollength = sdpisolver->nvars;
2057 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2059 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2062 for (v = 0; v < sdpisolver->nvars; v++)
2064 if ( sdpisolver->inputtomosekmapper[v] >= 0 )
2065 dualsol[v] = moseksol[sdpisolver->inputtomosekmapper[v]];
2069 assert( -sdpisolver->inputtomosekmapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2070 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtomosekmapper[v]) - 1];
2075 if ( objval != NULL )
2077 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2081 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2088 for (v = 0; v < sdpisolver->nactivevars; v++)
2089 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2093 *objval += sdpisolver->fixedvarsobjcontr;
2096 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2098 else if ( objval != NULL )
2110 int* startXnblocknonz
2114 SCIPdebugMessage(
"Not implemented yet\n");
2116 return SCIP_PLUGINNOTFOUND;
2133 int* startXnblocknonz,
2137 SCIP_Real** startXval
2140 SCIPdebugMessage(
"Not implemented yet\n");
2141 return SCIP_LPERROR;
2159 SCIP_Real* primalvars;
2163 assert( sdpisolver != NULL );
2165 assert( arraylength != NULL );
2166 assert( lbvars != NULL );
2167 assert( ubvars != NULL );
2170 if ( *arraylength < sdpisolver->nvars )
2172 *arraylength = sdpisolver->nvars;
2173 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2178 for (i = 0; i < sdpisolver->nvars; i++)
2185 MOSEK_CALL( MSK_getnumvar(sdpisolver->msktask, &nprimalvars) );
2187 BMSallocBufferMemoryArray(sdpisolver->bufmem, &primalvars, nprimalvars);
2189 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, primalvars) );
2192 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars );
2194 for (i = 0; i < sdpisolver->nvarbounds; i++)
2196 if ( sdpisolver->varboundpos[i] < 0 )
2200 lbvars[sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2206 assert( sdpisolver->varboundpos[i] > 0 );
2209 ubvars[sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2213 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &primalvars);
2222 int* startXnblocknonz
2225 SCIPdebugMessage(
"Not implemented yet\n");
2226 return SCIP_LPERROR;
2236 int* startXnblocknonz,
2240 SCIP_Real** startXval
2243 SCIPdebugMessage(
"Not implemented yet\n");
2244 return SCIP_LPERROR;
2252 SCIPdebugMessage(
"Not implemented yet\n");
2253 return SCIP_LPERROR;
2263 if ( sdpisolver->timelimitinitial )
2267 *iterations = sdpisolver->niterations;
2279 assert( calls != NULL );
2281 *calls = sdpisolver->timelimitinitial ? 0 : sdpisolver->nsdpcalls;
2292 assert( sdpisolver != NULL );
2293 assert( usedsetting != NULL );
2297 else if ( sdpisolver->penalty )
2341 assert( sdpisolver != NULL );
2342 assert( dval != NULL );
2347 *dval = sdpisolver->epsilon;
2350 *dval = sdpisolver->gaptol;
2353 *dval = sdpisolver->feastol;
2356 *dval = sdpisolver->sdpsolverfeastol;
2359 *dval = sdpisolver->objlimit;
2362 return SCIP_PARAMETERUNKNOWN;
2375 assert( sdpisolver != NULL );
2380 sdpisolver->epsilon = dval;
2381 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2384 sdpisolver->gaptol = dval;
2385 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2388 sdpisolver->feastol = dval;
2389 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2392 sdpisolver->sdpsolverfeastol = dval;
2393 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2396 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2397 sdpisolver->objlimit = dval;
2400 return SCIP_PARAMETERUNKNOWN;
2413 assert( sdpisolver != NULL );
2418 *ival = (int) sdpisolver->sdpinfo;
2419 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2422 *ival = sdpisolver->nthreads;
2423 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
2426 return SCIP_PARAMETERUNKNOWN;
2439 assert( sdpisolver != NULL );
2444 sdpisolver->nthreads = ival;
2445 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
2448 assert( 0 <= ival && ival <= 1 );
2449 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2450 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2453 return SCIP_PARAMETERUNKNOWN;
2465 SCIPdebugMessage(
"Lambdastar parameter not used by MOSEK");
2474 SCIP_Real* penaltyparam
2479 assert( sdpisolver != NULL );
2480 assert( penaltyparam != NULL );
2496 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2497 *penaltyparam = compval;
2505 SCIP_Real penaltyparam,
2506 SCIP_Real* maxpenaltyparam
2511 assert( sdpisolver != NULL );
2512 assert( maxpenaltyparam != NULL );
2518 *maxpenaltyparam = compval;
2519 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2548 SCIPdebugMessage(
"Not implemented yet\n");
2549 return SCIP_LPERROR;
2558 assert( sdpisolver != NULL );
2559 assert( fname != NULL );
2561 MOSEK_CALL( MSK_writedata(sdpisolver->msktask, fname) );
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
#define PENALTYPARAM_FACTOR
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
interface methods for specific SDP-solvers
SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
#define MAXPENALTYPARAM_FACTOR
#define MOSEK_CALL_BOOL(x)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
#define TIMEOFDAY_CALL(x)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_RETCODE SCIPsdpiSolverGetPrimalMatrix(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
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 *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_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
SCIP_Bool SCIPsdpiSolverIsOptimal(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)
#define INFEASFEASTOLCHANGE
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverGaptol(void)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
checks a given SDP solution for feasibility
static void MSKAPI printstr(void *handle, MSKCONST char str[])
const char * SCIPsdpiSolverGetSolverDesc(void)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverFeastol(void)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetMaxPrimalEntry(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
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)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(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_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
char name[SCIP_MAXSTRLEN]
SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)