69 #include "blockmemshell/memory.h"
71 #include "scip/pub_misc.h"
74 #include "scip/pub_message.h"
81 #define MIN_PENALTYPARAM 1e5
82 #define MAX_PENALTYPARAM 1e10
83 #define PENALTYPARAM_FACTOR 1e6
84 #define MAX_MAXPENALTYPARAM 1e15
85 #define MAXPENALTYPARAM_FACTOR 1e6
86 #define TOLERANCE_FACTOR 0.1
87 #define PENALTYBOUNDTOL 1E-3
89 #define INFEASFEASTOLCHANGE 0.1
90 #define INFEASMINFEASTOL 1E-9
91 #define CONVERT_ABSOLUTE_TOLERANCES TRUE
94 struct SCIP_SDPiSolver
96 SCIP_MESSAGEHDLR* messagehdlr;
103 int* inputtomosekmapper;
106 int* mosektoinputmapper;
107 SCIP_Real* fixedvarsval;
108 SCIP_Real fixedvarsobjcontr;
120 SCIP_Real sdpsolverfeastol;
127 MSKrescodee terminationcode;
129 SCIP_Bool timelimitinitial;
140 #define MOSEK_CALL(x) do \
142 int _mosekerrorcode_; \
143 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
145 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
146 return SCIP_LPERROR; \
152 #define MOSEK_CALL_BOOL(x) do \
154 int _mosekerrorcode_; \
155 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
157 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
164 #define MOSEK_CALLM(x) do \
166 int _mosekerrorcode_; \
167 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
169 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", _mosekerrorcode_); \
170 return SCIP_NOMEMORY; \
176 #define BMS_CALL(x) do \
180 SCIPerrorMessage("No memory in function call.\n"); \
181 return SCIP_NOMEMORY; \
187 #define TIMEOFDAY_CALL(x) do \
190 if ( (_errorcode_ = (x)) != 0 ) \
192 SCIPerrorMessage("Error in gettimeofday! \n"); \
199 #define CHECK_IF_SOLVED(sdpisolver) do \
201 if (!(sdpisolver->solved)) \
203 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
204 return SCIP_LPERROR; \
210 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
212 if (!(sdpisolver->solved)) \
214 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
240 assert( sdpisolver != NULL );
241 assert( lb < ub + sdpisolver->feastol );
243 return (ub-lb <= sdpisolver->epsilon);
246 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
256 char name[SCIP_MAXSTRLEN];
267 MSKrescodee rescodee;
272 rescodee = MSK_getversion(&major, &minor, &build, &revision);
274 if ( rescodee != MSK_RES_OK )
278 snprintfreturn = SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", major, minor, build, revision);
279 assert( snprintfreturn < SCIP_MAXSTRLEN );
281 (void) SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", major, minor, build, revision);
292 return "Homogeneous and self-dual interior-point solver for semidefinite programming developed by MOSEK ApS"
293 "(http://www.mosek.com)";
306 assert( sdpisolver != NULL );
355 SCIP_MESSAGEHDLR* messagehdlr,
360 assert( sdpisolver != NULL );
361 assert( blkmem != NULL );
362 assert( bufmem != NULL );
364 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
366 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
368 (*sdpisolver)->messagehdlr = messagehdlr;
369 (*sdpisolver)->blkmem = blkmem;
370 (*sdpisolver)->bufmem = bufmem;
372 MOSEK_CALLM( MSK_makeenv(&((*sdpisolver)->mskenv), NULL) );
375 (*sdpisolver)->msktask = NULL;
377 (*sdpisolver)->nvars = 0;
378 (*sdpisolver)->nactivevars = 0;
379 (*sdpisolver)->inputtomosekmapper = NULL;
380 (*sdpisolver)->mosektoinputmapper = NULL;
381 (*sdpisolver)->fixedvarsval = NULL;
382 (*sdpisolver)->fixedvarsobjcontr = 0.0;
383 (*sdpisolver)->objcoefs = NULL;
384 (*sdpisolver)->nvarbounds = 0;
385 (*sdpisolver)->varboundpos = NULL;
386 (*sdpisolver)->solved = FALSE;
387 (*sdpisolver)->sdpcounter = 0;
389 (*sdpisolver)->epsilon = 1e-9;
390 (*sdpisolver)->gaptol = 1e-4;
391 (*sdpisolver)->feastol = 1e-6;
392 (*sdpisolver)->sdpsolverfeastol = 1e-6;
394 (*sdpisolver)->sdpinfo = FALSE;
395 (*sdpisolver)->nthreads = -1;
396 (*sdpisolver)->timelimit = FALSE;
397 (*sdpisolver)->timelimitinitial = FALSE;
407 assert( sdpisolver != NULL );
408 assert( *sdpisolver != NULL );
410 SCIPdebugMessage(
"Freeing SDPISolver\n");
412 if ( ((*sdpisolver)->msktask) != NULL )
414 MOSEK_CALL( MSK_deletetask(&((*sdpisolver)->msktask)) );
417 if ( ((*sdpisolver)->mskenv) != NULL )
419 MOSEK_CALL( MSK_deleteenv(&((*sdpisolver)->mskenv)) );
422 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
423 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtomosekmapper, (*sdpisolver)->nvars);
424 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->mosektoinputmapper, (*sdpisolver)->nactivevars);
425 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
426 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
428 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
438 assert( sdpisolver != NULL );
440 sdpisolver->sdpcounter++;
450 assert( sdpisolver != NULL );
452 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
453 sdpisolver->sdpcounter = 0;
493 int* sdpconstnblocknonz,
497 SCIP_Real** sdpconstval,
499 int** sdpnblockvarnonz,
509 int* blockindchanges,
521 int* startZnblocknonz,
527 SCIP_Real** startZval,
529 int* startXnblocknonz,
535 SCIP_Real** startXval,
542 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
543 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
544 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
545 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
546 timelimit, NULL, NULL);
573 SCIP_Real penaltyparam,
584 int* sdpconstnblocknonz,
588 SCIP_Real** sdpconstval,
590 int** sdpnblockvarnonz,
600 int* blockindchanges,
612 int* startZnblocknonz,
618 SCIP_Real** startZval,
620 int* startXnblocknonz,
626 SCIP_Real** startXval,
633 SCIP_Bool* penaltybound
645 SCIP_Real* mosekvarbounds;
649 int* vartolhsrhsmapper;
653 int* mosekblocksizes;
660 struct timeval starttime;
661 struct timeval currenttime;
662 SCIP_Real startseconds;
663 SCIP_Real currentseconds;
664 SCIP_Real elapsedtime;
665 #ifdef SCIP_MORE_DEBUG
669 char varname[SCIP_MAXSTRLEN];
671 #if CONVERT_ABSOLUTE_TOLERANCES
672 SCIP_Real maxrhscoef;
675 assert( sdpisolver != NULL );
676 assert( sdpisolver->mskenv != NULL );
677 assert( penaltyparam > -1 * sdpisolver->epsilon );
678 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
680 assert( obj != NULL );
681 assert( lb != NULL );
682 assert( ub != NULL );
683 assert( nsdpblocks >= 0 );
684 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
685 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
686 assert( sdpconstnnonz >= 0 );
687 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
688 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
689 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
690 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
691 assert( sdpnnonz >= 0 );
692 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
693 assert( nsdpblocks == 0 || sdpvar != NULL );
694 assert( nsdpblocks == 0 || sdprow != NULL );
695 assert( nsdpblocks == 0 || sdpcol != NULL );
696 assert( nsdpblocks == 0 || sdpval != NULL );
697 assert( nsdpblocks == 0 || indchanges != NULL );
698 assert( nsdpblocks == 0 || nremovedinds != NULL );
699 assert( nsdpblocks == 0 || blockindchanges != NULL );
700 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
701 assert( nlpcons >= 0 );
702 assert( noldlpcons >= nlpcons );
703 assert( nlpcons == 0 || lplhs != NULL );
704 assert( nlpcons == 0 || lprhs != NULL );
705 assert( nlpcons == 0 || rownactivevars != NULL );
706 assert( lpnnonz >= 0 );
707 assert( nlpcons == 0 || lprow != NULL );
708 assert( nlpcons == 0 || lpcol != NULL );
709 assert( nlpcons == 0 || lpval != NULL );
712 if ( timelimit <= 0.0 )
714 sdpisolver->timelimit = TRUE;
715 sdpisolver->timelimitinitial = TRUE;
716 sdpisolver->solved = FALSE;
719 sdpisolver->timelimit = FALSE;
720 sdpisolver->timelimitinitial = FALSE;
721 sdpisolver->feasorig = FALSE;
727 #if CONVERT_ABSOLUTE_TOLERANCES
732 if ((sdpisolver->msktask) != NULL)
734 MOSEK_CALL( MSK_deletetask(&(sdpisolver->msktask)) );
736 if ( penaltyparam < sdpisolver->epsilon )
738 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
742 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars + 1, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
745 #ifdef SCIP_MORE_DEBUG
746 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
749 if ( sdpisolver->sdpinfo )
751 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
756 if ( sdpisolver->nthreads > 0 )
758 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_NUM_THREADS, sdpisolver->nthreads) );
763 if ( penaltyparam < sdpisolver->epsilon )
764 SCIPdebugMessage(
"Inserting Data into MOSEK for SDP (%d) \n", ++sdpisolver->sdpcounter);
766 SCIPdebugMessage(
"Inserting Data again into MOSEK for SDP (%d) \n", sdpisolver->sdpcounter);
769 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
770 sdpisolver->rbound = rbound;
774 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtomosekmapper), sdpisolver->nvars, nvars) );
775 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), sdpisolver->nactivevars, nvars) );
776 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
777 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
779 oldnactivevars = sdpisolver->nactivevars;
780 sdpisolver->nvars = nvars;
781 sdpisolver->nactivevars = 0;
785 sdpisolver->fixedvarsobjcontr = 0.0;
786 for (i = 0; i < nvars; i++)
788 if (
isFixed(sdpisolver, lb[i], ub[i]) )
790 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
791 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
793 sdpisolver->inputtomosekmapper[i] = -nfixedvars;
794 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in MOSEK\n", i, lb[i], sdpisolver->sdpcounter);
798 sdpisolver->mosektoinputmapper[sdpisolver->nactivevars] = i;
799 sdpisolver->inputtomosekmapper[i] = sdpisolver->nactivevars;
800 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
801 sdpisolver->nactivevars++;
802 #ifdef SCIP_MORE_DEBUG
803 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in MOSEK\n", i, sdpisolver->inputtomosekmapper[i], sdpisolver->sdpcounter);
807 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
811 sdpisolver->fixedvarsobjcontr = 0.0;
814 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
815 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
816 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), nvars, sdpisolver->nactivevars) );
819 sdpisolver->nvarbounds = 0;
820 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds, 2 * sdpisolver->nactivevars) );
822 if ( sdpisolver->nactivevars != oldnactivevars )
824 if ( sdpisolver->varboundpos == NULL )
826 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
830 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
833 assert( sdpisolver->varboundpos != NULL );
835 for (i = 0; i < sdpisolver->nactivevars; i++)
837 assert( 0 <= sdpisolver->mosektoinputmapper[i] && sdpisolver->mosektoinputmapper[i] < nvars );
840 mosekvarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->mosektoinputmapper[i]];
841 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
842 (sdpisolver->nvarbounds)++;
846 mosekvarbounds[sdpisolver->nvarbounds] = -1 * ub[sdpisolver->mosektoinputmapper[i]];
847 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
848 (sdpisolver->nvarbounds)++;
856 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartorowmapper, 2*noldlpcons) );
858 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartolhsrhsmapper, 2*noldlpcons) );
863 for (i = 0; i < noldlpcons; i++)
865 assert( newpos <= nlpcons );
866 if ( rownactivevars[i] >= 2 )
870 vartorowmapper[pos] = -(i+1);
871 vartolhsrhsmapper[pos] = newpos;
874 #if CONVERT_ABSOLUTE_TOLERANCES
876 if ( REALABS(lplhs[newpos]) > maxrhscoef )
877 maxrhscoef = REALABS(lplhs[newpos]);
883 vartorowmapper[pos] = i+1;
884 vartolhsrhsmapper[pos] = newpos;
887 #if CONVERT_ABSOLUTE_TOLERANCES
889 if ( REALABS(lprhs[newpos]) > maxrhscoef )
890 maxrhscoef = REALABS(lprhs[newpos]);
897 assert( nlpvars <= 2*nlpcons );
903 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekblocksizes, nsdpblocks - nremovedblocks) );
905 for (b = 0; b < nsdpblocks; b++)
907 if ( blockindchanges[b] > -1 )
909 assert( 0 <= blockindchanges[b] && blockindchanges[b] <= b && (b - blockindchanges[b]) <= (nsdpblocks - nremovedblocks) );
910 mosekblocksizes[b - blockindchanges[b]] = sdpblocksizes[b] - nremovedinds[b];
913 MOSEK_CALLM( MSK_appendbarvars(sdpisolver->msktask, nsdpblocks - nremovedblocks, mosekblocksizes) );
917 MOSEK_CALLM( MSK_appendvars(sdpisolver->msktask, nlpvars + sdpisolver->nvarbounds) );
920 for (v = 0; v < nlpvars + sdpisolver->nvarbounds; v++)
922 MOSEK_CALL( MSK_putvarbound(sdpisolver->msktask, v, MSK_BK_LO, 0.0, (
double) MSK_DPAR_DATA_TOL_BOUND_INF) );
926 MOSEK_CALLM( MSK_appendcons(sdpisolver->msktask, (penaltyparam < sdpisolver->epsilon) ? sdpisolver->nactivevars : sdpisolver->nactivevars + 1) );
931 if ( sdpconstnnonz > 0 )
933 for (b = 0; b < nsdpblocks; b++)
935 if ( blockindchanges[b] > -1 )
938 if ( nremovedinds[b] > 0 )
940 int* moseksdpconstrow;
941 int* moseksdpconstcol;
943 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow, sdpconstnblocknonz[b]) );
944 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol, sdpconstnblocknonz[b]) );
946 for (k = 0; k < sdpconstnblocknonz[b]; k++)
949 assert( -1 < indchanges[b][sdpconstrow[b][k]] && indchanges[b][sdpconstrow[b][k]] <= sdpconstrow[b][k] );
950 assert( -1 < indchanges[b][sdpconstcol[b][k]] && indchanges[b][sdpconstcol[b][k]] <= sdpconstcol[b][k] );
952 assert( 0 <= sdpconstrow[b][k] && sdpconstrow[b][k] <= sdpblocksizes[b] );
953 assert( 0 <= sdpconstcol[b][k] && sdpconstcol[b][k] <= sdpblocksizes[b] );
955 moseksdpconstrow[k] = sdpconstrow[b][k] - indchanges[b][sdpconstrow[b][k]];
956 moseksdpconstcol[k] = sdpconstcol[b][k] - indchanges[b][sdpconstcol[b][k]];
958 #if CONVERT_ABSOLUTE_TOLERANCES
960 if ( REALABS(sdpconstval[b][k]) > maxrhscoef )
961 maxrhscoef = REALABS(sdpconstval[b][k]);
965 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
966 moseksdpconstrow, moseksdpconstcol, sdpconstval[b], &ind) );
968 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol);
969 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow);
973 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
974 sdpconstrow[b], sdpconstcol[b], sdpconstval[b], &ind) );
976 MOSEK_CALL( MSK_putbarcj(sdpisolver->msktask, i, 1, &ind, &one) );
985 for (i = 0; i < nlpvars; i++)
987 if ( vartorowmapper[i] > 0 )
989 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, -1 * lprhs[vartolhsrhsmapper[i]]) );
990 #ifdef SCIP_MORE_DEBUG
992 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"rhs-%d", vartorowmapper[i] - 1);
993 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
998 assert( vartorowmapper[i] < 0 );
999 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, lplhs[vartolhsrhsmapper[i]]) );
1000 #ifdef SCIP_MORE_DEBUG
1002 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lhs-%d", -1 * vartorowmapper[i] - 1);
1003 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
1009 for (i = 0; i < sdpisolver->nvarbounds; i++)
1011 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, nlpvars + i, mosekvarbounds[i]) );
1012 #ifdef SCIP_MORE_DEBUG
1013 if ( sdpisolver->varboundpos[i] < 0 )
1016 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lb-%d", sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] - 1]);
1017 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1021 assert( sdpisolver->varboundpos[i] > 0 );
1023 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"ub-%d", sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]);
1024 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1029 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds);
1032 MOSEK_CALL( MSK_putobjsense(sdpisolver->msktask, MSK_OBJECTIVE_SENSE_MAXIMIZE) );
1037 for (b = 0; b < nsdpblocks; b++)
1039 if ( blockindchanges[b] > -1 )
1041 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
1043 v = sdpisolver->inputtomosekmapper[sdpvar[b][blockvar]];
1048 assert( v < sdpisolver->nactivevars );
1050 if ( nremovedinds[b] > 0 )
1052 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, sdpnblockvarnonz[b][blockvar]) );
1053 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekcol, sdpnblockvarnonz[b][blockvar]) );
1055 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
1058 assert( -1 < indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
1059 assert( -1 < indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
1061 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
1062 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
1064 mosekrow[k] = sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]];
1065 mosekcol[k] = sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]];
1068 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1069 mosekrow, mosekcol, sdpval[b][blockvar], &ind) );
1071 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekcol);
1072 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekrow);
1076 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1077 sdprow[b][blockvar], sdpcol[b][blockvar], sdpval[b][blockvar], &ind) );
1080 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, v, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1087 if ( penaltyparam >= sdpisolver->epsilon )
1089 int* identityindices;
1090 SCIP_Real* identityvalues;
1092 for (b = 0; b < nsdpblocks; b++)
1094 if ( blockindchanges[b] > -1 )
1096 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityindices, mosekblocksizes[b - blockindchanges[b]]) );
1097 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityvalues, mosekblocksizes[b - blockindchanges[b]]) );
1099 for (i = 0; i < mosekblocksizes[b - blockindchanges[b]]; i++)
1101 identityindices[i] = i;
1102 identityvalues[i] = 1.0;
1104 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) mosekblocksizes[b - blockindchanges[b]],
1105 identityindices, identityindices, identityvalues, &ind) );
1106 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, sdpisolver->nactivevars, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1108 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityvalues);
1109 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityindices);
1115 if ( penaltyparam < sdpisolver->epsilon )
1117 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz) );
1118 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz) );
1123 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz + 1) );
1124 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz + 1) );
1128 for (i = 0; i < nlpvars; i++)
1130 if ( vartorowmapper[i] < 0 )
1135 while (ind < lpnnonz && lprow[ind] < -1 * vartorowmapper[i] - 1)
1138 while (ind < lpnnonz && lprow[ind] == -1 * vartorowmapper[i] - 1)
1140 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1143 mosekrow[mosekind] = v;
1144 mosekval[mosekind] = lpval[ind];
1149 assert( mosekind <= lpnnonz );
1153 assert( vartorowmapper[i] > 0 );
1155 if ( i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] )
1159 for (j = 0; j < (penaltyparam < sdpisolver->epsilon ? mosekind : mosekind - 1); j++)
1168 while (lprow[ind] < vartorowmapper[i] - 1)
1170 while (ind < lpnnonz && lprow[ind] == vartorowmapper[i] - 1)
1172 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1175 mosekrow[mosekind] = v;
1176 mosekval[mosekind] = -1 * lpval[ind];
1181 assert( mosekind <= lpnnonz );
1186 if ( penaltyparam >= sdpisolver->epsilon )
1190 if ( ! (i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] ))
1192 mosekrow[mosekind] = sdpisolver->nactivevars;
1193 mosekval[mosekind] = 1.0;
1196 assert( mosekind <= lpnnonz + 1 );
1199 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, i, mosekind, mosekrow, mosekval) );
1202 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekval);
1203 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekrow);
1206 for (i = 0; i < sdpisolver->nvarbounds; i++)
1208 if ( sdpisolver->varboundpos[i] < 0 )
1211 row =-1 * sdpisolver->varboundpos[i] - 1;
1217 assert( sdpisolver->varboundpos[i] > 0 );
1218 row = sdpisolver->varboundpos[i] - 1;
1221 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, nlpvars + i, 1, &row, &val) );
1225 for (i = 0; i < sdpisolver->nactivevars; i++)
1229 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, obj[sdpisolver->mosektoinputmapper[i]], obj[sdpisolver->mosektoinputmapper[i]]) );
1233 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, 0.0, 0.0) );
1235 #ifdef SCIP_MORE_DEBUG
1237 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"var-%d", sdpisolver->mosektoinputmapper[i]);
1238 MOSEK_CALL( MSK_putconname ( sdpisolver->msktask, i, varname) );
1243 if ( penaltyparam >= sdpisolver->epsilon )
1247 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_UP, (
double) -1 * MSK_DPAR_DATA_TOL_BOUND_INF, penaltyparam) );
1251 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_FX, penaltyparam, penaltyparam) );
1256 #ifdef SCIP_DEBUG_PRINTTOFILE
1261 #ifdef SCIP_MORE_DEBUG
1262 MOSEK_CALL( MSK_getnumcon (sdpisolver->msktask, &nmosekconss) );
1263 MOSEK_CALL( MSK_getnumvar (sdpisolver->msktask, &nmosekvars) );
1264 MOSEK_CALL( MSK_getnumcone (sdpisolver->msktask, &nmosekcones) );
1266 MOSEK_CALL( MSK_printdata (sdpisolver->msktask, MSK_STREAM_LOG, 0, nmosekconss, 0, nmosekvars, 0, nmosekcones, 1, 1, 1, 1, 1, 1, 1, 1) );
1267 #ifdef SCIP_PRINT_PARAMETERS
1268 MOSEK_CALL( MSK_printparam (sdpisolver->msktask) );
1273 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1276 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1278 elapsedtime = currentseconds - startseconds;
1280 if ( timelimit <= elapsedtime )
1282 sdpisolver->timelimit = TRUE;
1283 sdpisolver->solved = FALSE;
1292 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_PFEAS, sdpisolver->gaptol) );
1293 #if CONVERT_ABSOLUTE_TOLERANCES
1294 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1295 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1296 SCIPdebugMessage(
"Setting relative feasibility tolerance for MOSEK to %.10f / %f = %.12f\n", sdpisolver->sdpsolverfeastol,
1297 1+maxrhscoef, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef));
1299 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol) );
1300 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol) );
1302 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_MU_RED, sdpisolver->gaptol) );
1303 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, sdpisolver->gaptol) );
1307 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_OPTIMIZER_MAX_TIME, timelimit - elapsedtime) );
1313 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_UPPER_OBJ_CUT, sdpisolver->objlimit) );
1317 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1319 if ( sdpisolver->sdpinfo )
1321 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1322 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1325 SCIPdebugMessage(
"Solving problem using MOSEK, return code %d\n", sdpisolver->terminationcode);
1327 sdpisolver->solved = TRUE;
1329 sdpisolver->nsdpcalls = 1;
1330 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &(sdpisolver->niterations)) );
1334 #if CONVERT_ABSOLUTE_TOLERANCES
1335 feastol = sdpisolver->sdpsolverfeastol / (1 + maxrhscoef);
1337 feastol = sdpisolver->sdpsolverfeastol;
1342 SCIP_Real* solvector;
1344 SCIP_Bool infeasible;
1348 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1349 nvarspointer = nvars;
1351 assert( nvarspointer == nvars );
1354 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1355 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1356 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1357 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1359 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1363 SCIPdebugMessage(
"Solution feasible for MOSEK but outside feasibility tolerance, changing MOSEK feasibility tolerance from %f to %f\n",
1370 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, feastol) );
1371 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, feastol) );
1374 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1377 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1379 elapsedtime = currentseconds - startseconds;
1381 if ( timelimit <= elapsedtime )
1383 sdpisolver->timelimit = TRUE;
1384 sdpisolver->solved = FALSE;
1388 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1390 if ( sdpisolver->sdpinfo )
1392 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1393 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1397 sdpisolver->nsdpcalls++;
1398 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &newiterations) );
1399 sdpisolver->niterations += newiterations;
1403 sdpisolver->solved = FALSE;
1404 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"MOSEK failed to reach required feasibility tolerance! \n");
1414 if ( penaltyparam >= sdpisolver->epsilon && ( ! sdpisolver->timelimit ) && ( sdpisolver->terminationcode != MSK_RES_TRM_MAX_TIME ) )
1416 SCIP_Real* moseksol;
1417 SCIP_Real trace = 0.0;
1420 assert( feasorig != NULL );
1423 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->nactivevars + 1);
1425 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
1427 *feasorig = (moseksol[sdpisolver->nactivevars] < sdpisolver->feastol);
1432 sdpisolver->feasorig = *feasorig;
1435 if ( ! *feasorig && penaltybound != NULL )
1438 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", moseksol[sdpisolver->nactivevars]);
1443 for (b = 0; b < nsdpblocks; b++)
1445 if ( blockindchanges[b] > -1 )
1450 size = sdpblocksizes[b] - nremovedinds[b];
1452 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &X, 0.5 * size * (size + 1)) );
1453 MOSEK_CALL( MSK_getbarxj(sdpisolver->msktask, MSK_SOL_ITR, b - blockindchanges[b], X) );
1456 for (i = 0; i < size; i++)
1459 ind = 0.5 * i * (i + 3);
1460 assert( ind < 0.5 * size * (size + 1) );
1464 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &X);
1469 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &x, nlpvars + sdpisolver->nvarbounds) );
1471 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, x) );
1473 for (i = 0; i < nlpvars; i++)
1476 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &x);
1481 if ( penaltybound != NULL )
1482 *penaltybound = TRUE;
1483 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1484 trace, penaltyparam);
1486 else if ( penaltybound != NULL )
1487 *penaltybound = FALSE;
1489 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
1493 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekblocksizes);
1496 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartolhsrhsmapper);
1497 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartorowmapper);
1519 assert( sdpisolver != NULL );
1521 return sdpisolver->solved;
1536 assert( sdpisolver != NULL );
1539 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1543 case MSK_SOL_STA_UNKNOWN:
1544 case MSK_SOL_STA_PRIM_FEAS:
1545 case MSK_SOL_STA_DUAL_FEAS:
1546 case MSK_SOL_STA_NEAR_PRIM_FEAS:
1547 case MSK_SOL_STA_NEAR_DUAL_FEAS:
1549 case MSK_SOL_STA_OPTIMAL:
1550 case MSK_SOL_STA_NEAR_OPTIMAL:
1551 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1552 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1553 case MSK_SOL_STA_PRIM_INFEAS_CER:
1554 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1555 case MSK_SOL_STA_DUAL_INFEAS_CER:
1556 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1559 SCIPdebugMessage(
"Unknown return code in SCIPsdpiSolverFeasibilityKnown\n");
1567 SCIP_Bool* primalfeasible,
1568 SCIP_Bool* dualfeasible
1573 assert( sdpisolver != NULL );
1574 assert( primalfeasible != NULL );
1575 assert( dualfeasible != NULL );
1578 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1582 case MSK_SOL_STA_OPTIMAL:
1583 case MSK_SOL_STA_NEAR_OPTIMAL:
1584 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1585 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1586 *primalfeasible = TRUE;
1587 *dualfeasible = TRUE;
1589 case MSK_SOL_STA_PRIM_INFEAS_CER:
1590 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1591 *primalfeasible = FALSE;
1592 *dualfeasible = TRUE;
1594 case MSK_SOL_STA_DUAL_INFEAS_CER:
1595 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1596 *primalfeasible = TRUE;
1597 *dualfeasible = FALSE;
1600 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1601 return SCIP_LPERROR;
1615 assert( sdpisolver != NULL );
1618 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1622 case MSK_SOL_STA_DUAL_INFEAS_CER:
1623 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1625 case MSK_SOL_STA_OPTIMAL:
1626 case MSK_SOL_STA_NEAR_OPTIMAL:
1627 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1628 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1629 case MSK_SOL_STA_PRIM_INFEAS_CER:
1630 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1633 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1647 assert( sdpisolver != NULL );
1650 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1654 case MSK_SOL_STA_PRIM_INFEAS_CER:
1655 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1657 case MSK_SOL_STA_OPTIMAL:
1658 case MSK_SOL_STA_NEAR_OPTIMAL:
1659 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1660 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1661 case MSK_SOL_STA_DUAL_INFEAS_CER:
1662 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1665 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1679 assert( sdpisolver != NULL );
1682 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1686 case MSK_SOL_STA_OPTIMAL:
1687 case MSK_SOL_STA_NEAR_OPTIMAL:
1688 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1689 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1690 case MSK_SOL_STA_DUAL_INFEAS_CER:
1691 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1693 case MSK_SOL_STA_PRIM_INFEAS_CER:
1694 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1697 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1711 assert( sdpisolver != NULL );
1714 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1718 case MSK_SOL_STA_PRIM_INFEAS_CER:
1719 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1721 case MSK_SOL_STA_OPTIMAL:
1722 case MSK_SOL_STA_NEAR_OPTIMAL:
1723 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1724 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1725 case MSK_SOL_STA_DUAL_INFEAS_CER:
1726 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1729 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1743 assert( sdpisolver != NULL );
1746 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1750 case MSK_SOL_STA_DUAL_INFEAS_CER:
1751 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1753 case MSK_SOL_STA_OPTIMAL:
1754 case MSK_SOL_STA_NEAR_OPTIMAL:
1755 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1756 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1757 case MSK_SOL_STA_PRIM_INFEAS_CER:
1758 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1761 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1775 assert( sdpisolver != NULL );
1778 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1782 case MSK_SOL_STA_OPTIMAL:
1783 case MSK_SOL_STA_NEAR_OPTIMAL:
1784 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1785 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1786 case MSK_SOL_STA_PRIM_INFEAS_CER:
1787 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1789 case MSK_SOL_STA_DUAL_INFEAS_CER:
1790 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1793 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1804 assert( sdpisolver != NULL );
1806 if ( sdpisolver->timelimit )
1812 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL )
1817 SCIP_Real gapnormalization;
1819 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1824 case MSK_SOL_STA_UNKNOWN:
1825 case MSK_SOL_STA_PRIM_FEAS:
1826 case MSK_SOL_STA_DUAL_FEAS:
1827 case MSK_SOL_STA_NEAR_PRIM_FEAS:
1828 case MSK_SOL_STA_NEAR_DUAL_FEAS:
1830 case MSK_SOL_STA_OPTIMAL:
1831 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1832 case MSK_SOL_STA_PRIM_INFEAS_CER:
1833 case MSK_SOL_STA_DUAL_INFEAS_CER:
1834 case MSK_SOL_STA_NEAR_OPTIMAL:
1835 case MSK_SOL_STA_NEAR_PRIM_AND_DUAL_FEAS:
1836 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
1837 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
1839 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, &dobj) );
1840 MOSEK_CALL( MSK_getprimalobj(sdpisolver->msktask, MSK_SOL_ITR, &pobj) );
1842 gapnormalization = dobj > pobj ? (pobj > 1.0 ? pobj : 1.0) : (dobj > 1.0 ? dobj : 1.0);
1843 if ( REALABS((pobj-dobj) / gapnormalization) < sdpisolver->gaptol )
1852 return sdpisolver->terminationcode == MSK_RES_OK;
1860 assert( sdpisolver != NULL );
1863 return sdpisolver->terminationcode == MSK_RES_TRM_OBJECTIVE_RANGE;
1871 assert( sdpisolver != NULL );
1874 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_ITERATIONS;
1882 assert( sdpisolver != NULL );
1884 if ( sdpisolver->timelimit )
1887 if ( ! sdpisolver->solved )
1890 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_TIME;
1907 assert( sdpisolver != NULL );
1909 if ( ! sdpisolver->solved )
1912 if ( sdpisolver->timelimit )
1915 switch ( sdpisolver->terminationcode )
1919 case MSK_RES_TRM_MAX_NUM_SETBACKS:
1920 case MSK_RES_TRM_NUMERICAL_PROBLEM:
1921 case MSK_RES_TRM_STALL:
1923 case MSK_RES_TRM_OBJECTIVE_RANGE:
1925 case MSK_RES_TRM_MAX_ITERATIONS:
1927 case MSK_RES_TRM_MAX_TIME:
1941 assert( sdpisolver != NULL );
1943 if ( sdpisolver->timelimit )
1948 if ( sdpisolver->terminationcode != MSK_RES_OK )
1951 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1953 if ( solstat != MSK_SOL_STA_OPTIMAL )
1965 assert( sdpisolver != NULL );
1967 if ( sdpisolver->timelimit )
1970 if ( ! sdpisolver->solved )
1982 SCIPdebugMessage(
"Not implemented yet\n");
1983 return SCIP_LPERROR;
1992 SCIP_Real* moseksol;
1994 assert( sdpisolver != NULL );
1996 assert( objval != NULL );
1998 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2002 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2010 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2011 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2014 for (v = 0; v < sdpisolver->nactivevars; v++)
2015 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2019 *objval += sdpisolver->fixedvarsobjcontr;
2021 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig)
2023 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2042 SCIP_Real* moseksol;
2044 assert( sdpisolver != NULL );
2046 assert( dualsollength != NULL );
2048 if ( *dualsollength > 0 )
2050 assert( dualsol != NULL );
2051 if ( *dualsollength < sdpisolver->nvars )
2053 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2054 *dualsollength = sdpisolver->nvars;
2059 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2061 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2064 for (v = 0; v < sdpisolver->nvars; v++)
2066 if ( sdpisolver->inputtomosekmapper[v] >= 0 )
2067 dualsol[v] = moseksol[sdpisolver->inputtomosekmapper[v]];
2071 assert( -sdpisolver->inputtomosekmapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2072 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtomosekmapper[v]) - 1];
2077 if ( objval != NULL )
2079 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2083 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2090 for (v = 0; v < sdpisolver->nactivevars; v++)
2091 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2095 *objval += sdpisolver->fixedvarsobjcontr;
2098 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2100 else if ( objval != NULL )
2112 int* startXnblocknonz
2116 SCIPdebugMessage(
"Not implemented yet\n");
2118 return SCIP_PLUGINNOTFOUND;
2135 int* startXnblocknonz,
2139 SCIP_Real** startXval
2142 SCIPdebugMessage(
"Not implemented yet\n");
2143 return SCIP_LPERROR;
2161 SCIP_Real* primalvars;
2165 assert( sdpisolver != NULL );
2167 assert( arraylength != NULL );
2168 assert( lbvars != NULL );
2169 assert( ubvars != NULL );
2172 if ( *arraylength < sdpisolver->nvars )
2174 *arraylength = sdpisolver->nvars;
2175 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2180 for (i = 0; i < sdpisolver->nvars; i++)
2187 MOSEK_CALL( MSK_getnumvar(sdpisolver->msktask, &nprimalvars) );
2189 BMSallocBufferMemoryArray(sdpisolver->bufmem, &primalvars, nprimalvars);
2191 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, primalvars) );
2194 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars );
2196 for (i = 0; i < sdpisolver->nvarbounds; i++)
2198 if ( sdpisolver->varboundpos[i] < 0 )
2202 lbvars[sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2208 assert( sdpisolver->varboundpos[i] > 0 );
2211 ubvars[sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2215 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &primalvars);
2224 int* startXnblocknonz
2227 SCIPdebugMessage(
"Not implemented yet\n");
2228 return SCIP_LPERROR;
2238 int* startXnblocknonz,
2242 SCIP_Real** startXval
2245 SCIPdebugMessage(
"Not implemented yet\n");
2246 return SCIP_LPERROR;
2254 SCIPdebugMessage(
"Not implemented yet\n");
2255 return SCIP_LPERROR;
2265 if ( sdpisolver->timelimitinitial )
2269 *iterations = sdpisolver->niterations;
2281 assert( calls != NULL );
2283 *calls = sdpisolver->timelimitinitial ? 0 : sdpisolver->nsdpcalls;
2294 assert( sdpisolver != NULL );
2295 assert( usedsetting != NULL );
2299 else if ( sdpisolver->penalty )
2343 assert( sdpisolver != NULL );
2344 assert( dval != NULL );
2349 *dval = sdpisolver->epsilon;
2352 *dval = sdpisolver->gaptol;
2355 *dval = sdpisolver->feastol;
2358 *dval = sdpisolver->sdpsolverfeastol;
2361 *dval = sdpisolver->objlimit;
2364 return SCIP_PARAMETERUNKNOWN;
2377 assert( sdpisolver != NULL );
2382 sdpisolver->epsilon = dval;
2383 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2386 sdpisolver->gaptol = dval;
2387 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2390 sdpisolver->feastol = dval;
2391 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2394 sdpisolver->sdpsolverfeastol = dval;
2395 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2398 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2399 sdpisolver->objlimit = dval;
2402 return SCIP_PARAMETERUNKNOWN;
2415 assert( sdpisolver != NULL );
2420 *ival = (int) sdpisolver->sdpinfo;
2421 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2424 *ival = sdpisolver->nthreads;
2425 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
2428 return SCIP_PARAMETERUNKNOWN;
2441 assert( sdpisolver != NULL );
2446 sdpisolver->nthreads = ival;
2447 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
2450 assert( 0 <= ival && ival <= 1 );
2451 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2452 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2455 return SCIP_PARAMETERUNKNOWN;
2467 SCIPdebugMessage(
"Lambdastar parameter not used by MOSEK");
2476 SCIP_Real* penaltyparam
2481 assert( sdpisolver != NULL );
2482 assert( penaltyparam != NULL );
2498 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2499 *penaltyparam = compval;
2507 SCIP_Real penaltyparam,
2508 SCIP_Real* maxpenaltyparam
2513 assert( sdpisolver != NULL );
2514 assert( maxpenaltyparam != NULL );
2520 *maxpenaltyparam = compval;
2521 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2550 SCIPdebugMessage(
"Not implemented yet\n");
2551 return SCIP_LPERROR;
2560 assert( sdpisolver != NULL );
2561 assert( fname != NULL );
2563 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)