44 #include "scip/pub_message.h" 47 #define BMS_CALL(x) do \ 51 SCIPerrorMessage("No memory in function call.\n"); \ 52 return SCIP_NOMEMORY; \ 71 int* sdpconstnblocknonz,
75 SCIP_Real** sdpconstval,
77 int** sdpnblockvarnonz,
107 assert( bufmem != NULL );
108 assert( lb != NULL );
109 assert( ub != NULL );
110 assert( nsdpblocks >= 0 );
111 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
112 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
113 assert( sdpconstnnonz >= 0 );
114 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
115 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
116 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
117 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
118 assert( sdpnnonz >= 0 );
119 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
120 assert( nsdpblocks == 0 || sdpvar != NULL );
121 assert( nsdpblocks == 0 || sdprow != NULL );
122 assert( nsdpblocks == 0 || sdpcol != NULL );
123 assert( nsdpblocks == 0 || sdpval != NULL );
124 assert( nsdpblocks == 0 || indchanges != NULL );
125 assert( nsdpblocks == 0 || nremovedinds != NULL );
126 assert( nsdpblocks == 0 || blockindchanges != NULL );
127 assert( nlpcons >= 0 );
128 assert( nlpcons == 0 || lplhs != NULL );
129 assert( nlpcons == 0 || lprhs != NULL );
130 assert( lpnnonz >= 0 );
131 assert( nlpcons == 0 || lprow != NULL );
132 assert( nlpcons == 0 || lpcol != NULL );
133 assert( nlpcons == 0 || lpval != NULL );
134 assert( solvector != NULL );
135 assert( feastol >= 0 );
136 assert( infeasible != NULL );
139 for (i = 0; i < nvars; i++)
141 if ( solvector[i] < lb[i] - feastol || solvector[i] > ub[i] + feastol )
143 SCIPdebugMessage(
"solution found infeasible (feastol=%g) for dual variable bounds: x[%d] = %g <|= [%g, %g]\n",
144 feastol, i, solvector[i], lb[i], ub[i]);
153 SCIP_Real* lpconsvals;
155 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &lpconsvals, nlpcons) );
158 for (i = 0; i < nlpcons; i++)
162 for (i = 0; i < lpnnonz; i++)
164 if ( lb[lpcol[i]] < ub[lpcol[i]] - epsilon )
165 lpconsvals[lprow[i]] += solvector[lpcol[i]] * lpval[i];
170 for (i = 0; i < nlpcons; i++)
172 if ( lpconsvals[i] < lplhs[ind] - feastol || lpconsvals[i] > lprhs[ind] + feastol)
174 SCIPdebugMessage(
"solution found infeasible (feastol=%g) for dual lp constraint: LP-%d = %g <|= [%g,%g]\n",
175 feastol, i, lpconsvals[i], lplhs[ind], lprhs[ind]);
176 BMSfreeBufferMemoryArray(bufmem, &lpconsvals);
183 BMSfreeBufferMemoryArray(bufmem, &lpconsvals);
187 if ( nsdpblocks > 0 )
189 SCIP_Real* fullsdpmatrix;
190 SCIP_Real eigenvalue;
191 int maxblocksize = 0;
194 if ( nsdpblocks == 1 )
195 maxblocksize = sdpblocksizes[0] - nremovedinds[0];
199 for (b = 0; b < nsdpblocks; b++)
201 if ( (sdpblocksizes[b] - nremovedinds[b]) > maxblocksize )
202 maxblocksize = sdpblocksizes[b] - nremovedinds[b];
206 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &fullsdpmatrix, maxblocksize * maxblocksize) );
208 for (b = 0; b < nsdpblocks; b++)
210 if ( blockindchanges[b] > -1 )
213 for (i = 0; i < sdpblocksizes[b] - nremovedinds[b]; i++)
215 for (j = 0; j <= i; j++)
217 fullsdpmatrix[i * (sdpblocksizes[b] - nremovedinds[b]) + j] = 0.0;
222 for (v = 0; v < sdpnblockvars[b]; v++)
224 if ( lb[sdpvar[b][v]] < ub[sdpvar[b][v]] - epsilon )
226 for (i = 0; i < sdpnblockvarnonz[b][v]; i++)
228 fullsdpmatrix[((sdprow[b][v][i] - indchanges[b][sdprow[b][v][i]]) * (sdpblocksizes[b] - nremovedinds[b])) +
229 sdpcol[b][v][i] - indchanges[b][sdpcol[b][v][i]]] += solvector[sdpvar[b][v]] * sdpval[b][v][i];
235 if ( sdpconstnblocknonz != NULL )
237 for (i = 0; i < sdpconstnblocknonz[b]; i++)
239 fullsdpmatrix[((sdpconstrow[b][i] - indchanges[b][sdpconstrow[b][i]]) * (sdpblocksizes[b] - nremovedinds[b])) +
240 sdpconstcol[b][i] - indchanges[b][sdpconstcol[b][i]]] -= sdpconstval[b][i];
245 for (i = 0; i < sdpblocksizes[b] - nremovedinds[b]; i++)
247 for (j = 0; j < i; j++)
249 fullsdpmatrix[j * (sdpblocksizes[b] - nremovedinds[b]) + i] = fullsdpmatrix[i * (sdpblocksizes[b] - nremovedinds[b]) + j];
256 if ( eigenvalue < - feastol )
258 SCIPdebugMessage(
"solution found infeasible (feastol=%g) for dual sdp constraint %d, smallest eigenvector %.10g\n",
259 feastol, b, eigenvalue);
260 BMSfreeBufferMemoryArray(bufmem, &fullsdpmatrix);
267 BMSfreeBufferMemoryArray(bufmem, &fullsdpmatrix);
290 int* sdpconstnblocknonz,
294 SCIP_Real** sdpconstval,
296 int** sdpnblockvarnonz,
306 int* blockindchanges,
314 SCIP_Real* solvector,
317 SCIP_Real* maxabsviolbnds,
318 SCIP_Real* sumabsviolbnds,
319 SCIP_Real* maxabsviolcons,
320 SCIP_Real* sumabsviolcons,
321 SCIP_Real* maxabsviolsdp,
322 SCIP_Real* sumabsviolsdp,
323 SCIP_Bool* infeasible
333 assert( bufmem != NULL );
334 assert( lb != NULL );
335 assert( ub != NULL );
336 assert( nsdpblocks >= 0 );
337 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
338 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
339 assert( sdpconstnnonz >= 0 );
340 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
341 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
342 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
343 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
344 assert( sdpnnonz >= 0 );
345 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
346 assert( nsdpblocks == 0 || sdpvar != NULL );
347 assert( nsdpblocks == 0 || sdprow != NULL );
348 assert( nsdpblocks == 0 || sdpcol != NULL );
349 assert( nsdpblocks == 0 || sdpval != NULL );
350 assert( nsdpblocks == 0 || indchanges != NULL );
351 assert( nsdpblocks == 0 || nremovedinds != NULL );
352 assert( nsdpblocks == 0 || blockindchanges != NULL );
353 assert( nlpcons >= 0 );
354 assert( nlpcons == 0 || lplhs != NULL );
355 assert( nlpcons == 0 || lprhs != NULL );
356 assert( lpnnonz >= 0 );
357 assert( nlpcons == 0 || lprow != NULL );
358 assert( nlpcons == 0 || lpcol != NULL );
359 assert( nlpcons == 0 || lpval != NULL );
360 assert( solvector != NULL );
361 assert( feastol >= 0 );
362 assert( maxabsviolbnds != NULL );
363 assert( sumabsviolbnds != NULL );
364 assert( maxabsviolcons != NULL );
365 assert( sumabsviolcons != NULL );
366 assert( maxabsviolsdp != NULL );
367 assert( sumabsviolsdp != NULL );
368 assert( infeasible != NULL );
371 *maxabsviolbnds = 0.0;
372 *sumabsviolbnds = 0.0;
373 *maxabsviolcons = 0.0;
374 *sumabsviolcons = 0.0;
375 *maxabsviolsdp = 0.0;
376 *sumabsviolsdp = 0.0;
381 for (i = 0; i < nvars; i++)
383 viol = MAX3(lb[i] - solvector[i], solvector[i] - ub[i], 0.0);
384 *sumabsviolbnds += viol;
386 #ifdef SCIP_MORE_DEBUG 387 SCIPdebugMessage(
"Dual variable %d: lb = %g, ub = %g, val = %g, viol = %g\n", i, lb[i], ub[i], solvector[i], viol);
390 if ( viol > *maxabsviolbnds )
391 *maxabsviolbnds = viol;
393 if ( solvector[i] < lb[i] - feastol || solvector[i] > ub[i] + feastol )
395 SCIPdebugMessage(
"solution found infeasible (feastol=%f) for dual variable bounds: x[%d] = %g <|= [%g, %g]\n",
396 feastol, i, solvector[i], lb[i], ub[i]);
404 SCIP_Real* lpconsvals;
406 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &lpconsvals, nlpcons) );
409 for (i = 0; i < nlpcons; i++)
413 for (i = 0; i < lpnnonz; i++)
415 if ( lb[lpcol[i]] < ub[lpcol[i]] - epsilon )
416 lpconsvals[lprow[i]] += solvector[lpcol[i]] * lpval[i];
421 for (i = 0; i < nlpcons; i++)
423 viol = MAX3(lplhs[ind] - lpconsvals[i], lpconsvals[i] - lprhs[ind], 0.0);
424 *sumabsviolcons += viol;
426 #ifdef SCIP_MORE_DEBUG 427 SCIPdebugMessage(
"Dual linear constraint %d: lhs = %g, rhs = %g, val = %.15g, viol = %.15g\n", i, lplhs[i], lprhs[i], lpconsvals[i], viol);
430 if ( viol > *maxabsviolcons )
431 *maxabsviolcons = viol;
433 if ( lpconsvals[i] < lplhs[ind] - feastol || lpconsvals[i] > lprhs[ind] + feastol)
435 SCIPdebugMessage(
"solution found infeasible (feastol=%g) for dual lp constraint: LP-%d = %g <|= [%g,%g].\n",
436 feastol, i, lpconsvals[i], lplhs[ind], lprhs[ind]);
437 BMSfreeBufferMemoryArray(bufmem, &lpconsvals);
443 BMSfreeBufferMemoryArray(bufmem, &lpconsvals);
447 if ( nsdpblocks > 0 )
449 SCIP_Real* fullsdpmatrix;
450 SCIP_Real eigenvalue;
451 int maxblocksize = 0;
454 if ( nsdpblocks == 1 )
455 maxblocksize = sdpblocksizes[0] - nremovedinds[0];
459 for (b = 0; b < nsdpblocks; b++)
461 if ( (sdpblocksizes[b] - nremovedinds[b]) > maxblocksize )
462 maxblocksize = sdpblocksizes[b] - nremovedinds[b];
466 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &fullsdpmatrix, maxblocksize * maxblocksize) );
468 for (b = 0; b < nsdpblocks; b++)
470 if ( blockindchanges[b] > -1 )
473 for (i = 0; i < sdpblocksizes[b] - nremovedinds[b]; i++)
475 for (j = 0; j <= i; j++)
477 fullsdpmatrix[i * (sdpblocksizes[b] - nremovedinds[b]) + j] = 0.0;
482 for (v = 0; v < sdpnblockvars[b]; v++)
484 if ( lb[sdpvar[b][v]] < ub[sdpvar[b][v]] - epsilon )
486 for (i = 0; i < sdpnblockvarnonz[b][v]; i++)
488 fullsdpmatrix[((sdprow[b][v][i] - indchanges[b][sdprow[b][v][i]]) * (sdpblocksizes[b] - nremovedinds[b])) +
489 sdpcol[b][v][i] - indchanges[b][sdpcol[b][v][i]]] += solvector[sdpvar[b][v]] * sdpval[b][v][i];
495 if ( sdpconstnblocknonz != NULL )
497 for (i = 0; i < sdpconstnblocknonz[b]; i++)
499 fullsdpmatrix[((sdpconstrow[b][i] - indchanges[b][sdpconstrow[b][i]]) * (sdpblocksizes[b] - nremovedinds[b])) +
500 sdpconstcol[b][i] - indchanges[b][sdpconstcol[b][i]]] -= sdpconstval[b][i];
505 for (i = 0; i < sdpblocksizes[b] - nremovedinds[b]; i++)
507 for (j = 0; j < i; j++)
509 fullsdpmatrix[j * (sdpblocksizes[b] - nremovedinds[b]) + i] = fullsdpmatrix[i * (sdpblocksizes[b] - nremovedinds[b]) + j];
516 viol = MAX(-eigenvalue, 0.0);
517 *sumabsviolsdp += viol;
519 #ifdef SCIP_MORE_DEBUG 520 SCIPdebugMessage(
"Dual SDP constraint %d: lambda_min = %.15g, viol = %.15g\n", b, eigenvalue, viol);
523 if ( viol > *maxabsviolsdp )
524 *maxabsviolsdp = viol;
526 if ( eigenvalue < - feastol )
528 SCIPdebugMessage(
"solution found infeasible (feastol=%.10g) for dual SDP constraint %d, smallest eigenvector %.10g\n",
529 feastol, b, eigenvalue);
530 BMSfreeBufferMemoryArray(bufmem, &fullsdpmatrix);
536 BMSfreeBufferMemoryArray(bufmem, &fullsdpmatrix);
556 int* inputtomosekmapper,
563 int* sdpconstnblocknonz,
567 SCIP_Real** sdpconstval,
569 int** sdpnblockvarnonz,
579 int* blockindchanges,
588 SCIP_Real* solvector,
589 SCIP_Real** solmatrices,
592 SCIP_Real* maxabsviolbnds,
593 SCIP_Real* sumabsviolbnds,
594 SCIP_Real* maxabsviolcons,
595 SCIP_Real* sumabsviolcons,
596 SCIP_Real* maxabsviolsdp,
597 SCIP_Real* sumabsviolsdp,
598 SCIP_Bool* infeasible
613 int nprimalmatrixvars;
615 int* mosekblocksizes;
626 assert( bufmem != NULL );
627 assert( lb != NULL );
628 assert( ub != NULL );
629 assert( nsdpblocks >= 0 );
630 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
631 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
632 assert( sdpconstnnonz >= 0 );
633 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
634 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
635 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
636 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
637 assert( sdpnnonz >= 0 );
638 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
639 assert( nsdpblocks == 0 || sdpvar != NULL );
640 assert( nsdpblocks == 0 || sdprow != NULL );
641 assert( nsdpblocks == 0 || sdpcol != NULL );
642 assert( nsdpblocks == 0 || sdpval != NULL );
643 assert( nsdpblocks == 0 || indchanges != NULL );
644 assert( nsdpblocks == 0 || nremovedinds != NULL );
645 assert( nsdpblocks == 0 || blockindchanges != NULL );
646 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
647 assert( nlpcons >= 0 );
648 assert( nlpcons == 0 || lplhs != NULL );
649 assert( nlpcons == 0 || lprhs != NULL );
650 assert( lpnnonz >= 0 );
651 assert( nlpcons == 0 || lprow != NULL );
652 assert( nlpcons == 0 || lpcol != NULL );
653 assert( nlpcons == 0 || lpval != NULL );
654 assert( solvector != NULL );
655 assert( feastol >= 0 );
656 assert( maxabsviolbnds != NULL );
657 assert( sumabsviolbnds != NULL );
658 assert( maxabsviolcons != NULL );
659 assert( sumabsviolcons != NULL );
660 assert( maxabsviolsdp != NULL );
661 assert( sumabsviolsdp != NULL );
662 assert( infeasible != NULL );
665 *maxabsviolbnds = 0.0;
666 *sumabsviolbnds = 0.0;
667 *maxabsviolcons = 0.0;
668 *sumabsviolcons = 0.0;
669 *maxabsviolsdp = 0.0;
670 *sumabsviolsdp = 0.0;
678 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &objcoefs, nvars) );
679 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &varboundpos, 2 * nvars) );
682 for (i = 0; i < nvars; i++)
684 if ( ub[i] - lb[i] <= epsilon )
688 objcoefs[nactivevars] = obj[i];
691 varboundpos[nvarbounds++] = -(nactivevars + 1);
694 varboundpos[nvarbounds++] = +(nactivevars + 1);
699 assert( nactivevars + nfixedvars == nvars );
705 for (i = 0; i < nlpcons; i++)
707 if ( lplhs[i] > -
INF )
710 if ( lprhs[i] <
INF )
713 assert( nlpvars <= 2 * nlpcons );
717 nprimalvars = nlpvars + nvarbounds;
720 for (i = 0; i < nprimalvars; i++)
722 viol = MAX(-solvector[i], 0.0);
723 *sumabsviolbnds += viol;
725 if ( viol > *maxabsviolbnds )
726 *maxabsviolbnds = viol;
728 #ifdef SCIP_MORE_DEBUG 729 SCIPdebugMessage(
"Primal variable %d: val = %g, viol = %g\n", i, solvector[i], viol);
732 if ( solvector[i] < - feastol )
734 SCIPdebugMessage(
"primal solution found infeasible (feastol=%f) for primal variable bounds: x[%d] = %g >= 0\n",
735 feastol, i, solvector[i]);
741 nprimalmatrixvars = nsdpblocks - nremovedblocks;
742 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &mosekblocksizes, nprimalmatrixvars) );
745 for (b = 0; b < nsdpblocks; b++)
747 if ( blockindchanges[b] > -1 )
749 assert( 0 <= blockindchanges[b] && blockindchanges[b] <= b && (b - blockindchanges[b]) <= (nsdpblocks - nremovedblocks) );
750 mosekblocksizes[b - blockindchanges[b]] = sdpblocksizes[b] - nremovedinds[b];
752 if ( sdpblocksizes[b] - nremovedinds[b] > maxblocksize )
753 maxblocksize = sdpblocksizes[b] - nremovedinds[b];
759 nprimallpcons = nactivevars;
762 if ( nprimallpcons > 0 )
764 SCIP_Real* lpconsvals;
766 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &lpconsvals, nprimallpcons) );
769 for (i = 0; i < nprimallpcons; i++)
773 for (b = 0; b < nsdpblocks; b++)
775 if ( blockindchanges[b] > -1 )
777 for (blockvar = 0; blockvar < sdpnblockvars[b]; blockvar++)
779 v = inputtomosekmapper[sdpvar[b][blockvar]];
784 assert( v < nactivevars );
787 if ( nremovedinds[b] > 0 )
789 assert( sdpnblockvarnonz[b][blockvar] <= sdpnnonz );
790 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
793 assert( 0 <= indchanges[b][sdprow[b][blockvar][k]] && indchanges[b][sdprow[b][blockvar][k]] <= sdprow[b][blockvar][k] );
794 assert( 0 <= indchanges[b][sdpcol[b][blockvar][k]] && indchanges[b][sdpcol[b][blockvar][k]] <= sdpcol[b][blockvar][k] );
796 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
797 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
799 mosekrow = sdprow[b][blockvar][k] - indchanges[b][sdprow[b][blockvar][k]];
800 mosekcol = sdpcol[b][blockvar][k] - indchanges[b][sdpcol[b][blockvar][k]];
803 blocksize = mosekblocksizes[b - blockindchanges[b]];
804 mosekind = mosekcol * blocksize + mosekrow - mosekcol * (mosekcol + 1) / 2;
807 if ( mosekrow == mosekcol )
808 lpconsvals[v] += sdpval[b][blockvar][k] * solmatrices[b - blockindchanges[b]][mosekind];
810 lpconsvals[v] += 2 * sdpval[b][blockvar][k] * solmatrices[b - blockindchanges[b]][mosekind];
812 assert( k == sdpnblockvarnonz[b][blockvar] );
816 assert( sdpnblockvarnonz[b][blockvar] <= sdpnnonz );
817 for (k = 0; k < sdpnblockvarnonz[b][blockvar]; k++)
819 assert( 0 <= sdprow[b][blockvar][k] && sdprow[b][blockvar][k] < sdpblocksizes[b] );
820 assert( 0 <= sdpcol[b][blockvar][k] && sdpcol[b][blockvar][k] < sdpblocksizes[b] );
822 mosekrow = sdprow[b][blockvar][k];
823 mosekcol = sdpcol[b][blockvar][k];
826 blocksize = mosekblocksizes[b - blockindchanges[b]];
827 mosekind = mosekcol * blocksize + mosekrow - mosekcol * (mosekcol + 1) / 2;
830 if ( mosekrow == mosekcol )
831 lpconsvals[v] += sdpval[b][blockvar][k] * solmatrices[b - blockindchanges[b]][mosekind];
833 lpconsvals[v] += 2 * sdpval[b][blockvar][k] * solmatrices[b - blockindchanges[b]][mosekind];
835 assert( k == sdpnblockvarnonz[b][blockvar] );
848 currentrow = lprow[0];
849 for (nnonz = 0; nnonz < lpnnonz; ++nnonz)
851 assert( nnonz == 0 || lprow[nnonz-1] <= lprow[nnonz] );
852 assert( lprow[nnonz] == currentrow );
854 v = inputtomosekmapper[lpcol[nnonz]];
857 assert( v < nactivevars );
860 if ( lplhs[lprow[nnonz]] > -
INF )
861 lpconsvals[v] += lpval[nnonz] * solvector[varcnt];
864 if ( lprhs[lprow[nnonz]] <
INF )
865 lpconsvals[v] -= lpval[nnonz] * solvector[varcnt + 1];
869 if ( nnonz == lpnnonz - 1 || lprow[nnonz + 1] > currentrow )
872 if ( lplhs[currentrow] > -
INF )
876 if ( lprhs[currentrow] <
INF )
880 if ( nnonz < lpnnonz )
881 currentrow = lprow[nnonz+1];
884 assert( varcnt == nlpvars );
888 for (i = 0; i < nvarbounds; i++)
890 if ( varboundpos[i] < 0 )
893 mosekrow = - varboundpos[i] - 1;
894 assert( 0 <= mosekrow && mosekrow < nactivevars );
895 lpconsvals[mosekrow] += solvector[nlpvars + i];
900 assert( varboundpos[i] > 0 );
901 mosekrow = varboundpos[i] - 1;
902 assert( 0 <= mosekrow && mosekrow < nactivevars );
903 lpconsvals[mosekrow] -= solvector[nlpvars + i];
909 for (c = 0; c < nprimallpcons; c++)
911 viol = REALABS(lpconsvals[c] - objcoefs[c]);
912 *sumabsviolcons += viol;
914 if ( viol > *maxabsviolcons )
915 *maxabsviolcons = viol;
917 #ifdef SCIP_MORE_DEBUG 918 SCIPdebugMessage(
"Primal linear constraint %d: lhs = %g, rhs = %g, viol = %g\n", c, lpconsvals[c], objcoefs[c], viol);
921 if ( lpconsvals[c] < objcoefs[c] - feastol || lpconsvals[c] > objcoefs[c] + feastol )
923 SCIPdebugMessage(
"primal solution found infeasible (feastol=%g) for primal lp constraint: LP-%d = %g == [%g], viol = %g\n",
924 feastol, c, lpconsvals[c], objcoefs[c], viol);
929 BMSfreeBufferMemoryArray(bufmem, &lpconsvals);
933 if ( nprimalmatrixvars > 0 )
935 SCIP_Real* fullsdpmatrix;
936 SCIP_Real eigenvalue;
938 assert( maxblocksize > 0 );
940 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &fullsdpmatrix, maxblocksize * maxblocksize) );
942 for (b = 0; b < nsdpblocks; b++)
944 if ( blockindchanges[b] > -1 )
946 blocksize = mosekblocksizes[b - blockindchanges[b]];
950 for (i = 0; i < blocksize; i++)
952 for (j = 0; j <= i; j++)
954 mosekind = j * blocksize + i - j * (j + 1) / 2;
955 fullsdpmatrix[i * blocksize + j] = solmatrices[b - blockindchanges[b]][mosekind];
956 fullsdpmatrix[j * blocksize + i] = solmatrices[b - blockindchanges[b]][mosekind];
963 viol = MAX(-eigenvalue, 0.0);
964 *sumabsviolsdp += viol;
966 if ( viol > *maxabsviolsdp )
967 *maxabsviolsdp = viol;
969 #ifdef SCIP_MORE_DEBUG 970 SCIPdebugMessage(
"Primal SDP variable %d: lambda_min = %g, viol = %g\n", b, eigenvalue, viol);
973 if ( eigenvalue < - feastol )
975 SCIPdebugMessage(
"primal solution found infeasible (feastol=%.10g) for primal SDP variable %d, smallest eigenvector %.10g\n",
976 feastol, b - blockindchanges[b], eigenvalue);
982 BMSfreeBufferMemoryArray(bufmem, &fullsdpmatrix);
985 BMSfreeBufferMemoryArray(bufmem, &mosekblocksizes);
986 BMSfreeBufferMemoryArray(bufmem, &varboundpos);
987 BMSfreeBufferMemoryArray(bufmem, &objcoefs);
SCIP_RETCODE SCIPsdpSolcheckerCheckAndGetViolDual(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Real *maxabsviolbnds, SCIP_Real *sumabsviolbnds, SCIP_Real *maxabsviolcons, SCIP_Real *sumabsviolcons, SCIP_Real *maxabsviolsdp, SCIP_Real *sumabsviolsdp, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsdpSolcheckerCheck(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
checks a given SDP solution for feasibility
interface methods for eigenvector computation and matrix multiplication using openblas ...
SCIP_RETCODE SCIPlapackComputeIthEigenvalue(BMS_BUFMEM *bufmem, SCIP_Bool geteigenvectors, int n, SCIP_Real *A, int i, SCIP_Real *eigenvalue, SCIP_Real *eigenvector)
SCIP_RETCODE SCIPsdpSolcheckerCheckAndGetViolPrimal(BMS_BUFMEM *bufmem, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int *inputtomosekmapper, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real **solmatrices, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Real *maxabsviolbnds, SCIP_Real *sumabsviolbnds, SCIP_Real *maxabsviolcons, SCIP_Real *sumabsviolcons, SCIP_Real *maxabsviolsdp, SCIP_Real *sumabsviolsdp, SCIP_Bool *infeasible)