69 #include "blockmemshell/memory.h"
71 #include "scip/pub_misc.h"
74 #include "scip/pub_message.h"
82 #define MIN_PENALTYPARAM 1e5
83 #define MAX_PENALTYPARAM 1e10
84 #define PENALTYPARAM_FACTOR 1e6
85 #define MAX_MAXPENALTYPARAM 1e15
86 #define MAXPENALTYPARAM_FACTOR 1e6
87 #define PENALTYBOUNDTOL 1E-3
89 #define INFEASFEASTOLCHANGE 0.1
90 #define INFEASMINFEASTOL 1E-9
92 #define CONVERT_ABSOLUTE_TOLERANCES TRUE
93 #if MSK_VERSION_MAJOR >= 9
94 #define NEAR_REL_TOLERANCE 1.0
98 struct SCIP_SDPiSolver
100 SCIP_MESSAGEHDLR* messagehdlr;
107 int* inputtomosekmapper;
110 int* mosektoinputmapper;
111 SCIP_Real* fixedvarsval;
112 SCIP_Real fixedvarsobjcontr;
124 SCIP_Real sdpsolverfeastol;
131 MSKrescodee terminationcode;
133 SCIP_Bool timelimitinitial;
145 #define MOSEK_CALL(x) do \
147 MSKrescodee _mosekerrorcode_; \
148 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
150 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \
151 return SCIP_LPERROR; \
157 #define MOSEK_CALL_BOOL(x) do \
159 MSKrescodee _mosekerrorcode_; \
160 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
162 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \
169 #define MOSEK_CALLM(x) do \
171 MSKrescodee _mosekerrorcode_; \
172 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \
174 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \
175 return SCIP_NOMEMORY; \
181 #define BMS_CALL(x) do \
185 SCIPerrorMessage("No memory in function call.\n"); \
186 return SCIP_NOMEMORY; \
192 #define TIMEOFDAY_CALL(x) do \
195 if ( (_errorcode_ = (x)) != 0 ) \
197 SCIPerrorMessage("Error in gettimeofday! \n"); \
204 #define CHECK_IF_SOLVED(sdpisolver) do \
206 if (!(sdpisolver->solved)) \
208 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
209 return SCIP_LPERROR; \
215 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
217 if (!(sdpisolver->solved)) \
219 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
230 #
if MSK_VERSION_MAJOR >= 9
249 assert( sdpisolver != NULL );
250 assert( lb < ub + sdpisolver->feastol );
252 return (ub-lb <= sdpisolver->epsilon);
255 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
266 char name[SCIP_MAXSTRLEN];
273 MSKrescodee rescodee;
276 #if MSK_VERSION_MAJOR < 9
284 #if MSK_VERSION_MAJOR < 9
285 rescodee = MSK_getversion(&majorver, &minorver, &build, &revision);
287 rescodee = MSK_getversion(&majorver, &minorver, &revision);
290 if ( rescodee != MSK_RES_OK )
294 #if MSK_VERSION_MAJOR < 9
295 snprintfreturn = SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", majorver, minorver, build, revision);
297 snprintfreturn = SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d", majorver, minorver, revision);
299 assert( snprintfreturn < SCIP_MAXSTRLEN );
301 #if MSK_VERSION_MAJOR < 9
302 (void) SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", majorver, minorver, build, revision);
304 (void) SCIPsnprintf(
name, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d", majorver, minorver, revision);
316 return "Homogeneous and self-dual interior-point solver for semidefinite programming developed by MOSEK ApS"
317 "(http://www.mosek.com)";
330 assert( sdpisolver != NULL );
379 SCIP_MESSAGEHDLR* messagehdlr,
384 assert( sdpisolver != NULL );
385 assert( blkmem != NULL );
386 assert( bufmem != NULL );
388 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
390 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
392 (*sdpisolver)->messagehdlr = messagehdlr;
393 (*sdpisolver)->blkmem = blkmem;
394 (*sdpisolver)->bufmem = bufmem;
396 MOSEK_CALLM( MSK_makeenv(&((*sdpisolver)->mskenv), NULL) );
399 (*sdpisolver)->msktask = NULL;
401 (*sdpisolver)->nvars = 0;
402 (*sdpisolver)->nactivevars = 0;
403 (*sdpisolver)->inputtomosekmapper = NULL;
404 (*sdpisolver)->mosektoinputmapper = NULL;
405 (*sdpisolver)->fixedvarsval = NULL;
406 (*sdpisolver)->fixedvarsobjcontr = 0.0;
407 (*sdpisolver)->objcoefs = NULL;
408 (*sdpisolver)->nvarbounds = 0;
409 (*sdpisolver)->varboundpos = NULL;
410 (*sdpisolver)->solved = FALSE;
411 (*sdpisolver)->sdpcounter = 0;
413 (*sdpisolver)->epsilon = 1e-9;
414 (*sdpisolver)->gaptol = 1e-4;
415 (*sdpisolver)->feastol = 1e-6;
416 (*sdpisolver)->sdpsolverfeastol = 1e-6;
418 (*sdpisolver)->sdpinfo = FALSE;
419 (*sdpisolver)->nthreads = -1;
420 (*sdpisolver)->timelimit = FALSE;
421 (*sdpisolver)->timelimitinitial = FALSE;
431 assert( sdpisolver != NULL );
432 assert( *sdpisolver != NULL );
434 SCIPdebugMessage(
"Freeing SDPISolver\n");
436 if ( (*sdpisolver)->msktask != NULL )
438 MOSEK_CALL( MSK_deletetask(&((*sdpisolver)->msktask)) );
441 if ( (*sdpisolver)->mskenv != NULL )
443 MOSEK_CALL( MSK_deleteenv(&((*sdpisolver)->mskenv)) );
446 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
447 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtomosekmapper, (*sdpisolver)->nvars);
448 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->mosektoinputmapper, (*sdpisolver)->nactivevars);
449 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
450 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
452 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
462 assert( sdpisolver != NULL );
464 sdpisolver->sdpcounter++;
474 assert( sdpisolver != NULL );
476 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
477 sdpisolver->sdpcounter = 0;
517 int* sdpconstnblocknonz,
521 SCIP_Real** sdpconstval,
523 int** sdpnblockvarnonz,
533 int* blockindchanges,
545 int* startZnblocknonz,
551 SCIP_Real** startZval,
553 int* startXnblocknonz,
559 SCIP_Real** startXval,
566 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
567 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
568 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
569 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
570 timelimit, NULL, NULL);
597 SCIP_Real penaltyparam,
608 int* sdpconstnblocknonz,
612 SCIP_Real** sdpconstval,
614 int** sdpnblockvarnonz,
624 int* blockindchanges,
636 int* startZnblocknonz,
642 SCIP_Real** startZval,
644 int* startXnblocknonz,
650 SCIP_Real** startXval,
657 SCIP_Bool* penaltybound
669 SCIP_Real* mosekvarbounds;
673 int* vartolhsrhsmapper;
677 int* mosekblocksizes;
684 struct timeval starttime;
685 struct timeval currenttime;
686 SCIP_Real startseconds;
687 SCIP_Real currentseconds;
688 SCIP_Real elapsedtime;
690 #ifdef SCIP_MORE_DEBUG
694 char varname[SCIP_MAXSTRLEN];
696 #if CONVERT_ABSOLUTE_TOLERANCES
697 SCIP_Real maxrhscoef;
700 assert( sdpisolver != NULL );
701 assert( sdpisolver->mskenv != NULL );
702 assert( penaltyparam > -1 * sdpisolver->epsilon );
703 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
705 assert( obj != NULL );
706 assert( lb != NULL );
707 assert( ub != NULL );
708 assert( nsdpblocks >= 0 );
709 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
710 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
711 assert( sdpconstnnonz >= 0 );
712 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
713 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
714 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
715 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
716 assert( sdpnnonz >= 0 );
717 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
718 assert( nsdpblocks == 0 || sdpvar != NULL );
719 assert( nsdpblocks == 0 || sdprow != NULL );
720 assert( nsdpblocks == 0 || sdpcol != NULL );
721 assert( nsdpblocks == 0 || sdpval != NULL );
722 assert( nsdpblocks == 0 || indchanges != NULL );
723 assert( nsdpblocks == 0 || nremovedinds != NULL );
724 assert( nsdpblocks == 0 || blockindchanges != NULL );
725 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
726 assert( nlpcons >= 0 );
727 assert( noldlpcons >= nlpcons );
728 assert( nlpcons == 0 || lplhs != NULL );
729 assert( nlpcons == 0 || lprhs != NULL );
730 assert( nlpcons == 0 || rownactivevars != NULL );
731 assert( lpnnonz >= 0 );
732 assert( nlpcons == 0 || lprow != NULL );
733 assert( nlpcons == 0 || lpcol != NULL );
734 assert( nlpcons == 0 || lpval != NULL );
737 if ( timelimit <= 0.0 )
739 sdpisolver->timelimit = TRUE;
740 sdpisolver->timelimitinitial = TRUE;
741 sdpisolver->solved = FALSE;
744 sdpisolver->timelimit = FALSE;
745 sdpisolver->timelimitinitial = FALSE;
746 sdpisolver->feasorig = FALSE;
752 #if CONVERT_ABSOLUTE_TOLERANCES
757 if ((sdpisolver->msktask) != NULL)
759 MOSEK_CALL( MSK_deletetask(&(sdpisolver->msktask)) );
761 if ( penaltyparam < sdpisolver->epsilon )
763 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
767 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars + 1, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &(sdpisolver->msktask)) );
770 #if MSK_VERSION_MAJOR >= 9
771 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_NEAR_REL, NEAR_REL_TOLERANCE) );
774 #ifdef SCIP_MORE_DEBUG
775 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
778 if ( sdpisolver->sdpinfo )
780 MOSEK_CALL( MSK_linkfunctotaskstream (sdpisolver->msktask, MSK_STREAM_LOG, NULL,
printstr) );
785 if ( sdpisolver->nthreads > 0 )
787 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_NUM_THREADS, sdpisolver->nthreads) );
792 if ( penaltyparam < sdpisolver->epsilon )
793 SCIPdebugMessage(
"Inserting Data into MOSEK for SDP (%d) \n", ++sdpisolver->sdpcounter);
795 SCIPdebugMessage(
"Inserting Data again into MOSEK for SDP (%d) \n", sdpisolver->sdpcounter);
798 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
799 sdpisolver->rbound = rbound;
803 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtomosekmapper), sdpisolver->nvars, nvars) );
804 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), sdpisolver->nactivevars, nvars) );
805 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
806 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
808 oldnactivevars = sdpisolver->nactivevars;
809 sdpisolver->nvars = nvars;
810 sdpisolver->nactivevars = 0;
814 sdpisolver->fixedvarsobjcontr = 0.0;
815 for (i = 0; i < nvars; i++)
817 if (
isFixed(sdpisolver, lb[i], ub[i]) )
819 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
820 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
822 sdpisolver->inputtomosekmapper[i] = -nfixedvars;
823 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in MOSEK\n", i, lb[i], sdpisolver->sdpcounter);
827 sdpisolver->mosektoinputmapper[sdpisolver->nactivevars] = i;
828 sdpisolver->inputtomosekmapper[i] = sdpisolver->nactivevars;
829 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
830 sdpisolver->nactivevars++;
831 #ifdef SCIP_MORE_DEBUG
832 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in MOSEK\n", i, sdpisolver->inputtomosekmapper[i], sdpisolver->sdpcounter);
836 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
840 sdpisolver->fixedvarsobjcontr = 0.0;
843 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
844 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
845 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), nvars, sdpisolver->nactivevars) );
848 sdpisolver->nvarbounds = 0;
849 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds, 2 * sdpisolver->nactivevars) );
851 if ( sdpisolver->nactivevars != oldnactivevars )
853 if ( sdpisolver->varboundpos == NULL )
855 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
859 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
862 assert( sdpisolver->varboundpos != NULL );
864 for (i = 0; i < sdpisolver->nactivevars; i++)
866 assert( 0 <= sdpisolver->mosektoinputmapper[i] && sdpisolver->mosektoinputmapper[i] < nvars );
869 mosekvarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->mosektoinputmapper[i]];
870 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
871 (sdpisolver->nvarbounds)++;
875 mosekvarbounds[sdpisolver->nvarbounds] = -1 * ub[sdpisolver->mosektoinputmapper[i]];
876 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
877 (sdpisolver->nvarbounds)++;
885 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartorowmapper, 2*noldlpcons) );
887 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &vartolhsrhsmapper, 2*noldlpcons) );
892 for (i = 0; i < noldlpcons; i++)
894 assert( newpos <= nlpcons );
895 if ( rownactivevars[i] >= 2 )
899 vartorowmapper[pos] = -(i+1);
900 vartolhsrhsmapper[pos] = newpos;
903 #if CONVERT_ABSOLUTE_TOLERANCES
905 if ( REALABS(lplhs[newpos]) > maxrhscoef )
906 maxrhscoef = REALABS(lplhs[newpos]);
912 vartorowmapper[pos] = i+1;
913 vartolhsrhsmapper[pos] = newpos;
916 #if CONVERT_ABSOLUTE_TOLERANCES
918 if ( REALABS(lprhs[newpos]) > maxrhscoef )
919 maxrhscoef = REALABS(lprhs[newpos]);
926 assert( nlpvars <= 2*nlpcons );
932 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekblocksizes, nsdpblocks - nremovedblocks) );
934 for (b = 0; b < nsdpblocks; b++)
936 if ( blockindchanges[b] > -1 )
938 assert( 0 <= blockindchanges[b] && blockindchanges[b] <= b && (b - blockindchanges[b]) <= (nsdpblocks - nremovedblocks) );
939 mosekblocksizes[b - blockindchanges[b]] = sdpblocksizes[b] - nremovedinds[b];
942 MOSEK_CALLM( MSK_appendbarvars(sdpisolver->msktask, nsdpblocks - nremovedblocks, mosekblocksizes) );
946 MOSEK_CALLM( MSK_appendvars(sdpisolver->msktask, nlpvars + sdpisolver->nvarbounds) );
949 for (v = 0; v < nlpvars + sdpisolver->nvarbounds; v++)
951 MOSEK_CALL( MSK_putvarbound(sdpisolver->msktask, v, MSK_BK_LO, 0.0, (
double) MSK_DPAR_DATA_TOL_BOUND_INF) );
955 MOSEK_CALLM( MSK_appendcons(sdpisolver->msktask, (penaltyparam < sdpisolver->epsilon) ? sdpisolver->nactivevars : sdpisolver->nactivevars + 1) );
960 if ( sdpconstnnonz > 0 )
962 for (b = 0; b < nsdpblocks; b++)
964 if ( blockindchanges[b] > -1 )
967 if ( nremovedinds[b] > 0 )
969 int* moseksdpconstrow;
970 int* moseksdpconstcol;
972 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow, sdpconstnblocknonz[b]) );
973 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol, sdpconstnblocknonz[b]) );
975 for (k = 0; k < sdpconstnblocknonz[b]; k++)
978 assert( -1 < indchanges[b][sdpconstrow[b][k]] && indchanges[b][sdpconstrow[b][k]] <= sdpconstrow[b][k] );
979 assert( -1 < indchanges[b][sdpconstcol[b][k]] && indchanges[b][sdpconstcol[b][k]] <= sdpconstcol[b][k] );
981 assert( 0 <= sdpconstrow[b][k] && sdpconstrow[b][k] <= sdpblocksizes[b] );
982 assert( 0 <= sdpconstcol[b][k] && sdpconstcol[b][k] <= sdpblocksizes[b] );
984 moseksdpconstrow[k] = sdpconstrow[b][k] - indchanges[b][sdpconstrow[b][k]];
985 moseksdpconstcol[k] = sdpconstcol[b][k] - indchanges[b][sdpconstcol[b][k]];
987 #if CONVERT_ABSOLUTE_TOLERANCES
989 if ( REALABS(sdpconstval[b][k]) > maxrhscoef )
990 maxrhscoef = REALABS(sdpconstval[b][k]);
994 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
995 moseksdpconstrow, moseksdpconstcol, sdpconstval[b], &ind) );
997 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol);
998 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow);
1002 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
1003 sdpconstrow[b], sdpconstcol[b], sdpconstval[b], &ind) );
1005 MOSEK_CALL( MSK_putbarcj(sdpisolver->msktask, i, 1, &ind, &one) );
1014 for (i = 0; i < nlpvars; i++)
1016 if ( vartorowmapper[i] > 0 )
1018 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, -1 * lprhs[vartolhsrhsmapper[i]]) );
1019 #ifdef SCIP_MORE_DEBUG
1021 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"rhs-%d", vartorowmapper[i] - 1);
1022 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
1027 assert( vartorowmapper[i] < 0 );
1028 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, i, lplhs[vartolhsrhsmapper[i]]) );
1029 #ifdef SCIP_MORE_DEBUG
1031 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lhs-%d", -1 * vartorowmapper[i] - 1);
1032 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, i, varname) );
1038 for (i = 0; i < sdpisolver->nvarbounds; i++)
1040 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, nlpvars + i, mosekvarbounds[i]) );
1041 #ifdef SCIP_MORE_DEBUG
1042 if ( sdpisolver->varboundpos[i] < 0 )
1045 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"lb-%d", sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] - 1]);
1046 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1050 assert( sdpisolver->varboundpos[i] > 0 );
1052 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"ub-%d", sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]);
1053 MOSEK_CALL( MSK_putvarname ( sdpisolver->msktask, nlpvars + i, varname) );
1058 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds);
1061 MOSEK_CALL( MSK_putobjsense(sdpisolver->msktask, MSK_OBJECTIVE_SENSE_MAXIMIZE) );
1066 for (b = 0; b < nsdpblocks; b++)
1068 if ( blockindchanges[b] > -1 )
1070 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
1072 v = sdpisolver->inputtomosekmapper[sdpvar[b][blockvar]];
1077 assert( v < sdpisolver->nactivevars );
1079 if ( nremovedinds[b] > 0 )
1081 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, sdpnblockvarnonz[b][blockvar]) );
1082 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekcol, sdpnblockvarnonz[b][blockvar]) );
1084 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
1087 assert( -1 < indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
1088 assert( -1 < indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
1090 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
1091 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
1093 mosekrow[k] = sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]];
1094 mosekcol[k] = sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]];
1097 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1098 mosekrow, mosekcol, sdpval[b][blockvar], &ind) );
1100 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekcol);
1101 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekrow);
1105 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1106 sdprow[b][blockvar], sdpcol[b][blockvar], sdpval[b][blockvar], &ind) );
1109 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, v, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1116 if ( penaltyparam >= sdpisolver->epsilon )
1118 int* identityindices;
1119 SCIP_Real* identityvalues;
1121 for (b = 0; b < nsdpblocks; b++)
1123 if ( blockindchanges[b] > -1 )
1125 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityindices, mosekblocksizes[b - blockindchanges[b]]) );
1126 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityvalues, mosekblocksizes[b - blockindchanges[b]]) );
1128 for (i = 0; i < mosekblocksizes[b - blockindchanges[b]]; i++)
1130 identityindices[i] = i;
1131 identityvalues[i] = 1.0;
1133 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) mosekblocksizes[b - blockindchanges[b]],
1134 identityindices, identityindices, identityvalues, &ind) );
1135 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, sdpisolver->nactivevars, b - blockindchanges[b], (
long long) 1, &ind, &one) );
1137 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityvalues);
1138 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityindices);
1144 if ( penaltyparam < sdpisolver->epsilon )
1146 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz) );
1147 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz) );
1152 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz + 1) );
1153 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz + 1) );
1157 for (i = 0; i < nlpvars; i++)
1159 if ( vartorowmapper[i] < 0 )
1164 while (ind < lpnnonz && lprow[ind] < -1 * vartorowmapper[i] - 1)
1167 while (ind < lpnnonz && lprow[ind] == -1 * vartorowmapper[i] - 1)
1169 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1172 mosekrow[mosekind] = v;
1173 mosekval[mosekind] = lpval[ind];
1178 assert( mosekind <= lpnnonz );
1182 assert( vartorowmapper[i] > 0 );
1184 if ( i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] )
1188 for (j = 0; j < (penaltyparam < sdpisolver->epsilon ? mosekind : mosekind - 1); j++)
1197 while (lprow[ind] < vartorowmapper[i] - 1)
1199 while (ind < lpnnonz && lprow[ind] == vartorowmapper[i] - 1)
1201 v = sdpisolver->inputtomosekmapper[lpcol[ind]];
1204 mosekrow[mosekind] = v;
1205 mosekval[mosekind] = -1 * lpval[ind];
1210 assert( mosekind <= lpnnonz );
1215 if ( penaltyparam >= sdpisolver->epsilon )
1219 if ( ! (i > 0 && vartorowmapper[i] == -1 * vartorowmapper[i - 1] ))
1221 mosekrow[mosekind] = sdpisolver->nactivevars;
1222 mosekval[mosekind] = 1.0;
1225 assert( mosekind <= lpnnonz + 1 );
1228 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, i, mosekind, mosekrow, mosekval) );
1231 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekval);
1232 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekrow);
1235 for (i = 0; i < sdpisolver->nvarbounds; i++)
1237 if ( sdpisolver->varboundpos[i] < 0 )
1240 row =-1 * sdpisolver->varboundpos[i] - 1;
1246 assert( sdpisolver->varboundpos[i] > 0 );
1247 row = sdpisolver->varboundpos[i] - 1;
1250 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, nlpvars + i, 1, &row, &val) );
1254 for (i = 0; i < sdpisolver->nactivevars; i++)
1258 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, obj[sdpisolver->mosektoinputmapper[i]], obj[sdpisolver->mosektoinputmapper[i]]) );
1262 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, 0.0, 0.0) );
1264 #ifdef SCIP_MORE_DEBUG
1266 (void) SCIPsnprintf(varname, SCIP_MAXSTRLEN,
"var-%d", sdpisolver->mosektoinputmapper[i]);
1267 MOSEK_CALL( MSK_putconname ( sdpisolver->msktask, i, varname) );
1272 if ( penaltyparam >= sdpisolver->epsilon )
1276 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_UP, (
double) -1 * MSK_DPAR_DATA_TOL_BOUND_INF, penaltyparam) );
1280 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_FX, penaltyparam, penaltyparam) );
1285 #ifdef SCIP_DEBUG_PRINTTOFILE
1290 #ifdef SCIP_MORE_DEBUG
1291 MOSEK_CALL( MSK_getnumcon (sdpisolver->msktask, &nmosekconss) );
1292 MOSEK_CALL( MSK_getnumvar (sdpisolver->msktask, &nmosekvars) );
1293 MOSEK_CALL( MSK_getnumcone (sdpisolver->msktask, &nmosekcones) );
1295 MOSEK_CALL( MSK_printdata (sdpisolver->msktask, MSK_STREAM_LOG, 0, nmosekconss, 0, nmosekvars, 0, nmosekcones, 1, 1, 1, 1, 1, 1, 1, 1) );
1296 #ifdef SCIP_PRINT_PARAMETERS
1297 MOSEK_CALL( MSK_printparam (sdpisolver->msktask) );
1302 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1305 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1307 elapsedtime = currentseconds - startseconds;
1309 if ( timelimit <= elapsedtime )
1311 sdpisolver->timelimit = TRUE;
1312 sdpisolver->solved = FALSE;
1321 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_PFEAS, sdpisolver->gaptol) );
1322 #if CONVERT_ABSOLUTE_TOLERANCES
1323 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1324 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef)) );
1325 SCIPdebugMessage(
"Setting relative feasibility tolerance for MOSEK to %.10f / %f = %.12f\n", sdpisolver->sdpsolverfeastol,
1326 1+maxrhscoef, sdpisolver->sdpsolverfeastol / (1 + maxrhscoef));
1328 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol) );
1329 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol) );
1331 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_MU_RED, sdpisolver->gaptol) );
1332 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, sdpisolver->gaptol) );
1336 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_OPTIMIZER_MAX_TIME, timelimit - elapsedtime) );
1342 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_UPPER_OBJ_CUT, sdpisolver->objlimit) );
1346 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1348 if ( sdpisolver->sdpinfo )
1350 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1351 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1354 SCIPdebugMessage(
"Solving problem using MOSEK, return code %d\n", sdpisolver->terminationcode);
1356 sdpisolver->solved = TRUE;
1358 sdpisolver->nsdpcalls = 1;
1359 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &(sdpisolver->niterations)) );
1363 #if CONVERT_ABSOLUTE_TOLERANCES
1364 feastol = sdpisolver->sdpsolverfeastol / (1 + maxrhscoef);
1366 feastol = sdpisolver->sdpsolverfeastol;
1371 SCIP_Real* solvector;
1373 SCIP_Bool infeasible;
1377 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1378 nvarspointer = nvars;
1380 assert( nvarspointer == nvars );
1383 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1384 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1385 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1386 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1388 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1392 SCIPdebugMessage(
"Solution feasible for MOSEK but outside feasibility tolerance, changing MOSEK feasibility tolerance from %f to %f\n",
1399 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, feastol) );
1400 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, feastol) );
1403 startseconds = (SCIP_Real) starttime.tv_sec + (SCIP_Real) starttime.tv_usec / 1e6;
1406 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
1408 elapsedtime = currentseconds - startseconds;
1410 if ( timelimit <= elapsedtime )
1412 sdpisolver->timelimit = TRUE;
1413 sdpisolver->solved = FALSE;
1417 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1419 if ( sdpisolver->sdpinfo )
1421 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1422 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1426 sdpisolver->nsdpcalls++;
1427 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &newiterations) );
1428 sdpisolver->niterations += newiterations;
1432 sdpisolver->solved = FALSE;
1433 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"MOSEK failed to reach required feasibility tolerance! \n");
1444 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1445 if ( penaltyparam >= sdpisolver->epsilon && (solstat == MSK_SOL_STA_PRIM_INFEAS_CER) )
1447 assert( feasorig != NULL );
1449 SCIPdebugMessage(
"Penalty Problem unbounded!\n");
1451 else if ( penaltyparam >= sdpisolver->epsilon && ( ! sdpisolver->timelimit ) && ( sdpisolver->terminationcode != MSK_RES_TRM_MAX_TIME ) )
1453 SCIP_Real* moseksol;
1454 SCIP_Real trace = 0.0;
1457 assert( feasorig != NULL );
1460 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->nactivevars + 1);
1462 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
1464 *feasorig = (moseksol[sdpisolver->nactivevars] < sdpisolver->feastol);
1469 sdpisolver->feasorig = *feasorig;
1472 if ( ! *feasorig && penaltybound != NULL )
1475 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", moseksol[sdpisolver->nactivevars]);
1480 for (b = 0; b < nsdpblocks; b++)
1482 if ( blockindchanges[b] > -1 )
1487 size = sdpblocksizes[b] - nremovedinds[b];
1489 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &X, 0.5 * size * (size + 1)) );
1490 MOSEK_CALL( MSK_getbarxj(sdpisolver->msktask, MSK_SOL_ITR, b - blockindchanges[b], X) );
1493 for (i = 0; i < size; i++)
1496 ind = i * (i + 3) / 2;
1497 assert( ind < 0.5 * size * (size + 1) );
1501 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &X);
1506 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &x, nlpvars + sdpisolver->nvarbounds) );
1508 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, x) );
1510 for (i = 0; i < nlpvars; i++)
1513 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &x);
1518 if ( penaltybound != NULL )
1519 *penaltybound = TRUE;
1520 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1521 trace, penaltyparam);
1523 else if ( penaltybound != NULL )
1524 *penaltybound = FALSE;
1526 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
1530 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekblocksizes);
1533 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartolhsrhsmapper);
1534 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &vartorowmapper);
1556 assert( sdpisolver != NULL );
1558 return sdpisolver->solved;
1573 assert( sdpisolver != NULL );
1576 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1580 case MSK_SOL_STA_UNKNOWN:
1581 case MSK_SOL_STA_PRIM_FEAS:
1582 case MSK_SOL_STA_DUAL_FEAS:
1584 case MSK_SOL_STA_OPTIMAL:
1585 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1586 case MSK_SOL_STA_PRIM_INFEAS_CER:
1587 case MSK_SOL_STA_DUAL_INFEAS_CER:
1590 SCIPdebugMessage(
"Unknown return code in SCIPsdpiSolverFeasibilityKnown\n");
1598 SCIP_Bool* primalfeasible,
1599 SCIP_Bool* dualfeasible
1604 assert( sdpisolver != NULL );
1605 assert( primalfeasible != NULL );
1606 assert( dualfeasible != NULL );
1609 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1613 case MSK_SOL_STA_OPTIMAL:
1614 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1615 *primalfeasible = TRUE;
1616 *dualfeasible = TRUE;
1618 case MSK_SOL_STA_PRIM_INFEAS_CER:
1619 *primalfeasible = FALSE;
1620 *dualfeasible = TRUE;
1622 case MSK_SOL_STA_DUAL_INFEAS_CER:
1623 *primalfeasible = TRUE;
1624 *dualfeasible = FALSE;
1627 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1628 return SCIP_LPERROR;
1643 assert( sdpisolver != NULL );
1646 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1650 case MSK_SOL_STA_DUAL_INFEAS_CER:
1652 case MSK_SOL_STA_OPTIMAL:
1653 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1654 case MSK_SOL_STA_PRIM_INFEAS_CER:
1657 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1672 assert( sdpisolver != NULL );
1675 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1679 case MSK_SOL_STA_PRIM_INFEAS_CER:
1681 case MSK_SOL_STA_OPTIMAL:
1682 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1683 case MSK_SOL_STA_DUAL_INFEAS_CER:
1686 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1701 assert( sdpisolver != NULL );
1704 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1708 case MSK_SOL_STA_OPTIMAL:
1709 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1710 case MSK_SOL_STA_DUAL_INFEAS_CER:
1712 case MSK_SOL_STA_PRIM_INFEAS_CER:
1715 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1730 assert( sdpisolver != NULL );
1733 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1737 case MSK_SOL_STA_PRIM_INFEAS_CER:
1739 case MSK_SOL_STA_OPTIMAL:
1740 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1741 case MSK_SOL_STA_DUAL_INFEAS_CER:
1744 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1759 assert( sdpisolver != NULL );
1762 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1766 case MSK_SOL_STA_DUAL_INFEAS_CER:
1768 case MSK_SOL_STA_OPTIMAL:
1769 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1770 case MSK_SOL_STA_PRIM_INFEAS_CER:
1773 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1788 assert( sdpisolver != NULL );
1791 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1795 case MSK_SOL_STA_OPTIMAL:
1796 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1797 case MSK_SOL_STA_PRIM_INFEAS_CER:
1799 case MSK_SOL_STA_DUAL_INFEAS_CER:
1802 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1813 assert( sdpisolver != NULL );
1815 if ( sdpisolver->timelimit )
1821 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL )
1826 SCIP_Real gapnormalization;
1828 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1833 case MSK_SOL_STA_UNKNOWN:
1834 case MSK_SOL_STA_PRIM_FEAS:
1835 case MSK_SOL_STA_DUAL_FEAS:
1837 case MSK_SOL_STA_OPTIMAL:
1838 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1839 case MSK_SOL_STA_PRIM_INFEAS_CER:
1840 case MSK_SOL_STA_DUAL_INFEAS_CER:
1842 MOSEK_CALL_BOOL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, &dobj) );
1843 MOSEK_CALL_BOOL( MSK_getprimalobj(sdpisolver->msktask, MSK_SOL_ITR, &pobj) );
1845 gapnormalization = dobj > pobj ? (pobj > 1.0 ? pobj : 1.0) : (dobj > 1.0 ? dobj : 1.0);
1846 if ( REALABS((pobj-dobj) / gapnormalization) < sdpisolver->gaptol )
1855 return sdpisolver->terminationcode == MSK_RES_OK;
1863 assert( sdpisolver != NULL );
1866 return sdpisolver->terminationcode == MSK_RES_TRM_OBJECTIVE_RANGE;
1874 assert( sdpisolver != NULL );
1877 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_ITERATIONS;
1885 assert( sdpisolver != NULL );
1887 if ( sdpisolver->timelimit )
1890 if ( ! sdpisolver->solved )
1893 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_TIME;
1911 assert( sdpisolver != NULL );
1913 if ( ! sdpisolver->solved )
1916 if ( sdpisolver->timelimit )
1919 switch ( sdpisolver->terminationcode )
1923 case MSK_RES_TRM_MAX_NUM_SETBACKS:
1924 case MSK_RES_TRM_NUMERICAL_PROBLEM:
1925 case MSK_RES_TRM_STALL:
1927 case MSK_RES_TRM_OBJECTIVE_RANGE:
1929 case MSK_RES_TRM_MAX_ITERATIONS:
1931 case MSK_RES_TRM_MAX_TIME:
1945 assert( sdpisolver != NULL );
1947 if ( sdpisolver->timelimit )
1952 if ( sdpisolver->terminationcode != MSK_RES_OK )
1955 MOSEK_CALL_BOOL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &solstat) );
1957 if ( solstat != MSK_SOL_STA_OPTIMAL )
1970 assert( sdpisolver != NULL );
1972 if ( sdpisolver->timelimit )
1975 if ( ! sdpisolver->solved )
1987 SCIPdebugMessage(
"Not implemented yet\n");
1988 return SCIP_LPERROR;
1997 SCIP_Real* moseksol;
1999 assert( sdpisolver != NULL );
2001 assert( objval != NULL );
2010 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2014 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2022 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2023 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2026 for (v = 0; v < sdpisolver->nactivevars; v++)
2027 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2031 *objval += sdpisolver->fixedvarsobjcontr;
2033 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig)
2035 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2054 SCIP_Real* moseksol;
2056 assert( sdpisolver != NULL );
2058 assert( dualsollength != NULL );
2060 if ( *dualsollength > 0 )
2062 assert( dualsol != NULL );
2063 if ( *dualsollength < sdpisolver->nvars )
2065 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2066 *dualsollength = sdpisolver->nvars;
2071 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2073 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2076 for (v = 0; v < sdpisolver->nvars; v++)
2078 if ( sdpisolver->inputtomosekmapper[v] >= 0 )
2079 dualsol[v] = moseksol[sdpisolver->inputtomosekmapper[v]];
2083 assert( -sdpisolver->inputtomosekmapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2084 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtomosekmapper[v]) - 1];
2089 if ( objval != NULL )
2091 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2095 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2102 for (v = 0; v < sdpisolver->nactivevars; v++)
2103 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2107 *objval += sdpisolver->fixedvarsobjcontr;
2110 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2112 else if ( objval != NULL )
2124 int* startXnblocknonz
2128 SCIPdebugMessage(
"Not implemented yet\n");
2130 return SCIP_PLUGINNOTFOUND;
2147 int* startXnblocknonz,
2151 SCIP_Real** startXval
2154 SCIPdebugMessage(
"Not implemented yet\n");
2155 return SCIP_LPERROR;
2173 SCIP_Real* primalvars;
2177 assert( sdpisolver != NULL );
2179 assert( arraylength != NULL );
2180 assert( lbvars != NULL );
2181 assert( ubvars != NULL );
2184 if ( *arraylength < sdpisolver->nvars )
2186 *arraylength = sdpisolver->nvars;
2187 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2192 for (i = 0; i < sdpisolver->nvars; i++)
2199 MOSEK_CALL( MSK_getnumvar(sdpisolver->msktask, &nprimalvars) );
2201 BMSallocBufferMemoryArray(sdpisolver->bufmem, &primalvars, nprimalvars);
2203 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, primalvars) );
2206 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars );
2208 for (i = 0; i < sdpisolver->nvarbounds; i++)
2210 if ( sdpisolver->varboundpos[i] < 0 )
2214 lbvars[sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2220 assert( sdpisolver->varboundpos[i] > 0 );
2223 ubvars[sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i];
2227 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &primalvars);
2236 int* startXnblocknonz
2239 SCIPdebugMessage(
"Not implemented yet\n");
2240 return SCIP_LPERROR;
2252 int* startXnblocknonz,
2256 SCIP_Real** startXval
2259 SCIPdebugMessage(
"Not implemented yet\n");
2260 return SCIP_LPERROR;
2268 SCIPdebugMessage(
"Not implemented yet\n");
2269 return SCIP_INVALID;
2278 if ( sdpisolver->timelimitinitial )
2282 *iterations = sdpisolver->niterations;
2294 assert( calls != NULL );
2296 *calls = sdpisolver->timelimitinitial ? 0 : sdpisolver->nsdpcalls;
2307 assert( sdpisolver != NULL );
2308 assert( usedsetting != NULL );
2312 else if ( sdpisolver->penalty )
2356 assert( sdpisolver != NULL );
2357 assert( dval != NULL );
2362 *dval = sdpisolver->epsilon;
2365 *dval = sdpisolver->gaptol;
2368 *dval = sdpisolver->feastol;
2371 *dval = sdpisolver->sdpsolverfeastol;
2374 *dval = sdpisolver->objlimit;
2377 return SCIP_PARAMETERUNKNOWN;
2390 assert( sdpisolver != NULL );
2395 sdpisolver->epsilon = dval;
2396 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2399 sdpisolver->gaptol = dval;
2400 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2403 sdpisolver->feastol = dval;
2404 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2407 sdpisolver->sdpsolverfeastol = dval;
2408 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2411 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2412 sdpisolver->objlimit = dval;
2415 return SCIP_PARAMETERUNKNOWN;
2428 assert( sdpisolver != NULL );
2433 *ival = (int) sdpisolver->sdpinfo;
2434 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2437 *ival = sdpisolver->nthreads;
2438 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
2441 return SCIP_PARAMETERUNKNOWN;
2454 assert( sdpisolver != NULL );
2459 sdpisolver->nthreads = ival;
2460 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
2463 assert( 0 <= ival && ival <= 1 );
2464 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2465 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2468 return SCIP_PARAMETERUNKNOWN;
2480 SCIPdebugMessage(
"Lambdastar parameter not used by MOSEK");
2489 SCIP_Real* penaltyparam
2494 assert( sdpisolver != NULL );
2495 assert( penaltyparam != NULL );
2511 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2512 *penaltyparam = compval;
2520 SCIP_Real penaltyparam,
2521 SCIP_Real* maxpenaltyparam
2526 assert( sdpisolver != NULL );
2527 assert( maxpenaltyparam != NULL );
2533 *maxpenaltyparam = compval;
2534 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2563 SCIPdebugMessage(
"Not implemented yet\n");
2564 return SCIP_LPERROR;
2573 assert( sdpisolver != NULL );
2574 assert( fname != NULL );
2576 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)