47 #define SLATERSOLVED_ABSOLUTE 65 #define RELAX_NAME "SDP" 66 #define RELAX_DESC "SDP-relaxator" 67 #define RELAX_PRIORITY 1 71 #define DEFAULT_SDPSOLVERFEASTOL 1e-5 72 #define DEFAULT_SDPSOLVERGAPTOL 1e-5 74 #define DEFAULT_PENALTYPARAM -1.0 75 #define DEFAULT_LAMBDASTAR -1.0 76 #define DEFAULT_MAXPENALTYPARAM -1.0 77 #define DEFAULT_WARMSTARTIPFACTOR 0.50 78 #define DEFAULT_WARMSTARTPRIMALTYPE 3 79 #define DEFAULT_WARMSTARTIPTYPE 1 80 #define DEFAULT_WARMSTARTPROJECT 2 81 #define DEFAULT_WARMSTARTPROJMINEV -1.0 82 #define DEFAULT_WARMSTARTPROJPDSAME TRUE 83 #define DEFAULT_WARMSTART_PREOPTIMAL_SOL FALSE 84 #define DEFAULT_WARMSTARTPREOPTGAP 1e-2 85 #define DEFAULT_WARMSTARTROUNDONLYINF FALSE 86 #define DEFAULT_SLATERCHECK 0 87 #define DEFAULT_OBJLIMIT FALSE 88 #define DEFAULT_RESOLVE TRUE 89 #define DEFAULT_TIGHTENROWS TRUE 90 #define DEFAULT_SDPINFO FALSE 91 #define DEFAULT_WARMSTART FALSE 92 #define DEFAULT_DISPLAYSTAT FALSE 93 #define DEFAULT_SETTINGSRESETFREQ -1 94 #define DEFAULT_SETTINGSRESETOFS 0 95 #define DEFAULT_SDPSOLVERTHREADS 1 96 #define DEFAULT_PENINFEASADJUST 10.0 97 #define DEFAULT_USEPRESOLVING FALSE 98 #define DEFAULT_USESCALING TRUE 99 #define DEFAULT_SCALEOBJ FALSE 101 #define WARMSTART_MINVAL 0.01 102 #define WARMSTART_PROJ_MINRHSOBJ 1 103 #define WARMSTART_PROJ_FACTOR 0.1 104 #define WARMSTART_PROJ_FACTOR_LHS 10 105 #define WARMSTART_PROJ_FACTOR_PRIMAL 0.1 106 #define WARMSTART_PREOPT_MIN_Z_LPVAL 0.01 114 struct SCIP_RelaxData
119 SCIP_CLOCK* sdpsolvingtime;
122 SCIP_Bool origsolved;
123 SCIP_Bool probingsolved;
124 SCIP_Longint lastsdpnode;
127 SCIP_Real sdpsolvergaptol;
128 SCIP_Real sdpsolverfeastol;
129 SCIP_Real penaltyparam;
130 SCIP_Real maxpenaltyparam;
131 SCIP_Real lambdastar;
133 SCIP_Real peninfeasadjust;
134 SCIP_Bool usepresolving;
135 SCIP_Bool usescaling;
139 SCIP_Bool displaystat;
142 SCIP_Bool tightenrows;
143 int settingsresetfreq;
144 int settingsresetofs;
145 int sdpsolverthreads;
148 int sdpinterfacecalls;
149 SCIP_Real sdpopttime;
163 int unstablenoslater;
166 int unsolvednoslater;
169 int nslatercheckfailed;
173 int npslatercheckfailed;
176 int ndslatercheckfailed;
177 int nslaterinfeasible;
178 int stableinfeasible;
179 int unstableinfeasible;
180 int penaltyinfeasible;
181 int boundedinfeasible;
182 int unsolvedinfeasible;
184 int primalroundfails;
186 int roundstartsuccess;
189 SCIP_CLOCK* 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;
219 SCIP_CONSHDLR* sdpconshdlr;
220 SCIP_CONSHDLR* sdprank1conshdlr;
237 assert( nnonz >= 0 );
238 assert( row != NULL );
239 assert( col != NULL );
240 assert( val != NULL );
241 assert( fullmat != NULL );
243 matrixsize = blocksize * blocksize;
246 for (i = 0; i < matrixsize; i++)
249 for (i = 0; i < nnonz; i++)
251 assert( row[i] * blocksize + col[i] <= matrixsize );
252 fullmat[row[i] * blocksize + col[i]] = val[i];
253 assert( col[i] * blocksize + row[i] <= matrixsize );
254 fullmat[col[i] * blocksize + row[i]] = val[i];
271 assert( blocksize >= 0 );
272 assert( matrix != NULL );
273 assert( scale != NULL );
275 for (r = 0; r < blocksize; r++)
277 for (c = 0; c < blocksize; c++)
279 matrix[r * blocksize + c] *= scale[c];
289 SCIP_RELAXDATA* relaxdata
296 SCIP_Real addedopttime;
300 assert( relaxdata != NULL );
303 relaxdata->sdpinterfacecalls++;
307 if ( naddedsdpcalls == 0 )
310 relaxdata->sdpcalls += naddedsdpcalls;
314 relaxdata->sdpopttime += addedopttime;
318 relaxdata->sdpiterations += naddediters;
322 switch ( usedsetting )
325 relaxdata->solvedpenalty++;
328 relaxdata->solvedfast++;
331 relaxdata->solvedmedium++;
334 relaxdata->solvedstable++;
337 relaxdata->unsolved++;
344 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
345 switch ( primalslater )
348 relaxdata->npslatercheckfailed++;
349 switch ( dualslater )
352 relaxdata->ndslatercheckfailed++;
353 relaxdata->nslatercheckfailed++;
356 relaxdata->ndnoslater++;
357 relaxdata->nnoslater++;
360 relaxdata->ndslaterholds++;
361 relaxdata->nslatercheckfailed++;
364 relaxdata->nslaterinfeasible++;
367 relaxdata->ndslatercheckfailed++;
368 relaxdata->nslatercheckfailed++;
374 relaxdata->npnoslater++;
375 switch ( dualslater )
378 relaxdata->ndslatercheckfailed++;
379 relaxdata->nnoslater++;
382 relaxdata->ndnoslater++;
383 relaxdata->nnoslater++;
386 relaxdata->ndslaterholds++;
387 relaxdata->nnoslater++;
390 relaxdata->nslaterinfeasible++;
393 relaxdata->ndslatercheckfailed++;
394 relaxdata->nnoslater++;
400 relaxdata->npslaterholds++;
401 switch ( dualslater )
404 relaxdata->ndslatercheckfailed++;
405 relaxdata->nslatercheckfailed++;
408 relaxdata->ndnoslater++;
409 relaxdata->nnoslater++;
412 relaxdata->ndslaterholds++;
413 relaxdata->nslaterholds++;
416 relaxdata->nslaterinfeasible++;
419 relaxdata->ndslatercheckfailed++;
420 relaxdata->nslatercheckfailed++;
426 relaxdata->npslatercheckfailed++;
427 relaxdata->ndslatercheckfailed++;
428 relaxdata->nslatercheckfailed++;
434 switch ( slatersetting )
437 relaxdata->stablewslater++;
440 relaxdata->unstablewslater++;
443 relaxdata->penaltywslater++;
446 relaxdata->boundedwslater++;
449 relaxdata->unsolvedwslater++;
452 relaxdata->stablenoslater++;
455 relaxdata->unstablenoslater++;
458 relaxdata->penaltynoslater++;
461 relaxdata->boundednoslater++;
464 relaxdata->unsolvednoslater++;
467 relaxdata->stableinfeasible++;
470 relaxdata->unstableinfeasible++;
473 relaxdata->penaltyinfeasible++;
476 relaxdata->boundedinfeasible++;
479 relaxdata->unsolvedinfeasible++;
495 SCIP_Bool boundprimal
498 SCIP_CONSHDLR* conshdlr;
499 const char* conshdlrname;
501 SCIP_VAR** blockvars;
504 SCIP_Real** constval;
516 int* nconstblocknonz;
517 int constnnonzcounter;
530 assert( scip != NULL );
531 assert( sdpi != NULL );
532 assert( varmapper != NULL );
534 SCIPdebugMsg(scip,
"Putting SDP Data in general SDP interface!\n");
536 vars = SCIPgetVars(scip);
537 nvars = SCIPgetNVars(scip);
538 nvarspen = boundprimal ? nvars + 1 : nvars;
541 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvarspen) );
542 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvarspen) );
543 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvarspen) );
545 for (i = 0; i < nvars; i++)
548 obj[idx] = SCIPvarGetObj(vars[i]);
549 lb[idx] = SCIPvarGetLbLocal(vars[i]);
550 ub[idx] = SCIPvarGetUbLocal(vars[i]);
557 ub[nvars] = SCIPinfinity(scip);
560 nconss = SCIPgetNConss(scip);
561 conss = SCIPgetConss(scip);
568 for (i = 0; i < nconss; i++)
570 conshdlr = SCIPconsGetHdlr(conss[i]);
571 assert( conshdlr != NULL );
573 conshdlrname = SCIPconshdlrGetName(conshdlr);
575 #ifdef SCIP_EVEN_MORE_DEBUG 576 SCIP_CALL( SCIPprintCons(scip, conss[i], NULL) );
577 SCIPinfoMessage(scip, NULL,
"\n");
580 if ( strcmp(conshdlrname,
"SDP") == 0 || strcmp(conshdlrname,
"SDPrank1") == 0 )
585 sdpnnonz += blocknnonz;
586 sdpconstnnonz += constnnonzcounter;
591 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocksizes, nsdpblocks) );
592 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz, nsdpblocks) );
593 SCIP_CALL( SCIPallocBufferArray(scip, &nconstblocknonz, nsdpblocks) );
594 SCIP_CALL( SCIPallocBufferArray(scip, &row, nsdpblocks) );
595 SCIP_CALL( SCIPallocBufferArray(scip, &col, nsdpblocks) );
596 SCIP_CALL( SCIPallocBufferArray(scip, &val, nsdpblocks) );
597 SCIP_CALL( SCIPallocBufferArray(scip, &constcol, nsdpblocks) );
598 SCIP_CALL( SCIPallocBufferArray(scip, &constrow, nsdpblocks) );
599 SCIP_CALL( SCIPallocBufferArray(scip, &constval, nsdpblocks) );
600 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvars, nsdpblocks) );
601 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar, nsdpblocks) );
603 for (i = 0; i < nsdpblocks; i++)
605 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz[i], nvarspen) );
606 SCIP_CALL( SCIPallocBufferArray(scip, &row[i], nvarspen) );
607 SCIP_CALL( SCIPallocBufferArray(scip, &col[i], nvarspen) );
608 SCIP_CALL( SCIPallocBufferArray(scip, &val[i], nvarspen) );
613 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
615 for (i = 0; i < nconss; i++)
617 conshdlr = SCIPconsGetHdlr(conss[i]);
618 assert( conshdlr != NULL );
620 conshdlrname = SCIPconshdlrGetName(conshdlr);
622 if ( strcmp(conshdlrname,
"SDP") == 0 || strcmp(conshdlrname,
"SDPrank1") == 0 )
626 assert( ind < nsdpblocks );
630 nconstblocknonz[ind] = constlength;
631 SCIP_CALL( SCIPallocBufferArray(scip, &(constrow[ind]), constlength) );
632 SCIP_CALL( SCIPallocBufferArray(scip, &(constcol[ind]), constlength) );
633 SCIP_CALL( SCIPallocBufferArray(scip, &(constval[ind]), constlength) );
637 SCIP_CALL(
SCIPconsSdpGetData(scip, conss[i], &nblockvars[ind], &blocknnonz, &sdpblocksizes[ind], &arraylength, nblockvarnonz[ind], col[ind],
638 row[ind], val[ind], blockvars, &nconstblocknonz[ind], constcol[ind], constrow[ind], constval[ind], NULL, NULL, NULL) );
641 assert( arraylength == nvars );
642 assert( nblockvars[ind] <= nvars );
643 assert( nconstblocknonz[ind] <= constlength );
645 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar[ind], boundprimal ? nblockvars[ind] + 1 : nblockvars[ind]) );
648 for (j = 0; j < nblockvars[ind]; j++)
655 nblockvarnonz[ind][nblockvars[ind]] = sdpblocksizes[ind];
658 SCIP_CALL( SCIPallocBufferArray(scip, &row[ind][nblockvars[ind]], sdpblocksizes[ind]) );
659 SCIP_CALL( SCIPallocBufferArray(scip, &col[ind][nblockvars[ind]], sdpblocksizes[ind]) );
660 SCIP_CALL( SCIPallocBufferArray(scip, &val[ind][nblockvars[ind]], sdpblocksizes[ind]) );
662 for (j = 0; j < sdpblocksizes[ind]; j++)
664 row[ind][nblockvars[ind]][j] = j;
665 col[ind][nblockvars[ind]][j] = j;
666 val[ind][nblockvars[ind]][j] = 1.0;
678 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, sdpconstnnonz, nconstblocknonz, constrow,
679 constcol, constval, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
680 NULL, NULL, 0, NULL, NULL, NULL) );
685 for (i = 0; i < nsdpblocks; i++)
686 nconstblocknonz[i] = 0;
688 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, 0, nconstblocknonz, NULL,
689 NULL, NULL, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
690 NULL, NULL, 0, NULL, NULL, NULL) );
694 for (i = nsdpblocks - 1; i >= 0; --i)
698 SCIPfreeBufferArrayNull(scip, &val[i][nblockvars[i] - 1]);
699 SCIPfreeBufferArrayNull(scip, &col[i][nblockvars[i] - 1]);
700 SCIPfreeBufferArrayNull(scip, &row[i][nblockvars[i] - 1]);
702 SCIPfreeBufferArrayNull(scip, &sdpvar[i]);
703 SCIPfreeBufferArrayNull(scip, &(constval[i]));
704 SCIPfreeBufferArrayNull(scip, &(constcol[i]));
705 SCIPfreeBufferArrayNull(scip, &(constrow[i]));
707 SCIPfreeBufferArray(scip, &blockvars);
710 for (i = nsdpblocks - 1; i >= 0; --i)
712 SCIPfreeBufferArrayNull(scip, &val[i]);
713 SCIPfreeBufferArrayNull(scip, &col[i]);
714 SCIPfreeBufferArrayNull(scip, &row[i]);
715 SCIPfreeBufferArrayNull(scip, &nblockvarnonz[i]);
718 SCIPfreeBufferArrayNull(scip, &sdpvar);
719 SCIPfreeBufferArrayNull(scip, &nblockvars);
720 SCIPfreeBufferArrayNull(scip, &constval);
721 SCIPfreeBufferArrayNull(scip, &constrow);
722 SCIPfreeBufferArrayNull(scip, &constcol);
723 SCIPfreeBufferArrayNull(scip, &val);
724 SCIPfreeBufferArrayNull(scip, &col);
725 SCIPfreeBufferArrayNull(scip, &row);
726 SCIPfreeBufferArrayNull(scip, &nconstblocknonz);
727 SCIPfreeBufferArrayNull(scip, &nblockvarnonz);
728 SCIPfreeBufferArrayNull(scip, &sdpblocksizes);
729 SCIPfreeBufferArray(scip, &ub);
730 SCIPfreeBufferArray(scip, &lb);
731 SCIPfreeBufferArray(scip, &obj);
763 SCIP_Bool* lhsredundant,
764 SCIP_Bool* rhsredundant,
770 SCIP_Real QUAD(minactquad);
771 SCIP_Real QUAD(maxactquad);
772 SCIP_Bool minactinf = FALSE;
773 SCIP_Bool maxactinf = FALSE;
774 SCIP_Real maxintabsval = 0.0;
775 SCIP_Bool hasintvar = FALSE;
778 assert( scip != NULL );
779 assert( rowvals != NULL );
780 assert( rowcols != NULL );
781 assert( rownnonz != NULL );
782 assert( rowlhs != NULL );
783 assert( rowrhs != NULL );
784 assert( lhsredundant != NULL );
785 assert( rhsredundant != NULL );
786 assert( nchgcoefs != NULL );
788 *lhsredundant = FALSE;
789 *rhsredundant = FALSE;
792 if ( SCIPisEQ(scip, *rowlhs, *rowrhs) )
795 QUAD_ASSIGN(minactquad, 0.0);
796 QUAD_ASSIGN(maxactquad, 0.0);
799 for (i = 0; i < *rownnonz; ++i)
804 lb = SCIPcolGetLb(rowcols[i]);
805 ub = SCIPcolGetUb(rowcols[i]);
807 assert( SCIPisEQ(scip, lb, SCIPvarGetLbLocal(SCIPcolGetVar(rowcols[i]))) );
808 assert( SCIPisEQ(scip, ub, SCIPvarGetUbLocal(SCIPcolGetVar(rowcols[i]))) );
810 if ( SCIPcolIsIntegral(rowcols[i]) )
812 maxintabsval = MAX(maxintabsval, REALABS(rowvals[i]));
817 if ( rowvals[i] > 0.0 )
820 if ( ! SCIPisInfinity(scip, REALABS(ub)) && ! SCIPisHugeValue(scip, REALABS(rowvals[i] * ub)) )
821 SCIPquadprecSumQD(maxactquad, maxactquad, rowvals[i] * ub);
826 if ( ! SCIPisInfinity(scip, REALABS(lb)) && ! SCIPisHugeValue(scip, REALABS(rowvals[i] * lb)) )
827 SCIPquadprecSumQD(minactquad, minactquad, rowvals[i] * lb);
834 if ( ! SCIPisInfinity(scip, REALABS(lb)) && ! SCIPisHugeValue(scip, REALABS(rowvals[i] * lb)) )
835 SCIPquadprecSumQD(maxactquad, maxactquad, rowvals[i] * lb);
840 if ( ! SCIPisInfinity(scip, REALABS(ub)) && ! SCIPisHugeValue(scip, REALABS(rowvals[i] * ub)) )
841 SCIPquadprecSumQD(minactquad, minactquad, rowvals[i] * ub);
852 if ( minactinf && maxactinf )
857 minact = - SCIPinfinity(scip);
859 minact = QUAD_TO_DBL(minactquad);
862 maxact = SCIPinfinity(scip);
864 maxact = QUAD_TO_DBL(maxactquad);
867 if ( SCIPisInfinity(scip, - (*rowlhs)) )
868 *lhsredundant = TRUE;
869 else if ( SCIPisFeasGE(scip, minact, *rowlhs) )
870 *lhsredundant = TRUE;
873 if ( SCIPisInfinity(scip, *rowrhs) )
874 *rhsredundant = TRUE;
875 else if ( SCIPisFeasLE(scip, maxact, *rowrhs) )
876 *rhsredundant = TRUE;
879 if ( *lhsredundant && *rhsredundant )
883 if ( SCIPisLT(scip, minact + maxintabsval, *rowlhs) || SCIPisGT(scip, maxact - maxintabsval, *rowrhs) )
887 for (i = 0; i < *rownnonz;)
889 SCIP_Real QUAD(lhsdeltaquad);
890 SCIP_Real QUAD(rhsdeltaquad);
891 SCIP_Real QUAD(tmpquad);
901 if ( ! SCIPcolIsIntegral(rowcols[i]) )
907 assert( SCIPcolIsIntegral(rowcols[i]) );
909 lb = SCIPcolGetLb(rowcols[i]);
910 ub = SCIPcolGetUb(rowcols[i]);
912 if ( rowvals[i] > 0.0 && SCIPisGE(scip, minact + rowvals[i], *rowlhs) && SCIPisLE(scip, maxact - rowvals[i], *rowrhs) )
914 newvallhs = *rowlhs - minact;
915 newvalrhs = maxact - *rowrhs;
916 newval = MAX(newvallhs, newvalrhs);
917 assert( SCIPisSumRelLE(scip, newval, rowvals[i]) );
918 assert( ! SCIPisNegative(scip, newval));
920 if ( ! SCIPisSumRelEQ(scip, newval, rowvals[i]) )
923 if ( ! SCIPisInfinity(scip, - (*rowlhs) ) )
925 SCIPquadprecSumDD(lhsdeltaquad, newval, -rowvals[i]);
926 SCIPquadprecProdQD(lhsdeltaquad, lhsdeltaquad, lb);
927 SCIPquadprecSumQD(tmpquad, lhsdeltaquad, *rowlhs);
928 newlhs = QUAD_TO_DBL(tmpquad);
934 if ( ! SCIPisInfinity(scip, *rowrhs) )
936 SCIPquadprecSumDD(rhsdeltaquad, newval, -rowvals[i]);
937 SCIPquadprecProdQD(rhsdeltaquad, rhsdeltaquad, ub);
938 SCIPquadprecSumQD(tmpquad, rhsdeltaquad, *rowrhs);
939 newrhs = QUAD_TO_DBL(tmpquad);
944 SCIPdebugPrintf(
"tightened coefficient from %g to %g; lhs changed from %g to %g; rhs changed from %g to %g; the bounds are [%g,%g]\n",
945 rowvals[i], newval, *rowlhs, newlhs, *rowrhs, newrhs, lb, ub);
952 if ( SCIPisPositive(scip, newval) )
954 if ( ! SCIPisInfinity(scip, - (*rowlhs)) )
956 SCIPquadprecSumQQ(minactquad, minactquad, lhsdeltaquad);
957 minact = QUAD_TO_DBL(minactquad);
959 if ( ! SCIPisInfinity(scip, *rowrhs) )
961 SCIPquadprecSumQQ(maxactquad, maxactquad, rhsdeltaquad);
962 maxact = QUAD_TO_DBL(maxactquad);
970 rowvals[i] = rowvals[*rownnonz];
971 rowcols[i] = rowcols[*rownnonz];
976 else if ( rowvals[i] < 0.0 && SCIPisGE(scip, minact - rowvals[i], *rowlhs) && SCIPisLE(scip, maxact + rowvals[i], *rowrhs) )
978 newvallhs = minact - *rowlhs;
979 newvalrhs = *rowrhs - maxact;
980 newval = MIN(newvallhs, newvalrhs);
981 assert( SCIPisSumRelGE(scip, newval, rowvals[i]) );
982 assert( ! SCIPisPositive(scip, newval));
984 if ( ! SCIPisSumRelEQ(scip, newval, rowvals[i]) )
987 if ( ! SCIPisInfinity(scip, - (*rowlhs)) )
989 SCIPquadprecSumDD(lhsdeltaquad, newval, -rowvals[i]);
990 SCIPquadprecProdQD(lhsdeltaquad, lhsdeltaquad, ub);
991 SCIPquadprecSumQD(tmpquad, lhsdeltaquad, *rowlhs);
992 newlhs = QUAD_TO_DBL(tmpquad);
998 if ( ! SCIPisInfinity(scip, *rowrhs) )
1000 SCIPquadprecSumDD(rhsdeltaquad, newval, -rowvals[i]);
1001 SCIPquadprecProdQD(rhsdeltaquad, rhsdeltaquad, lb);
1002 SCIPquadprecSumQD(tmpquad, rhsdeltaquad, *rowrhs);
1003 newrhs = QUAD_TO_DBL(tmpquad);
1008 SCIPdebugPrintf(
"tightened coefficient from %g to %g; lhs changed from %g to %g; rhs changed from %g to %g; the bounds are [%g,%g]\n",
1009 rowvals[i], newval, *rowlhs, newlhs, *rowrhs, newrhs, lb, ub);
1016 if ( SCIPisNegative(scip, newval) )
1018 if ( ! SCIPisInfinity(scip, - (*rowlhs)) )
1020 SCIPquadprecSumQQ(minactquad, minactquad, lhsdeltaquad);
1021 minact = QUAD_TO_DBL(minactquad);
1023 if ( ! SCIPisInfinity(scip, *rowrhs) )
1025 SCIPquadprecSumQQ(maxactquad, maxactquad, rhsdeltaquad);
1026 maxact = QUAD_TO_DBL(maxactquad);
1029 rowvals[i] = newval;
1034 rowvals[i] = rowvals[*rownnonz];
1035 rowcols[i] = rowcols[*rownnonz];
1051 SCIP_RELAXDATA* relaxdata,
1052 SCIP_Bool primalobj,
1076 assert( scip != NULL );
1077 assert( relaxdata != NULL );
1079 nvars = SCIPgetNVars(scip);
1080 assert( nvars >= 0 );
1082 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1084 SCIPdebugMsg(scip,
"inserting %d LPRows into the interface.\n", nrows);
1088 for (i = 0; i < nrows; i++)
1090 assert( rows[i] != NULL );
1091 scipnnonz += SCIProwGetNNonz(rows[i]);
1095 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nrows) );
1096 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nrows) );
1097 SCIP_CALL( SCIPallocBufferArray(scip, &rowind, scipnnonz) );
1098 SCIP_CALL( SCIPallocBufferArray(scip, &colind, scipnnonz) );
1099 SCIP_CALL( SCIPallocBufferArray(scip, &val, scipnnonz) );
1105 for (i = 0; i < nrows; i++)
1112 SCIP_Bool lhsredundant = FALSE;
1113 SCIP_Bool rhsredundant = FALSE;
1119 rownnonz = SCIProwGetNNonz(row);
1120 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1121 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1124 if ( relaxdata->tightenrows )
1126 SCIP_CALL( SCIPduplicateBufferArray(scip, &rowvals, SCIProwGetVals(row), rownnonz) );
1127 SCIP_CALL( SCIPduplicateBufferArray(scip, &rowcols, SCIProwGetCols(row), rownnonz) );
1129 SCIP_CALL(
tightenRowCoefs(scip, rowvals, rowcols, &rownnonz, &rowlhs, &rowrhs, &lhsredundant, &rhsredundant, &relaxdata->ntightenedrows) );
1133 rowvals = SCIProwGetVals(row);
1134 rowcols = SCIProwGetCols(row);
1138 if ( ! lhsredundant || ! rhsredundant )
1140 for (j = 0; j < rownnonz; j++)
1142 if ( ! SCIPisZero(scip, rowvals[j]) )
1144 assert( SCIPcolGetVar(rowcols[j]) != NULL );
1146 assert( 0 <= colind[nnonz] && colind[nnonz] < nvars );
1147 rowind[nnonz] = nconss;
1148 val[nnonz] = rowvals[j];
1156 lhs[nconss] = rowlhs;
1157 rhs[nconss] = rowrhs;
1161 if ( SCIPisInfinity(scip, -rowlhs) )
1162 lhs[nconss] = - SCIPinfinity(scip);
1166 if ( SCIPisInfinity(scip, rowrhs) )
1167 rhs[nconss] = SCIPinfinity(scip);
1174 if ( relaxdata->tightenrows )
1176 SCIPfreeBufferArray(scip, &rowcols);
1177 SCIPfreeBufferArray(scip, &rowvals);
1180 assert( nnonz <= scipnnonz );
1184 if ( nrowssdpi > 0 )
1190 SCIP_CALL(
SCIPsdpiAddLPRows(relaxdata->sdpi, nconss, lhs, rhs, nnonz, (
const int*)rowind, (
const int*)colind, val) );
1193 SCIPfreeBufferArray(scip, &val);
1194 SCIPfreeBufferArray(scip, &colind);
1195 SCIPfreeBufferArray(scip, &rowind);
1196 SCIPfreeBufferArray(scip, &rhs);
1197 SCIPfreeBufferArray(scip, &lhs);
1202 vars = SCIPgetVars(scip);
1203 assert( vars != NULL );
1206 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
1207 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
1208 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nvars) );
1209 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvars) );
1212 for (i = 0; i < nvars; i++)
1214 assert( vars[i] != NULL );
1219 lb[i] = SCIPvarGetLbLocal(vars[i]);
1220 ub[i] = SCIPvarGetUbLocal(vars[i]);
1224 if ( SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[i])) )
1225 lb[i] = -SCIPinfinity(scip);
1229 if ( SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[i])) )
1230 ub[i] = SCIPinfinity(scip);
1236 obj[i] = SCIPvarGetObj(vars[i]);
1248 SCIPfreeBufferArray(scip, &obj);
1249 SCIPfreeBufferArray(scip, &inds);
1250 SCIPfreeBufferArray(scip, &ub);
1251 SCIPfreeBufferArray(scip, &lb);
1261 SCIP_RESULT* result,
1262 SCIP_Real* lowerbound
1265 char saveconsname[SCIP_MAXSTRLEN];
1267 SCIP_RELAXDATA* relaxdata;
1268 SCIP_CONS* savedsetting;
1273 SCIP_Bool enforceslater;
1274 SCIP_Real timelimit;
1275 SCIP_Real objforscip;
1276 SCIP_Real* solforscip;
1284 SCIPdebugMsg(scip,
"calcRelax called\n");
1286 assert( scip != NULL );
1287 assert( relax != NULL );
1288 assert( result != NULL );
1289 assert( lowerbound != NULL );
1291 relaxdata = SCIPrelaxGetData(relax);
1292 assert( relaxdata != NULL );
1294 nvars = SCIPgetNVars(scip);
1295 assert( nvars >= 0 );
1296 vars = SCIPgetVars (scip);
1298 sdpi = relaxdata->sdpi;
1299 assert( sdpi != NULL );
1301 if ( relaxdata->objlimit )
1309 rootnode = SCIPgetDepth(scip) == 0 ? TRUE : FALSE;
1312 if ( rootnode || (SCIPgetDepth(scip) == relaxdata->settingsresetofs) ||
1313 ( relaxdata->settingsresetfreq > 0 && ((SCIPgetDepth(scip) - relaxdata->settingsresetofs) % relaxdata->settingsresetfreq == 0)) ||
1320 SCIP_CONSHDLR* conshdlr;
1324 conshdlr = SCIPfindConshdlr(scip,
"Savedsdpsettings");
1325 if ( conshdlr == NULL )
1327 SCIPerrorMessage(
"Savedsdpsettings constraint handler not found!\n");
1328 return SCIP_PLUGINNOTFOUND;
1333 conss = SCIPconshdlrGetConss(conshdlr);
1334 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
1335 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip))));
1337 while ( parentconsind >= 0 && strcmp(saveconsname, SCIPconsGetName(conss[parentconsind])) )
1339 if ( parentconsind >= 0 )
1343 SCIPdebugMsg(scip,
"Startsetting from parent node not found, restarting with fastest settings!\n");
1349 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
1350 if ( ! SCIPisInfinity(scip, timelimit) )
1352 timelimit -= SCIPgetSolvingTime(scip);
1353 if ( timelimit <= 0.0 )
1355 SCIPdebugMsg(scip,
"Time limit reached, not running relax SDP!\n");
1356 *result = SCIP_DIDNOTRUN;
1362 SCIP_CALL( SCIPgetIntParam(scip,
"timing/clocktype", &clocktype) );
1367 enforceslater = SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip)));
1370 if ( rootnode || ! relaxdata->warmstart || ((relaxdata->warmstartiptype == 2) &&
1373 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
1374 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
1375 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
1377 else if ( relaxdata->warmstart && (relaxdata->warmstartprimaltype != 2) && (relaxdata->warmstartiptype == 2) && SCIPisEQ(scip, relaxdata->warmstartipfactor, 1.0) )
1383 SCIP_CALL( SCIPallocBufferArray(scip, &ipy, nvars) );
1384 for (v = 0; v < nvars; v++)
1387 #ifdef SCIP_PRINT_WARMSTART 1388 SCIPdebugMsg(scip,
"warmstart using the following analytic centers:\n");
1389 for (v = 0; v < nvars; v++)
1390 SCIPdebugMsg(scip,
"y[%d] = %f\n", v, ipy[v]);
1393 for (b = 0; b < relaxdata->nblocks; b++)
1395 SCIPdebugMsg(scip,
"dual block %d\n", b);
1396 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
1398 SCIPdebugMsg(scip,
"Z(%d,%d)=%f\n", relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
1401 for (b = 0; b < relaxdata->nblocks; b++)
1403 SCIPdebugMsg(scip,
"primal block %d\n", b);
1404 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
1406 SCIPdebugMsg(scip,
"X(%d,%d)=%f\n", relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
1412 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
1413 SCIP_CALL(
SCIPsdpiSolve(sdpi, ipy, relaxdata->ipZnblocknonz, relaxdata->ipZrow, relaxdata->ipZcol, relaxdata->ipZval, relaxdata->ipXnblocknonz,
1414 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval, startsetting, enforceslater, timelimit) );
1415 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
1417 SCIPfreeBufferArray(scip, &ipy);
1421 SCIP_CONSHDLR* conshdlr;
1423 SCIP_CONS** sdpblocks = NULL;
1424 SCIP_Real* starty = NULL;
1425 int* startZnblocknonz = NULL;
1426 int** startZrow = NULL;
1427 int** startZcol = NULL;
1428 SCIP_Real** startZval = NULL;
1429 int* startXnblocknonz = NULL;
1430 int** startXrow = NULL;
1431 int** startXcol = NULL;
1432 SCIP_Real** startXval = NULL;
1434 SCIP_Longint parentnodenumber;
1440 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
1441 if ( conshdlr == NULL )
1443 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
1444 return SCIP_PLUGINNOTFOUND;
1449 conss = SCIPconshdlrGetConss(conshdlr);
1450 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
1451 parentnodenumber = SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip)));
1458 if ( parentconsind < 0 )
1460 SCIPdebugMsg(scip,
"Starting SDP-Solving from scratch since no warmstart information available for node %lld\n", parentnodenumber);
1461 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
1462 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
1463 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
1467 SCIPdebugMsg(scip,
"Using warmstartinformation from node %lld\n", parentnodenumber);
1473 SCIP_CALL( SCIPallocBufferArray(scip, &starty, nvars) );
1476 for (v = 0; v < nvars; v++)
1479 starty[v] = SCIPgetSolVal(scip, dualsol, var);
1482 if (SCIPisLT(scip, starty[v], SCIPvarGetLbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
1484 starty[v] = SCIPvarGetLbLocal(var);
1486 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetLbLocal(var)) );
1488 else if (SCIPisGT(scip, starty[v], SCIPvarGetUbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
1490 starty[v] = SCIPvarGetUbLocal(var);
1492 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetUbLocal(var)) );
1496 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->warmstartproject != 4 )
1498 if ( relaxdata->warmstartiptype == 1 )
1501 starty[v] *= 1 - relaxdata->warmstartipfactor;
1503 else if ( relaxdata->warmstartiptype == 2 )
1506 starty[v] = (1 - relaxdata->warmstartipfactor) * starty[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, var);
1514 SCIP_CONSHDLR* sdpconshdlr;
1515 SCIP_CONSHDLR* sdprank1conshdlr;
1516 SCIP_CONS** sdporigblocks;
1517 SCIP_CONS** sdprank1blocks;
1526 SCIP_Real maxprimalentry = 0.0;
1527 SCIP_Real maxdualentry;
1528 SCIP_Real identitydiagonal = 0.0;
1531 SCIP_Bool* diagentryexists;
1533 sdpconshdlr = relaxdata->sdpconshdlr;
1534 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
1535 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
1536 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
1537 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
1538 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
1540 nblocks = nsdpblocks + nrank1blocks;
1542 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nblocks) );
1543 for (r = 0; r < nsdpblocks; ++r)
1544 sdpblocks[r] = sdporigblocks[r];
1546 for (r = 0; r < nrank1blocks; ++r)
1547 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
1549 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1551 SCIP_CALL( SCIPallocBufferArray(scip, &startZnblocknonz, nblocks + 1) );
1552 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow, nblocks + 1) );
1553 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol, nblocks + 1) );
1554 SCIP_CALL( SCIPallocBufferArray(scip, &startZval, nblocks + 1) );
1555 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks + 1) );
1556 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks + 1) );
1557 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks + 1) );
1558 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks + 1) );
1561 if ( relaxdata->warmstartiptype == 1 )
1564 if ( SCIPisLT(scip, maxprimalentry, 1.0) )
1565 maxprimalentry = 1.0;
1569 for (b = 0; b < nblocks; b++)
1573 if ( relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4 )
1576 startZnblocknonz[b] = blocksize * (blocksize + 1) / 2;
1583 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
1585 if ( relaxdata->warmstartiptype == 1 )
1586 startZnblocknonz[b] += blocksize;
1587 else if ( relaxdata->warmstartiptype == 2 )
1588 startZnblocknonz[b] += relaxdata->ipZnblocknonz[b];
1592 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], startZnblocknonz[b]) );
1593 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], startZnblocknonz[b]) );
1594 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], startZnblocknonz[b]) );
1600 if ( relaxdata->warmstartproject == 3 )
1602 SCIP_Real* fullZmatrix;
1603 SCIP_Real* eigenvalues;
1604 SCIP_Real* eigenvectors;
1605 SCIP_Real* scaledeigenvectors;
1611 matrixsize = blocksize * blocksize;
1613 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
1614 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
1615 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
1617 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
1622 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
1626 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevdual) )
1628 eigenvalues[i] = relaxdata->warmstartprojminevdual;
1637 FALSE, fullZmatrix) );
1640 startZnblocknonz[b] = 0;
1641 epsilon = SCIPepsilon(scip);
1642 for (r = 0; r < blocksize; r++)
1644 for (c = r; c < blocksize; c++)
1646 matrixpos = r * blocksize + c;
1647 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
1649 startZrow[b][startZnblocknonz[b]] = r;
1650 startZcol[b][startZnblocknonz[b]] = c;
1651 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
1652 startZnblocknonz[b]++;
1658 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1659 SCIPfreeBufferArray(scip, &eigenvectors);
1660 SCIPfreeBufferArray(scip, &eigenvalues);
1661 SCIPfreeBufferArray(scip, &fullZmatrix);
1664 if ( relaxdata->warmstartprimaltype == 1 )
1667 if ( relaxdata->warmstartiptype == 1 )
1669 startXnblocknonz[b] = blocksize;
1670 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1671 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1672 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1673 for (i = 0; i < startXnblocknonz[b]; i++)
1675 startXrow[b][i] = i;
1676 startXcol[b][i] = i;
1677 startXval[b][i] = maxprimalentry;
1681 else if ( relaxdata->warmstartprimaltype == 2 )
1683 startXnblocknonz[b] = startZnblocknonz[b];
1684 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1685 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1686 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1687 for (i = 0; i < startZnblocknonz[b]; i++)
1689 startXrow[b][i] = startZrow[b][i];
1690 startXcol[b][i] = startZcol[b][i];
1691 startXval[b][i] = 1 / startZval[b][i];
1694 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject != 4 )
1696 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1701 if ( relaxdata->warmstartproject != 4 )
1704 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], 2 * nrows + 2 * nvars) );
1705 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], 2 * nrows + 2 * nvars) );
1706 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], 2 * nrows + 2 * nvars) );
1707 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], 2 * nrows + 2 * nvars) );
1708 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], 2 * nrows + 2 * nvars) );
1709 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], 2 * nrows + 2 * nvars) );
1712 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
1713 startXnblocknonz[b] = 2 * nrows + 2 * nvars;
1715 for (r = 0; r < nrows; r++)
1719 rownnonz = SCIProwGetNNonz(rows[r]);
1720 rowvals = SCIProwGetVals(rows[r]);
1721 rowcols = SCIProwGetCols(rows[r]);
1722 for (i = 0; i < rownnonz; i++)
1723 rowval += SCIPgetSolVal(scip, dualsol, SCIPcolGetVar(rowcols[i])) * rowvals[i];
1725 startZrow[b][2*r] = 2*r;
1726 startZcol[b][2*r] = 2*r;
1727 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
1729 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
1730 startZval[b][2*r] = relaxdata->warmstartprojminevdual;
1734 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r], 1.0) )
1737 if ( SCIPisLT(scip, startZval[b][2*r], 0.0) )
1738 startZval[b][2*r] = relaxdata->warmstartipfactor;
1740 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor;
1742 else if ( relaxdata->warmstartiptype == 2 )
1744 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r];
1754 startZrow[b][2*r + 1] = 2*r + 1;
1755 startZcol[b][2*r + 1] = 2*r + 1;
1756 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
1758 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r + 1], relaxdata->warmstartprojminevdual) )
1759 startZval[b][2*r + 1] = relaxdata->warmstartprojminevdual;
1760 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r + 1], 1.0) )
1763 if ( SCIPisLT(scip, startZval[b][2*r + 1], 0.0) )
1764 startZval[b][2*r + 1] = relaxdata->warmstartipfactor;
1766 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor;
1768 else if ( relaxdata->warmstartiptype == 2 )
1770 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r + 1];
1780 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1782 startXrow[b][2*r] = 2*r;
1783 startXcol[b][2*r] = 2*r;
1784 startXval[b][2*r] = maxprimalentry;
1785 startXrow[b][2*r + 1] = 2*r + 1;
1786 startXcol[b][2*r + 1] = 2*r + 1;
1787 startXval[b][2*r + 1] = maxprimalentry;
1789 else if ( relaxdata->warmstartprimaltype == 2 )
1791 startXrow[b][2*r] = startZrow[b][2*r];
1792 startXcol[b][2*r] = startZcol[b][2*r];
1793 startXval[b][2*r] = 1 / startZval[b][2*r];
1794 startXrow[b][2*r + 1] = startZrow[b][2*r + 1];
1795 startXcol[b][2*r + 1] = startZcol[b][2*r + 1];
1796 startXval[b][2*r + 1] = 1 / startZval[b][2*r + 1];
1798 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartiptype == 1 )
1800 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1805 for (v = 0; v < nvars; v++)
1807 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1808 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1809 startZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, dualsol, vars[v]) - SCIPvarGetLbLocal(vars[v]);
1810 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
1811 startZval[b][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
1812 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], 1.0) )
1815 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v], 0.0) )
1816 startZval[b][2*nrows + 2*v] = relaxdata->warmstartipfactor;
1818 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor;
1820 else if ( relaxdata->warmstartiptype == 2 )
1822 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v];
1832 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1833 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1834 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, dualsol, vars[v]);
1835 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
1836 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
1837 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 1.0) )
1840 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 0.0) )
1841 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartipfactor;
1843 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v + 1] + relaxdata->warmstartipfactor;
1845 else if ( relaxdata->warmstartiptype == 2 )
1847 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];
1857 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1859 startXrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1860 startXcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1861 startXval[b][2*nrows + 2*v] = maxprimalentry;
1862 startXrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1863 startXcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1864 startXval[b][2*nrows + 2*v + 1] = maxprimalentry;
1866 else if ( relaxdata->warmstartprimaltype == 2 )
1868 startXrow[b][2*nrows + 2*v] = startZrow[b][2*nrows + 2*v];
1869 startXcol[b][2*nrows + 2*v] = startZcol[b][2*nrows + 2*v];
1870 startXval[b][2*nrows + 2*v] = 1 / startZval[b][2*nrows + 2*v];
1871 startXrow[b][2*nrows + 2*v + 1] = startZrow[b][2*nrows + 2*v + 1];
1872 startXcol[b][2*nrows + 2*v + 1] = startZcol[b][2*nrows + 2*v + 1];
1873 startXval[b][2*nrows + 2*v + 1] = 1 / startZval[b][2*nrows + 2*v + 1];
1875 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject == 1 )
1877 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1905 if ( relaxdata->warmstartproject == 4 )
1907 SCIP_VAR** blockvars;
1910 SCIP_Real** blockval;
1911 SCIP_Real** blockeigenvalues;
1912 SCIP_Real** blockeigenvectors;
1913 SCIP_Real** blockrowvals;
1920 SCIP_Real* blockconstval;
1921 SCIP_Real* scaledeigenvectors;
1922 SCIP_Real* fullXmatrix;
1923 SCIP_Real* fullZmatrix;
1928 SCIP_Real primalroundobj;
1929 SCIP_Real dualroundobj;
1947 int blockconstnnonz;
1956 int nremovedentries;
1960 if ( relaxdata->warmstartprimaltype != 3 )
1962 SCIPerrorMessage(
"Invalid parameter combination, use relax/warmstartproject = 4 only with relax/warmstartprimaltype = 3.\n");
1963 return SCIP_PARAMETERWRONGVAL;
1966 SCIP_CALL( SCIPstartClock(scip, relaxdata->roundingprobtime) );
1969 for (b = 0; b < nblocks; b++)
1972 matrixsize = (matrixsize * (matrixsize + 1)) / 2;
1973 startXnblocknonz[b] = matrixsize;
1975 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
1976 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
1977 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
1982 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[nblocks], 2 * nvars + 2 * nrows) );
1983 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[nblocks], 2 * nvars + 2 * nrows) );
1984 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[nblocks], 2 * nvars + 2 * nrows) );
1985 startXnblocknonz[nblocks] = 2 * nvars + 2 * nrows;
1989 lpi = relaxdata->lpi;
1992 SCIP_CALL( SCIPlpiClear(lpi) );
1995 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MAXIMIZE) );
2001 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nvars) );
2002 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nvars) );
2003 for (v = 0; v < nvars; v++)
2005 varobj = SCIPvarGetObj(vars[v]);
2011 SCIP_CALL( SCIPallocBufferArray(scip, &blocksizes, nblocks + 2) );
2012 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues, nblocks) );
2013 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors, nblocks) );
2019 SCIP_CALL( SCIPlpiAddRows(lpi, nvars, lhs, rhs, NULL, 0, NULL, NULL, NULL) );
2021 SCIPfreeBufferArray(scip, &rhs);
2022 SCIPfreeBufferArray(scip, &lhs);
2025 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nvars) );
2026 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nvars) );
2027 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nvars) );
2028 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nvars) );
2029 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nvars) );
2030 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nvars) );
2034 for (v = 0; v < nvars; v++)
2036 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
2038 obj[pos] = SCIPvarGetLbLocal(vars[v]);
2040 ub[pos] = SCIPlpiInfinity(lpi);
2046 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
2048 obj[pos] = -1 * SCIPvarGetUbLocal(vars[v]);
2050 ub[pos] = SCIPlpiInfinity(lpi);
2058 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, pos, beg, ind, val) );
2059 blocksizes[0] = pos;
2062 SCIPfreeBufferArray(scip, &val);
2063 SCIPfreeBufferArray(scip, &ind);
2064 SCIPfreeBufferArray(scip, &beg);
2065 SCIPfreeBufferArray(scip, &ub);
2066 SCIPfreeBufferArray(scip, &lb);
2067 SCIPfreeBufferArray(scip, &obj);
2070 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
2072 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nrows) );
2073 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nrows) );
2074 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nrows) );
2075 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nrows) );
2076 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nrows*nvars) );
2077 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nrows*nvars) );
2082 for (r = 0; r < nrows; r++)
2086 rownnonz = SCIProwGetNNonz(row);
2088 rowvals = SCIProwGetVals(row);
2089 rowcols = SCIProwGetCols(row);
2090 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2091 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2093 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
2097 ub[pos] = SCIPlpiInfinity(lpi);
2099 for (i = 0; i < rownnonz; i++)
2102 val[indpos] = rowvals[i];
2108 if ( ! SCIPisInfinity(scip, rowrhs) )
2110 obj[pos] = -1 * rowrhs;
2112 ub[pos] = SCIPlpiInfinity(lpi);
2114 for (i = 0; i < rownnonz; i++)
2117 val[indpos] = -1 * rowvals[i];
2124 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, indpos, beg, ind, val) );
2125 blocksizes[1] = pos;
2126 roundingvars += pos;
2128 SCIPfreeBufferArray(scip, &val);
2129 SCIPfreeBufferArray(scip, &ind);
2130 SCIPfreeBufferArray(scip, &beg);
2131 SCIPfreeBufferArray(scip, &ub);
2132 SCIPfreeBufferArray(scip, &lb);
2133 SCIPfreeBufferArray(scip, &obj);
2136 for (b = 0; b < nblocks; b++)
2140 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
2141 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
2142 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
2143 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
2144 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
2145 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
2146 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
2147 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
2149 arraylength = nvars;
2150 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
2151 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval, NULL, NULL, NULL) );
2152 assert( arraylength == nvars );
2154 matrixsize = blocksize * blocksize;
2156 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2157 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues[b], blocksize) );
2158 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors[b], matrixsize) );
2160 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
2165 SCIP_CALL( SCIPallocBufferArray(scip, &obj, blocksize) );
2166 SCIP_CALL( SCIPallocBufferArray(scip, &lb, blocksize) );
2167 SCIP_CALL( SCIPallocBufferArray(scip, &ub, blocksize) );
2168 SCIP_CALL( SCIPallocBufferArray(scip, &beg, blocksize) );
2169 SCIP_CALL( SCIPallocBufferArray(scip, &ind, blocksize*nvars) );
2170 SCIP_CALL( SCIPallocBufferArray(scip, &val, blocksize*nvars) );
2173 for (i = 0; i < blocksize; i++)
2178 for (v = 0; v < nvars; v++)
2180 ind[i * nvars + v] = v;
2181 val[i * nvars + v] = 0.0;
2186 ub[i] = SCIPlpiInfinity(lpi);
2190 for (i = 0; i < blockconstnnonz; i++)
2195 for (evind = 0; evind < blocksize; evind++)
2197 if ( blockconstrow[i] == blockconstcol[i] )
2198 obj[evind] += blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
2200 obj[evind] += 2 * blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
2204 SCIPfreeBufferArray(scip, &blockconstval);
2205 SCIPfreeBufferArray(scip, &blockconstrow);
2206 SCIPfreeBufferArray(scip, &blockconstcol);
2209 for (v = 0; v < blocknvars; v++)
2212 for (i = 0; i < blocknvarnonz[v]; i++)
2217 for (evind = 0; evind < blocksize; evind++)
2219 if ( blockrow[v][i] == blockcol[v][i] )
2220 val[evind * nvars + varind] += blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
2222 val[evind * nvars + varind] += 2 * blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
2227 SCIPfreeBufferArray(scip, &blockvars);
2228 SCIPfreeBufferArray(scip, &blockval);
2229 SCIPfreeBufferArray(scip, &blockrow);
2230 SCIPfreeBufferArray(scip, &blockcol);
2231 SCIPfreeBufferArray(scip, &blocknvarnonz);
2232 SCIPfreeBufferArray(scip, &fullXmatrix);
2235 nremovedentries = 0;
2236 for (i = 0; i < blocksize; i++)
2238 beg[i] = beg[i] - nremovedentries;
2239 for (v = 0; v < nvars; v++)
2241 if ( REALABS(val[i * nvars + v]) < SCIPepsilon(scip) )
2247 val[i * nvars + v - nremovedentries] = val[i * nvars + v];
2248 ind[i * nvars + v - nremovedentries] = ind[i * nvars + v];
2253 SCIP_CALL( SCIPlpiAddCols(lpi, blocksize, obj, lb, ub, NULL, blocksize*nvars - nremovedentries, beg, ind, val) );
2255 blocksizes[2 + b] = blocksize;
2256 roundingvars += blocksize;
2258 SCIPfreeBufferArray(scip, &val);
2259 SCIPfreeBufferArray(scip, &ind);
2260 SCIPfreeBufferArray(scip, &beg);
2261 SCIPfreeBufferArray(scip, &ub);
2262 SCIPfreeBufferArray(scip, &lb);
2263 SCIPfreeBufferArray(scip, &obj);
2268 SCIP_CALL( SCIPlpiSolveDual(lpi) );
2271 SCIP_CALL( SCIPlpiGetObjval(lpi, &primalroundobj) );
2273 SCIP_CALL( SCIPstopClock(scip, relaxdata->roundingprobtime) );
2278 if ( SCIPlpiIsDualInfeasible(lpi) || SCIPisGE(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
2280 if ( SCIPlpiIsDualInfeasible(lpi) )
2282 SCIPdebugMsg(scip,
"Infeasibility of node %lld detected through primal rounding problem during warmstarting\n",
2283 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2285 relaxdata->roundingprobinf++;
2287 else if ( SCIPisGT(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
2289 SCIPdebugMsg(scip,
"Suboptimality of node %lld detected through primal rounding problem during warmstarting:" 2290 "lower bound = %f > %f = cutoffbound\n", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), primalroundobj, SCIPgetCutoffbound(scip));
2292 relaxdata->roundingcutoff++;
2296 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2297 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2298 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2299 for (b = 0; b < nblocks; b++)
2301 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
2302 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
2303 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2304 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2305 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2306 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2307 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2308 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2310 SCIPfreeBufferArray(scip, &blocksizes);
2311 SCIPfreeBufferArray(scip, &blockeigenvectors);
2312 SCIPfreeBufferArray(scip, &blockeigenvalues);
2313 SCIPfreeBufferArrayNull(scip, &startXval);
2314 SCIPfreeBufferArrayNull(scip, &startXcol);
2315 SCIPfreeBufferArrayNull(scip, &startXrow);
2316 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2317 SCIPfreeBufferArrayNull(scip, &startZval);
2318 SCIPfreeBufferArrayNull(scip, &startZcol);
2319 SCIPfreeBufferArrayNull(scip, &startZrow);
2320 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2321 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2322 SCIPfreeBufferArray(scip, &starty);
2324 relaxdata->feasible = FALSE;
2325 *result = SCIP_CUTOFF;
2328 else if ( relaxdata->warmstartroundonlyinf )
2331 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2332 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2333 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2334 for (b = 0; b < nblocks; b++)
2336 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2337 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2338 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2339 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2340 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2341 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2342 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2343 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2345 SCIPfreeBufferArray(scip, &blocksizes);
2346 SCIPfreeBufferArray(scip, &blockeigenvectors);
2347 SCIPfreeBufferArray(scip, &blockeigenvalues);
2348 SCIPfreeBufferArrayNull(scip, &startXval);
2349 SCIPfreeBufferArrayNull(scip, &startXcol);
2350 SCIPfreeBufferArrayNull(scip, &startXrow);
2351 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2352 SCIPfreeBufferArrayNull(scip, &startZval);
2353 SCIPfreeBufferArrayNull(scip, &startZcol);
2354 SCIPfreeBufferArrayNull(scip, &startZrow);
2355 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2356 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2357 SCIPfreeBufferArray(scip, &starty);
2359 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
2360 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2361 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
2365 else if ( ! SCIPlpiIsOptimal(lpi) )
2367 SCIPdebugMsg(scip,
"Solving without warmstart since solving of the primal rounding problem failed with status %d!\n", SCIPlpiGetInternalStatus(lpi));
2368 relaxdata->primalroundfails++;
2371 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2372 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2373 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2374 for (b = 0; b < nblocks; b++)
2376 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2377 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2378 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2379 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2380 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2381 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2382 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2383 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2385 SCIPfreeBufferArray(scip, &blocksizes);
2386 SCIPfreeBufferArray(scip, &blockeigenvectors);
2387 SCIPfreeBufferArray(scip, &blockeigenvalues);
2388 SCIPfreeBufferArrayNull(scip, &startXval);
2389 SCIPfreeBufferArrayNull(scip, &startXcol);
2390 SCIPfreeBufferArrayNull(scip, &startXrow);
2391 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2392 SCIPfreeBufferArrayNull(scip, &startZval);
2393 SCIPfreeBufferArrayNull(scip, &startZcol);
2394 SCIPfreeBufferArrayNull(scip, &startZrow);
2395 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2396 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2397 SCIPfreeBufferArray(scip, &starty);
2399 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
2400 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2401 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
2411 SCIP_CALL( SCIPallocBufferArray(scip, &optev, roundingvars) );
2413 SCIP_CALL( SCIPlpiGetSol(lpi, NULL, optev, NULL, NULL, NULL) );
2416 pos = blocksizes[1];
2418 for (v = 0; v < nvars; v++)
2420 startXrow[nblocks][pos] = 2 * nrows + 2 * v;
2421 startXcol[nblocks][pos] = 2 * nrows + 2 * v;
2422 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
2424 startXval[nblocks][pos] = optev[evpos];
2428 startXval[nblocks][pos] = SCIPinfinity(scip);
2431 startXrow[nblocks][pos] = 2 * nrows + 2 * v + 1;
2432 startXcol[nblocks][pos] = 2 * nrows + 2 * v + 1;
2433 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
2435 startXval[nblocks][pos] = optev[evpos];
2439 startXval[nblocks][pos] = SCIPinfinity(scip);
2442 assert( evpos == blocksizes[0] );
2446 evpos = blocksizes[0];
2447 for (r = 0; r < nrows; r++)
2451 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2452 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2454 startXrow[nblocks][pos] = 2 * r;
2455 startXcol[nblocks][pos] = 2 * r;
2456 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
2458 startXval[nblocks][pos] = optev[evpos];
2462 startXval[nblocks][pos] = SCIPinfinity(scip);
2465 startXrow[nblocks][pos] = 2 * r + 1;
2466 startXcol[nblocks][pos] = 2 * r + 1;
2467 if ( ! SCIPisInfinity(scip, rowrhs) )
2469 startXval[nblocks][pos] = optev[evpos];
2473 startXval[nblocks][pos] = SCIPinfinity(scip);
2476 assert( evpos == blocksizes[0] + blocksizes[1] );
2478 startXnblocknonz[nblocks] = blocksizes[0] + blocksizes[1];
2481 pos = blocksizes[0] + blocksizes[1];
2482 for (b = 0; b < nblocks; b++)
2484 blocksize = blocksizes[2 + b];
2485 matrixsize = blocksize * blocksize;
2488 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2494 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2497 SCIP_CALL(
SCIPlapackMatrixMatrixMult(blocksizes[2 + b], blocksizes[2 + b], blockeigenvectors[b], TRUE, blocksizes[2 + b], blocksizes[2 + b],
2498 scaledeigenvectors, FALSE, fullXmatrix) );
2501 startXnblocknonz[b] = 0;
2502 epsilon = SCIPepsilon(scip);
2503 for (r = 0; r < blocksize; r++)
2505 for (c = r; c < blocksize; c++)
2507 matrixpos = r * blocksize + c;
2508 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
2510 startXrow[b][startXnblocknonz[b]] = r;
2511 startXcol[b][startXnblocknonz[b]] = c;
2512 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
2513 startXnblocknonz[b]++;
2517 pos += blocksizes[2 + b];
2518 SCIPfreeBufferArray(scip, &fullXmatrix);
2519 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2521 SCIPfreeBufferArray(scip, &optev);
2527 matrixsize = 2 * nvars + 2 * nrows;
2528 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[nblocks], matrixsize) );
2529 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[nblocks], matrixsize) );
2530 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[nblocks], matrixsize) );
2533 SCIP_CALL( SCIPlpiClear(lpi) );
2536 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MINIMIZE) );
2539 roundingvars = nvars;
2540 for (b = 0; b < nblocks; b++)
2541 roundingvars += blocksizes[2 + b];
2543 SCIP_CALL( SCIPallocBufferArray(scip, &obj, roundingvars) );
2544 SCIP_CALL( SCIPallocBufferArray(scip, &lb, roundingvars) );
2545 SCIP_CALL( SCIPallocBufferArray(scip, &ub, roundingvars) );
2547 for (v = 0; v < nvars; v++)
2555 for (v = nvars; v < roundingvars; v++)
2559 ub[v] = SCIPlpiInfinity(lpi);
2566 SCIP_CALL( SCIPlpiAddCols(lpi, roundingvars, obj, lb, ub, NULL, 0, NULL, NULL, NULL) );
2568 SCIPfreeBufferArray(scip, &ub);
2569 SCIPfreeBufferArray(scip, &lb);
2570 SCIPfreeBufferArray(scip, &obj);
2573 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
2575 for (r = 0; r < nrows; r++)
2578 assert( row != NULL );
2579 rownnonz = SCIProwGetNNonz(row);
2581 rowvals = SCIProwGetVals(row);
2582 rowcols = SCIProwGetCols(row);
2583 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2584 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2586 SCIP_CALL( SCIPallocBufferArray(scip, &rowinds, rownnonz) );
2589 for (i = 0; i < rownnonz; i++)
2594 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &rowlhs, &rowrhs, NULL, rownnonz, &pos, rowinds, rowvals) );
2596 SCIPfreeBufferArray(scip, &rowinds);
2601 for (b = 0; b < nblocks; b++)
2605 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
2606 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
2607 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
2608 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
2609 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
2610 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
2611 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
2612 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
2613 blocksize = blocksizes[2 + b];
2614 matrixsize = blocksize * blocksize;
2616 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2618 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
2622 arraylength = nvars;
2623 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
2624 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval, NULL, NULL, NULL) );
2626 nroundingrows = (blocksize * (blocksize + 1)) / 2;
2628 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nroundingrows) );
2629 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nroundingrows) );
2630 SCIP_CALL( SCIPallocBufferArray(scip, &nblockrownonz , nroundingrows) );
2631 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols , nroundingrows) );
2632 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals , nroundingrows) );
2635 for (i = 0; i < nroundingrows; i++)
2640 nblockrownonz[i] = 0;
2641 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols[i], nvars + blocksize) );
2642 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals[i], nvars + blocksize) );
2646 for (i = 0; i < blockconstnnonz; i++)
2654 for (v = 0; v < blocknvars; v++)
2658 for (i = 0; i < blocknvarnonz[v]; i++)
2661 blockrowcols[pos][nblockrownonz[pos]] = varind;
2662 blockrowvals[pos][nblockrownonz[pos]] = blockval[v][i];
2663 nblockrownonz[pos]++;
2668 for (evind = 0; evind < blocksize; evind++)
2670 for (i = 0; i < blocksize; i++)
2672 for (j = 0; j <= i; j++)
2676 if ( SCIPisGT(scip, REALABS(-1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j]), 0.0) )
2679 blockrowcols[pos][nblockrownonz[pos]] = startpos + evind;
2680 blockrowvals[pos][nblockrownonz[pos]] = -1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j];
2681 nblockrownonz[pos]++;
2686 startpos += blocksize;
2690 for (r = 0; r < nroundingrows; r++)
2692 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &lhs[r], &rhs[r], NULL, nblockrownonz[r], &pos, blockrowcols[r], blockrowvals[r]) );
2693 SCIPfreeBufferArray(scip, &blockrowvals[r]);
2694 SCIPfreeBufferArray(scip, &blockrowcols[r]);
2697 SCIPfreeBufferArray(scip, &blockrowvals);
2698 SCIPfreeBufferArray(scip, &blockrowcols);
2699 SCIPfreeBufferArray(scip, &nblockrownonz);
2700 SCIPfreeBufferArray(scip, &rhs);
2701 SCIPfreeBufferArray(scip, &lhs);
2702 SCIPfreeBufferArray(scip, &fullZmatrix);
2703 SCIPfreeBufferArray(scip, &blockconstval);
2704 SCIPfreeBufferArray(scip, &blockconstrow);
2705 SCIPfreeBufferArray(scip, &blockconstcol);
2706 SCIPfreeBufferArray(scip, &blockvars);
2707 SCIPfreeBufferArray(scip, &blockval);
2708 SCIPfreeBufferArray(scip, &blockrow);
2709 SCIPfreeBufferArray(scip, &blockcol);
2710 SCIPfreeBufferArray(scip, &blocknvarnonz);
2714 SCIP_CALL( SCIPstartClock(scip, relaxdata->roundingprobtime) );
2715 SCIP_CALL( SCIPlpiSolveDual(lpi) );
2716 SCIP_CALL( SCIPstopClock(scip, relaxdata->roundingprobtime) );
2718 if ( ! SCIPlpiIsOptimal(lpi) )
2720 SCIPdebugMsg(scip,
"Solution of dual rounding problem failed with status %d, continuing without warmstart\n", SCIPlpiGetInternalStatus(lpi));
2721 relaxdata->dualroundfails++;
2724 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2725 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2726 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2727 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2728 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2729 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2730 for (b = 0; b < nblocks; b++)
2732 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2733 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2734 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2735 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2736 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2737 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2738 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2739 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2741 SCIPfreeBufferArray(scip, &blocksizes);
2742 SCIPfreeBufferArray(scip, &blockeigenvectors);
2743 SCIPfreeBufferArray(scip, &blockeigenvalues);
2744 SCIPfreeBufferArrayNull(scip, &startXval);
2745 SCIPfreeBufferArrayNull(scip, &startXcol);
2746 SCIPfreeBufferArrayNull(scip, &startXrow);
2747 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2748 SCIPfreeBufferArrayNull(scip, &startZval);
2749 SCIPfreeBufferArrayNull(scip, &startZcol);
2750 SCIPfreeBufferArrayNull(scip, &startZrow);
2751 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2752 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2753 SCIPfreeBufferArray(scip, &starty);
2756 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
2757 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2758 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
2766 relaxdata->roundstartsuccess++;
2769 SCIP_CALL( SCIPallocBufferArray(scip, &optev, nvars + roundingvars) );
2770 SCIP_CALL( SCIPlpiGetSol(lpi, &dualroundobj, optev, NULL, NULL, NULL) );
2774 if ( SCIPisEQ(scip, primalroundobj, dualroundobj) )
2777 SCIP_CONS* savedcons;
2779 SCIPdebugMsg(scip,
"Node %lld solved to optimality through rounding problems with optimal objective %f\n",
2780 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), dualroundobj);
2782 relaxdata->roundingoptimal++;
2785 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
2786 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, optev) );
2788 *lowerbound = dualroundobj;
2789 relaxdata->objval = dualroundobj;
2792 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, relax, scipsol, TRUE) );
2794 relaxdata->feasible = TRUE;
2795 *result = SCIP_SUCCESS;
2798 if ( relaxdata->warmstart )
2800 char consname[SCIP_MAXSTRLEN];
2806 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2807 assert( snprintfreturn < SCIP_MAXSTRLEN );
2809 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2811 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
2812 maxprimalentry, nblocks + 1, startXnblocknonz, startXrow, startXcol, startXval) );
2814 SCIP_CALL( SCIPaddCons(scip, savedcons) );
2815 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
2818 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
2821 SCIPfreeBufferArray(scip, &optev);
2822 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2823 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2824 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2825 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2826 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2827 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2828 for (b = 0; b < nblocks; b++)
2830 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
2831 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
2832 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2833 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2834 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2835 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2836 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2837 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2839 SCIPfreeBufferArray(scip, &blocksizes);
2840 SCIPfreeBufferArray(scip, &blockeigenvectors);
2841 SCIPfreeBufferArray(scip, &blockeigenvalues);
2842 SCIPfreeBufferArrayNull(scip, &startXval);
2843 SCIPfreeBufferArrayNull(scip, &startXcol);
2844 SCIPfreeBufferArrayNull(scip, &startXrow);
2845 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2846 SCIPfreeBufferArrayNull(scip, &startZval);
2847 SCIPfreeBufferArrayNull(scip, &startZcol);
2848 SCIPfreeBufferArrayNull(scip, &startZrow);
2849 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2850 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2851 SCIPfreeBufferArray(scip, &starty);
2857 for (v = 0; v < nvars; v++)
2859 if ( relaxdata->warmstartiptype == 1 )
2862 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v];
2864 else if ( relaxdata->warmstartiptype == 2 )
2867 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
2873 for (b = 0; b < nblocks; b++)
2875 blocksize = blocksizes[2 + b];
2876 matrixsize = blocksize * blocksize;
2879 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2885 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2889 scaledeigenvectors, FALSE, fullZmatrix) );
2892 startZnblocknonz[b] = 0;
2893 epsilon = SCIPepsilon(scip);
2894 for (r = 0; r < blocksize; r++)
2896 for (c = r; c < blocksize; c++)
2898 matrixpos = r * blocksize + c;
2899 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
2901 startZrow[b][startZnblocknonz[b]] = r;
2902 startZcol[b][startZnblocknonz[b]] = c;
2903 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
2904 startZnblocknonz[b]++;
2909 SCIPfreeBufferArray(scip, &fullZmatrix);
2910 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2911 SCIPfreeBufferArray(scip, &blockeigenvectors[b]);
2912 SCIPfreeBufferArray(scip, &blockeigenvalues[b]);
2915 SCIPfreeBufferArray(scip, &optev);
2916 SCIPfreeBufferArray(scip, &blockeigenvectors);
2917 SCIPfreeBufferArray(scip, &blockeigenvalues);
2918 SCIPfreeBufferArray(scip, &blocksizes);
2923 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
2926 for (r = 0; r < nrows; r++)
2930 rownnonz = SCIProwGetNNonz(rows[r]);
2931 rowvals = SCIProwGetVals(rows[r]);
2932 rowcols = SCIProwGetCols(rows[r]);
2934 for (i = 0; i < rownnonz; i++)
2937 startZrow[b][2*r] = 2*r;
2938 startZcol[b][2*r] = 2*r;
2939 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
2941 startZrow[b][2*r + 1] = 2*r + 1;
2942 startZcol[b][2*r + 1] = 2*r + 1;
2943 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
2947 for (v = 0; v < nvars; v++)
2949 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
2950 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
2953 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2954 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2955 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - starty[
SCIPsdpVarmapperGetSdpIndex(relaxdata->varmapper, vars[v])];
2961 if ( relaxdata->warmstartprimaltype == 3 )
2964 if ( relaxdata->warmstartproject != 4 )
2969 if ( relaxdata->warmstartproject == 3 )
2974 for (b = 0; b < nblocks; b++)
2977 matrixsize = (matrixsize * (matrixsize + 1)) / 2;
2979 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
2980 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
2981 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
2984 else if ( relaxdata->warmstartiptype == 1 )
2986 for (b = 0; b < nblocks; b++)
2988 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2989 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2990 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2993 else if ( relaxdata->warmstartiptype == 2 )
2995 for (b = 0; b < nblocks; b++)
2997 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2998 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2999 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
3010 if ( relaxdata->warmstartprojpdsame && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
3012 identitydiagonal = 1.0;
3014 for (b = 0; b < nblocks; b++)
3016 for (i = 0; i < startZnblocknonz[b]; i++)
3018 if ( REALABS(startZval[b][i]) > identitydiagonal )
3019 identitydiagonal = REALABS(startZval[b][i]);
3021 for (i = 0; i < startXnblocknonz[b]; i++)
3023 if ( REALABS(startXval[b][i]) > identitydiagonal )
3024 identitydiagonal = REALABS(startXval[b][i]);
3027 identitydiagonal *= relaxdata->warmstartipfactor;
3030 for (b = 0; b < nblocks; b++)
3033 if ( relaxdata->warmstartproject == 3 )
3035 SCIP_Real* fullXmatrix;
3036 SCIP_Real* eigenvalues;
3037 SCIP_Real* eigenvectors;
3038 SCIP_Real* scaledeigenvectors;
3045 matrixsize = blocksize * blocksize;
3047 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
3048 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
3049 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
3051 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
3056 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
3060 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevprimal) )
3062 eigenvalues[i] = relaxdata->warmstartprojminevprimal;
3071 FALSE, fullXmatrix) );
3074 startXnblocknonz[b] = 0;
3075 epsilon = SCIPepsilon(scip);
3076 for (r = 0; r < blocksize; r++)
3078 for (c = r; c < blocksize; c++)
3080 matrixpos = r * blocksize + c;
3081 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
3083 startXrow[b][startXnblocknonz[b]] = r;
3084 startXcol[b][startXnblocknonz[b]] = c;
3085 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
3086 startXnblocknonz[b]++;
3092 SCIPfreeBufferArray(scip, &scaledeigenvectors);
3093 SCIPfreeBufferArray(scip, &eigenvectors);
3094 SCIPfreeBufferArray(scip, &eigenvalues);
3095 SCIPfreeBufferArray(scip, &fullXmatrix);
3099 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
3101 if ( relaxdata->warmstartiptype == 1 )
3104 if ( ! relaxdata->warmstartprojpdsame )
3106 if ( relaxdata->warmstartproject == 3 )
3107 maxprimalentry = relaxdata->warmstartprojminevprimal;
3109 maxprimalentry = 1.0;
3110 for (i = 0; i < startXnblocknonz[b]; i++)
3112 if ( REALABS(startXval[b][i]) > maxprimalentry )
3113 maxprimalentry = REALABS(startXval[b][i]);
3115 identitydiagonal = relaxdata->warmstartipfactor * maxprimalentry;
3119 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
3120 for (i = 0; i < blocksize; i++)
3121 diagentryexists[i] = FALSE;
3123 for (i = 0; i < startXnblocknonz[b]; i++)
3125 if ( startXrow[b][i] == startXcol[b][i] )
3127 startXval[b][i] = startXval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
3128 assert( startXval[b][i] >= 0.0 );
3129 diagentryexists[startXrow[b][i]] = TRUE;
3132 startXval[b][i] *= (1 - relaxdata->warmstartipfactor);
3136 for (i = 0; i < blocksize; i++)
3138 if ( ! diagentryexists[i] )
3140 startXrow[b][startXnblocknonz[b]] = i;
3141 startXcol[b][startXnblocknonz[b]] = i;
3142 startXval[b][startXnblocknonz[b]] = identitydiagonal;
3143 startXnblocknonz[b]++;
3146 SCIPfreeBufferArrayNull(scip, &diagentryexists);
3148 else if ( relaxdata->warmstartiptype == 2 )
3151 for (i = 0; i < startXnblocknonz[b]; i++)
3152 startXval[b][i] *= 1 - relaxdata->warmstartipfactor;
3156 relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b], TRUE, relaxdata->warmstartipfactor,
3157 startXrow[b], startXcol[b], startXval[b], &(startXnblocknonz[b]), startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
3162 for (b = 0; b < nblocks; b++)
3165 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
3167 if ( relaxdata->warmstartiptype == 1 )
3169 if ( ! relaxdata->warmstartprojpdsame )
3173 for (i = 0; i < startZnblocknonz[b]; i++)
3175 if ( REALABS(startZval[b][i]) > maxdualentry )
3176 maxdualentry = REALABS(startZval[b][i]);
3178 identitydiagonal = relaxdata->warmstartipfactor * maxdualentry;
3182 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
3183 for (i = 0; i < blocksize; i++)
3184 diagentryexists[i] = FALSE;
3186 for (i = 0; i < startZnblocknonz[b]; i++)
3188 if ( startZrow[b][i] == startZcol[b][i] )
3190 startZval[b][i] = startZval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
3191 assert( startZval[b][i] >= 0 );
3192 diagentryexists[startZrow[b][i]] = TRUE;
3195 startZval[b][i] *= (1 - relaxdata->warmstartipfactor);
3199 for (i = 0; i < blocksize; i++)
3201 if ( ! diagentryexists[i] )
3203 startZrow[b][startZnblocknonz[b]] = i;
3204 startZcol[b][startZnblocknonz[b]] = i;
3205 startZval[b][startZnblocknonz[b]] = identitydiagonal;
3206 startZnblocknonz[b]++;
3210 SCIPfreeBufferArrayNull(scip, &diagentryexists);
3212 else if ( relaxdata->warmstartiptype == 2 )
3215 for (i = 0; i < startZnblocknonz[b]; i++)
3216 startZval[b][i] *= 1 - relaxdata->warmstartipfactor;
3220 relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b], TRUE, relaxdata->warmstartipfactor,
3221 startZrow[b], startZcol[b], startZval[b], &(startZnblocknonz[b]), startZnblocknonz[b] + relaxdata->ipZnblocknonz[b]) );
3227 if ( relaxdata->warmstartproject == 3 )
3234 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
3237 nsavedentries = startXnblocknonz[nblocks];
3240 for (i = 0; i < nsavedentries; i++)
3242 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
3244 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
3246 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
3247 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
3248 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
3249 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
3250 startXnblocknonz[nblocks]++;
3252 if ( SCIPisLT(scip, startXval[b][i], 1.0) )
3253 startXval[b][i] = relaxdata->warmstartprojminevprimal;
3255 lastentry = startXrow[nblocks][i];
3258 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
3260 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
3261 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
3262 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
3263 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
3264 startXnblocknonz[nblocks]++;
3269 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
3271 if ( relaxdata->warmstartiptype == 1 )
3278 if ( ! relaxdata->warmstartprojpdsame )
3279 identitydiagonal = relaxdata->warmstartipfactor;
3282 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
3285 nsavedentries = startXnblocknonz[nblocks];
3288 for (i = 0; i < nsavedentries; i++)
3290 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
3292 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
3294 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
3295 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
3296 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
3298 if ( relaxdata->warmstartprojpdsame )
3299 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
3301 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartipfactor;
3302 startXnblocknonz[nblocks]++;
3307 if ( relaxdata->warmstartprojpdsame )
3308 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + identitydiagonal;
3309 else if ( SCIPisLT(scip, startXval[b][i], 1.0) )
3310 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + relaxdata->warmstartipfactor;
3312 lastentry = startXrow[nblocks][i];
3315 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
3317 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
3318 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
3319 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
3320 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
3321 startXnblocknonz[nblocks]++;
3324 else if ( relaxdata->warmstartiptype == 2 )
3327 for (i = 0; i < startXnblocknonz[nblocks]; i++)
3328 startXval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
3332 relaxdata->ipXcol[nblocks], relaxdata->ipXval[nblocks], relaxdata->ipXnblocknonz[nblocks], TRUE,
3333 relaxdata->warmstartipfactor, startXrow[nblocks], startXcol[nblocks], startXval[nblocks],
3334 &(startXnblocknonz[nblocks]), startXnblocknonz[nblocks] + relaxdata->ipXnblocknonz[nblocks]) );
3338 if ( relaxdata->warmstartiptype == 1 )
3340 for (r = 0; r < nrows; r++)
3343 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
3344 startZval[nblocks][2*r] = relaxdata->warmstartprojminevdual;
3348 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r], 1.0) || relaxdata->warmstartprojpdsame) )
3351 if ( SCIPisLT(scip, startZval[nblocks][2*r], 0.0) )
3352 startZval[nblocks][2*r] = identitydiagonal;
3354 startZval[nblocks][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r] + identitydiagonal;
3357 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*r + 1], relaxdata->warmstartprojminevdual) )
3358 startZval[nblocks][2*r + 1] = relaxdata->warmstartprojminevdual;
3359 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r + 1], 1.0) || relaxdata->warmstartprojpdsame) )
3362 if ( SCIPisLT(scip, startZval[nblocks][2*r + 1], 0.0) )
3363 startZval[nblocks][2*r + 1] = identitydiagonal;
3365 startZval[nblocks][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r + 1] + identitydiagonal;
3369 for (v = 0; v < nvars; v++)
3371 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
3372 startZval[nblocks][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
3373 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 1.0) || relaxdata->warmstartprojpdsame) )
3376 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 0.0) )
3377 startZval[nblocks][2*nrows + 2*v] = identitydiagonal;
3379 startZval[nblocks][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v] + identitydiagonal;
3382 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
3383 startZval[nblocks][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
3384 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 1.0) || relaxdata->warmstartprojpdsame) )
3387 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 0.0) )
3388 startZval[nblocks][2*nrows + 2*v + 1] = identitydiagonal;
3390 startZval[nblocks][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v + 1] + identitydiagonal;
3394 else if ( relaxdata->warmstartiptype == 2 )
3397 for (i = 0; i < startZnblocknonz[nblocks]; i++)
3398 startZval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
3402 relaxdata->ipZcol[nblocks], relaxdata->ipZval[nblocks], relaxdata->ipZnblocknonz[nblocks], TRUE,
3403 relaxdata->warmstartipfactor, startZrow[nblocks], startZcol[nblocks], startZval[nblocks],
3404 &(startZnblocknonz[nblocks]), startZnblocknonz[nblocks] + relaxdata->ipZnblocknonz[nblocks]) );
3409 #ifdef SCIP_PRINT_WARMSTART 3410 SCIPdebugMsg(scip,
"warmstart using the following point:\n");
3411 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr);
3412 for (i = 0; i < nvars; i++)
3413 SCIPdebugMsg(scip,
"y[%d]=%f\n", i, starty[i]);
3417 for (b = 0; b < nblocks + 1; b++)
3419 SCIPdebugMsg(scip,
"dual block %d\n", b);
3420 for (i = 0; i < startZnblocknonz[b]; i++)
3422 SCIPdebugMsg(scip,
"Z(%d,%d)=%f\n", startZrow[b][i], startZcol[b][i], startZval[b][i]);
3425 for (b = 0; b < nblocks + 1; b++)
3427 SCIPdebugMsg(scip,
"primal block %d\n", b);
3428 for (i = 0; i < startXnblocknonz[b]; i++)
3430 SCIPdebugMsg(scip,
"X(%d,%d)=%f\n", startXrow[b][i], startXcol[b][i], startXval[b][i]);
3437 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
3438 SCIP_CALL(
SCIPsdpiSolve(sdpi, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow,
3439 startXcol, startXval, startsetting, enforceslater, timelimit) );
3440 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
3444 SCIP_CONSHDLR* sdpconshdlr;
3445 SCIP_CONSHDLR* sdprank1conshdlr;
3447 sdpconshdlr = relaxdata->sdpconshdlr;
3448 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
3449 nblocks = SCIPconshdlrGetNConss(sdpconshdlr) + SCIPconshdlrGetNConss(sdprank1conshdlr) + 1;
3451 assert( startXval != NULL );
3452 assert( startXcol != NULL );
3453 assert( startXrow != NULL );
3454 assert( startZval != NULL );
3455 assert( startZcol != NULL );
3456 assert( startZrow != NULL );
3459 for (b = 0; b < nblocks; b++)
3461 SCIPfreeBufferArray(scip, &startXval[b]);
3462 SCIPfreeBufferArray(scip, &startXcol[b]);
3463 SCIPfreeBufferArray(scip, &startXrow[b]);
3464 SCIPfreeBufferArray(scip, &startZval[b]);
3465 SCIPfreeBufferArray(scip, &startZcol[b]);
3466 SCIPfreeBufferArray(scip, &startZrow[b]);
3469 SCIPfreeBufferArray(scip, &startXval);
3470 SCIPfreeBufferArray(scip, &startXcol);
3471 SCIPfreeBufferArray(scip, &startXrow);
3472 SCIPfreeBufferArray(scip, &startXnblocknonz);
3473 SCIPfreeBufferArray(scip, &startZval);
3474 SCIPfreeBufferArray(scip, &startZcol);
3475 SCIPfreeBufferArray(scip, &startZrow);
3476 SCIPfreeBufferArray(scip, &startZnblocknonz);
3477 SCIPfreeBufferArray(scip, &sdpblocks);
3479 SCIPfreeBufferArray(scip, &starty);
3485 relaxdata->lastsdpnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
3496 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3498 SCIP_CALL( SCIPaddCons(scip, savedsetting) );
3499 SCIP_CALL( SCIPreleaseCons(scip, &savedsetting) );
3503 relaxdata->feasible = FALSE;
3505 if ( SCIPinProbing(scip) )
3512 #ifdef SCIP_MORE_DEBUG 3515 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3517 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &sollength) );
3519 assert( sollength == nvars );
3524 SCIPdebugMsg(scip,
"optimal solution: objective = %f, dual feasible: %u, primal feasible: %u.\n",
3529 SCIPdebugMsg(scip,
"The solver could not determine feasibility ! ");
3535 for (i = 0; i < nvars; ++i)
3538 SCIPfreeBufferArray(scip, &solforscip);
3544 SCIPdebugMsg(scip,
"Relaxation is infeasible.\n");
3545 relaxdata->feasible = FALSE;
3546 relaxdata->objval = SCIPinfinity(scip);
3547 *result = SCIP_CUTOFF;
3552 SCIPdebugMsg(scip,
"Relaxation reached objective limit.\n");
3553 relaxdata->feasible = FALSE;
3554 relaxdata->objval = SCIPgetUpperbound(scip);
3555 *result = SCIP_CUTOFF;
3560 SCIPdebugMsg(scip,
"Relaxation is unbounded.\n");
3561 relaxdata->feasible = TRUE;
3562 relaxdata->objval = -SCIPinfinity(scip);
3563 *result = SCIP_SUCCESS;
3564 *lowerbound = -SCIPinfinity(scip);
3570 SCIP_SOL* preoptimalsol = NULL;
3571 SCIP_CONS* savedcons;
3572 SCIP_Bool preoptimalsolsuccess = FALSE;
3576 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3578 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &slength) );
3580 assert( slength == nvars );
3584 SCIPdebugMsg(scip,
"Relaxation is solved optimally (objective: %g).\n", objforscip);
3586 SCIPdebugMsg(scip,
"Have feasible solution for dual of relaxation (objective: %g).\n", objforscip);
3589 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3591 for (i = 0; i < nvars; ++i)
3596 *lowerbound = objforscip;
3597 relaxdata->objval = objforscip;
3600 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, relax, scipsol, TRUE) );
3601 relaxdata->feasible = TRUE;
3602 *result = SCIP_SUCCESS;
3607 SCIP_Real maxprimalentry;
3608 int* startXnblocknonz = NULL;
3609 int** startXrow = NULL;
3610 int** startXcol = NULL;
3611 SCIP_Real** startXval = NULL;
3612 char consname[SCIP_MAXSTRLEN];
3618 if ( relaxdata->warmstartpreoptsol )
3622 SCIP_Real* preoptimalvec;
3625 SCIP_CALL( SCIPallocBufferArray(scip, &preoptimalvec, nvars) );
3630 maxprimalentry = 0.0;
3631 if ( relaxdata->warmstartprimaltype == 3 )
3633 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr) + 1;
3634 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3640 if ( startXnblocknonz[0] > -1 )
3642 preoptimalsolsuccess = TRUE;
3644 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3645 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3646 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3649 for (b = 0; b < nblocks; b++)
3651 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3652 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3653 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3657 nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3660 preoptimalsolsuccess = FALSE;
3670 maxprimalentry = 0.0;
3672 -1, NULL, NULL, NULL, NULL) );
3676 if ( preoptimalsolsuccess )
3678 assert( nvarsgiven == nvars );
3681 SCIP_CALL( SCIPcreateSol(scip, &preoptimalsol, NULL) );
3682 SCIP_CALL( SCIPsetSolVals(scip, preoptimalsol, nvars, vars, preoptimalvec) );
3685 SCIPfreeBufferArray(scip, &preoptimalvec);
3689 SCIPerrorMessage(
"Warmstarting with preoptimal solutions currently only supported for DSDP and SDPA\n");
3690 return SCIP_LPERROR;
3695 maxprimalentry = 0.0;
3696 if ( relaxdata->warmstartprimaltype == 3 )
3698 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr) + 1;
3699 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3700 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3701 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3702 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3708 for (b = 0; b < nblocks; b++)
3710 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3711 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3712 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3724 maxprimalentry = 0.0;
3728 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3729 assert( snprintfreturn < SCIP_MAXSTRLEN );
3731 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3733 if ( relaxdata->warmstartpreoptsol )
3736 if ( preoptimalsolsuccess )
3738 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), preoptimalsol,
3739 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3741 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3742 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3747 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
3748 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3750 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3751 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3757 assert( startXnblocknonz != NULL );
3758 if ( startXnblocknonz[0] > 1 )
3760 for (b = 0; b < nblocks; b++)
3762 assert( startXval != NULL );
3763 assert( startXcol != NULL );
3764 assert( startXrow != NULL );
3766 SCIPfreeBufferArrayNull(scip, &startXval[b]);
3767 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
3768 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
3770 SCIPfreeBufferArrayNull(scip, &startXval);
3771 SCIPfreeBufferArrayNull(scip, &startXcol);
3772 SCIPfreeBufferArrayNull(scip, &startXrow);
3774 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
3778 SCIPfreeBufferArray(scip, &solforscip);
3779 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3780 if ( preoptimalsolsuccess )
3782 SCIP_CALL( SCIPfreeSol(scip, &preoptimalsol) );
3792 *result = SCIP_DIDNOTRUN;
3798 objlb = -SCIPinfinity(scip);
3800 if ( ! SCIPisInfinity(scip, objlb) )
3802 *lowerbound = objlb;
3803 SCIPdebugMsg(scip,
"The relaxation could not be solved, using best computed bound from penalty formulation.\n");
3805 else if ( ! SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip))) )
3807 *lowerbound = SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip));
3808 SCIPdebugMsg(scip,
"The relaxation could not be solved, keeping old bound.\n");
3812 *result = SCIP_SUSPENDED;
3813 SCIPerrorMessage(
"The relaxation of the root node could not be solved, so there is no hope to solve this instance.\n");
3817 *result = SCIP_SUCCESS;
3828 SCIP_RELAXDATA* relaxdata;
3835 SCIPdebugMsg(scip,
"Calling relaxExecSdp.\n");
3837 relaxdata = SCIPrelaxGetData(relax);
3840 if ( relaxdata->lastsdpnode == SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) && ! SCIPinProbing(scip) && relaxdata->origsolved && ! relaxdata->resolve )
3842 SCIP_Real objforscip;
3843 SCIP_Real* solforscip;
3849 SCIPdebugMsg(scip,
"Already solved SDP-relaxation for node %" SCIP_LONGINT_FORMAT
", returning with SCIP_SUCCESS so that no other relaxator is called.\n",
3850 SCIPrelaxGetData(relax)->lastsdpnode);
3854 relaxdata->feasible = TRUE;
3855 *result = SCIP_SUCCESS;
3856 *lowerbound = -SCIPinfinity(scip);
3861 vars = SCIPgetVars(scip);
3862 nvars = SCIPgetNVars(scip);
3863 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3865 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, &objforscip, solforscip, &slength) );
3867 assert( slength == nvars );
3871 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3872 SCIP_CALL( SCIPsetRelaxSolVals(scip, relax, nvars, vars, solforscip, TRUE) );
3873 *lowerbound = objforscip;
3876 SCIP_CALL( SCIPgetLPColsData(scip, &cols, &ncols) );
3877 for (i = 0; i < ncols; i++)
3879 SCIP_CALL( SCIPsetRelaxSolVal(scip, relax, SCIPcolGetVar(cols[i]), SCIPgetSolVal(scip, scipsol, SCIPcolGetVar(cols[i]))) );
3882 SCIP_CALL( SCIPmarkRelaxSolValid(scip, relax, TRUE) );
3883 *result = SCIP_SUCCESS;
3885 SCIPfreeBufferArray(scip, &solforscip);
3886 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3888 *result = SCIP_SUCCESS;
3893 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
3897 relaxdata->origsolved = TRUE;
3898 relaxdata->feasible = FALSE;
3899 *result = SCIP_CUTOFF;
3904 SCIP_CALL( SCIPflushLP(scip) );
3907 nconss = SCIPgetNConss(scip);
3908 vars = SCIPgetVars(scip);
3909 nvars = SCIPgetNVars(scip);
3911 #ifdef SCIP_EVEN_MORE_DEBUG 3912 for (i = 0; i < nvars; ++i)
3914 SCIPdebugMsg(scip,
"variable <%s>: status = %u, integral = %u, bounds = [%g, %g]\n", SCIPvarGetName(vars[i]), SCIPvarGetStatus(vars[i]),
3915 SCIPvarIsIntegral(vars[i]), SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i]));
3922 relaxdata->origsolved = TRUE;
3923 relaxdata->feasible = TRUE;
3924 *result = SCIP_DIDNOTRUN;
3929 relaxdata->origsolved = FALSE;
3930 relaxdata->probingsolved = FALSE;
3938 SCIP_CALL( SCIPallocBufferArray(scip, &newvars, nvars) );
3939 for (i = 0; i < nvars; ++i)
3942 newvars[nnewvars++] = vars[i];
3944 assert( 0 < nnewvars && nnewvars <= nvars );
3946 SCIPdebugMsg(scip,
"Number of variables changed, new: %d (old: %d).\n", nvars,
SCIPsdpVarmapperGetNVars(relaxdata->varmapper));
3948 SCIPfreeBufferArray(scip, &newvars);
3959 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
3960 assert( relaxdata->sdpconshdlr != NULL );
3961 nsdpconss = SCIPconshdlrGetNActiveConss(relaxdata->sdpconshdlr);
3963 assert( relaxdata->sdprank1conshdlr != NULL );
3964 nsdpconss += SCIPconshdlrGetNActiveConss(relaxdata->sdprank1conshdlr);
3968 if ( nsdpblocks != nsdpconss )
3970 SCIPdebugMsg(scip,
"Number of SDP constraints changed, new: %d (old: %d).\n", nsdpconss, nsdpblocks);
3978 SCIP_CALL(
calcRelax(scip, relax, result, lowerbound));
3987 SCIP_RELAXDATA* relaxdata;
3989 assert( relax != NULL );
3991 relaxdata = SCIPrelaxGetData(relax);
3992 assert( relaxdata != NULL );
3994 SCIP_CALL( SCIPcreateClock(scip, &relaxdata->sdpsolvingtime) );
4004 SCIP_RELAXDATA* relaxdata;
4005 SCIP_RETCODE retcode;
4007 SCIP_Real givenpenaltyparam;
4008 SCIP_Real projminevprimal;
4009 SCIP_Real projminevdual;
4012 assert( relax != NULL );
4014 relaxdata = SCIPrelaxGetData(relax);
4015 assert( relaxdata != NULL );
4017 relaxdata->objval = 0.0;
4018 relaxdata->origsolved = FALSE;
4019 relaxdata->probingsolved = FALSE;
4020 relaxdata->sdpcalls = 0;
4021 relaxdata->sdpinterfacecalls = 0;
4022 relaxdata->sdpopttime = 0.0;
4023 relaxdata->sdpiterations = 0;
4024 relaxdata->ntightenedrows = 0;
4025 relaxdata->solvedfast = 0;
4026 relaxdata->solvedmedium = 0;
4027 relaxdata->solvedstable = 0;
4028 relaxdata->solvedpenalty = 0;
4029 relaxdata->stablewslater = 0;
4030 relaxdata->unstablewslater = 0;
4031 relaxdata->boundedwslater = 0;
4032 relaxdata->unsolvedwslater = 0;
4033 relaxdata->stablenoslater = 0;
4034 relaxdata->unsolvednoslater = 0;
4035 relaxdata->boundednoslater = 0;
4036 relaxdata->unsolvednoslater = 0;
4037 relaxdata->nslaterholds = 0;
4038 relaxdata->nnoslater = 0;
4039 relaxdata->nslatercheckfailed = 0;
4040 relaxdata->npslaterholds = 0;
4041 relaxdata->npnoslater = 0;
4042 relaxdata->npslatercheckfailed = 0;
4043 relaxdata->ndslaterholds = 0;
4044 relaxdata->ndnoslater = 0;
4045 relaxdata->ndslatercheckfailed = 0;
4046 relaxdata->nslaterinfeasible = 0;
4047 relaxdata->stableinfeasible = 0;
4048 relaxdata->unstableinfeasible = 0;
4049 relaxdata->penaltyinfeasible = 0;
4050 relaxdata->boundedinfeasible = 0;
4051 relaxdata->unsolvedinfeasible = 0;
4052 relaxdata->roundingprobinf = 0;
4053 relaxdata->primalroundfails = 0;
4054 relaxdata->dualroundfails = 0;
4055 relaxdata->roundstartsuccess = 0;
4056 relaxdata->roundingoptimal = 0;
4057 relaxdata->roundingcutoff = 0;
4059 if ( SCIPgetStatus(scip) == SCIP_STATUS_OPTIMAL || SCIPgetStatus(scip) == SCIP_STATUS_INFEASIBLE
4060 || SCIPgetStatus(scip) == SCIP_STATUS_UNBOUNDED || SCIPgetStatus(scip) == SCIP_STATUS_INFORUNBD )
4063 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4065 if ( relaxdata->roundingprobtime == NULL )
4067 SCIP_CALL( SCIPcreateClock(scip, &relaxdata->roundingprobtime) );
4072 assert( relaxdata->roundingprobtime == NULL );
4074 relaxdata->unsolved = 0;
4075 relaxdata->feasible = FALSE;
4077 relaxdata->ipXexists = FALSE;
4078 relaxdata->ipZexists = FALSE;
4080 relaxdata->sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
4081 if ( relaxdata->sdpconshdlr == NULL )
4082 return SCIP_PLUGINNOTFOUND;
4084 relaxdata->sdprank1conshdlr = SCIPfindConshdlr(scip,
"SDPrank1");
4085 if ( relaxdata->sdprank1conshdlr == NULL )
4086 return SCIP_PLUGINNOTFOUND;
4088 nvars = SCIPgetNVars(scip);
4089 vars = SCIPgetVars(scip);
4103 if ( retcode == SCIP_PARAMETERUNKNOWN )
4105 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4106 "SDP Solver <%s>: gaptol parameter not available -- SCIP parameter has no effect.\n",
4111 SCIP_CALL( retcode );
4119 if ( retcode == SCIP_PARAMETERUNKNOWN )
4121 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4122 "SDP Solver <%s>: sdpsolverfeastol parameter not available -- SCIP parameter has no effect.\n",
4127 SCIP_CALL( retcode );
4131 if ( retcode == SCIP_PARAMETERUNKNOWN )
4133 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4134 "SDP Solver <%s>: epsilon parameter not available -- SCIP parameter has no effect.\n",
4139 SCIP_CALL( retcode );
4143 if ( retcode == SCIP_PARAMETERUNKNOWN )
4145 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4146 "SDP Solver <%s>: feastol parameter not available -- SCIP parameter has no effect.\n",
4151 SCIP_CALL( retcode );
4155 if ( SCIPisGE(scip, relaxdata->penaltyparam, 0.0) )
4158 givenpenaltyparam = relaxdata->penaltyparam;
4159 if ( retcode == SCIP_PARAMETERUNKNOWN )
4161 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4162 "SDP Solver <%s>: penaltyparam parameter not available -- SCIP parameter has no effect\n",
4167 SCIP_CALL( retcode );
4172 SCIP_Real maxcoeff = 0.0;
4176 for (v = 0; v < nvars; v++)
4178 if ( REALABS(SCIPvarGetObj(vars[v])) > maxcoeff )
4179 maxcoeff = REALABS(SCIPvarGetObj(vars[v]));
4186 if ( SCIPisGE(scip, relaxdata->maxpenaltyparam, 0.0) )
4190 if ( retcode == SCIP_PARAMETERUNKNOWN )
4192 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4193 "SDP Solver <%s>: maxpenaltyparam parameter not available -- SCIP parameter has no effect.\n",
4198 SCIP_CALL( retcode );
4202 if ( SCIPisLT(scip, givenpenaltyparam, relaxdata->maxpenaltyparam) )
4204 SCIPdebugMsg(scip,
"Penalty parameter %g overwritten by maxpenaltyparam %f!\n", givenpenaltyparam, relaxdata->maxpenaltyparam);
4210 SCIP_Real givenmaxpenaltyparam;
4217 if ( retcode == SCIP_PARAMETERUNKNOWN )
4219 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4220 "SDP Solver <%s>: npenaltyincr parameter not available -- SCIP parameter has no effect.\n",
4225 SCIP_CALL( retcode );
4231 if ( retcode == SCIP_PARAMETERUNKNOWN )
4233 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4234 "SDP Solver <%s>: peninfeasadjust parameter not available -- SCIP parameter has no effect.\n",
4239 SCIP_CALL( retcode );
4245 if ( retcode == SCIP_PARAMETERUNKNOWN )
4247 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4248 "SDP Solver <%s>: usepresolving parameter not available -- SCIP parameter has no effect.\n",
4253 SCIP_CALL( retcode );
4259 if ( retcode == SCIP_PARAMETERUNKNOWN )
4261 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4262 "SDP Solver <%s>: usescaling parameter not available -- SCIP parameter has no effect.\n",
4267 SCIP_CALL( retcode );
4273 if ( retcode == SCIP_PARAMETERUNKNOWN )
4275 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4276 "SDP Solver <%s>: scaleobj parameter not available -- SCIP parameter has no effect.\n",
4281 SCIP_CALL( retcode );
4287 if ( SCIPisGE(scip, relaxdata->lambdastar, 0.0) )
4300 conss = SCIPgetConss(scip);
4301 nconss = SCIPgetNConss(scip);
4304 for (c = 0; c < nconss; c++)
4307 if ( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0 || strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDPrank1") == 0 )
4310 if ( (! SCIPisInfinity(scip, maxguess) ) && SCIPisGT(scip, guess, maxguess) )
4320 relaxdata->lambdastar = 1.0;
4322 if ( retcode == SCIP_PARAMETERUNKNOWN )
4324 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4325 "SDP Solver <%s>: lambdastar setting not available -- SCIP parameter has no effect.\n",
4330 SCIP_CALL( retcode );
4334 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevpri", &projminevprimal) );
4335 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevdu", &projminevdual) );
4337 if ( SCIPisGE(scip, projminevprimal, 0.0) && SCIPisGE(scip, projminevdual, 0.0) )
4339 relaxdata->warmstartprojminevprimal = projminevprimal;
4340 relaxdata->warmstartprojminevdual = projminevdual;
4342 else if ( SCIPisGE(scip, projminevprimal, 0.0) && relaxdata->warmstartprojpdsame )
4344 relaxdata->warmstartprojminevprimal = projminevprimal;
4345 relaxdata->warmstartprojminevdual = projminevprimal;
4347 else if ( SCIPisGE(scip, projminevdual, 0.0) && relaxdata->warmstartprojpdsame )
4349 relaxdata->warmstartprojminevprimal = projminevdual;
4350 relaxdata->warmstartprojminevdual = projminevdual;
4354 SCIP_CONSHDLR* sdpconshdlr;
4355 SCIP_CONSHDLR* sdprank1conshdlr;
4356 SCIP_CONS** sdpblocks;
4357 SCIP_CONS** sdporigblocks;
4358 SCIP_CONS** sdprank1blocks;
4365 SCIP_Real maxsdprhs;
4367 SCIP_Real maxsdpcoef;
4372 sdpconshdlr = relaxdata->sdpconshdlr;
4373 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
4375 nsdporigblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4376 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4377 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
4378 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
4380 nsdpblocks = nsdporigblocks + nrank1blocks;
4382 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks) );
4383 for (c = 0; c < nsdporigblocks; ++c)
4384 sdpblocks[c] = sdporigblocks[c];
4386 for (c = 0; c < nrank1blocks; ++c)
4387 sdpblocks[nsdporigblocks + c] = sdprank1blocks[c];
4391 for (b = 0; b < nsdpblocks; b++)
4394 if ( SCIPisGT(scip, sdpcoef, maxsdpcoef) )
4395 maxsdpcoef = sdpcoef;
4401 for (b = 0; b < nsdpblocks; b++)
4409 for (v = 0; v < nvars; v++)
4411 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxobj) )
4412 maxobj = REALABS(SCIPvarGetObj(vars[v]));
4415 if ( relaxdata->warmstartprojpdsame )
4417 maxval = SCIPisGT(scip, maxsdprhs, maxobj) ? maxsdprhs : maxobj;
4418 maxval = SCIPisGT(scip, maxsdpcoef, maxval) ? maxsdpcoef : maxval;
4423 SCIPdebugMsg(scip,
"Setting warmstartprojminev to %f\n", relaxdata->warmstartprojminevdual);
4427 if ( ! SCIPisGE(scip, projminevprimal, 0.0) )
4431 SCIPdebugMsg(scip,
"Setting warmstartprojminevprimal to %f\n", relaxdata->warmstartprojminevprimal);
4434 if ( ! SCIPisGE(scip, projminevdual, 0.0) )
4438 SCIPdebugMsg(scip,
"Setting warmstartprojminevdual to %f\n", relaxdata->warmstartprojminevdual);
4441 SCIPfreeBufferArray(scip, &sdpblocks);
4445 if ( retcode == SCIP_PARAMETERUNKNOWN )
4447 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4448 "SDP Solver <%s>: sdpinfo setting not available -- SCIP parameter has no effect.\n",
4453 SCIP_CALL( retcode );
4458 if ( retcode == SCIP_PARAMETERUNKNOWN )
4461 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4462 "SDP Solver <%s>: nthreads setting not available -- SCIP parameter has no effect.\n",
4467 SCIP_CALL( retcode );
4471 if ( retcode == SCIP_PARAMETERUNKNOWN )
4473 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4474 "SDP Solver <%s>: slatercheck setting not available -- SCIP parameter has no effect.\n",
4479 SCIP_CALL( retcode );
4489 if ( retcode == SCIP_PARAMETERUNKNOWN )
4491 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4492 "SDP Solver <%s>: warmstartpreoptgap setting not available -- SCIP parameter has no effect.\n",
4497 SCIP_CALL( retcode );
4508 assert( scip != NULL );
4509 assert( relax != NULL );
4510 assert( strcmp(SCIPrelaxGetName(relax),
RELAX_NAME) == 0 );
4521 SCIP_RELAXDATA* relaxdata;
4523 assert( scip != NULL );
4524 assert( relax != NULL );
4526 relaxdata = SCIPrelaxGetData(relax);
4527 assert( relaxdata != NULL );
4529 SCIPdebugMsg(scip,
"Exiting Relaxation Handler.\n");
4531 if ( relaxdata->displaystat && SCIPgetSubscipDepth(scip) == 0 )
4533 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"\nSDP iterations:\t\t\t\t%6d\n", relaxdata->sdpiterations);
4534 if ( relaxdata->sdpcalls )
4536 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Average SDP-iterations:\t\t\t%6.2f\n",
4537 (SCIP_Real) relaxdata->sdpiterations / (SCIP_Real) relaxdata->sdpcalls );
4539 if ( relaxdata->sdpinterfacecalls )
4543 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' solved:\t%6.2f\n",
4544 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4545 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'medium settings' solved:\t%6.2f\n",
4546 100.0 * (SCIP_Real) relaxdata->solvedmedium / (SCIP_Real) relaxdata->sdpinterfacecalls);
4547 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' solved:\t%6.2f\n",
4548 100.0 * (SCIP_Real) relaxdata->solvedstable / (SCIP_Real) relaxdata->sdpinterfacecalls);
4552 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'default formulation' solved:\t%6.2f\n",
4553 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4555 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage penalty formulation used:\t%6.2f\n",
4556 100.0 * (SCIP_Real) relaxdata->solvedpenalty / (SCIP_Real) relaxdata->sdpinterfacecalls);
4557 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage unsolved even with penalty:\t%6.2f\n",
4558 100.0 * (SCIP_Real) relaxdata->unsolved / (SCIP_Real) relaxdata->sdpinterfacecalls);
4560 if ( relaxdata->slatercheck )
4562 if ( relaxdata->sdpinterfacecalls )
4564 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition held:\t%6.2f\n",
4565 100.0 * (SCIP_Real) relaxdata->npslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4566 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition did not hold:\t%6.2f\n",
4567 100.0 * (SCIP_Real) relaxdata->npnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4568 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater check failed:\t%6.2f\n",
4569 100.0 * (SCIP_Real) relaxdata->npslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4571 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition held:\t%6.2f\n",
4572 100.0 * (SCIP_Real) relaxdata->ndslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4573 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition did not hold:\t%6.2f\n",
4574 100.0 * (SCIP_Real) relaxdata->ndnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4575 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check failed:\t%6.2f\n",
4576 100.0 * (SCIP_Real) relaxdata->ndslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4577 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check detected infeasibility:\t%6.2f\n",
4578 100.0 * (SCIP_Real) relaxdata->nslaterinfeasible / (SCIP_Real) relaxdata->sdpinterfacecalls);
4580 if ( relaxdata->nslaterholds )
4582 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with primal and dual slater holding:\t%6.2f\n",
4583 100.0 * (SCIP_Real) relaxdata->stablewslater / (SCIP_Real) relaxdata->nslaterholds);
4584 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with primal and dual slater holding:\t%6.2f\n",
4585 100.0 * (SCIP_Real) relaxdata->unstablewslater / (SCIP_Real) relaxdata->nslaterholds);
4586 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with primal and dual slater holding:\t%6.2f\n",
4587 100.0 * (SCIP_Real) relaxdata->penaltywslater / (SCIP_Real) relaxdata->nslaterholds);
4588 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with primal and dual slater holding:\t%6.2f\n",
4589 100.0 * (SCIP_Real) relaxdata->boundedwslater / (SCIP_Real) relaxdata->nslaterholds);
4590 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with primal and dual slater holding:\t%6.2f\n",
4591 100.0 * (SCIP_Real) relaxdata->unsolvedwslater / (SCIP_Real) relaxdata->nslaterholds);
4593 if ( relaxdata->nnoslater )
4595 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with either primal or dual slater not holding:\t%6.2f\n",
4596 100.0 * (SCIP_Real) relaxdata->stablenoslater / (SCIP_Real) relaxdata->nnoslater);
4597 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with either primal or dual slater not holding:\t%6.2f\n",
4598 100.0 * (SCIP_Real) relaxdata->unstablenoslater / (SCIP_Real) relaxdata->nnoslater);
4599 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with either primal or dual slater not holding:\t%6.2f\n",
4600 100.0 * (SCIP_Real) relaxdata->penaltynoslater / (SCIP_Real) relaxdata->nnoslater);
4601 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with either primal or dual slater not holding:\t%6.2f\n",
4602 100.0 * (SCIP_Real) relaxdata->boundednoslater / (SCIP_Real) relaxdata->nnoslater);
4603 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with either primal or dual slater not holding:\t%6.2f\n",
4604 100.0 * (SCIP_Real) relaxdata->unsolvednoslater / (SCIP_Real) relaxdata->nnoslater);
4606 if ( relaxdata->nslaterinfeasible )
4608 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with slater check showing infeasibility:\t%6.2f\n",
4609 100.0 * (SCIP_Real) relaxdata->stableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4610 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with slater check showing infeasibility:\t%6.2f\n",
4611 100.0 * (SCIP_Real) relaxdata->unstableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4612 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with slater check showing infeasibility:\t%6.2f\n",
4613 100.0 * (SCIP_Real) relaxdata->penaltyinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4614 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with slater check showing infeasibility:\t%6.2f\n",
4615 100.0 * (SCIP_Real) relaxdata->boundedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4616 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with slater check showing infeasibility:\t%6.2f\n",
4617 100.0 * (SCIP_Real) relaxdata->unsolvedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4619 #ifdef SLATERSOLVED_ABSOLUTE 4620 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with primal and dual slater holding:\t%d\n", relaxdata->nslaterholds);
4621 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and primal and dual slater holding:\t%d\n", relaxdata->stablewslater);
4622 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and primal and dual slater holding:\t%d\n", relaxdata->unstablewslater);
4623 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and primal and dual slater holding:\t%d\n", relaxdata->penaltywslater);
4624 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);
4625 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and primal and dual slater holding:\t%d\n", relaxdata->unsolvedwslater);
4627 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with either primal or dual slater not holding:\t%d\n", relaxdata->nnoslater);
4628 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);
4629 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);
4630 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and either primal or dual slater not holding:\t%d\n", relaxdata->penaltynoslater);
4631 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);
4632 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and either primal or dual slater not holding:\t%d\n", relaxdata->unsolvednoslater);
4634 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes:\t%d\n", relaxdata->nslaterinfeasible);
4635 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'fastest settings':\t%d\n", relaxdata->stableinfeasible);
4636 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'stable settings':\t%d\n", relaxdata->unstableinfeasible);
4637 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'penalty':\t%d\n", relaxdata->penaltyinfeasible);
4638 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'computed infeasible lower bound':\t%d\n", relaxdata->boundedinfeasible);
4639 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'unsolved':\t%d\n", relaxdata->unsolvedinfeasible);
4642 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4644 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes detected infeasible through primal rounding problem:\t%d\n", relaxdata->roundingprobinf);
4645 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes that were successfully warmstarted using the rounding problems:\t%d\n", relaxdata->roundstartsuccess);
4646 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the primal rounding problem failed:\t%d\n", relaxdata->primalroundfails);
4647 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the dual rounding problem failed:\t%d\n", relaxdata->dualroundfails);
4648 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the optimal solution was determined by the rounding problem:\t%d\n", relaxdata->roundingoptimal);
4649 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes cut off through bounding by the rounding problem:\t%d\n", relaxdata->roundingcutoff);
4650 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Time spent in rounding problems for warmstarting / detecting infeasibility:\t%f s\n",
4651 SCIPgetClockTime(scip, relaxdata->roundingprobtime));
4653 if ( relaxdata->tightenrows )
4654 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of tightened rows: %d.\n", relaxdata->ntightenedrows);
4657 if ( relaxdata->varmapper != NULL )
4660 relaxdata->varmapper = NULL;
4664 if ( relaxdata->warmstart && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->nblocks > 0 )
4668 for (b = 0; b < relaxdata->nblocks; b++)
4672 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXval[b]), relaxdata->ipXnblocknonz[b]);
4673 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXcol[b]), relaxdata->ipXnblocknonz[b]);
4674 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXrow[b]), relaxdata->ipXnblocknonz[b]);
4676 if ( relaxdata->ipZnblocknonz[b] > 0 )
4678 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZval[b]), relaxdata->ipZnblocknonz[b]);
4679 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZcol[b]), relaxdata->ipZnblocknonz[b]);
4680 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZrow[b]), relaxdata->ipZnblocknonz[b]);
4685 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXval, relaxdata->nblocks);
4686 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXcol, relaxdata->nblocks);
4687 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXrow, relaxdata->nblocks);
4688 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks);
4690 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZval, relaxdata->nblocks);
4691 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZcol, relaxdata->nblocks);
4692 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZrow, relaxdata->nblocks);
4693 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks);
4694 SCIP_CALL( SCIPfreeSol(scip, &relaxdata->ipy) );
4697 relaxdata->objval = 0.0;
4698 relaxdata->origsolved = FALSE;
4699 relaxdata->probingsolved = FALSE;
4700 relaxdata->feasible = FALSE;
4701 relaxdata->sdpopttime = 0.0;
4702 relaxdata->sdpiterations = 0;
4703 relaxdata->sdpcalls = 0;
4704 relaxdata->sdpinterfacecalls = 0;
4705 relaxdata->lastsdpnode = 0LL;
4706 relaxdata->unsolved = 0;
4716 SCIP_RELAXDATA* relaxdata;
4718 assert( relax != NULL );
4720 relaxdata = SCIPrelaxGetData(relax);
4721 assert( relaxdata != NULL );
4723 if ( relaxdata->roundingprobtime != NULL )
4725 SCIP_CALL( SCIPfreeClock(scip, &relaxdata->roundingprobtime) );
4735 SCIP_RELAXDATA* relaxdata;
4737 relaxdata = SCIPrelaxGetData(relax);
4738 assert(relaxdata != NULL);
4740 if ( relaxdata->sdpi != NULL )
4744 if ( relaxdata->lpi != NULL )
4746 SCIP_CALL( SCIPlpiFree(&(relaxdata->lpi)) );
4748 if ( relaxdata->sdpsolvingtime != NULL )
4750 SCIP_CALL( SCIPfreeClock(scip, &relaxdata->sdpsolvingtime) );
4753 SCIPfreeMemory(scip, &relaxdata);
4755 SCIPrelaxSetData(relax, NULL);
4766 value = SCIPparamGetInt(param);
4770 SCIP_CALL( SCIPsetIntParam(scip,
"relaxing/SDP/freq", 1) );
4771 SCIP_CALL( SCIPsetIntParam(scip,
"lp/solvefreq", -1) );
4772 SCIP_CALL( SCIPresetParam(scip,
"lp/cleanuprows") );
4773 SCIP_CALL( SCIPresetParam(scip,
"lp/cleanuprowsroot") );
4776 SCIP_CALL( SCIPresetParam(scip,
"display/lpiterations/active") );
4777 SCIP_CALL( SCIPresetParam(scip,
"display/lpavgiterations/active") );
4778 SCIP_CALL( SCIPresetParam(scip,
"display/nfrac/active") );
4779 SCIP_CALL( SCIPresetParam(scip,
"display/curcols/active") );
4780 SCIP_CALL( SCIPresetParam(scip,
"display/strongbranchs/active") );
4782 SCIP_CALL( SCIPresetParam(scip,
"display/sdpavgiterations/active") );
4783 SCIP_CALL( SCIPresetParam(scip,
"display/sdpiterations/active") );
4784 SCIP_CALL( SCIPresetParam(scip,
"display/sdpunsolved/active") );
4785 SCIP_CALL( SCIPresetParam(scip,
"display/sdpfastsettings/active") );
4786 SCIP_CALL( SCIPresetParam(scip,
"display/sdppenalty/active") );
4789 SCIP_CALL( SCIPresetParam(scip,
"constraints/SDP/diaggezerocuts") );
4790 SCIP_CALL( SCIPresetParam(scip,
"constraints/SDP/twominorvarbounds") );
4791 SCIP_CALL( SCIPresetParam(scip,
"constraints/SDP/tightenbounds") );
4792 SCIP_CALL( SCIPresetParam(scip,
"constraints/SDP/proptightenbounds") );
4794 SCIP_CALL( SCIPresetParam(scip,
"heuristics/oneopt/freq") );
4796 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Turning on SDP solving, turning off LP solving, cleanuprows(root) = FALSE.\n");
4801 SCIP_CALL( SCIPsetIntParam(scip,
"relaxing/SDP/freq", -1) );
4802 SCIP_CALL( SCIPsetIntParam(scip,
"lp/solvefreq", 1) );
4803 SCIP_CALL( SCIPsetBoolParam(scip,
"lp/cleanuprows", TRUE) );
4804 SCIP_CALL( SCIPsetBoolParam(scip,
"lp/cleanuprowsroot", TRUE) );
4807 SCIP_CALL( SCIPsetIntParam(scip,
"display/lpiterations/active", 1) );
4808 SCIP_CALL( SCIPsetIntParam(scip,
"display/lpavgiterations/active", 1) );
4809 SCIP_CALL( SCIPsetIntParam(scip,
"display/nfrac/active", 1) );
4810 SCIP_CALL( SCIPsetIntParam(scip,
"display/curcols/active", 1) );
4811 SCIP_CALL( SCIPsetIntParam(scip,
"display/strongbranchs/active", 1) );
4813 SCIP_CALL( SCIPsetIntParam(scip,
"display/sdpavgiterations/active", 0) );
4814 SCIP_CALL( SCIPsetIntParam(scip,
"display/sdpiterations/active", 0) );
4815 SCIP_CALL( SCIPsetIntParam(scip,
"display/sdpunsolved/active", 0) );
4816 SCIP_CALL( SCIPsetIntParam(scip,
"display/sdpfastsettings/active", 0) );
4817 SCIP_CALL( SCIPsetIntParam(scip,
"display/sdppenalty/active", 0) );
4820 SCIP_CALL( SCIPsetBoolParam(scip,
"constraints/SDP/diaggezerocuts", TRUE) );
4821 SCIP_CALL( SCIPsetBoolParam(scip,
"constraints/SDP/twominorvarbounds", FALSE) );
4822 SCIP_CALL( SCIPsetBoolParam(scip,
"constraints/SDP/tightenbounds", FALSE) );
4823 SCIP_CALL( SCIPsetBoolParam(scip,
"constraints/SDP/proptightenbounds", FALSE) );
4825 SCIP_CALL( SCIPsetIntParam(scip,
"heuristics/oneopt/freq", 1) );
4827 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Turning on LP solving, turning off SDP solving, cleanuprows(root) = TRUE.\n");
4838 SCIP_RELAXDATA* relaxdata = NULL;
4843 assert( scip != NULL );
4846 SCIP_CALL( SCIPallocMemory(scip, &relaxdata) );
4847 SCIP_CALL(
SCIPsdpiCreate(&sdpi, SCIPgetMessagehdlr(scip), SCIPblkmem(scip), SCIPbuffer(scip)) );
4848 SCIP_CALL( SCIPlpiCreate(&lpi, SCIPgetMessagehdlr(scip),
"SDProundingProb", SCIP_OBJSEN_MINIMIZE) );
4850 relaxdata->sdpi = sdpi;
4851 relaxdata->lpi = lpi;
4852 relaxdata->sdpsolvingtime = NULL;
4853 relaxdata->lastsdpnode = -1LL;
4854 relaxdata->nblocks = 0;
4855 relaxdata->varmapper = NULL;
4856 relaxdata->roundingprobtime = NULL;
4857 relaxdata->sdpconshdlr = NULL;
4858 relaxdata->sdprank1conshdlr = NULL;
4862 assert( relax != NULL );
4865 SCIP_CALL( SCIPsetRelaxInit(scip, relax, relaxInitSdp) );
4866 SCIP_CALL( SCIPsetRelaxInitsol(scip, relax, relaxInitSolSdp) );
4867 SCIP_CALL( SCIPsetRelaxExitsol(scip, relax, relaxExitSolSdp) );
4868 SCIP_CALL( SCIPsetRelaxExit(scip, relax, relaxExitSdp) );
4869 SCIP_CALL( SCIPsetRelaxFree(scip, relax, relaxFreeSdp) );
4870 SCIP_CALL( SCIPsetRelaxCopy(scip, relax, relaxCopySdp) );
4873 SCIP_CALL( SCIPaddIntParam(scip,
"misc/solvesdps",
"solve SDPs (1) or LPs (0)", NULL, FALSE, 1, 0, 1, SCIPparamChgdSolvesdps, NULL) );
4876 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolvergaptol",
4877 "the stopping criterion for the duality gap the sdpsolver should use",
4880 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolverfeastol",
4881 "the feasibility tolerance for the SDP solver",
4884 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/penaltyparam",
4885 "the starting value of the penalty parameter Gamma used for the penalty formulation if the " 4886 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem",
4889 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/maxpenaltyparam",
4890 "the maximum value of the penalty parameter Gamma used for the penalty formulation if the " 4891 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem",
4894 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/peninfeasadjust",
4895 "gap- or feastol will be multiplied by this before checking for infeasibility using the penalty formulation",
4898 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/usepresolving",
4899 "whether presolving of SDP-solver should be used",
4902 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/usescaling",
4903 "whether the SDP-solver should use scaling",
4906 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/scaleobj",
4907 "whether the objective should be scaled in order to get a more stable behavior",
4910 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartipfactor",
4911 "factor for interior point in convexcombination of IP and parent solution, if warmstarts are enabled",
4914 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartprimaltype",
4915 "how to warmstart the primal problem? 1: scaled identity/analytic center, 2: elementwise reciprocal, 3: saved primal sol",
4918 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartiptype",
4919 "which interior point to use for convex combination for warmstarts? 1: scaled identity, 2: analytic center",
4922 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartproject",
4923 "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",
4926 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevpri",
4927 "minimum eigenvalue to allow when projecting primal matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically",
4930 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevdu",
4931 "minimum eigenvalue to allow when projecting dual matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically",
4934 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartprojpdsame",
4935 "Should one shared minimum eigenvalue respectively maximum entry be computed for primal and dual problem instead " 4936 "of different ones for primal and dual and each block for projection or convex combination ?",
4939 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartpreoptsol",
4940 "Should a preoptimal solution (with larger gap) instead of the optimal solution be used for warmstarts",
4943 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartpreoptgap",
4944 "If warmstartpreoptsol is TRUE, this is the gap where the preoptimal solution will be saved",
4947 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartroundonlyinf",
4948 "Only use solution of roundingproblem to detect infeasibility (only has an effect for warmstartproject = 4)",
4951 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/npenaltyincr",
4952 "maximum number of times the penalty parameter will be increased if the penalty formulation failed",
4955 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/lambdastar",
4956 "the parameter lambda star used by SDPA to set the initial point;" 4957 "set this to a negative value to compute the parameter depending on the given problem",
4960 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/slatercheck",
4961 "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 " 4962 "every problem not satisfying primal and dual Slater condition",
4965 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/sdpinfo",
4966 "Should the SDP solver output information to the screen?",
4969 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstart",
4970 "Should the SDP solver try to use warmstarts?",
4973 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/objlimit",
4974 "Should an objective limit be given to the SDP-Solver?",
4977 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/resolve",
4978 "Should the relaxation be resolved after bound-tightenings were found during propagation (outside of probing)?",
4981 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/tightenrows",
4982 "Should we perform coefficient tightening on the LP rows before giving them to the SDP-solver?",
4985 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/displaystatistics",
4986 "Should statistics about SDP iterations and solver settings/success be printed after quitting SCIP-SDP ?",
4989 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetfreq",
4990 "frequency for resetting parameters in SDP solver and trying again with fastest settings (-1: never, 0: only at depth settingsresetofs);" 4991 "currently only supported for SDPA",
4994 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetofs",
4995 "frequency offset for resetting parameters in SDP solver and trying again with fastest settings; currently only supported for SDPA",
4998 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/sdpsolverthreads",
4999 "number of threads the SDP solver should use (-1 = number of cores); currently only supported for MOSEK",
5020 SCIP_CONSHDLR* sdpconshdlr;
5021 SCIP_CONSHDLR* sdprank1conshdlr;
5022 SCIP_RELAXDATA* relaxdata;
5025 SCIP_CONS** sdpblocks;
5026 SCIP_Real* solforscip;
5028 SCIP_Real timelimit;
5039 SCIP_CONS** sdporigblocks;
5040 SCIP_CONS** sdprank1blocks;
5045 assert( scip != NULL );
5046 assert( relax != NULL );
5047 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
5049 relaxdata = SCIPrelaxGetData(relax);
5050 assert( relaxdata != NULL );
5053 if ( relaxdata->ipXexists || relaxdata->ipZexists )
5055 SCIPdebugMsg(scip,
"Analytic centers have already been computed.\n");
5060 if ( ! relaxdata->warmstart || relaxdata->warmstartiptype != 2 || SCIPisLE(scip, relaxdata->warmstartipfactor, 0.0) )
5064 if ( SCIPgetNVars(scip) == 0 )
5068 sdpconshdlr = relaxdata->sdpconshdlr;
5069 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
5070 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
5071 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
5072 if ( nsdpblocks + nrank1blocks + SCIPgetNLPRows(scip) <= 0 )
5075 SCIPdebugMsg(scip,
"computing analytic centers for warmstarting\n");
5077 relaxdata->nblocks = SCIPgetNLPRows(scip) + SCIPgetNVars(scip) > 0 ? nsdpblocks + nrank1blocks + 1 : SCIPconshdlrGetNConss(sdpconshdlr) + SCIPconshdlrGetNConss(sdprank1conshdlr);
5080 SCIP_CALL( SCIPgetIntParam(scip,
"timing/clocktype", &clocktype) );
5090 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
5091 if ( ! SCIPisInfinity(scip, timelimit) )
5093 timelimit -= SCIPgetSolvingTime(scip);
5094 if ( timelimit <= 0.0 )
5099 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
5100 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit) );
5101 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
5108 int npenaltybounds = 0;
5110 relaxdata->ipXexists = TRUE;
5113 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
5114 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
5115 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
5116 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
5119 for (b = 0; b < relaxdata->nblocks; b++)
5121 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
5122 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
5123 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
5128 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval) );
5131 for (i = 0; i < relaxdata->ipXnblocknonz[relaxdata->nblocks - 1]; i++)
5137 if ( npenaltybounds > 0 )
5139 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXrow[relaxdata->nblocks - 1],
5140 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
5141 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXcol[relaxdata->nblocks - 1],
5142 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
5143 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXval[relaxdata->nblocks - 1],
5144 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
5145 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] = relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds;
5148 for (b = 0; b < relaxdata->nblocks; b++)
5151 SCIPsdpVarfixerSortRowCol(relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]);
5154 #ifdef SCIP_PRINT_WARMSTART 5155 SCIPdebugMsg(scip,
"Computed primal analytic center:\n");
5156 for (b = 0; b < relaxdata->nblocks; b++)
5158 SCIPdebugMsg(scip,
"primal matrix, block %d:\n", b);
5159 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5161 SCIPdebugMsg(scip,
"X_%d[%d,%d]: %f\n", b, relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
5168 relaxdata->ipXexists = TRUE;
5170 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
5171 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
5172 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
5173 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
5175 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
5176 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
5177 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
5178 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
5180 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
5181 for (r = 0; r < nsdpblocks; ++r)
5182 sdpblocks[r] = sdporigblocks[r];
5184 for (r = 0; r < nrank1blocks; ++r)
5185 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
5187 nsdpblocks += nrank1blocks;
5189 for (b = 0; b < relaxdata->nblocks; b++)
5191 if ( b < relaxdata->nblocks - 1 )
5199 relaxdata->ipXnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
5201 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
5202 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
5203 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
5205 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5207 relaxdata->ipXrow[b][i] = i;
5208 relaxdata->ipXcol[b][i] = i;
5209 relaxdata->ipXval[b][i] = relaxdata->lambdastar;
5213 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of primal feasible set, using scaled identity instead.\n");
5214 SCIPfreeBufferArray(scip, &sdpblocks);
5223 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
5224 if ( ! SCIPisInfinity(scip, timelimit) )
5226 timelimit -= SCIPgetSolvingTime(scip);
5227 if ( timelimit <= 0.0 )
5232 SCIP_CALL( SCIPstartClock(scip, relaxdata->sdpsolvingtime) );
5233 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit) );
5234 SCIP_CALL( SCIPstopClock(scip, relaxdata->sdpsolvingtime) );
5244 relaxdata->ipZexists = TRUE;
5246 nvars = SCIPgetNVars(scip);
5247 vars = SCIPgetVars(scip);
5250 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
5251 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
5252 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
5253 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5256 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
5259 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solforscip, &slength) );
5261 assert( slength == nvars );
5265 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5266 SCIP_CALL( SCIPsetSolVals(scip, relaxdata->ipy, nvars, vars, solforscip) );
5267 #ifdef SCIP_PRINT_WARMSTART 5268 SCIPdebugMsg(scip,
"Computed dual analytic center:\n");
5269 for (i = 0; i < nvars; i++)
5271 SCIPdebugMsg(scip,
"y[%d] = %f\n", i, solforscip[i]);
5275 SCIPfreeBufferArray(scip, &solforscip);
5278 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
5279 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
5280 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
5281 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
5283 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
5284 for (r = 0; r < nsdpblocks; ++r)
5285 sdpblocks[r] = sdporigblocks[r];
5287 for (r = 0; r < nrank1blocks; ++r)
5288 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
5290 nsdpblocks += nrank1blocks;
5292 for (b = 0; b < relaxdata->nblocks - 1; b++)
5295 arraylength = relaxdata->ipZnblocknonz[b];
5297 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5298 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5299 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5303 &(relaxdata->ipZnblocknonz[b]), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b]) );
5305 assert( relaxdata->ipZnblocknonz[b] <= arraylength );
5307 if ( relaxdata->ipZnblocknonz[b] < arraylength )
5309 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5310 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5311 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZval[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5315 SCIPsdpVarfixerSortRowCol(relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]);
5319 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
5320 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], 2 * nrows + 2 * nvars) );
5321 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], 2 * nrows + 2 * nvars) );
5322 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], 2 * nrows + 2 * nvars) );
5325 relaxdata->ipZnblocknonz[b] = 2 * nrows + 2 * nvars;
5327 for (r = 0; r < nrows; r++)
5331 rownnonz = SCIProwGetNNonz(rows[r]);
5332 rowvals = SCIProwGetVals(rows[r]);
5333 rowcols = SCIProwGetCols(rows[r]);
5334 for (i = 0; i < rownnonz; i++)
5335 rowval += SCIPgetSolVal(scip, relaxdata->ipy, SCIPcolGetVar(rowcols[i])) * rowvals[i];
5337 relaxdata->ipZrow[b][2*r] = 2*r;
5338 relaxdata->ipZcol[b][2*r] = 2*r;
5339 relaxdata->ipZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
5340 relaxdata->ipZrow[b][2*r + 1] = 2*r + 1;
5341 relaxdata->ipZcol[b][2*r + 1] = 2*r + 1;
5342 relaxdata->ipZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
5345 for (v = 0; v < nvars; v++)
5347 relaxdata->ipZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
5348 relaxdata->ipZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
5349 relaxdata->ipZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, relaxdata->ipy, vars[v]) - SCIPvarGetLbLocal(vars[v]);
5350 relaxdata->ipZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5351 relaxdata->ipZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5352 relaxdata->ipZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
5354 #ifdef SCIP_PRINT_WARMSTART 5355 for (b = 0; b < relaxdata->nblocks - 1; b++)
5357 SCIPdebugMsg(scip,
"dual matrix, block %d:\n", b);
5358 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
5360 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", b, relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
5363 SCIPdebugMsg(scip,
"dual matrix, LP constraints:\n");
5364 for (r = 0; r < nrows; r++)
5366 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r], relaxdata->ipZcol[b][2*r], relaxdata->ipZval[b][2*r]);
5367 SCIPdebugMsg(scip,
"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]);
5369 for (v = 0; v < nvars; v++)
5371 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5372 relaxdata->ipZrow[b][2*nrows + 2*v], relaxdata->ipZcol[b][2*nrows + 2*v], relaxdata->ipZval[b][2*nrows + 2*v]);
5373 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5374 relaxdata->ipZrow[b][2*nrows + 2*v + 1], relaxdata->ipZcol[b][2*nrows + 2*v + 1], relaxdata->ipZval[b][2*nrows + 2*v + 1]);
5377 SCIPfreeBufferArray(scip, &sdpblocks);
5382 relaxdata->ipZexists = TRUE;
5385 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5387 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
5388 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
5389 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
5390 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5392 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
5393 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
5394 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
5395 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
5397 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
5398 for (r = 0; r < nsdpblocks; ++r)
5399 sdpblocks[r] = sdporigblocks[r];
5401 for (r = 0; r < nrank1blocks; ++r)
5402 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
5404 for (b = 0; b < relaxdata->nblocks; b++)
5406 if ( b < relaxdata->nblocks - 1 )
5414 relaxdata->ipZnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
5416 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5417 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5418 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5420 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5422 relaxdata->ipZrow[b][i] = i;
5423 relaxdata->ipZcol[b][i] = i;
5424 relaxdata->ipZval[b][i] = relaxdata->lambdastar;
5428 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of dual feasible set, using scaled identity instead.\n");
5429 SCIPfreeBufferArray(scip, &sdpblocks);
5450 SCIP_RELAXDATA* relaxdata;
5456 assert( scip != NULL );
5457 assert( relax != NULL );
5458 assert( lbvars != NULL );
5459 assert( ubvars != NULL );
5460 assert( success != NULL );
5462 relaxdata = SCIPrelaxGetData(relax);
5463 assert( relaxdata != NULL );
5467 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
5468 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
5470 arraylength = nvars;
5472 if ( arraylength >= 0 )
5474 assert( arraylength == nvars );
5476 for (j = 0; j < nvars; ++j)
5481 lbvars[j] = lb[idx];
5482 ubvars[j] = ub[idx];
5489 SCIPfreeBufferArray(scip, &ub);
5490 SCIPfreeBufferArray(scip, &lb);
5502 SCIP_RELAXDATA* relaxdata;
5504 assert( relax != NULL );
5505 assert( success != NULL );
5506 assert( objval != NULL );
5508 relaxdata = SCIPrelaxGetData(relax);
5509 assert( relaxdata != NULL );
5511 *success = relaxdata->origsolved;
5512 *objval = relaxdata->objval;
5522 SCIP_Real* solarray,
5526 SCIP_RELAXDATA* relaxdata;
5528 assert( relax != NULL );
5529 assert( success != NULL );
5530 assert( solarray != NULL );
5532 relaxdata = SCIPrelaxGetData(relax);
5533 assert( relaxdata != NULL );
5535 *success = relaxdata->origsolved;
5537 if ( *sollength >= SCIPgetNVars(scip) )
5539 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solarray, sollength) );
5543 SCIPdebugMsg(scip,
"Called SCIPrelaxSdpGetRelaxSol with an array that wasn't big enough, needed length %d, given %d!\n", SCIPgetNVars(scip), *sollength);
5544 *sollength = SCIPgetNVars(scip);
5555 assert( relax != NULL );
5556 assert( SCIPrelaxGetData(relax) != NULL );
5558 return SCIPrelaxGetData(relax)->lastsdpnode;
5566 SCIP_RELAXDATA* relaxdata;
5568 assert( relax != NULL );
5570 relaxdata = SCIPrelaxGetData(relax);
5572 assert( relaxdata != NULL );
5573 assert( relaxdata->sdpi != NULL );
5583 SCIP_RELAXDATA* relaxdata;
5585 assert( relax != NULL );
5587 relaxdata = SCIPrelaxGetData(relax);
5589 assert( relaxdata != NULL );
5590 assert( relaxdata->sdpi != NULL );
5592 return relaxdata->probingsolved;
5600 assert( relax != NULL );
5601 assert( SCIPrelaxGetData(relax) != NULL );
5603 return SCIPrelaxGetData(relax)->feasible;
5611 SCIP_RELAXDATA* relaxdata;
5613 assert( relax != NULL );
5615 relaxdata = SCIPrelaxGetData(relax);
5617 assert( SCIPrelaxGetData(relax) != NULL );
5618 assert( relaxdata->sdpi != NULL );
5628 assert( relax != NULL );
5629 assert( SCIPrelaxGetData(relax) != NULL );
5631 return SCIPrelaxGetData(relax)->sdpopttime;
5639 assert( relax != NULL );
5640 assert( SCIPrelaxGetData(relax) != NULL );
5642 return SCIPrelaxGetData(relax)->sdpiterations;
5650 assert( relax != NULL );
5651 assert( SCIPrelaxGetData(relax) != NULL );
5653 return SCIPrelaxGetData(relax)->sdpcalls;
5661 assert( relax != NULL );
5662 assert( SCIPrelaxGetData(relax) != NULL );
5664 return SCIPrelaxGetData(relax)->sdpinterfacecalls;
5672 assert( relax != NULL );
5673 assert( SCIPrelaxGetData(relax) != NULL );
5675 return SCIPrelaxGetData(relax)->solvedfast;
5683 assert( relax != NULL );
5684 assert( SCIPrelaxGetData(relax) != NULL );
5686 return SCIPrelaxGetData(relax)->solvedmedium;
5694 assert( relax != NULL );
5695 assert( SCIPrelaxGetData(relax) != NULL );
5697 return SCIPrelaxGetData(relax)->solvedstable;
5705 assert( relax != NULL );
5706 assert( SCIPrelaxGetData(relax) != NULL );
5708 return SCIPrelaxGetData(relax)->solvedpenalty;
5716 assert( relax != NULL );
5717 assert( SCIPrelaxGetData(relax) != NULL );
5719 return SCIPrelaxGetData(relax)->unsolved;
5727 assert( relax != NULL );
5728 assert( SCIPrelaxGetData(relax) != NULL );
5730 return SCIPrelaxGetData(relax)->ndslaterholds;
5738 assert( relax != NULL );
5739 assert( SCIPrelaxGetData(relax) != NULL );
5741 return SCIPrelaxGetData(relax)->ndnoslater;
5749 assert( relax != NULL );
5750 assert( SCIPrelaxGetData(relax) != NULL );
5752 return SCIPrelaxGetData(relax)->nslaterinfeasible;
5760 assert( relax != NULL );
5761 assert( SCIPrelaxGetData(relax) != NULL );
5763 return SCIPrelaxGetData(relax)->ndslatercheckfailed;
5771 assert( relax != NULL );
5772 assert( SCIPrelaxGetData(relax) != NULL );
5774 return SCIPrelaxGetData(relax)->npslaterholds;
5782 assert( relax != NULL );
5783 assert( SCIPrelaxGetData(relax) != NULL );
5785 return SCIPrelaxGetData(relax)->npnoslater;
5793 assert( relax != NULL );
5794 assert( SCIPrelaxGetData(relax) != NULL );
5796 return SCIPrelaxGetData(relax)->npslatercheckfailed;
5804 assert( relax != NULL );
5805 assert( SCIPrelaxGetData(relax) != NULL );
5807 return SCIPrelaxGetData(relax)->nslaterholds;
5815 assert( relax != NULL );
5816 assert( SCIPrelaxGetData(relax) != NULL );
5818 return SCIPrelaxGetData(relax)->stablewslater;
5826 assert( relax != NULL );
5827 assert( SCIPrelaxGetData(relax) != NULL );
5829 return SCIPrelaxGetData(relax)->unstablewslater;
5837 assert( relax != NULL );
5838 assert( SCIPrelaxGetData(relax) != NULL );
5840 return SCIPrelaxGetData(relax)->penaltywslater;
5848 assert( relax != NULL );
5849 assert( SCIPrelaxGetData(relax) != NULL );
5851 return SCIPrelaxGetData(relax)->boundedwslater;
5859 assert( relax != NULL );
5860 assert( SCIPrelaxGetData(relax) != NULL );
5862 return SCIPrelaxGetData(relax)->unsolvedwslater;
5870 assert( relax != NULL );
5871 assert( SCIPrelaxGetData(relax) != NULL );
5873 return SCIPrelaxGetData(relax)->nnoslater;
5881 assert( relax != NULL );
5882 assert( SCIPrelaxGetData(relax) != NULL );
5884 return SCIPrelaxGetData(relax)->stablenoslater;
5892 assert( relax != NULL );
5893 assert( SCIPrelaxGetData(relax) != NULL );
5895 return SCIPrelaxGetData(relax)->unstablenoslater;
5903 assert( relax != NULL );
5904 assert( SCIPrelaxGetData(relax) != NULL );
5906 return SCIPrelaxGetData(relax)->penaltynoslater;
5914 assert( relax != NULL );
5915 assert( SCIPrelaxGetData(relax) != NULL );
5917 return SCIPrelaxGetData(relax)->boundednoslater;
5925 assert( relax != NULL );
5926 assert( SCIPrelaxGetData(relax) != NULL );
5928 return SCIPrelaxGetData(relax)->unsolvednoslater;
5936 assert( relax != NULL );
5937 assert( SCIPrelaxGetData(relax) != NULL );
5939 return SCIPrelaxGetData(relax)->stableinfeasible;
5947 assert( relax != NULL );
5948 assert( SCIPrelaxGetData(relax) != NULL );
5950 return SCIPrelaxGetData(relax)->unstableinfeasible;
5958 assert( relax != NULL );
5959 assert( SCIPrelaxGetData(relax) != NULL );
5961 return SCIPrelaxGetData(relax)->penaltyinfeasible;
5969 assert( relax != NULL );
5970 assert( SCIPrelaxGetData(relax) != NULL );
5972 return SCIPrelaxGetData(relax)->boundedinfeasible;
5980 assert( relax != NULL );
5981 assert( SCIPrelaxGetData(relax) != NULL );
5983 return SCIPrelaxGetData(relax)->unsolvedinfeasible;
5992 SCIP_CLOCK* sdpsolvingtime;
5994 assert( scip != NULL );
5995 assert( relax != NULL );
5996 assert( SCIPrelaxGetData(relax) != NULL );
5998 sdpsolvingtime = SCIPrelaxGetData(relax)->sdpsolvingtime;
5999 if ( sdpsolvingtime != NULL )
6000 return SCIPgetClockTime(scip, sdpsolvingtime);
6013 assert( relax != NULL );
6014 assert( SCIPrelaxGetData(relax) != NULL );
6016 SCIP_CALL(
SCIPsdpiGetStatistics(SCIPrelaxGetData(relax)->sdpi, ninfeasible, nallfixed, nonevarsdp) );
#define DEFAULT_USESCALING
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 SCIPconsSdpComputeUbSparseSdpMatrixLength(SCIP_CONS *cons)
static SCIP_RETCODE putLpDataInInterface(SCIP *scip, SCIP_RELAXDATA *relaxdata, SCIP_Bool primalobj, SCIP_Bool dualobj)
SCIP_RETCODE SCIPsdpiGetTime(SCIP_SDPI *sdpi, SCIP_Real *opttime)
int SCIPrelaxSdpGetNSlaterInfeasibleFast(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiGetSdpCalls(SCIP_SDPI *sdpi, int *calls)
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
int SCIPrelaxSdpGetNprimalSlaterHolds(SCIP_RELAX *relax)
SCIP_Real SCIPconsSavesdpsolGetMaxPrimalEntry(SCIP *scip, SCIP_CONS *cons)
#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_Bool SCIPsdpVarmapperExistsSCIPvar(SdpVarmapper *varmapper, SCIP_VAR *var)
SCIP_RETCODE SCIPsdpiGetPrimalMatrix(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
void SCIPsdpiClockSetType(SCIP_SDPI *sdpi, int clocktype)
SCIP_Bool SCIPsdpiIsOptimal(SCIP_SDPI *sdpi)
static SCIP_DECL_RELAXEXIT(relaxExitSdp)
#define DEFAULT_SDPSOLVERFEASTOL
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrixNonzeros(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz)
int SCIPrelaxSdpGetNdualSlaterHolds(SCIP_RELAX *relax)
const char * SCIPsdpiGetSolverName(void)
SCIP_RETCODE SCIPsdpiGetNSDPBlocks(SCIP_SDPI *sdpi, int *nsdpblocks)
#define DEFAULT_SDPSOLVERGAPTOL
SCIP_RETCODE SCIPsdpiGetSol(SCIP_SDPI *sdpi, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_RETCODE SCIPrelaxSdpGetStatistics(SCIP_RELAX *relax, int *ninfeasible, int *nallfixed, int *nonevarsdp)
#define DEFAULT_TIGHTENROWS
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)
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)
SCIP_Real SCIPrelaxSdpGetOptTime(SCIP_RELAX *relax)
static SCIP_DECL_RELAXFREE(relaxFreeSdp)
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)
struct Sdpvarmapper SdpVarmapper
static SCIP_DECL_RELAXINIT(relaxInitSdp)
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_RETCODE SCIPrelaxSdpGetPrimalBoundVars(SCIP *scip, SCIP_RELAX *relax, SCIP_VAR **vars, int nvars, SCIP_Real *lbvars, SCIP_Real *ubvars, SCIP_Bool *success)
SCIP_Real SCIPconsSdpGetMaxSdpCoef(SCIP *scip, SCIP_CONS *cons)
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
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, SCIP_Bool *rankone, int **maxevsubmat, SCIP_Bool *addedquadcons)
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)
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
SCIP_RETCODE SCIPsdpiGetStatistics(SCIP_SDPI *sdpi, int *ninfeasible, int *nallfixed, int *nonevarsdp)
SCIP_Bool SCIPsdpiWasSolved(SCIP_SDPI *sdpi)
static SCIP_DECL_PARAMCHGD(SCIPparamChgdSolvesdps)
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)
#define DEFAULT_LAMBDASTAR
static SCIP_RETCODE scaleTransposedMatrix(int blocksize, SCIP_Real *matrix, SCIP_Real *scale)
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)
static SCIP_RETCODE tightenRowCoefs(SCIP *scip, SCIP_Real *rowvals, SCIP_COL **rowcols, int *rownnonz, SCIP_Real *rowlhs, SCIP_Real *rowrhs, SCIP_Bool *lhsredundant, SCIP_Bool *rhsredundant, int *nchgcoefs)
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
static SCIP_RETCODE calcRelax(SCIP *scip, SCIP_RELAX *relax, SCIP_RESULT *result, SCIP_Real *lowerbound)
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_Longint SCIPrelaxSdpGetSdpNode(SCIP_RELAX *relax)
interface methods for eigenvector computation and matrix multiplication using openblas ...
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)
static SCIP_RETCODE updateSDPStatistics(SCIP_RELAXDATA *relaxdata)
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
SCIP_RETCODE SCIPlapackComputeEigenvectorDecomposition(BMS_BUFMEM *bufmem, int n, SCIP_Real *A, SCIP_Real *eigenvalues, SCIP_Real *eigenvectors)
int SCIPrelaxSdpGetNSlaterHoldsPenalty(SCIP_RELAX *relax)
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)
#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)
SCIP_Real SCIPrelaxSdpGetSolvingTime(SCIP *scip, SCIP_RELAX *relax)
#define DEFAULT_SDPSOLVERTHREADS
constraint handler for saving SDP solutions in nodes
#define DEFAULT_USEPRESOLVING
SCIP_RETCODE SCIPincludeRelaxSdp(SCIP *scip)
#define DEFAULT_WARMSTART_PREOPTIMAL_SOL
constraint handler for saving SDP settings