112 #include "blockmemshell/memory.h" 113 #include "scip/def.h" 114 #include "scip/pub_misc.h" 115 #include "scip/pub_message.h" 122 #define BMS_CALL(x) do \ 126 SCIPerrorMessage("No memory in function call\n"); \ 127 return SCIP_NOMEMORY; \ 133 #define CHECK_IF_SOLVED(sdpi) do \ 135 if ( ! (sdpi->solved) ) \ 137 SCIPerrorMessage("Tried to access solution information ahead of solving! \n"); \ 138 return SCIP_LPERROR; \ 144 #define CHECK_IF_SOLVED_BOOL(sdpi) do \ 146 if ( ! (sdpi->solved) ) \ 148 SCIPerrorMessage("Tried to access solution information ahead of solving! \n"); \ 155 #define DUPLICATE_ARRAY_NULL(blkmem, target, source, size) do \ 158 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, target, source, size) ); \ 165 #define SCIP_CALL_PARAM(x) do \ 167 SCIP_RETCODE _restat_; \ 168 if ( (_restat_ = (x)) != SCIP_OKAY ) \ 170 if ( _restat_ != SCIP_PARAMETERUNKNOWN ) \ 172 SCIPerrorMessage("Error <%d> in function call\n", _restat_); \ 181 #define SCIP_CALL_PARAM_IGNORE_UNKNOWN(x) do \ 183 SCIP_RETCODE _restat_; \ 184 if ( (_restat_ = (x)) != SCIP_OKAY ) \ 186 if ( _restat_ != SCIP_PARAMETERUNKNOWN ) \ 188 SCIPerrorMessage("Error <%d> in function call\n", _restat_); \ 196 #define MIN_GAPTOL 1e-10 197 #define DEFAULT_SDPSOLVERGAPTOL 1e-4 198 #define DEFAULT_FEASTOL 1e-6 199 #define DEFAULT_EPSILON 1e-9 200 #define DEFAULT_PENALTYPARAM 1e+5 201 #define DEFAULT_MAXPENALTYPARAM 1e+10 202 #define DEFAULT_NPENALTYINCR 8 205 enum SCIP_Onevar_Status 218 SCIP_MESSAGEHDLR* messagehdlr;
232 int* maxsdpnblockvars;
236 int* sdpconstnblocknonz;
238 int* maxsdpconstnblocknonz;
241 SCIP_Real** sdpconstval;
245 int** sdpnblockvarnonz;
254 SCIP_Real* sdpvalstore;
261 SCIP_Real* sdpilplhs;
262 SCIP_Real* sdpilprhs;
270 SCIP_Real* sdpilpval;
285 SCIP_Bool infeasible;
290 SCIP_Real penaltyparam;
291 SCIP_Real maxpenaltyparam;
293 SCIP_Real peninfeasadjust;
299 SCIP_Real onevarsdpobjval;
300 SCIP_Real onevarsdpoptval;
320 assert( sdpi != NULL );
321 assert( sdpi->sdpilb != NULL );
322 assert( sdpi->sdpiub != NULL );
323 assert( 0 <= v && v < sdpi->nvars );
325 lb = sdpi->sdpilb[v];
326 ub = sdpi->sdpiub[v];
327 assert( lb <= ub + sdpi->epsilon );
329 return ( ub - lb <= sdpi->epsilon );
332 #define isFixed(sdpi, v) (sdpi->sdpiub[v] - sdpi->sdpilb[v] <= sdpi->epsilon) 345 assert( initsize >= 0 );
349 initsize = MAX(initsize, SCIP_DEFAULT_MEM_ARRAYGROWINIT);
354 while ( size < num && size > oldsize )
357 size = (int)(SCIP_DEFAULT_MEM_ARRAYGROWFAC * size + initsize);
361 if ( size <= oldsize )
364 assert( size >= initsize );
365 assert( size >= num );
379 assert( sdpi != NULL );
381 if ( nvars > sdpi->maxnvars )
385 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->obj), sdpi->maxnvars, newsize) );
386 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lb), sdpi->maxnvars, newsize) );
387 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->ub), sdpi->maxnvars, newsize) );
388 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilb), sdpi->maxnvars, newsize) );
389 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpiub), sdpi->maxnvars, newsize) );
390 sdpi->maxnvars = newsize;
406 assert( sdpi != NULL );
408 if ( nlpcons > sdpi->maxnlpcons )
412 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lplhs), sdpi->maxnlpcons, newsize) );
413 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lprhs), sdpi->maxnlpcons, newsize) );
415 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilplhs), sdpi->maxnlpcons, newsize) );
416 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilprhs), sdpi->maxnlpcons, newsize) );
417 sdpi->maxnlpcons = newsize;
420 if ( nlpnonz > sdpi->maxlpnnonz )
424 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lprow), sdpi->maxlpnnonz, newsize) );
425 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lpcol), sdpi->maxlpnnonz, newsize) );
426 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->lpval), sdpi->maxlpnnonz, newsize) );
428 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilprow), sdpi->maxlpnnonz, newsize) );
429 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilpcol), sdpi->maxlpnnonz, newsize) );
430 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpilpval), sdpi->maxlpnnonz, newsize) );
432 sdpi->maxlpnnonz = newsize;
444 int** sdpnblockvarnonz,
445 int* sdpconstnblocknonz,
454 assert( sdpi != NULL );
456 if ( nsdpblocks <= 0 )
459 assert( sdpnblockvars != NULL );
460 assert( sdpnblockvarnonz != NULL );
461 assert( sdpconstnblocknonz != NULL );
463 if ( sdpnnonz > sdpi->maxsdpstore )
465 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdprowstore), sdpi->maxsdpstore, sdpnnonz) );
466 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpcolstore), sdpi->maxsdpstore, sdpnnonz) );
467 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpvalstore), sdpi->maxsdpstore, sdpnnonz) );
468 sdpi->maxsdpstore = sdpnnonz;
470 sdpi->sdpnnonz = sdpnnonz;
473 if ( nsdpblocks > sdpi->maxnsdpblocks )
475 oldnsdpblocks = sdpi->maxnsdpblocks;
478 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpblocksizes), sdpi->maxnsdpblocks, nsdpblocks) );
479 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpnblockvars), sdpi->maxnsdpblocks, nsdpblocks) );
480 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->maxsdpnblockvars), sdpi->maxnsdpblocks, nsdpblocks) );
481 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstnblocknonz), sdpi->maxnsdpblocks, nsdpblocks) );
482 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->maxsdpconstnblocknonz), sdpi->maxnsdpblocks, nsdpblocks) );
483 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpnblockvarnonz), sdpi->maxnsdpblocks, nsdpblocks) );
484 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstcol), sdpi->maxnsdpblocks, nsdpblocks) );
485 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstrow), sdpi->maxnsdpblocks, nsdpblocks) );
486 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstval), sdpi->maxnsdpblocks, nsdpblocks) );
487 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpvar), sdpi->maxnsdpblocks, nsdpblocks) );
488 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpcol), sdpi->maxnsdpblocks, nsdpblocks) );
489 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdprow), sdpi->maxnsdpblocks, nsdpblocks) );
490 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpval), sdpi->maxnsdpblocks, nsdpblocks) );
491 sdpi->maxnsdpblocks = nsdpblocks;
494 oldnsdpblocks = nsdpblocks;
497 for (b = 0; b < oldnsdpblocks; ++b)
500 if ( sdpconstnblocknonz[b] > sdpi->maxsdpconstnblocknonz[b] )
502 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstcol[b]), sdpi->maxsdpconstnblocknonz[b], sdpconstnblocknonz[b]) );
503 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstrow[b]), sdpi->maxsdpconstnblocknonz[b], sdpconstnblocknonz[b]) );
504 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstval[b]), sdpi->maxsdpconstnblocknonz[b], sdpconstnblocknonz[b]) );
505 sdpi->maxsdpconstnblocknonz[b] = sdpconstnblocknonz[b];
508 if ( sdpnblockvars[b] > sdpi->maxsdpnblockvars[b] )
510 assert( sdpi->sdpnblockvarnonz[b] != NULL );
511 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpnblockvarnonz[b]), sdpi->maxsdpnblockvars[b], sdpnblockvars[b]) );
512 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpvar[b]), sdpi->maxsdpnblockvars[b], sdpnblockvars[b]) );
513 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdprow[b]), sdpi->maxsdpnblockvars[b], sdpnblockvars[b]) );
514 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpcol[b]), sdpi->maxsdpnblockvars[b], sdpnblockvars[b]) );
515 BMS_CALL( BMSreallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpval[b]), sdpi->maxsdpnblockvars[b], sdpnblockvars[b]) );
516 sdpi->maxsdpnblockvars[b] = sdpnblockvars[b];
520 for (v = 0; v < sdpnblockvars[b]; ++v)
522 sdpi->sdprow[b][v] = &sdpi->sdprowstore[cnt];
523 sdpi->sdpcol[b][v] = &sdpi->sdpcolstore[cnt];
524 sdpi->sdpval[b][v] = &sdpi->sdpvalstore[cnt];
525 cnt += sdpnblockvarnonz[b][v];
527 assert( cnt <= sdpi->maxsdpstore );
531 for (b = oldnsdpblocks; b < nsdpblocks; ++b)
533 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpnblockvarnonz[b]), sdpnblockvars[b]) );
534 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpvar[b]), sdpnblockvars[b]) );
535 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdprow[b]), sdpnblockvars[b]) );
536 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpcol[b]), sdpnblockvars[b]) );
537 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpval[b]), sdpnblockvars[b]) );
538 sdpi->maxsdpnblockvars[b] = sdpnblockvars[b];
540 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstcol[b]), sdpconstnblocknonz[b]) );
541 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstrow[b]), sdpconstnblocknonz[b]) );
542 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpi->sdpconstval[b]), sdpconstnblocknonz[b]) );
543 sdpi->maxsdpconstnblocknonz[b] = sdpconstnblocknonz[b];
546 for (v = 0; v < sdpnblockvars[b]; ++v)
548 sdpi->sdprow[b][v] = &sdpi->sdprowstore[cnt];
549 sdpi->sdpcol[b][v] = &sdpi->sdpcolstore[cnt];
550 sdpi->sdpval[b][v] = &sdpi->sdpvalstore[cnt];
551 cnt += sdpnblockvarnonz[b][v];
568 const SCIP_Real* sdpilb,
569 const SCIP_Real* sdpiub,
571 int* sdpconstnblocknonz,
574 SCIP_Real** sdpconstval
582 SCIP_Real* fixedvals;
584 assert( sdpi != NULL );
585 assert( sdpilb != NULL );
586 assert( sdpiub != NULL );
587 assert( sdpconstnnonz != NULL );
588 assert( sdpconstnblocknonz != NULL );
589 assert( sdpconstrow != NULL );
590 assert( sdpconstcol != NULL );
591 assert( sdpconstval != NULL );
596 BMS_CALL( BMSallocBufferMemoryArray(sdpi->bufmem, &fixedrows, sdpi->sdpnnonz) );
597 BMS_CALL( BMSallocBufferMemoryArray(sdpi->bufmem, &fixedcols, sdpi->sdpnnonz) );
598 BMS_CALL( BMSallocBufferMemoryArray(sdpi->bufmem, &fixedvals, sdpi->sdpnnonz) );
601 for (b = 0; b < sdpi->nsdpblocks; ++b)
606 for (v = 0; v < sdpi->sdpnblockvars[b]; ++v)
608 varidx = sdpi->sdpvar[b][v];
609 if (
isFixed(sdpi, varidx) && REALABS(sdpilb[varidx]) > sdpi->epsilon )
611 for (i = 0; i < sdpi->sdpnblockvarnonz[b][v]; ++i)
613 fixedrows[nfixednonz] = sdpi->sdprow[b][v][i];
614 fixedcols[nfixednonz] = sdpi->sdpcol[b][v][i];
615 fixedvals[nfixednonz] = - sdpi->sdpval[b][v][i] * sdpilb[varidx];
622 sdpi->sdpconstrow[b], sdpi->sdpconstcol[b], sdpi->sdpconstval[b], sdpi->sdpconstnblocknonz[b],
623 fixedrows, fixedcols, fixedvals, nfixednonz,
624 sdpconstrow[b], sdpconstcol[b], sdpconstval[b], &sdpconstnblocknonz[b]) );
625 *sdpconstnnonz += sdpconstnblocknonz[b];
629 BMSfreeBufferMemoryArray(sdpi->bufmem, &fixedvals);
630 BMSfreeBufferMemoryArray(sdpi->bufmem, &fixedcols);
631 BMSfreeBufferMemoryArray(sdpi->bufmem, &fixedrows);
645 int* sdpconstnblocknonz,
648 SCIP_Real** sdpconstval,
654 int* blockindchanges,
662 assert( sdpi != NULL );
663 assert( sdpconstnblocknonz != NULL );
664 assert( sdpconstrow != NULL );
665 assert( sdpconstcol != NULL );
666 assert( sdpconstval != NULL );
667 assert( indchanges != NULL );
668 assert( nremovedinds != NULL );
669 assert( blockindchanges != NULL );
670 assert( nremovedblocks != NULL );
673 for (b = 0; b < sdpi->nsdpblocks; ++b)
675 for (i = 0; i < sdpi->sdpblocksizes[b]; i++)
676 indchanges[b][i] = -1;
682 for (b = 0; b < sdpi->nsdpblocks; ++b)
686 for (v = 0; v < sdpi->sdpnblockvars[b]; ++v)
688 if ( !
isFixed(sdpi, sdpi->sdpvar[b][v]) )
690 for (i = 0; i < sdpi->sdpnblockvarnonz[b][v]; ++i)
692 assert( REALABS(sdpi->sdpval[b][v][i]) > sdpi->epsilon );
694 if ( indchanges[b][sdpi->sdprow[b][v][i]] == -1 )
696 indchanges[b][sdpi->sdprow[b][v][i]] = 1;
700 if ( indchanges[b][sdpi->sdpcol[b][v][i]] == -1 )
702 indchanges[b][sdpi->sdpcol[b][v][i]] = 1;
705 if ( nfoundinds == sdpi->sdpblocksizes[b] )
710 if ( nfoundinds == sdpi->sdpblocksizes[b] )
714 if ( nfoundinds < sdpi->sdpblocksizes[b] )
717 for (i = 0; i < sdpconstnblocknonz[b]; ++i)
719 assert( REALABS(sdpconstval[b][i]) > sdpi->epsilon );
721 if ( indchanges[b][sdpconstrow[b][i]] == -1 )
723 indchanges[b][sdpconstrow[b][i]] = 1;
727 if ( indchanges[b][sdpconstcol[b][i]] == -1 )
729 indchanges[b][sdpconstcol[b][i]] = 1;
733 if ( nfoundinds == sdpi->sdpblocksizes[b] )
740 for (i = 0; i < sdpi->sdpblocksizes[b]; ++i)
742 if ( indchanges[b][i] == -1 )
744 SCIPdebugMessage(
"empty row and col %d were removed from block %d of SDP %d.\n", i, b, sdpi->sdpid);
751 indchanges[b][i] = nremovedinds[b];
756 if ( nremovedinds[b] == sdpi->sdpblocksizes[b] )
758 SCIPdebugMessage(
"empty block %d detected in SDP %d, this will be removed.\n", b, sdpi->sdpid);
759 blockindchanges[b] = -1;
763 blockindchanges[b] = *nremovedblocks;
783 SCIP_Real* sdpilplhs,
784 SCIP_Real* sdpilprhs,
788 SCIP_Real* sdpilpval,
789 SCIP_Bool* fixingsfound
792 SCIP_Real rowconst = 0.0;
793 int oldsdpilpnnonz = 0;
799 assert( sdpi != NULL );
800 assert( sdpilb != NULL );
801 assert( sdpiub != NULL );
802 assert( nsdpilpcons != NULL );
803 assert( sdpi->nlpcons == 0 || sdpilplhs != NULL );
804 assert( sdpi->nlpcons == 0 || sdpilprhs != NULL );
805 assert( sdpilpnnonz != NULL );
806 assert( sdpi->nlpcons == 0 || sdpilprow != NULL );
807 assert( sdpi->nlpcons == 0 || sdpilpcol != NULL );
808 assert( sdpi->nlpcons == 0 || sdpilpval != NULL );
809 assert( fixingsfound != NULL );
813 *fixingsfound = FALSE;
816 if ( sdpi->nlpcons == 0 || sdpi->lpnnonz == 0 )
819 currentrow = sdpi->lprow[0];
820 for (i = 0; i < sdpi->lpnnonz; ++i)
822 assert( i == 0 || sdpi->lprow[i-1] <= sdpi->lprow[i] );
825 if ( !
isFixed(sdpi, sdpi->lpcol[i]) )
829 sdpilprow[*sdpilpnnonz] = *nsdpilpcons;
830 sdpilpcol[*sdpilpnnonz] = sdpi->lpcol[i];
831 sdpilpval[*sdpilpnnonz] = sdpi->lpval[i];
835 rowconst += sdpi->lpval[i] * sdpilb[sdpi->lpcol[i]];
839 if ( i == sdpi->lpnnonz - 1 || sdpi->lprow[i+1] > currentrow )
845 lhs = sdpi->lplhs[currentrow] - rowconst;
850 rhs = sdpi->lprhs[currentrow] - rowconst;
857 sdpilplhs[*nsdpilpcons] = lhs;
858 sdpilprhs[*nsdpilpcons] = rhs;
860 oldsdpilpnnonz = *sdpilpnnonz;
862 else if ( nrownonz == 1 )
869 assert( 0 <= nonzind && nonzind < sdpi->lpnnonz );
872 lpcol = sdpi->lpcol[nonzind];
873 assert( 0 <= lpcol && lpcol < sdpi->nvars );
875 lpval = sdpi->lpval[nonzind];
876 assert( REALABS(lpval) > sdpi->epsilon );
905 if ( lb > sdpilb[lpcol] + sdpi->epsilon )
908 SCIPdebugMessage(
"LP-row %d with one nonzero has been removed from SDP %d, lower bound of variable %d has been strenghened to %g " 909 "(originally %g)\n", currentrow, sdpi->sdpid, lpcol, lb, sdpilb[lpcol]);
914 if ( ub < sdpiub[lpcol] - sdpi->epsilon )
917 SCIPdebugMessage(
"LP-row %d with one nonzero has been removed from SDP %d, upper bound of variable %d has been strenghened to %g " 918 "(originally %g)\n", currentrow, sdpi->sdpid, lpcol, ub, sdpiub[lpcol]);
923 if ( sdpiub[lpcol] < sdpilb[lpcol] - sdpi->epsilon )
925 SCIPdebugMessage(
"Found upper bound %g < lower bound %g for variable %d -> infeasible!\n", sdpiub[lpcol], sdpilb[lpcol], lpcol);
926 sdpi->infeasible = TRUE;
931 if ( REALABS(sdpilb[lpcol] - sdpiub[lpcol]) < sdpi->epsilon )
933 SCIPdebugMessage(
"Fixed variable %d to value %g in SDP %d.\n", lpcol, sdpilb[lpcol], sdpi->sdpid);
934 *fixingsfound = TRUE;
938 *sdpilpnnonz = oldsdpilpnnonz;
942 assert( nrownonz == 0 );
945 if ( lhs > sdpi->feastol || rhs < -sdpi->feastol )
947 SCIPdebugMessage(
"Found constraint %g <= 0 <= %g after fixings -> infeasible!\n", lhs, rhs );
948 sdpi->infeasible = TRUE;
953 *sdpilpnnonz = oldsdpilpnnonz;
959 if ( i < sdpi->lpnnonz )
960 currentrow = sdpi->lprow[i+1];
977 SCIP_Real* fullmatrix;
983 assert( sdpi->allfixed );
984 assert( ! sdpi->infeasible );
987 for (b = 0; b < sdpi->nsdpblocks; b++)
989 if ( sdpi->sdpblocksizes[b] > maxsize )
990 maxsize = sdpi->sdpblocksizes[b];
996 BMS_CALL( BMSallocBufferMemoryArray(sdpi->bufmem, &fullmatrix, maxsize * maxsize) );
999 for (b = 0; b < sdpi->nsdpblocks; b++)
1001 SCIP_Real eigenvalue;
1007 size = sdpi->sdpblocksizes[b];
1008 assert( size <= maxsize );
1011 for (i = 0; i < size * size; i++)
1012 fullmatrix[i] = 0.0;
1015 for (i = 0; i < sdpi->sdpconstnblocknonz[b]; i++)
1017 r = sdpi->sdpconstrow[b][i];
1018 c = sdpi->sdpconstcol[b][i];
1020 assert( 0 <= r && r < size );
1021 assert( 0 <= c && c < size );
1022 fullmatrix[r * size + c] = - sdpi->sdpconstval[b][i];
1024 fullmatrix[c * size + r] = - sdpi->sdpconstval[b][i];
1028 for (v = 0; v < sdpi->sdpnblockvars[b]; v++)
1030 fixedval = sdpilb[sdpi->sdpvar[b][v]];
1031 assert( REALABS(fixedval - sdpiub[sdpi->sdpvar[b][v]]) <= sdpi->epsilon );
1034 if ( REALABS(fixedval) < sdpi->epsilon )
1038 for (i = 0; i < sdpi->sdpnblockvarnonz[b][v]; i++)
1040 r = sdpi->sdprow[b][v][i];
1041 c = sdpi->sdpcol[b][v][i];
1043 assert( 0 <= r && r < size );
1044 assert( 0 <= c && c < size );
1045 fullmatrix[r * size + c] += fixedval * sdpi->sdpval[b][v][i];
1047 fullmatrix[c * size + r] += fixedval * sdpi->sdpval[b][v][i];
1055 if ( eigenvalue < - sdpi->feastol )
1057 sdpi->infeasible = TRUE;
1058 SCIPdebugMessage(
"Detected infeasibility for SDP %d with all variables fixed (minimal eigenvalue: %g)!\n", sdpi->sdpid, eigenvalue);
1064 BMSfreeBufferMemoryArray(sdpi->bufmem, &fullmatrix);
1075 SCIP_Real timelimit,
1078 int* sdpconstnblocknonz,
1083 SCIP_Real** sdpconstval,
1088 SCIP_Real* sdpilplhs,
1089 SCIP_Real* sdpilprhs,
1093 SCIP_Real* sdpilpval,
1094 int* blockindchanges,
1097 SCIP_Bool rootnodefailed
1102 SCIP_Bool origfeas = FALSE;
1103 SCIP_Bool penaltybound = FALSE;
1106 SCIP_Real* slaterlpval;
1107 SCIP_Real* slaterlplhs;
1108 SCIP_Real* slaterlprhs;
1109 int nremovedslaterlpinds;
1110 int slaternactivelpcons;
1111 SCIP_Real* slaterlb;
1112 SCIP_Real* slaterub;
1113 int slaternremovedvarbounds;
1118 assert( sdpi != NULL );
1119 assert( sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
1120 assert( sdpconstnnonz == 0 || sdpconstrow != NULL );
1121 assert( sdpconstnnonz == 0 || sdpconstcol != NULL );
1122 assert( sdpconstnnonz == 0 || sdpconstval != NULL );
1123 assert( sdpi->nsdpblocks == 0 || indchanges != NULL );
1124 assert( sdpi->nsdpblocks == 0 || nremovedinds != NULL );
1125 assert( nactivelpcons == 0 || sdpilplhs != NULL );
1126 assert( nactivelpcons == 0 || sdpilprhs != NULL );
1127 assert( sdpi->nsdpblocks == 0 || blockindchanges != NULL );
1132 sdpi->nsdpblocks, sdpi->sdpblocksizes, sdpi->sdpnblockvars, sdpconstnnonz,
1133 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval,
1134 sdpi->sdpnnonz, sdpi->sdpnblockvarnonz, sdpi->sdpvar, sdpi->sdprow, sdpi->sdpcol, sdpi->sdpval,
1135 indchanges, nremovedinds, blockindchanges, nremovedblocks,
1136 nactivelpcons, sdpilplhs, sdpilprhs, sdpilpnnonz, sdpilprow, sdpilpcol, sdpilpval,
1137 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1145 if ( objval < - sdpi->feastol )
1147 if ( rootnodefailed )
1149 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Aborting: Failed to solve root node relaxation; Slater condition for dual problem holds (smallest eigenvalue %g).\n", - objval);
1152 SCIPdebugMessage(
"Slater condition for SDP %d is fulfilled for dual problem with smallest eigenvalue %g.\n", sdpi->sdpid, -1.0 * objval);
1155 else if ( objval < sdpi->feastol )
1157 if ( rootnodefailed )
1159 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Aborting: Failed to solve root node relaxation; Slater condition for dual problem does not hold (smallest eigenvalue %g).\n", -objval);
1161 else if ( sdpi->slatercheck == 2 )
1163 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for SDP %d not fulfilled for dual problem (smallest eigenvalue %g) - expecting numerical trouble.\n",
1164 sdpi->sdpid, - objval);
1170 if ( sdpi->slatercheck == 2 )
1172 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for SDP %d not fulfilled for dual problem (smallest eigenvalue %g; problem infeasible).\n", sdpi->sdpid, -objval);
1179 if ( rootnodefailed )
1181 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Aborting: Failed to solve root node relaxation; Slater condition for dual problem holds (problem unbounded).\n");
1185 SCIPdebugMessage(
"Slater condition for dual problem for SDP %d fulfilled.\n", sdpi->sdpid);
1191 if ( rootnodefailed )
1193 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Aborting: Faild to solve root node relaxation; Slater condition for dual problem does not hold (problem infeasible).\n");
1195 else if ( sdpi->slatercheck == 2 )
1196 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for dual problem for SDP %d not fulfilled (problem infeasible).\n", sdpi->sdpid);
1203 if ( rootnodefailed )
1205 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Aborting: Failed to solve root node relaxation; Slater condition for dual problem could not be checked.\n");
1207 else if ( sdpi->slatercheck == 2 )
1208 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Unable to check Slater condition for dual problem.\n");
1231 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &slaterlprow, sdpilpnnonz + sdpi->nvars) );
1232 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &slaterlpcol, sdpilpnnonz + sdpi->nvars) );
1233 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &slaterlpval, sdpilpnnonz + sdpi->nvars) );
1236 for (i = 0; i < sdpilpnnonz; i++)
1238 slaterlprow[i] = sdpilprow[i];
1239 slaterlpcol[i] = sdpilpcol[i];
1240 slaterlpval[i] = sdpilpval[i];
1244 for (v = 0; v < sdpi->nvars; v++)
1247 slaterlprow[sdpilpnnonz + v] = nactivelpcons;
1248 slaterlpcol[sdpilpnnonz + v] = v;
1249 slaterlpval[sdpilpnnonz + v] = 0.0;
1252 for (b = 0; b < sdpi->nsdpblocks; b++)
1254 for (v = 0; v < sdpi->sdpnblockvars[b]; v++)
1258 for (i = 0; i < sdpi->sdpnblockvarnonz[b][v]; i++)
1260 if ( sdpi->sdprow[b][v][i] == sdpi->sdpcol[b][v][i] )
1261 slaterlpval[sdpilpnnonz + sdpi->sdpvar[b][v]] += sdpi->sdpval[b][v][i];
1268 nremovedslaterlpinds = 0;
1269 for (v = 0; v < sdpi->nvars; v++)
1271 if (
isFixed(sdpi, v) || REALABS(slaterlpval[sdpilpnnonz + v]) <= sdpi->epsilon )
1272 ++nremovedslaterlpinds;
1276 slaterlprow[sdpilpnnonz + v - nremovedslaterlpinds] = slaterlprow[sdpilpnnonz + v];
1277 slaterlpcol[sdpilpnnonz + v - nremovedslaterlpinds] = slaterlpcol[sdpilpnnonz + v];
1278 slaterlpval[sdpilpnnonz + v - nremovedslaterlpinds] = slaterlpval[sdpilpnnonz + v];
1283 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &slaterlplhs, nactivelpcons + 1) );
1284 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &slaterlprhs, nactivelpcons + 1) );
1287 for (i = 0; i < nactivelpcons; i++)
1290 slaterlplhs[i] = sdpilplhs[i];
1292 slaterlplhs[i] = 0.0;
1295 slaterlprhs[i] = sdpilprhs[i];
1297 slaterlprhs[i] = 0.0;
1301 slaterlplhs[nactivelpcons] = 1.0;
1305 if ( nremovedslaterlpinds < sdpi->nvars )
1306 slaternactivelpcons = nactivelpcons + 1;
1308 slaternactivelpcons = nactivelpcons;
1315 slaternremovedvarbounds = 0;
1316 for (v = 0; v < sdpi->nvars; v++)
1321 slaternremovedvarbounds++;
1326 slaternremovedvarbounds++;
1333 if ( slaternremovedvarbounds == 2 * sdpi->nvars )
1335 if ( rootnodefailed )
1337 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problem holds since all variables have finite upper and lower bounds.\n");
1340 SCIPdebugMessage(
"Slater condition for primal problem for SDP %d fulfilled since all variables have finite upper and lower bounds.\n", sdpi->sdpid);
1347 sdpi->nsdpblocks, sdpi->sdpblocksizes, sdpi->sdpnblockvars, 0, NULL, NULL, NULL, NULL,
1348 sdpi->sdpnnonz, sdpi->sdpnblockvarnonz, sdpi->sdpvar, sdpi->sdprow, sdpi->sdpcol,
1349 sdpi->sdpval, indchanges, nremovedinds, blockindchanges, nremovedblocks, slaternactivelpcons, slaterlplhs, slaterlprhs,
1350 sdpilpnnonz + sdpi->nvars - nremovedslaterlpinds, slaterlprow, slaterlpcol, slaterlpval, NULL, NULL, NULL, NULL,
1358 if ( objval > - sdpi->feastol)
1360 if ( rootnodefailed )
1362 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problem not fulfilled (smallest eigenvalue %g).\n", - objval);
1364 else if ( sdpi->slatercheck == 2 )
1366 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problem for SDP %d not fulfilled " 1367 "(smallest eigenvalue %g) - expect numerical trouble or infeasible problem.\n",sdpi->sdpid, - objval);
1373 if ( rootnodefailed )
1375 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problem fulfilled (smallest eigenvalue %g).\n", - objval);
1378 SCIPdebugMessage(
"Slater condition for primal problem of SDP %d is fulfilled (smallest eigenvalue %g).\n", sdpi->sdpid, - objval);
1384 if ( rootnodefailed )
1386 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Primal Slater condition shows infeasibility.\\n");
1388 else if ( sdpi->slatercheck == 2 )
1390 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problem for SDP %d not fulfilled " 1391 "(smallest eigenvalue has to be negative, so primal problem is infeasible; if the dual slater condition holds," 1392 "this means, that the original (dual) problem is unbounded).\n", sdpi->sdpid);
1398 if ( rootnodefailed )
1400 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Slater condition for primal problems holds sunce smallest eigenvalue maximization problem is unbounded.\n");
1403 SCIPdebugMessage(
"Slater condition for primal problem for SDP %d fulfilled, smallest eigenvalue maximization problem unbounded.\n", sdpi->sdpid);
1410 if ( rootnodefailed )
1412 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Unable to check Slater condition for primal problem.\n");
1414 else if ( sdpi->slatercheck == 2 )
1415 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Unable to check Slater condition for primal problem, could not solve auxilliary problem.\n");
1421 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterub, sdpi->nvars);
1422 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlb, sdpi->nvars);
1423 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlprhs, nactivelpcons + 1);
1424 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlplhs, nactivelpcons + 1);
1425 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlpval, sdpilpnnonz + sdpi->nvars);
1426 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlpcol, sdpilpnnonz + sdpi->nvars);
1427 BMSfreeBlockMemoryArray(sdpi->blkmem, &slaterlprow, sdpilpnnonz + sdpi->nvars);
1498 SCIP_MESSAGEHDLR* messagehdlr,
1503 assert( sdpi != NULL );
1504 assert( blkmem != NULL );
1506 SCIPdebugMessage(
"Calling SCIPsdpiCreate\n");
1508 BMS_CALL( BMSallocBlockMemory(blkmem, sdpi) );
1512 (*sdpi)->messagehdlr = messagehdlr;
1513 (*sdpi)->blkmem = blkmem;
1514 (*sdpi)->bufmem = bufmem;
1516 (*sdpi)->niterations = 0;
1517 (*sdpi)->opttime = 0.0;
1518 (*sdpi)->nsdpcalls = 0;
1520 (*sdpi)->maxnvars = 0;
1521 (*sdpi)->nsdpblocks = 0;
1522 (*sdpi)->maxnsdpblocks = 0;
1523 (*sdpi)->sdpconstnnonz = 0;
1524 (*sdpi)->sdpnnonz = 0;
1525 (*sdpi)->nlpcons = 0;
1526 (*sdpi)->maxnlpcons = 0;
1527 (*sdpi)->lpnnonz = 0;
1528 (*sdpi)->maxlpnnonz = 0;
1529 (*sdpi)->slatercheck = 0;
1530 (*sdpi)->solved = FALSE;
1531 (*sdpi)->penalty = FALSE;
1532 (*sdpi)->infeasible = FALSE;
1533 (*sdpi)->allfixed = FALSE;
1535 (*sdpi)->obj = NULL;
1538 (*sdpi)->sdpilb = NULL;
1539 (*sdpi)->sdpiub = NULL;
1540 (*sdpi)->sdpblocksizes = NULL;
1541 (*sdpi)->sdpnblockvars = NULL;
1542 (*sdpi)->maxsdpnblockvars = NULL;
1543 (*sdpi)->sdpconstnblocknonz = NULL;
1544 (*sdpi)->maxsdpconstnblocknonz = NULL;
1545 (*sdpi)->sdpconstrow = NULL;
1546 (*sdpi)->sdpconstcol = NULL;
1547 (*sdpi)->sdpconstval = NULL;
1548 (*sdpi)->sdpnblockvarnonz = NULL;
1549 (*sdpi)->sdpvar = NULL;
1550 (*sdpi)->sdprow = NULL;
1551 (*sdpi)->sdpcol = NULL;
1552 (*sdpi)->sdpval = NULL;
1553 (*sdpi)->maxsdpstore = 0;
1554 (*sdpi)->sdprowstore = NULL;
1555 (*sdpi)->sdpcolstore = NULL;
1556 (*sdpi)->sdpvalstore = NULL;
1558 (*sdpi)->lplhs = NULL;
1559 (*sdpi)->lprhs = NULL;
1560 (*sdpi)->lprow = NULL;
1561 (*sdpi)->lpcol = NULL;
1562 (*sdpi)->lpval = NULL;
1564 (*sdpi)->sdpilplhs = NULL;
1565 (*sdpi)->sdpilprhs = NULL;
1566 (*sdpi)->sdpilprow = NULL;
1567 (*sdpi)->sdpilpcol = NULL;
1568 (*sdpi)->sdpilpval = NULL;
1580 (*sdpi)->onevarsdpobjval = SCIP_INVALID;
1581 (*sdpi)->onevarsdpoptval = SCIP_INVALID;
1582 (*sdpi)->onevarsdpidx = -1;
1584 (*sdpi)->nallfixed = 0;
1585 (*sdpi)->ninfeasible = 0;
1586 (*sdpi)->nonevarsdp = 0;
1600 SCIPdebugMessage(
"Calling SCIPsdpiFree ...\n");
1602 assert( sdpi != NULL );
1603 assert( *sdpi != NULL );
1609 assert( 0 <= (*sdpi)->lpnnonz && (*sdpi)->lpnnonz <= (*sdpi)->maxlpnnonz );
1610 assert( 0 <= (*sdpi)->nlpcons && (*sdpi)->nlpcons <= (*sdpi)->maxnlpcons );
1612 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilprow), (*sdpi)->maxlpnnonz);
1613 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilpcol), (*sdpi)->maxlpnnonz);
1614 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilpval), (*sdpi)->maxlpnnonz);
1615 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilprhs), (*sdpi)->maxnlpcons);
1616 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilplhs), (*sdpi)->maxnlpcons);
1618 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lpval), (*sdpi)->maxlpnnonz);
1619 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lpcol), (*sdpi)->maxlpnnonz);
1620 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lprow), (*sdpi)->maxlpnnonz);
1621 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lprhs), (*sdpi)->maxnlpcons);
1622 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lplhs), (*sdpi)->maxnlpcons);
1625 assert( 0 <= (*sdpi)->nsdpblocks && (*sdpi)->nsdpblocks <= (*sdpi)->maxnsdpblocks );
1626 for (i = 0; i < (*sdpi)->maxnsdpblocks; i++)
1628 assert( 0 <= (*sdpi)->sdpnblockvars[i] && (*sdpi)->sdpnblockvars[i] <= (*sdpi)->maxsdpnblockvars[i] );
1629 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpval[i]), (*sdpi)->maxsdpnblockvars[i]);
1630 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdprow[i]), (*sdpi)->maxsdpnblockvars[i]);
1631 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpcol[i]), (*sdpi)->maxsdpnblockvars[i]);
1632 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpvar[i]), (*sdpi)->maxsdpnblockvars[i]);
1633 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpnblockvarnonz[i]), (*sdpi)->maxsdpnblockvars[i]);
1634 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstval[i]), (*sdpi)->maxsdpconstnblocknonz[i]);
1635 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstrow[i]), (*sdpi)->maxsdpconstnblocknonz[i]);
1636 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstcol[i]), (*sdpi)->maxsdpconstnblocknonz[i]);
1640 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpnblockvarnonz), (*sdpi)->maxnsdpblocks);
1641 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstnblocknonz), (*sdpi)->maxnsdpblocks);
1642 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->maxsdpconstnblocknonz), (*sdpi)->maxnsdpblocks);
1643 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpval), (*sdpi)->maxnsdpblocks);
1644 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpcol), (*sdpi)->maxnsdpblocks);
1645 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdprow), (*sdpi)->maxnsdpblocks);
1646 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpvar), (*sdpi)->maxnsdpblocks);
1647 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstval), (*sdpi)->maxnsdpblocks);
1648 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstcol), (*sdpi)->maxnsdpblocks);
1649 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpconstrow), (*sdpi)->maxnsdpblocks);
1650 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpnblockvars), (*sdpi)->maxnsdpblocks);
1651 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->maxsdpnblockvars), (*sdpi)->maxnsdpblocks);
1652 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpblocksizes), (*sdpi)->maxnsdpblocks);
1654 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &(*sdpi)->sdpvalstore, (*sdpi)->maxsdpstore);
1655 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &(*sdpi)->sdpcolstore, (*sdpi)->maxsdpstore);
1656 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &(*sdpi)->sdprowstore, (*sdpi)->maxsdpstore);
1658 assert( 0 <= (*sdpi)->nvars && (*sdpi)->nvars <= (*sdpi)->maxnvars );
1659 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpiub), (*sdpi)->maxnvars);
1660 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->sdpilb), (*sdpi)->maxnvars);
1661 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->ub), (*sdpi)->maxnvars);
1662 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->lb), (*sdpi)->maxnvars);
1663 BMSfreeBlockMemoryArrayNull((*sdpi)->blkmem, &((*sdpi)->obj), (*sdpi)->maxnvars);
1668 BMSfreeBlockMemory((*sdpi)->blkmem, sdpi);
1690 assert( oldsdpi != NULL );
1692 SCIPdebugMessage(
"Cloning SDPI %d\n", oldsdpi->sdpid);
1695 blkmem = oldsdpi->blkmem;
1696 nvars = oldsdpi->nvars;
1697 nsdpblocks = oldsdpi->nsdpblocks;
1698 lpnnonz = oldsdpi->lpnnonz;
1700 BMS_CALL( BMSallocBlockMemory(blkmem, &newsdpi) );
1702 SCIP_CALL(
SCIPsdpiSolverCreate(&(newsdpi->sdpisolver), oldsdpi->messagehdlr, oldsdpi->blkmem, oldsdpi->bufmem) );
1704 newsdpi->messagehdlr = oldsdpi->messagehdlr;
1705 newsdpi->blkmem = blkmem;
1706 newsdpi->nvars = nvars;
1707 newsdpi->maxnvars = nvars;
1709 assert( 0 <= oldsdpi->nvars && oldsdpi->nvars <= oldsdpi->maxnvars );
1710 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->obj), oldsdpi->obj, nvars) );
1711 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lb), oldsdpi->lb, nvars) );
1712 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->ub), oldsdpi->ub, nvars) );
1713 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilb), nvars) );
1714 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpiub), nvars) );
1716 newsdpi->nsdpblocks = nsdpblocks;
1717 newsdpi->maxnsdpblocks = nsdpblocks;
1719 assert( 0 <= oldsdpi->nsdpblocks && oldsdpi->nsdpblocks <= oldsdpi->maxnsdpblocks );
1720 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpblocksizes), oldsdpi->sdpblocksizes, nsdpblocks) );
1721 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpnblockvars), oldsdpi->sdpnblockvars, nsdpblocks) );
1722 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->maxsdpnblockvars), oldsdpi->sdpnblockvars, nsdpblocks) );
1725 newsdpi->sdpconstnnonz = oldsdpi->sdpconstnnonz;
1727 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpconstnblocknonz), oldsdpi->sdpconstnblocknonz, nsdpblocks) );
1728 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->maxsdpconstnblocknonz), oldsdpi->sdpconstnblocknonz, nsdpblocks) );
1729 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpconstrow), nsdpblocks) );
1730 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpconstcol), nsdpblocks) );
1731 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpconstval), nsdpblocks) );
1733 for (b = 0; b < nsdpblocks; b++)
1735 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpconstrow[b]), oldsdpi->sdpconstrow[b], oldsdpi->sdpconstnblocknonz[b]) );
1736 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpconstcol[b]), oldsdpi->sdpconstcol[b], oldsdpi->sdpconstnblocknonz[b]) );
1737 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpconstval[b]), oldsdpi->sdpconstval[b], oldsdpi->sdpconstnblocknonz[b]) );
1741 newsdpi->sdpnnonz = oldsdpi->sdpnnonz;
1742 newsdpi->maxsdpstore = oldsdpi->sdpnnonz;
1744 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpnblockvarnonz), nsdpblocks) );
1745 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpvar), nsdpblocks) );
1746 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdprow), nsdpblocks) );
1747 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpcol), nsdpblocks) );
1748 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpval), nsdpblocks) );
1750 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdprowstore), newsdpi->maxsdpstore) );
1751 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpcolstore), newsdpi->maxsdpstore) );
1752 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpvalstore), newsdpi->maxsdpstore) );
1754 for (b = 0; b < nsdpblocks; b++)
1756 assert( 0 <= oldsdpi->sdpnblockvars[b] && oldsdpi->sdpnblockvars[b] <= oldsdpi->maxsdpnblockvars[b] );
1757 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpnblockvarnonz[b]), oldsdpi->sdpnblockvarnonz[b], oldsdpi->sdpnblockvars[b]) );
1758 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->sdpvar[b]), oldsdpi->sdpvar[b], oldsdpi->sdpnblockvars[b]) );
1760 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdprow[b]), oldsdpi->sdpnblockvars[b]) );
1761 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpcol[b]), oldsdpi->sdpnblockvars[b]) );
1762 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpval[b]), oldsdpi->sdpnblockvars[b]) );
1765 for (v = 0; v < newsdpi->sdpnblockvars[b]; ++v)
1767 newsdpi->sdprow[b][v] = &newsdpi->sdprowstore[cnt];
1768 newsdpi->sdpcol[b][v] = &newsdpi->sdpcolstore[cnt];
1769 newsdpi->sdpval[b][v] = &newsdpi->sdpvalstore[cnt];
1770 cnt += newsdpi->sdpnblockvarnonz[b][v];
1772 assert( cnt <= newsdpi->maxsdpstore );
1776 newsdpi->nlpcons = oldsdpi->nlpcons;
1777 newsdpi->maxnlpcons = oldsdpi->nlpcons;
1779 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lplhs), oldsdpi->lplhs, oldsdpi->nlpcons) );
1780 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lprhs), oldsdpi->lprhs, oldsdpi->nlpcons) );
1782 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilplhs), oldsdpi->nlpcons) );
1783 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilprhs), oldsdpi->nlpcons) );
1785 newsdpi->lpnnonz = lpnnonz;
1786 newsdpi->maxlpnnonz = lpnnonz;
1788 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lprow), oldsdpi->lprow, lpnnonz) );
1789 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lpcol), oldsdpi->lpcol, lpnnonz) );
1790 BMS_CALL( BMSduplicateBlockMemoryArray(blkmem, &(newsdpi->lpval), oldsdpi->lpval, lpnnonz) );
1792 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilprow), lpnnonz) );
1793 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilpcol), lpnnonz) );
1794 BMS_CALL( BMSallocBlockMemoryArray(blkmem, &(newsdpi->sdpilpval), lpnnonz) );
1797 newsdpi->solved = FALSE;
1798 newsdpi->penalty = FALSE;
1799 newsdpi->infeasible = FALSE;
1800 newsdpi->allfixed = FALSE;
1801 newsdpi->sdpid = 1000000 + oldsdpi->sdpid;
1802 newsdpi->epsilon = oldsdpi->epsilon;
1803 newsdpi->gaptol = oldsdpi->gaptol;
1804 newsdpi->feastol = oldsdpi->feastol;
1807 newsdpi->onevarsdpobjval = SCIP_INVALID;
1808 newsdpi->onevarsdpoptval = SCIP_INVALID;
1809 newsdpi->onevarsdpidx = -1;
1811 newsdpi->nallfixed = 0;
1812 newsdpi->ninfeasible = 0;
1813 newsdpi->nonevarsdp = 0;
1846 int* sdpconstnblocknonz,
1850 SCIP_Real** sdpconstval,
1852 int** sdpnblockvarnonz,
1860 SCIP_Real*** sdpval,
1878 SCIPdebugMessage(
"Calling SCIPsdpiLoadSDP (%d) ...\n", sdpi->sdpid);
1880 assert( sdpi != NULL );
1881 assert( nvars >= 0 );
1882 assert( obj != NULL );
1883 assert( lb != NULL );
1884 assert( ub != NULL );
1887 if ( sdpconstnnonz > 0 || sdpnnonz > 0 || nsdpblocks > 0 )
1889 assert( sdpblocksizes != NULL );
1890 assert( sdpnblockvars != NULL );
1891 assert( nsdpblocks > 0 );
1892 assert( sdpconstnblocknonz != NULL );
1893 assert( sdpnblockvarnonz != NULL );
1895 if ( sdpconstnnonz > 0 )
1897 assert( sdpconstrow != NULL );
1898 assert( sdpconstcol != NULL );
1899 assert( sdpconstval != NULL );
1901 for (i = 0; i < nsdpblocks; i++)
1903 if ( sdpconstnblocknonz[i] > 0 )
1905 assert( sdpconstrow[i] != NULL );
1906 assert( sdpconstcol[i] != NULL );
1907 assert( sdpconstval[i] != NULL );
1914 assert( sdprow != NULL );
1915 assert( sdpcol != NULL );
1916 assert( sdpval != NULL );
1918 for (i = 0; i < nsdpblocks; i++)
1920 assert( sdpcol[i] != NULL );
1921 assert( sdprow[i] != NULL );
1922 assert( sdpval[i] != NULL );
1924 for (v = 0; v < sdpnblockvars[i]; v++)
1926 if ( sdpnblockvarnonz[i][v] > 0 )
1928 assert( sdpcol[i][v] != NULL );
1929 assert( sdprow[i][v] != NULL );
1930 assert( sdpval[i][v] != NULL );
1936 for (i = 0; i < nvars; ++i)
1943 assert( nlpcons == 0 || lplhs != NULL );
1944 assert( nlpcons == 0 || lprhs != NULL );
1945 assert( lpnnonz == 0 || lprow != NULL );
1946 assert( lpnnonz == 0 || lpcol != NULL );
1947 assert( lpnnonz == 0 || lpval != NULL );
1952 SCIP_CALL(
ensureSDPDataMemory(sdpi, nsdpblocks, sdpnblockvars, sdpnblockvarnonz, sdpconstnblocknonz, sdpnnonz) );
1955 BMScopyMemoryArray(sdpi->obj, obj, nvars);
1956 BMScopyMemoryArray(sdpi->lb, lb, nvars);
1957 BMScopyMemoryArray(sdpi->ub, ub, nvars);
1958 BMScopyMemoryArray(sdpi->sdpblocksizes, sdpblocksizes, nsdpblocks);
1959 BMScopyMemoryArray(sdpi->sdpnblockvars, sdpnblockvars, nsdpblocks);
1960 BMScopyMemoryArray(sdpi->sdpconstnblocknonz, sdpconstnblocknonz, nsdpblocks);
1962 for (b = 0; b < nsdpblocks; ++b)
1966 for (v = 0; v < sdpi->sdpconstnblocknonz[b]; ++v)
1967 assert( sdpconstrow[b][v] >= sdpconstcol[b][v] );
1970 BMScopyMemoryArray(sdpi->sdpnblockvarnonz[b], sdpnblockvarnonz[b], sdpnblockvars[b]);
1971 BMScopyMemoryArray(sdpi->sdpvar[b], sdpvar[b], sdpnblockvars[b]);
1973 if ( sdpconstnblocknonz[b] > 0 )
1975 BMScopyMemoryArray(sdpi->sdpconstval[b], sdpconstval[b], sdpconstnblocknonz[b]);
1976 BMScopyMemoryArray(sdpi->sdpconstcol[b], sdpconstcol[b], sdpconstnblocknonz[b]);
1977 BMScopyMemoryArray(sdpi->sdpconstrow[b], sdpconstrow[b], sdpconstnblocknonz[b]);
1980 assert( 0 <= sdpnblockvars[b] && sdpnblockvars[b] <= nvars );
1981 for (v = 0; v < sdpi->sdpnblockvars[b]; v++)
1987 for (j = 0; j < sdpi->sdpnblockvarnonz[b][v]; ++j)
1988 assert( sdprow[b][v][j] >= sdpcol[b][v][j] );
1990 assert( 0 <= sdpvar[b][v] && sdpvar[b][v] < nvars );
1992 assert( sdpi->sdpvalstore != NULL );
1993 assert( sdpi->sdpcolstore != NULL );
1994 assert( sdpi->sdprowstore != NULL );
1996 BMScopyMemoryArray(&sdpi->sdpvalstore[cnt], sdpval[b][v], sdpnblockvarnonz[b][v]);
1997 BMScopyMemoryArray(&sdpi->sdpcolstore[cnt], sdpcol[b][v], sdpnblockvarnonz[b][v]);
1998 BMScopyMemoryArray(&sdpi->sdprowstore[cnt], sdprow[b][v], sdpnblockvarnonz[b][v]);
1999 cnt += sdpnblockvarnonz[b][v];
2000 assert( cnt <= sdpnnonz );
2006 BMScopyMemoryArray(sdpi->lplhs, lplhs, nlpcons);
2007 BMScopyMemoryArray(sdpi->lprhs, lprhs, nlpcons);
2008 BMScopyMemoryArray(sdpi->lprow, lprow, lpnnonz);
2009 BMScopyMemoryArray(sdpi->lpcol, lpcol, lpnnonz);
2010 BMScopyMemoryArray(sdpi->lpval, lpval, lpnnonz);
2014 sdpi->nvars = nvars;
2015 sdpi->nsdpblocks = nsdpblocks;
2017 sdpi->sdpconstnnonz = sdpconstnnonz;
2018 sdpi->sdpnnonz = sdpnnonz;
2021 sdpi->lpnnonz = lpnnonz;
2022 sdpi->nlpcons = nlpcons;
2024 sdpi->solved = FALSE;
2025 sdpi->infeasible = FALSE;
2026 sdpi->allfixed = FALSE;
2027 sdpi->nsdpcalls = 0;
2028 sdpi->niterations = 0;
2029 sdpi->opttime = 0.0;
2041 const SCIP_Real* lhs,
2042 const SCIP_Real* rhs,
2047 const SCIP_Real* val
2052 SCIPdebugMessage(
"Adding %d LP-Constraints to SDP %d.\n", nrows, sdpi->sdpid);
2054 assert( sdpi != NULL );
2059 assert( lhs != NULL );
2060 assert( rhs != NULL );
2061 assert( nnonz >= 0 );
2062 assert( row != NULL );
2063 assert( col != NULL );
2064 assert( val != NULL );
2067 if ( sdpi->nlpcons == 0 )
2069 assert( sdpi->lpnnonz == 0 );
2072 BMScopyMemoryArray(sdpi->lplhs, lhs, nrows);
2073 BMScopyMemoryArray(sdpi->lprhs, rhs, nrows);
2074 BMScopyMemoryArray(sdpi->lprow, row, nnonz);
2075 BMScopyMemoryArray(sdpi->lpcol, col, nnonz);
2076 BMScopyMemoryArray(sdpi->lpval, val, nnonz);
2077 sdpi->nlpcons = nrows;
2078 sdpi->lpnnonz = nnonz;
2081 for (i = 0; i < nnonz; i++)
2083 assert( 0 <= row[i] && row[i] < nrows );
2084 assert( 0 <= col[i] && col[i] < sdpi->nvars );
2091 BMScopyMemoryArray(&(sdpi->lplhs[sdpi->nlpcons]), lhs, nrows);
2092 BMScopyMemoryArray(&(sdpi->lprhs[sdpi->nlpcons]), rhs, nrows);
2094 for (i = 0; i < nnonz; i++)
2096 assert( 0 <= row[i] && row[i] < nrows );
2099 sdpi->lprow[sdpi->lpnnonz + i] = row[i] + sdpi->nlpcons;
2101 assert( 0 <= col[i] && col[i] < sdpi->nvars );
2102 sdpi->lpcol[sdpi->lpnnonz + i] = col[i];
2103 sdpi->lpval[sdpi->lpnnonz + i] = val[i];
2106 sdpi->nlpcons = sdpi->nlpcons + nrows;
2107 sdpi->lpnnonz = sdpi->lpnnonz + nnonz;
2110 sdpi->solved = FALSE;
2111 sdpi->infeasible = FALSE;
2112 sdpi->nsdpcalls = 0;
2113 sdpi->niterations = 0;
2114 sdpi->opttime = 0.0;
2132 SCIPdebugMessage(
"Deleting rows %d to %d from SDP %d.\n", firstrow, lastrow, sdpi->sdpid);
2134 assert( sdpi != NULL );
2135 assert( firstrow >= 0 );
2136 assert( firstrow <= lastrow );
2137 assert( lastrow < sdpi->nlpcons );
2140 if (firstrow == 0 && lastrow == sdpi->nlpcons - 1)
2145 sdpi->solved = FALSE;
2146 sdpi->infeasible = FALSE;
2147 sdpi->allfixed = FALSE;
2148 sdpi->nsdpcalls = 0;
2149 sdpi->niterations = 0;
2150 sdpi->opttime = 0.0;
2155 deletedrows = lastrow - firstrow + 1;
2159 for (i = lastrow + 1; i < sdpi->nlpcons; i++)
2161 sdpi->lplhs[i - deletedrows] = sdpi->lplhs[i];
2162 sdpi->lprhs[i - deletedrows] = sdpi->lprhs[i];
2166 SCIPsortIntIntReal(sdpi->lprow, sdpi->lpcol, sdpi->lpval, sdpi->lpnnonz);
2170 for (i = 0; i < sdpi->lpnnonz; i++)
2172 if (sdpi->lprow[i] >= firstrow && sdpi->lprow[i] <= lastrow)
2181 if ( firstrowind > -1 )
2184 while (i < sdpi->lpnnonz && sdpi->lprow[i] <= lastrow)
2189 deletednonz = lastrowind - firstrowind + 1;
2192 for (i = lastrowind + 1; i < sdpi->lpnnonz; i++)
2194 sdpi->lpcol[i - deletednonz] = sdpi->lpcol[i];
2196 sdpi->lprow[i - deletednonz] = sdpi->lprow[i] - deletedrows;
2197 sdpi->lpval[i - deletednonz] = sdpi->lpval[i];
2201 sdpi->nlpcons = sdpi->nlpcons - deletedrows;
2202 sdpi->lpnnonz = sdpi->lpnnonz - deletednonz;
2204 sdpi->solved = FALSE;
2205 sdpi->infeasible = FALSE;
2206 sdpi->allfixed = FALSE;
2207 sdpi->nsdpcalls = 0;
2208 sdpi->niterations = 0;
2209 sdpi->opttime = 0.0;
2226 SCIPdebugMessage(
"Calling SCIPsdpiDelLPRowset for SDP %d.\n", sdpi->sdpid);
2228 assert( sdpi != NULL );
2229 assert( dstat != NULL );
2231 oldnlpcons = sdpi->nlpcons;
2234 for (i = 0; i < oldnlpcons; i++)
2236 if ( dstat[i] == 1 )
2244 dstat[i] = i - deletedrows;
2247 sdpi->solved = FALSE;
2248 sdpi->infeasible = FALSE;
2249 sdpi->allfixed = FALSE;
2250 sdpi->nsdpcalls = 0;
2251 sdpi->niterations = 0;
2252 sdpi->opttime = 0.0;
2265 assert( sdpi != NULL );
2267 SCIPdebugMessage(
"SCIPsdpiClear in SDP %d.\n", sdpi->sdpid);
2273 for (b = 0; b < sdpi->nsdpblocks; ++b)
2275 for (v = 0; v < sdpi->sdpnblockvars[b]; ++v)
2276 sdpi->sdpnblockvarnonz[b][v] = 0;
2277 sdpi->sdpnblockvars[b] = 0;
2278 sdpi->sdpconstnblocknonz[b] = 0;
2279 sdpi->sdpblocksizes[b] = 0;
2281 sdpi->sdpconstnnonz = 0;
2284 sdpi->nsdpblocks = 0;
2297 const SCIP_Real* obj
2302 SCIPdebugMessage(
"Changing %d objective coefficients in SDP %d\n", nvars, sdpi->sdpid);
2304 assert( sdpi != NULL );
2305 assert( ind != NULL );
2306 assert( obj != NULL );
2308 for (i = 0; i < nvars; i++)
2310 assert( 0 <= ind[i] && ind[i] < sdpi->nvars );
2311 sdpi->obj[ind[i]] = obj[i];
2314 sdpi->solved = FALSE;
2315 sdpi->nsdpcalls = 0;
2316 sdpi->niterations = 0;
2317 sdpi->opttime = 0.0;
2327 const SCIP_Real* lb,
2333 SCIPdebugMessage(
"Changing %d variable bounds in SDP %d\n", nvars, sdpi->sdpid);
2335 assert( sdpi != NULL );
2336 assert( ind != NULL );
2337 assert( lb != NULL );
2338 assert( ub != NULL );
2340 for (i = 0; i < nvars; i++)
2342 assert( 0 <= ind[i] && ind[i] < sdpi->nvars );
2343 sdpi->lb[ind[i]] = lb[i];
2344 sdpi->ub[ind[i]] = ub[i];
2347 sdpi->solved = FALSE;
2348 sdpi->infeasible = FALSE;
2349 sdpi->allfixed = FALSE;
2350 sdpi->nsdpcalls = 0;
2351 sdpi->niterations = 0;
2352 sdpi->opttime = 0.0;
2362 const SCIP_Real* lhs,
2363 const SCIP_Real* rhs
2368 SCIPdebugMessage(
"Changing %d left and right hand sides of SDP %d\n", nrows, sdpi->sdpid);
2370 assert( sdpi != NULL );
2371 assert( 0 <= nrows && nrows <= sdpi->nlpcons );
2372 assert( ind != NULL );
2373 assert( lhs != NULL );
2374 assert( rhs != NULL );
2376 for (i = 0; i < nrows; i++)
2378 assert( ind[i] >= 0 );
2379 assert( ind[i] < sdpi->nlpcons );
2380 sdpi->lplhs[ind[i]] = lhs[i];
2381 sdpi->lprhs[ind[i]] = rhs[i];
2384 sdpi->solved = FALSE;
2385 sdpi->infeasible = FALSE;
2386 sdpi->allfixed = FALSE;
2387 sdpi->nsdpcalls = 0;
2388 sdpi->niterations = 0;
2389 sdpi->opttime = 0.0;
2407 return sdpi->messagehdlr;
2416 assert( sdpi != NULL );
2417 assert( nlprows != NULL );
2419 *nlprows = sdpi->nlpcons;
2430 assert( sdpi != NULL );
2431 assert( nsdpblocks != NULL );
2433 *nsdpblocks = sdpi->nsdpblocks;
2444 assert( sdpi != NULL );
2445 assert( nvars != NULL );
2447 *nvars = sdpi->nvars;
2458 assert( sdpi != NULL );
2459 assert( nnonz != NULL );
2461 *nnonz = sdpi->sdpnnonz;
2472 assert( sdpi != NULL );
2473 assert( nnonz != NULL );
2475 *nnonz = sdpi->sdpconstnnonz;
2486 assert( sdpi != NULL );
2487 assert( nnonz != NULL );
2489 *nnonz = sdpi->lpnnonz;
2504 assert( sdpi != NULL );
2505 assert( firstvar >= 0 );
2506 assert( firstvar <= lastvar );
2507 assert( lastvar < sdpi->nvars);
2508 assert( vals != NULL );
2510 for (i = 0; i < lastvar - firstvar + 1; i++)
2511 vals[i] = sdpi->obj[firstvar + i];
2527 assert( sdpi != NULL );
2528 assert( firstvar >= 0 );
2529 assert( firstvar <= lastvar );
2530 assert( lastvar < sdpi->nvars);
2531 assert( lbs != NULL );
2532 assert( ubs != NULL );
2534 for (i = 0; i < lastvar - firstvar + 1; i++)
2537 lbs[i] = sdpi->lb[firstvar + i];
2539 ubs[i] = sdpi->ub[firstvar + i];
2555 assert( sdpi != NULL );
2556 assert( firstrow >= 0 );
2557 assert( firstrow <= lastrow );
2558 assert( lastrow < sdpi->nlpcons);
2559 assert( lhss != NULL );
2561 for (i = 0; i < lastrow - firstrow + 1; i++)
2562 lhss[firstrow + i] = sdpi->lplhs[i];
2577 assert( sdpi != NULL );
2578 assert( firstrow >= 0 );
2579 assert( firstrow <= lastrow );
2580 assert( lastrow < sdpi->nlpcons);
2581 assert( rhss != NULL );
2583 for (i = 0; i < lastrow - firstrow + 1; i++)
2584 rhss[firstrow + i] = sdpi->lprhs[i];
2610 int* startZnblocknonz,
2616 SCIP_Real** startZval,
2618 int* startXnblocknonz,
2624 SCIP_Real** startXval,
2628 SCIP_Bool enforceslatercheck,
2633 int* sdpconstnblocknonz = NULL;
2634 int* maxsdpconstnblocknonz = NULL;
2635 int** sdpconstrow = NULL;
2636 int** sdpconstcol = NULL;
2637 SCIP_Real** sdpconstval = NULL;
2638 int** indchanges = NULL;
2639 int* nremovedinds = NULL;
2640 SCIP_Real addedopttime;
2641 SCIP_Real fixedvarsobjcontr = 0.0;
2642 SCIP_Bool fixingfound;
2643 int* blockindchanges;
2645 int sdpilpnnonz = 0;
2647 int nactivevars = 0;
2648 int activevaridx = -1;
2649 int nremovedblocks = 0;
2650 int naddediterations;
2655 assert( sdpi != NULL );
2657 SCIPdebugMessage(
"Forwarding SDP %d to solver!\n", sdpi->sdpid);
2659 sdpi->penalty = FALSE;
2661 sdpi->solved = FALSE;
2662 sdpi->infeasible = FALSE;
2663 sdpi->allfixed = FALSE;
2664 sdpi->nsdpcalls = 0;
2665 sdpi->niterations = 0;
2666 sdpi->opttime = 0.0;
2668 sdpi->onevarsdpobjval = SCIP_INVALID;
2669 sdpi->onevarsdpoptval = SCIP_INVALID;
2670 sdpi->onevarsdpidx = -1;
2672 if ( timelimit <= 0.0 )
2678 for (v = 0; v < sdpi->nvars && ! sdpi->infeasible; v++)
2680 sdpi->sdpilb[v] = sdpi->lb[v];
2681 sdpi->sdpiub[v] = sdpi->ub[v];
2682 if ( sdpi->sdpiub[v] < sdpi->sdpilb[v] - sdpi->feastol )
2683 sdpi->infeasible = TRUE;
2687 if ( sdpi->infeasible )
2689 SCIPdebugMessage(
"SDP %d not given to solver, as infeasibility was detected during problem preparation!\n", sdpi->sdpid++);
2692 sdpi->solved = TRUE;
2695 ++sdpi->ninfeasible;
2701 assert( ! sdpi->infeasible );
2708 SCIP_CALL(
prepareLPData(sdpi, sdpi->sdpilb, sdpi->sdpiub, &nactivelpcons, sdpi->sdpilplhs, sdpi->sdpilprhs, &sdpilpnnonz,
2709 sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval, &fixingfound) );
2711 SCIPdebugMessage(
"Number of active LP constraints: %d (original: %d); %d nonzeros.\n", nactivelpcons, sdpi->nlpcons, sdpilpnnonz);
2713 while ( fixingfound && ! sdpi->infeasible );
2716 if ( sdpi->infeasible )
2718 SCIPdebugMessage(
"SDP %d not given to solver, since infeasibility was detected during problem preparation!\n", sdpi->sdpid++);
2721 sdpi->solved = TRUE;
2724 ++sdpi->ninfeasible;
2730 assert( ! sdpi->infeasible );
2733 for (v = 0; v < sdpi->nvars; v++)
2741 fixedvarsobjcontr += sdpi->obj[v] * sdpi->sdpilb[v];
2744 if ( nactivevars == 0 )
2745 sdpi->allfixed = TRUE;
2748 if ( sdpi->allfixed )
2753 SCIPdebugMessage(
"SDP %d not given to solver, since all variables are fixed; problem is %sfeasible!\n", sdpi->sdpid++, sdpi->infeasible ?
"in" :
"");
2756 sdpi->solved = TRUE;
2764 assert( ! sdpi->allfixed );
2765 assert( ! sdpi->infeasible );
2768 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &sdpconstnblocknonz, sdpi->nsdpblocks) );
2769 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &maxsdpconstnblocknonz, sdpi->nsdpblocks) );
2770 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &sdpconstrow, sdpi->nsdpblocks) );
2771 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &sdpconstcol, sdpi->nsdpblocks) );
2772 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &sdpconstval, sdpi->nsdpblocks) );
2773 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &indchanges, sdpi->nsdpblocks) );
2774 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &nremovedinds, sdpi->nsdpblocks) );
2775 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &blockindchanges, sdpi->nsdpblocks) );
2777 for (b = 0; b < sdpi->nsdpblocks; ++b)
2779 maxsdpconstnblocknonz[b] = MIN(sdpi->sdpnnonz + sdpi->sdpconstnnonz, sdpi->sdpblocksizes[b] * (sdpi->sdpblocksizes[b] + 1) / 2);
2780 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpconstrow[b]), maxsdpconstnblocknonz[b]) );
2781 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpconstcol[b]), maxsdpconstnblocknonz[b]) );
2782 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(sdpconstval[b]), maxsdpconstnblocknonz[b]) );
2783 sdpconstnblocknonz[b] = maxsdpconstnblocknonz[b];
2785 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &(indchanges[b]), sdpi->sdpblocksizes[b]) );
2789 SCIP_CALL(
compConstMatAfterFixings(sdpi, sdpi->sdpilb, sdpi->sdpiub, &sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval) );
2790 assert( ! sdpi->allfixed );
2791 assert( ! sdpi->infeasible );
2794 if ( nactivevars == 1 && sdpi->nsdpblocks <= 1 )
2799 assert( nactivelpcons == 0 );
2800 assert( 0 <= activevaridx && activevaridx < sdpi->nvars );
2803 if ( sdpi->nsdpblocks == 0 )
2809 if ( sdpi->obj[activevaridx] >= 0.0 )
2811 sdpi->onevarsdpoptval = sdpi->sdpilb[activevaridx];
2812 sdpi->onevarsdpobjval = sdpi->obj[activevaridx] * sdpi->sdpilb[activevaridx];
2816 sdpi->onevarsdpoptval = sdpi->sdpiub[activevaridx];
2817 sdpi->onevarsdpobjval = sdpi->obj[activevaridx] * sdpi->sdpiub[activevaridx];
2820 sdpi->solved = TRUE;
2823 sdpi->onevarsdpidx = activevaridx;
2825 sdpi->onevarsdpobjval += fixedvarsobjcontr;
2832 for (v = 0; v < sdpi->sdpnblockvars[0]; ++v)
2834 if ( sdpi->sdpvar[0][v] == activevaridx )
2838 SCIP_CALL(
SCIPsolveOneVarSDP(sdpi->bufmem, sdpi->obj[activevaridx], sdpi->sdpilb[activevaridx], sdpi->sdpiub[activevaridx], sdpi->sdpblocksizes[0],
2839 sdpconstnblocknonz[0], sdpconstrow[0], sdpconstcol[0], sdpconstval[0],
2840 sdpi->sdpnblockvarnonz[0][v], sdpi->sdprow[0][v], sdpi->sdpcol[0][v], sdpi->sdpval[0][v],
2843 if ( objval != SCIP_INVALID )
2845 sdpi->solved = TRUE;
2848 sdpi->onevarsdpobjval = objval;
2849 sdpi->onevarsdpoptval = optval;
2850 sdpi->onevarsdpidx = activevaridx;
2857 sdpi->onevarsdpobjval += fixedvarsobjcontr;
2865 if ( ! sdpi->solved )
2868 SCIP_CALL(
findEmptyRowColsSDP(sdpi, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, indchanges, nremovedinds, blockindchanges, &nremovedblocks) );
2870 if ( sdpi->slatercheck )
2873 sdpconstnblocknonz, sdpconstnnonz, sdpconstrow, sdpconstcol, sdpconstval,
2874 indchanges, nremovedinds, nactivelpcons,
2875 sdpi->sdpilplhs, sdpi->sdpilprhs, sdpilpnnonz, sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval,
2876 blockindchanges, nremovedblocks, FALSE) );
2881 sdpi->nsdpblocks, sdpi->sdpblocksizes, sdpi->sdpnblockvars, sdpconstnnonz,
2882 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval,
2883 sdpi->sdpnnonz, sdpi->sdpnblockvarnonz, sdpi->sdpvar, sdpi->sdprow, sdpi->sdpcol,
2884 sdpi->sdpval, indchanges, nremovedinds, blockindchanges, nremovedblocks, nactivelpcons, sdpi->sdpilplhs, sdpi->sdpilprhs,
2885 sdpilpnnonz, sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval, starty, startZnblocknonz, startZrow, startZcol, startZval,
2886 startXnblocknonz, startXrow, startXcol, startXval, startsettings, timelimit, sdpi->usedsdpitime) );
2888 sdpi->solved = TRUE;
2893 sdpi->opttime += addedopttime;
2894 naddediterations = 0;
2896 sdpi->niterations += naddediterations;
2899 sdpi->nsdpcalls += naddedsdpcalls;
2908 dualsollength = sdpi->nvars;
2909 BMS_CALL( BMSallocBlockMemoryArray(sdpi->blkmem, &dualsol, dualsollength) );
2910 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objval, dualsol, &dualsollength) );
2911 printf(
"dual sol: %.15g\n", dualsol[activevaridx]);
2912 BMSfreeBlockMemoryArrayNull(sdpi->blkmem, &dualsol, dualsollength);
2915 assert( REALABS(objval - solveonevarsdpobjval)/MAX3(1.0, REALABS(objval), REALABS(solveonevarsdpobjval)) <= 2.0 * sdpi->gaptol );
2922 SCIP_Real penaltyparam;
2923 SCIP_Real penaltyparamfact;
2925 SCIP_Real gaptolfact;
2927 SCIP_Bool penaltybound;
2932 penaltybound = TRUE;
2935 SCIPdebugMessage(
"SDP %d returned inacceptable result, trying penalty formulation.\n", sdpi->sdpid);
2940 sdpi->nsdpblocks, sdpi->sdpblocksizes, sdpi->sdpnblockvars, sdpconstnnonz,
2941 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval,
2942 sdpi->sdpnnonz, sdpi->sdpnblockvarnonz, sdpi->sdpvar, sdpi->sdprow, sdpi->sdpcol,
2943 sdpi->sdpval, indchanges, nremovedinds, blockindchanges, nremovedblocks, nactivelpcons, sdpi->sdpilplhs, sdpi->sdpilprhs,
2944 sdpilpnnonz, sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval, starty, startZnblocknonz, startZrow, startZcol, startZval,
2950 sdpi->opttime += addedopttime;
2951 naddediterations = 0;
2953 sdpi->niterations += naddediterations;
2956 sdpi->nsdpcalls += naddedsdpcalls;
2972 sdpi->peninfeasadjust * sdpi->feastol : sdpi->peninfeasadjust * sdpi->gaptol))) ||
2975 SCIPdebugMessage(
"SDP %d found infeasible using penalty formulation, maximum of smallest eigenvalue is %g.\n", sdpi->sdpid, -1.0 * objval);
2976 sdpi->penalty = TRUE;
2977 sdpi->infeasible = TRUE;
2982 penaltybound = TRUE;
2984 penaltyparam = sdpi->penaltyparam;
2986 SCIPdebugMessage(
"SDP %d not found infeasible using penalty formulation, maximum of smallest eigenvalue is %g.\n", sdpi->sdpid, -1.0 * objval);
2991 penaltyparamfact = sdpi->npenaltyincr > 0 ? pow((sdpi->maxpenaltyparam / sdpi->penaltyparam), 1.0/sdpi->npenaltyincr) :
2992 2*sdpi->maxpenaltyparam / sdpi->penaltyparam;
2993 gaptol = sdpi->gaptol;
2994 gaptolfact = sdpi->npenaltyincr > 0 ? pow((
MIN_GAPTOL / sdpi->gaptol), 1.0/sdpi->npenaltyincr) : 0.5 *
MIN_GAPTOL / sdpi->gaptol;
3000 SCIPdebugMessage(
"Solver did not produce an acceptable result, trying SDP %d again with penaltyparameter %g.\n", sdpi->sdpid, penaltyparam);
3003 sdpi->sdpilb, sdpi->sdpiub, sdpi->nsdpblocks, sdpi->sdpblocksizes, sdpi->sdpnblockvars, sdpconstnnonz,
3004 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval,
3005 sdpi->sdpnnonz, sdpi->sdpnblockvarnonz, sdpi->sdpvar, sdpi->sdprow, sdpi->sdpcol,
3006 sdpi->sdpval, indchanges, nremovedinds, blockindchanges, nremovedblocks, nactivelpcons, sdpi->sdpilplhs, sdpi->sdpilprhs,
3007 sdpilpnnonz, sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval, starty, startZnblocknonz, startZrow, startZcol, startZval,
3008 startXnblocknonz, startXrow, startXcol, startXval, startsettings, timelimit, sdpi->usedsdpitime, &feasorig, &penaltybound) );
3013 sdpi->opttime += addedopttime;
3014 naddediterations = 0;
3016 sdpi->niterations += naddediterations;
3019 sdpi->nsdpcalls += naddedsdpcalls;
3024 penaltyparam *= penaltyparamfact;
3025 SCIPdebugMessage(
"Solver did not converge even with penalty formulation, increasing penaltyparameter.\n");
3031 if ( objbound > sdpi->bestbound + sdpi->gaptol )
3032 sdpi->bestbound = objbound;
3040 penaltyparam *= penaltyparamfact;
3041 SCIPdebugMessage(
"Penalty formulation produced a result which is infeasible for the original problem, increasing penaltyparameter.\n");
3045 gaptol *= gaptolfact;
3047 SCIPdebugMessage(
"Penalty formulation produced a result which is infeasible for the original problem, even though primal penalty " 3048 "bound was not reached, decreasing tolerance for duality gap in SDP-solver.\n");
3054 if ( gaptol > sdpi->gaptol )
3062 sdpi->penalty = TRUE;
3063 sdpi->solved = TRUE;
3068 SCIPdebugMessage(
"Problem was found to be infeasible using a penalty formulation.\n");
3069 sdpi->infeasible = TRUE;
3070 sdpi->penalty = TRUE;
3071 sdpi->solved = TRUE;
3076 SCIPdebugMessage(
"SDP-Solver could not solve the problem even after using a penalty formulation.\n");
3077 sdpi->solved = FALSE;
3078 sdpi->penalty = TRUE;
3082 if ( sdpi->solved == FALSE && enforceslatercheck )
3085 sdpconstnblocknonz, sdpconstnnonz, sdpconstrow, sdpconstcol, sdpconstval,
3086 indchanges, nremovedinds, nactivelpcons,
3087 sdpi->sdpilplhs, sdpi->sdpilprhs, sdpilpnnonz, sdpi->sdpilprow, sdpi->sdpilpcol, sdpi->sdpilpval,
3088 blockindchanges, nremovedblocks, TRUE) );
3090 else if ( sdpi->solved == FALSE )
3093 SCIPmessagePrintInfo(sdpi->messagehdlr,
"Numerical trouble.\n");
3095 SCIPdebugMessage(
"SDP-Interface was unable to solve SDP %d.\n", sdpi->sdpid);
3103 for (b = sdpi->nsdpblocks - 1; b >= 0; --b)
3105 BMSfreeBlockMemoryArray(sdpi->blkmem, &(indchanges[b]), sdpi->sdpblocksizes[b]);
3106 BMSfreeBlockMemoryArray(sdpi->blkmem, &(sdpconstval[b]), maxsdpconstnblocknonz[b]);
3107 BMSfreeBlockMemoryArray(sdpi->blkmem, &(sdpconstcol[b]), maxsdpconstnblocknonz[b]);
3108 BMSfreeBlockMemoryArray(sdpi->blkmem, &(sdpconstrow[b]), maxsdpconstnblocknonz[b]);
3110 BMSfreeBlockMemoryArray(sdpi->blkmem, &blockindchanges, sdpi->nsdpblocks);
3111 BMSfreeBlockMemoryArray(sdpi->blkmem, &nremovedinds, sdpi->nsdpblocks);
3112 BMSfreeBlockMemoryArray(sdpi->blkmem, &indchanges, sdpi->nsdpblocks);
3113 BMSfreeBlockMemoryArray(sdpi->blkmem, &sdpconstval, sdpi->nsdpblocks);
3114 BMSfreeBlockMemoryArray(sdpi->blkmem, &sdpconstcol, sdpi->nsdpblocks);
3115 BMSfreeBlockMemoryArray(sdpi->blkmem, &sdpconstrow, sdpi->nsdpblocks);
3116 BMSfreeBlockMemoryArray(sdpi->blkmem, &maxsdpconstnblocknonz, sdpi->nsdpblocks);
3117 BMSfreeBlockMemoryArray(sdpi->blkmem, &sdpconstnblocknonz, sdpi->nsdpblocks);
3141 assert( sdpi != NULL );
3143 return sdpi->solved;
3151 assert( sdpi != NULL );
3164 assert( sdpi != NULL );
3176 SCIP_Bool* primalfeasible,
3177 SCIP_Bool* dualfeasible
3180 assert( sdpi != NULL );
3183 if ( sdpi->infeasible )
3187 if ( sdpi->allfixed )
3188 *primalfeasible = TRUE;
3190 *primalfeasible = FALSE;
3191 *dualfeasible = FALSE;
3194 else if ( sdpi->allfixed )
3197 *primalfeasible = TRUE;
3198 *dualfeasible = TRUE;
3203 *dualfeasible = TRUE;
3204 *primalfeasible = TRUE;
3209 *dualfeasible = FALSE;
3210 *primalfeasible = TRUE;
3224 assert( sdpi != NULL );
3227 if ( sdpi->infeasible )
3231 if ( sdpi->allfixed )
3236 else if ( sdpi->allfixed )
3254 assert( sdpi != NULL );
3257 if ( sdpi->infeasible )
3263 else if ( sdpi->allfixed )
3279 assert(sdpi != NULL );
3282 if ( sdpi->infeasible )
3286 if ( sdpi->allfixed )
3291 else if ( sdpi->allfixed )
3307 assert( sdpi != NULL );
3310 if ( sdpi->infeasible )
3315 else if ( sdpi->allfixed )
3331 assert( sdpi != NULL );
3334 if ( sdpi->infeasible )
3339 else if ( sdpi->allfixed )
3357 assert( sdpi != NULL );
3360 if ( sdpi->infeasible )
3365 else if ( sdpi->allfixed )
3383 assert( sdpi != NULL );
3386 if ( sdpi->infeasible )
3391 else if ( sdpi->allfixed )
3407 assert( sdpi != NULL );
3410 if ( sdpi->infeasible )
3415 else if ( sdpi->allfixed )
3431 assert( sdpi != NULL );
3434 if ( sdpi->infeasible )
3439 else if ( sdpi->allfixed )
3455 assert( sdpi != NULL );
3457 if ( sdpi->infeasible )
3462 else if ( sdpi->allfixed )
3467 else if ( ! sdpi->solved )
3469 SCIPdebugMessage(
"Problem was not solved, time limit not exceeded.\n");
3493 assert( sdpi != NULL );
3495 if ( ! sdpi->solved )
3497 SCIPdebugMessage(
"Problem wasn't solved yet.\n");
3500 else if ( sdpi->infeasible )
3502 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no internal status available.\n");
3505 else if ( sdpi->allfixed )
3507 SCIPdebugMessage(
"All variables are fixed, no internal status available.\n");
3512 SCIPdebugMessage(
"Solved one variable SDP, no internal status available.\n");
3524 assert( sdpi != NULL );
3527 if ( sdpi->infeasible )
3532 else if ( sdpi->allfixed )
3552 assert( sdpi != NULL );
3554 if ( sdpi->infeasible )
3559 else if ( sdpi->allfixed )
3564 else if ( ! sdpi->solved )
3566 SCIPdebugMessage(
"Problem not solved succesfully, this is not acceptable in a B&B context.\n");
3581 assert( sdpi != NULL );
3582 assert( objval != NULL );
3586 if ( sdpi->infeasible )
3588 else if ( sdpi->allfixed )
3595 for (v = 0; v < sdpi->nvars; v++)
3596 *objval += sdpi->sdpilb[v] * sdpi->obj[v];
3600 assert( sdpi->onevarsdpobjval != SCIP_INVALID );
3601 *objval = sdpi->onevarsdpobjval;
3619 assert( sdpi != NULL );
3620 assert( objlb != NULL );
3625 if ( sdpi->infeasible )
3627 else if ( sdpi->allfixed )
3634 for (v = 0; v < sdpi->nvars; v++)
3635 *objlb += sdpi->sdpilb[v] * sdpi->obj[v];
3639 assert( sdpi->onevarsdpobjval != SCIP_INVALID );
3640 *objlb = sdpi->onevarsdpobjval;
3651 if ( sdpi->penalty )
3653 *objlb = sdpi->bestbound;
3674 assert( sdpi != NULL );
3675 assert( dualsollength != NULL );
3676 assert( *dualsollength == 0 || dualsol != NULL );
3679 if ( sdpi->infeasible )
3681 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no solution available.\n");
3684 else if ( sdpi->allfixed )
3686 if ( objval != NULL )
3691 if ( *dualsollength > 0 )
3695 assert( dualsol != NULL );
3696 if ( *dualsollength < sdpi->nvars )
3698 SCIPdebugMessage(
"The given array in SCIPsdpiGetSol only had length %d, but %d was needed", *dualsollength, sdpi->nvars);
3699 *dualsollength = sdpi->nvars;
3705 for (v = 0; v < sdpi->nvars; v++)
3706 dualsol[v] = sdpi->sdpilb[v];
3711 if ( objval != NULL )
3716 if ( *dualsollength > 0 )
3720 assert( dualsol != NULL );
3721 if ( *dualsollength < sdpi->nvars )
3723 SCIPdebugMessage(
"The given array in SCIPsdpiGetSol only had length %d, but %d was needed", *dualsollength, sdpi->nvars);
3724 *dualsollength = sdpi->nvars;
3730 for (v = 0; v < sdpi->nvars; v++)
3731 dualsol[v] = sdpi->sdpilb[v];
3734 assert( 0 <= sdpi->onevarsdpidx && sdpi->onevarsdpidx < sdpi->nvars );
3735 dualsol[sdpi->onevarsdpidx] = sdpi->onevarsdpoptval;
3750 int* startXnblocknonz
3754 assert( sdpi != NULL );
3755 assert( nblocks >= 0 );
3756 assert( startXnblocknonz != NULL );
3758 if ( sdpi->infeasible )
3760 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no preoptimal solution available.\n");
3761 startXnblocknonz[0] = -1;
3763 else if ( sdpi->allfixed )
3765 SCIPdebugMessage(
"All variables are fixed, no solution available.\n");
3766 startXnblocknonz[0] = -1;
3770 SCIPdebugMessage(
"One variable SDP solved, no solution available.\n");
3771 startXnblocknonz[0] = -1;
3795 int* startXnblocknonz,
3799 SCIP_Real** startXval
3802 assert( sdpi != NULL );
3803 assert( success != NULL );
3804 assert( dualsol != NULL );
3805 assert( dualsollength != NULL );
3806 assert( *dualsollength >= 0 );
3807 assert( startXnblocknonz != NULL || nblocks == -1 );
3808 assert( startXrow != NULL || nblocks == -1 );
3809 assert( startXcol != NULL || nblocks == -1 );
3810 assert( startXval != NULL || nblocks == -1 );
3812 if ( sdpi->infeasible )
3815 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no preoptimal solution available.\n");
3816 assert( startXnblocknonz != NULL );
3817 startXnblocknonz[0] = -1;
3819 else if ( sdpi->allfixed )
3823 assert( dualsol != NULL );
3827 if ( *dualsollength < sdpi->nvars )
3829 SCIPdebugMessage(
"The given array in SCIPsdpiGetPreoptimalSol only had length %d, but %d was needed", *dualsollength, sdpi->nvars);
3830 *dualsollength = sdpi->nvars;
3836 for (v = 0; v < sdpi->nvars; v++)
3837 dualsol[v] = sdpi->sdpilb[v];
3841 SCIPdebugMessage(
"No primal solution available, as problem was solved during preprocessing\n");
3842 assert( startXnblocknonz != NULL );
3843 startXnblocknonz[0] = -1;
3852 assert( dualsol != NULL );
3856 if ( *dualsollength < sdpi->nvars )
3858 SCIPdebugMessage(
"The given array in SCIPsdpiGetPreoptimalSol only had length %d, but %d was needed", *dualsollength, sdpi->nvars);
3859 *dualsollength = sdpi->nvars;
3865 for (v = 0; v < sdpi->nvars; v++)
3866 dualsol[v] = sdpi->sdpilb[v];
3869 assert( 0 <= sdpi->onevarsdpidx && sdpi->onevarsdpidx < sdpi->nvars );
3870 dualsol[sdpi->onevarsdpidx] = sdpi->onevarsdpoptval;
3874 SCIPdebugMessage(
"No primal solution available, since one variable SDP was solved.\n");
3875 assert( startXnblocknonz != NULL );
3876 startXnblocknonz[0] = -1;
3884 startXrow, startXcol, startXval) );
3904 assert( sdpi != NULL );
3905 assert( lbvars != NULL );
3906 assert( ubvars != NULL );
3907 assert( arraylength != NULL );
3908 assert( *arraylength >= 0 );
3912 if ( sdpi->infeasible )
3914 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no primal variables available.\n");
3917 else if ( sdpi->allfixed )
3919 SCIPdebugMessage(
"All variables fixed during preprocessing, no primal variables available.\n");
3927 if ( *arraylength < sdpi->nvars )
3929 *arraylength = sdpi->nvars;
3930 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpi->nvars);
3935 for (i = 0; i < sdpi->nvars; i++)
3941 if ( sdpi->onevarsdpidx == i )
3944 if ( REALABS(sdpi->onevarsdpoptval - sdpi->sdpilb[i]) < sdpi->feastol )
3947 lbvars[i] = sdpi->obj[i];
3956 SCIPdebugMessage(
"Problem is infeasible, no primal variables available.\n");
3963 SCIPdebugMessage(
"Problem infeasible.\n");
3978 int* startXnblocknonz
3981 assert( sdpi != NULL );
3983 if ( sdpi->infeasible )
3985 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no primal solution available.\n");
3987 else if ( sdpi->allfixed )
3989 SCIPdebugMessage(
"All variables fixed during preprocessing, no primal solution available.\n");
3993 SCIPdebugMessage(
"Solved one variable SDP, no primal solution available.\n");
4012 int* startXnblocknonz,
4016 SCIP_Real** startXval
4019 assert( sdpi != NULL );
4021 if ( sdpi->infeasible )
4023 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no primal solution available.\n");
4025 else if ( sdpi->allfixed )
4027 SCIPdebugMessage(
"All variables fixed during preprocessing, no primal solution available.\n");
4031 SCIPdebugMessage(
"Solved one variable SDP, no primal solution available.\n");
4046 assert( sdpi != NULL );
4057 assert( sdpi != NULL );
4058 assert( opttime != NULL );
4060 *opttime = sdpi->opttime;
4071 assert( sdpi != NULL );
4072 assert( iterations != NULL );
4074 *iterations = sdpi->niterations;
4085 assert( sdpi != NULL );
4086 assert( calls != NULL );
4088 *calls = sdpi->nsdpcalls;
4099 assert( sdpi != NULL );
4100 assert( usedsetting != NULL );
4102 if ( ! sdpi->solved )
4104 SCIPdebugMessage(
"Problem was not solved successfully.\n");
4107 else if ( sdpi->infeasible && ! sdpi->penalty )
4109 SCIPdebugMessage(
"Infeasibility was detected while preparing the problem, no settings used.\n");
4112 else if ( sdpi->allfixed )
4114 SCIPdebugMessage(
"All varialbes fixed during preprocessing, no settings used.\n");
4119 SCIPdebugMessage(
"Solved one variable SDP, no settings used.\n");
4122 else if ( sdpi->penalty )
4142 assert( sdpi != NULL );
4143 assert( slatersetting != NULL );
4145 if ( ! sdpi->solved )
4147 SCIPdebugMessage(
"Problem was not solved successfully.\n");
4150 SCIPdebugMessage(
"But we could at least compute a lower bound.\n");
4155 switch( sdpi->primalslater )
4167 switch( sdpi->dualslater )
4195 switch( sdpi->primalslater )
4207 switch( sdpi->dualslater )
4231 else if ( sdpi->infeasible && ( ! sdpi->penalty ) )
4233 SCIPdebugMessage(
"Infeasibility was detected while preparing problem, no settings used.\n");
4237 else if ( sdpi->allfixed )
4239 SCIPdebugMessage(
"All varialbes fixed during preprocessing, no settings used.\n");
4245 SCIPdebugMessage(
"Solved one variable SDP, no settings used.\n");
4249 else if ( sdpi->penalty )
4251 switch( sdpi->primalslater )
4268 switch( sdpi->dualslater )
4294 switch( sdpi->primalslater )
4301 switch( usedsetting )
4319 switch( usedsetting )
4341 switch( usedsetting )
4359 switch( usedsetting )
4375 switch( sdpi->dualslater )
4383 switch( usedsetting )
4400 switch( usedsetting )
4417 switch( usedsetting )
4451 assert( sdpi != NULL );
4452 assert( primalslater != NULL );
4453 assert( dualslater != NULL );
4455 if ( sdpi->infeasible )
4458 *dualslater = sdpi->dualslater;
4461 else if ( sdpi->allfixed )
4474 *primalslater = sdpi->primalslater;
4475 *dualslater = sdpi->dualslater;
4488 assert( sdpi != NULL );
4489 assert( ninfeasible != NULL );
4490 assert( nallfixed != NULL );
4491 assert( nonevarsdp != NULL );
4493 *ninfeasible = sdpi->ninfeasible;
4494 *nallfixed = sdpi->nallfixed;
4495 *nonevarsdp = sdpi->nonevarsdp;
4517 assert( sdpi != NULL );
4528 assert( sdpi != NULL );
4540 assert( sdpi != NULL );
4541 assert( sdpi->sdpisolver != NULL );
4542 assert( dval != NULL );
4547 *dval = sdpi->epsilon;
4550 *dval = sdpi->gaptol;
4553 *dval = sdpi->feastol;
4562 *dval = sdpi->penaltyparam;
4565 *dval = sdpi->maxpenaltyparam;
4574 *dval = sdpi->peninfeasadjust;
4577 return SCIP_PARAMETERUNKNOWN;
4590 assert( sdpi != NULL );
4595 sdpi->epsilon = dval;
4599 sdpi->gaptol = dval;
4603 sdpi->feastol = dval;
4613 sdpi->penaltyparam = dval;
4617 sdpi->maxpenaltyparam = dval;
4626 sdpi->peninfeasadjust = dval;
4629 return SCIP_PARAMETERUNKNOWN;
4642 assert( sdpi != NULL );
4643 assert( sdpi->sdpisolver != NULL );
4644 assert( ival != NULL );
4656 *ival = sdpi->slatercheck;
4659 *ival = sdpi->npenaltyincr;
4662 return SCIP_PARAMETERUNKNOWN;
4675 assert( sdpi != NULL );
4676 assert( sdpi->sdpisolver != NULL );
4684 assert( ival == 0 || ival == 1 );
4691 sdpi->slatercheck = ival;
4694 sdpi->npenaltyincr = ival;
4697 return SCIP_PARAMETERUNKNOWN;
4716 SCIP_Real* penaltyparam
4721 sdpi->penaltyparam = *penaltyparam;
4729 SCIP_Real penaltyparam,
4730 SCIP_Real* maxpenaltyparam
4735 sdpi->maxpenaltyparam = *maxpenaltyparam;
4739 if ( sdpi->penaltyparam > *maxpenaltyparam )
4741 SCIPdebugMessage(
"Decreasing penaltyparameter of %g to maximum penalty paramater of %g.\n", sdpi->penaltyparam, *maxpenaltyparam);
4742 sdpi->penaltyparam = *maxpenaltyparam;
4754 assert( sdpi != NULL );
4755 assert( clocktype == 1 || clocktype == 2 );
4756 assert( sdpi->usedsdpitime != NULL );
4779 assert( sdpi != NULL );
4780 assert( fname != NULL );
4782 SCIPerrorMessage(
"Not implemented yet.\n");
4784 return SCIP_NOTIMPLEMENTED;
4793 assert( sdpi != NULL );
4794 assert( fname != NULL );
4796 SCIPerrorMessage(
"Not implemented yet.\n");
4798 return SCIP_NOTIMPLEMENTED;
SCIP_RETCODE SCIPsdpiFree(SCIP_SDPI **sdpi)
SCIP_Bool SCIPsdpiIsDualUnbounded(SCIP_SDPI *sdpi)
#define DEFAULT_SDPSOLVERGAPTOL
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
SCIP_RETCODE SCIPsdpiDelLPRows(SCIP_SDPI *sdpi, int firstrow, int lastrow)
SCIP_EXPORT SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiGetTime(SCIP_SDPI *sdpi, SCIP_Real *opttime)
SCIP_EXPORT int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiChgLPLhRhSides(SCIP_SDPI *sdpi, int nrows, const int *ind, const SCIP_Real *lhs, const SCIP_Real *rhs)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
SCIP_RETCODE SCIPsolveOneVarSDP(BMS_BUFMEM *bufmem, SCIP_Real obj, SCIP_Real lb, SCIP_Real ub, int blocksize, int sdpconstnnonz, int *sdpconstrow, int *sdpconstcol, SCIP_Real *sdpconstval, int sdpnnonz, int *sdprow, int *sdpcol, SCIP_Real *sdpval, SCIP_Real infinity, SCIP_Real feastol, SCIP_Real *objval, SCIP_Real *optval)
SCIP_RETCODE SCIPsdpiGetSdpCalls(SCIP_SDPI *sdpi, int *calls)
SCIP_Bool SCIPsdpiDoesWarmstartNeedPrimal(void)
SCIP_EXPORT SCIP_Real SCIPsdpiSolverGetMaxPrimalEntry(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetTime(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *opttime)
SCIP_RETCODE SCIPsdpiGetSolFeasibility(SCIP_SDPI *sdpi, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiWriteSDP(SCIP_SDPI *sdpi, const char *fname)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiGetLPNNonz(SCIP_SDPI *sdpi, int *nnonz)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetPreoptimalSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success, SCIP_Real *dualsol, int *dualsollength, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
static SCIP_RETCODE checkFixedFeasibilitySdp(SCIP_SDPI *sdpi, SCIP_Real *sdpilb, SCIP_Real *sdpiub)
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)
SCIP_RETCODE SCIPsdpiGetIntpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, int *ival)
enum SDPI_ClockType SDPI_CLOCKTYPE
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiGetSDPNNonz(SCIP_SDPI *sdpi, int *nnonz)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiIsInfinity(SCIP_SDPI *sdpi, SCIP_Real val)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
const char * SCIPsdpiGetSolverName(void)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverLoadAndSolveWithPenalty(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Bool withobj, SCIP_Bool rbound, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
enum SCIP_Onevar_Status SCIP_ONEVAR_STATUS
SCIP_RETCODE SCIPsdpiGetNSDPBlocks(SCIP_SDPI *sdpi, int *nsdpblocks)
SCIP_RETCODE SCIPsdpiGetSol(SCIP_SDPI *sdpi, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
interface methods for specific SDP-solvers
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiIsPrimalInfeasible(SCIP_SDPI *sdpi)
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 SCIPsdpiGetIterations(SCIP_SDPI *sdpi, int *iterations)
SCIP_RETCODE SCIPsdpiSettingsUsed(SCIP_SDPI *sdpi, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSlaterSettings(SCIP_SDPI *sdpi, SCIP_SDPSLATERSETTING *slatersetting)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
static SCIP_RETCODE checkSlaterCondition(SCIP_SDPI *sdpi, SCIP_Real timelimit, SCIP_Real *sdpilb, SCIP_Real *sdpiub, int *sdpconstnblocknonz, int sdpconstnnonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int **indchanges, int *nremovedinds, int nactivelpcons, SCIP_Real *sdpilplhs, SCIP_Real *sdpilprhs, int sdpilpnnonz, int *sdpilprow, int *sdpilpcol, SCIP_Real *sdpilpval, int *blockindchanges, int nremovedblocks, SCIP_Bool rootnodefailed)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
static SCIP_RETCODE findEmptyRowColsSDP(SCIP_SDPI *sdpi, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int **indchanges, int *nremovedinds, int *blockindchanges, int *nremovedblocks)
SCIP_Bool SCIPsdpiIsAcceptable(SCIP_SDPI *sdpi)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiIsIterlimExc(SCIP_SDPI *sdpi)
SCIP_Bool SCIPsdpiIsTimelimExc(SCIP_SDPI *sdpi)
SCIP_Bool SCIPsdpiIsDualInfeasible(SCIP_SDPI *sdpi)
General interface methods for SDP-preprocessing (mainly fixing variables and removing empty rows/cols...
SCIP_RETCODE SCIPsdpiGetConstNNonz(SCIP_SDPI *sdpi, int *nnonz)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
enum SCIP_SDPSlaterSetting SCIP_SDPSLATERSETTING
SCIP_RETCODE SCIPsdpiClone(SCIP_SDPI *oldsdpi, SCIP_SDPI *newsdpi)
void SDPIclockFree(SDPI_CLOCK **clck)
SCIP_RETCODE SCIPsdpiChgBounds(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *lb, const SCIP_Real *ub)
SCIP_RETCODE SCIPsdpiDelLPRowset(SCIP_SDPI *sdpi, int *dstat)
SCIP_RETCODE SCIPsdpiGetLowerObjbound(SCIP_SDPI *sdpi, SCIP_Real *objlb)
SCIP_Bool SCIPsdpiIsObjlimExc(SCIP_SDPI *sdpi)
#define SCIP_CALL_PARAM_IGNORE_UNKNOWN(x)
SCIP_RETCODE SCIPsdpiGetObj(SCIP_SDPI *sdpi, int firstvar, int lastvar, SCIP_Real *vals)
SCIP_RETCODE SDPIclockCreate(SDPI_CLOCK **clck)
SCIP_EXPORT int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
void * SCIPsdpiGetSolverPointer(SCIP_SDPI *sdpi)
void SDPIclockStop(SDPI_CLOCK *clck)
int SCIPsdpiGetInternalStatus(SCIP_SDPI *sdpi)
static SCIP_RETCODE ensureLPDataMemory(SCIP_SDPI *sdpi, int nlpcons, int nlpnonz)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
void SDPIclockStart(SDPI_CLOCK *clck)
static SCIP_RETCODE ensureSDPDataMemory(SCIP_SDPI *sdpi, int nsdpblocks, int *sdpnblockvars, int **sdpnblockvarnonz, int *sdpconstnblocknonz, int sdpnnonz)
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)
SCIP_EXPORT const char * SCIPsdpiSolverGetSolverName(void)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetPrimalMatrix(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_RETCODE SCIPsdpiGetNVars(SCIP_SDPI *sdpi, int *nvars)
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_Bool SCIPsdpiIsPrimalUnbounded(SCIP_SDPI *sdpi)
SCIP_Real SCIPsdpiInfinity(SCIP_SDPI *sdpi)
#define CHECK_IF_SOLVED_BOOL(sdpi)
SCIP_RETCODE SCIPsdpiGetRhSides(SCIP_SDPI *sdpi, int firstrow, int lastrow, SCIP_Real *rhss)
SCIP_RETCODE SCIPsdpiCreate(SCIP_SDPI **sdpi, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
#define DUPLICATE_ARRAY_NULL(blkmem, target, source, size)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
adds the main functionality to fix/unfix/(multi-)aggregate variables by merging two three-tuple-array...
SCIP_EXPORT const char * SCIPsdpiSolverGetSolverDesc(void)
void SDPIclockSetType(SDPI_CLOCK *clck, SDPI_CLOCKTYPE clocktype)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiGetObjval(SCIP_SDPI *sdpi, SCIP_Real *objval)
SCIP_EXPORT void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiGetDefaultSdpiSolverNpenaltyIncreases(void)
SCIP_Bool SCIPsdpiIsConverged(SCIP_SDPI *sdpi)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
static SCIP_RETCODE prepareLPData(SCIP_SDPI *sdpi, SCIP_Real *sdpilb, SCIP_Real *sdpiub, int *nsdpilpcons, SCIP_Real *sdpilplhs, SCIP_Real *sdpilprhs, int *sdpilpnnonz, int *sdpilprow, int *sdpilpcol, SCIP_Real *sdpilpval, SCIP_Bool *fixingsfound)
#define DEFAULT_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiGetStatistics(SCIP_SDPI *sdpi, int *ninfeasible, int *nallfixed, int *nonevarsdp)
SCIP_Bool SCIPsdpiWasSolved(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiReadSDP(SCIP_SDPI *sdpi, const char *fname)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
SCIP_RETCODE SCIPsdpiComputeMaxPenaltyparam(SCIP_SDPI *sdpi, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiClear(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiGetBounds(SCIP_SDPI *sdpi, int firstvar, int lastvar, SCIP_Real *lbs, SCIP_Real *ubs)
SCIP_RETCODE SCIPsdpiChgObj(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *obj)
static SCIP_RETCODE ensureBoundDataMemory(SCIP_SDPI *sdpi, int nvars)
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)
#define DEFAULT_NPENALTYINCR
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
#define DEFAULT_PENALTYPARAM
SCIP_Bool SCIPsdpiIsDualFeasible(SCIP_SDPI *sdpi)
struct SCIP_SDPi SCIP_SDPI
Solve SDP with one variable.
SCIP_Bool SCIPsdpiIsPrimalFeasible(SCIP_SDPI *sdpi)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_RETCODE SCIPsdpiSetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverLoadAndSolve(SCIP_SDPISOLVER *sdpisolver, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
enum SCIP_SDPSlater SCIP_SDPSLATER
SCIP_Real SCIPsdpiGetMaxPrimalEntry(SCIP_SDPI *sdpi)
SCIP_MESSAGEHDLR * SCIPsdpiGetMessagehdlr(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpVarfixerMergeArraysIntoNew(BMS_BLKMEM *blkmem, SCIP_Real epsilon, int *firstrow, int *firstcol, SCIP_Real *firstval, int firstlength, int *secondrow, int *secondcol, SCIP_Real *secondval, int secondlength, int *targetrow, int *targetcol, SCIP_Real *targetval, int *targetlength)
interface methods for eigenvector computation and matrix multiplication using openblas ...
methods for clocks and timing
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_RETCODE SCIPsdpiGetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_RETCODE SCIPsdpiGetPreoptimalPrimalNonzeros(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz)
static SCIP_RETCODE compConstMatAfterFixings(const SCIP_SDPI *sdpi, const SCIP_Real *sdpilb, const SCIP_Real *sdpiub, int *sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval)
#define CHECK_IF_SOLVED(sdpi)
SCIP_RETCODE SCIPlapackComputeIthEigenvalue(BMS_BUFMEM *bufmem, SCIP_Bool geteigenvectors, int n, SCIP_Real *A, int i, SCIP_Real *eigenvalue, SCIP_Real *eigenvector)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
SCIP_RETCODE SCIPsdpiGetNLPRows(SCIP_SDPI *sdpi, int *nlprows)
SCIP_RETCODE SCIPsdpiGetLhSides(SCIP_SDPI *sdpi, int firstrow, int lastrow, SCIP_Real *lhss)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
SCIP_RETCODE SCIPsdpiGetPrimalBoundVars(SCIP_SDPI *sdpi, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
static SCIP_Bool isFixed(const SCIP_SDPI *sdpi, int v)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_EXPORT SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolvedOrig(SCIP_SDPI *sdpi)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSlater(SCIP_SDPI *sdpi, SCIP_SDPSLATER *primalslater, SCIP_SDPSLATER *dualslater)
#define SCIP_CALL_PARAM(x)
static int calcGrowSize(int initsize, int num)
SCIP_EXPORT SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)