71 #include "blockmemshell/memory.h" 73 #include "scip/pub_misc.h" 76 #include "scip/pub_message.h" 77 #include "tinycthread/tinycthread.h" 85 #define MIN_PENALTYPARAM 1e5 86 #define MAX_PENALTYPARAM 1e10 87 #define PENALTYPARAM_FACTOR 1e6 88 #define MAX_MAXPENALTYPARAM 1e15 89 #define MAXPENALTYPARAM_FACTOR 1e6 90 #define PENALTYBOUNDTOL 1E-3 92 #define INFEASFEASTOLCHANGE 0.1 93 #define INFEASMINFEASTOL 1E-9 95 #define CONVERT_ABSOLUTE_TOLERANCES TRUE 96 #define CHECKVIOLATIONS 0 97 #if MSK_VERSION_MAJOR >= 9 98 #define NEAR_REL_TOLERANCE 1.0 102 #if defined(_Thread_local) 103 _Thread_local MSKenv_t reusemskenv = NULL;
104 _Thread_local
int numsdp = 0;
105 #define SCIP_REUSEENV 110 struct SCIP_SDPiSolver
112 SCIP_MESSAGEHDLR* messagehdlr;
121 int* inputtomosekmapper;
124 int* mosektoinputmapper;
125 SCIP_Real* fixedvarsval;
126 SCIP_Real fixedvarsobjcontr;
138 SCIP_Real sdpsolverfeastol;
141 SCIP_Bool usepresolving;
142 SCIP_Bool usescaling;
147 MSKrescodee terminationcode;
154 SCIP_Real objscalefactor;
163 #define MOSEK_CALL(x) do \ 165 MSKrescodee _mosekerrorcode_; \ 166 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \ 168 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \ 169 return SCIP_LPERROR; \ 175 #define MOSEK_CALL_BOOL(x) do \ 177 MSKrescodee _mosekerrorcode_; \ 178 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \ 180 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \ 187 #define MOSEK_CALLM(x) do \ 189 MSKrescodee _mosekerrorcode_; \ 190 if ( (_mosekerrorcode_ = (x)) != MSK_RES_OK ) \ 192 SCIPerrorMessage("MOSEK-Error <%d> in function call.\n", (int)_mosekerrorcode_); \ 193 return SCIP_NOMEMORY; \ 199 #define BMS_CALL(x) do \ 203 SCIPerrorMessage("No memory in function call.\n"); \ 204 return SCIP_NOMEMORY; \ 210 #define CHECK_IF_SOLVED(sdpisolver) do \ 212 if (!(sdpisolver->solved)) \ 214 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 215 return SCIP_LPERROR; \ 221 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \ 223 if (!(sdpisolver->solved)) \ 225 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 235 #
if MSK_VERSION_MAJOR >= 9
236 MSKuserhandle_t handler,
246 snprintf(errstr, 32,
"MOSEK Error %d", MSK_RES_ERR_DUP_NAME);
247 if ( strncmp(errstr, str, strlen(errstr)) == 0 )
251 SCIPmessagePrintInfo((SCIP_MESSAGEHDLR *) handler,
"MOSEK: %s", str);
264 assert( sdpisolver != NULL );
265 assert( lb < ub + sdpisolver->feastol );
267 return (ub-lb <= sdpisolver->epsilon);
270 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon) 283 assert( initsize >= 0 );
287 initsize = MAX(initsize, SCIP_DEFAULT_MEM_ARRAYGROWINIT);
292 while ( size < num && size > oldsize )
295 size = (int)(SCIP_DEFAULT_MEM_ARRAYGROWFAC * size + initsize);
299 if ( size <= oldsize )
302 assert( size >= initsize );
303 assert( size >= num );
317 assert( sdpisolver != NULL );
319 if ( nvars > sdpisolver->maxnvars )
323 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->maxnvars, 2 * newsize) );
324 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtomosekmapper), sdpisolver->maxnvars, newsize) );
325 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->mosektoinputmapper), sdpisolver->maxnvars, newsize) );
326 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->maxnvars, newsize) );
327 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->maxnvars, newsize) );
328 sdpisolver->maxnvars = newsize;
349 MSKrescodee rescodee;
352 #if MSK_VERSION_MAJOR < 9 360 #if MSK_VERSION_MAJOR < 9 361 rescodee = MSK_getversion(&majorver, &minorver, &build, &revision);
363 rescodee = MSK_getversion(&majorver, &minorver, &revision);
366 if ( rescodee != MSK_RES_OK )
370 #if MSK_VERSION_MAJOR < 9 371 snprintfreturn = SCIPsnprintf(
solvername, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", majorver, minorver, build, revision);
373 snprintfreturn = SCIPsnprintf(
solvername, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d", majorver, minorver, revision);
375 assert( snprintfreturn < SCIP_MAXSTRLEN );
377 #if MSK_VERSION_MAJOR < 9 378 (void) SCIPsnprintf(
solvername, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d.%d", majorver, minorver, build, revision);
380 (void) SCIPsnprintf(
solvername, SCIP_MAXSTRLEN,
"MOSEK %d.%d.%d", majorver, minorver, revision);
392 return "Homogeneous and self-dual interior-point solver for semidefinite programming developed by MOSEK ApS" 393 "(http://www.mosek.com)";
406 assert( sdpisolver != NULL );
439 SCIP_MESSAGEHDLR* messagehdlr,
444 assert( sdpisolver != NULL );
445 assert( blkmem != NULL );
446 assert( bufmem != NULL );
448 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
450 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
452 (*sdpisolver)->messagehdlr = messagehdlr;
453 (*sdpisolver)->blkmem = blkmem;
454 (*sdpisolver)->bufmem = bufmem;
457 if ( reusemskenv == NULL )
460 MOSEK_CALL( MSK_makeenv(&reusemskenv, NULL) );
462 (*sdpisolver)->mskenv = reusemskenv;
465 MOSEK_CALL( MSK_makeenv(&((*sdpisolver)->mskenv), NULL) );
469 (*sdpisolver)->msktask = NULL;
470 (*sdpisolver)->opttime = 0.0;
472 (*sdpisolver)->nvars = 0;
473 (*sdpisolver)->nactivevars = 0;
474 (*sdpisolver)->inputtomosekmapper = NULL;
475 (*sdpisolver)->mosektoinputmapper = NULL;
476 (*sdpisolver)->fixedvarsval = NULL;
477 (*sdpisolver)->fixedvarsobjcontr = 0.0;
478 (*sdpisolver)->objcoefs = NULL;
479 (*sdpisolver)->maxnvars = 0;
480 (*sdpisolver)->nvarbounds = 0;
481 (*sdpisolver)->varboundpos = NULL;
482 (*sdpisolver)->solved = FALSE;
483 (*sdpisolver)->sdpcounter = 0;
485 (*sdpisolver)->epsilon = 1e-9;
486 (*sdpisolver)->gaptol = 1e-4;
487 (*sdpisolver)->feastol = 1e-6;
488 (*sdpisolver)->sdpsolverfeastol = 1e-6;
490 (*sdpisolver)->sdpinfo = FALSE;
491 (*sdpisolver)->usepresolving = TRUE;
492 (*sdpisolver)->usescaling = TRUE;
493 (*sdpisolver)->nthreads = -1;
494 (*sdpisolver)->terminationcode = MSK_RES_OK;
495 (*sdpisolver)->solstat = MSK_SOL_STA_UNKNOWN;
496 (*sdpisolver)->timelimit = FALSE;
497 (*sdpisolver)->niterations = 0;
498 (*sdpisolver)->scaleobj = FALSE;
499 (*sdpisolver)->objscalefactor = 1.0;
509 assert( sdpisolver != NULL );
510 assert( *sdpisolver != NULL );
512 SCIPdebugMessage(
"Freeing SDPISolver\n");
514 if ( (*sdpisolver)->msktask != NULL )
516 MOSEK_CALL( MSK_deletetask(&((*sdpisolver)->msktask)) );
519 if ( (*sdpisolver)->mskenv != NULL )
522 assert( numsdp > 0 );
530 MOSEK_CALL( MSK_deleteenv(&((*sdpisolver)->mskenv)) );
534 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->maxnvars);
535 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtomosekmapper, (*sdpisolver)->maxnvars);
536 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->mosektoinputmapper, (*sdpisolver)->maxnvars);
537 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->maxnvars);
538 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->maxnvars);
540 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
550 assert( sdpisolver != NULL );
552 sdpisolver->sdpcounter++;
562 assert( sdpisolver != NULL );
564 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
565 sdpisolver->sdpcounter = 0;
605 int* sdpconstnblocknonz,
609 SCIP_Real** sdpconstval,
611 int** sdpnblockvarnonz,
621 int* blockindchanges,
631 int* startZnblocknonz,
637 SCIP_Real** startZval,
639 int* startXnblocknonz,
645 SCIP_Real** startXval,
653 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
654 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
655 nremovedinds, blockindchanges, nremovedblocks, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
656 starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
657 timelimit, usedsdpitime, NULL, NULL);
684 SCIP_Real penaltyparam,
695 int* sdpconstnblocknonz,
699 SCIP_Real** sdpconstval,
701 int** sdpnblockvarnonz,
711 int* blockindchanges,
721 int* startZnblocknonz,
727 SCIP_Real** startZval,
729 int* startXnblocknonz,
735 SCIP_Real** startXval,
743 SCIP_Bool* penaltybound
753 long long mosekindex;
757 SCIP_Real* mosekvarbounds;
760 int* mosekblocksizes;
767 SCIP_Real solvertimelimit;
768 #ifdef SCIP_MORE_DEBUG 769 char name[SCIP_MAXSTRLEN];
771 #if CONVERT_ABSOLUTE_TOLERANCES 772 SCIP_Real maxrhscoef = 0.0;
774 SCIP_Real maxabsobjcoef = 0.0;
776 assert( sdpisolver != NULL );
777 assert( sdpisolver->mskenv != NULL );
778 assert( penaltyparam > -1 * sdpisolver->epsilon );
779 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
781 assert( obj != NULL );
782 assert( lb != NULL );
783 assert( ub != NULL );
784 assert( nsdpblocks >= 0 );
785 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
786 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
787 assert( sdpconstnnonz >= 0 );
788 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
789 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
790 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
791 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
792 assert( sdpnnonz >= 0 );
793 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
794 assert( nsdpblocks == 0 || sdpvar != NULL );
795 assert( nsdpblocks == 0 || sdprow != NULL );
796 assert( nsdpblocks == 0 || sdpcol != NULL );
797 assert( nsdpblocks == 0 || sdpval != NULL );
798 assert( nsdpblocks == 0 || indchanges != NULL );
799 assert( nsdpblocks == 0 || nremovedinds != NULL );
800 assert( nsdpblocks == 0 || blockindchanges != NULL );
801 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
802 assert( nlpcons >= 0 );
803 assert( nlpcons == 0 || lplhs != NULL );
804 assert( nlpcons == 0 || lprhs != NULL );
805 assert( lpnnonz >= 0 );
806 assert( nlpcons == 0 || lprow != NULL );
807 assert( nlpcons == 0 || lpcol != NULL );
808 assert( nlpcons == 0 || lpval != NULL );
811 solvertimelimit = timelimit;
815 sdpisolver->niterations = 0;
816 sdpisolver->nsdpcalls = 0;
817 sdpisolver->objscalefactor = 1.0;
820 if ( solvertimelimit <= 0.0 )
822 sdpisolver->timelimit = TRUE;
823 sdpisolver->solved = FALSE;
826 sdpisolver->timelimit = FALSE;
827 sdpisolver->feasorig = FALSE;
830 if ( sdpisolver->msktask != NULL )
832 MOSEK_CALL( MSK_deletetask(&sdpisolver->msktask) );
834 if ( penaltyparam < sdpisolver->epsilon )
836 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &sdpisolver->msktask) );
840 MOSEK_CALLM( MSK_maketask(sdpisolver->mskenv, nvars + 1, nsdpblocks - nremovedblocks + nlpcons + 2 * nvars, &sdpisolver->msktask) );
843 #if MSK_VERSION_MAJOR >= 9 844 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_NEAR_REL, NEAR_REL_TOLERANCE) );
848 #ifdef SCIP_MORE_DEBUG 849 sdpisolver->sdpinfo = TRUE;
852 if ( sdpisolver->sdpinfo )
854 MOSEK_CALL( MSK_linkfunctotaskstream(sdpisolver->msktask, MSK_STREAM_LOG, (MSKuserhandle_t) sdpisolver->messagehdlr,
printstr) );
858 if ( sdpisolver->nthreads > 0 )
860 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_NUM_THREADS, sdpisolver->nthreads) );
865 if ( penaltyparam < sdpisolver->epsilon )
867 SCIPdebugMessage(
"Inserting data into MOSEK for SDP (%d) \n", ++sdpisolver->sdpcounter);
871 SCIPdebugMessage(
"Inserting Data again into MOSEK for penalty formulation of SDP (%d) \n", sdpisolver->sdpcounter);
875 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
876 sdpisolver->rbound = rbound;
880 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds, 2 * nvars) );
882 sdpisolver->nvars = nvars;
883 sdpisolver->nactivevars = 0;
884 sdpisolver->nvarbounds = 0;
887 for (i = 0; i < sdpisolver->nactivevars; i++)
889 assert( 0 <= sdpisolver->mosektoinputmapper[i] && sdpisolver->mosektoinputmapper[i] < nvars );
893 sdpisolver->fixedvarsobjcontr = 0.0;
894 for (i = 0; i < nvars; i++)
896 if (
isFixed(sdpisolver, lb[i], ub[i]) )
898 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
899 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
901 sdpisolver->inputtomosekmapper[i] = -nfixedvars;
902 SCIPdebugMessage(
"Fixing variable %d locally to %g for SDP %d in MOSEK.\n", i, lb[i], sdpisolver->sdpcounter);
906 #ifdef SCIP_MORE_DEBUG 907 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in MOSEK.\n", i, sdpisolver->nactivevars, sdpisolver->sdpcounter);
910 sdpisolver->mosektoinputmapper[sdpisolver->nactivevars] = i;
911 sdpisolver->inputtomosekmapper[i] = sdpisolver->nactivevars;
912 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
917 if ( REALABS(obj[i]) > maxabsobjcoef )
918 maxabsobjcoef = REALABS(obj[i]);
923 mosekvarbounds[sdpisolver->nvarbounds] = lb[i];
924 sdpisolver->varboundpos[sdpisolver->nvarbounds++] = -(sdpisolver->nactivevars + 1);
929 mosekvarbounds[sdpisolver->nvarbounds] = - ub[i];
930 sdpisolver->varboundpos[sdpisolver->nvarbounds++] = +(sdpisolver->nactivevars + 1);
933 sdpisolver->nactivevars++;
936 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
939 if ( penaltyparam >= sdpisolver->epsilon )
941 if ( penaltyparam > maxabsobjcoef )
942 maxabsobjcoef = penaltyparam;
947 sdpisolver->fixedvarsobjcontr = 0.0;
953 for (i = 0; i < nlpcons; i++)
957 #if CONVERT_ABSOLUTE_TOLERANCES 959 if ( REALABS(lplhs[i]) > maxrhscoef )
960 maxrhscoef = REALABS(lplhs[i]);
967 #if CONVERT_ABSOLUTE_TOLERANCES 969 if ( REALABS(lprhs[i]) > maxrhscoef )
970 maxrhscoef = REALABS(lprhs[i]);
975 assert( nlpvars <= 2 * nlpcons );
979 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekblocksizes, nsdpblocks - nremovedblocks) );
981 for (b = 0; b < nsdpblocks; b++)
983 if ( blockindchanges[b] > -1 )
985 assert( 0 <= blockindchanges[b] && blockindchanges[b] <= b && (b - blockindchanges[b]) <= (nsdpblocks - nremovedblocks) );
986 mosekblocksizes[b - blockindchanges[b]] = sdpblocksizes[b] - nremovedinds[b];
989 MOSEK_CALLM( MSK_appendbarvars(sdpisolver->msktask, nsdpblocks - nremovedblocks, mosekblocksizes) );
993 MOSEK_CALLM( MSK_appendvars(sdpisolver->msktask, nlpvars + sdpisolver->nvarbounds) );
996 for (v = 0; v < nlpvars + sdpisolver->nvarbounds; v++)
998 MOSEK_CALL( MSK_putvarbound(sdpisolver->msktask, v, MSK_BK_LO, 0.0, (
double) MSK_DPAR_DATA_TOL_BOUND_INF) );
1002 MOSEK_CALLM( MSK_appendcons(sdpisolver->msktask, (penaltyparam < sdpisolver->epsilon) ? sdpisolver->nactivevars : sdpisolver->nactivevars + 1) );
1007 if ( sdpconstnnonz > 0 )
1009 for (b = 0; b < nsdpblocks; b++)
1011 if ( blockindchanges[b] > -1 )
1014 if ( nremovedinds[b] > 0 )
1016 int* moseksdpconstrow;
1017 int* moseksdpconstcol;
1019 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow, sdpconstnblocknonz[b]) );
1020 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol, sdpconstnblocknonz[b]) );
1022 for (k = 0; k < sdpconstnblocknonz[b]; k++)
1025 assert( -1 < indchanges[b][sdpconstrow[b][k]] && indchanges[b][sdpconstrow[b][k]] <= sdpconstrow[b][k] );
1026 assert( -1 < indchanges[b][sdpconstcol[b][k]] && indchanges[b][sdpconstcol[b][k]] <= sdpconstcol[b][k] );
1028 assert( 0 <= sdpconstrow[b][k] && sdpconstrow[b][k] <= sdpblocksizes[b] );
1029 assert( 0 <= sdpconstcol[b][k] && sdpconstcol[b][k] <= sdpblocksizes[b] );
1031 moseksdpconstrow[k] = sdpconstrow[b][k] - indchanges[b][sdpconstrow[b][k]];
1032 moseksdpconstcol[k] = sdpconstcol[b][k] - indchanges[b][sdpconstcol[b][k]];
1034 #if CONVERT_ABSOLUTE_TOLERANCES 1036 if ( REALABS(sdpconstval[b][k]) > maxrhscoef )
1037 maxrhscoef = REALABS(sdpconstval[b][k]);
1041 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
1042 moseksdpconstrow, moseksdpconstcol, sdpconstval[b], &mosekindex) );
1044 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstcol);
1045 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksdpconstrow);
1049 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], sdpconstnblocknonz[b],
1050 sdpconstrow[b], sdpconstcol[b], sdpconstval[b], &mosekindex) );
1052 MOSEK_CALL( MSK_putbarcj(sdpisolver->msktask, i, 1, &mosekindex, &one) );
1062 for (i = 0; i < nlpcons; i++)
1067 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, ind, lplhs[i]) );
1068 #ifdef SCIP_MORE_DEBUG 1070 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"lhs#%d", i);
1071 MOSEK_CALL( MSK_putvarname(sdpisolver->msktask, ind, name) );
1079 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, ind, - lprhs[i]) );
1080 #ifdef SCIP_MORE_DEBUG 1082 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"rhs#%d", i - 1);
1083 MOSEK_CALL( MSK_putvarname(sdpisolver->msktask, ind, name) );
1088 assert( ind == nlpvars );
1091 for (i = 0; i < sdpisolver->nvarbounds; i++)
1093 MOSEK_CALL( MSK_putcj(sdpisolver->msktask, nlpvars + i, mosekvarbounds[i]) );
1101 #if CONVERT_ABSOLUTE_TOLERANCES 1102 if ( REALABS(mosekvarbounds[i]) > maxrhscoef )
1103 maxrhscoef = REALABS(mosekvarbounds[i]);
1107 #ifdef SCIP_MORE_DEBUG 1108 if ( sdpisolver->varboundpos[i] < 0 )
1111 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"lb#%d", sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] - 1]);
1112 MOSEK_CALL( MSK_putvarname(sdpisolver->msktask, nlpvars + i, name) );
1116 assert( sdpisolver->varboundpos[i] > 0 );
1118 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"ub#%d", sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]);
1119 MOSEK_CALL( MSK_putvarname(sdpisolver->msktask, nlpvars + i, name) );
1125 MOSEK_CALL( MSK_putobjsense(sdpisolver->msktask, MSK_OBJECTIVE_SENSE_MAXIMIZE) );
1130 for (b = 0; b < nsdpblocks; b++)
1132 if ( blockindchanges[b] > -1 )
1135 if ( nremovedinds[b] > 0 )
1137 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, sdpnnonz) );
1138 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekcol, sdpnnonz) );
1146 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
1148 v = sdpisolver->inputtomosekmapper[sdpvar[b][blockvar]];
1153 assert( v < sdpisolver->nactivevars );
1156 if ( nremovedinds[b] > 0 )
1158 assert( sdpnblockvarnonz[b][blockvar] <= sdpnnonz );
1159 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
1162 assert( 0 <= indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
1163 assert( 0 <= indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
1165 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
1166 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
1168 mosekrow[k] = sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]];
1169 mosekcol[k] = sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]];
1171 assert( k == sdpnblockvarnonz[b][blockvar] );
1173 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) k,
1174 mosekrow, mosekcol, sdpval[b][blockvar], &mosekindex) );
1178 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) sdpnblockvarnonz[b][blockvar],
1179 sdprow[b][blockvar], sdpcol[b][blockvar], sdpval[b][blockvar], &mosekindex) );
1182 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, v, b - blockindchanges[b], (
long long) 1, &mosekindex, &one) );
1185 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekcol);
1186 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekrow);
1191 if ( penaltyparam >= sdpisolver->epsilon )
1193 int* identityindices;
1194 SCIP_Real* identityvalues;
1196 for (b = 0; b < nsdpblocks; b++)
1198 if ( blockindchanges[b] > -1 )
1200 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityindices, mosekblocksizes[b - blockindchanges[b]]) );
1201 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &identityvalues, mosekblocksizes[b - blockindchanges[b]]) );
1203 for (i = 0; i < mosekblocksizes[b - blockindchanges[b]]; i++)
1205 identityindices[i] = i;
1206 identityvalues[i] = 1.0;
1208 MOSEK_CALL( MSK_appendsparsesymmat(sdpisolver->msktask, mosekblocksizes[b - blockindchanges[b]], (
long long) mosekblocksizes[b - blockindchanges[b]],
1209 identityindices, identityindices, identityvalues, &mosekindex) );
1210 MOSEK_CALL( MSK_putbaraij(sdpisolver->msktask, sdpisolver->nactivevars, b - blockindchanges[b], (
long long) 1, &mosekindex, &one) );
1212 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityvalues);
1213 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &identityindices);
1224 if ( penaltyparam < sdpisolver->epsilon )
1226 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz) );
1227 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz) );
1232 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekrow, lpnnonz + 1) );
1233 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &mosekval, lpnnonz + 1) );
1236 currentrow = lprow[0];
1238 for (nnonz = 0; nnonz < lpnnonz; ++nnonz)
1240 assert( nnonz == 0 || lprow[nnonz-1] <= lprow[nnonz] );
1242 v = sdpisolver->inputtomosekmapper[lpcol[nnonz]];
1245 mosekrow[mosekind] = v;
1246 mosekval[mosekind++] = lpval[nnonz];
1250 if ( nnonz == lpnnonz - 1 || lprow[nnonz + 1] > currentrow )
1253 assert( mosekind >= 2 );
1256 if ( penaltyparam >= sdpisolver->epsilon )
1258 mosekrow[mosekind] = sdpisolver->nactivevars;
1259 mosekval[mosekind++] = 1.0;
1261 assert( mosekind <= lpnnonz + 1 );
1266 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, varcnt++, mosekind, mosekrow, mosekval) );
1273 for (j = 0; j < (penaltyparam < sdpisolver->epsilon ? mosekind : mosekind - 1); j++)
1274 mosekval[j] *= -1.0;
1276 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, varcnt++, mosekind, mosekrow, mosekval) );
1281 if ( nnonz < lpnnonz - 1 )
1282 currentrow = lprow[nnonz+1];
1285 assert( varcnt == nlpvars );
1287 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekval);
1288 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &mosekrow);
1292 for (i = 0; i < sdpisolver->nvarbounds; i++)
1294 if ( sdpisolver->varboundpos[i] < 0 )
1297 row = - sdpisolver->varboundpos[i] - 1;
1303 assert( sdpisolver->varboundpos[i] > 0 );
1304 row = sdpisolver->varboundpos[i] - 1;
1307 MOSEK_CALL( MSK_putacol(sdpisolver->msktask, nlpvars + i, 1, &row, &val) );
1311 if ( sdpisolver->scaleobj )
1313 if ( REALABS(maxabsobjcoef) > 1.0 )
1316 sdpisolver->objscalefactor = maxabsobjcoef;
1317 SCIPdebugMessage(
"Scaling objective by %g.\n", 1.0 / sdpisolver->objscalefactor);
1318 maxabsobjcoef = 1.0;
1322 assert( sdpisolver->objscalefactor == 1.0 );
1325 for (i = 0; i < sdpisolver->nactivevars; i++)
1331 objcoef = sdpisolver->objcoefs[i];
1332 assert( objcoef == obj[sdpisolver->mosektoinputmapper[i]] );
1333 objcoef /= sdpisolver->objscalefactor;
1334 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, objcoef, objcoef) );
1338 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, i, MSK_BK_FX, 0.0, 0.0) );
1341 #ifdef SCIP_MORE_DEBUG 1343 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"var#%d", sdpisolver->mosektoinputmapper[i]);
1344 MOSEK_CALL( MSK_putconname(sdpisolver->msktask, i, name) );
1349 if ( penaltyparam >= sdpisolver->epsilon )
1353 p = penaltyparam / sdpisolver->objscalefactor;
1356 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_UP, (
double) - MSK_DPAR_DATA_TOL_BOUND_INF, p) );
1360 MOSEK_CALL( MSK_putconbound(sdpisolver->msktask, sdpisolver->nactivevars, MSK_BK_FX, p, p) );
1362 #ifdef SCIP_MORE_DEBUG 1364 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"penalty");
1365 MOSEK_CALL( MSK_putconname(sdpisolver->msktask, i, name) );
1369 solvertimelimit = timelimit;
1373 if ( solvertimelimit <= 0.0 )
1375 sdpisolver->timelimit = TRUE;
1376 sdpisolver->solved = FALSE;
1386 #if CONVERT_ABSOLUTE_TOLERANCES 1387 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_PFEAS, sdpisolver->gaptol) );
1388 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol / (1.0 + maxrhscoef)) );
1389 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol / (1.0 + maxrhscoef)) );
1390 SCIPdebugMessage(
"Setting relative feasibility tolerance for MOSEK to %.10g / %g = %.12g\n", sdpisolver->sdpsolverfeastol,
1391 1.0 + maxrhscoef, sdpisolver->sdpsolverfeastol / (1.0 + maxrhscoef));
1393 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_PFEAS, sdpisolver->gaptol) );
1394 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, sdpisolver->sdpsolverfeastol) );
1395 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, sdpisolver->sdpsolverfeastol) );
1397 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_MU_RED, sdpisolver->gaptol) );
1398 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, sdpisolver->gaptol) );
1402 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_OPTIMIZER_MAX_TIME, solvertimelimit) );
1408 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_UPPER_OBJ_CUT, sdpisolver->objlimit / sdpisolver->objscalefactor) );
1412 if ( sdpisolver->usepresolving )
1414 SCIPdebugMessage(
"Turning presolving on.\n");
1415 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_PRESOLVE_USE, MSK_PRESOLVE_MODE_ON) );
1419 SCIPdebugMessage(
"Turning presolving off.\n");
1420 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_PRESOLVE_USE, MSK_PRESOLVE_MODE_OFF) );
1424 if ( sdpisolver->usescaling )
1426 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_INTPNT_SCALING, MSK_SCALING_FREE) );
1430 MOSEK_CALL( MSK_putintparam(sdpisolver->msktask, MSK_IPAR_INTPNT_SCALING, MSK_SCALING_NONE) );
1434 #ifdef SCIP_MORE_DEBUG 1435 #if MSK_VERSION_MAJOR < 9 1441 MOSEK_CALL( MSK_getnumcon(sdpisolver->msktask, &nmosekconss) );
1442 MOSEK_CALL( MSK_getnumvar(sdpisolver->msktask, &nmosekvars) );
1443 MOSEK_CALL( MSK_getnumcone(sdpisolver->msktask, &nmosekcones) );
1445 MOSEK_CALL( MSK_printdata(sdpisolver->msktask, MSK_STREAM_LOG, 0, nmosekconss, 0, nmosekvars, 0, nmosekcones, 1, 1, 1, 1, 1, 1, 1, 1) );
1448 #ifdef SCIP_PRINT_PARAMETERS 1449 MOSEK_CALL( MSK_printparam(sdpisolver->msktask) );
1454 #ifdef SCIP_DEBUG_PRINTTOFILE 1459 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1460 MOSEK_CALL( MSK_getdouinf(sdpisolver->msktask, MSK_DINF_OPTIMIZER_TIME, &sdpisolver->opttime) );
1461 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &sdpisolver->solstat) );
1463 if ( sdpisolver->sdpinfo )
1465 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1466 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1469 SCIPdebugMessage(
"Solved problem using MOSEK, return code %d.\n", sdpisolver->terminationcode);
1471 sdpisolver->solved = TRUE;
1474 ++sdpisolver->nsdpcalls;
1475 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &(sdpisolver->niterations)) );
1478 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL || (sdpisolver->solstat == MSK_SOL_STA_UNKNOWN && sdpisolver->terminationcode != MSK_RES_TRM_MAX_TIME) )
1483 SCIP_Real pviolbarvar;
1487 SCIP_Real dviolbarvar;
1489 MOSEK_CALL( MSK_getsolutioninfo(sdpisolver->msktask, MSK_SOL_ITR, &pobj, &pviolcon, &pviolvar, &pviolbarvar, NULL, NULL,
1490 &dobj, &dviolcon, &dviolvar, &dviolbarvar, NULL) );
1492 SCIPdebugMessage(
"Absolute primal violations: constraints: %g, variables: %g, SDP: %g.\n", pviolcon, pviolvar, pviolbarvar);
1493 SCIPdebugMessage(
"Absolute dual violations: constraints: %g, variables: %g, SDP: %g.\n", dviolcon, dviolvar, dviolbarvar);
1494 if ( pviolcon <= sdpisolver->feastol && pviolvar <= sdpisolver->feastol && pviolbarvar <= sdpisolver->feastol
1495 && dviolcon <= sdpisolver->feastol && dviolvar <= sdpisolver->feastol && dviolbarvar <= sdpisolver->feastol )
1497 if ( REALABS(dobj - pobj) <= sdpisolver->gaptol )
1499 sdpisolver->terminationcode = MSK_RES_OK;
1500 sdpisolver->solstat = MSK_SOL_STA_OPTIMAL;
1501 SCIPdebugMessage(
"Detected stalling - repairing termination code and solution status to 'optimal'.\n");
1508 #if CONVERT_ABSOLUTE_TOLERANCES 1509 feastol = sdpisolver->sdpsolverfeastol / (1 + maxrhscoef);
1511 feastol = sdpisolver->sdpsolverfeastol;
1513 gaptol = sdpisolver->gaptol;
1517 SCIP_Real* solvector;
1518 SCIP_Bool infeasible;
1519 SCIP_Bool solveagain = FALSE;
1525 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1526 nvarspointer = nvars;
1528 assert( nvarspointer == nvars );
1531 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1532 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1533 indchanges, nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
1534 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1535 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1537 #if CHECKVIOLATIONS == 1 1552 SCIP_Real* solvectorprimal;
1553 SCIP_Real** solmatrices;
1554 SCIP_Real maxabsviolbndsd;
1555 SCIP_Real sumabsviolbndsd;
1556 SCIP_Real maxabsviolconsd;
1557 SCIP_Real sumabsviolconsd;
1558 SCIP_Real maxabsviolsdpd;
1559 SCIP_Real sumabsviolsdpd;
1560 SCIP_Real maxabsviolbndsp;
1561 SCIP_Real sumabsviolbndsp;
1562 SCIP_Real maxabsviolconsp;
1563 SCIP_Real sumabsviolconsp;
1564 SCIP_Real maxabsviolsdpp;
1565 SCIP_Real sumabsviolsdpp;
1566 SCIP_Bool checkinfeas;
1570 SCIP_Real pviolbarvar;
1574 SCIP_Real dviolbarvar;
1576 int nprimalmatrixvars;
1580 MOSEK_CALL( MSK_getsolutioninfo(sdpisolver->msktask, MSK_SOL_ITR, &pobj, &pviolcon, &pviolvar, &pviolbarvar, NULL, NULL,
1581 &dobj, &dviolcon, &dviolvar, &dviolbarvar, NULL) );
1583 nprimalvars = nlpvars + sdpisolver->nvarbounds;
1584 nprimalmatrixvars = nsdpblocks - nremovedblocks;
1587 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvectorprimal, nprimalvars) );
1588 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solmatrices, nprimalmatrixvars) );
1589 for (i = 0; i < nprimalmatrixvars; i++)
1591 blocksize = mosekblocksizes[i];
1592 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solmatrices[i], blocksize) );
1595 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, solvectorprimal) );
1596 for (i = 0; i < nprimalmatrixvars; i++)
1597 MOSEK_CALL( MSK_getbarxj(sdpisolver->msktask, MSK_SOL_ITR, i, solmatrices[i]) );
1599 #ifdef SCIP_PRINT_SOLU 1601 SCIPdebugMessage(
"Dual solution reported from MOSEK transformed to our problem:\n");
1602 for (i = 0; i < nvars; i++)
1603 SCIPdebugMessage(
"y[%d] = %.15g\n", i, solvector[i]);
1605 SCIPdebugMessage(
"Primal solution reported from MOSEK:\n");
1606 for (i = 0; i < nprimalvars; i++)
1607 SCIPdebugMessage(
"x[%d] = %.15g\n", i, solvectorprimal[i]);
1609 for (i = 0; i < nprimalmatrixvars; i++)
1611 blocksize = mosekblocksizes[i];
1612 for (j = 0; j < blocksize * (blocksize + 1) / 2; j++)
1613 SCIPdebugMessage(
"X_%d[%d] = %.15g\n", i, j, solmatrices[i][j]);
1619 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1620 indchanges, nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
1621 solvector, sdpisolver->feastol, sdpisolver->epsilon, &maxabsviolbndsd, &sumabsviolbndsd, &maxabsviolconsd, &sumabsviolconsd,
1622 &maxabsviolsdpd, &sumabsviolsdpd, &checkinfeas) );
1624 assert( infeasible );
1627 sdpblocksizes, sdpnblockvars, sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz,
1628 sdpvar, sdprow, sdpcol, sdpval, indchanges, nremovedinds, blockindchanges, nremovedblocks, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol,
1629 lpval, solvectorprimal, solmatrices, sdpisolver->feastol, sdpisolver->epsilon, &maxabsviolbndsp, &sumabsviolbndsp, &maxabsviolconsp,
1630 &sumabsviolconsp, &maxabsviolsdpp, &sumabsviolsdpp, &checkinfeas) );
1632 assert( infeasible );
1635 SCIPdebugMessage(
"Maximal violations for the dual problem: vars: %g (Mosek), %g (SCIP-SDP); cons: %g (Mosek), %g (SCIP-SDP); SDP: %g (Mosek), %g (SCIP-SDP)\n",
1636 dviolcon, maxabsviolbndsd, dviolvar, maxabsviolconsd, dviolbarvar, maxabsviolsdpd);
1637 SCIPdebugMessage(
"Maximal violations for the primal problem: vars: %g (Mosek), %g (SCIP-SDP); cons: %g (Mosek), %g (SCIP-SDP); SDP: %g (Mosek), %g (SCIP-SDP)\n",
1638 pviolvar, maxabsviolbndsp, pviolcon, maxabsviolconsp, pviolbarvar, maxabsviolsdpp);
1639 SCIPdebugMessage(
"Sum of violations for the dual problem: vars: %g (SCIP-SDP); cons: %g (SCIP-SDP); SDP: %g (SCIP-SDP)\n",
1640 sumabsviolbndsd, sumabsviolconsd, sumabsviolsdpd);
1641 SCIPdebugMessage(
"Sum of violations for the primal problem: vars: %g (SCIP-SDP); cons: %g (SCIP-SDP); SDP: %g (SCIP-SDP)\n",
1642 sumabsviolbndsp, sumabsviolconsp, sumabsviolsdpp);
1644 for (i = 0; i < nprimalmatrixvars; i++)
1645 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solmatrices[i]);
1646 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solmatrices);
1647 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvectorprimal);
1648 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1657 SCIPdebugMessage(
"Solution feasible for Mosek but outside feasibility tolerance, changing Mosek feasibility tolerance to %g.\n", feastol);
1658 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_DFEAS, feastol) );
1659 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_INTPNT_CO_TOL_INFEAS, feastol) );
1667 solvertimelimit = timelimit;
1671 if ( solvertimelimit <= 0.0 )
1673 sdpisolver->timelimit = TRUE;
1674 sdpisolver->solved = FALSE;
1680 MOSEK_CALL( MSK_putdouparam(sdpisolver->msktask, MSK_DPAR_OPTIMIZER_MAX_TIME, solvertimelimit) );
1684 MOSEK_CALL( MSK_optimizetrm(sdpisolver->msktask, &(sdpisolver->terminationcode)) );
1685 MOSEK_CALL( MSK_getsolsta(sdpisolver->msktask, MSK_SOL_ITR, &sdpisolver->solstat) );
1686 MOSEK_CALL( MSK_getdouinf(sdpisolver->msktask, MSK_DINF_OPTIMIZER_TIME, &opttime) );
1687 sdpisolver->opttime += opttime;
1689 if ( sdpisolver->sdpinfo )
1691 MOSEK_CALL( MSK_optimizersummary(sdpisolver->msktask, MSK_STREAM_LOG) );
1692 MOSEK_CALL( MSK_analyzesolution(sdpisolver->msktask, MSK_STREAM_LOG, MSK_SOL_ITR) );
1696 ++sdpisolver->nsdpcalls;
1697 MOSEK_CALL( MSK_getnaintinf(sdpisolver->msktask,
"MSK_IINF_INTPNT_ITER", &newiterations) );
1698 sdpisolver->niterations += newiterations;
1701 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL || sdpisolver->solstat == MSK_SOL_STA_UNKNOWN )
1706 SCIP_Real pviolbarvar;
1710 SCIP_Real dviolbarvar;
1712 MOSEK_CALL( MSK_getsolutioninfo(sdpisolver->msktask, MSK_SOL_ITR, &pobj, &pviolcon, &pviolvar, &pviolbarvar, NULL, NULL,
1713 &dobj, &dviolcon, &dviolvar, &dviolbarvar, NULL) );
1715 SCIPdebugMessage(
"Absolute primal violations: constraints: %g, variables: %g, SDP: %g.\n", pviolcon, pviolvar, pviolbarvar);
1716 SCIPdebugMessage(
"Absolute dual violations: constraints: %g, variables: %g, SDP: %g.\n", dviolcon, dviolvar, dviolbarvar);
1717 if ( pviolcon <= sdpisolver->feastol && pviolvar <= sdpisolver->feastol && pviolbarvar <= sdpisolver->feastol
1718 && dviolcon <= sdpisolver->feastol && dviolvar <= sdpisolver->feastol && dviolbarvar <= sdpisolver->feastol )
1720 if ( REALABS(dobj - pobj) <= sdpisolver->gaptol )
1722 sdpisolver->terminationcode = MSK_RES_OK;
1723 sdpisolver->solstat = MSK_SOL_STA_OPTIMAL;
1724 SCIPdebugMessage(
"Detected stalling - repairing termination code and solution status to 'optimal'.\n");
1734 sdpisolver->solved = FALSE;
1735 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"MOSEK failed to reach required feasibility tolerance (feastol: %g, gaptol: %g)!\n", feastol, gaptol);
1741 if ( sdpisolver->solved )
1745 if ( penaltyparam >= sdpisolver->epsilon && (sdpisolver->solstat == MSK_SOL_STA_PRIM_INFEAS_CER) )
1747 assert( feasorig != NULL );
1749 SCIPdebugMessage(
"Penalty Problem unbounded!\n");
1751 else if ( penaltyparam >= sdpisolver->epsilon && ( ! sdpisolver->timelimit ) && ( sdpisolver->terminationcode != MSK_RES_TRM_MAX_TIME ) )
1753 SCIP_Real* moseksol;
1754 SCIP_Real trace = 0.0;
1757 assert( feasorig != NULL );
1760 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->nactivevars + 1);
1762 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
1764 *feasorig = (moseksol[sdpisolver->nactivevars] < sdpisolver->feastol);
1769 sdpisolver->feasorig = *feasorig;
1772 if ( ! *feasorig && penaltybound != NULL )
1774 SCIPdebugMessage(
"Solution not feasible in original problem, r = %g.\n", moseksol[sdpisolver->nactivevars]);
1779 for (b = 0; b < nsdpblocks; b++)
1781 if ( blockindchanges[b] > -1 )
1786 size = sdpblocksizes[b] - nremovedinds[b];
1788 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &X, size * (size + 1) / 2) );
1789 MOSEK_CALL( MSK_getbarxj(sdpisolver->msktask, MSK_SOL_ITR, b - blockindchanges[b], X) );
1792 for (i = 0; i < size; i++)
1795 ind = i * (i + 3) / 2;
1796 assert( ind < size * (size + 1) / 2 );
1800 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &X);
1805 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &x, nlpvars + sdpisolver->nvarbounds) );
1807 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, x) );
1809 for (i = 0; i < nlpvars; i++)
1812 BMSfreeBufferMemoryArrayNull(sdpisolver->bufmem, &x);
1817 assert( penaltybound != NULL );
1818 *penaltybound = TRUE;
1819 SCIPdebugMessage(
"Tr(X) = %g == %g = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible.\n",
1820 trace, penaltyparam);
1823 *penaltybound = FALSE;
1825 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
1831 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekblocksizes);
1832 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &mosekvarbounds);
1853 assert( sdpisolver != NULL );
1855 return sdpisolver->solved;
1868 assert( sdpisolver != NULL );
1871 switch ( sdpisolver->solstat )
1873 case MSK_SOL_STA_UNKNOWN:
1874 case MSK_SOL_STA_PRIM_FEAS:
1875 case MSK_SOL_STA_DUAL_FEAS:
1877 case MSK_SOL_STA_OPTIMAL:
1878 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1879 case MSK_SOL_STA_PRIM_INFEAS_CER:
1880 case MSK_SOL_STA_DUAL_INFEAS_CER:
1883 SCIPdebugMessage(
"Unknown return code in SCIPsdpiSolverFeasibilityKnown\n");
1891 SCIP_Bool* primalfeasible,
1892 SCIP_Bool* dualfeasible
1895 assert( sdpisolver != NULL );
1896 assert( primalfeasible != NULL );
1897 assert( dualfeasible != NULL );
1900 switch ( sdpisolver->solstat )
1902 case MSK_SOL_STA_OPTIMAL:
1903 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1904 *primalfeasible = TRUE;
1905 *dualfeasible = TRUE;
1907 case MSK_SOL_STA_PRIM_INFEAS_CER:
1908 *primalfeasible = FALSE;
1909 *dualfeasible = FALSE;
1911 case MSK_SOL_STA_DUAL_INFEAS_CER:
1912 *primalfeasible = FALSE;
1913 *dualfeasible = FALSE;
1916 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1917 return SCIP_LPERROR;
1930 assert( sdpisolver != NULL );
1933 switch ( sdpisolver->solstat )
1935 case MSK_SOL_STA_DUAL_INFEAS_CER:
1936 case MSK_SOL_STA_OPTIMAL:
1937 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1938 case MSK_SOL_STA_PRIM_INFEAS_CER:
1941 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1954 assert( sdpisolver != NULL );
1957 switch ( sdpisolver->solstat )
1959 case MSK_SOL_STA_PRIM_INFEAS_CER:
1961 case MSK_SOL_STA_OPTIMAL:
1962 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1963 case MSK_SOL_STA_DUAL_INFEAS_CER:
1966 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
1979 assert( sdpisolver != NULL );
1982 switch ( sdpisolver->solstat )
1984 case MSK_SOL_STA_OPTIMAL:
1985 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
1987 case MSK_SOL_STA_DUAL_INFEAS_CER:
1988 case MSK_SOL_STA_PRIM_INFEAS_CER:
1991 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
2004 assert( sdpisolver != NULL );
2007 switch ( sdpisolver->solstat )
2009 case MSK_SOL_STA_PRIM_INFEAS_CER:
2010 case MSK_SOL_STA_OPTIMAL:
2011 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
2012 case MSK_SOL_STA_DUAL_INFEAS_CER:
2015 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
2028 assert( sdpisolver != NULL );
2031 switch ( sdpisolver->solstat )
2033 case MSK_SOL_STA_DUAL_INFEAS_CER:
2035 case MSK_SOL_STA_OPTIMAL:
2036 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
2037 case MSK_SOL_STA_PRIM_INFEAS_CER:
2040 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
2053 assert( sdpisolver != NULL );
2056 switch ( sdpisolver->solstat )
2058 case MSK_SOL_STA_OPTIMAL:
2059 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
2061 case MSK_SOL_STA_PRIM_INFEAS_CER:
2062 case MSK_SOL_STA_DUAL_INFEAS_CER:
2065 SCIPdebugMessage(
"MOSEK does not know about feasibility of solutions\n");
2076 assert( sdpisolver != NULL );
2078 if ( sdpisolver->timelimit )
2084 if ( sdpisolver->terminationcode == MSK_RES_TRM_STALL )
2088 SCIP_Real gapnormalization;
2091 switch ( sdpisolver->solstat )
2093 case MSK_SOL_STA_UNKNOWN:
2094 case MSK_SOL_STA_PRIM_FEAS:
2095 case MSK_SOL_STA_DUAL_FEAS:
2097 case MSK_SOL_STA_OPTIMAL:
2098 case MSK_SOL_STA_PRIM_AND_DUAL_FEAS:
2099 case MSK_SOL_STA_PRIM_INFEAS_CER:
2100 case MSK_SOL_STA_DUAL_INFEAS_CER:
2102 MOSEK_CALL_BOOL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, &dobj) );
2103 MOSEK_CALL_BOOL( MSK_getprimalobj(sdpisolver->msktask, MSK_SOL_ITR, &pobj) );
2105 gapnormalization = dobj > pobj ? (pobj > 1.0 ? pobj : 1.0) : (dobj > 1.0 ? dobj : 1.0);
2106 if ( REALABS((pobj-dobj) / gapnormalization) < sdpisolver->gaptol )
2115 return sdpisolver->terminationcode == MSK_RES_OK;
2123 assert( sdpisolver != NULL );
2126 return sdpisolver->terminationcode == MSK_RES_TRM_OBJECTIVE_RANGE;
2134 assert( sdpisolver != NULL );
2137 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_ITERATIONS;
2145 assert( sdpisolver != NULL );
2147 if ( sdpisolver->timelimit )
2150 if ( ! sdpisolver->solved )
2153 return sdpisolver->terminationcode == MSK_RES_TRM_MAX_TIME;
2171 assert( sdpisolver != NULL );
2173 if ( ! sdpisolver->solved )
2176 if ( sdpisolver->timelimit )
2179 switch ( sdpisolver->terminationcode )
2183 case MSK_RES_TRM_MAX_NUM_SETBACKS:
2184 case MSK_RES_TRM_NUMERICAL_PROBLEM:
2185 case MSK_RES_TRM_STALL:
2187 case MSK_RES_TRM_OBJECTIVE_RANGE:
2189 case MSK_RES_TRM_MAX_ITERATIONS:
2191 case MSK_RES_TRM_MAX_TIME:
2203 assert( sdpisolver != NULL );
2205 if ( sdpisolver->timelimit )
2210 if ( sdpisolver->terminationcode != MSK_RES_OK )
2213 if ( sdpisolver->solstat != MSK_SOL_STA_OPTIMAL )
2226 assert( sdpisolver != NULL );
2228 if ( sdpisolver->timelimit )
2231 if ( ! sdpisolver->solved )
2243 SCIPdebugMessage(
"Not implemented yet\n");
2244 return SCIP_LPERROR;
2253 SCIP_Real* moseksol;
2255 assert( sdpisolver != NULL );
2257 assert( objval != NULL );
2266 if ( sdpisolver->penalty && ! sdpisolver->feasorig )
2270 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2273 *objval *= sdpisolver->objscalefactor;
2281 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2282 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2285 for (v = 0; v < sdpisolver->nactivevars; v++)
2286 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2288 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2292 *objval += sdpisolver->fixedvarsobjcontr;
2310 SCIP_Real* moseksol;
2312 assert( sdpisolver != NULL );
2314 assert( dualsollength != NULL );
2316 if ( *dualsollength > 0 )
2318 assert( dualsol != NULL );
2319 if ( *dualsollength < sdpisolver->nvars )
2321 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2322 *dualsollength = sdpisolver->nvars;
2327 BMSallocBufferMemoryArray(sdpisolver->bufmem, &moseksol, sdpisolver->penalty ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars);
2329 MOSEK_CALL( MSK_gety(sdpisolver->msktask, MSK_SOL_ITR, moseksol) );
2332 for (v = 0; v < sdpisolver->nvars; v++)
2334 if ( sdpisolver->inputtomosekmapper[v] >= 0 )
2335 dualsol[v] = moseksol[sdpisolver->inputtomosekmapper[v]];
2339 assert( -sdpisolver->inputtomosekmapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2340 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtomosekmapper[v]) - 1];
2345 if ( objval != NULL )
2347 if ( sdpisolver->penalty && ! sdpisolver->feasorig )
2351 MOSEK_CALL( MSK_getdualobj(sdpisolver->msktask, MSK_SOL_ITR, objval) );
2354 *objval *= sdpisolver->objscalefactor;
2361 for (v = 0; v < sdpisolver->nactivevars; v++)
2362 *objval += moseksol[v] * sdpisolver->objcoefs[v];
2366 *objval += sdpisolver->fixedvarsobjcontr;
2369 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &moseksol);
2371 else if ( objval != NULL )
2383 int* startXnblocknonz
2387 SCIPdebugMessage(
"Not implemented yet\n");
2389 return SCIP_PLUGINNOTFOUND;
2406 int* startXnblocknonz,
2410 SCIP_Real** startXval
2413 SCIPdebugMessage(
"Not implemented yet\n");
2414 return SCIP_LPERROR;
2432 SCIP_Real* primalvars;
2436 assert( sdpisolver != NULL );
2438 assert( arraylength != NULL );
2439 assert( lbvars != NULL );
2440 assert( ubvars != NULL );
2443 if ( *arraylength < sdpisolver->nvars )
2445 *arraylength = sdpisolver->nvars;
2446 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2451 for (i = 0; i < sdpisolver->nvars; i++)
2458 MOSEK_CALL( MSK_getnumvar(sdpisolver->msktask, &nprimalvars) );
2460 BMSallocBufferMemoryArray(sdpisolver->bufmem, &primalvars, nprimalvars);
2462 MOSEK_CALL( MSK_getxx(sdpisolver->msktask, MSK_SOL_ITR, primalvars) );
2465 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars );
2467 for (i = 0; i < sdpisolver->nvarbounds; i++)
2469 if ( sdpisolver->varboundpos[i] < 0 )
2474 lbvars[sdpisolver->mosektoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i] * sdpisolver->objscalefactor;
2479 assert( sdpisolver->varboundpos[i] > 0 );
2482 ubvars[sdpisolver->mosektoinputmapper[sdpisolver->varboundpos[i] - 1]] = primalvars[nprimalvars - sdpisolver->nvarbounds + i] * sdpisolver->objscalefactor;
2486 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &primalvars);
2495 int* startXnblocknonz
2498 SCIPdebugMessage(
"Not implemented yet\n");
2499 return SCIP_LPERROR;
2511 int* startXnblocknonz,
2515 SCIP_Real** startXval
2518 SCIPdebugMessage(
"Not implemented yet\n");
2519 return SCIP_LPERROR;
2527 SCIPdebugMessage(
"Not implemented yet\n");
2528 return SCIP_INVALID;
2537 assert( sdpisolver != NULL );
2538 assert( opttime != NULL );
2540 *opttime = sdpisolver->opttime;
2551 assert( sdpisolver != NULL );
2552 assert( iterations != NULL );
2554 *iterations = sdpisolver->niterations;
2565 assert( sdpisolver != NULL );
2566 assert( calls != NULL );
2568 *calls = sdpisolver->nsdpcalls;
2579 assert( sdpisolver != NULL );
2580 assert( usedsetting != NULL );
2584 else if ( sdpisolver->penalty )
2628 assert( sdpisolver != NULL );
2629 assert( dval != NULL );
2634 *dval = sdpisolver->epsilon;
2637 *dval = sdpisolver->gaptol;
2640 *dval = sdpisolver->feastol;
2643 *dval = sdpisolver->sdpsolverfeastol;
2646 *dval = sdpisolver->objlimit;
2649 return SCIP_PARAMETERUNKNOWN;
2662 assert( sdpisolver != NULL );
2667 sdpisolver->epsilon = dval;
2668 SCIPdebugMessage(
"Setting sdpisolver epsilon to %g.\n", dval);
2671 sdpisolver->gaptol = dval;
2672 SCIPdebugMessage(
"Setting sdpisolver gaptol to %g.\n", dval);
2675 sdpisolver->feastol = dval;
2676 SCIPdebugMessage(
"Setting sdpisolver feastol to %g.\n", dval);
2679 sdpisolver->sdpsolverfeastol = dval;
2680 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %g.\n", dval);
2683 SCIPdebugMessage(
"Setting sdpisolver objlimit to %g.\n", dval);
2684 sdpisolver->objlimit = dval;
2687 return SCIP_PARAMETERUNKNOWN;
2700 assert( sdpisolver != NULL );
2705 *ival = (int) sdpisolver->sdpinfo;
2706 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2709 *ival = sdpisolver->nthreads;
2710 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
2713 *ival = (int) sdpisolver->usepresolving;
2714 SCIPdebugMessage(
"Getting usepresolving (%d).\n", *ival);
2717 *ival = (int) sdpisolver->usescaling;
2718 SCIPdebugMessage(
"Getting usescaling (%d).\n", *ival);
2721 *ival = (int) sdpisolver->scaleobj;
2722 SCIPdebugMessage(
"Getting scaleobj (%d).\n", *ival);
2725 return SCIP_PARAMETERUNKNOWN;
2738 assert( sdpisolver != NULL );
2743 sdpisolver->nthreads = ival;
2744 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
2747 assert( 0 <= ival && ival <= 1 );
2748 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2749 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2752 assert( 0 <= ival && ival <= 1 );
2753 sdpisolver->usepresolving = (SCIP_Bool) ival;
2754 SCIPdebugMessage(
"Setting usepresolving (%d).\n", ival);
2757 assert( 0 <= ival && ival <= 1 );
2758 sdpisolver->usescaling = (SCIP_Bool) ival;
2759 SCIPdebugMessage(
"Setting usescaling (%d).\n", ival);
2762 assert( 0 <= ival && ival <= 1 );
2763 sdpisolver->scaleobj = (SCIP_Bool) ival;
2764 SCIPdebugMessage(
"Setting scaleobj (%d).\n", ival);
2767 return SCIP_PARAMETERUNKNOWN;
2779 SCIPdebugMessage(
"Lambdastar parameter not used by MOSEK");
2788 SCIP_Real* penaltyparam
2793 assert( sdpisolver != NULL );
2794 assert( penaltyparam != NULL );
2810 SCIPdebugMessage(
"Setting penaltyparameter to %g.\n", compval);
2811 *penaltyparam = compval;
2820 SCIP_Real penaltyparam,
2821 SCIP_Real* maxpenaltyparam
2826 assert( sdpisolver != NULL );
2827 assert( maxpenaltyparam != NULL );
2833 *maxpenaltyparam = compval;
2834 SCIPdebugMessage(
"Setting maximum penaltyparameter to %g.\n", compval);
2863 SCIPdebugMessage(
"Not implemented yet\n");
2864 return SCIP_LPERROR;
2873 assert( sdpisolver != NULL );
2874 assert( fname != NULL );
2876 MOSEK_CALL( MSK_writedata(sdpisolver->msktask, fname) );
SCIP_RETCODE SCIPsdpiSolverGetTime(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *opttime)
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)
SCIP_RETCODE SCIPsdpSolcheckerCheckAndGetViolDual(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Real *maxabsviolbnds, SCIP_Real *sumabsviolbnds, SCIP_Real *maxabsviolcons, SCIP_Real *sumabsviolcons, SCIP_Real *maxabsviolsdp, SCIP_Real *sumabsviolsdp, SCIP_Bool *infeasible)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpSolcheckerCheck(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
SCIP_RETCODE 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
static int calcGrowSize(int initsize, int num)
#define MOSEK_CALL_BOOL(x)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
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 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)
#define INFEASFEASTOLCHANGE
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_RETCODE SCIPsdpiSolverLoadAndSolveWithPenalty(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Bool withobj, SCIP_Bool rbound, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
checks a given SDP solution for feasibility
const char * SCIPsdpiSolverGetSolverDesc(void)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
static SCIP_RETCODE ensureMappingDataMemory(SCIP_SDPISOLVER *sdpisolver, int nvars)
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_RETCODE SCIPsdpiSolverLoadAndSolve(SCIP_SDPISOLVER *sdpisolver, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SDPIclockGetTime(SDPI_CLOCK *clck)
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)
methods for clocks and timing
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)
static void MSKAPI printstr(void *handler, MSKCONST char str[])
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)
char solvername[SCIP_MAXSTRLEN]
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_RETCODE SCIPsdpSolcheckerCheckAndGetViolPrimal(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int *inputtomosekmapper, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real **solmatrices, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Real *maxabsviolbnds, SCIP_Real *sumabsviolbnds, SCIP_Real *maxabsviolcons, SCIP_Real *sumabsviolcons, SCIP_Real *maxabsviolsdp, SCIP_Real *sumabsviolsdp, SCIP_Bool *infeasible)
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)