47 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
49 #pragma GCC diagnostic warning "-Wstrict-prototypes"
52 #include "blockmemshell/memory.h"
54 #include "scip/pub_misc.h"
56 #include "scip/pub_message.h"
61 #define PENALTYBOUNDTOL 1E-3
64 #define MIN_PENALTYPARAM 1e5
65 #define MAX_PENALTYPARAM 1e12
66 #define PENALTYPARAM_FACTOR 1e4
67 #define MAX_MAXPENALTYPARAM 1e15
68 #define MAXPENALTYPARAM_FACTOR 1e6
69 #define INFEASFEASTOLCHANGE 0.1
70 #define INFEASMINFEASTOL 1E-9
73 #define DSDP_CALL(x) do \
75 int _dsdperrorcode_; \
76 if ( (_dsdperrorcode_ = (x)) != 0 ) \
78 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \
79 return SCIP_LPERROR; \
85 #define DSDP_CALL_BOOL(x) do \
87 int _dsdperrorcode_; \
88 if ( (_dsdperrorcode_ = (x)) != 0 ) \
90 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \
97 #define DSDP_CALLM(x) do \
99 int _dsdperrorcode_; \
100 if ( (_dsdperrorcode_ = (x)) != 0 ) \
102 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \
103 return SCIP_NOMEMORY; \
109 #define BMS_CALL(x) do \
113 SCIPerrorMessage("No memory in function call.\n"); \
114 return SCIP_NOMEMORY; \
120 #define TIMEOFDAY_CALL(x) do \
123 if ( (_errorcode_ = (x)) != 0 ) \
125 SCIPerrorMessage("Error in gettimeofday! \n"); \
132 #define CHECK_IF_SOLVED(sdpisolver) do \
134 if (!(sdpisolver->solved)) \
136 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
137 return SCIP_LPERROR; \
143 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
145 if (!(sdpisolver->solved)) \
147 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
155 struct SCIP_SDPiSolver
157 SCIP_MESSAGEHDLR* messagehdlr;
166 int* inputtodsdpmapper;
169 int* dsdptoinputmapper;
170 SCIP_Real* fixedvarsval;
171 SCIP_Real fixedvarsobjcontr;
178 SCIP_Real sdpsolverfeastol;
179 SCIP_Real penaltyparam;
183 SCIP_Bool penaltyworbound;
188 SCIP_Bool timelimitinitial;
191 SCIP_Real* preoptimalsol;
192 SCIP_Bool preoptimalsolexists;
193 SCIP_Real preoptimalgap;
199 struct timeval starttime;
221 return i*(i+1)/2 + j;
233 assert( lb < ub + sdpisolver->feastol );
235 return (ub-lb <= sdpisolver->epsilon);
238 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
254 SCIPsortIntIntReal(col, row, val, length);
257 while (nextentry < length)
259 firstentry = nextentry;
261 while (nextentry < length && col[nextentry] == col[firstentry])
265 SCIPsortIntReal(row + firstentry, val + firstentry, nextentry - firstentry);
277 struct timeval currenttime;
278 SCIP_Real startseconds;
279 SCIP_Real currentseconds;
280 SCIP_Real elapsedtime;
282 assert( dsdp != NULL );
283 assert( ctx != NULL );
287 startseconds = (SCIP_Real) (timings->starttime).tv_sec + (SCIP_Real) (timings->starttime).tv_usec / 1e6;
290 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
292 elapsedtime = currentseconds - startseconds;
294 if ( elapsedtime > timings->timelimit )
296 DSDP_CALL( DSDPSetConvergenceFlag(dsdp, DSDP_USER_TERMINATION) );
297 timings->stopped = TRUE;
298 SCIPdebugMessage(
"Time limit reached! Stopping DSDP.\n");
323 DSDP_CALL( DSDPGetPPObjective(dsdp,&pobj) );
324 DSDP_CALL( DSDPGetDDObjective(dsdp,&dobj) );
325 DSDP_CALL( DSDPGetDualityGap(dsdp,&absgap) );
327 relgap = absgap / (1.0 + (REALABS(dobj)/2) + (REALABS(pobj)/2) );
336 SCIPdebugMessage(
"penalty variable %f, gap %f -> saving preoptimal solution\n", r, relgap);
364 return "Dual-Scaling Interior Point SDP-Solver by S. Benson, Y. Ye, and X. Zhang (http://www.mcs.anl.gov/hs/software/DSDP/)";
377 assert( sdpisolver != NULL );
378 return (
void*) sdpisolver->dsdp;
427 SCIP_MESSAGEHDLR* messagehdlr,
432 assert( sdpisolver != NULL );
433 assert( blkmem != NULL );
434 assert( bufmem != NULL );
436 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
438 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
440 (*sdpisolver)->messagehdlr = messagehdlr;
441 (*sdpisolver)->blkmem = blkmem;
442 (*sdpisolver)->bufmem = bufmem;
446 (*sdpisolver)->dsdp = NULL;
447 (*sdpisolver)->sdpcone = NULL;
448 (*sdpisolver)->lpcone = NULL;
449 (*sdpisolver)->bcone = NULL;
451 (*sdpisolver)->nvars = 0;
452 (*sdpisolver)->nactivevars = 0;
453 (*sdpisolver)->inputtodsdpmapper = NULL;
454 (*sdpisolver)->dsdptoinputmapper = NULL;
455 (*sdpisolver)->fixedvarsval = NULL;
456 (*sdpisolver)->fixedvarsobjcontr = 0.0;
457 (*sdpisolver)->objcoefs = NULL;
458 (*sdpisolver)->solved = FALSE;
459 (*sdpisolver)->timelimit = FALSE;
460 (*sdpisolver)->timelimitinitial = FALSE;
461 (*sdpisolver)->penalty = FALSE;
462 (*sdpisolver)->penaltyworbound = FALSE;
463 (*sdpisolver)->feasorig = FALSE;
464 (*sdpisolver)->sdpcounter = 0;
465 (*sdpisolver)->niterations = 0;
466 (*sdpisolver)->nsdpcalls = 0;
468 (*sdpisolver)->epsilon = 1e-9;
469 (*sdpisolver)->gaptol = 1e-4;
470 (*sdpisolver)->feastol = 1e-6;
471 (*sdpisolver)->sdpsolverfeastol = 1e-6;
472 (*sdpisolver)->penaltyparam = 1e5;
474 (*sdpisolver)->sdpinfo = FALSE;
476 (*sdpisolver)->preoptimalsolexists = FALSE;
477 (*sdpisolver)->preoptimalgap = -1.0;
487 assert( sdpisolver != NULL );
488 assert( *sdpisolver != NULL );
490 SCIPdebugMessage(
"Freeing SDPISolver\n");
492 if ( (*sdpisolver)->dsdp != NULL )
494 DSDP_CALL( DSDPDestroy((*sdpisolver)->dsdp) );
497 if ( (*sdpisolver)->nvars > 0 )
498 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtodsdpmapper, (*sdpisolver)->nvars);
500 if ( (*sdpisolver)->nactivevars > 0 )
502 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
503 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->dsdptoinputmapper, (*sdpisolver)->nactivevars);
504 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
507 if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
508 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
510 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
520 assert( sdpisolver != NULL );
522 sdpisolver->sdpcounter++;
532 assert( sdpisolver != NULL );
534 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
535 sdpisolver->sdpcounter = 0;
575 int* sdpconstnblocknonz,
579 SCIP_Real** sdpconstval,
581 int** sdpnblockvarnonz,
591 int* blockindchanges,
603 int* startZnblocknonz,
609 SCIP_Real** startZval,
611 int* startXnblocknonz,
617 SCIP_Real** startXval,
624 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, TRUE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars,
625 sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
626 indchanges, nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol,
627 lpval, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
628 timelimit, NULL, NULL);
655 SCIP_Real penaltyparam,
666 int* sdpconstnblocknonz,
670 SCIP_Real** sdpconstval,
672 int** sdpnblockvarnonz,
682 int* blockindchanges,
694 int* startZnblocknonz,
700 SCIP_Real** startZval,
702 int* startXnblocknonz,
708 SCIP_Real** startXval,
715 SCIP_Bool* penaltybound
719 int* dsdpconstind = NULL;
720 SCIP_Real* dsdpconstval = NULL;
722 SCIP_Real* dsdpval = NULL;
723 int* dsdplpbegcol = NULL;
724 int* dsdplprow = NULL;
725 SCIP_Real* dsdplpval = NULL;
739 DSDPTerminationReason reason;
742 assert( sdpisolver != NULL );
743 assert( penaltyparam > -1 * sdpisolver->epsilon );
744 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
746 assert( obj != NULL );
747 assert( lb != NULL );
748 assert( ub != NULL );
749 assert( nsdpblocks >= 0 );
750 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
751 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
752 assert( sdpconstnnonz >= 0 );
753 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
754 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
755 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
756 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
757 assert( sdpnnonz >= 0 );
758 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
759 assert( nsdpblocks == 0 || sdpvar != NULL );
760 assert( nsdpblocks == 0 || sdprow != NULL );
761 assert( nsdpblocks == 0 || sdpcol != NULL );
762 assert( nsdpblocks == 0 || sdpval != NULL );
763 assert( nsdpblocks == 0 || indchanges != NULL );
764 assert( nsdpblocks == 0 || nremovedinds != NULL );
765 assert( nsdpblocks == 0 || blockindchanges != NULL );
766 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
767 assert( nlpcons >= 0 );
768 assert( noldlpcons >= nlpcons );
769 assert( nlpcons == 0 || lplhs != NULL );
770 assert( nlpcons == 0 || lprhs != NULL );
771 assert( nlpcons == 0 || rownactivevars != NULL );
772 assert( lpnnonz >= 0 );
773 assert( nlpcons == 0 || lprow != NULL );
774 assert( nlpcons == 0 || lpcol != NULL );
775 assert( nlpcons == 0 || lpval != NULL );
777 sdpisolver->penalty = penaltyparam > sdpisolver->epsilon;
779 if ( timelimit <= 0.0 )
781 sdpisolver->timelimit = TRUE;
782 sdpisolver->timelimitinitial = TRUE;
783 sdpisolver->solved = FALSE;
787 sdpisolver->timelimitinitial = FALSE;
789 sdpisolver->feasorig = FALSE;
793 timings.timelimit = timelimit;
794 timings.stopped = FALSE;
798 if ( penaltyparam < sdpisolver->epsilon )
800 SCIPdebugMessage(
"Inserting Data into DSDP for SDP (%d) \n", ++sdpisolver->sdpcounter);
805 SCIPdebugMessage(
"Inserting Data again into DSDP for SDP (%d) \n", sdpisolver->sdpcounter);
811 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtodsdpmapper), sdpisolver->nvars, nvars) );
812 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), sdpisolver->nactivevars, nvars) );
813 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
814 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
816 sdpisolver->nvars = nvars;
817 oldnactivevars = sdpisolver->nactivevars;
818 sdpisolver->nactivevars = 0;
820 sdpisolver->niterations = 0;
821 sdpisolver->nsdpcalls = 0;
824 sdpisolver->fixedvarsobjcontr = 0.0;
825 for (i = 0; i < nvars; i++)
827 if (
isFixed(sdpisolver, lb[i], ub[i]) )
830 sdpisolver->inputtodsdpmapper[i] = -nfixedvars;
831 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
832 sdpisolver->fixedvarsval[nfixedvars - 1] = lb[i];
833 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in DSDP\n", i, lb[i], sdpisolver->sdpcounter);
837 sdpisolver->dsdptoinputmapper[sdpisolver->nactivevars] = i;
838 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
839 sdpisolver->nactivevars++;
840 sdpisolver->inputtodsdpmapper[i] = sdpisolver->nactivevars;
841 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in DSDP\n", i, sdpisolver->inputtodsdpmapper[i], sdpisolver->sdpcounter);
844 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
845 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
847 SCIPdebugMessage(
"Variable %d is the slack variable for the explicit penalty formulation\n", sdpisolver->nactivevars + 1);
852 sdpisolver->fixedvarsobjcontr = 0.0;
855 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
856 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
857 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), nvars, sdpisolver->nactivevars) );
860 if ( sdpisolver->nactivevars != oldnactivevars )
862 if ( oldnactivevars == 0 )
864 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
868 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
871 sdpisolver->preoptimalsolexists = FALSE;
875 if ( sdpisolver->dsdp != NULL )
877 DSDP_CALL( DSDPDestroy(sdpisolver->dsdp) );
881 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
883 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars + 1, &(sdpisolver->dsdp)) );
884 sdpisolver->penaltyworbound = TRUE;
888 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars, &(sdpisolver->dsdp)) );
889 sdpisolver->penaltyworbound = FALSE;
891 DSDP_CALLM( DSDPCreateSDPCone(sdpisolver->dsdp, nsdpblocks - nremovedblocks, &(sdpisolver->sdpcone)) );
892 DSDP_CALLM( DSDPCreateLPCone(sdpisolver->dsdp, &(sdpisolver->lpcone)) );
893 DSDP_CALLM( DSDPCreateBCone(sdpisolver->dsdp, &(sdpisolver->bcone)) );
895 #ifdef SCIP_MORE_DEBUG
896 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"setting objective values for SDP %d:\n", sdpisolver->sdpcounter);
899 for (i = 0; i < sdpisolver->nactivevars; i++)
904 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, -1.0 * obj[sdpisolver->dsdptoinputmapper[i]]) );
905 #ifdef SCIP_MORE_DEBUG
906 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"var %d (was var %d): %f, ", i+1, sdpisolver->dsdptoinputmapper[i], obj[sdpisolver->dsdptoinputmapper[i]]);
911 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, 0.0) );
917 DSDP_CALL( BConeSetLowerBound(sdpisolver->bcone, i+1, lb[sdpisolver->dsdptoinputmapper[i]]) );
923 DSDP_CALL(BConeSetUpperBound(sdpisolver->bcone, i+1, ub[sdpisolver->dsdptoinputmapper[i]]));
928 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
930 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, sdpisolver->nactivevars + 1, -1.0 * penaltyparam) );
931 #ifdef SCIP_MORE_DEBUG
932 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"slack variable r: %f, ", penaltyparam);
936 #ifdef SCIP_MORE_DEBUG
937 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
938 SCIPdebugMessage(
"ATTENTION: BConeView shows the WRONG sign for the lower bound!\n");
939 BConeView(sdpisolver->bcone);
943 for (block = 0; block < nsdpblocks; ++block)
946 if ( blockindchanges[block] > -1 )
949 DSDP_CALL( SDPConeSetBlockSize(sdpisolver->sdpcone, block- blockindchanges[block], sdpblocksizes[block] - nremovedinds[block]) );
967 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
970 for (block = 0; block < nsdpblocks; block++)
971 nrnonz += sdpblocksizes[block] - nremovedinds[block];
972 assert( nrnonz >= 0 );
975 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz) );
977 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz) );
982 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz) );
984 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz) );
989 for (block = 0; block < nsdpblocks; block++)
991 for (i = 0; i < sdpisolver->nactivevars; i++)
994 v = sdpisolver->dsdptoinputmapper[i];
998 for (k = 0; k < sdpnblockvars[block]; k++)
1000 if ( v == sdpvar[block][k] )
1009 if ( blockvar > -1 )
1011 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1014 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1017 dsdpind[ind] =
compLowerTriangPos(sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]],
1018 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]]);
1019 dsdpval[ind] = -1.0 * sdpval[block][blockvar][k];
1024 SCIPsortIntReal(dsdpind + startind, dsdpval + startind, sdpnblockvarnonz[block][blockvar]);
1026 assert( blockindchanges[block] > -1 );
1030 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], i + 1, sdpblocksizes[block] - nremovedinds[block],
1031 1.0, 0, dsdpind + startind,dsdpval + startind, sdpnblockvarnonz[block][blockvar]));
1036 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1040 for (block = 0; block < nsdpblocks; block++)
1042 if ( blockindchanges[block] > -1 )
1044 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1047 dsdpval[ind] = -1.0;
1050 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], sdpisolver->nactivevars + 1,
1051 sdpblocksizes[block] - nremovedinds[block], 1.0, 0, dsdpind + ind - (sdpblocksizes[block] - nremovedinds[block]) ,
1052 dsdpval + ind - (sdpblocksizes[block] - nremovedinds[block]), sdpblocksizes[block] - nremovedinds[block]) );
1055 assert( ind - startind == nrnonz );
1060 if ( sdpconstnnonz > 0 )
1062 assert( nsdpblocks > 0 );
1063 assert( sdpconstnblocknonz!= NULL );
1064 assert( sdpconstcol != NULL );
1065 assert( sdpconstrow != NULL );
1066 assert( sdpconstval != NULL );
1073 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz) );
1075 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz) );
1079 for (block = 0; block < nsdpblocks; block++)
1083 if ( sdpconstnblocknonz[block] > 0 )
1086 for (i = 0; i < sdpconstnblocknonz[block]; i++)
1089 assert( indchanges[block][sdpconstrow[block][i]] > -1 && indchanges[block][sdpconstcol[block][i]] > -1 );
1092 dsdpconstind[ind] =
compLowerTriangPos(sdpconstrow[block][i] - indchanges[block][sdpconstrow[block][i]],
1093 sdpconstcol[block][i] - indchanges[block][sdpconstcol[block][i]]);
1094 dsdpconstval[ind] = -1 * sdpconstval[block][i];
1099 SCIPsortIntReal(dsdpconstind + startind, dsdpconstval + startind, sdpconstnblocknonz[block]);
1101 assert( blockindchanges[block] > -1 );
1105 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], 0, sdpblocksizes[block] - nremovedinds[block],
1106 1.0, 0, dsdpconstind + startind, dsdpconstval + startind, ind - startind));
1111 #ifdef SCIP_MORE_DEBUG
1112 SDPConeView2(sdpisolver->sdpcone);
1124 assert( noldlpcons > 0 );
1125 assert( lprhs != NULL );
1126 assert( lpcol != NULL );
1127 assert( lprow != NULL );
1128 assert( lpval != NULL );
1131 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &rowmapper, 2*noldlpcons) );
1136 for (i = 0; i < noldlpcons; i++)
1138 if ( rownactivevars[i] >= 2 )
1142 rowmapper[2*i] = pos;
1146 rowmapper[2*i] = -1;
1150 rowmapper[2*i + 1] = pos;
1154 rowmapper[2*i + 1] = -1;
1160 rowmapper[2*i] = -1;
1161 rowmapper[2*i + 1] = -1;
1165 assert( nlpineqs <= 2*nlpcons );
1172 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1174 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3) );
1178 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2) );
1188 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1190 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2 * nlpineqs + 2*lpnnonz) );
1194 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz) );
1199 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1201 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1205 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1217 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1219 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2 * nlpineqs + 2*lpnnonz) );
1223 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz) );
1228 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1230 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1234 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1242 for (i = 0; i < nlpcons; i++)
1246 if ( REALABS(lplhs[i]) > sdpisolver->epsilon )
1248 dsdplprow[dsdpnlpnonz] = pos;
1249 dsdplpval[dsdpnlpnonz] = -lplhs[i];
1256 if ( REALABS(lprhs[i]) > sdpisolver->epsilon )
1258 dsdplprow[dsdpnlpnonz] = pos;
1259 dsdplpval[dsdpnlpnonz] = lprhs[i];
1265 assert( pos == nlpineqs );
1270 if ( REALABS(sdpisolver->objlimit) > sdpisolver->epsilon )
1272 dsdplprow[dsdpnlpnonz] = nlpcons;
1273 dsdplpval[dsdpnlpnonz] = sdpisolver->objlimit;
1285 dsdplpbegcol[0] = 0;
1286 for (i = 0; i < lpnnonz; i++)
1289 if ( lpcol[i] >= nextcol )
1294 for (j = nextcol; j <= lpcol[i]; j++)
1296 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1298 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1299 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1304 dsdplprow[dsdpnlpnonz] = nlpcons;
1305 dsdplpval[dsdpnlpnonz] = obj[j];
1314 if ( !
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) )
1317 if ( rowmapper[2*lprow[i]] > -1 )
1321 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i]];
1322 dsdplpval[dsdpnlpnonz] = -lpval[i];
1326 if ( rowmapper[2*lprow[i] + 1] > -1 )
1330 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i] + 1];
1331 dsdplpval[dsdpnlpnonz] = lpval[i];
1338 assert(
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) || rownactivevars[lprow[i]] == 1 );
1343 for (j = nextcol; j < nvars; j++)
1345 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1347 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1348 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1352 dsdplprow[dsdpnlpnonz] = nlpcons;
1353 dsdplpval[dsdpnlpnonz] = obj[j];
1359 dsdplpbegcol[sdpisolver->nactivevars + 1] = dsdpnlpnonz;
1362 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1364 for (i = 0; i < nlpineqs; i++)
1366 dsdplprow[dsdpnlpnonz] = i;
1367 dsdplpval[dsdpnlpnonz] = -1.0;
1370 dsdplpbegcol[sdpisolver->nactivevars + 2] = dsdpnlpnonz;
1374 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &rowmapper);
1379 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1381 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1382 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1386 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1387 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1392 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1394 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1395 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1399 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1400 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1407 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs, dsdplpbegcol, dsdplprow, dsdplpval) );
1411 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs + 1, dsdplpbegcol, dsdplprow, dsdplpval) );
1413 #ifdef SCIP_MORE_DEBUG
1414 LPConeView(sdpisolver->lpcone);
1418 SCIPdebugMessage(
"Calling DSDP-Solve for SDP (%d) \n", sdpisolver->sdpcounter);
1420 DSDP_CALL( DSDPSetGapTolerance(sdpisolver->dsdp, sdpisolver->gaptol) );
1421 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, sdpisolver->sdpsolverfeastol) );
1422 if ( sdpisolver-> sdpinfo )
1424 DSDP_CALL( DSDPSetStandardMonitor(sdpisolver->dsdp, 1) );
1428 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1430 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, penaltyparam) );
1431 DSDP_CALL( DSDPUsePenalty(sdpisolver->dsdp, 1) );
1436 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, sdpisolver->penaltyparam) );
1440 if ( starty != NULL )
1442 for (i = 0; i < sdpisolver->nactivevars; i++)
1444 DSDP_CALL( DSDPSetY0(sdpisolver->dsdp, i + 1, starty[sdpisolver->dsdptoinputmapper[i]]) );
1456 if ( sdpisolver->preoptimalgap >= 0.0 )
1460 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1462 sdpisolver->nsdpcalls++;
1463 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &(sdpisolver->niterations)) );
1466 if ( timings.stopped )
1468 sdpisolver->timelimit = TRUE;
1469 sdpisolver->solved = FALSE;
1473 sdpisolver->timelimit = FALSE;
1474 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1475 sdpisolver->solved = TRUE;
1480 feastol = sdpisolver->sdpsolverfeastol;
1484 SCIP_Real* solvector;
1486 SCIP_Bool infeasible;
1490 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1491 nvarspointer = nvars;
1493 assert( nvarspointer == nvars );
1496 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1497 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1498 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1499 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1501 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1505 SCIPdebugMessage(
"Solution feasible for DSDP but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
1512 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, feastol) );
1514 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1517 sdpisolver->nsdpcalls++;
1518 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &newiterations) );
1519 sdpisolver->niterations += newiterations;
1522 if ( timings.stopped )
1524 sdpisolver->timelimit = TRUE;
1525 sdpisolver->solved = FALSE;
1529 sdpisolver->timelimit = FALSE;
1530 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1531 sdpisolver->solved = TRUE;
1536 sdpisolver->solved = FALSE;
1537 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
1545 if ( sdpconstnnonz > 0 )
1547 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz);
1548 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz);
1553 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1555 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz);
1556 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz);
1560 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz);
1561 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz);
1565 if ( nlpcons > 0 || lpnnonz > 0 )
1567 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, dsdpnlpnonz);
1568 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, dsdpnlpnonz);
1569 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1571 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3);
1575 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2);
1580 DSDP_CALL( DSDPStopReason(sdpisolver->dsdp, &reason) );
1584 case DSDP_CONVERGED:
1585 SCIPdebugMessage(
"DSDP converged!\n");
1588 case DSDP_INFEASIBLE_START:
1589 SCIPdebugMessage(
"DSDP started with an infeasible point!\n");
1592 case DSDP_SMALL_STEPS:
1593 SCIPdebugMessage(
"Short step lengths created by numerical difficulties prevented progress in DSDP!\n");
1596 case DSDP_INDEFINITE_SCHUR_MATRIX:
1597 SCIPdebugMessage(
"Schur Matrix in DSDP was indefinite but should have been positive semidefinite!\n");
1601 SCIPdebugMessage(
"DSDP reached maximum number of iterations!\n");
1604 case DSDP_NUMERICAL_ERROR:
1605 SCIPdebugMessage(
"A numerical error occured in DSDP!\n");
1608 case DSDP_UPPERBOUND:
1609 SCIPdebugMessage(
"Dual objective value in DSDP reached upper bound.\n");
1612 case DSDP_USER_TERMINATION:
1613 SCIPdebugMessage(
"DSDP didn't stop solving, did you?\n");
1616 case CONTINUE_ITERATING:
1617 SCIPdebugMessage(
"DSDP wants to continue iterating but somehow was stopped!\n");
1621 SCIPdebugMessage(
"Unknown stopping reason in DSDP!\n");
1626 if ( penaltyparam >= sdpisolver->epsilon && sdpisolver->solved )
1634 DSDP_CALL( DSDPGetR(sdpisolver->dsdp, &rval) );
1636 *feasorig = (rval < sdpisolver->feastol );
1641 sdpisolver->feasorig = *feasorig;
1648 if ( penaltybound != NULL )
1650 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", rval);
1653 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1656 assert( trace < penaltyparam + sdpisolver->feastol );
1662 *penaltybound = TRUE;
1663 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1664 trace, penaltyparam);
1667 *penaltybound = FALSE;
1678 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &dsdpsol, sdpisolver->nactivevars + 1) );
1680 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, sdpisolver->nactivevars + 1) );
1682 *feasorig = (dsdpsol[sdpisolver->nactivevars] < sdpisolver->feastol);
1687 if ( penaltybound != NULL )
1689 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", dsdpsol[sdpisolver->nactivevars]);
1692 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1695 assert( trace < penaltyparam + sdpisolver->feastol );
1701 *penaltybound = TRUE;
1702 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1703 trace, penaltyparam);
1706 *penaltybound = FALSE;
1711 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &dsdpsol);
1734 assert( sdpisolver != NULL );
1735 return sdpisolver->solved;
1748 DSDPSolutionType pdfeasible;
1750 assert( sdpisolver != NULL );
1753 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1755 if ( pdfeasible == DSDP_PDUNKNOWN )
1764 SCIP_Bool* primalfeasible,
1765 SCIP_Bool* dualfeasible
1768 DSDPSolutionType pdfeasible;
1770 assert( sdpisolver != NULL );
1771 assert( primalfeasible != NULL );
1772 assert( dualfeasible != NULL );
1775 DSDP_CALL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1777 switch ( pdfeasible )
1779 case DSDP_PDFEASIBLE:
1780 *primalfeasible = TRUE;
1781 *dualfeasible = TRUE;
1784 case DSDP_UNBOUNDED:
1785 *primalfeasible = FALSE;
1786 *dualfeasible = TRUE;
1789 case DSDP_INFEASIBLE:
1790 *primalfeasible = TRUE;
1791 *dualfeasible = FALSE;
1795 SCIPerrorMessage(
"DSDP doesn't know if primal and dual solutions are feasible\n");
1796 return SCIP_LPERROR;
1808 DSDPSolutionType pdfeasible;
1810 assert( sdpisolver != NULL );
1813 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1814 if ( pdfeasible == DSDP_PDUNKNOWN )
1819 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.");
1822 else if ( pdfeasible == DSDP_INFEASIBLE )
1834 DSDPSolutionType pdfeasible;
1836 assert( sdpisolver != NULL );
1839 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1840 if ( pdfeasible == DSDP_PDUNKNOWN )
1845 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1848 else if ( pdfeasible == DSDP_UNBOUNDED )
1860 DSDPSolutionType pdfeasible;
1862 assert( sdpisolver != NULL );
1865 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1866 if ( pdfeasible == DSDP_PDUNKNOWN )
1868 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1871 else if ( pdfeasible == DSDP_UNBOUNDED )
1883 DSDPSolutionType pdfeasible;
1885 assert( sdpisolver != NULL );
1888 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1889 if ( pdfeasible == DSDP_PDUNKNOWN )
1891 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1894 else if ( pdfeasible == DSDP_UNBOUNDED )
1906 DSDPSolutionType pdfeasible;
1908 assert( sdpisolver != NULL );
1911 DSDP_CALL_BOOL(DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible));
1913 if ( pdfeasible == DSDP_PDUNKNOWN )
1915 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1918 else if ( pdfeasible == DSDP_INFEASIBLE )
1930 DSDPSolutionType pdfeasible;
1932 assert( sdpisolver != NULL );
1935 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1937 if ( pdfeasible == DSDP_PDUNKNOWN )
1939 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1942 else if ( pdfeasible == DSDP_INFEASIBLE )
1953 DSDPTerminationReason reason;
1955 assert( sdpisolver != NULL );
1957 if ( sdpisolver->timelimit )
1960 if ( ! sdpisolver->solved )
1965 if ( reason == DSDP_CONVERGED )
1976 SCIPdebugMessage(
"Method not implemented for DSDP, as objective limit is given as an ordinary LP-constraint, so in case the objective limit was "
1977 "exceeded, the problem will be reported as infeasible ! \n");
1987 DSDPTerminationReason reason;
1989 assert( sdpisolver != NULL );
1994 if ( reason == DSDP_MAX_IT )
2005 assert( sdpisolver != NULL );
2007 return sdpisolver->timelimit;
2024 DSDPTerminationReason reason;
2027 assert( sdpisolver != NULL );
2029 if ( sdpisolver->dsdp == NULL || (! sdpisolver->solved) )
2032 if ( sdpisolver->timelimit )
2035 dsdpreturn = DSDPStopReason(sdpisolver->dsdp, &reason);
2037 if (dsdpreturn != 0)
2039 SCIPerrorMessage(
"DSDP-Error <%d> in function call.\n", dsdpreturn);
2045 case DSDP_CONVERGED:
2048 case DSDP_INFEASIBLE_START:
2051 case DSDP_SMALL_STEPS:
2054 case DSDP_INDEFINITE_SCHUR_MATRIX:
2060 case DSDP_NUMERICAL_ERROR:
2063 case DSDP_UPPERBOUND:
2066 case DSDP_USER_TERMINATION:
2079 assert( sdpisolver != NULL );
2089 assert( sdpisolver != NULL );
2100 SCIPdebugMessage(
"Not implemented yet\n");
2101 return SCIP_LPERROR;
2113 assert( sdpisolver != NULL );
2114 assert( objval != NULL );
2117 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2119 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2123 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2124 *objval = -1*(*objval);
2132 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2133 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2137 for (v = 0; v < sdpisolver->nactivevars; v++)
2138 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2142 *objval += sdpisolver->fixedvarsobjcontr;
2144 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig )
2146 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2168 assert( sdpisolver != NULL );
2169 assert( dualsollength != NULL );
2172 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2174 if ( *dualsollength > 0 )
2176 assert( dualsol != NULL );
2177 if ( *dualsollength < sdpisolver->nvars )
2179 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2180 *dualsollength = sdpisolver->nvars;
2185 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2186 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2189 for (v = 0; v < sdpisolver->nvars; v++)
2191 if (sdpisolver->inputtodsdpmapper[v] > -1)
2194 dualsol[v] = dsdpsol[sdpisolver->inputtodsdpmapper[v] - 1];
2199 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2203 if ( objval != NULL )
2205 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2209 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2210 *objval = -1*(*objval);
2216 for (v = 0; v < sdpisolver->nactivevars; v++)
2217 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2221 *objval += sdpisolver->fixedvarsobjcontr;
2224 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2226 else if ( objval != NULL )
2238 int* startXnblocknonz
2242 SCIPdebugMessage(
"Not implemented yet\n");
2244 return SCIP_PLUGINNOTFOUND;
2261 int* startXnblocknonz,
2265 SCIP_Real** startXval
2270 assert( sdpisolver != NULL );
2271 assert( success != NULL );
2272 assert( dualsol != NULL );
2273 assert( dualsollength != NULL );
2274 assert( *dualsollength >= 0 );
2277 assert( nblocks == -1 );
2279 if ( ! sdpisolver->preoptimalsolexists )
2281 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2286 if ( *dualsollength < sdpisolver->nvars )
2288 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2290 *dualsollength = sdpisolver->nvars;
2294 for (v = 0; v < sdpisolver->nvars; v++)
2296 if (sdpisolver->inputtodsdpmapper[v] > -1)
2299 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtodsdpmapper[v] - 1];
2304 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2309 *dualsollength = sdpisolver->nvars;
2330 SCIP_Real* lbvarsdsdp;
2331 SCIP_Real* ubvarsdsdp;
2334 assert( sdpisolver != NULL );
2335 assert( lbvars != NULL );
2336 assert( ubvars != NULL );
2337 assert( arraylength != NULL );
2338 assert( *arraylength >= 0 );
2342 if ( *arraylength < sdpisolver->nvars )
2344 *arraylength = sdpisolver->nvars;
2345 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2350 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars) );
2351 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars) );
2354 DSDP_CALL( BConeCopyX(sdpisolver->bcone, lbvarsdsdp, ubvarsdsdp, sdpisolver->nactivevars) );
2357 for (i = 0; i < sdpisolver->nvars; i++)
2359 if ( sdpisolver->inputtodsdpmapper[i] < 0 )
2368 lbvars[i] = lbvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2369 ubvars[i] = ubvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2374 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars);
2375 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars);
2384 int* startXnblocknonz
2387 SCIPdebugMessage(
"Not implemented yet\n");
2388 return SCIP_LPERROR;
2398 int* startXnblocknonz,
2402 SCIP_Real** startXval
2405 SCIPdebugMessage(
"Not implemented yet\n");
2406 return SCIP_LPERROR;
2414 SCIPdebugMessage(
"Not implemented yet\n");
2415 return SCIP_LPERROR;
2424 assert( sdpisolver != NULL );
2425 assert( iterations != NULL );
2427 if ( sdpisolver->timelimitinitial )
2430 *iterations = sdpisolver->niterations;
2441 assert( sdpisolver != NULL );
2442 assert( calls != NULL );
2444 if ( sdpisolver->timelimitinitial )
2447 *calls = sdpisolver->nsdpcalls;
2458 assert( sdpisolver != NULL );
2459 assert( usedsetting != NULL );
2464 *usedsetting = sdpisolver->usedsetting;
2505 assert( sdpisolver != NULL );
2506 assert( dval != NULL );
2511 *dval = sdpisolver->epsilon;
2514 *dval = sdpisolver->gaptol;
2517 *dval = sdpisolver->feastol;
2520 *dval = sdpisolver->sdpsolverfeastol;
2523 *dval = sdpisolver->penaltyparam;
2526 *dval = sdpisolver->objlimit;
2529 *dval = sdpisolver->preoptimalgap;
2532 return SCIP_PARAMETERUNKNOWN;
2545 assert( sdpisolver != NULL );
2550 sdpisolver->epsilon = dval;
2551 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2554 sdpisolver->gaptol = dval;
2555 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2558 sdpisolver->feastol = dval;
2559 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2562 sdpisolver->sdpsolverfeastol = dval;
2563 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2566 sdpisolver->penaltyparam = dval;
2567 SCIPdebugMessage(
"Setting sdpisolver penaltyparameter to %f.\n", dval);
2570 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2571 sdpisolver->objlimit = dval;
2574 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_LAMBDASTAR not used by DSDP");
2577 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
2578 sdpisolver->preoptimalgap = dval;
2581 return SCIP_PARAMETERUNKNOWN;
2594 assert( sdpisolver != NULL );
2599 *ival = (int) sdpisolver->sdpinfo;
2600 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2603 return SCIP_PARAMETERUNKNOWN;
2616 assert( sdpisolver != NULL );
2621 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2622 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2625 return SCIP_PARAMETERUNKNOWN;
2637 SCIPdebugMessage(
"Lambdastar parameter not used by DSDP");
2646 SCIP_Real* penaltyparam
2651 assert( sdpisolver != NULL );
2652 assert( penaltyparam != NULL );
2670 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2671 sdpisolver->penaltyparam = compval;
2672 *penaltyparam = compval;
2680 SCIP_Real penaltyparam,
2681 SCIP_Real* maxpenaltyparam
2686 assert( sdpisolver != NULL );
2687 assert( maxpenaltyparam != NULL );
2693 *maxpenaltyparam = compval;
2694 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2703 if ( sdpisolver->penaltyparam > *maxpenaltyparam )
2705 SCIPdebugMessage(
"Decreasing penaltyparameter of %f to maximum penalty paramater of %f.\n", sdpisolver->penaltyparam, *maxpenaltyparam);
2706 sdpisolver->penaltyparam = *maxpenaltyparam;
2729 SCIPdebugMessage(
"Not implemented yet\n");
2730 return SCIP_LPERROR;
2739 SCIPdebugMessage(
"Not implemented yet\n");
2740 return SCIP_LPERROR;
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverGaptol(void)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
const char * SCIPsdpiSolverGetSolverDesc(void)
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
#define DSDP_CALL_BOOL(x)
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_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
interface methods for specific SDP-solvers
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
#define TIMEOFDAY_CALL(x)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
#define PENALTYPARAM_FACTOR
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
static void sortColRow(int *row, int *col, SCIP_Real *val, int length)
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetMaxPrimalEntry(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
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)
checks a given SDP solution for feasibility
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
#define INFEASFEASTOLCHANGE
#define MAXPENALTYPARAM_FACTOR
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
static int checkTimeLimitDSDP(DSDP dsdp, void *ctx)
SCIP_RETCODE SCIPsdpiSolverGetPrimalMatrix(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
static int compLowerTriangPos(int i, int j)
static int checkGapSetPreoptimalSol(DSDP dsdp, void *ctx)
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_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverFeastol(void)
SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
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)