45 #define SLATERSOLVED_ABSOLUTE
64 #define RELAX_NAME "SDP"
65 #define RELAX_DESC "SDP-relaxator"
66 #define RELAX_PRIORITY 1
70 #define DEFAULT_PENALTYPARAM -1.0
71 #define DEFAULT_LAMBDASTAR -1.0
72 #define DEFAULT_MAXPENALTYPARAM -1.0
73 #define DEFAULT_WARMSTARTIPFACTOR 0.50
74 #define DEFAULT_WARMSTARTPRIMALTYPE 3
75 #define DEFAULT_WARMSTARTIPTYPE 1
76 #define DEFAULT_WARMSTARTPROJECT 2
77 #define DEFAULT_WARMSTARTPROJMINEV -1
78 #define DEFAULT_WARMSTARTPROJPDSAME TRUE
79 #define DEFAULT_WARMSTART_PREOPTIMAL_SOL FALSE
80 #define DEFAULT_WARMSTARTPREOPTGAP 1e-2
81 #define DEFAULT_WARMSTARTROUNDONLYINF FALSE
82 #define DEFAULT_SLATERCHECK 0
83 #define DEFAULT_OBJLIMIT FALSE
84 #define DEFAULT_RESOLVE TRUE
85 #define DEFAULT_TIGHTENVB TRUE
86 #define DEFAULT_SDPINFO FALSE
87 #define DEFAULT_WARMSTART FALSE
88 #define DEFAULT_DISPLAYSTAT FALSE
89 #define DEFAULT_SETTINGSRESETFREQ -1
90 #define DEFAULT_SETTINGSRESETOFS 0
91 #define DEFAULT_SDPSOLVERTHREADS -1
92 #define DEFAULT_PENINFEASADJUST 10
94 #define WARMSTART_MINVAL 0.01
95 #define WARMSTART_PROJ_MINRHSOBJ 1
96 #define WARMSTART_PROJ_FACTOR 0.1
97 #define WARMSTART_PROJ_FACTOR_LHS 10
98 #define WARMSTART_PROJ_FACTOR_PRIMAL 0.1
99 #define WARMSTART_PROJ_FACTOR_DUAL 0.1
100 #define WARMSTART_PREOPT_MIN_Z_LPVAL 0.01
103 #define TIMEOFDAY_CALL(x) do \
106 if ( (_errorcode_ = (x)) != 0 ) \
108 SCIPerrorMessage("Error in gettimeofday! \n"); \
119 struct SCIP_RelaxData
126 SCIP_Bool origsolved;
127 SCIP_Bool probingsolved;
128 long int lastsdpnode;
131 SCIP_Real sdpsolvergaptol;
132 SCIP_Real sdpsolverfeastol;
133 SCIP_Real penaltyparam;
134 SCIP_Real maxpenaltyparam;
135 SCIP_Real lambdastar;
136 SCIP_Real computedlambdastar;
138 SCIP_Real peninfeasadjust;
141 SCIP_Bool displaystat;
145 int settingsresetfreq;
146 int settingsresetofs;
147 int sdpsolverthreads;
150 int sdpinterfacecalls;
163 int unstablenoslater;
166 int unsolvednoslater;
169 int nslatercheckfailed;
173 int npslatercheckfailed;
176 int ndslatercheckfailed;
177 int nslaterinfeasible;
178 int stableinfeasible;
179 int unstableinfeasible;
180 int penaltyinfeasible;
181 int boundedinfeasible;
182 int unsolvedinfeasible;
184 int primalroundfails;
186 int roundstartsuccess;
189 SCIP_Real roundingprobtime;
192 SCIP_Real warmstartipfactor;
193 int warmstartprimaltype;
195 int warmstartproject;
196 SCIP_Real warmstartpmevprimalpar;
197 SCIP_Real warmstartpmevdualpar;
198 SCIP_Real warmstartprojminevprimal;
199 SCIP_Real warmstartprojminevdual;
200 SCIP_Bool warmstartprojpdsame;
202 SCIP_Bool warmstartpreoptsol;
203 SCIP_Real warmstartpreoptgap;
204 SCIP_Bool warmstartroundonlyinf;
235 assert( nnonz >= 0 );
236 assert( row != NULL );
237 assert( col != NULL );
238 assert( val != NULL );
239 assert( fullmat != NULL );
241 matrixsize = blocksize * blocksize;
244 for (i = 0; i < matrixsize; i++)
247 for (i = 0; i < nnonz; i++)
249 assert( row[i] * blocksize + col[i] <= matrixsize );
250 fullmat[row[i] * blocksize + col[i]] = val[i];
251 assert( col[i] * blocksize + row[i] <= matrixsize );
252 fullmat[col[i] * blocksize + row[i]] = val[i];
269 assert( blocksize >= 0 );
270 assert( matrix != NULL );
271 assert( scale != NULL );
273 for (r = 0; r < blocksize; r++)
275 for (c = 0; c < blocksize; c++)
277 matrix[r * blocksize + c] *= scale[c];
291 SCIP_Bool boundprimal
294 SCIP_CONSHDLR* conshdlr;
295 const char* conshdlrname;
297 SCIP_VAR** blockvars;
300 SCIP_Real** constval;
313 int* nconstblocknonz;
314 int constnnonzcounter;
327 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", ¶m) );
329 SCIPdebugMessage(
"Putting SDP Data in general SDP interface!\n");
331 assert( scip != NULL );
332 assert( sdpi != NULL );
333 assert( varmapper != NULL );
335 vars = SCIPgetVars(scip);
336 nvars = SCIPgetNVars(scip);
337 nvarspen = boundprimal ? nvars + 1 : nvars;
340 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvarspen) );
341 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvarspen) );
342 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvarspen) );
344 for (i = 0; i < nvars; i++)
346 obj[i] = SCIPvarGetObj(vars[i]);
347 lb[i] = SCIPvarGetLbLocal(vars[i]);
348 ub[i] = SCIPvarGetUbLocal(vars[i]);
354 ub[nvars] = SCIPinfinity(scip);
357 nconss = SCIPgetNConss(scip);
358 conss = SCIPgetConss(scip);
365 for (i = 0; i < nconss; i++)
367 conshdlr = SCIPconsGetHdlr(conss[i]);
368 assert( conshdlr != NULL );
370 conshdlrname = SCIPconshdlrGetName(conshdlr);
372 #ifdef SCIP_EVEN_MORE_DEBUG
373 SCIP_CALL( SCIPprintCons(scip, conss[i], NULL) );
374 SCIPinfoMessage(scip, NULL,
"\n");
377 if ( strcmp(conshdlrname,
"SDP") == 0 )
382 sdpnnonz += blocknnonz;
383 sdpconstnnonz += constnnonzcounter;
388 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocksizes, nsdpblocks) );
389 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz, nsdpblocks) );
390 SCIP_CALL( SCIPallocBufferArray(scip, &nconstblocknonz, nsdpblocks) );
391 SCIP_CALL( SCIPallocBufferArray(scip, &col, nsdpblocks) );
392 SCIP_CALL( SCIPallocBufferArray(scip, &row, nsdpblocks) );
393 SCIP_CALL( SCIPallocBufferArray(scip, &val, nsdpblocks) );
394 SCIP_CALL( SCIPallocBufferArray(scip, &constcol, nsdpblocks) );
395 SCIP_CALL( SCIPallocBufferArray(scip, &constrow, nsdpblocks) );
396 SCIP_CALL( SCIPallocBufferArray(scip, &constval, nsdpblocks) );
397 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvars, nsdpblocks) );
398 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar, nsdpblocks) );
400 for (i = 0; i < nsdpblocks; i++)
402 SCIP_CALL( SCIPallocBufferArray(scip, &(nblockvarnonz[i]), nvarspen) );
403 SCIP_CALL( SCIPallocBufferArray(scip, &col[i], nvarspen) );
404 SCIP_CALL( SCIPallocBufferArray(scip, &row[i], nvarspen) );
405 SCIP_CALL( SCIPallocBufferArray(scip, &val[i], nvarspen) );
410 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
412 for (i = 0; i < nconss; i++)
414 conshdlr = SCIPconsGetHdlr(conss[i]);
415 assert( conshdlr != NULL );
417 conshdlrname = SCIPconshdlrGetName(conshdlr);
419 if ( strcmp(conshdlrname,
"SDP") == 0 )
421 assert( ind < nsdpblocks );
425 nconstblocknonz[ind] = constlength;
426 SCIP_CALL( SCIPallocBufferArray(scip, &(constcol[ind]), constlength) );
427 SCIP_CALL( SCIPallocBufferArray(scip, &(constrow[ind]), constlength) );
428 SCIP_CALL( SCIPallocBufferArray(scip, &(constval[ind]), constlength) );
431 SCIP_CALL(
SCIPconsSdpGetData(scip, conss[i], &nblockvars[ind], &blocknnonz, &sdpblocksizes[ind], &nvars, nblockvarnonz[ind], col[ind],
432 row[ind], val[ind], blockvars, &nconstblocknonz[ind], constcol[ind], constrow[ind], constval[ind]) );
435 assert( nvars == SCIPgetNVars(scip) );
436 assert( nconstblocknonz[ind] <= constlength );
438 SCIP_CALL( SCIPallocBufferArray(scip, &(sdpvar[ind]), boundprimal ? nblockvars[ind] + 1 : nblockvars[ind]) );
441 for (j = 0; j < nblockvars[ind]; j++)
448 nblockvarnonz[ind][nblockvars[ind]] = sdpblocksizes[ind];
451 SCIP_CALL( SCIPallocBufferArray(scip, &col[ind][nblockvars[ind]], sdpblocksizes[ind]) );
452 SCIP_CALL( SCIPallocBufferArray(scip, &row[ind][nblockvars[ind]], sdpblocksizes[ind]) );
453 SCIP_CALL( SCIPallocBufferArray(scip, &val[ind][nblockvars[ind]], sdpblocksizes[ind]) );
455 for (j = 0; j < sdpblocksizes[ind]; j++)
457 col[ind][nblockvars[ind]][j] = j;
458 row[ind][nblockvars[ind]][j] = j;
459 val[ind][nblockvars[ind]][j] = 1.0;
469 SCIPfreeBufferArray(scip, &blockvars);
474 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, sdpconstnnonz, nconstblocknonz, constrow,
475 constcol, constval, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
476 NULL, NULL, 0, NULL, NULL, NULL) );
481 for (i = 0; i < nsdpblocks; i++)
482 nconstblocknonz[i] = 0;
484 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, 0, nconstblocknonz, NULL,
485 NULL, NULL, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
486 NULL, NULL, 0, NULL, NULL, NULL) );
491 for (i = 0; i < nsdpblocks; i++)
495 SCIPfreeBufferArrayNull(scip, &val[i][nblockvars[i] - 1]);
496 SCIPfreeBufferArrayNull(scip, &row[i][nblockvars[i] - 1]);
497 SCIPfreeBufferArrayNull(scip, &col[i][nblockvars[i] - 1]);
499 SCIPfreeBufferArrayNull(scip, &(sdpvar[i]));
500 SCIPfreeBufferArrayNull(scip, &val[i]);
501 SCIPfreeBufferArrayNull(scip, &row[i]);
502 SCIPfreeBufferArrayNull(scip, &col[i]);
503 SCIPfreeBufferArrayNull(scip, &(nblockvarnonz[i]));
504 SCIPfreeBufferArrayNull(scip, &(constval[i]));
505 SCIPfreeBufferArrayNull(scip, &(constrow[i]));
506 SCIPfreeBufferArrayNull(scip, &(constcol[i]));
509 SCIPfreeBufferArrayNull(scip, &sdpvar);
510 SCIPfreeBufferArrayNull(scip, &nblockvars);
511 SCIPfreeBufferArrayNull(scip, &constval);
512 SCIPfreeBufferArrayNull(scip, &constrow);
513 SCIPfreeBufferArrayNull(scip, &constcol);
514 SCIPfreeBufferArrayNull(scip, &val);
515 SCIPfreeBufferArrayNull(scip, &row);
516 SCIPfreeBufferArrayNull(scip, &col);
517 SCIPfreeBufferArrayNull(scip, &nconstblocknonz);
518 SCIPfreeBufferArrayNull(scip, &nblockvarnonz);
519 SCIPfreeBufferArrayNull(scip, &sdpblocksizes);
520 SCIPfreeBufferArray(scip, &ub);
521 SCIPfreeBufferArray(scip, &lb);
522 SCIPfreeBufferArray(scip, &obj);
564 assert( scip != NULL );
565 assert( sdpi != NULL );
566 assert( varmapper != NULL );
568 nvars = SCIPgetNVars(scip);
571 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
572 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/tightenvb", &tightenvb) );
574 SCIPdebugMessage(
"inserting %d LPRows into the interface.\n", nrows);
578 for (i = 0; i < nrows; i++)
580 assert( rows[i] != NULL );
581 scipnnonz += SCIProwGetNNonz(rows[i]);
585 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nrows) );
586 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nrows) );
587 SCIP_CALL( SCIPallocBufferArray(scip, &rowind, scipnnonz) );
588 SCIP_CALL( SCIPallocBufferArray(scip, &colind, scipnnonz) );
589 SCIP_CALL( SCIPallocBufferArray(scip, &val, scipnnonz) );
595 for (i = 0; i < nrows; i++)
598 SCIP_Bool tightened = FALSE;
599 SCIP_Real tightenedval = 0.0;
600 SCIP_Bool swapped = FALSE;
604 rownnonz = SCIProwGetNNonz(row);
606 rowvals = SCIProwGetVals(row);
607 rowcols = SCIProwGetCols(row);
608 sciplhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
609 sciprhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
612 if ( tightenvb && rownnonz == 2 && (SCIPisZero(scip, sciplhs) || SCIPisZero(scip, sciprhs) ) )
622 assert( rowcols[0] != NULL );
623 assert( rowcols[1] != NULL );
624 var1 = SCIPcolGetVar(rowcols[0]);
625 var2 = SCIPcolGetVar(rowcols[1]);
626 assert( var1 != NULL );
627 assert( var2 != NULL );
630 if ( ! SCIPisEQ(scip, SCIPvarGetLbLocal(var1), SCIPvarGetUbLocal(var1)) && ! SCIPisEQ(scip, SCIPvarGetLbLocal(var2), SCIPvarGetUbLocal(var2)) )
633 if ( (SCIPisEQ(scip, val1, 1.0) || SCIPisEQ(scip, val2, 1.0)) && ( SCIPisNegative(scip, val1) || SCIPisNegative(scip, val2) ) )
636 if ( ! SCIPisEQ(scip, val1, 1.0) || ! SCIPisNegative(scip, val2) )
638 SCIPswapPointers((
void**) &var1, (
void**) &var2);
645 if ( SCIPvarIsBinary(var2) )
647 if ( SCIPisZero(scip, sciprhs) )
649 if ( SCIPisLT(scip, SCIPvarGetUbLocal(var1), REALABS(val2)) )
651 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetUbLocal(var1));
654 tightenedval = -SCIPvarGetUbLocal(var1);
658 if ( SCIPisZero(scip, sciplhs) )
660 if ( SCIPisGT(scip, SCIPvarGetLbLocal(var1), REALABS(val2)) )
662 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetLbLocal(var1));
665 tightenedval = -SCIPvarGetUbLocal(var1);
673 for (j = 0; j < rownnonz; j++)
676 if ( tightened && ( (swapped && (j == 0)) || ((! swapped) && (j == 1)) ) )
678 if ( SCIPisFeasGT(scip, REALABS(tightenedval), 0.0) )
680 assert( SCIPcolGetVar(rowcols[j]) != 0 );
682 rowind[nnonz] = nconss;
683 val[nnonz] = tightenedval;
687 else if ( SCIPisFeasGT(scip, REALABS(rowvals[j]), 0.0))
689 assert( SCIPcolGetVar(rowcols[j]) != 0 );
691 rowind[nnonz] = nconss;
692 val[nnonz] = rowvals[j];
696 lhs[nconss] = primalobj ? sciplhs : (SCIPisInfinity(scip, -sciplhs) ? -sciplhs : 0.0);
697 rhs[nconss] = primalobj ? sciprhs : (SCIPisInfinity(scip, sciprhs) ? sciprhs : 0.0);
709 SCIP_CALL(
SCIPsdpiAddLPRows(sdpi, nconss, lhs, rhs, nnonz, (
const int*)rowind, (
const int*)colind, val) );
712 SCIPfreeBufferArray(scip, &val);
713 SCIPfreeBufferArray(scip, &colind);
714 SCIPfreeBufferArray(scip, &rowind);
715 SCIPfreeBufferArray(scip, &rhs);
716 SCIPfreeBufferArray(scip, &lhs);
721 vars = SCIPgetVars(scip);
722 assert( vars != NULL );
725 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
726 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
727 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nvars) );
728 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvars) );
729 SCIP_CALL( SCIPallocBufferArray(scip, &objinds, nvars) );
732 for (i = 0; i < nvars; i++)
734 assert( vars[i] != NULL );
735 lb[i] = primalobj ? SCIPvarGetLbLocal(vars[i]) : (SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[i])) ? SCIPvarGetLbLocal(vars[i]) : 0.0);
736 ub[i] = primalobj ? SCIPvarGetUbLocal(vars[i]) : (SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[i])) ? SCIPvarGetUbLocal(vars[i]) : 0.0);
738 obj[i] = dualobj ? SCIPvarGetObj(vars[i]) : 0.0;
747 SCIPfreeBufferArray(scip, &objinds);
748 SCIPfreeBufferArray(scip, &obj);
749 SCIPfreeBufferArray(scip, &inds);
750 SCIPfreeBufferArray(scip, &ub);
751 SCIPfreeBufferArray(scip, &lb);
760 SCIP_RELAXDATA* relaxdata,
762 SCIP_Real* lowerbound
765 char saveconsname[SCIP_MAXSTRLEN];
768 SCIP_CONS* savedsetting;
773 SCIP_Bool enforceslater;
775 SCIP_Real objforscip;
776 SCIP_Real* solforscip;
788 SCIPdebugMessage(
"calcRelax called\n");
790 assert( scip != NULL );
791 assert( relaxdata != NULL );
792 assert( result != NULL );
793 assert( lowerbound != NULL );
795 nvars = SCIPgetNVars(scip);
797 vars = SCIPgetVars (scip);
799 sdpi = relaxdata->sdpi;
800 assert( sdpi != NULL );
802 if ( relaxdata->objlimit )
809 rootnode = ! SCIPnodeGetParent(SCIPgetCurrentNode(scip));
812 if ( rootnode || (SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) == relaxdata->settingsresetofs) ||
813 ( relaxdata->settingsresetfreq > 0 && ((SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) - relaxdata->settingsresetofs) % relaxdata->settingsresetfreq == 0)) ||
820 SCIP_CONSHDLR* conshdlr;
824 conshdlr = SCIPfindConshdlr(scip,
"Savedsdpsettings");
825 if ( conshdlr == NULL )
827 SCIPerrorMessage(
"Savedsdpsettings constraint handler not found!\n");
828 return SCIP_PLUGINNOTFOUND;
833 conss = SCIPconshdlrGetConss(conshdlr);
834 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
835 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip))));
837 while ( parentconsind >= 0 && strcmp(saveconsname, SCIPconsGetName(conss[parentconsind])) )
839 if ( parentconsind >= 0 )
843 SCIPdebugMessage(
"Startsetting from parent node not found, restarting with fastest settings!\n");
849 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
850 if ( ! SCIPisInfinity(scip, timelimit) )
852 timelimit -= SCIPgetSolvingTime(scip);
853 if ( timelimit <= 0.0 )
855 *result = SCIP_DIDNOTRUN;
862 enforceslater = SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip)));
865 if ( ( ! SCIPnodeGetParent(SCIPgetCurrentNode(scip))) || ( ! relaxdata->warmstart ) || ((relaxdata->warmstartiptype == 2) &&
868 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
870 else if ( relaxdata->warmstart && (relaxdata->warmstartprimaltype != 2) && (relaxdata->warmstartiptype == 2) && SCIPisEQ(scip, relaxdata->warmstartipfactor, 1.0) )
876 SCIP_CALL( SCIPallocBufferArray(scip, &ipy, nvars) );
877 for (v = 0; v < nvars; v++)
880 #ifdef SCIP_PRINT_WARMSTART
881 SCIPdebugMessage(
"warmstart using the following analytic centers:\n");
882 for (v = 0; v < nvars; v++)
883 SCIPdebugMessage(
"y[%d] = %f\n", v, ipy[v]);
886 for (b = 0; b < relaxdata->nblocks; b++)
888 SCIPdebugMessage(
"dual block %d\n", b);
889 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
891 SCIPdebugMessage(
"Z(%d,%d)=%f\n", relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
894 for (b = 0; b < relaxdata->nblocks; b++)
896 SCIPdebugMessage(
"primal block %d\n", b);
897 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
899 SCIPdebugMessage(
"X(%d,%d)=%f\n", relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
905 SCIP_CALL(
SCIPsdpiSolve(sdpi, ipy, relaxdata->ipZnblocknonz, relaxdata->ipZrow, relaxdata->ipZcol, relaxdata->ipZval, relaxdata->ipXnblocknonz,
906 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval, startsetting, enforceslater, timelimit));
908 SCIPfreeBufferArray(scip, &ipy);
912 SCIP_CONSHDLR* conshdlr;
914 SCIP_Real* starty = NULL;
915 int* startZnblocknonz = NULL;
916 int** startZrow = NULL;
917 int** startZcol = NULL;
918 SCIP_Real** startZval = NULL;
919 int* startXnblocknonz = NULL;
920 int** startXrow = NULL;
921 int** startXcol = NULL;
922 SCIP_Real** startXval = NULL;
924 SCIP_Longint parentnodenumber;
930 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
931 if ( conshdlr == NULL )
933 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
934 return SCIP_PLUGINNOTFOUND;
939 conss = SCIPconshdlrGetConss(conshdlr);
940 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
941 parentnodenumber = SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip)));
949 if ( parentconsind < 0 )
951 SCIPdebugMessage(
"Starting SDP-Solving from scratch since no warmstart information available for node %lld\n", parentnodenumber);
952 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
956 SCIPdebugMessage(
"Using warmstartinformation from node %lld\n", parentnodenumber);
962 SCIP_CALL( SCIPallocBufferArray(scip, &starty, nvars) );
965 for (v = 0; v < nvars; v++)
968 starty[v] = SCIPgetSolVal(scip, dualsol, var);
970 if (SCIPisLT(scip, starty[v], SCIPvarGetLbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
972 starty[v] = SCIPvarGetLbLocal(var);
974 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetLbLocal(var)) );
976 else if (SCIPisGT(scip, starty[v], SCIPvarGetUbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
978 starty[v] = SCIPvarGetUbLocal(var);
980 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetUbLocal(var)) );
984 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->warmstartproject != 4 )
986 if ( relaxdata->warmstartiptype == 1 )
989 starty[v] *= 1 - relaxdata->warmstartipfactor;
991 else if ( relaxdata->warmstartiptype == 2 )
994 starty[v] = (1 - relaxdata->warmstartipfactor) * starty[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, var);
1002 SCIP_CONSHDLR* sdpconshdlr;
1003 SCIP_CONS** sdpblocks;
1010 SCIP_Real maxprimalentry = 0.0;
1011 SCIP_Real maxdualentry;
1012 SCIP_Real identitydiagonal = 0.0;
1015 SCIP_Bool* diagentryexists;
1017 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
1018 nblocks = SCIPconshdlrGetNConss(sdpconshdlr);
1019 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
1020 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1022 SCIP_CALL( SCIPallocBufferArray(scip, &startZnblocknonz, nblocks + 1) );
1023 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow, nblocks + 1) );
1024 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol, nblocks + 1) );
1025 SCIP_CALL( SCIPallocBufferArray(scip, &startZval, nblocks + 1) );
1026 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks + 1) );
1027 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks + 1) );
1028 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks + 1) );
1029 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks + 1) );
1032 if ( relaxdata->warmstartiptype == 1 )
1035 if ( SCIPisLT(scip, maxprimalentry, 1.0) )
1036 maxprimalentry = 1.0;
1040 for (b = 0; b < nblocks; b++)
1044 if ( relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4 )
1047 startZnblocknonz[b] = blocksize * (blocksize + 1) / 2;
1054 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
1056 if ( relaxdata->warmstartiptype == 1 )
1057 startZnblocknonz[b] += blocksize;
1058 else if ( relaxdata->warmstartiptype == 2 )
1059 startZnblocknonz[b] += relaxdata->ipZnblocknonz[b];
1063 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], startZnblocknonz[b]) );
1064 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], startZnblocknonz[b]) );
1065 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], startZnblocknonz[b]) );
1071 if ( relaxdata->warmstartproject == 3 )
1073 SCIP_Real* fullZmatrix;
1074 SCIP_Real* eigenvalues;
1075 SCIP_Real* eigenvectors;
1076 SCIP_Real* scaledeigenvectors;
1077 SCIP_Real matrixsize;
1082 matrixsize = blocksize * blocksize;
1084 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
1085 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
1086 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
1088 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
1093 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
1097 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevdual) )
1099 eigenvalues[i] = relaxdata->warmstartprojminevdual;
1108 FALSE, fullZmatrix) );
1111 startZnblocknonz[b] = 0;
1112 epsilon = SCIPepsilon(scip);
1113 for (r = 0; r < blocksize; r++)
1115 for (c = r; c < blocksize; c++)
1117 matrixpos = r * blocksize + c;
1118 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
1120 startZrow[b][startZnblocknonz[b]] = r;
1121 startZcol[b][startZnblocknonz[b]] = c;
1122 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
1123 startZnblocknonz[b]++;
1129 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1130 SCIPfreeBufferArray(scip, &eigenvectors);
1131 SCIPfreeBufferArray(scip, &eigenvalues);
1132 SCIPfreeBufferArray(scip, &fullZmatrix);
1135 if ( relaxdata->warmstartprimaltype == 1 )
1138 if ( relaxdata->warmstartiptype == 1 )
1140 startXnblocknonz[b] = blocksize;
1141 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1142 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1143 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1144 for (i = 0; i < startXnblocknonz[b]; i++)
1146 startXrow[b][i] = i;
1147 startXcol[b][i] = i;
1148 startXval[b][i] = maxprimalentry;
1152 else if ( relaxdata->warmstartprimaltype == 2 )
1154 startXnblocknonz[b] = startZnblocknonz[b];
1155 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1156 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1157 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1158 for (i = 0; i < startZnblocknonz[b]; i++)
1160 startXrow[b][i] = startZrow[b][i];
1161 startXcol[b][i] = startZcol[b][i];
1162 startXval[b][i] = 1 / startZval[b][i];
1165 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject != 4 )
1167 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1172 if ( relaxdata->warmstartproject != 4 )
1175 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], 2 * nrows + 2 * nvars) );
1176 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], 2 * nrows + 2 * nvars) );
1177 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], 2 * nrows + 2 * nvars) );
1178 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], 2 * nrows + 2 * nvars) );
1179 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], 2 * nrows + 2 * nvars) );
1180 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], 2 * nrows + 2 * nvars) );
1183 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
1184 startXnblocknonz[b] = 2 * nrows + 2 * nvars;
1186 for (r = 0; r < nrows; r++)
1190 rownnonz = SCIProwGetNNonz(rows[r]);
1191 rowvals = SCIProwGetVals(rows[r]);
1192 rowcols = SCIProwGetCols(rows[r]);
1193 for (i = 0; i < rownnonz; i++)
1194 rowval += SCIPgetSolVal(scip, dualsol, SCIPcolGetVar(rowcols[i])) * rowvals[i];
1196 startZrow[b][2*r] = 2*r;
1197 startZcol[b][2*r] = 2*r;
1198 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
1200 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
1201 startZval[b][2*r] = relaxdata->warmstartprojminevdual;
1205 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r], 1.0) )
1208 if ( SCIPisLT(scip, startZval[b][2*r], 0.0) )
1209 startZval[b][2*r] = relaxdata->warmstartipfactor;
1211 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor;
1213 else if ( relaxdata->warmstartiptype == 2 )
1215 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r];
1225 startZrow[b][2*r + 1] = 2*r + 1;
1226 startZcol[b][2*r + 1] = 2*r + 1;
1227 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
1229 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r + 1], relaxdata->warmstartprojminevdual) )
1230 startZval[b][2*r + 1] = relaxdata->warmstartprojminevdual;
1231 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r + 1], 1.0) )
1234 if ( SCIPisLT(scip, startZval[b][2*r + 1], 0.0) )
1235 startZval[b][2*r + 1] = relaxdata->warmstartipfactor;
1237 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor;
1239 else if ( relaxdata->warmstartiptype == 2 )
1241 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r + 1];
1251 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1253 startXrow[b][2*r] = 2*r;
1254 startXcol[b][2*r] = 2*r;
1255 startXval[b][2*r] = maxprimalentry;
1256 startXrow[b][2*r + 1] = 2*r + 1;
1257 startXcol[b][2*r + 1] = 2*r + 1;
1258 startXval[b][2*r + 1] = maxprimalentry;
1260 else if ( relaxdata->warmstartprimaltype == 2 )
1262 startXrow[b][2*r] = startZrow[b][2*r];
1263 startXcol[b][2*r] = startZcol[b][2*r];
1264 startXval[b][2*r] = 1 / startZval[b][2*r];
1265 startXrow[b][2*r + 1] = startZrow[b][2*r + 1];
1266 startXcol[b][2*r + 1] = startZcol[b][2*r + 1];
1267 startXval[b][2*r + 1] = 1 / startZval[b][2*r + 1];
1269 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartiptype == 1 )
1271 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1276 for (v = 0; v < nvars; v++)
1278 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1279 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1280 startZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, dualsol, vars[v]) - SCIPvarGetLbLocal(vars[v]);
1281 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
1282 startZval[b][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
1283 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], 1.0) )
1286 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v], 0.0) )
1287 startZval[b][2*nrows + 2*v] = relaxdata->warmstartipfactor;
1289 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor;
1291 else if ( relaxdata->warmstartiptype == 2 )
1293 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v];
1303 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1304 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1305 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, dualsol, vars[v]);
1306 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
1307 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
1308 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 1.0) )
1311 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 0.0) )
1312 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartipfactor;
1314 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v + 1] + relaxdata->warmstartipfactor;
1316 else if ( relaxdata->warmstartiptype == 2 )
1318 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v + 1];
1328 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1330 startXrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1331 startXcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1332 startXval[b][2*nrows + 2*v] = maxprimalentry;
1333 startXrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1334 startXcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1335 startXval[b][2*nrows + 2*v + 1] = maxprimalentry;
1337 else if ( relaxdata->warmstartprimaltype == 2 )
1339 startXrow[b][2*nrows + 2*v] = startZrow[b][2*nrows + 2*v];
1340 startXcol[b][2*nrows + 2*v] = startZcol[b][2*nrows + 2*v];
1341 startXval[b][2*nrows + 2*v] = 1 / startZval[b][2*nrows + 2*v];
1342 startXrow[b][2*nrows + 2*v + 1] = startZrow[b][2*nrows + 2*v + 1];
1343 startXcol[b][2*nrows + 2*v + 1] = startZcol[b][2*nrows + 2*v + 1];
1344 startXval[b][2*nrows + 2*v + 1] = 1 / startZval[b][2*nrows + 2*v + 1];
1346 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject == 1 )
1348 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1376 if ( relaxdata->warmstartproject == 4 )
1378 SCIP_VAR** blockvars;
1381 struct timeval starttime;
1382 struct timeval currenttime;
1383 SCIP_Real** blockval;
1384 SCIP_Real** blockeigenvalues;
1385 SCIP_Real** blockeigenvectors;
1386 SCIP_Real** blockrowvals;
1393 SCIP_Real* blockconstval;
1394 SCIP_Real* scaledeigenvectors;
1395 SCIP_Real* fullXmatrix;
1396 SCIP_Real* fullZmatrix;
1401 SCIP_Real primalroundobj;
1402 SCIP_Real dualroundobj;
1420 int blockconstnnonz;
1429 int nremovedentries;
1433 if ( relaxdata->warmstartprimaltype != 3 )
1435 SCIPerrorMessage(
"Invalid parameter combination, use relax/warmstartproject = 4 only with relax/warmstartprimaltype = 3.\n");
1436 return SCIP_PARAMETERWRONGVAL;
1442 for (b = 0; b < nblocks; b++)
1445 matrixsize *= (matrixsize + 1) * 0.5;
1446 startXnblocknonz[b] = matrixsize;
1448 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
1449 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
1450 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
1455 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[nblocks], 2 * nvars + 2 * nrows) );
1456 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[nblocks], 2 * nvars + 2 * nrows) );
1457 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[nblocks], 2 * nvars + 2 * nrows) );
1458 startXnblocknonz[nblocks] = 2 * nvars + 2 * nrows;
1462 lpi = relaxdata->lpi;
1465 SCIP_CALL( SCIPlpiClear(lpi) );
1468 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MAXIMIZE) );
1474 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nvars) );
1475 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nvars) );
1476 for (v = 0; v < nvars; v++)
1478 varobj = SCIPvarGetObj(vars[v]);
1484 SCIP_CALL( SCIPallocBufferArray(scip, &blocksizes, nblocks + 2) );
1485 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues, nblocks) );
1486 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors, nblocks) );
1492 SCIP_CALL( SCIPlpiAddRows(lpi, nvars, lhs, rhs, NULL, 0, NULL, NULL, NULL) );
1494 SCIPfreeBufferArray(scip, &rhs);
1495 SCIPfreeBufferArray(scip, &lhs);
1498 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nvars) );
1499 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nvars) );
1500 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nvars) );
1501 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nvars) );
1502 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nvars) );
1503 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nvars) );
1507 for (v = 0; v < nvars; v++)
1509 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
1511 obj[pos] = SCIPvarGetLbLocal(vars[v]);
1513 ub[pos] = SCIPlpiInfinity(lpi);
1519 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
1521 obj[pos] = -1 * SCIPvarGetUbLocal(vars[v]);
1523 ub[pos] = SCIPlpiInfinity(lpi);
1531 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, pos, beg, ind, val) );
1532 blocksizes[0] = pos;
1535 SCIPfreeBufferArray(scip, &val);
1536 SCIPfreeBufferArray(scip, &ind);
1537 SCIPfreeBufferArray(scip, &beg);
1538 SCIPfreeBufferArray(scip, &ub);
1539 SCIPfreeBufferArray(scip, &lb);
1540 SCIPfreeBufferArray(scip, &obj);
1543 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1545 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nrows) );
1546 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nrows) );
1547 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nrows) );
1548 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nrows) );
1549 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nrows*nvars) );
1550 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nrows*nvars) );
1555 for (r = 0; r < nrows; r++)
1559 rownnonz = SCIProwGetNNonz(row);
1561 rowvals = SCIProwGetVals(row);
1562 rowcols = SCIProwGetCols(row);
1563 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1564 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1566 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
1570 ub[pos] = SCIPlpiInfinity(lpi);
1572 for (i = 0; i < rownnonz; i++)
1575 val[indpos] = rowvals[i];
1581 if ( ! SCIPisInfinity(scip, rowrhs) )
1583 obj[pos] = -1 * rowrhs;
1585 ub[pos] = SCIPlpiInfinity(lpi);
1587 for (i = 0; i < rownnonz; i++)
1590 val[indpos] = -1 * rowvals[i];
1597 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, indpos, beg, ind, val) );
1598 blocksizes[1] = pos;
1599 roundingvars += pos;
1601 SCIPfreeBufferArray(scip, &val);
1602 SCIPfreeBufferArray(scip, &ind);
1603 SCIPfreeBufferArray(scip, &beg);
1604 SCIPfreeBufferArray(scip, &ub);
1605 SCIPfreeBufferArray(scip, &lb);
1606 SCIPfreeBufferArray(scip, &obj);
1609 for (b = 0; b < nblocks; b++)
1613 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
1614 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
1615 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
1616 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
1617 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
1618 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
1619 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
1620 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
1622 arraylength = nvars;
1623 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
1624 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval) );
1625 assert( arraylength == nvars );
1627 matrixsize = blocksize * blocksize;
1629 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
1630 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues[b], blocksize) );
1631 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors[b], matrixsize) );
1633 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
1638 SCIP_CALL( SCIPallocBufferArray(scip, &obj, blocksize) );
1639 SCIP_CALL( SCIPallocBufferArray(scip, &lb, blocksize) );
1640 SCIP_CALL( SCIPallocBufferArray(scip, &ub, blocksize) );
1641 SCIP_CALL( SCIPallocBufferArray(scip, &beg, blocksize) );
1642 SCIP_CALL( SCIPallocBufferArray(scip, &ind, blocksize*nvars) );
1643 SCIP_CALL( SCIPallocBufferArray(scip, &val, blocksize*nvars) );
1646 for (i = 0; i < blocksize; i++)
1651 for (v = 0; v < nvars; v++)
1653 ind[i * nvars + v] = v;
1654 val[i * nvars + v] = 0.0;
1659 ub[i] = SCIPlpiInfinity(lpi);
1663 for (i = 0; i < blockconstnnonz; i++)
1668 for (evind = 0; evind < blocksize; evind++)
1670 if ( blockconstrow[i] == blockconstcol[i] )
1671 obj[evind] += blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1673 obj[evind] += 2 * blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1677 SCIPfreeBufferArray(scip, &blockconstval);
1678 SCIPfreeBufferArray(scip, &blockconstrow);
1679 SCIPfreeBufferArray(scip, &blockconstcol);
1682 for (v = 0; v < blocknvars; v++)
1685 for (i = 0; i < blocknvarnonz[v]; i++)
1690 for (evind = 0; evind < blocksize; evind++)
1692 if ( blockrow[v][i] == blockcol[v][i] )
1693 val[evind * nvars + varind] += blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1695 val[evind * nvars + varind] += 2 * blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1700 SCIPfreeBufferArray(scip, &blockvars);
1701 SCIPfreeBufferArray(scip, &blockval);
1702 SCIPfreeBufferArray(scip, &blockrow);
1703 SCIPfreeBufferArray(scip, &blockcol);
1704 SCIPfreeBufferArray(scip, &blocknvarnonz);
1705 SCIPfreeBufferArray(scip, &fullXmatrix);
1708 nremovedentries = 0;
1709 for (i = 0; i < blocksize; i++)
1711 beg[i] = beg[i] - nremovedentries;
1712 for (v = 0; v < nvars; v++)
1714 if ( REALABS(val[i * nvars + v]) < SCIPepsilon(scip) )
1720 val[i * nvars + v - nremovedentries] = val[i * nvars + v];
1721 ind[i * nvars + v - nremovedentries] = ind[i * nvars + v];
1726 SCIP_CALL( SCIPlpiAddCols(lpi, blocksize, obj, lb, ub, NULL, blocksize*nvars - nremovedentries, beg, ind, val) );
1728 blocksizes[2 + b] = blocksize;
1729 roundingvars += blocksize;
1731 SCIPfreeBufferArray(scip, &val);
1732 SCIPfreeBufferArray(scip, &ind);
1733 SCIPfreeBufferArray(scip, &beg);
1734 SCIPfreeBufferArray(scip, &ub);
1735 SCIPfreeBufferArray(scip, &lb);
1736 SCIPfreeBufferArray(scip, &obj);
1741 SCIP_CALL( SCIPlpiSolveDual(lpi) );
1744 SCIP_CALL( SCIPlpiGetObjval(lpi, &primalroundobj) );
1749 if ( SCIPlpiIsDualInfeasible(lpi) || SCIPisGE(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1751 if ( SCIPlpiIsDualInfeasible(lpi) )
1753 SCIPdebugMsg(scip,
"Infeasibility of node %lld detected through primal rounding problem during warmstarting\n",
1754 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
1756 relaxdata->roundingprobinf++;
1758 else if ( SCIPisGT(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1760 SCIPdebugMsg(scip,
"Suboptimality of node %lld detected through primal rounding problem during warmstarting:"
1761 "lower bound = %f > %f = cutoffbound\n", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), primalroundobj, SCIPgetCutoffbound(scip));
1763 relaxdata->roundingcutoff++;
1767 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1768 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1769 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1770 for (b = 0; b < nblocks; b++)
1772 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
1773 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
1774 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1775 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1776 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1777 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1778 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1779 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1781 SCIPfreeBufferArray(scip, &blocksizes);
1782 SCIPfreeBufferArray(scip, &blockeigenvectors);
1783 SCIPfreeBufferArray(scip, &blockeigenvalues);
1784 SCIPfreeBufferArrayNull(scip, &startXval);
1785 SCIPfreeBufferArrayNull(scip, &startXcol);
1786 SCIPfreeBufferArrayNull(scip, &startXrow);
1787 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1788 SCIPfreeBufferArrayNull(scip, &startZval);
1789 SCIPfreeBufferArrayNull(scip, &startZcol);
1790 SCIPfreeBufferArrayNull(scip, &startZrow);
1791 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1792 SCIPfreeBufferArray(scip, &starty);
1795 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1797 relaxdata->feasible = FALSE;
1798 *result = SCIP_CUTOFF;
1801 else if ( relaxdata->warmstartroundonlyinf )
1804 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1805 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1806 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1807 for (b = 0; b < nblocks; b++)
1809 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
1810 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
1811 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1812 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1813 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1814 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1815 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1816 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1818 SCIPfreeBufferArray(scip, &blocksizes);
1819 SCIPfreeBufferArray(scip, &blockeigenvectors);
1820 SCIPfreeBufferArray(scip, &blockeigenvalues);
1821 SCIPfreeBufferArrayNull(scip, &startXval);
1822 SCIPfreeBufferArrayNull(scip, &startXcol);
1823 SCIPfreeBufferArrayNull(scip, &startXrow);
1824 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1825 SCIPfreeBufferArrayNull(scip, &startZval);
1826 SCIPfreeBufferArrayNull(scip, &startZcol);
1827 SCIPfreeBufferArrayNull(scip, &startZrow);
1828 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1829 SCIPfreeBufferArray(scip, &starty);
1832 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1834 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
1837 else if ( ! SCIPlpiIsOptimal(lpi) )
1839 SCIPdebugMsg(scip,
"Solving without warmstart since solving of the primal rounding problem failed with status %d!\n", SCIPlpiGetInternalStatus(lpi));
1840 relaxdata->primalroundfails++;
1843 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1844 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1845 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1846 for (b = 0; b < nblocks; b++)
1848 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
1849 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
1850 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1851 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1852 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1853 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1854 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1855 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1857 SCIPfreeBufferArray(scip, &blocksizes);
1858 SCIPfreeBufferArray(scip, &blockeigenvectors);
1859 SCIPfreeBufferArray(scip, &blockeigenvalues);
1860 SCIPfreeBufferArrayNull(scip, &startXval);
1861 SCIPfreeBufferArrayNull(scip, &startXcol);
1862 SCIPfreeBufferArrayNull(scip, &startXrow);
1863 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1864 SCIPfreeBufferArrayNull(scip, &startZval);
1865 SCIPfreeBufferArrayNull(scip, &startZcol);
1866 SCIPfreeBufferArrayNull(scip, &startZrow);
1867 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1868 SCIPfreeBufferArray(scip, &starty);
1871 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1873 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
1882 SCIP_CALL( SCIPallocBufferArray(scip, &optev, roundingvars) );
1884 SCIP_CALL( SCIPlpiGetSol(lpi, NULL, optev, NULL, NULL, NULL) );
1887 pos = blocksizes[1];
1889 for (v = 0; v < nvars; v++)
1891 startXrow[nblocks][pos] = 2 * nrows + 2 * v;
1892 startXcol[nblocks][pos] = 2 * nrows + 2 * v;
1893 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
1895 startXval[nblocks][pos] = optev[evpos];
1899 startXval[nblocks][pos] = SCIPinfinity(scip);
1902 startXrow[nblocks][pos] = 2 * nrows + 2 * v + 1;
1903 startXcol[nblocks][pos] = 2 * nrows + 2 * v + 1;
1904 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
1907 startXval[nblocks][pos] = optev[evpos];
1911 startXval[nblocks][pos] = SCIPinfinity(scip);
1914 assert( evpos == blocksizes[0] );
1918 evpos = blocksizes[0];
1919 for (r = 0; r < nrows; r++)
1923 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1924 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1926 startXrow[nblocks][pos] = 2 * r;
1927 startXcol[nblocks][pos] = 2 * r;
1928 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
1930 startXval[nblocks][pos] = optev[evpos];
1934 startXval[nblocks][pos] = SCIPinfinity(scip);
1937 startXrow[nblocks][pos] = 2 * r + 1;
1938 startXcol[nblocks][pos] = 2 * r + 1;
1939 if ( ! SCIPisInfinity(scip, rowrhs) )
1941 startXval[nblocks][pos] = optev[evpos];
1945 startXval[nblocks][pos] = SCIPinfinity(scip);
1948 assert( evpos == blocksizes[0] + blocksizes[1] );
1950 startXnblocknonz[nblocks] = blocksizes[0] + blocksizes[1];
1953 pos = blocksizes[0] + blocksizes[1];
1954 for (b = 0; b < nblocks; b++)
1956 blocksize = blocksizes[2 + b];
1957 matrixsize = blocksize * blocksize;
1960 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
1966 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
1969 SCIP_CALL(
SCIPlapackMatrixMatrixMult(blocksizes[2 + b], blocksizes[2 + b], blockeigenvectors[b], TRUE, blocksizes[2 + b], blocksizes[2 + b],
1970 scaledeigenvectors, FALSE, fullXmatrix) );
1973 startXnblocknonz[b] = 0;
1974 epsilon = SCIPepsilon(scip);
1975 for (r = 0; r < blocksize; r++)
1977 for (c = r; c < blocksize; c++)
1979 matrixpos = r * blocksize + c;
1980 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
1982 startXrow[b][startXnblocknonz[b]] = r;
1983 startXcol[b][startXnblocknonz[b]] = c;
1984 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
1985 startXnblocknonz[b]++;
1989 pos += blocksizes[2 + b];
1990 SCIPfreeBufferArray(scip, &fullXmatrix);
1991 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1993 SCIPfreeBufferArray(scip, &optev);
1999 matrixsize = 2 * nvars + 2 * nrows;
2000 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[nblocks], matrixsize) );
2001 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[nblocks], matrixsize) );
2002 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[nblocks], matrixsize) );
2005 SCIP_CALL( SCIPlpiClear(lpi) );
2008 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MINIMIZE) );
2011 roundingvars = nvars;
2012 for (b = 0; b < nblocks; b++)
2013 roundingvars += blocksizes[2 + b];
2015 SCIP_CALL( SCIPallocBufferArray(scip, &obj, roundingvars) );
2016 SCIP_CALL( SCIPallocBufferArray(scip, &lb, roundingvars) );
2017 SCIP_CALL( SCIPallocBufferArray(scip, &ub, roundingvars) );
2019 for (v = 0; v < nvars; v++)
2027 for (v = nvars; v < roundingvars; v++)
2031 ub[v] = SCIPlpiInfinity(lpi);
2038 SCIP_CALL( SCIPlpiAddCols(lpi, roundingvars, obj, lb, ub, NULL, 0, NULL, NULL, NULL) );
2040 SCIPfreeBufferArray(scip, &ub);
2041 SCIPfreeBufferArray(scip, &lb);
2042 SCIPfreeBufferArray(scip, &obj);
2045 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
2047 for (r = 0; r < nrows; r++)
2050 assert( row != NULL );
2051 rownnonz = SCIProwGetNNonz(row);
2053 rowvals = SCIProwGetVals(row);
2054 rowcols = SCIProwGetCols(row);
2055 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2056 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2058 SCIP_CALL( SCIPallocBufferArray(scip, &rowinds, rownnonz) );
2061 for (i = 0; i < rownnonz; i++)
2066 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &rowlhs, &rowrhs, NULL, rownnonz, &pos, rowinds, rowvals) );
2068 SCIPfreeBufferArray(scip, &rowinds);
2073 for (b = 0; b < nblocks; b++)
2077 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
2078 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
2079 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
2080 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
2081 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
2082 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
2083 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
2084 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
2085 blocksize = blocksizes[2 + b];
2086 matrixsize = blocksize * blocksize;
2088 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2090 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
2094 arraylength = nvars;
2095 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
2096 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval) );
2098 nroundingrows = blocksize * (blocksize + 1) * 0.5;
2100 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nroundingrows) );
2101 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nroundingrows) );
2102 SCIP_CALL( SCIPallocBufferArray(scip, &nblockrownonz , nroundingrows) );
2103 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols , nroundingrows) );
2104 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals , nroundingrows) );
2107 for (i = 0; i < nroundingrows; i++)
2112 nblockrownonz[i] = 0;
2113 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols[i], nvars + blocksize) );
2114 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals[i], nvars + blocksize) );
2118 for (i = 0; i < blockconstnnonz; i++)
2126 for (v = 0; v < blocknvars; v++)
2130 for (i = 0; i < blocknvarnonz[v]; i++)
2133 blockrowcols[pos][nblockrownonz[pos]] = varind;
2134 blockrowvals[pos][nblockrownonz[pos]] = blockval[v][i];
2135 nblockrownonz[pos]++;
2140 for (evind = 0; evind < blocksize; evind++)
2142 for (i = 0; i < blocksize; i++)
2144 for (j = 0; j <= i; j++)
2148 if ( SCIPisGT(scip, REALABS(-1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j]), 0.0) )
2151 blockrowcols[pos][nblockrownonz[pos]] = startpos + evind;
2152 blockrowvals[pos][nblockrownonz[pos]] = -1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j];
2153 nblockrownonz[pos]++;
2158 startpos += blocksize;
2162 for (r = 0; r < nroundingrows; r++)
2164 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &lhs[r], &rhs[r], NULL, nblockrownonz[r], &pos, blockrowcols[r], blockrowvals[r]) );
2165 SCIPfreeBufferArray(scip, &blockrowvals[r]);
2166 SCIPfreeBufferArray(scip, &blockrowcols[r]);
2169 SCIPfreeBufferArray(scip, &blockrowvals);
2170 SCIPfreeBufferArray(scip, &blockrowcols);
2171 SCIPfreeBufferArray(scip, &nblockrownonz);
2172 SCIPfreeBufferArray(scip, &rhs);
2173 SCIPfreeBufferArray(scip, &lhs);
2174 SCIPfreeBufferArray(scip, &fullZmatrix);
2175 SCIPfreeBufferArray(scip, &blockconstval);
2176 SCIPfreeBufferArray(scip, &blockconstrow);
2177 SCIPfreeBufferArray(scip, &blockconstcol);
2178 SCIPfreeBufferArray(scip, &blockvars);
2179 SCIPfreeBufferArray(scip, &blockval);
2180 SCIPfreeBufferArray(scip, &blockrow);
2181 SCIPfreeBufferArray(scip, &blockcol);
2182 SCIPfreeBufferArray(scip, &blocknvarnonz);
2186 SCIP_CALL( SCIPlpiSolveDual(lpi) );
2188 if ( ! SCIPlpiIsOptimal(lpi) )
2190 SCIPdebugMsg(scip,
"Solution of dual rounding problem failed with status %d, continuing without warmstart\n", SCIPlpiGetInternalStatus(lpi));
2191 relaxdata->dualroundfails++;
2194 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2195 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2196 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2197 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2198 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2199 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2200 for (b = 0; b < nblocks; b++)
2202 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2203 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2204 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2205 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2206 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2207 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2208 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2209 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2211 SCIPfreeBufferArray(scip, &blocksizes);
2212 SCIPfreeBufferArray(scip, &blockeigenvectors);
2213 SCIPfreeBufferArray(scip, &blockeigenvalues);
2214 SCIPfreeBufferArrayNull(scip, &startXval);
2215 SCIPfreeBufferArrayNull(scip, &startXcol);
2216 SCIPfreeBufferArrayNull(scip, &startXrow);
2217 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2218 SCIPfreeBufferArrayNull(scip, &startZval);
2219 SCIPfreeBufferArrayNull(scip, &startZcol);
2220 SCIPfreeBufferArrayNull(scip, &startZrow);
2221 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2222 SCIPfreeBufferArray(scip, &starty);
2225 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2228 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
2236 relaxdata->roundstartsuccess++;
2239 SCIP_CALL( SCIPallocBufferArray(scip, &optev, nvars + roundingvars) );
2240 SCIP_CALL( SCIPlpiGetSol(lpi, &dualroundobj, optev, NULL, NULL, NULL) );
2244 if ( SCIPisEQ(scip, primalroundobj, dualroundobj) )
2247 SCIP_CONS* savedcons;
2249 SCIPdebugMsg(scip,
"Node %lld solved to optimality through rounding problems with optimal objective %f\n",
2250 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), dualroundobj);
2252 relaxdata->roundingoptimal++;
2255 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2258 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
2259 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, optev) );
2261 *lowerbound = dualroundobj;
2262 relaxdata->objval = dualroundobj;
2265 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, scipsol, TRUE) );
2267 relaxdata->feasible = TRUE;
2268 *result = SCIP_SUCCESS;
2271 if ( relaxdata->warmstart )
2273 char consname[SCIP_MAXSTRLEN];
2279 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2280 assert( snprintfreturn < SCIP_MAXSTRLEN );
2282 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2284 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
2285 maxprimalentry, nblocks + 1, startXnblocknonz, startXrow, startXcol, startXval) );
2287 SCIP_CALL( SCIPaddCons(scip, savedcons) );
2288 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
2291 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
2294 SCIPfreeBufferArray(scip, &optev);
2295 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2296 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2297 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2298 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2299 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2300 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2301 for (b = 0; b < nblocks; b++)
2303 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
2304 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
2305 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2306 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2307 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2308 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2309 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2310 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2312 SCIPfreeBufferArray(scip, &blocksizes);
2313 SCIPfreeBufferArray(scip, &blockeigenvectors);
2314 SCIPfreeBufferArray(scip, &blockeigenvalues);
2315 SCIPfreeBufferArrayNull(scip, &startXval);
2316 SCIPfreeBufferArrayNull(scip, &startXcol);
2317 SCIPfreeBufferArrayNull(scip, &startXrow);
2318 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2319 SCIPfreeBufferArrayNull(scip, &startZval);
2320 SCIPfreeBufferArrayNull(scip, &startZcol);
2321 SCIPfreeBufferArrayNull(scip, &startZrow);
2322 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2323 SCIPfreeBufferArray(scip, &starty);
2329 for (v = 0; v < nvars; v++)
2331 if ( relaxdata->warmstartiptype == 1 )
2334 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v];
2336 else if ( relaxdata->warmstartiptype == 2 )
2339 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
2345 for (b = 0; b < nblocks; b++)
2347 blocksize = blocksizes[2 + b];
2348 matrixsize = blocksize * blocksize;
2350 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2356 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2360 scaledeigenvectors, FALSE, fullZmatrix) );
2363 startZnblocknonz[b] = 0;
2364 epsilon = SCIPepsilon(scip);
2365 for (r = 0; r < blocksize; r++)
2367 for (c = r; c < blocksize; c++)
2369 matrixpos = r * blocksize + c;
2370 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
2372 startZrow[b][startZnblocknonz[b]] = r;
2373 startZcol[b][startZnblocknonz[b]] = c;
2374 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
2375 startZnblocknonz[b]++;
2380 SCIPfreeBufferArray(scip, &fullZmatrix);
2381 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2382 SCIPfreeBufferArray(scip, &blockeigenvectors[b]);
2383 SCIPfreeBufferArray(scip, &blockeigenvalues[b]);
2386 SCIPfreeBufferArray(scip, &optev);
2387 SCIPfreeBufferArray(scip, &blockeigenvectors);
2388 SCIPfreeBufferArray(scip, &blockeigenvalues);
2389 SCIPfreeBufferArray(scip, &blocksizes);
2394 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
2397 for (r = 0; r < nrows; r++)
2401 rownnonz = SCIProwGetNNonz(rows[r]);
2402 rowvals = SCIProwGetVals(rows[r]);
2403 rowcols = SCIProwGetCols(rows[r]);
2405 for (i = 0; i < rownnonz; i++)
2408 startZrow[b][2*r] = 2*r;
2409 startZcol[b][2*r] = 2*r;
2410 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
2412 startZrow[b][2*r + 1] = 2*r + 1;
2413 startZcol[b][2*r + 1] = 2*r + 1;
2414 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
2418 for (v = 0; v < nvars; v++)
2420 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
2421 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
2424 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2425 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2426 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - starty[
SCIPsdpVarmapperGetSdpIndex(relaxdata->varmapper, vars[v])];
2431 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2435 if ( relaxdata->warmstartprimaltype == 3 )
2438 if ( relaxdata->warmstartproject != 4 )
2443 if ( relaxdata->warmstartproject == 3 )
2448 for (b = 0; b < nblocks; b++)
2451 matrixsize *= (matrixsize + 1) * 0.5;
2453 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
2454 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
2455 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
2458 else if ( relaxdata->warmstartiptype == 1 )
2460 for (b = 0; b < nblocks; b++)
2462 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2463 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2464 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2467 else if ( relaxdata->warmstartiptype == 2 )
2469 for (b = 0; b < nblocks; b++)
2471 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2472 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2473 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2484 if ( relaxdata->warmstartprojpdsame && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2486 identitydiagonal = 1.0;
2488 for (b = 0; b < nblocks; b++)
2490 for (i = 0; i < startZnblocknonz[b]; i++)
2492 if ( REALABS(startZval[b][i]) > identitydiagonal )
2493 identitydiagonal = REALABS(startZval[b][i]);
2495 for (i = 0; i < startXnblocknonz[b]; i++)
2497 if ( REALABS(startXval[b][i]) > identitydiagonal )
2498 identitydiagonal = REALABS(startXval[b][i]);
2501 identitydiagonal *= relaxdata->warmstartipfactor;
2504 for (b = 0; b < nblocks; b++)
2507 if ( relaxdata->warmstartproject == 3 )
2509 SCIP_Real* fullXmatrix;
2510 SCIP_Real* eigenvalues;
2511 SCIP_Real* eigenvectors;
2512 SCIP_Real* scaledeigenvectors;
2513 SCIP_Real matrixsize;
2518 matrixsize = blocksize * blocksize;
2520 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2521 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
2522 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
2524 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
2529 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
2533 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevprimal) )
2535 eigenvalues[i] = relaxdata->warmstartprojminevprimal;
2544 FALSE, fullXmatrix) );
2547 startXnblocknonz[b] = 0;
2548 epsilon = SCIPepsilon(scip);
2549 for (r = 0; r < blocksize; r++)
2551 for (c = r; c < blocksize; c++)
2553 matrixpos = r * blocksize + c;
2554 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
2556 startXrow[b][startXnblocknonz[b]] = r;
2557 startXcol[b][startXnblocknonz[b]] = c;
2558 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
2559 startXnblocknonz[b]++;
2565 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2566 SCIPfreeBufferArray(scip, &eigenvectors);
2567 SCIPfreeBufferArray(scip, &eigenvalues);
2568 SCIPfreeBufferArray(scip, &fullXmatrix);
2572 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2574 if ( relaxdata->warmstartiptype == 1 )
2577 if ( ! relaxdata->warmstartprojpdsame )
2579 if ( relaxdata->warmstartproject == 3 )
2580 maxprimalentry = relaxdata->warmstartprojminevprimal;
2582 maxprimalentry = 1.0;
2583 for (i = 0; i < startXnblocknonz[b]; i++)
2585 if ( REALABS(startXval[b][i]) > maxprimalentry )
2586 maxprimalentry = REALABS(startXval[b][i]);
2588 identitydiagonal = relaxdata->warmstartipfactor * maxprimalentry;
2592 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2593 for (i = 0; i < blocksize; i++)
2594 diagentryexists[i] = FALSE;
2596 for (i = 0; i < startXnblocknonz[b]; i++)
2598 if ( startXrow[b][i] == startXcol[b][i] )
2600 startXval[b][i] = startXval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2601 assert( startXval[b][i] >= 0.0 );
2602 diagentryexists[startXrow[b][i]] = TRUE;
2605 startXval[b][i] *= (1 - relaxdata->warmstartipfactor);
2609 for (i = 0; i < blocksize; i++)
2611 if ( ! diagentryexists[i] )
2613 startXrow[b][startXnblocknonz[b]] = i;
2614 startXcol[b][startXnblocknonz[b]] = i;
2615 startXval[b][startXnblocknonz[b]] = identitydiagonal;
2616 startXnblocknonz[b]++;
2619 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2621 else if ( relaxdata->warmstartiptype == 2 )
2624 for (i = 0; i < startXnblocknonz[b]; i++)
2625 startXval[b][i] *= 1 - relaxdata->warmstartipfactor;
2628 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), SCIPepsilon(scip), relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b], TRUE,
2629 relaxdata->warmstartipfactor, startXrow[b], startXcol[b], startXval[b], &(startXnblocknonz[b]), startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2634 for (b = 0; b < nblocks; b++)
2637 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2639 if ( relaxdata->warmstartiptype == 1 )
2641 if ( ! relaxdata->warmstartprojpdsame )
2645 for (i = 0; i < startZnblocknonz[b]; i++)
2647 if ( REALABS(startZval[b][i]) > maxdualentry )
2648 maxdualentry = REALABS(startZval[b][i]);
2650 identitydiagonal = relaxdata->warmstartipfactor * maxdualentry;
2653 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2654 for (i = 0; i < blocksize; i++)
2655 diagentryexists[i] = FALSE;
2657 for (i = 0; i < startZnblocknonz[b]; i++)
2659 if ( startZrow[b][i] == startZcol[b][i] )
2661 startZval[b][i] = startZval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2662 assert( startZval[b][i] >= 0 );
2663 diagentryexists[startZrow[b][i]] = TRUE;
2666 startZval[b][i] *= (1 - relaxdata->warmstartipfactor);
2670 for (i = 0; i < blocksize; i++)
2672 if ( ! diagentryexists[i] )
2674 startZrow[b][startZnblocknonz[b]] = i;
2675 startZcol[b][startZnblocknonz[b]] = i;
2676 startZval[b][startZnblocknonz[b]] = identitydiagonal;
2677 startZnblocknonz[b]++;
2681 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2683 else if ( relaxdata->warmstartiptype == 2 )
2686 for (i = 0; i < startZnblocknonz[b]; i++)
2687 startZval[b][i] *= 1 - relaxdata->warmstartipfactor;
2690 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), SCIPepsilon(scip), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b], TRUE,
2691 relaxdata->warmstartipfactor, startZrow[b], startZcol[b], startZval[b], &(startZnblocknonz[b]), startZnblocknonz[b] + relaxdata->ipZnblocknonz[b]) );
2697 if ( relaxdata->warmstartproject == 3 )
2704 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2707 nsavedentries = startXnblocknonz[nblocks];
2710 for (i = 0; i < nsavedentries; i++)
2712 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2714 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2716 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2717 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2718 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2719 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2720 startXnblocknonz[nblocks]++;
2722 if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2723 startXval[b][i] = relaxdata->warmstartprojminevprimal;
2725 lastentry = startXrow[nblocks][i];
2728 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2730 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2731 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2732 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2733 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2734 startXnblocknonz[nblocks]++;
2739 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2741 if ( relaxdata->warmstartiptype == 1 )
2748 if ( ! relaxdata->warmstartprojpdsame )
2749 identitydiagonal = relaxdata->warmstartipfactor;
2752 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2755 nsavedentries = startXnblocknonz[nblocks];
2758 for (i = 0; i < nsavedentries; i++)
2760 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2762 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2764 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2765 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2766 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2768 if ( relaxdata->warmstartprojpdsame )
2769 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2771 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartipfactor;
2772 startXnblocknonz[nblocks]++;
2777 if ( relaxdata->warmstartprojpdsame )
2778 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + identitydiagonal;
2779 else if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2780 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + relaxdata->warmstartipfactor;
2782 lastentry = startXrow[nblocks][i];
2785 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2787 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2788 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2789 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2790 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2791 startXnblocknonz[nblocks]++;
2794 else if ( relaxdata->warmstartiptype == 2 )
2797 for (i = 0; i < startXnblocknonz[nblocks]; i++)
2798 startXval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
2802 relaxdata->ipXcol[nblocks], relaxdata->ipXval[nblocks], relaxdata->ipXnblocknonz[nblocks], TRUE,
2803 relaxdata->warmstartipfactor, startXrow[nblocks], startXcol[nblocks], startXval[nblocks],
2804 &(startXnblocknonz[nblocks]), startXnblocknonz[nblocks] + relaxdata->ipXnblocknonz[nblocks]) );
2808 if ( relaxdata->warmstartiptype == 1 )
2810 for (r = 0; r < nrows; r++)
2813 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
2814 startZval[nblocks][2*r] = relaxdata->warmstartprojminevdual;
2818 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r], 1.0) || relaxdata->warmstartprojpdsame) )
2821 if ( SCIPisLT(scip, startZval[nblocks][2*r], 0.0) )
2822 startZval[nblocks][2*r] = identitydiagonal;
2824 startZval[nblocks][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r] + identitydiagonal;
2827 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*r + 1], relaxdata->warmstartprojminevdual) )
2828 startZval[nblocks][2*r + 1] = relaxdata->warmstartprojminevdual;
2829 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r + 1], 1.0) || relaxdata->warmstartprojpdsame) )
2832 if ( SCIPisLT(scip, startZval[nblocks][2*r + 1], 0.0) )
2833 startZval[nblocks][2*r + 1] = identitydiagonal;
2835 startZval[nblocks][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r + 1] + identitydiagonal;
2839 for (v = 0; v < nvars; v++)
2841 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
2842 startZval[nblocks][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
2843 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 1.0) || relaxdata->warmstartprojpdsame) )
2846 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 0.0) )
2847 startZval[nblocks][2*nrows + 2*v] = identitydiagonal;
2849 startZval[nblocks][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v] + identitydiagonal;
2852 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
2853 startZval[nblocks][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
2854 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 1.0) || relaxdata->warmstartprojpdsame) )
2857 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 0.0) )
2858 startZval[nblocks][2*nrows + 2*v + 1] = identitydiagonal;
2860 startZval[nblocks][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v + 1] + identitydiagonal;
2864 else if ( relaxdata->warmstartiptype == 2 )
2867 for (i = 0; i < startZnblocknonz[nblocks]; i++)
2868 startZval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
2872 relaxdata->ipZcol[nblocks], relaxdata->ipZval[nblocks], relaxdata->ipZnblocknonz[nblocks], TRUE,
2873 relaxdata->warmstartipfactor, startZrow[nblocks], startZcol[nblocks], startZval[nblocks],
2874 &(startZnblocknonz[nblocks]), startZnblocknonz[nblocks] + relaxdata->ipZnblocknonz[nblocks]) );
2879 #ifdef SCIP_PRINT_WARMSTART
2880 SCIPdebugMessage(
"warmstart using the following point:\n");
2881 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP"));
2882 for (i = 0; i < nvars; i++)
2883 SCIPdebugMessage(
"y[%d]=%f\n", i, starty[i]);
2887 for (b = 0; b < nblocks + 1; b++)
2889 SCIPdebugMessage(
"dual block %d\n", b);
2890 for (i = 0; i < startZnblocknonz[b]; i++)
2892 SCIPdebugMessage(
"Z(%d,%d)=%f\n", startZrow[b][i], startZcol[b][i], startZval[b][i]);
2895 for (b = 0; b < nblocks + 1; b++)
2897 SCIPdebugMessage(
"primal block %d\n", b);
2898 for (i = 0; i < startXnblocknonz[b]; i++)
2900 SCIPdebugMessage(
"X(%d,%d)=%f\n", startXrow[b][i], startXcol[b][i], startXval[b][i]);
2907 SCIP_CALL(
SCIPsdpiSolve(sdpi, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow,
2908 startXcol, startXval, startsetting, enforceslater, timelimit));
2912 SCIP_CONSHDLR* sdpconshdlr;
2914 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
2915 nblocks = SCIPconshdlrGetNConss(sdpconshdlr) + 1;
2918 for (b = 0; b < nblocks; b++)
2920 SCIPfreeBufferArray(scip, &startXval[b]);
2921 SCIPfreeBufferArray(scip, &startXcol[b]);
2922 SCIPfreeBufferArray(scip, &startXrow[b]);
2923 SCIPfreeBufferArray(scip, &startZval[b]);
2924 SCIPfreeBufferArray(scip, &startZcol[b]);
2925 SCIPfreeBufferArray(scip, &startZrow[b]);
2928 SCIPfreeBufferArray(scip, &startXval);
2929 SCIPfreeBufferArray(scip, &startXcol);
2930 SCIPfreeBufferArray(scip, &startXrow);
2931 SCIPfreeBufferArray(scip, &startXnblocknonz);
2932 SCIPfreeBufferArray(scip, &startZval);
2933 SCIPfreeBufferArray(scip, &startZcol);
2934 SCIPfreeBufferArray(scip, &startZrow);
2935 SCIPfreeBufferArray(scip, &startZnblocknonz);
2937 SCIPfreeBufferArray(scip, &starty);
2943 relaxdata->lastsdpnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
2946 relaxdata->sdpinterfacecalls++;
2950 if ( naddedsdpcalls )
2952 relaxdata->sdpcalls += naddedsdpcalls;
2955 relaxdata->sdpiterations += naddediters;
2959 switch( usedsetting )
2962 relaxdata->solvedpenalty++;
2965 relaxdata->solvedfast++;
2968 relaxdata->solvedmedium++;
2971 relaxdata->solvedstable++;
2974 relaxdata->unsolved++;
2981 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
2982 switch( primalslater )
2985 relaxdata->npslatercheckfailed++;
2986 switch( dualslater )
2989 relaxdata->ndslatercheckfailed++;
2990 relaxdata->nslatercheckfailed++;
2993 relaxdata->ndnoslater++;
2994 relaxdata->nnoslater++;
2997 relaxdata->ndslaterholds++;
2998 relaxdata->nslatercheckfailed++;
3001 relaxdata->nslaterinfeasible++;
3004 relaxdata->ndslatercheckfailed++;
3005 relaxdata->nslatercheckfailed++;
3010 relaxdata->npnoslater++;
3011 switch( dualslater )
3014 relaxdata->ndslatercheckfailed++;
3015 relaxdata->nnoslater++;
3018 relaxdata->ndnoslater++;
3019 relaxdata->nnoslater++;
3022 relaxdata->ndslaterholds++;
3023 relaxdata->nnoslater++;
3026 relaxdata->nslaterinfeasible++;
3029 relaxdata->ndslatercheckfailed++;
3030 relaxdata->nnoslater++;
3035 relaxdata->npslaterholds++;
3036 switch( dualslater )
3039 relaxdata->ndslatercheckfailed++;
3040 relaxdata->nslatercheckfailed++;
3043 relaxdata->ndnoslater++;
3044 relaxdata->nnoslater++;
3047 relaxdata->ndslaterholds++;
3048 relaxdata->nslaterholds++;
3051 relaxdata->nslaterinfeasible++;
3054 relaxdata->ndslatercheckfailed++;
3055 relaxdata->nslatercheckfailed++;
3060 relaxdata->npslatercheckfailed++;
3061 relaxdata->ndslatercheckfailed++;
3062 relaxdata->nslatercheckfailed++;
3067 switch( slatersetting )
3070 relaxdata->stablewslater++;
3073 relaxdata->unstablewslater++;
3076 relaxdata->penaltywslater++;
3079 relaxdata->boundedwslater++;
3082 relaxdata->unsolvedwslater++;
3085 relaxdata->stablenoslater++;
3088 relaxdata->unstablenoslater++;
3091 relaxdata->penaltynoslater++;
3094 relaxdata->boundednoslater++;
3097 relaxdata->unsolvednoslater++;
3100 relaxdata->stableinfeasible++;
3103 relaxdata->unstableinfeasible++;
3106 relaxdata->penaltyinfeasible++;
3109 relaxdata->boundedinfeasible++;
3112 relaxdata->unsolvedinfeasible++;
3122 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3124 SCIP_CALL( SCIPaddCons(scip, savedsetting) );
3125 SCIP_CALL( SCIPreleaseCons(scip, &savedsetting) );
3129 relaxdata->feasible = FALSE;
3131 if ( SCIPinProbing(scip) )
3138 #ifdef SCIP_MORE_DEBUG
3141 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3143 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &sollength) );
3145 assert( sollength == nvars );
3150 SCIPdebugMessage(
"optimal solution: objective = %f, dual feasible: %u, primal feasible: %u.\n",
3155 SCIPdebugMessage(
"The solver could not determine feasibility ! ");
3159 for (i = 0; i < nvars; ++i)
3161 SCIPdebugMessage(
"<%s> = %f\n", SCIPvarGetName(vars[i]), solforscip[i]);
3163 SCIPfreeBufferArray(scip, &solforscip);
3169 SCIPdebugMessage(
"Node cut off due to infeasibility.\n");
3170 relaxdata->feasible = FALSE;
3171 *result = SCIP_CUTOFF;
3176 SCIPdebugMessage(
"Node cut off due to objective limit.\n");
3177 relaxdata->feasible = FALSE;
3178 *result = SCIP_CUTOFF;
3183 SCIPdebugMessage(
"Node unbounded.");
3184 relaxdata->feasible = TRUE;
3185 *result = SCIP_SUCCESS;
3186 *lowerbound = -SCIPinfinity(scip);
3192 SCIP_SOL* preoptimalsol;
3193 SCIP_CONS* savedcons;
3195 SCIP_Bool preoptimalsolsuccess;
3198 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3200 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &slength) );
3202 assert( slength == nvars );
3206 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3207 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, solforscip) );
3209 *lowerbound = objforscip;
3210 relaxdata->objval = objforscip;
3213 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3215 relaxdata->feasible = TRUE;
3216 *result = SCIP_SUCCESS;
3217 preoptimalsolsuccess = FALSE;
3222 SCIP_Real maxprimalentry;
3223 int* startXnblocknonz;
3226 SCIP_Real** startXval;
3227 char consname[SCIP_MAXSTRLEN];
3232 startXnblocknonz = NULL;
3238 if ( relaxdata->warmstartpreoptsol )
3242 SCIP_Real* preoptimalvec;
3245 SCIP_CALL( SCIPallocBufferArray(scip, &preoptimalvec, nvars) );
3250 maxprimalentry = 0.0;
3251 if ( relaxdata->warmstartprimaltype == 3 )
3253 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3254 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3260 if ( startXnblocknonz[0] > -1 )
3262 preoptimalsolsuccess = TRUE;
3264 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3265 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3266 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3269 for (b = 0; b < nblocks; b++)
3271 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3272 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3273 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3277 nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3280 preoptimalsolsuccess = FALSE;
3290 maxprimalentry = 0.0;
3292 -1, NULL, NULL, NULL, NULL) );
3296 if ( preoptimalsolsuccess )
3298 assert( nvarsgiven == nvars );
3301 SCIP_CALL( SCIPcreateSol(scip, &preoptimalsol, NULL) );
3302 SCIP_CALL( SCIPsetSolVals(scip, preoptimalsol, nvars, vars, preoptimalvec) );
3305 SCIPfreeBufferArray(scip, &preoptimalvec);
3309 SCIPerrorMessage(
"Warmstarting with preoptimal solutions currently only supported for DSDP and SDPA \n");
3310 return SCIP_LPERROR;
3315 maxprimalentry = 0.0;
3316 if ( relaxdata->warmstartprimaltype == 3 )
3318 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3319 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3320 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3321 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3322 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3328 for (b = 0; b < nblocks; b++)
3330 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3331 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3332 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3344 maxprimalentry = 0.0;
3348 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3349 assert( snprintfreturn < SCIP_MAXSTRLEN );
3351 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3353 if ( relaxdata->warmstartpreoptsol )
3356 if ( preoptimalsolsuccess )
3358 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), preoptimalsol,
3359 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3361 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3362 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3367 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
3368 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3370 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3371 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3377 if ( startXnblocknonz[0] > 1 )
3379 for (b = 0; b < nblocks; b++)
3381 SCIPfreeBufferArrayNull(scip, &startXval[b]);
3382 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
3383 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
3385 SCIPfreeBufferArrayNull(scip, &startXval);
3386 SCIPfreeBufferArrayNull(scip, &startXcol);
3387 SCIPfreeBufferArrayNull(scip, &startXrow);
3389 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
3393 SCIPfreeBufferArray(scip, &solforscip);
3394 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3395 if ( preoptimalsolsuccess )
3397 SCIP_CALL( SCIPfreeSol(scip, &preoptimalsol) );
3407 *result = SCIP_DIDNOTRUN;
3413 objlb = -SCIPinfinity(scip);
3415 if ( ! SCIPisInfinity(scip, objlb) )
3417 *lowerbound = objlb;
3418 SCIPdebugMessage(
"The relaxation could not be solved, using best computed bound from penalty formulation.\n");
3420 else if ( ! SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip))) )
3422 *lowerbound = SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip));
3423 SCIPdebugMessage(
"The relaxation could not be solved, keeping old bound.\n");
3427 *result = SCIP_SUSPENDED;
3428 SCIPerrorMessage(
"The relaxation of the root node could not be solved, so there is no hope to solve this instance.\n");
3432 *result = SCIP_SUCCESS;
3448 assert( scip != NULL );
3450 vars = SCIPgetVars(scip);
3453 for (i = 0; i < SCIPgetNVars(scip); i++)
3455 if ( SCIPisLT(scip, SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i])) )
3467 SCIP_RELAXDATA* relaxdata;
3475 #ifdef SCIP_EVEN_MORE_DEBUG
3476 SCIP_VAR** varsfordebug = SCIPgetVars(scip);
3477 const int nvarsfordebug = SCIPgetNVars(scip);
3480 SCIPdebugMessage(
"Calling relaxExecSdp.\n");
3482 relaxdata = SCIPrelaxGetData(relax);
3483 vars = SCIPgetVars(scip);
3484 nvars = SCIPgetNVars(scip);
3487 if ( (relaxdata->lastsdpnode == SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) && ( ! SCIPinProbing(scip) ) ) && relaxdata->origsolved && ! relaxdata->resolve )
3490 SCIP_Real objforscip;
3491 SCIP_Real* solforscip;
3495 SCIPdebugMessage(
"Already solved SDP-relaxation for node %ld, returning with SCIP_SUCCESS so that no other relaxator is called.\n",
3496 SCIPrelaxGetData(relax)->lastsdpnode);
3500 relaxdata->feasible = TRUE;
3501 *result = SCIP_SUCCESS;
3502 *lowerbound = -SCIPinfinity(scip);
3507 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3509 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, &objforscip, solforscip, &slength) );
3511 assert( slength == nvars );
3515 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3516 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3518 *lowerbound = objforscip;
3521 SCIP_CALL( SCIPgetLPColsData(scip, &cols, &ncols) );
3522 for (i = 0; i < ncols; i++)
3524 SCIP_CALL( SCIPsetRelaxSolVal(scip, SCIPcolGetVar(cols[i]), SCIPgetSolVal(scip, scipsol, SCIPcolGetVar(cols[i]))) );
3527 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3528 *result = SCIP_SUCCESS;
3530 SCIPfreeBufferArray(scip, &solforscip);
3531 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3533 *result = SCIP_SUCCESS;
3538 relaxdata->origsolved = FALSE;
3541 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
3545 relaxdata->feasible = FALSE;
3546 *result = SCIP_CUTOFF;
3551 SCIP_CALL( SCIPflushLP(scip) );
3554 nconss = SCIPgetNConss(scip);
3556 #ifdef SCIP_EVEN_MORE_DEBUG
3557 for (i = 0; i < nvarsfordebug; i++)
3559 SCIPdebugMessage(
"variable %s: status = %u, integral = %u, bounds = [%f, %f] \n", SCIPvarGetName(varsfordebug[i]), SCIPvarGetStatus(varsfordebug[i]),
3560 SCIPvarIsIntegral(varsfordebug[i]), SCIPvarGetLbLocal(varsfordebug[i]), SCIPvarGetUbLocal(varsfordebug[i]));
3567 relaxdata->feasible = TRUE;
3568 *result = SCIP_DIDNOTRUN;
3578 SCIP_CALL( SCIPallocBufferArray(scip, &ubs, nvars) );
3581 for (i = 0; i < nvars; i++)
3583 ubs[i] = SCIPvarGetUbLocal(vars[i]);
3584 *lowerbound += SCIPvarGetObj(vars[i]) * ubs[i];
3585 assert( SCIPisFeasEQ(scip, SCIPvarGetUbLocal(vars[i]), SCIPvarGetLbLocal(vars[i])));
3588 SCIPdebugMessage(
"EVERYTHING IS FIXED, objective value = %f\n", *lowerbound);
3590 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3591 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, ubs) );
3594 for (i = 0; i < nvars; i++)
3596 SCIP_CALL( SCIPsetRelaxSolVal(scip, vars[i], SCIPvarGetLbLocal(vars[i])) );
3598 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3601 SCIP_CALL( SCIPcheckSol(scip, scipsol, FALSE, TRUE, TRUE, TRUE, TRUE, &feasible) );
3603 relaxdata->feasible = feasible;
3605 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3607 SCIPfreeBufferArray(scip, &ubs);
3609 *result = SCIP_SUCCESS;
3616 SCIP_CALL(
calcRelax(scip, relaxdata, result, lowerbound));
3627 SCIP_RELAXDATA* relaxdata;
3628 SCIP_RETCODE retcode;
3632 SCIP_Real penaltyparam;
3633 SCIP_Real maxpenaltyparam;
3635 SCIP_Real peninfeasadjust;
3637 SCIP_Real givenpenaltyparam;
3638 SCIP_Real projminevprimal;
3639 SCIP_Real projminevdual;
3640 SCIP_Real preoptgap;
3645 assert( relax != NULL );
3647 relaxdata = SCIPrelaxGetData(relax);
3648 assert( relaxdata != NULL );
3650 relaxdata->objval = 0.0;
3651 relaxdata->origsolved = FALSE;
3652 relaxdata->probingsolved = FALSE;
3653 relaxdata->sdpcalls = 0;
3654 relaxdata->sdpinterfacecalls = 0;
3655 relaxdata->sdpiterations = 0;
3656 relaxdata->solvedfast = 0;
3657 relaxdata->solvedmedium = 0;
3658 relaxdata->solvedstable = 0;
3659 relaxdata->solvedpenalty = 0;
3660 relaxdata->stablewslater = 0;
3661 relaxdata->unstablewslater = 0;
3662 relaxdata->boundedwslater = 0;
3663 relaxdata->unsolvedwslater = 0;
3664 relaxdata->stablenoslater = 0;
3665 relaxdata->unsolvednoslater = 0;
3666 relaxdata->boundednoslater = 0;
3667 relaxdata->unsolvednoslater = 0;
3668 relaxdata->nslaterholds = 0;
3669 relaxdata->nnoslater = 0;
3670 relaxdata->nslatercheckfailed = 0;
3671 relaxdata->npslaterholds = 0;
3672 relaxdata->npnoslater = 0;
3673 relaxdata->npslatercheckfailed = 0;
3674 relaxdata->ndslaterholds = 0;
3675 relaxdata->ndnoslater = 0;
3676 relaxdata->ndslatercheckfailed = 0;
3677 relaxdata->nslaterinfeasible = 0;
3678 relaxdata->stableinfeasible = 0;
3679 relaxdata->unstableinfeasible = 0;
3680 relaxdata->penaltyinfeasible = 0;
3681 relaxdata->boundedinfeasible = 0;
3682 relaxdata->unsolvedinfeasible = 0;
3683 relaxdata->roundingprobinf = 0;
3684 relaxdata->primalroundfails = 0;
3685 relaxdata->dualroundfails = 0;
3686 relaxdata->roundstartsuccess = 0;
3687 relaxdata->roundingoptimal = 0;
3688 relaxdata->roundingcutoff = 0;
3689 relaxdata->roundingprobtime = 0.0;
3690 relaxdata->unsolved = 0;
3691 relaxdata->feasible = FALSE;
3693 nvars = SCIPgetNVars(scip);
3694 vars = SCIPgetVars(scip);
3706 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", &gaptol) );
3708 if ( retcode == SCIP_PARAMETERUNKNOWN )
3710 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3711 "SDP Solver <%s>: gaptol setting not available -- SCIP parameter has no effect.\n",
3716 SCIP_CALL( retcode );
3719 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolverfeastol", &feastol) );
3721 if ( retcode == SCIP_PARAMETERUNKNOWN )
3723 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3724 "SDP Solver <%s>: sdpsolverfeastol setting not available -- SCIP parameter has no effect.\n",
3729 SCIP_CALL( retcode );
3733 if ( retcode == SCIP_PARAMETERUNKNOWN )
3735 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3736 "SDP Solver <%s>: epsilon setting not available -- SCIP parameter has no effect.\n",
3741 SCIP_CALL( retcode );
3745 if ( retcode == SCIP_PARAMETERUNKNOWN )
3747 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3748 "SDP Solver <%s>: feastol setting not available -- SCIP parameter has no effect.\n",
3753 SCIP_CALL( retcode );
3757 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/penaltyparam", &penaltyparam) );
3758 if ( SCIPisGE(scip, penaltyparam, 0.0) )
3761 givenpenaltyparam = penaltyparam;
3762 if ( retcode == SCIP_PARAMETERUNKNOWN )
3764 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3765 "SDP Solver <%s>: penaltyparam setting not available -- SCIP parameter has no effect\n",
3770 SCIP_CALL( retcode );
3780 for (v = 0; v < nvars; v++)
3782 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxcoeff) )
3783 maxcoeff = REALABS(SCIPvarGetObj(vars[v]));
3790 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/maxpenaltyparam", &maxpenaltyparam) );
3791 if ( SCIPisGE(scip, maxpenaltyparam, 0.0) )
3795 if ( retcode == SCIP_PARAMETERUNKNOWN )
3797 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3798 "SDP Solver <%s>: maxpenaltyparam setting not available -- SCIP parameter has no effect.\n",
3803 SCIP_CALL( retcode );
3807 if ( SCIPisLT(scip, givenpenaltyparam, maxpenaltyparam) )
3809 SCIPdebugMessage(
"Penalty parameter %f overwritten by maxpenaltyparam %f! \n", givenpenaltyparam, maxpenaltyparam);
3815 SCIP_Real givenmaxpenaltyparam;
3821 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/npenaltyincr", &npenaltyincr) );
3823 if ( retcode == SCIP_PARAMETERUNKNOWN )
3825 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3826 "SDP Solver <%s>: npenaltyincr setting not available -- SCIP parameter has no effect.\n",
3831 SCIP_CALL( retcode );
3835 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/peninfeasadjust", &peninfeasadjust) );
3838 if ( retcode == SCIP_PARAMETERUNKNOWN )
3840 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3841 "SDP Solver <%s>: peninfeasadjust setting not available -- SCIP parameter has no effect.\n",
3846 SCIP_CALL( retcode );
3853 SCIP_Real lambdastar;
3855 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/lambdastar", &lambdastar) );
3856 if ( SCIPisGE(scip, lambdastar, 0.0) )
3869 conss = SCIPgetConss(scip);
3870 nconss = SCIPgetNConss(scip);
3873 for (c = 0; c < nconss; c++)
3876 if ( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0 )
3879 if ( (! SCIPisInfinity(scip, maxguess) ) && SCIPisGT(scip, guess, maxguess) )
3889 relaxdata->lambdastar = 1.0;
3891 if ( retcode == SCIP_PARAMETERUNKNOWN )
3893 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3894 "SDP Solver <%s>: lambdastar setting not available -- SCIP parameter has no effect.\n",
3899 SCIP_CALL( retcode );
3903 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevpri", &projminevprimal) );
3904 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevdu", &projminevdual) );
3906 if ( SCIPisGE(scip, projminevprimal, 0.0) && SCIPisGE(scip, projminevdual, 0.0) )
3908 relaxdata->warmstartprojminevprimal = projminevprimal;
3909 relaxdata->warmstartprojminevdual = projminevdual;
3911 else if ( SCIPisGE(scip, projminevprimal, 0.0) && relaxdata->warmstartprojpdsame )
3913 relaxdata->warmstartprojminevprimal = projminevprimal;
3914 relaxdata->warmstartprojminevdual = projminevprimal;
3916 else if ( SCIPisGE(scip, projminevdual, 0.0) && relaxdata->warmstartprojpdsame )
3918 relaxdata->warmstartprojminevprimal = projminevdual;
3919 relaxdata->warmstartprojminevdual = projminevdual;
3923 SCIP_CONSHDLR* sdpconshdlr;
3924 SCIP_CONS** sdpblocks;
3928 SCIP_Real maxsdprhs;
3930 SCIP_Real maxsdpcoef;
3935 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
3936 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
3937 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
3941 for (b = 0; b < nsdpblocks; b++)
3944 if ( SCIPisGT(scip, sdpcoef, maxsdpcoef) )
3945 maxsdpcoef = sdpcoef;
3951 for (b = 0; b < nsdpblocks; b++)
3959 for (v = 0; v < nvars; v++)
3961 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxobj) )
3962 maxobj = REALABS(SCIPvarGetObj(vars[v]));
3965 if ( relaxdata->warmstartprojpdsame )
3967 maxval = SCIPisGT(scip, maxsdprhs, maxobj) ? maxsdprhs : maxobj;
3968 maxval = SCIPisGT(scip, maxsdpcoef, maxval) ? maxsdpcoef : maxval;
3973 SCIPdebugMsg(scip,
"Setting warmstartprojminev to %f\n", relaxdata->warmstartprojminevdual);
3977 if ( ! SCIPisGE(scip, projminevprimal, 0.0) )
3981 SCIPdebugMsg(scip,
"Setting warmstartprojminevprimal to %f\n", relaxdata->warmstartprojminevprimal);
3984 if ( ! SCIPisGE(scip, projminevdual, 0.0) )
3988 SCIPdebugMsg(scip,
"Setting warmstartprojminevdual to %f\n", relaxdata->warmstartprojminevdual);
3993 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/sdpinfo", &sdpinfo) );
3995 if ( retcode == SCIP_PARAMETERUNKNOWN )
3997 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3998 "SDP Solver <%s>: sdpinfo setting not available -- SCIP parameter has no effect.\n",
4003 SCIP_CALL( retcode );
4006 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/sdpsolverthreads", &nthreads) );
4011 if ( retcode == SCIP_PARAMETERUNKNOWN )
4013 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4014 "SDP Solver <%s>: nthreads setting not available -- SCIP parameter has no effect.\n",
4019 SCIP_CALL( retcode );
4023 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/slatercheck", &slatercheck) );
4025 if ( retcode == SCIP_PARAMETERUNKNOWN )
4027 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4028 "SDP Solver <%s>: slatercheck setting not available -- SCIP parameter has no effect.\n",
4033 SCIP_CALL( retcode );
4042 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartpreoptgap", &preoptgap) );
4044 if ( retcode == SCIP_PARAMETERUNKNOWN )
4046 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4047 "SDP Solver <%s>: warmstartpreoptgap setting not available -- SCIP parameter has no effect.\n",
4052 SCIP_CALL( retcode );
4063 assert( scip != NULL );
4064 assert( relax != NULL );
4065 assert( strcmp(SCIPrelaxGetName(relax),
RELAX_NAME) == 0 );
4076 SCIP_RELAXDATA* relaxdata;
4078 assert( scip != NULL );
4079 assert( relax != NULL );
4081 relaxdata = SCIPrelaxGetData(relax);
4082 assert( relaxdata != NULL );
4084 SCIPdebugMessage(
"Exiting Relaxation Handler.\n");
4086 if ( relaxdata->displaystat && SCIPgetSubscipDepth(scip) == 0 )
4088 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"\nSDP iterations:\t\t\t\t%6d\n", relaxdata->sdpiterations);
4089 if ( relaxdata->sdpcalls )
4091 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Average SDP-iterations:\t\t\t%6.2f \n", (SCIP_Real) relaxdata->sdpiterations / (SCIP_Real) relaxdata->sdpcalls );
4093 if ( relaxdata->sdpinterfacecalls )
4097 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4098 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'medium settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedmedium / (SCIP_Real) relaxdata->sdpinterfacecalls);
4099 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedstable / (SCIP_Real) relaxdata->sdpinterfacecalls);
4103 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'default formulation' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4105 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage penalty formulation used:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedpenalty / (SCIP_Real) relaxdata->sdpinterfacecalls);
4106 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage unsolved even with penalty:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->unsolved / (SCIP_Real) relaxdata->sdpinterfacecalls);
4108 if ( relaxdata->slatercheck )
4110 if ( relaxdata->sdpinterfacecalls )
4112 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition held:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4113 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition did not hold:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4114 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater check failed:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4116 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition held:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4117 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition did not hold:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4118 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check failed:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4119 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check detected infeasibility:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->nslaterinfeasible / (SCIP_Real) relaxdata->sdpinterfacecalls);
4121 if ( relaxdata->nslaterholds )
4123 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with primal and dual slater holding:\t%6.2f \n",
4124 100.0 * (SCIP_Real) relaxdata->stablewslater / (SCIP_Real) relaxdata->nslaterholds);
4125 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with primal and dual slater holding:\t%6.2f \n",
4126 100.0 * (SCIP_Real) relaxdata->unstablewslater / (SCIP_Real) relaxdata->nslaterholds);
4127 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with primal and dual slater holding:\t%6.2f \n",
4128 100.0 * (SCIP_Real) relaxdata->penaltywslater / (SCIP_Real) relaxdata->nslaterholds);
4129 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with primal and dual slater holding:\t%6.2f \n",
4130 100.0 * (SCIP_Real) relaxdata->boundedwslater / (SCIP_Real) relaxdata->nslaterholds);
4131 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with primal and dual slater holding:\t%6.2f \n",
4132 100.0 * (SCIP_Real) relaxdata->unsolvedwslater / (SCIP_Real) relaxdata->nslaterholds);
4134 if ( relaxdata->nnoslater )
4136 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with either primal or dual slater not holding:\t%6.2f \n",
4137 100.0 * (SCIP_Real) relaxdata->stablenoslater / (SCIP_Real) relaxdata->nnoslater);
4138 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with either primal or dual slater not holding:\t%6.2f \n",
4139 100.0 * (SCIP_Real) relaxdata->unstablenoslater / (SCIP_Real) relaxdata->nnoslater);
4140 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with either primal or dual slater not holding:\t%6.2f \n",
4141 100.0 * (SCIP_Real) relaxdata->penaltynoslater / (SCIP_Real) relaxdata->nnoslater);
4142 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with either primal or dual slater not holding:\t%6.2f \n",
4143 100.0 * (SCIP_Real) relaxdata->boundednoslater / (SCIP_Real) relaxdata->nnoslater);
4144 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with either primal or dual slater not holding:\t%6.2f \n",
4145 100.0 * (SCIP_Real) relaxdata->unsolvednoslater / (SCIP_Real) relaxdata->nnoslater);
4147 if ( relaxdata->nslaterinfeasible )
4149 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with slater check showing infeasibility:\t%6.2f \n",
4150 100.0 * (SCIP_Real) relaxdata->stableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4151 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with slater check showing infeasibility:\t%6.2f \n",
4152 100.0 * (SCIP_Real) relaxdata->unstableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4153 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with slater check showing infeasibility:\t%6.2f \n",
4154 100.0 * (SCIP_Real) relaxdata->penaltyinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4155 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with slater check showing infeasibility:\t%6.2f \n",
4156 100.0 * (SCIP_Real) relaxdata->boundedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4157 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with slater check showing infeasibility:\t%6.2f \n",
4158 100.0 * (SCIP_Real) relaxdata->unsolvedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4160 #ifdef SLATERSOLVED_ABSOLUTE
4161 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with primal and dual slater holding:\t%d \n", relaxdata->nslaterholds);
4162 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and primal and dual slater holding:\t%d \n", relaxdata->stablewslater);
4163 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and primal and dual slater holding:\t%d \n", relaxdata->unstablewslater);
4164 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and primal and dual slater holding:\t%d \n", relaxdata->penaltywslater);
4165 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'computed infeasible lower bound' and primal and dual slater holding:\t%d \n", relaxdata->boundedwslater);
4166 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and primal and dual slater holding:\t%d \n", relaxdata->unsolvedwslater);
4168 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with either primal or dual slater not holding:\t%d \n", relaxdata->nnoslater);
4169 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and either primal or dual slater not holding:\t%d \n", relaxdata->stablenoslater);
4170 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and either primal or dual slater not holding:\t%d \n", relaxdata->unstablenoslater);
4171 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and either primal or dual slater not holding:\t%d \n", relaxdata->penaltynoslater);
4172 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'computed infeasible lower bound' and either primal or dual slater not holding:\t%d \n", relaxdata->boundednoslater);
4173 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and either primal or dual slater not holding:\t%d \n", relaxdata->unsolvednoslater);
4175 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes:\t%d \n", relaxdata->nslaterinfeasible);
4176 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'fastest settings':\t%d \n", relaxdata->stableinfeasible);
4177 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'stable settings':\t%d \n", relaxdata->unstableinfeasible);
4178 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'penalty':\t%d \n", relaxdata->penaltyinfeasible);
4179 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'computed infeasible lower bound':\t%d \n", relaxdata->boundedinfeasible);
4180 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'unsolved':\t%d \n", relaxdata->unsolvedinfeasible);
4183 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4185 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes detected infeasible through primal rounding problem:\t%d \n", relaxdata->roundingprobinf);
4186 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes that were successfully warmstarted using the rounding problems:\t%d \n", relaxdata->roundstartsuccess);
4187 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the primal rounding problem failed:\t%d \n", relaxdata->primalroundfails);
4188 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the dual rounding problem failed:\t%d \n", relaxdata->dualroundfails);
4189 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the optimal solution was determined by the rounding problem:\t%d \n", relaxdata->roundingoptimal);
4190 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes cut off through bounding by the rounding problem:\t%d \n", relaxdata->roundingcutoff);
4191 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Time spent in rounding problems for warmstarting / detecting infeasibility:\t%f s \n", relaxdata->roundingprobtime);
4195 if ( relaxdata->varmapper != NULL )
4198 relaxdata->varmapper = NULL;
4202 if ( relaxdata->warmstart && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->nblocks > 0 )
4206 for (b = 0; b < relaxdata->nblocks; b++)
4210 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXval[b]), relaxdata->ipXnblocknonz[b]);
4211 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXcol[b]), relaxdata->ipXnblocknonz[b]);
4212 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXrow[b]), relaxdata->ipXnblocknonz[b]);
4214 if ( relaxdata->ipZnblocknonz[b] > 0 )
4216 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZval[b]), relaxdata->ipZnblocknonz[b]);
4217 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZcol[b]), relaxdata->ipZnblocknonz[b]);
4218 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZrow[b]), relaxdata->ipZnblocknonz[b]);
4223 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXval, relaxdata->nblocks);
4224 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXcol, relaxdata->nblocks);
4225 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXrow, relaxdata->nblocks);
4226 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks);
4228 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZval, relaxdata->nblocks);
4229 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZcol, relaxdata->nblocks);
4230 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZrow, relaxdata->nblocks);
4231 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks);
4232 SCIP_CALL( SCIPfreeSol(scip, &relaxdata->ipy) );
4235 relaxdata->objval = 0.0;
4236 relaxdata->origsolved = FALSE;
4237 relaxdata->probingsolved = FALSE;
4238 relaxdata->feasible = FALSE;
4239 relaxdata->sdpiterations = 0;
4240 relaxdata->sdpcalls = 0;
4241 relaxdata->sdpinterfacecalls = 0;
4242 relaxdata->lastsdpnode = 0;
4243 relaxdata->unsolved = 0;
4253 SCIP_RELAXDATA* relaxdata;
4255 relaxdata = SCIPrelaxGetData(relax);
4256 assert(relaxdata != NULL);
4258 if ( relaxdata->sdpi != NULL )
4262 if ( relaxdata->lpi != NULL )
4264 SCIP_CALL( SCIPlpiFree(&(relaxdata->lpi)) );
4267 SCIPfreeMemory(scip, &relaxdata);
4269 SCIPrelaxSetData(relax, NULL);
4279 SCIP_RELAXDATA* relaxdata = NULL;
4284 assert( scip != NULL );
4287 SCIP_CALL( SCIPallocMemory(scip, &relaxdata) );
4288 SCIP_CALL(
SCIPsdpiCreate(&sdpi, SCIPgetMessagehdlr(scip), SCIPblkmem(scip), SCIPbuffer(scip)) );
4289 SCIP_CALL( SCIPlpiCreate(&lpi, SCIPgetMessagehdlr(scip),
"SDProundingProb", SCIP_OBJSEN_MINIMIZE) );
4291 relaxdata->sdpi = sdpi;
4292 relaxdata->lpi = lpi;
4293 relaxdata->lastsdpnode = -1;
4294 relaxdata->nblocks = 0;
4295 relaxdata->ipXexists = FALSE;
4296 relaxdata->ipZexists = FALSE;
4297 relaxdata->varmapper = NULL;
4301 assert( relax != NULL );
4304 SCIP_CALL( SCIPsetRelaxInitsol(scip, relax, relaxInitSolSdp) );
4305 SCIP_CALL( SCIPsetRelaxExitsol(scip, relax, relaxExitSolSdp) );
4306 SCIP_CALL( SCIPsetRelaxFree(scip, relax, relaxFreeSdp) );
4307 SCIP_CALL( SCIPsetRelaxCopy(scip, relax, relaxCopySdp) );
4310 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolvergaptol",
4311 "the stopping criterion for the duality gap the sdpsolver should use",
4314 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolverfeastol",
4315 "the feasibility tolerance for the SDP solver",
4318 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/penaltyparam",
4319 "the starting value of the penalty parameter Gamma used for the penalty formulation if the "
4320 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->penaltyparam),
4323 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/maxpenaltyparam",
4324 "the maximum value of the penalty parameter Gamma used for the penalty formulation if the "
4325 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->maxpenaltyparam),
4328 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/peninfeasadjust",
4329 "gap- or feastol will be multiplied by this before checking for infeasibility using the penalty formulation", &(relaxdata->peninfeasadjust),
4332 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartipfactor",
4333 "factor for interior point in convexcombination of IP and parent solution, if warmstarts are enabled", &(relaxdata->warmstartipfactor),
4336 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartprimaltype",
4337 "how to warmstart the primal problem? 1: scaled identity/analytic center, 2: elementwise reciprocal, 3: saved primal sol", &(relaxdata->warmstartprimaltype), TRUE,
4340 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartiptype",
4341 "which interior point to use for convex combination for warmstarts? 1: scaled identity, 2: analytic center", &(relaxdata->warmstartiptype), TRUE,
4344 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartproject",
4345 "how to update dual matrix for new bounds? 1: use old bounds, 2: use new bounds, 3: use new bounds and project on psd cone, 4: use new bounds and solve rounding problem", &(relaxdata->warmstartproject), TRUE,
4348 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevpri",
4349 "minimum eigenvalue to allow when projecting primal matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevprimalpar),
4352 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevdu",
4353 "minimum eigenvalue to allow when projecting dual matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevdualpar),
4356 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartprojpdsame",
4357 "Should one shared minimum eigenvalue respectively maximum entry be computed for primal and dual problem instead of different ones for primal and dual and each block for projection or convex combination ?",
4360 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartpreoptsol",
4361 "Should a preoptimal solution (with larger gap) instead of the optimal solution be used for warmstarts",
4364 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartpreoptgap",
4365 "If warmstartpreoptsol is TRUE, this is the gap where the preoptimal solution will be saved", &(relaxdata->warmstartpreoptgap),
4368 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartroundonlyinf",
4369 "Only use solution of roundingproblem to detect infeasibility (only has an effect for warmstartproject = 4)",
4372 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/npenaltyincr",
4373 "maximum number of times the penalty parameter will be increased if the penalty formulation failed", &(relaxdata->npenaltyincr), TRUE,
4376 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/lambdastar",
4377 "the parameter lambda star used by SDPA to set the initial point;"
4378 "set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->lambdastar),
4381 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/slatercheck",
4382 "Should the Slater condition for the primal and dual problem be checked ahead of solving each SDP? 0: no, 1: yes but only for statistics, 2: yes and print warning for "
4383 "every problem not satisfying primal and dual Slater condition", &(relaxdata->slatercheck), TRUE,
DEFAULT_SLATERCHECK, 0, 2, NULL, NULL) );
4385 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/sdpinfo",
4386 "Should the SDP solver output information to the screen?",
4389 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstart",
4390 "Should the SDP solver try to use warmstarts?",
4393 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/objlimit",
4394 "Should an objective limit be given to the SDP-Solver?",
4397 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/resolve",
4398 "Should the relaxation be resolved after bound-tightenings were found during propagation (outside of probing)?",
4401 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/tightenvb",
4402 "Should Big-Ms in varbound-like constraints be tightened before giving them to the SDP-solver ?",
4405 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/displaystatistics",
4406 "Should statistics about SDP iterations and solver settings/success be printed after quitting SCIP-SDP ?",
4409 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetfreq",
4410 "frequency for resetting parameters in SDP solver and trying again with fastest settings (-1: never, 0: only at depth settingsresetofs);"
4411 "currently only supported for SDPA",
4414 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetofs",
4415 "frequency offset for resetting parameters in SDP solver and trying again with fastest settings; currently only supported for SDPA",
4418 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/sdpsolverthreads",
4419 "number of threads the SDP solver should use (-1 = number of cores); currently only supported for MOSEK",
4440 SCIP_CONSHDLR* sdpconshdlr;
4441 SCIP_RELAXDATA* relaxdata;
4443 assert( scip != NULL );
4444 assert( relax != NULL );
4445 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
4447 SCIPdebugMsg(scip,
"computing analytic centers for warmstarting\n");
4449 relaxdata = SCIPrelaxGetData(relax);
4452 if ( relaxdata->ipXexists || relaxdata->ipZexists )
4454 SCIPdebugMsg(scip,
"aborting SCIPrelaxSdpComputeAnalyticCenters since analytic centers have already been computed\n");
4458 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
4461 if ( relaxdata->warmstart && (relaxdata->warmstartiptype == 2) && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && (SCIPconshdlrGetNConss(sdpconshdlr) + SCIPgetNLPRows(scip) > 0 ) )
4465 relaxdata->nblocks = SCIPgetNLPRows(scip) + SCIPgetNVars(scip) > 0 ? SCIPconshdlrGetNConss(sdpconshdlr) + 1 : SCIPconshdlrGetNConss(sdpconshdlr);
4467 if ( SCIPgetNVars(scip) > 0 )
4471 SCIP_CONS** sdpblocks;
4472 SCIP_Real* solforscip;
4474 SCIP_Real timelimit;
4497 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4498 if ( ! SCIPisInfinity(scip, timelimit) )
4500 timelimit -= SCIPgetSolvingTime(scip);
4501 if ( timelimit <= 0.0 )
4506 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4509 relaxdata->sdpinterfacecalls++;
4513 if ( naddedsdpcalls )
4515 relaxdata->sdpcalls += naddedsdpcalls;
4518 relaxdata->sdpiterations += naddediters;
4522 switch( usedsetting )
4525 relaxdata->solvedpenalty++;
4528 relaxdata->solvedfast++;
4531 relaxdata->solvedmedium++;
4534 relaxdata->solvedstable++;
4537 relaxdata->unsolved++;
4544 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4545 switch( primalslater )
4548 relaxdata->npslatercheckfailed++;
4549 switch( dualslater )
4552 relaxdata->ndslatercheckfailed++;
4553 relaxdata->nslatercheckfailed++;
4556 relaxdata->ndnoslater++;
4557 relaxdata->nnoslater++;
4560 relaxdata->ndslaterholds++;
4561 relaxdata->nslatercheckfailed++;
4564 relaxdata->nslaterinfeasible++;
4567 relaxdata->ndslatercheckfailed++;
4568 relaxdata->nslatercheckfailed++;
4573 relaxdata->npnoslater++;
4574 switch( dualslater )
4577 relaxdata->ndslatercheckfailed++;
4578 relaxdata->nnoslater++;
4581 relaxdata->ndnoslater++;
4582 relaxdata->nnoslater++;
4585 relaxdata->ndslaterholds++;
4586 relaxdata->nnoslater++;
4589 relaxdata->nslaterinfeasible++;
4592 relaxdata->ndslatercheckfailed++;
4593 relaxdata->nnoslater++;
4598 relaxdata->npslaterholds++;
4599 switch( dualslater )
4602 relaxdata->ndslatercheckfailed++;
4603 relaxdata->nslatercheckfailed++;
4606 relaxdata->ndnoslater++;
4607 relaxdata->nnoslater++;
4610 relaxdata->ndslaterholds++;
4611 relaxdata->nslaterholds++;
4614 relaxdata->nslaterinfeasible++;
4617 relaxdata->ndslatercheckfailed++;
4618 relaxdata->nslatercheckfailed++;
4623 relaxdata->npslatercheckfailed++;
4624 relaxdata->ndslatercheckfailed++;
4625 relaxdata->nslatercheckfailed++;
4630 switch( slatersetting )
4633 relaxdata->stablewslater++;
4636 relaxdata->unstablewslater++;
4639 relaxdata->penaltywslater++;
4642 relaxdata->boundedwslater++;
4645 relaxdata->unsolvedwslater++;
4648 relaxdata->stablenoslater++;
4651 relaxdata->unstablenoslater++;
4654 relaxdata->penaltynoslater++;
4657 relaxdata->boundednoslater++;
4660 relaxdata->unsolvednoslater++;
4663 relaxdata->stableinfeasible++;
4666 relaxdata->unstableinfeasible++;
4669 relaxdata->penaltyinfeasible++;
4672 relaxdata->boundedinfeasible++;
4675 relaxdata->unsolvedinfeasible++;
4684 int npenaltybounds = 0;
4686 relaxdata->ipXexists = TRUE;
4689 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4690 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4691 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4692 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4695 for (b = 0; b < relaxdata->nblocks; b++)
4697 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4698 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4699 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4704 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval) );
4707 for (i = 0; i < relaxdata->ipXnblocknonz[relaxdata->nblocks - 1]; i++)
4713 if ( npenaltybounds > 0 )
4715 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXrow[relaxdata->nblocks - 1],
4716 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4717 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXcol[relaxdata->nblocks - 1],
4718 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4719 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXval[relaxdata->nblocks - 1],
4720 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4721 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] = relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds;
4724 for (b = 0; b < relaxdata->nblocks; b++)
4727 SCIPsdpVarfixerSortRowCol(relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]);
4730 #ifdef SCIP_PRINT_WARMSTART
4731 SCIPdebugMessage(
"Computed primal analytic center:\n");
4732 for (b = 0; b < relaxdata->nblocks; b++)
4734 SCIPdebugMessage(
"primal matrix, block %d:\n", b);
4735 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4737 SCIPdebugMessage(
"X_%d[%d,%d]: %f\n", b, relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
4744 relaxdata->ipXexists = TRUE;
4746 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4747 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4748 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4749 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4751 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
4753 for (b = 0; b < relaxdata->nblocks; b++)
4755 if ( b < relaxdata->nblocks - 1 )
4763 relaxdata->ipXnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
4765 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4766 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4767 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4769 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4771 relaxdata->ipXrow[b][i] = i;
4772 relaxdata->ipXcol[b][i] = i;
4773 relaxdata->ipXval[b][i] = relaxdata->lambdastar;
4777 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of primal feasible set, using scaled identity instead.\n");
4786 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4787 if ( ! SCIPisInfinity(scip, timelimit) )
4789 timelimit -= SCIPgetSolvingTime(scip);
4790 if ( timelimit <= 0.0 )
4795 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4801 if ( naddedsdpcalls )
4803 relaxdata->sdpinterfacecalls++;
4804 relaxdata->sdpcalls += naddedsdpcalls;
4807 relaxdata->sdpiterations += naddediters;
4811 switch( usedsetting )
4814 relaxdata->solvedpenalty++;
4817 relaxdata->solvedfast++;
4820 relaxdata->solvedmedium++;
4823 relaxdata->solvedstable++;
4826 relaxdata->unsolved++;
4833 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4834 switch( primalslater )
4837 relaxdata->npslatercheckfailed++;
4838 switch( dualslater )
4841 relaxdata->ndslatercheckfailed++;
4842 relaxdata->nslatercheckfailed++;
4845 relaxdata->ndnoslater++;
4846 relaxdata->nnoslater++;
4849 relaxdata->ndslaterholds++;
4850 relaxdata->nslatercheckfailed++;
4853 relaxdata->nslaterinfeasible++;
4856 relaxdata->ndslatercheckfailed++;
4857 relaxdata->nslatercheckfailed++;
4862 relaxdata->npnoslater++;
4863 switch( dualslater )
4866 relaxdata->ndslatercheckfailed++;
4867 relaxdata->nnoslater++;
4870 relaxdata->ndnoslater++;
4871 relaxdata->nnoslater++;
4874 relaxdata->ndslaterholds++;
4875 relaxdata->nnoslater++;
4878 relaxdata->nslaterinfeasible++;
4881 relaxdata->ndslatercheckfailed++;
4882 relaxdata->nnoslater++;
4887 relaxdata->npslaterholds++;
4888 switch( dualslater )
4891 relaxdata->ndslatercheckfailed++;
4892 relaxdata->nslatercheckfailed++;
4895 relaxdata->ndnoslater++;
4896 relaxdata->nnoslater++;
4899 relaxdata->ndslaterholds++;
4900 relaxdata->nslaterholds++;
4903 relaxdata->nslaterinfeasible++;
4906 relaxdata->ndslatercheckfailed++;
4907 relaxdata->nslatercheckfailed++;
4912 relaxdata->npslatercheckfailed++;
4913 relaxdata->ndslatercheckfailed++;
4914 relaxdata->nslatercheckfailed++;
4919 switch( slatersetting )
4922 relaxdata->stablewslater++;
4925 relaxdata->unstablewslater++;
4928 relaxdata->penaltywslater++;
4931 relaxdata->boundedwslater++;
4934 relaxdata->unsolvedwslater++;
4937 relaxdata->stablenoslater++;
4940 relaxdata->unstablenoslater++;
4943 relaxdata->penaltynoslater++;
4946 relaxdata->boundednoslater++;
4949 relaxdata->unsolvednoslater++;
4952 relaxdata->stableinfeasible++;
4955 relaxdata->unstableinfeasible++;
4958 relaxdata->penaltyinfeasible++;
4961 relaxdata->boundedinfeasible++;
4964 relaxdata->unsolvedinfeasible++;
4976 relaxdata->ipZexists = TRUE;
4978 nvars = SCIPgetNVars(scip);
4979 vars = SCIPgetVars(scip);
4982 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
4983 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
4984 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
4985 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
4988 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
4991 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solforscip, &slength) );
4993 assert( slength == nvars );
4997 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
4998 SCIP_CALL( SCIPsetSolVals(scip, relaxdata->ipy, nvars, vars, solforscip) );
4999 #ifdef SCIP_PRINT_WARMSTART
5000 SCIPdebugMessage(
"Computed dual analytic center:\n");
5001 for (i = 0; i < nvars; i++)
5003 SCIPdebugMessage(
"y[%d] = %f\n", i, solforscip[i]);
5007 SCIPfreeBufferArray(scip, &solforscip);
5010 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
5011 for (b = 0; b < relaxdata->nblocks - 1; b++)
5014 arraylength = relaxdata->ipZnblocknonz[b];
5016 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5017 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5018 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5021 SCIP_CALL(
SCIPconsSdpComputeSparseSdpMatrix(scip, sdpblocks[b], relaxdata->ipy, &(relaxdata->ipZnblocknonz[b]), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b]) );
5023 assert( relaxdata->ipZnblocknonz[b] <= arraylength );
5025 if ( relaxdata->ipZnblocknonz[b] < arraylength )
5027 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5028 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5029 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZval[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5033 SCIPsdpVarfixerSortRowCol(relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]);
5037 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
5038 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], 2 * nrows + 2 * nvars) );
5039 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], 2 * nrows + 2 * nvars) );
5040 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], 2 * nrows + 2 * nvars) );
5043 relaxdata->ipZnblocknonz[b] = 2 * nrows + 2 * nvars;
5045 for (r = 0; r < nrows; r++)
5049 rownnonz = SCIProwGetNNonz(rows[r]);
5050 rowvals = SCIProwGetVals(rows[r]);
5051 rowcols = SCIProwGetCols(rows[r]);
5052 for (i = 0; i < rownnonz; i++)
5053 rowval += SCIPgetSolVal(scip, relaxdata->ipy, SCIPcolGetVar(rowcols[i])) * rowvals[i];
5055 relaxdata->ipZrow[b][2*r] = 2*r;
5056 relaxdata->ipZcol[b][2*r] = 2*r;
5057 relaxdata->ipZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
5058 relaxdata->ipZrow[b][2*r + 1] = 2*r + 1;
5059 relaxdata->ipZcol[b][2*r + 1] = 2*r + 1;
5060 relaxdata->ipZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
5063 for (v = 0; v < nvars; v++)
5065 relaxdata->ipZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
5066 relaxdata->ipZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
5067 relaxdata->ipZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, relaxdata->ipy, vars[v]) - SCIPvarGetLbLocal(vars[v]);
5068 relaxdata->ipZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5069 relaxdata->ipZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5070 relaxdata->ipZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
5072 #ifdef SCIP_PRINT_WARMSTART
5073 for (b = 0; b < relaxdata->nblocks - 1; b++)
5075 SCIPdebugMessage(
"dual matrix, block %d:\n", b);
5076 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
5078 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", b, relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
5081 SCIPdebugMessage(
"dual matrix, LP constraints:\n");
5082 for (r = 0; r < nrows; r++)
5084 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r], relaxdata->ipZcol[b][2*r], relaxdata->ipZval[b][2*r]);
5085 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r+1], relaxdata->ipZcol[b][2*r+1], relaxdata->ipZval[b][2*r+1]);
5087 for (v = 0; v < nvars; v++)
5089 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5090 relaxdata->ipZrow[b][2*nrows + 2*v], relaxdata->ipZcol[b][2*nrows + 2*v], relaxdata->ipZval[b][2*nrows + 2*v]);
5091 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5092 relaxdata->ipZrow[b][2*nrows + 2*v + 1], relaxdata->ipZcol[b][2*nrows + 2*v + 1], relaxdata->ipZval[b][2*nrows + 2*v + 1]);
5099 relaxdata->ipZexists = TRUE;
5102 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5104 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
5105 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
5106 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
5107 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5109 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
5111 for (b = 0; b < relaxdata->nblocks; b++)
5113 if ( b < relaxdata->nblocks - 1 )
5121 relaxdata->ipZnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
5123 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5124 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5125 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5127 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5129 relaxdata->ipZrow[b][i] = i;
5130 relaxdata->ipZcol[b][i] = i;
5131 relaxdata->ipZval[b][i] = relaxdata->lambdastar;
5135 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of dual feasible set, using scaled identity instead.\n");
5158 SCIP_RELAXDATA* relaxdata;
5160 assert( relax != NULL );
5161 assert( lbvars != NULL );
5162 assert( ubvars != NULL );
5163 assert( arraylength != NULL );
5164 assert( *arraylength >= 0 );
5166 relaxdata = SCIPrelaxGetData(relax);
5167 assert( relaxdata != NULL );
5181 SCIP_RELAXDATA* relaxdata;
5183 assert( relax != NULL );
5184 assert( success != NULL );
5185 assert( objval != NULL );
5187 relaxdata = SCIPrelaxGetData(relax);
5188 assert( relaxdata != NULL );
5190 *success = relaxdata->origsolved;
5191 *objval = relaxdata->objval;
5201 SCIP_Real* solarray,
5205 SCIP_RELAXDATA* relaxdata;
5207 assert( relax != NULL );
5208 assert( success != NULL );
5209 assert( solarray != NULL );
5211 relaxdata = SCIPrelaxGetData(relax);
5212 assert( relaxdata != NULL );
5214 *success = relaxdata->origsolved;
5216 if ( *sollength >= SCIPgetNVars(scip) )
5218 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solarray, sollength) );
5222 SCIPdebugMessage(
"Called SCIPrelaxSdpGetRelaxSol with an array that wasn't big enough, needed length %d, given %d!\n", SCIPgetNVars(scip), *sollength);
5223 *sollength = SCIPgetNVars(scip);
5234 assert( relax != NULL );
5235 assert( SCIPrelaxGetData(relax) != NULL );
5237 return SCIPrelaxGetData(relax)->lastsdpnode;
5245 SCIP_RELAXDATA* relaxdata;
5247 assert( relax != NULL );
5249 relaxdata = SCIPrelaxGetData(relax);
5251 assert( relaxdata != NULL );
5252 assert( relaxdata->sdpi != NULL );
5262 SCIP_RELAXDATA* relaxdata;
5264 assert( relax != NULL );
5266 relaxdata = SCIPrelaxGetData(relax);
5268 assert( relaxdata != NULL );
5269 assert( relaxdata->sdpi != NULL );
5271 return relaxdata->probingsolved;
5279 assert( relax != NULL );
5280 assert( SCIPrelaxGetData(relax) != NULL );
5282 return ( SCIPrelaxGetData(relax)->feasible );
5290 assert( relax != NULL );
5291 assert( SCIPrelaxGetData(relax) != NULL );
5293 return SCIPrelaxGetData(relax)->sdpiterations;
5301 assert( relax != NULL );
5302 assert( SCIPrelaxGetData(relax) != NULL );
5304 return ( SCIPrelaxGetData(relax)->sdpcalls );
5312 assert( relax != NULL );
5313 assert( SCIPrelaxGetData(relax) != NULL );
5315 return ( SCIPrelaxGetData(relax)->sdpinterfacecalls );
5323 assert( relax != NULL );
5324 assert( SCIPrelaxGetData(relax) != NULL );
5326 return ( SCIPrelaxGetData(relax)->solvedfast );
5334 assert( relax != NULL );
5335 assert( SCIPrelaxGetData(relax) != NULL );
5337 return ( SCIPrelaxGetData(relax)->solvedmedium );
5345 assert( relax != NULL );
5346 assert( SCIPrelaxGetData(relax) != NULL );
5348 return ( SCIPrelaxGetData(relax)->solvedstable );
5356 assert( relax != NULL );
5357 assert( SCIPrelaxGetData(relax) != NULL );
5359 return ( SCIPrelaxGetData(relax)->solvedpenalty );
5367 assert( relax != NULL );
5368 assert( SCIPrelaxGetData(relax) != NULL );
5370 return ( SCIPrelaxGetData(relax)->unsolved );
5378 assert( relax != NULL );
5379 assert( SCIPrelaxGetData(relax) != NULL );
5381 return ( SCIPrelaxGetData(relax)->ndslaterholds );
5389 assert( relax != NULL );
5390 assert( SCIPrelaxGetData(relax) != NULL );
5392 return ( SCIPrelaxGetData(relax)->ndnoslater );
5400 assert( relax != NULL );
5401 assert( SCIPrelaxGetData(relax) != NULL );
5403 return ( SCIPrelaxGetData(relax)->nslaterinfeasible );
5411 assert( relax != NULL );
5412 assert( SCIPrelaxGetData(relax) != NULL );
5414 return ( SCIPrelaxGetData(relax)->ndslatercheckfailed );
5422 assert( relax != NULL );
5423 assert( SCIPrelaxGetData(relax) != NULL );
5425 return ( SCIPrelaxGetData(relax)->npslaterholds );
5433 assert( relax != NULL );
5434 assert( SCIPrelaxGetData(relax) != NULL );
5436 return ( SCIPrelaxGetData(relax)->npnoslater );
5444 assert( relax != NULL );
5445 assert( SCIPrelaxGetData(relax) != NULL );
5447 return ( SCIPrelaxGetData(relax)->npslatercheckfailed );
5455 assert( relax != NULL );
5456 assert( SCIPrelaxGetData(relax) != NULL );
5458 return ( SCIPrelaxGetData(relax)->nslaterholds );
5466 assert( relax != NULL );
5467 assert( SCIPrelaxGetData(relax) != NULL );
5469 return ( SCIPrelaxGetData(relax)->stablewslater );
5477 assert( relax != NULL );
5478 assert( SCIPrelaxGetData(relax) != NULL );
5480 return ( SCIPrelaxGetData(relax)->unstablewslater );
5488 assert( relax != NULL );
5489 assert( SCIPrelaxGetData(relax) != NULL );
5491 return ( SCIPrelaxGetData(relax)->penaltywslater );
5499 assert( relax != NULL );
5500 assert( SCIPrelaxGetData(relax) != NULL );
5502 return ( SCIPrelaxGetData(relax)->boundedwslater );
5510 assert( relax != NULL );
5511 assert( SCIPrelaxGetData(relax) != NULL );
5513 return ( SCIPrelaxGetData(relax)->unsolvedwslater );
5521 assert( relax != NULL );
5522 assert( SCIPrelaxGetData(relax) != NULL );
5524 return ( SCIPrelaxGetData(relax)->nnoslater );
5532 assert( relax != NULL );
5533 assert( SCIPrelaxGetData(relax) != NULL );
5535 return ( SCIPrelaxGetData(relax)->stablenoslater );
5543 assert( relax != NULL );
5544 assert( SCIPrelaxGetData(relax) != NULL );
5546 return ( SCIPrelaxGetData(relax)->unstablenoslater );
5554 assert( relax != NULL );
5555 assert( SCIPrelaxGetData(relax) != NULL );
5557 return ( SCIPrelaxGetData(relax)->penaltynoslater );
5565 assert( relax != NULL );
5566 assert( SCIPrelaxGetData(relax) != NULL );
5568 return ( SCIPrelaxGetData(relax)->boundednoslater );
5576 assert( relax != NULL );
5577 assert( SCIPrelaxGetData(relax) != NULL );
5579 return ( SCIPrelaxGetData(relax)->unsolvednoslater );
5587 assert( relax != NULL );
5588 assert( SCIPrelaxGetData(relax) != NULL );
5590 return ( SCIPrelaxGetData(relax)->stableinfeasible );
5598 assert( relax != NULL );
5599 assert( SCIPrelaxGetData(relax) != NULL );
5601 return ( SCIPrelaxGetData(relax)->unstableinfeasible );
5609 assert( relax != NULL );
5610 assert( SCIPrelaxGetData(relax) != NULL );
5612 return ( SCIPrelaxGetData(relax)->penaltyinfeasible );
5620 assert( relax != NULL );
5621 assert( SCIPrelaxGetData(relax) != NULL );
5623 return ( SCIPrelaxGetData(relax)->boundedinfeasible );
5631 assert( relax != NULL );
5632 assert( SCIPrelaxGetData(relax) != NULL );
5634 return ( SCIPrelaxGetData(relax)->unsolvedinfeasible );
SCIP_Real SCIPconsSdpGetMaxConstEntry(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPsdpiFree(SCIP_SDPI **sdpi)
#define WARMSTART_PROJ_FACTOR_PRIMAL
SCIP_Bool SCIPsdpiIsDualUnbounded(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiDelLPRows(SCIP_SDPI *sdpi, int firstrow, int lastrow)
int SCIPrelaxSdpGetNSlaterHoldsStable(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterInfeasibleFast(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiGetSdpCalls(SCIP_SDPI *sdpi, int *calls)
static SCIP_RETCODE calcRelax(SCIP *scip, SCIP_RELAXDATA *relaxdata, SCIP_RESULT *result, SCIP_Real *lowerbound)
SCIP_Bool SCIPsdpiDoesWarmstartNeedPrimal(void)
static SCIP_DECL_RELAXCOPY(relaxCopySdp)
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
int SCIPrelaxSdpGetNSlaterFailsBounded(SCIP_RELAX *relax)
static SCIP_DECL_RELAXEXITSOL(relaxExitSolSdp)
#define DEFAULT_PENINFEASADJUST
#define TIMEOFDAY_CALL(x)
int SCIPrelaxSdpGetNprimalSlaterHolds(SCIP_RELAX *relax)
SCIP_Real SCIPconsSavesdpsolGetMaxPrimalEntry(SCIP *scip, SCIP_CONS *cons)
static SCIP_Bool allVarsFixed(SCIP *scip)
#define DEFAULT_SLATERCHECK
#define WARMSTART_PREOPT_MIN_Z_LPVAL
int SCIPrelaxSdpGetNSdpPenalty(SCIP_RELAX *relax)
void SCIPsdpVarfixerSortRowCol(int *row, int *col, SCIP_Real *val, int length)
SCIP_RETCODE SCIPsdpiGetPrimalMatrix(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrixNonzeros(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz)
EXTERN SCIP_RETCODE SCIPlapackComputeEigenvectorDecomposition(BMS_BUFMEM *bufmem, int n, SCIP_Real *A, SCIP_Real *eigenvalues, SCIP_Real *eigenvectors)
int SCIPrelaxSdpGetNdualSlaterHolds(SCIP_RELAX *relax)
const char * SCIPsdpiGetSolverName(void)
SCIP_RETCODE SCIPsdpiGetSol(SCIP_SDPI *sdpi, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
int SCIPrelaxSdpGetNSdpUnsolved(SCIP_RELAX *relax)
#define DEFAULT_PENALTYPARAM
SCIP_RETCODE createConsSavesdpsol(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_Longint node, SCIP_SOL *sol, SCIP_Real maxprimalentry, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_RETCODE SCIPsdpiSolve(SCIP_SDPI *sdpi, 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_Bool enforceslatercheck, SCIP_Real timelimit)
SCIP_Bool SCIPsdpiFeasibilityKnown(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiLoadSDP(SCIP_SDPI *sdpi, 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 nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval)
SCIP_RETCODE SCIPsdpiComputeLambdastar(SCIP_SDPI *sdpi, SCIP_Real maxguess)
SCIP_RETCODE SCIPsdpiGetPrimalNonzeros(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz)
SCIP_RETCODE createConsSavedsdpsettings(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_SDPSOLVERSETTING settings)
SCIP_SOL * SCIPconsSavesdpsolGetDualVector(SCIP *scip, SCIP_CONS *cons)
#define DEFAULT_TIGHTENVB
static SCIP_DECL_RELAXEXEC(relaxExecSdp)
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
SCIP_RETCODE SCIPsdpiGetIterations(SCIP_SDPI *sdpi, int *iterations)
#define DEFAULT_SETTINGSRESETFREQ
SCIP_RETCODE SCIPsdpiSettingsUsed(SCIP_SDPI *sdpi, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSlaterSettings(SCIP_SDPI *sdpi, SCIP_SDPSLATERSETTING *slatersetting)
int SCIPrelaxSdpGetNdualSlaterFails(SCIP_RELAX *relax)
SCIP_Bool SCIPsdpiIsAcceptable(SCIP_SDPI *sdpi)
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
static SCIP_DECL_RELAXINITSOL(relaxInitSolSdp)
int SCIPrelaxSdpGetNSdpStable(SCIP_RELAX *relax)
SCIP_RETCODE SCIPconsSdpComputeSparseSdpMatrix(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, int *length, int *row, int *col, SCIP_Real *val)
int SCIPrelaxSdpGetNSdpMedium(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
#define DEFAULT_WARMSTARTIPFACTOR
SCIP_Bool SCIPsdpiIsTimelimExc(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPrelaxSdpRelaxVal(SCIP_RELAX *relax, SCIP_Bool *success, SCIP_Real *objval)
SCIP_Bool SCIPsdpiIsDualInfeasible(SCIP_SDPI *sdpi)
General interface methods for SDP-preprocessing (mainly fixing variables and removing empty rows/cols...
int SCIPrelaxSdpGetNSlaterFailsFast(SCIP_RELAX *relax)
static SCIP_DECL_RELAXFREE(relaxFreeSdp)
struct Sdpvarmapper SdpVarmapper
int SCIPrelaxSdpGetNSlaterFailsStable(SCIP_RELAX *relax)
enum SCIP_SDPSlaterSetting SCIP_SDPSLATERSETTING
#define DEFAULT_DISPLAYSTAT
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
int SCIPrelaxSdpGetNSdpInterfaceCalls(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterHolds(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiChgBounds(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *lb, const SCIP_Real *ub)
int SCIPrelaxSdpGetNSdpCalls(SCIP_RELAX *relax)
Constraint handler for SDP-constraints.
SCIP_RETCODE SCIPsdpiGetLowerObjbound(SCIP_SDPI *sdpi, SCIP_Real *objlb)
SCIP_Bool SCIPsdpiIsObjlimExc(SCIP_SDPI *sdpi)
maps SCIP variables to SDP indices (the SCIP variables are given SDP indices in the order in which th...
#define DEFAULT_MAXPENALTYPARAM
SCIP_Real SCIPconsSdpGetMaxSdpCoef(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPsdpiGetDefaultSdpiSolverFeastol(void)
SCIP_RETCODE SCIPconsSdpGetData(SCIP *scip, SCIP_CONS *cons, int *nvars, int *nnonz, int *blocksize, int *arraylength, int *nvarnonz, int **col, int **row, SCIP_Real **val, SCIP_VAR **vars, int *constnnonz, int *constcol, int *constrow, SCIP_Real *constval)
int SCIPconsSdpCompLowerTriangPos(int i, int j)
int SCIPrelaxSdpGetNSlaterHoldsUnsolved(SCIP_RELAX *relax)
#define WARMSTART_PROJ_FACTOR_LHS
SCIP_RETCODE SCIPsdpiAddLPRows(SCIP_SDPI *sdpi, int nrows, const SCIP_Real *lhs, const SCIP_Real *rhs, int nnonz, const int *row, const int *col, const SCIP_Real *val)
#define WARMSTART_PROJ_FACTOR
int SCIPrelaxSdpGetNSlaterInfeasibleStable(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNdualSlaterUnknown(SCIP_RELAX *relax)
const char * SCIPsdpiGetSolverDesc(void)
SCIP_RETCODE SCIPsdpiComputePenaltyparam(SCIP_SDPI *sdpi, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_RETCODE SCIPsdpiSetIntpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, int ival)
SCIP_SDPSOLVERSETTING SCIPconsSavedsdpsettingsGetSettings(SCIP *scip, SCIP_CONS *cons)
#define DEFAULT_SETTINGSRESETOFS
SCIP_Bool SCIPrelaxSdpSolvedProbing(SCIP_RELAX *relax)
SCIP_Real SCIPsdpiInfinity(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrix(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
long int SCIPrelaxSdpGetSdpNode(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiCreate(SCIP_SDPI **sdpi, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
#define DEFAULT_WARMSTARTPROJECT
int SCIPrelaxSdpGetNSlaterFailsPenalty(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSdpFast(SCIP_RELAX *relax)
SCIP_Bool SCIPrelaxSdpSolvedOrig(SCIP_RELAX *relax)
#define DEFAULT_WARMSTARTIPTYPE
adds the main functionality to fix/unfix/(multi-)aggregate variables by merging two three-tuple-array...
int SCIPrelaxSdpGetNSlaterHoldsFast(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterInfeasiblePenalty(SCIP_RELAX *relax)
#define WARMSTART_PROJ_MINRHSOBJ
int SCIPsdpiGetDefaultSdpiSolverNpenaltyIncreases(void)
#define DEFAULT_WARMSTARTPRIMALTYPE
int SCIPconsSdpComputeUbSparseSdpMatrixLength(SCIP *scip, SCIP_CONS *cons)
SCIP_Bool SCIPsdpiWasSolved(SCIP_SDPI *sdpi)
int SCIPrelaxSdpGetNIterations(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterFails(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiComputeMaxPenaltyparam(SCIP_SDPI *sdpi, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiClear(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiChgObj(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *obj)
SCIP_RETCODE SCIPrelaxSdpGetRelaxSol(SCIP *scip, SCIP_RELAX *relax, SCIP_Bool *success, SCIP_Real *solarray, int *sollength)
SCIP_RETCODE SCIPsdpiGetPreoptimalSol(SCIP_SDPI *sdpi, SCIP_Bool *success, SCIP_Real *dualsol, int *dualsollength, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
int SCIPconsSdpGetBlocksize(SCIP *scip, SCIP_CONS *cons)
int SCIPrelaxSdpGetNSlaterHoldsBounded(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNprimalSlaterFails(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterInfeasibleBounded(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
SCIP_RETCODE SCIPrelaxSdpGetPrimalBoundVars(SCIP_RELAX *relax, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
#define DEFAULT_LAMBDASTAR
static SCIP_RETCODE scaleTransposedMatrix(int blocksize, SCIP_Real *matrix, SCIP_Real *scale)
EXTERN SCIP_RETCODE SCIPlapackMatrixMatrixMult(int nrowsA, int ncolsA, SCIP_Real *matrixA, SCIP_Bool transposeA, int nrowsB, int ncolsB, SCIP_Real *matrixB, SCIP_Bool transposeB, SCIP_Real *result)
SCIP_RETCODE SCIPsdpVarfixerMergeArrays(BMS_BLKMEM *blkmem, SCIP_Real epsilon, int *originrow, int *origincol, SCIP_Real *originval, int originlength, SCIP_Bool originsorted, SCIP_Real scalar, int *targetrow, int *targetcol, SCIP_Real *targetval, int *targetlength, int targetmemory)
#define DEFAULT_WARMSTARTROUNDONLYINF
SCIP_Bool SCIPsdpiIsDualFeasible(SCIP_SDPI *sdpi)
struct SCIP_SDPi SCIP_SDPI
SCIP_Bool SCIPsdpiIsPrimalFeasible(SCIP_SDPI *sdpi)
SCIP_Bool SCIPrelaxSdpIsFeasible(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiSetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Longint SCIPconsSavesdpsolGetNodeIndex(SCIP *scip, SCIP_CONS *cons)
int SCIPrelaxSdpGetNSlaterFailsUnsolved(SCIP_RELAX *relax)
#define DEFAULT_WARMSTARTPROJMINEV
enum SCIP_SDPSlater SCIP_SDPSLATER
SCIP_Real SCIPsdpiGetMaxPrimalEntry(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPconsSdpGetNNonz(SCIP *scip, SCIP_CONS *cons, int *nnonz, int *constnnonz)
SCIP_RETCODE SCIPsdpiGetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real *dval)
static SCIP_RETCODE putSdpDataInInterface(SCIP *scip, SCIP_SDPI *sdpi, SdpVarmapper *varmapper, SCIP_Bool primalobj, SCIP_Bool boundprimal)
int SCIPrelaxSdpGetNdualSlaterInfeasible(SCIP_RELAX *relax)
SCIP_Real SCIPsdpiGetDefaultSdpiSolverGaptol(void)
SCIP_RETCODE SCIPsdpiGetPreoptimalPrimalNonzeros(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz)
SCIP_RETCODE SCIPrelaxSdpComputeAnalyticCenters(SCIP *scip, SCIP_RELAX *relax)
static SCIP_RETCODE expandSparseMatrix(int nnonz, int blocksize, int *row, int *col, SCIP_Real *val, SCIP_Real *fullmat)
#define DEFAULT_WARMSTART
int SCIPrelaxSdpGetNSlaterHoldsPenalty(SCIP_RELAX *relax)
static SCIP_RETCODE putLpDataInInterface(SCIP *scip, SCIP_SDPI *sdpi, SdpVarmapper *varmapper, SCIP_Bool primalobj, SCIP_Bool dualobj)
SCIP_RETCODE SCIPsdpiGetNLPRows(SCIP_SDPI *sdpi, int *nlprows)
#define DEFAULT_WARMSTARTPREOPTGAP
SCIP_RETCODE SCIPsdpiGetPrimalBoundVars(SCIP_SDPI *sdpi, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
interface methods for eigenvector computation and matrix multiplication using different versions of L...
#define DEFAULT_WARMSTARTPROJPDSAME
int SCIPrelaxSdpGetNprimalSlaterUnknown(SCIP_RELAX *relax)
SCIP_RETCODE SCIPconsSdpGuessInitialPoint(SCIP *scip, SCIP_CONS *cons, SCIP_Real *lambdastar)
int SCIPrelaxSdpGetNSlaterInfeasibleUnsolved(SCIP_RELAX *relax)
SCIP_Bool SCIPsdpiSolvedOrig(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiSlater(SCIP_SDPI *sdpi, SCIP_SDPSLATER *primalslater, SCIP_SDPSLATER *dualslater)
#define DEFAULT_SDPSOLVERTHREADS
constraint handler for saving SDP solutions in nodes
SCIP_RETCODE SCIPincludeRelaxSdp(SCIP *scip)
#define DEFAULT_WARMSTART_PREOPTIMAL_SOL
constraint handler for saving SDP settings