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.0
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.0
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_PREOPT_MIN_Z_LPVAL 0.01
102 #define TIMEOFDAY_CALL(x) do \
105 if ( (_errorcode_ = (x)) != 0 ) \
107 SCIPerrorMessage("Error in gettimeofday! \n"); \
118 struct SCIP_RelaxData
125 SCIP_Bool origsolved;
126 SCIP_Bool probingsolved;
127 long int lastsdpnode;
130 SCIP_Real sdpsolvergaptol;
131 SCIP_Real sdpsolverfeastol;
132 SCIP_Real penaltyparam;
133 SCIP_Real maxpenaltyparam;
134 SCIP_Real lambdastar;
135 SCIP_Real computedlambdastar;
137 SCIP_Real peninfeasadjust;
140 SCIP_Bool displaystat;
144 int settingsresetfreq;
145 int settingsresetofs;
146 int sdpsolverthreads;
149 int sdpinterfacecalls;
162 int unstablenoslater;
165 int unsolvednoslater;
168 int nslatercheckfailed;
172 int npslatercheckfailed;
175 int ndslatercheckfailed;
176 int nslaterinfeasible;
177 int stableinfeasible;
178 int unstableinfeasible;
179 int penaltyinfeasible;
180 int boundedinfeasible;
181 int unsolvedinfeasible;
183 int primalroundfails;
185 int roundstartsuccess;
188 SCIP_Real roundingprobtime;
191 SCIP_Real warmstartipfactor;
192 int warmstartprimaltype;
194 int warmstartproject;
195 SCIP_Real warmstartpmevprimalpar;
196 SCIP_Real warmstartpmevdualpar;
197 SCIP_Real warmstartprojminevprimal;
198 SCIP_Real warmstartprojminevdual;
199 SCIP_Bool warmstartprojpdsame;
201 SCIP_Bool warmstartpreoptsol;
202 SCIP_Real warmstartpreoptgap;
203 SCIP_Bool warmstartroundonlyinf;
234 assert( nnonz >= 0 );
235 assert( row != NULL );
236 assert( col != NULL );
237 assert( val != NULL );
238 assert( fullmat != NULL );
240 matrixsize = blocksize * blocksize;
243 for (i = 0; i < matrixsize; i++)
246 for (i = 0; i < nnonz; i++)
248 assert( row[i] * blocksize + col[i] <= matrixsize );
249 fullmat[row[i] * blocksize + col[i]] = val[i];
250 assert( col[i] * blocksize + row[i] <= matrixsize );
251 fullmat[col[i] * blocksize + row[i]] = val[i];
268 assert( blocksize >= 0 );
269 assert( matrix != NULL );
270 assert( scale != NULL );
272 for (r = 0; r < blocksize; r++)
274 for (c = 0; c < blocksize; c++)
276 matrix[r * blocksize + c] *= scale[c];
290 SCIP_Bool boundprimal
293 SCIP_CONSHDLR* conshdlr;
294 const char* conshdlrname;
296 SCIP_VAR** blockvars;
299 SCIP_Real** constval;
312 int* nconstblocknonz;
313 int constnnonzcounter;
326 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", ¶m) );
328 SCIPdebugMessage(
"Putting SDP Data in general SDP interface!\n");
330 assert( scip != NULL );
331 assert( sdpi != NULL );
332 assert( varmapper != NULL );
334 vars = SCIPgetVars(scip);
335 nvars = SCIPgetNVars(scip);
336 nvarspen = boundprimal ? nvars + 1 : nvars;
339 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvarspen) );
340 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvarspen) );
341 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvarspen) );
343 for (i = 0; i < nvars; i++)
345 obj[i] = SCIPvarGetObj(vars[i]);
346 lb[i] = SCIPvarGetLbLocal(vars[i]);
347 ub[i] = SCIPvarGetUbLocal(vars[i]);
353 ub[nvars] = SCIPinfinity(scip);
356 nconss = SCIPgetNConss(scip);
357 conss = SCIPgetConss(scip);
364 for (i = 0; i < nconss; i++)
366 conshdlr = SCIPconsGetHdlr(conss[i]);
367 assert( conshdlr != NULL );
369 conshdlrname = SCIPconshdlrGetName(conshdlr);
371 #ifdef SCIP_EVEN_MORE_DEBUG
372 SCIP_CALL( SCIPprintCons(scip, conss[i], NULL) );
373 SCIPinfoMessage(scip, NULL,
"\n");
376 if ( strcmp(conshdlrname,
"SDP") == 0 )
381 sdpnnonz += blocknnonz;
382 sdpconstnnonz += constnnonzcounter;
387 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocksizes, nsdpblocks) );
388 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz, nsdpblocks) );
389 SCIP_CALL( SCIPallocBufferArray(scip, &nconstblocknonz, nsdpblocks) );
390 SCIP_CALL( SCIPallocBufferArray(scip, &col, nsdpblocks) );
391 SCIP_CALL( SCIPallocBufferArray(scip, &row, nsdpblocks) );
392 SCIP_CALL( SCIPallocBufferArray(scip, &val, nsdpblocks) );
393 SCIP_CALL( SCIPallocBufferArray(scip, &constcol, nsdpblocks) );
394 SCIP_CALL( SCIPallocBufferArray(scip, &constrow, nsdpblocks) );
395 SCIP_CALL( SCIPallocBufferArray(scip, &constval, nsdpblocks) );
396 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvars, nsdpblocks) );
397 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar, nsdpblocks) );
399 for (i = 0; i < nsdpblocks; i++)
401 SCIP_CALL( SCIPallocBufferArray(scip, &(nblockvarnonz[i]), nvarspen) );
402 SCIP_CALL( SCIPallocBufferArray(scip, &col[i], nvarspen) );
403 SCIP_CALL( SCIPallocBufferArray(scip, &row[i], nvarspen) );
404 SCIP_CALL( SCIPallocBufferArray(scip, &val[i], nvarspen) );
409 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
411 for (i = 0; i < nconss; i++)
413 conshdlr = SCIPconsGetHdlr(conss[i]);
414 assert( conshdlr != NULL );
416 conshdlrname = SCIPconshdlrGetName(conshdlr);
418 if ( strcmp(conshdlrname,
"SDP") == 0 )
420 assert( ind < nsdpblocks );
424 nconstblocknonz[ind] = constlength;
425 SCIP_CALL( SCIPallocBufferArray(scip, &(constcol[ind]), constlength) );
426 SCIP_CALL( SCIPallocBufferArray(scip, &(constrow[ind]), constlength) );
427 SCIP_CALL( SCIPallocBufferArray(scip, &(constval[ind]), constlength) );
430 SCIP_CALL(
SCIPconsSdpGetData(scip, conss[i], &nblockvars[ind], &blocknnonz, &sdpblocksizes[ind], &nvars, nblockvarnonz[ind], col[ind],
431 row[ind], val[ind], blockvars, &nconstblocknonz[ind], constcol[ind], constrow[ind], constval[ind]) );
434 assert( nvars == SCIPgetNVars(scip) );
435 assert( nconstblocknonz[ind] <= constlength );
437 SCIP_CALL( SCIPallocBufferArray(scip, &(sdpvar[ind]), boundprimal ? nblockvars[ind] + 1 : nblockvars[ind]) );
440 for (j = 0; j < nblockvars[ind]; j++)
447 nblockvarnonz[ind][nblockvars[ind]] = sdpblocksizes[ind];
450 SCIP_CALL( SCIPallocBufferArray(scip, &col[ind][nblockvars[ind]], sdpblocksizes[ind]) );
451 SCIP_CALL( SCIPallocBufferArray(scip, &row[ind][nblockvars[ind]], sdpblocksizes[ind]) );
452 SCIP_CALL( SCIPallocBufferArray(scip, &val[ind][nblockvars[ind]], sdpblocksizes[ind]) );
454 for (j = 0; j < sdpblocksizes[ind]; j++)
456 col[ind][nblockvars[ind]][j] = j;
457 row[ind][nblockvars[ind]][j] = j;
458 val[ind][nblockvars[ind]][j] = 1.0;
468 SCIPfreeBufferArray(scip, &blockvars);
473 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, sdpconstnnonz, nconstblocknonz, constrow,
474 constcol, constval, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
475 NULL, NULL, 0, NULL, NULL, NULL) );
480 for (i = 0; i < nsdpblocks; i++)
481 nconstblocknonz[i] = 0;
483 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, 0, nconstblocknonz, NULL,
484 NULL, NULL, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
485 NULL, NULL, 0, NULL, NULL, NULL) );
490 for (i = 0; i < nsdpblocks; i++)
494 SCIPfreeBufferArrayNull(scip, &val[i][nblockvars[i] - 1]);
495 SCIPfreeBufferArrayNull(scip, &row[i][nblockvars[i] - 1]);
496 SCIPfreeBufferArrayNull(scip, &col[i][nblockvars[i] - 1]);
498 SCIPfreeBufferArrayNull(scip, &(sdpvar[i]));
499 SCIPfreeBufferArrayNull(scip, &val[i]);
500 SCIPfreeBufferArrayNull(scip, &row[i]);
501 SCIPfreeBufferArrayNull(scip, &col[i]);
502 SCIPfreeBufferArrayNull(scip, &(nblockvarnonz[i]));
503 SCIPfreeBufferArrayNull(scip, &(constval[i]));
504 SCIPfreeBufferArrayNull(scip, &(constrow[i]));
505 SCIPfreeBufferArrayNull(scip, &(constcol[i]));
508 SCIPfreeBufferArrayNull(scip, &sdpvar);
509 SCIPfreeBufferArrayNull(scip, &nblockvars);
510 SCIPfreeBufferArrayNull(scip, &constval);
511 SCIPfreeBufferArrayNull(scip, &constrow);
512 SCIPfreeBufferArrayNull(scip, &constcol);
513 SCIPfreeBufferArrayNull(scip, &val);
514 SCIPfreeBufferArrayNull(scip, &row);
515 SCIPfreeBufferArrayNull(scip, &col);
516 SCIPfreeBufferArrayNull(scip, &nconstblocknonz);
517 SCIPfreeBufferArrayNull(scip, &nblockvarnonz);
518 SCIPfreeBufferArrayNull(scip, &sdpblocksizes);
519 SCIPfreeBufferArray(scip, &ub);
520 SCIPfreeBufferArray(scip, &lb);
521 SCIPfreeBufferArray(scip, &obj);
563 assert( scip != NULL );
564 assert( sdpi != NULL );
565 assert( varmapper != NULL );
567 nvars = SCIPgetNVars(scip);
570 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
571 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/tightenvb", &tightenvb) );
573 SCIPdebugMessage(
"inserting %d LPRows into the interface.\n", nrows);
577 for (i = 0; i < nrows; i++)
579 assert( rows[i] != NULL );
580 scipnnonz += SCIProwGetNNonz(rows[i]);
584 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nrows) );
585 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nrows) );
586 SCIP_CALL( SCIPallocBufferArray(scip, &rowind, scipnnonz) );
587 SCIP_CALL( SCIPallocBufferArray(scip, &colind, scipnnonz) );
588 SCIP_CALL( SCIPallocBufferArray(scip, &val, scipnnonz) );
594 for (i = 0; i < nrows; i++)
597 SCIP_Bool tightened = FALSE;
598 SCIP_Real tightenedval = 0.0;
599 SCIP_Bool swapped = FALSE;
603 rownnonz = SCIProwGetNNonz(row);
605 rowvals = SCIProwGetVals(row);
606 rowcols = SCIProwGetCols(row);
607 sciplhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
608 sciprhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
611 if ( tightenvb && rownnonz == 2 && (SCIPisZero(scip, sciplhs) || SCIPisZero(scip, sciprhs) ) )
621 assert( rowcols[0] != NULL );
622 assert( rowcols[1] != NULL );
623 var1 = SCIPcolGetVar(rowcols[0]);
624 var2 = SCIPcolGetVar(rowcols[1]);
625 assert( var1 != NULL );
626 assert( var2 != NULL );
629 if ( ! SCIPisEQ(scip, SCIPvarGetLbLocal(var1), SCIPvarGetUbLocal(var1)) && ! SCIPisEQ(scip, SCIPvarGetLbLocal(var2), SCIPvarGetUbLocal(var2)) )
632 if ( (SCIPisEQ(scip, val1, 1.0) || SCIPisEQ(scip, val2, 1.0)) && ( SCIPisNegative(scip, val1) || SCIPisNegative(scip, val2) ) )
635 if ( ! SCIPisEQ(scip, val1, 1.0) || ! SCIPisNegative(scip, val2) )
637 SCIPswapPointers((
void**) &var1, (
void**) &var2);
644 if ( SCIPvarIsBinary(var2) )
646 if ( SCIPisZero(scip, sciprhs) )
648 if ( SCIPisLT(scip, SCIPvarGetUbLocal(var1), REALABS(val2)) )
650 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetUbLocal(var1));
653 tightenedval = -SCIPvarGetUbLocal(var1);
657 if ( SCIPisZero(scip, sciplhs) )
659 if ( SCIPisGT(scip, SCIPvarGetLbLocal(var1), REALABS(val2)) )
661 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetLbLocal(var1));
664 tightenedval = -SCIPvarGetUbLocal(var1);
672 for (j = 0; j < rownnonz; j++)
675 if ( tightened && ( (swapped && (j == 0)) || ((! swapped) && (j == 1)) ) )
677 if ( SCIPisFeasGT(scip, REALABS(tightenedval), 0.0) )
679 assert( SCIPcolGetVar(rowcols[j]) != 0 );
681 rowind[nnonz] = nconss;
682 val[nnonz] = tightenedval;
686 else if ( SCIPisFeasGT(scip, REALABS(rowvals[j]), 0.0))
688 assert( SCIPcolGetVar(rowcols[j]) != 0 );
690 rowind[nnonz] = nconss;
691 val[nnonz] = rowvals[j];
695 lhs[nconss] = primalobj ? sciplhs : (SCIPisInfinity(scip, -sciplhs) ? -sciplhs : 0.0);
696 rhs[nconss] = primalobj ? sciprhs : (SCIPisInfinity(scip, sciprhs) ? sciprhs : 0.0);
708 SCIP_CALL(
SCIPsdpiAddLPRows(sdpi, nconss, lhs, rhs, nnonz, (
const int*)rowind, (
const int*)colind, val) );
711 SCIPfreeBufferArray(scip, &val);
712 SCIPfreeBufferArray(scip, &colind);
713 SCIPfreeBufferArray(scip, &rowind);
714 SCIPfreeBufferArray(scip, &rhs);
715 SCIPfreeBufferArray(scip, &lhs);
720 vars = SCIPgetVars(scip);
721 assert( vars != NULL );
724 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
725 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
726 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nvars) );
727 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvars) );
728 SCIP_CALL( SCIPallocBufferArray(scip, &objinds, nvars) );
731 for (i = 0; i < nvars; i++)
733 assert( vars[i] != NULL );
734 lb[i] = primalobj ? SCIPvarGetLbLocal(vars[i]) : (SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[i])) ? SCIPvarGetLbLocal(vars[i]) : 0.0);
735 ub[i] = primalobj ? SCIPvarGetUbLocal(vars[i]) : (SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[i])) ? SCIPvarGetUbLocal(vars[i]) : 0.0);
737 obj[i] = dualobj ? SCIPvarGetObj(vars[i]) : 0.0;
746 SCIPfreeBufferArray(scip, &objinds);
747 SCIPfreeBufferArray(scip, &obj);
748 SCIPfreeBufferArray(scip, &inds);
749 SCIPfreeBufferArray(scip, &ub);
750 SCIPfreeBufferArray(scip, &lb);
759 SCIP_RELAXDATA* relaxdata,
761 SCIP_Real* lowerbound
764 char saveconsname[SCIP_MAXSTRLEN];
767 SCIP_CONS* savedsetting;
772 SCIP_Bool enforceslater;
774 SCIP_Real objforscip;
775 SCIP_Real* solforscip;
787 SCIPdebugMessage(
"calcRelax called\n");
789 assert( scip != NULL );
790 assert( relaxdata != NULL );
791 assert( result != NULL );
792 assert( lowerbound != NULL );
794 nvars = SCIPgetNVars(scip);
796 vars = SCIPgetVars (scip);
798 sdpi = relaxdata->sdpi;
799 assert( sdpi != NULL );
801 if ( relaxdata->objlimit )
808 rootnode = ! SCIPnodeGetParent(SCIPgetCurrentNode(scip));
811 if ( rootnode || (SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) == relaxdata->settingsresetofs) ||
812 ( relaxdata->settingsresetfreq > 0 && ((SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) - relaxdata->settingsresetofs) % relaxdata->settingsresetfreq == 0)) ||
819 SCIP_CONSHDLR* conshdlr;
823 conshdlr = SCIPfindConshdlr(scip,
"Savedsdpsettings");
824 if ( conshdlr == NULL )
826 SCIPerrorMessage(
"Savedsdpsettings constraint handler not found!\n");
827 return SCIP_PLUGINNOTFOUND;
832 conss = SCIPconshdlrGetConss(conshdlr);
833 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
834 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip))));
836 while ( parentconsind >= 0 && strcmp(saveconsname, SCIPconsGetName(conss[parentconsind])) )
838 if ( parentconsind >= 0 )
842 SCIPdebugMessage(
"Startsetting from parent node not found, restarting with fastest settings!\n");
848 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
849 if ( ! SCIPisInfinity(scip, timelimit) )
851 timelimit -= SCIPgetSolvingTime(scip);
852 if ( timelimit <= 0.0 )
854 SCIPdebugMessage(
"Time limit reached, not running relax SDP!\n");
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;
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;
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;
2917 assert( startXval != NULL );
2918 assert( startXcol != NULL );
2919 assert( startXrow != NULL );
2920 assert( startZval != NULL );
2921 assert( startZcol != NULL );
2922 assert( startZrow != NULL );
2925 for (b = 0; b < nblocks; b++)
2927 SCIPfreeBufferArray(scip, &startXval[b]);
2928 SCIPfreeBufferArray(scip, &startXcol[b]);
2929 SCIPfreeBufferArray(scip, &startXrow[b]);
2930 SCIPfreeBufferArray(scip, &startZval[b]);
2931 SCIPfreeBufferArray(scip, &startZcol[b]);
2932 SCIPfreeBufferArray(scip, &startZrow[b]);
2935 SCIPfreeBufferArray(scip, &startXval);
2936 SCIPfreeBufferArray(scip, &startXcol);
2937 SCIPfreeBufferArray(scip, &startXrow);
2938 SCIPfreeBufferArray(scip, &startXnblocknonz);
2939 SCIPfreeBufferArray(scip, &startZval);
2940 SCIPfreeBufferArray(scip, &startZcol);
2941 SCIPfreeBufferArray(scip, &startZrow);
2942 SCIPfreeBufferArray(scip, &startZnblocknonz);
2944 SCIPfreeBufferArray(scip, &starty);
2950 relaxdata->lastsdpnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
2953 relaxdata->sdpinterfacecalls++;
2957 if ( naddedsdpcalls )
2959 relaxdata->sdpcalls += naddedsdpcalls;
2962 relaxdata->sdpiterations += naddediters;
2966 switch( usedsetting )
2969 relaxdata->solvedpenalty++;
2972 relaxdata->solvedfast++;
2975 relaxdata->solvedmedium++;
2978 relaxdata->solvedstable++;
2981 relaxdata->unsolved++;
2988 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
2989 switch( primalslater )
2992 relaxdata->npslatercheckfailed++;
2993 switch( dualslater )
2996 relaxdata->ndslatercheckfailed++;
2997 relaxdata->nslatercheckfailed++;
3000 relaxdata->ndnoslater++;
3001 relaxdata->nnoslater++;
3004 relaxdata->ndslaterholds++;
3005 relaxdata->nslatercheckfailed++;
3008 relaxdata->nslaterinfeasible++;
3011 relaxdata->ndslatercheckfailed++;
3012 relaxdata->nslatercheckfailed++;
3017 relaxdata->npnoslater++;
3018 switch( dualslater )
3021 relaxdata->ndslatercheckfailed++;
3022 relaxdata->nnoslater++;
3025 relaxdata->ndnoslater++;
3026 relaxdata->nnoslater++;
3029 relaxdata->ndslaterholds++;
3030 relaxdata->nnoslater++;
3033 relaxdata->nslaterinfeasible++;
3036 relaxdata->ndslatercheckfailed++;
3037 relaxdata->nnoslater++;
3042 relaxdata->npslaterholds++;
3043 switch( dualslater )
3046 relaxdata->ndslatercheckfailed++;
3047 relaxdata->nslatercheckfailed++;
3050 relaxdata->ndnoslater++;
3051 relaxdata->nnoslater++;
3054 relaxdata->ndslaterholds++;
3055 relaxdata->nslaterholds++;
3058 relaxdata->nslaterinfeasible++;
3061 relaxdata->ndslatercheckfailed++;
3062 relaxdata->nslatercheckfailed++;
3067 relaxdata->npslatercheckfailed++;
3068 relaxdata->ndslatercheckfailed++;
3069 relaxdata->nslatercheckfailed++;
3074 switch( slatersetting )
3077 relaxdata->stablewslater++;
3080 relaxdata->unstablewslater++;
3083 relaxdata->penaltywslater++;
3086 relaxdata->boundedwslater++;
3089 relaxdata->unsolvedwslater++;
3092 relaxdata->stablenoslater++;
3095 relaxdata->unstablenoslater++;
3098 relaxdata->penaltynoslater++;
3101 relaxdata->boundednoslater++;
3104 relaxdata->unsolvednoslater++;
3107 relaxdata->stableinfeasible++;
3110 relaxdata->unstableinfeasible++;
3113 relaxdata->penaltyinfeasible++;
3116 relaxdata->boundedinfeasible++;
3119 relaxdata->unsolvedinfeasible++;
3129 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3131 SCIP_CALL( SCIPaddCons(scip, savedsetting) );
3132 SCIP_CALL( SCIPreleaseCons(scip, &savedsetting) );
3136 relaxdata->feasible = FALSE;
3138 if ( SCIPinProbing(scip) )
3145 #ifdef SCIP_MORE_DEBUG
3148 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3150 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &sollength) );
3152 assert( sollength == nvars );
3157 SCIPdebugMessage(
"optimal solution: objective = %f, dual feasible: %u, primal feasible: %u.\n",
3162 SCIPdebugMessage(
"The solver could not determine feasibility ! ");
3166 for (i = 0; i < nvars; ++i)
3168 SCIPdebugMessage(
"<%s> = %f\n", SCIPvarGetName(vars[i]), solforscip[i]);
3170 SCIPfreeBufferArray(scip, &solforscip);
3176 SCIPdebugMessage(
"Node cut off due to infeasibility.\n");
3177 relaxdata->feasible = FALSE;
3178 *result = SCIP_CUTOFF;
3183 SCIPdebugMessage(
"Node cut off due to objective limit.\n");
3184 relaxdata->feasible = FALSE;
3185 *result = SCIP_CUTOFF;
3190 SCIPdebugMessage(
"Node unbounded.");
3191 relaxdata->feasible = TRUE;
3192 *result = SCIP_SUCCESS;
3193 *lowerbound = -SCIPinfinity(scip);
3199 SCIP_SOL* preoptimalsol = NULL;
3200 SCIP_CONS* savedcons;
3202 SCIP_Bool preoptimalsolsuccess;
3205 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3207 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &slength) );
3209 assert( slength == nvars );
3213 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3214 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, solforscip) );
3216 *lowerbound = objforscip;
3217 relaxdata->objval = objforscip;
3220 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3222 relaxdata->feasible = TRUE;
3223 *result = SCIP_SUCCESS;
3224 preoptimalsolsuccess = FALSE;
3229 SCIP_Real maxprimalentry;
3230 int* startXnblocknonz;
3233 SCIP_Real** startXval;
3234 char consname[SCIP_MAXSTRLEN];
3239 startXnblocknonz = NULL;
3245 if ( relaxdata->warmstartpreoptsol )
3249 SCIP_Real* preoptimalvec;
3252 SCIP_CALL( SCIPallocBufferArray(scip, &preoptimalvec, nvars) );
3257 maxprimalentry = 0.0;
3258 if ( relaxdata->warmstartprimaltype == 3 )
3260 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3261 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3267 if ( startXnblocknonz[0] > -1 )
3269 preoptimalsolsuccess = TRUE;
3271 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3272 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3273 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3276 for (b = 0; b < nblocks; b++)
3278 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3279 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3280 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3284 nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3287 preoptimalsolsuccess = FALSE;
3297 maxprimalentry = 0.0;
3299 -1, NULL, NULL, NULL, NULL) );
3303 if ( preoptimalsolsuccess )
3305 assert( nvarsgiven == nvars );
3308 SCIP_CALL( SCIPcreateSol(scip, &preoptimalsol, NULL) );
3309 SCIP_CALL( SCIPsetSolVals(scip, preoptimalsol, nvars, vars, preoptimalvec) );
3312 SCIPfreeBufferArray(scip, &preoptimalvec);
3316 SCIPerrorMessage(
"Warmstarting with preoptimal solutions currently only supported for DSDP and SDPA \n");
3317 return SCIP_LPERROR;
3322 maxprimalentry = 0.0;
3323 if ( relaxdata->warmstartprimaltype == 3 )
3325 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3326 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3327 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3328 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3329 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3335 for (b = 0; b < nblocks; b++)
3337 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3338 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3339 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3351 maxprimalentry = 0.0;
3355 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3356 assert( snprintfreturn < SCIP_MAXSTRLEN );
3358 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3360 if ( relaxdata->warmstartpreoptsol )
3363 if ( preoptimalsolsuccess )
3365 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), preoptimalsol,
3366 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3368 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3369 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3374 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
3375 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3377 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3378 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3384 if ( startXnblocknonz[0] > 1 )
3386 for (b = 0; b < nblocks; b++)
3388 assert( startXval != NULL );
3389 assert( startXcol != NULL );
3390 assert( startXrow != NULL );
3392 SCIPfreeBufferArrayNull(scip, &startXval[b]);
3393 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
3394 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
3396 SCIPfreeBufferArrayNull(scip, &startXval);
3397 SCIPfreeBufferArrayNull(scip, &startXcol);
3398 SCIPfreeBufferArrayNull(scip, &startXrow);
3400 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
3404 SCIPfreeBufferArray(scip, &solforscip);
3405 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3406 if ( preoptimalsolsuccess )
3408 SCIP_CALL( SCIPfreeSol(scip, &preoptimalsol) );
3418 *result = SCIP_DIDNOTRUN;
3424 objlb = -SCIPinfinity(scip);
3426 if ( ! SCIPisInfinity(scip, objlb) )
3428 *lowerbound = objlb;
3429 SCIPdebugMessage(
"The relaxation could not be solved, using best computed bound from penalty formulation.\n");
3431 else if ( ! SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip))) )
3433 *lowerbound = SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip));
3434 SCIPdebugMessage(
"The relaxation could not be solved, keeping old bound.\n");
3438 *result = SCIP_SUSPENDED;
3439 SCIPerrorMessage(
"The relaxation of the root node could not be solved, so there is no hope to solve this instance.\n");
3443 *result = SCIP_SUCCESS;
3459 assert( scip != NULL );
3461 vars = SCIPgetVars(scip);
3464 for (i = 0; i < SCIPgetNVars(scip); i++)
3466 if ( SCIPisLT(scip, SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i])) )
3478 SCIP_RELAXDATA* relaxdata;
3486 #ifdef SCIP_EVEN_MORE_DEBUG
3487 SCIP_VAR** varsfordebug = SCIPgetVars(scip);
3488 const int nvarsfordebug = SCIPgetNVars(scip);
3491 SCIPdebugMessage(
"Calling relaxExecSdp.\n");
3493 relaxdata = SCIPrelaxGetData(relax);
3494 vars = SCIPgetVars(scip);
3495 nvars = SCIPgetNVars(scip);
3498 relaxdata->origsolved = FALSE;
3499 relaxdata->probingsolved = FALSE;
3502 if ( (relaxdata->lastsdpnode == SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) && ( ! SCIPinProbing(scip) ) ) && relaxdata->origsolved && ! relaxdata->resolve )
3505 SCIP_Real objforscip;
3506 SCIP_Real* solforscip;
3510 SCIPdebugMessage(
"Already solved SDP-relaxation for node %ld, returning with SCIP_SUCCESS so that no other relaxator is called.\n",
3511 SCIPrelaxGetData(relax)->lastsdpnode);
3515 relaxdata->feasible = TRUE;
3516 *result = SCIP_SUCCESS;
3517 *lowerbound = -SCIPinfinity(scip);
3522 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3524 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, &objforscip, solforscip, &slength) );
3526 assert( slength == nvars );
3530 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3531 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3533 *lowerbound = objforscip;
3536 SCIP_CALL( SCIPgetLPColsData(scip, &cols, &ncols) );
3537 for (i = 0; i < ncols; i++)
3539 SCIP_CALL( SCIPsetRelaxSolVal(scip, SCIPcolGetVar(cols[i]), SCIPgetSolVal(scip, scipsol, SCIPcolGetVar(cols[i]))) );
3542 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3543 *result = SCIP_SUCCESS;
3545 SCIPfreeBufferArray(scip, &solforscip);
3546 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3548 *result = SCIP_SUCCESS;
3553 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
3557 relaxdata->feasible = FALSE;
3558 *result = SCIP_CUTOFF;
3563 SCIP_CALL( SCIPflushLP(scip) );
3566 nconss = SCIPgetNConss(scip);
3568 #ifdef SCIP_EVEN_MORE_DEBUG
3569 for (i = 0; i < nvarsfordebug; i++)
3571 SCIPdebugMessage(
"variable %s: status = %u, integral = %u, bounds = [%f, %f] \n", SCIPvarGetName(varsfordebug[i]), SCIPvarGetStatus(varsfordebug[i]),
3572 SCIPvarIsIntegral(varsfordebug[i]), SCIPvarGetLbLocal(varsfordebug[i]), SCIPvarGetUbLocal(varsfordebug[i]));
3579 relaxdata->feasible = TRUE;
3580 *result = SCIP_DIDNOTRUN;
3590 SCIP_CALL( SCIPallocBufferArray(scip, &ubs, nvars) );
3593 for (i = 0; i < nvars; i++)
3595 ubs[i] = SCIPvarGetUbLocal(vars[i]);
3596 *lowerbound += SCIPvarGetObj(vars[i]) * ubs[i];
3597 assert( SCIPisFeasEQ(scip, SCIPvarGetUbLocal(vars[i]), SCIPvarGetLbLocal(vars[i])));
3600 SCIPdebugMessage(
"EVERYTHING IS FIXED, objective value = %f\n", *lowerbound);
3602 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3603 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, ubs) );
3606 for (i = 0; i < nvars; i++)
3608 SCIP_CALL( SCIPsetRelaxSolVal(scip, vars[i], SCIPvarGetLbLocal(vars[i])) );
3610 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3613 SCIP_CALL( SCIPcheckSol(scip, scipsol, FALSE, TRUE, TRUE, TRUE, TRUE, &feasible) );
3615 relaxdata->feasible = feasible;
3617 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3619 SCIPfreeBufferArray(scip, &ubs);
3621 *result = SCIP_SUCCESS;
3628 SCIP_CALL(
calcRelax(scip, relaxdata, result, lowerbound));
3639 SCIP_RELAXDATA* relaxdata;
3640 SCIP_RETCODE retcode;
3644 SCIP_Real penaltyparam;
3645 SCIP_Real maxpenaltyparam;
3647 SCIP_Real peninfeasadjust;
3649 SCIP_Real givenpenaltyparam;
3650 SCIP_Real projminevprimal;
3651 SCIP_Real projminevdual;
3652 SCIP_Real preoptgap;
3657 assert( relax != NULL );
3659 relaxdata = SCIPrelaxGetData(relax);
3660 assert( relaxdata != NULL );
3662 relaxdata->objval = 0.0;
3663 relaxdata->origsolved = FALSE;
3664 relaxdata->probingsolved = FALSE;
3665 relaxdata->sdpcalls = 0;
3666 relaxdata->sdpinterfacecalls = 0;
3667 relaxdata->sdpiterations = 0;
3668 relaxdata->solvedfast = 0;
3669 relaxdata->solvedmedium = 0;
3670 relaxdata->solvedstable = 0;
3671 relaxdata->solvedpenalty = 0;
3672 relaxdata->stablewslater = 0;
3673 relaxdata->unstablewslater = 0;
3674 relaxdata->boundedwslater = 0;
3675 relaxdata->unsolvedwslater = 0;
3676 relaxdata->stablenoslater = 0;
3677 relaxdata->unsolvednoslater = 0;
3678 relaxdata->boundednoslater = 0;
3679 relaxdata->unsolvednoslater = 0;
3680 relaxdata->nslaterholds = 0;
3681 relaxdata->nnoslater = 0;
3682 relaxdata->nslatercheckfailed = 0;
3683 relaxdata->npslaterholds = 0;
3684 relaxdata->npnoslater = 0;
3685 relaxdata->npslatercheckfailed = 0;
3686 relaxdata->ndslaterholds = 0;
3687 relaxdata->ndnoslater = 0;
3688 relaxdata->ndslatercheckfailed = 0;
3689 relaxdata->nslaterinfeasible = 0;
3690 relaxdata->stableinfeasible = 0;
3691 relaxdata->unstableinfeasible = 0;
3692 relaxdata->penaltyinfeasible = 0;
3693 relaxdata->boundedinfeasible = 0;
3694 relaxdata->unsolvedinfeasible = 0;
3695 relaxdata->roundingprobinf = 0;
3696 relaxdata->primalroundfails = 0;
3697 relaxdata->dualroundfails = 0;
3698 relaxdata->roundstartsuccess = 0;
3699 relaxdata->roundingoptimal = 0;
3700 relaxdata->roundingcutoff = 0;
3701 relaxdata->roundingprobtime = 0.0;
3702 relaxdata->unsolved = 0;
3703 relaxdata->feasible = FALSE;
3705 relaxdata->ipXexists = FALSE;
3706 relaxdata->ipZexists = FALSE;
3708 nvars = SCIPgetNVars(scip);
3709 vars = SCIPgetVars(scip);
3721 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", &gaptol) );
3723 if ( retcode == SCIP_PARAMETERUNKNOWN )
3725 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3726 "SDP Solver <%s>: gaptol setting not available -- SCIP parameter has no effect.\n",
3731 SCIP_CALL( retcode );
3734 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolverfeastol", &feastol) );
3736 if ( retcode == SCIP_PARAMETERUNKNOWN )
3738 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3739 "SDP Solver <%s>: sdpsolverfeastol setting not available -- SCIP parameter has no effect.\n",
3744 SCIP_CALL( retcode );
3748 if ( retcode == SCIP_PARAMETERUNKNOWN )
3750 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3751 "SDP Solver <%s>: epsilon setting not available -- SCIP parameter has no effect.\n",
3756 SCIP_CALL( retcode );
3760 if ( retcode == SCIP_PARAMETERUNKNOWN )
3762 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3763 "SDP Solver <%s>: feastol setting not available -- SCIP parameter has no effect.\n",
3768 SCIP_CALL( retcode );
3772 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/penaltyparam", &penaltyparam) );
3773 if ( SCIPisGE(scip, penaltyparam, 0.0) )
3776 givenpenaltyparam = penaltyparam;
3777 if ( retcode == SCIP_PARAMETERUNKNOWN )
3779 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3780 "SDP Solver <%s>: penaltyparam setting not available -- SCIP parameter has no effect\n",
3785 SCIP_CALL( retcode );
3795 for (v = 0; v < nvars; v++)
3797 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxcoeff) )
3798 maxcoeff = REALABS(SCIPvarGetObj(vars[v]));
3805 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/maxpenaltyparam", &maxpenaltyparam) );
3806 if ( SCIPisGE(scip, maxpenaltyparam, 0.0) )
3810 if ( retcode == SCIP_PARAMETERUNKNOWN )
3812 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3813 "SDP Solver <%s>: maxpenaltyparam setting not available -- SCIP parameter has no effect.\n",
3818 SCIP_CALL( retcode );
3822 if ( SCIPisLT(scip, givenpenaltyparam, maxpenaltyparam) )
3824 SCIPdebugMessage(
"Penalty parameter %f overwritten by maxpenaltyparam %f! \n", givenpenaltyparam, maxpenaltyparam);
3830 SCIP_Real givenmaxpenaltyparam;
3836 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/npenaltyincr", &npenaltyincr) );
3838 if ( retcode == SCIP_PARAMETERUNKNOWN )
3840 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3841 "SDP Solver <%s>: npenaltyincr setting not available -- SCIP parameter has no effect.\n",
3846 SCIP_CALL( retcode );
3850 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/peninfeasadjust", &peninfeasadjust) );
3853 if ( retcode == SCIP_PARAMETERUNKNOWN )
3855 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3856 "SDP Solver <%s>: peninfeasadjust setting not available -- SCIP parameter has no effect.\n",
3861 SCIP_CALL( retcode );
3868 SCIP_Real lambdastar;
3870 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/lambdastar", &lambdastar) );
3871 if ( SCIPisGE(scip, lambdastar, 0.0) )
3884 conss = SCIPgetConss(scip);
3885 nconss = SCIPgetNConss(scip);
3888 for (c = 0; c < nconss; c++)
3891 if ( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0 )
3894 if ( (! SCIPisInfinity(scip, maxguess) ) && SCIPisGT(scip, guess, maxguess) )
3904 relaxdata->lambdastar = 1.0;
3906 if ( retcode == SCIP_PARAMETERUNKNOWN )
3908 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3909 "SDP Solver <%s>: lambdastar setting not available -- SCIP parameter has no effect.\n",
3914 SCIP_CALL( retcode );
3918 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevpri", &projminevprimal) );
3919 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevdu", &projminevdual) );
3921 if ( SCIPisGE(scip, projminevprimal, 0.0) && SCIPisGE(scip, projminevdual, 0.0) )
3923 relaxdata->warmstartprojminevprimal = projminevprimal;
3924 relaxdata->warmstartprojminevdual = projminevdual;
3926 else if ( SCIPisGE(scip, projminevprimal, 0.0) && relaxdata->warmstartprojpdsame )
3928 relaxdata->warmstartprojminevprimal = projminevprimal;
3929 relaxdata->warmstartprojminevdual = projminevprimal;
3931 else if ( SCIPisGE(scip, projminevdual, 0.0) && relaxdata->warmstartprojpdsame )
3933 relaxdata->warmstartprojminevprimal = projminevdual;
3934 relaxdata->warmstartprojminevdual = projminevdual;
3938 SCIP_CONSHDLR* sdpconshdlr;
3939 SCIP_CONS** sdpblocks;
3943 SCIP_Real maxsdprhs;
3945 SCIP_Real maxsdpcoef;
3950 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
3951 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
3952 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
3956 for (b = 0; b < nsdpblocks; b++)
3959 if ( SCIPisGT(scip, sdpcoef, maxsdpcoef) )
3960 maxsdpcoef = sdpcoef;
3966 for (b = 0; b < nsdpblocks; b++)
3974 for (v = 0; v < nvars; v++)
3976 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxobj) )
3977 maxobj = REALABS(SCIPvarGetObj(vars[v]));
3980 if ( relaxdata->warmstartprojpdsame )
3982 maxval = SCIPisGT(scip, maxsdprhs, maxobj) ? maxsdprhs : maxobj;
3983 maxval = SCIPisGT(scip, maxsdpcoef, maxval) ? maxsdpcoef : maxval;
3988 SCIPdebugMsg(scip,
"Setting warmstartprojminev to %f\n", relaxdata->warmstartprojminevdual);
3992 if ( ! SCIPisGE(scip, projminevprimal, 0.0) )
3996 SCIPdebugMsg(scip,
"Setting warmstartprojminevprimal to %f\n", relaxdata->warmstartprojminevprimal);
3999 if ( ! SCIPisGE(scip, projminevdual, 0.0) )
4003 SCIPdebugMsg(scip,
"Setting warmstartprojminevdual to %f\n", relaxdata->warmstartprojminevdual);
4008 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/sdpinfo", &sdpinfo) );
4010 if ( retcode == SCIP_PARAMETERUNKNOWN )
4012 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4013 "SDP Solver <%s>: sdpinfo setting not available -- SCIP parameter has no effect.\n",
4018 SCIP_CALL( retcode );
4021 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/sdpsolverthreads", &nthreads) );
4026 if ( retcode == SCIP_PARAMETERUNKNOWN )
4028 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4029 "SDP Solver <%s>: nthreads setting not available -- SCIP parameter has no effect.\n",
4034 SCIP_CALL( retcode );
4038 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/slatercheck", &slatercheck) );
4040 if ( retcode == SCIP_PARAMETERUNKNOWN )
4042 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4043 "SDP Solver <%s>: slatercheck setting not available -- SCIP parameter has no effect.\n",
4048 SCIP_CALL( retcode );
4057 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartpreoptgap", &preoptgap) );
4059 if ( retcode == SCIP_PARAMETERUNKNOWN )
4061 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4062 "SDP Solver <%s>: warmstartpreoptgap setting not available -- SCIP parameter has no effect.\n",
4067 SCIP_CALL( retcode );
4078 assert( scip != NULL );
4079 assert( relax != NULL );
4080 assert( strcmp(SCIPrelaxGetName(relax),
RELAX_NAME) == 0 );
4091 SCIP_RELAXDATA* relaxdata;
4093 assert( scip != NULL );
4094 assert( relax != NULL );
4096 relaxdata = SCIPrelaxGetData(relax);
4097 assert( relaxdata != NULL );
4099 SCIPdebugMessage(
"Exiting Relaxation Handler.\n");
4101 if ( relaxdata->displaystat && SCIPgetSubscipDepth(scip) == 0 )
4103 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"\nSDP iterations:\t\t\t\t%6d\n", relaxdata->sdpiterations);
4104 if ( relaxdata->sdpcalls )
4106 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Average SDP-iterations:\t\t\t%6.2f \n", (SCIP_Real) relaxdata->sdpiterations / (SCIP_Real) relaxdata->sdpcalls );
4108 if ( relaxdata->sdpinterfacecalls )
4112 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4113 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'medium settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedmedium / (SCIP_Real) relaxdata->sdpinterfacecalls);
4114 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedstable / (SCIP_Real) relaxdata->sdpinterfacecalls);
4118 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'default formulation' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4120 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage penalty formulation used:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedpenalty / (SCIP_Real) relaxdata->sdpinterfacecalls);
4121 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);
4123 if ( relaxdata->slatercheck )
4125 if ( relaxdata->sdpinterfacecalls )
4127 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);
4128 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);
4129 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);
4131 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);
4132 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);
4133 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);
4134 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);
4136 if ( relaxdata->nslaterholds )
4138 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with primal and dual slater holding:\t%6.2f \n",
4139 100.0 * (SCIP_Real) relaxdata->stablewslater / (SCIP_Real) relaxdata->nslaterholds);
4140 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with primal and dual slater holding:\t%6.2f \n",
4141 100.0 * (SCIP_Real) relaxdata->unstablewslater / (SCIP_Real) relaxdata->nslaterholds);
4142 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with primal and dual slater holding:\t%6.2f \n",
4143 100.0 * (SCIP_Real) relaxdata->penaltywslater / (SCIP_Real) relaxdata->nslaterholds);
4144 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with primal and dual slater holding:\t%6.2f \n",
4145 100.0 * (SCIP_Real) relaxdata->boundedwslater / (SCIP_Real) relaxdata->nslaterholds);
4146 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with primal and dual slater holding:\t%6.2f \n",
4147 100.0 * (SCIP_Real) relaxdata->unsolvedwslater / (SCIP_Real) relaxdata->nslaterholds);
4149 if ( relaxdata->nnoslater )
4151 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with either primal or dual slater not holding:\t%6.2f \n",
4152 100.0 * (SCIP_Real) relaxdata->stablenoslater / (SCIP_Real) relaxdata->nnoslater);
4153 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with either primal or dual slater not holding:\t%6.2f \n",
4154 100.0 * (SCIP_Real) relaxdata->unstablenoslater / (SCIP_Real) relaxdata->nnoslater);
4155 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with either primal or dual slater not holding:\t%6.2f \n",
4156 100.0 * (SCIP_Real) relaxdata->penaltynoslater / (SCIP_Real) relaxdata->nnoslater);
4157 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with either primal or dual slater not holding:\t%6.2f \n",
4158 100.0 * (SCIP_Real) relaxdata->boundednoslater / (SCIP_Real) relaxdata->nnoslater);
4159 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with either primal or dual slater not holding:\t%6.2f \n",
4160 100.0 * (SCIP_Real) relaxdata->unsolvednoslater / (SCIP_Real) relaxdata->nnoslater);
4162 if ( relaxdata->nslaterinfeasible )
4164 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with slater check showing infeasibility:\t%6.2f \n",
4165 100.0 * (SCIP_Real) relaxdata->stableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4166 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with slater check showing infeasibility:\t%6.2f \n",
4167 100.0 * (SCIP_Real) relaxdata->unstableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4168 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with slater check showing infeasibility:\t%6.2f \n",
4169 100.0 * (SCIP_Real) relaxdata->penaltyinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4170 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with slater check showing infeasibility:\t%6.2f \n",
4171 100.0 * (SCIP_Real) relaxdata->boundedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4172 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with slater check showing infeasibility:\t%6.2f \n",
4173 100.0 * (SCIP_Real) relaxdata->unsolvedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4175 #ifdef SLATERSOLVED_ABSOLUTE
4176 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with primal and dual slater holding:\t%d \n", relaxdata->nslaterholds);
4177 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and primal and dual slater holding:\t%d \n", relaxdata->stablewslater);
4178 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and primal and dual slater holding:\t%d \n", relaxdata->unstablewslater);
4179 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and primal and dual slater holding:\t%d \n", relaxdata->penaltywslater);
4180 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);
4181 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and primal and dual slater holding:\t%d \n", relaxdata->unsolvedwslater);
4183 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with either primal or dual slater not holding:\t%d \n", relaxdata->nnoslater);
4184 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);
4185 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);
4186 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and either primal or dual slater not holding:\t%d \n", relaxdata->penaltynoslater);
4187 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);
4188 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and either primal or dual slater not holding:\t%d \n", relaxdata->unsolvednoslater);
4190 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes:\t%d \n", relaxdata->nslaterinfeasible);
4191 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'fastest settings':\t%d \n", relaxdata->stableinfeasible);
4192 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'stable settings':\t%d \n", relaxdata->unstableinfeasible);
4193 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'penalty':\t%d \n", relaxdata->penaltyinfeasible);
4194 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'computed infeasible lower bound':\t%d \n", relaxdata->boundedinfeasible);
4195 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'unsolved':\t%d \n", relaxdata->unsolvedinfeasible);
4198 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4200 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes detected infeasible through primal rounding problem:\t%d \n", relaxdata->roundingprobinf);
4201 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes that were successfully warmstarted using the rounding problems:\t%d \n", relaxdata->roundstartsuccess);
4202 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the primal rounding problem failed:\t%d \n", relaxdata->primalroundfails);
4203 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the dual rounding problem failed:\t%d \n", relaxdata->dualroundfails);
4204 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the optimal solution was determined by the rounding problem:\t%d \n", relaxdata->roundingoptimal);
4205 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes cut off through bounding by the rounding problem:\t%d \n", relaxdata->roundingcutoff);
4206 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Time spent in rounding problems for warmstarting / detecting infeasibility:\t%f s \n", relaxdata->roundingprobtime);
4210 if ( relaxdata->varmapper != NULL )
4213 relaxdata->varmapper = NULL;
4217 if ( relaxdata->warmstart && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->nblocks > 0 )
4221 for (b = 0; b < relaxdata->nblocks; b++)
4225 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXval[b]), relaxdata->ipXnblocknonz[b]);
4226 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXcol[b]), relaxdata->ipXnblocknonz[b]);
4227 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXrow[b]), relaxdata->ipXnblocknonz[b]);
4229 if ( relaxdata->ipZnblocknonz[b] > 0 )
4231 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZval[b]), relaxdata->ipZnblocknonz[b]);
4232 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZcol[b]), relaxdata->ipZnblocknonz[b]);
4233 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZrow[b]), relaxdata->ipZnblocknonz[b]);
4238 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXval, relaxdata->nblocks);
4239 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXcol, relaxdata->nblocks);
4240 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXrow, relaxdata->nblocks);
4241 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks);
4243 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZval, relaxdata->nblocks);
4244 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZcol, relaxdata->nblocks);
4245 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZrow, relaxdata->nblocks);
4246 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks);
4247 SCIP_CALL( SCIPfreeSol(scip, &relaxdata->ipy) );
4250 relaxdata->objval = 0.0;
4251 relaxdata->origsolved = FALSE;
4252 relaxdata->probingsolved = FALSE;
4253 relaxdata->feasible = FALSE;
4254 relaxdata->sdpiterations = 0;
4255 relaxdata->sdpcalls = 0;
4256 relaxdata->sdpinterfacecalls = 0;
4257 relaxdata->lastsdpnode = 0;
4258 relaxdata->unsolved = 0;
4268 SCIP_RELAXDATA* relaxdata;
4270 relaxdata = SCIPrelaxGetData(relax);
4271 assert(relaxdata != NULL);
4273 if ( relaxdata->sdpi != NULL )
4277 if ( relaxdata->lpi != NULL )
4279 SCIP_CALL( SCIPlpiFree(&(relaxdata->lpi)) );
4282 SCIPfreeMemory(scip, &relaxdata);
4284 SCIPrelaxSetData(relax, NULL);
4294 SCIP_RELAXDATA* relaxdata = NULL;
4299 assert( scip != NULL );
4302 SCIP_CALL( SCIPallocMemory(scip, &relaxdata) );
4303 SCIP_CALL(
SCIPsdpiCreate(&sdpi, SCIPgetMessagehdlr(scip), SCIPblkmem(scip), SCIPbuffer(scip)) );
4304 SCIP_CALL( SCIPlpiCreate(&lpi, SCIPgetMessagehdlr(scip),
"SDProundingProb", SCIP_OBJSEN_MINIMIZE) );
4306 relaxdata->sdpi = sdpi;
4307 relaxdata->lpi = lpi;
4308 relaxdata->lastsdpnode = -1;
4309 relaxdata->nblocks = 0;
4310 relaxdata->varmapper = NULL;
4314 assert( relax != NULL );
4317 SCIP_CALL( SCIPsetRelaxInitsol(scip, relax, relaxInitSolSdp) );
4318 SCIP_CALL( SCIPsetRelaxExitsol(scip, relax, relaxExitSolSdp) );
4319 SCIP_CALL( SCIPsetRelaxFree(scip, relax, relaxFreeSdp) );
4320 SCIP_CALL( SCIPsetRelaxCopy(scip, relax, relaxCopySdp) );
4323 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolvergaptol",
4324 "the stopping criterion for the duality gap the sdpsolver should use",
4327 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolverfeastol",
4328 "the feasibility tolerance for the SDP solver",
4331 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/penaltyparam",
4332 "the starting value of the penalty parameter Gamma used for the penalty formulation if the "
4333 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->penaltyparam),
4336 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/maxpenaltyparam",
4337 "the maximum value of the penalty parameter Gamma used for the penalty formulation if the "
4338 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->maxpenaltyparam),
4341 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/peninfeasadjust",
4342 "gap- or feastol will be multiplied by this before checking for infeasibility using the penalty formulation", &(relaxdata->peninfeasadjust),
4345 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartipfactor",
4346 "factor for interior point in convexcombination of IP and parent solution, if warmstarts are enabled", &(relaxdata->warmstartipfactor),
4349 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartprimaltype",
4350 "how to warmstart the primal problem? 1: scaled identity/analytic center, 2: elementwise reciprocal, 3: saved primal sol", &(relaxdata->warmstartprimaltype), TRUE,
4353 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartiptype",
4354 "which interior point to use for convex combination for warmstarts? 1: scaled identity, 2: analytic center", &(relaxdata->warmstartiptype), TRUE,
4357 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartproject",
4358 "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,
4361 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevpri",
4362 "minimum eigenvalue to allow when projecting primal matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevprimalpar),
4365 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevdu",
4366 "minimum eigenvalue to allow when projecting dual matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevdualpar),
4369 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartprojpdsame",
4370 "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 ?",
4373 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartpreoptsol",
4374 "Should a preoptimal solution (with larger gap) instead of the optimal solution be used for warmstarts",
4377 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartpreoptgap",
4378 "If warmstartpreoptsol is TRUE, this is the gap where the preoptimal solution will be saved", &(relaxdata->warmstartpreoptgap),
4381 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartroundonlyinf",
4382 "Only use solution of roundingproblem to detect infeasibility (only has an effect for warmstartproject = 4)",
4385 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/npenaltyincr",
4386 "maximum number of times the penalty parameter will be increased if the penalty formulation failed", &(relaxdata->npenaltyincr), TRUE,
4389 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/lambdastar",
4390 "the parameter lambda star used by SDPA to set the initial point;"
4391 "set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->lambdastar),
4394 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/slatercheck",
4395 "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 "
4396 "every problem not satisfying primal and dual Slater condition", &(relaxdata->slatercheck), TRUE,
DEFAULT_SLATERCHECK, 0, 2, NULL, NULL) );
4398 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/sdpinfo",
4399 "Should the SDP solver output information to the screen?",
4402 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstart",
4403 "Should the SDP solver try to use warmstarts?",
4406 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/objlimit",
4407 "Should an objective limit be given to the SDP-Solver?",
4410 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/resolve",
4411 "Should the relaxation be resolved after bound-tightenings were found during propagation (outside of probing)?",
4414 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/tightenvb",
4415 "Should Big-Ms in varbound-like constraints be tightened before giving them to the SDP-solver ?",
4418 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/displaystatistics",
4419 "Should statistics about SDP iterations and solver settings/success be printed after quitting SCIP-SDP ?",
4422 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetfreq",
4423 "frequency for resetting parameters in SDP solver and trying again with fastest settings (-1: never, 0: only at depth settingsresetofs);"
4424 "currently only supported for SDPA",
4427 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetofs",
4428 "frequency offset for resetting parameters in SDP solver and trying again with fastest settings; currently only supported for SDPA",
4431 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/sdpsolverthreads",
4432 "number of threads the SDP solver should use (-1 = number of cores); currently only supported for MOSEK",
4453 SCIP_CONSHDLR* sdpconshdlr;
4454 SCIP_RELAXDATA* relaxdata;
4456 assert( scip != NULL );
4457 assert( relax != NULL );
4458 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
4460 SCIPdebugMsg(scip,
"computing analytic centers for warmstarting\n");
4462 relaxdata = SCIPrelaxGetData(relax);
4465 if ( relaxdata->ipXexists || relaxdata->ipZexists )
4467 SCIPdebugMsg(scip,
"aborting SCIPrelaxSdpComputeAnalyticCenters since analytic centers have already been computed\n");
4471 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
4474 if ( relaxdata->warmstart && (relaxdata->warmstartiptype == 2) && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && (SCIPconshdlrGetNConss(sdpconshdlr) + SCIPgetNLPRows(scip) > 0 ) )
4478 relaxdata->nblocks = SCIPgetNLPRows(scip) + SCIPgetNVars(scip) > 0 ? SCIPconshdlrGetNConss(sdpconshdlr) + 1 : SCIPconshdlrGetNConss(sdpconshdlr);
4480 if ( SCIPgetNVars(scip) > 0 )
4484 SCIP_CONS** sdpblocks;
4485 SCIP_Real* solforscip;
4487 SCIP_Real timelimit;
4510 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4511 if ( ! SCIPisInfinity(scip, timelimit) )
4513 timelimit -= SCIPgetSolvingTime(scip);
4514 if ( timelimit <= 0.0 )
4519 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4522 relaxdata->sdpinterfacecalls++;
4526 if ( naddedsdpcalls )
4528 relaxdata->sdpcalls += naddedsdpcalls;
4531 relaxdata->sdpiterations += naddediters;
4535 switch( usedsetting )
4538 relaxdata->solvedpenalty++;
4541 relaxdata->solvedfast++;
4544 relaxdata->solvedmedium++;
4547 relaxdata->solvedstable++;
4550 relaxdata->unsolved++;
4557 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4558 switch( primalslater )
4561 relaxdata->npslatercheckfailed++;
4562 switch( dualslater )
4565 relaxdata->ndslatercheckfailed++;
4566 relaxdata->nslatercheckfailed++;
4569 relaxdata->ndnoslater++;
4570 relaxdata->nnoslater++;
4573 relaxdata->ndslaterholds++;
4574 relaxdata->nslatercheckfailed++;
4577 relaxdata->nslaterinfeasible++;
4580 relaxdata->ndslatercheckfailed++;
4581 relaxdata->nslatercheckfailed++;
4586 relaxdata->npnoslater++;
4587 switch( dualslater )
4590 relaxdata->ndslatercheckfailed++;
4591 relaxdata->nnoslater++;
4594 relaxdata->ndnoslater++;
4595 relaxdata->nnoslater++;
4598 relaxdata->ndslaterholds++;
4599 relaxdata->nnoslater++;
4602 relaxdata->nslaterinfeasible++;
4605 relaxdata->ndslatercheckfailed++;
4606 relaxdata->nnoslater++;
4611 relaxdata->npslaterholds++;
4612 switch( dualslater )
4615 relaxdata->ndslatercheckfailed++;
4616 relaxdata->nslatercheckfailed++;
4619 relaxdata->ndnoslater++;
4620 relaxdata->nnoslater++;
4623 relaxdata->ndslaterholds++;
4624 relaxdata->nslaterholds++;
4627 relaxdata->nslaterinfeasible++;
4630 relaxdata->ndslatercheckfailed++;
4631 relaxdata->nslatercheckfailed++;
4636 relaxdata->npslatercheckfailed++;
4637 relaxdata->ndslatercheckfailed++;
4638 relaxdata->nslatercheckfailed++;
4643 switch( slatersetting )
4646 relaxdata->stablewslater++;
4649 relaxdata->unstablewslater++;
4652 relaxdata->penaltywslater++;
4655 relaxdata->boundedwslater++;
4658 relaxdata->unsolvedwslater++;
4661 relaxdata->stablenoslater++;
4664 relaxdata->unstablenoslater++;
4667 relaxdata->penaltynoslater++;
4670 relaxdata->boundednoslater++;
4673 relaxdata->unsolvednoslater++;
4676 relaxdata->stableinfeasible++;
4679 relaxdata->unstableinfeasible++;
4682 relaxdata->penaltyinfeasible++;
4685 relaxdata->boundedinfeasible++;
4688 relaxdata->unsolvedinfeasible++;
4697 int npenaltybounds = 0;
4699 relaxdata->ipXexists = TRUE;
4702 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4703 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4704 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4705 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4708 for (b = 0; b < relaxdata->nblocks; b++)
4710 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4711 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4712 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4717 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval) );
4720 for (i = 0; i < relaxdata->ipXnblocknonz[relaxdata->nblocks - 1]; i++)
4726 if ( npenaltybounds > 0 )
4728 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXrow[relaxdata->nblocks - 1],
4729 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4730 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXcol[relaxdata->nblocks - 1],
4731 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4732 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXval[relaxdata->nblocks - 1],
4733 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4734 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] = relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds;
4737 for (b = 0; b < relaxdata->nblocks; b++)
4740 SCIPsdpVarfixerSortRowCol(relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]);
4743 #ifdef SCIP_PRINT_WARMSTART
4744 SCIPdebugMessage(
"Computed primal analytic center:\n");
4745 for (b = 0; b < relaxdata->nblocks; b++)
4747 SCIPdebugMessage(
"primal matrix, block %d:\n", b);
4748 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4750 SCIPdebugMessage(
"X_%d[%d,%d]: %f\n", b, relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
4757 relaxdata->ipXexists = TRUE;
4759 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4760 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4761 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4762 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4764 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
4766 for (b = 0; b < relaxdata->nblocks; b++)
4768 if ( b < relaxdata->nblocks - 1 )
4776 relaxdata->ipXnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
4778 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4779 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4780 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4782 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4784 relaxdata->ipXrow[b][i] = i;
4785 relaxdata->ipXcol[b][i] = i;
4786 relaxdata->ipXval[b][i] = relaxdata->lambdastar;
4790 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of primal feasible set, using scaled identity instead.\n");
4799 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4800 if ( ! SCIPisInfinity(scip, timelimit) )
4802 timelimit -= SCIPgetSolvingTime(scip);
4803 if ( timelimit <= 0.0 )
4808 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4814 if ( naddedsdpcalls )
4816 relaxdata->sdpinterfacecalls++;
4817 relaxdata->sdpcalls += naddedsdpcalls;
4820 relaxdata->sdpiterations += naddediters;
4824 switch( usedsetting )
4827 relaxdata->solvedpenalty++;
4830 relaxdata->solvedfast++;
4833 relaxdata->solvedmedium++;
4836 relaxdata->solvedstable++;
4839 relaxdata->unsolved++;
4846 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4847 switch( primalslater )
4850 relaxdata->npslatercheckfailed++;
4851 switch( dualslater )
4854 relaxdata->ndslatercheckfailed++;
4855 relaxdata->nslatercheckfailed++;
4858 relaxdata->ndnoslater++;
4859 relaxdata->nnoslater++;
4862 relaxdata->ndslaterholds++;
4863 relaxdata->nslatercheckfailed++;
4866 relaxdata->nslaterinfeasible++;
4869 relaxdata->ndslatercheckfailed++;
4870 relaxdata->nslatercheckfailed++;
4875 relaxdata->npnoslater++;
4876 switch( dualslater )
4879 relaxdata->ndslatercheckfailed++;
4880 relaxdata->nnoslater++;
4883 relaxdata->ndnoslater++;
4884 relaxdata->nnoslater++;
4887 relaxdata->ndslaterholds++;
4888 relaxdata->nnoslater++;
4891 relaxdata->nslaterinfeasible++;
4894 relaxdata->ndslatercheckfailed++;
4895 relaxdata->nnoslater++;
4900 relaxdata->npslaterholds++;
4901 switch( dualslater )
4904 relaxdata->ndslatercheckfailed++;
4905 relaxdata->nslatercheckfailed++;
4908 relaxdata->ndnoslater++;
4909 relaxdata->nnoslater++;
4912 relaxdata->ndslaterholds++;
4913 relaxdata->nslaterholds++;
4916 relaxdata->nslaterinfeasible++;
4919 relaxdata->ndslatercheckfailed++;
4920 relaxdata->nslatercheckfailed++;
4925 relaxdata->npslatercheckfailed++;
4926 relaxdata->ndslatercheckfailed++;
4927 relaxdata->nslatercheckfailed++;
4932 switch( slatersetting )
4935 relaxdata->stablewslater++;
4938 relaxdata->unstablewslater++;
4941 relaxdata->penaltywslater++;
4944 relaxdata->boundedwslater++;
4947 relaxdata->unsolvedwslater++;
4950 relaxdata->stablenoslater++;
4953 relaxdata->unstablenoslater++;
4956 relaxdata->penaltynoslater++;
4959 relaxdata->boundednoslater++;
4962 relaxdata->unsolvednoslater++;
4965 relaxdata->stableinfeasible++;
4968 relaxdata->unstableinfeasible++;
4971 relaxdata->penaltyinfeasible++;
4974 relaxdata->boundedinfeasible++;
4977 relaxdata->unsolvedinfeasible++;
4989 relaxdata->ipZexists = TRUE;
4991 nvars = SCIPgetNVars(scip);
4992 vars = SCIPgetVars(scip);
4995 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
4996 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
4997 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
4998 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5001 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
5004 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solforscip, &slength) );
5006 assert( slength == nvars );
5010 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5011 SCIP_CALL( SCIPsetSolVals(scip, relaxdata->ipy, nvars, vars, solforscip) );
5012 #ifdef SCIP_PRINT_WARMSTART
5013 SCIPdebugMessage(
"Computed dual analytic center:\n");
5014 for (i = 0; i < nvars; i++)
5016 SCIPdebugMessage(
"y[%d] = %f\n", i, solforscip[i]);
5020 SCIPfreeBufferArray(scip, &solforscip);
5023 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
5024 for (b = 0; b < relaxdata->nblocks - 1; b++)
5027 arraylength = relaxdata->ipZnblocknonz[b];
5029 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5030 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5031 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5034 SCIP_CALL(
SCIPconsSdpComputeSparseSdpMatrix(scip, sdpblocks[b], relaxdata->ipy, &(relaxdata->ipZnblocknonz[b]), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b]) );
5036 assert( relaxdata->ipZnblocknonz[b] <= arraylength );
5038 if ( relaxdata->ipZnblocknonz[b] < arraylength )
5040 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5041 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5042 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZval[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5046 SCIPsdpVarfixerSortRowCol(relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]);
5050 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
5051 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], 2 * nrows + 2 * nvars) );
5052 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], 2 * nrows + 2 * nvars) );
5053 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], 2 * nrows + 2 * nvars) );
5056 relaxdata->ipZnblocknonz[b] = 2 * nrows + 2 * nvars;
5058 for (r = 0; r < nrows; r++)
5062 rownnonz = SCIProwGetNNonz(rows[r]);
5063 rowvals = SCIProwGetVals(rows[r]);
5064 rowcols = SCIProwGetCols(rows[r]);
5065 for (i = 0; i < rownnonz; i++)
5066 rowval += SCIPgetSolVal(scip, relaxdata->ipy, SCIPcolGetVar(rowcols[i])) * rowvals[i];
5068 relaxdata->ipZrow[b][2*r] = 2*r;
5069 relaxdata->ipZcol[b][2*r] = 2*r;
5070 relaxdata->ipZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
5071 relaxdata->ipZrow[b][2*r + 1] = 2*r + 1;
5072 relaxdata->ipZcol[b][2*r + 1] = 2*r + 1;
5073 relaxdata->ipZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
5076 for (v = 0; v < nvars; v++)
5078 relaxdata->ipZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
5079 relaxdata->ipZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
5080 relaxdata->ipZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, relaxdata->ipy, vars[v]) - SCIPvarGetLbLocal(vars[v]);
5081 relaxdata->ipZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5082 relaxdata->ipZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5083 relaxdata->ipZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
5085 #ifdef SCIP_PRINT_WARMSTART
5086 for (b = 0; b < relaxdata->nblocks - 1; b++)
5088 SCIPdebugMessage(
"dual matrix, block %d:\n", b);
5089 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
5091 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", b, relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
5094 SCIPdebugMessage(
"dual matrix, LP constraints:\n");
5095 for (r = 0; r < nrows; r++)
5097 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r], relaxdata->ipZcol[b][2*r], relaxdata->ipZval[b][2*r]);
5098 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]);
5100 for (v = 0; v < nvars; v++)
5102 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5103 relaxdata->ipZrow[b][2*nrows + 2*v], relaxdata->ipZcol[b][2*nrows + 2*v], relaxdata->ipZval[b][2*nrows + 2*v]);
5104 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5105 relaxdata->ipZrow[b][2*nrows + 2*v + 1], relaxdata->ipZcol[b][2*nrows + 2*v + 1], relaxdata->ipZval[b][2*nrows + 2*v + 1]);
5112 relaxdata->ipZexists = TRUE;
5115 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5117 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
5118 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
5119 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
5120 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5122 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
5124 for (b = 0; b < relaxdata->nblocks; b++)
5126 if ( b < relaxdata->nblocks - 1 )
5134 relaxdata->ipZnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
5136 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5137 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5138 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5140 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5142 relaxdata->ipZrow[b][i] = i;
5143 relaxdata->ipZcol[b][i] = i;
5144 relaxdata->ipZval[b][i] = relaxdata->lambdastar;
5148 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of dual feasible set, using scaled identity instead.\n");
5171 SCIP_RELAXDATA* relaxdata;
5173 assert( relax != NULL );
5174 assert( lbvars != NULL );
5175 assert( ubvars != NULL );
5176 assert( arraylength != NULL );
5177 assert( *arraylength >= 0 );
5179 relaxdata = SCIPrelaxGetData(relax);
5180 assert( relaxdata != NULL );
5194 SCIP_RELAXDATA* relaxdata;
5196 assert( relax != NULL );
5197 assert( success != NULL );
5198 assert( objval != NULL );
5200 relaxdata = SCIPrelaxGetData(relax);
5201 assert( relaxdata != NULL );
5203 *success = relaxdata->origsolved;
5204 *objval = relaxdata->objval;
5214 SCIP_Real* solarray,
5218 SCIP_RELAXDATA* relaxdata;
5220 assert( relax != NULL );
5221 assert( success != NULL );
5222 assert( solarray != NULL );
5224 relaxdata = SCIPrelaxGetData(relax);
5225 assert( relaxdata != NULL );
5227 *success = relaxdata->origsolved;
5229 if ( *sollength >= SCIPgetNVars(scip) )
5231 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solarray, sollength) );
5235 SCIPdebugMessage(
"Called SCIPrelaxSdpGetRelaxSol with an array that wasn't big enough, needed length %d, given %d!\n", SCIPgetNVars(scip), *sollength);
5236 *sollength = SCIPgetNVars(scip);
5247 assert( relax != NULL );
5248 assert( SCIPrelaxGetData(relax) != NULL );
5250 return SCIPrelaxGetData(relax)->lastsdpnode;
5258 SCIP_RELAXDATA* relaxdata;
5260 assert( relax != NULL );
5262 relaxdata = SCIPrelaxGetData(relax);
5264 assert( relaxdata != NULL );
5265 assert( relaxdata->sdpi != NULL );
5275 SCIP_RELAXDATA* relaxdata;
5277 assert( relax != NULL );
5279 relaxdata = SCIPrelaxGetData(relax);
5281 assert( relaxdata != NULL );
5282 assert( relaxdata->sdpi != NULL );
5284 return relaxdata->probingsolved;
5292 assert( relax != NULL );
5293 assert( SCIPrelaxGetData(relax) != NULL );
5295 return ( SCIPrelaxGetData(relax)->feasible );
5303 SCIP_RELAXDATA* relaxdata;
5305 assert( relax != NULL );
5307 relaxdata = SCIPrelaxGetData(relax);
5309 assert( SCIPrelaxGetData(relax) != NULL );
5310 assert( relaxdata->sdpi != NULL );
5320 assert( relax != NULL );
5321 assert( SCIPrelaxGetData(relax) != NULL );
5323 return SCIPrelaxGetData(relax)->sdpiterations;
5331 assert( relax != NULL );
5332 assert( SCIPrelaxGetData(relax) != NULL );
5334 return ( SCIPrelaxGetData(relax)->sdpcalls );
5342 assert( relax != NULL );
5343 assert( SCIPrelaxGetData(relax) != NULL );
5345 return ( SCIPrelaxGetData(relax)->sdpinterfacecalls );
5353 assert( relax != NULL );
5354 assert( SCIPrelaxGetData(relax) != NULL );
5356 return ( SCIPrelaxGetData(relax)->solvedfast );
5364 assert( relax != NULL );
5365 assert( SCIPrelaxGetData(relax) != NULL );
5367 return ( SCIPrelaxGetData(relax)->solvedmedium );
5375 assert( relax != NULL );
5376 assert( SCIPrelaxGetData(relax) != NULL );
5378 return ( SCIPrelaxGetData(relax)->solvedstable );
5386 assert( relax != NULL );
5387 assert( SCIPrelaxGetData(relax) != NULL );
5389 return ( SCIPrelaxGetData(relax)->solvedpenalty );
5397 assert( relax != NULL );
5398 assert( SCIPrelaxGetData(relax) != NULL );
5400 return ( SCIPrelaxGetData(relax)->unsolved );
5408 assert( relax != NULL );
5409 assert( SCIPrelaxGetData(relax) != NULL );
5411 return ( SCIPrelaxGetData(relax)->ndslaterholds );
5419 assert( relax != NULL );
5420 assert( SCIPrelaxGetData(relax) != NULL );
5422 return ( SCIPrelaxGetData(relax)->ndnoslater );
5430 assert( relax != NULL );
5431 assert( SCIPrelaxGetData(relax) != NULL );
5433 return ( SCIPrelaxGetData(relax)->nslaterinfeasible );
5441 assert( relax != NULL );
5442 assert( SCIPrelaxGetData(relax) != NULL );
5444 return ( SCIPrelaxGetData(relax)->ndslatercheckfailed );
5452 assert( relax != NULL );
5453 assert( SCIPrelaxGetData(relax) != NULL );
5455 return ( SCIPrelaxGetData(relax)->npslaterholds );
5463 assert( relax != NULL );
5464 assert( SCIPrelaxGetData(relax) != NULL );
5466 return ( SCIPrelaxGetData(relax)->npnoslater );
5474 assert( relax != NULL );
5475 assert( SCIPrelaxGetData(relax) != NULL );
5477 return ( SCIPrelaxGetData(relax)->npslatercheckfailed );
5485 assert( relax != NULL );
5486 assert( SCIPrelaxGetData(relax) != NULL );
5488 return ( SCIPrelaxGetData(relax)->nslaterholds );
5496 assert( relax != NULL );
5497 assert( SCIPrelaxGetData(relax) != NULL );
5499 return ( SCIPrelaxGetData(relax)->stablewslater );
5507 assert( relax != NULL );
5508 assert( SCIPrelaxGetData(relax) != NULL );
5510 return ( SCIPrelaxGetData(relax)->unstablewslater );
5518 assert( relax != NULL );
5519 assert( SCIPrelaxGetData(relax) != NULL );
5521 return ( SCIPrelaxGetData(relax)->penaltywslater );
5529 assert( relax != NULL );
5530 assert( SCIPrelaxGetData(relax) != NULL );
5532 return ( SCIPrelaxGetData(relax)->boundedwslater );
5540 assert( relax != NULL );
5541 assert( SCIPrelaxGetData(relax) != NULL );
5543 return ( SCIPrelaxGetData(relax)->unsolvedwslater );
5551 assert( relax != NULL );
5552 assert( SCIPrelaxGetData(relax) != NULL );
5554 return ( SCIPrelaxGetData(relax)->nnoslater );
5562 assert( relax != NULL );
5563 assert( SCIPrelaxGetData(relax) != NULL );
5565 return ( SCIPrelaxGetData(relax)->stablenoslater );
5573 assert( relax != NULL );
5574 assert( SCIPrelaxGetData(relax) != NULL );
5576 return ( SCIPrelaxGetData(relax)->unstablenoslater );
5584 assert( relax != NULL );
5585 assert( SCIPrelaxGetData(relax) != NULL );
5587 return ( SCIPrelaxGetData(relax)->penaltynoslater );
5595 assert( relax != NULL );
5596 assert( SCIPrelaxGetData(relax) != NULL );
5598 return ( SCIPrelaxGetData(relax)->boundednoslater );
5606 assert( relax != NULL );
5607 assert( SCIPrelaxGetData(relax) != NULL );
5609 return ( SCIPrelaxGetData(relax)->unsolvednoslater );
5617 assert( relax != NULL );
5618 assert( SCIPrelaxGetData(relax) != NULL );
5620 return ( SCIPrelaxGetData(relax)->stableinfeasible );
5628 assert( relax != NULL );
5629 assert( SCIPrelaxGetData(relax) != NULL );
5631 return ( SCIPrelaxGetData(relax)->unstableinfeasible );
5639 assert( relax != NULL );
5640 assert( SCIPrelaxGetData(relax) != NULL );
5642 return ( SCIPrelaxGetData(relax)->penaltyinfeasible );
5650 assert( relax != NULL );
5651 assert( SCIPrelaxGetData(relax) != NULL );
5653 return ( SCIPrelaxGetData(relax)->boundedinfeasible );
5661 assert( relax != NULL );
5662 assert( SCIPrelaxGetData(relax) != NULL );
5664 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_Bool SCIPrelaxSdpIsUnbounded(SCIP_RELAX *relax)
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