53 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
54 #include "sdpa_call.h"
55 #pragma GCC diagnostic warning "-Wstrict-prototypes"
57 #include "blockmemshell/memory.h"
59 #include "scip/pub_misc.h"
63 #define GAPTOLCHANGE 1
64 #define FEASTOLCHANGE 1
65 #define PENALTYBOUNDTOL 1E-3
68 #define INFEASFEASTOLCHANGE 0.1
69 #define INFEASMINFEASTOL 1E-9
71 #define MIN_LAMBDASTAR 1e0
72 #define MAX_LAMBDASTAR 1e8
73 #define LAMBDASTAR_FACTOR 1e0
74 #define LAMBDASTAR_TWOPOINTS TRUE
75 #define LAMBDASTAR_THRESHOLD 1e1
76 #define LAMBDASTAR_LOW 1.5
77 #define LAMBDASTAR_HIGH 1e5
79 #define MIN_PENALTYPARAM 1e5
80 #define MAX_PENALTYPARAM 1e12
81 #define PENALTYPARAM_FACTOR 1e1
82 #define MAX_MAXPENALTYPARAM 1e15
83 #define MAXPENALTYPARAM_FACTOR 1e6
86 #define BMS_CALL(x) do \
90 SCIPerrorMessage("No memory in function call.\n"); \
91 return SCIP_NOMEMORY; \
97 #define CHECK_IF_SOLVED(sdpisolver) do \
99 if (!(sdpisolver->solved)) \
101 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
102 return SCIP_LPERROR; \
108 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
110 if (!(sdpisolver->solved)) \
112 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
120 struct SCIP_SDPiSolver
122 SCIP_MESSAGEHDLR* messagehdlr;
128 int* inputtosdpamapper;
131 int* sdpatoinputmapper;
132 SCIP_Real* fixedvarsval;
133 SCIP_Real fixedvarsobjcontr;
146 SCIP_Real sdpsolverfeastol;
154 SCIP_Real lambdastar;
171 assert( sdpisolver != NULL );
172 assert( lb < ub + sdpisolver->feastol );
174 return (ub-lb <= sdpisolver->epsilon);
177 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
185 SCIP_Real penaltyparam,
193 int* sdpconstnblocknonz,
197 SCIP_Real** sdpconstval,
199 int** sdpnblockvarnonz,
209 int* blockindchanges,
223 char phase_string[15];
226 assert( feastol != NULL );
230 SCIP_Real* solvector;
232 SCIP_Bool infeasible;
235 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
236 nvarspointer = nvars;
238 assert( nvarspointer == nvars );
241 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
242 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
243 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
244 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
246 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
250 SCIPdebugMessage(
"Solution feasible for SDPA but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
257 sdpisolver->sdpa->setParameterEpsilonDash(*feastol);
259 #ifdef SCIP_MORE_DEBUG
260 sdpisolver->sdpa->printParameters(stdout);
262 sdpisolver->sdpa->setInitPoint(
false);
263 #ifdef SDPA_RESETPARAMS
264 sdpisolver->sdpa->resetParameters();
266 sdpisolver->sdpa->initializeSolve();
268 sdpisolver->sdpa->solve();
271 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
272 sdpisolver->nsdpcalls += 1;
276 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
277 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
282 sdpisolver->solved = FALSE;
283 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
313 return "Primal-dual Interior Point Solver for SDPs developed by K. Fujisawa et al. (sdpa.sourceforge.net)";
326 assert( sdpisolver != NULL );
327 return (
void*) sdpisolver->sdpa;
359 SCIP_MESSAGEHDLR* messagehdlr,
364 assert( sdpisolver != NULL );
365 assert( blkmem != NULL );
366 assert( bufmem != NULL );
368 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
370 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
372 (*sdpisolver)->messagehdlr = messagehdlr;
373 (*sdpisolver)->blkmem = blkmem;
374 (*sdpisolver)->bufmem = bufmem;
377 (*sdpisolver)->sdpa = NULL;
379 (*sdpisolver)->nvars = 0;
380 (*sdpisolver)->nactivevars = 0;
381 (*sdpisolver)->inputtosdpamapper = NULL;
382 (*sdpisolver)->sdpatoinputmapper = NULL;
383 (*sdpisolver)->fixedvarsval = NULL;
384 (*sdpisolver)->fixedvarsobjcontr = 0.0;
385 (*sdpisolver)->objcoefs = NULL;
386 (*sdpisolver)->nvarbounds = 0;
387 (*sdpisolver)->varboundpos = NULL;
388 (*sdpisolver)->solved = FALSE;
389 (*sdpisolver)->timelimit = FALSE;
390 (*sdpisolver)->sdpcounter = 0;
391 (*sdpisolver)->niterations = 0;
392 (*sdpisolver)->nsdpcalls = 0;
394 (*sdpisolver)->epsilon = 1e-9;
395 (*sdpisolver)->gaptol = 1e-4;
396 (*sdpisolver)->feastol = 1e-6;
397 (*sdpisolver)->sdpsolverfeastol = 1e-6;
399 (*sdpisolver)->sdpinfo = FALSE;
410 assert( sdpisolver != NULL );
411 assert( *sdpisolver != NULL );
413 SCIPdebugMessage(
"Freeing SDPISolver\n");
416 if ( (*sdpisolver)->sdpa != NULL)
417 delete (*sdpisolver)->sdpa;
419 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nactivevars);
421 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
423 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
425 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
427 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
429 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
439 assert( sdpisolver != NULL );
441 sdpisolver->sdpcounter++;
451 assert( sdpisolver != NULL );
453 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
454 sdpisolver->sdpcounter = 0;
491 int* sdpconstnblocknonz,
495 SCIP_Real** sdpconstval,
497 int** sdpnblockvarnonz,
507 int* blockindchanges,
513 int* lprownactivevars,
524 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
525 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
526 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval, start,
527 startsettings, timelimit, NULL, NULL);
551 SCIP_Real penaltyparam,
562 int* sdpconstnblocknonz,
566 SCIP_Real** sdpconstval,
568 int** sdpnblockvarnonz,
578 int* blockindchanges,
595 SCIP_Bool* penaltybound
600 SCIP_Real* sdpavarbounds;
613 #ifdef SCIP_MORE_DEBUG
618 char phase_string[15];
621 assert( sdpisolver != NULL );
622 assert( penaltyparam > -1 * sdpisolver->epsilon );
623 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
625 assert( obj != NULL );
626 assert( lb != NULL );
627 assert( ub != NULL );
628 assert( nsdpblocks >= 0 );
629 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
630 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
631 assert( sdpconstnnonz >= 0 );
632 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
633 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
634 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
635 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
636 assert( sdpnnonz >= 0 );
637 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
638 assert( nsdpblocks == 0 || sdpvar != NULL );
639 assert( nsdpblocks == 0 || sdprow != NULL );
640 assert( nsdpblocks == 0 || sdpcol != NULL );
641 assert( nsdpblocks == 0 || sdpval != NULL );
642 assert( nsdpblocks == 0 || indchanges != NULL );
643 assert( nsdpblocks == 0 || nremovedinds != NULL );
644 assert( nsdpblocks == 0 || blockindchanges != NULL );
645 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
646 assert( nlpcons >= 0 );
647 assert( noldlpcons >= nlpcons );
648 assert( nlpcons == 0 || lplhs != NULL );
649 assert( nlpcons == 0 || lprhs != NULL );
650 assert( nlpcons == 0 || rownactivevars != NULL );
651 assert( lpnnonz >= 0 );
652 assert( nlpcons == 0 || lprow != NULL );
653 assert( nlpcons == 0 || lpcol != NULL );
654 assert( nlpcons == 0 || lpval != NULL );
656 sdpisolver->niterations = 0;
657 sdpisolver->nsdpcalls = 0;
658 sdpisolver->feasorig = FALSE;
661 if ( timelimit <= 0.0 )
663 sdpisolver->solved = FALSE;
664 sdpisolver->timelimit = TRUE;
668 sdpisolver->timelimit = FALSE;
680 if ( penaltyparam < sdpisolver->epsilon )
681 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
683 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
686 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
687 sdpisolver->rbound = rbound;
691 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
692 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
693 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
694 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
696 oldnactivevars = sdpisolver->nactivevars;
697 sdpisolver->nvars = nvars;
698 sdpisolver->nactivevars = 0;
702 sdpisolver->fixedvarsobjcontr = 0.0;
703 for (i = 0; i < nvars; i++)
705 if (
isFixed(sdpisolver, lb[i], ub[i]) )
707 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
708 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
710 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
711 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
715 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
716 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
717 sdpisolver->nactivevars++;
718 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
719 #ifdef SCIP_MORE_DEBUG
720 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
724 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
728 sdpisolver->fixedvarsobjcontr = 0.0;
731 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
732 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
733 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
736 if ( sdpisolver->sdpa != 0 )
739 delete sdpisolver->sdpa;
740 sdpisolver->sdpa =
new SDPA();
743 sdpisolver->sdpa =
new SDPA();
744 assert( sdpisolver->sdpa != 0 );
749 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
753 feastol = FEASTOLCHANGE * FEASTOLCHANGE * sdpisolver->sdpsolverfeastol;
754 SCIPdebugMessage(
"Start solving process with stable settings\n");
758 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
759 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->gaptol);
760 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->sdpsolverfeastol);
761 feastol = sdpisolver->sdpsolverfeastol;
762 SCIPdebugMessage(
"Start solving process with fast settings\n");
766 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
768 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
769 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
771 SCIPdebugMessage(
"Start solving process with medium settings\n");
775 SCIPdebugMessage(
"Unknown setting for start-settings: %d!\n", startsettings); \
778 sdpisolver->sdpa->setParameterLowerBound(-1e20);
783 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
785 sdpisolver->sdpa->setParameterUpperBound(1e8);
788 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
790 #ifdef SCIP_MORE_DEBUG
791 sdpisolver->sdpa->printParameters(stdout);
795 sdpisolver->nvarbounds = 0;
796 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
798 if ( sdpisolver->nactivevars != oldnactivevars )
800 if ( sdpisolver->varboundpos == NULL )
802 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nactivevars) );
806 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * oldnactivevars, 2 * sdpisolver->nactivevars) );
809 assert( sdpisolver->varboundpos != NULL );
811 for (i = 0; i < sdpisolver->nactivevars; i++)
813 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
816 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
817 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
818 (sdpisolver->nvarbounds)++;
822 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
823 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
824 (sdpisolver->nvarbounds)++;
831 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &rowmapper, 2*noldlpcons) );
836 for (i = 0; i < noldlpcons; i++)
838 if ( rownactivevars[i] >= 2 )
842 rowmapper[2*i] = pos;
849 rowmapper[2*i + 1] = pos;
853 rowmapper[2*i + 1] = -1;
860 rowmapper[2*i + 1] = -1;
864 assert( nlpineqs <= 2*nlpcons );
870 if ( penaltyparam >= sdpisolver->epsilon && rbound )
871 sdpisolver->nvarbounds++;
873 if ( sdpisolver->sdpinfo )
874 sdpisolver->sdpa->setDisplay(stdout);
876 sdpisolver->sdpa->setDisplay(0);
878 #ifdef SCIP_MORE_DEBUG
879 FILE* fpOut = fopen(
"output.tmp",
"w");
882 sdpisolver->sdpa->setResultFile(fpOut);
886 if ( penaltyparam < sdpisolver->epsilon )
887 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
889 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
892 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
893 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
896 for (block = 0; block < nsdpblocks; block++)
898 if ( blockindchanges[block] >= 0 )
900 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
901 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
902 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
903 (
long long) sdpblocksizes[block] - nremovedinds[block]);
904 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
907 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
910 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
911 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
912 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
913 -(nlpineqs + sdpisolver->nvarbounds));
916 sdpisolver->sdpa->initializeUpperTriangleSpace();
919 for (i = 0; i < sdpisolver->nactivevars; i++)
924 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
925 #ifdef SCIP_MORE_DEBUG
926 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
927 sdpisolver->sdpatoinputmapper[i], i+1);
930 if ( penaltyparam >= sdpisolver->epsilon )
931 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
936 sdpisolver->sdpa->setInitPoint(
true);
938 sdpisolver->sdpa->setInitPoint(
false);
946 assert( nsdpblocks > 0 );
947 assert( sdpnblockvarnonz != NULL );
948 assert( sdpnblockvars != NULL );
949 assert( sdpcol != NULL );
950 assert( sdprow != NULL );
951 assert( sdpval != NULL );
952 assert( sdpvar != NULL );
953 assert( indchanges != NULL );
954 assert( nremovedinds != NULL );
956 for (block = 0; block < nsdpblocks; block++)
959 if ( blockindchanges[block] == -1 )
961 #ifdef SCIP_MORE_DEBUG
962 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
965 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
967 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
969 #ifdef SCIP_MORE_DEBUG
970 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
971 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
977 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
980 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
982 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
983 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
985 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
986 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
989 #ifdef SCIP_MORE_DEBUG
990 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
991 sdpval[block][blockvar][k],
992 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
993 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
994 sdpisolver->sdpcounter);
997 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
998 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
999 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
1000 sdpval[block][blockvar][k], checkinput);
1005 if ( penaltyparam >= sdpisolver->epsilon )
1007 #ifdef SCIP_MORE_DEBUG
1008 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
1010 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1012 #ifdef SCIP_MORE_DEBUG
1013 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
1016 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
1017 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
1024 if ( sdpconstnnonz > 0 )
1026 assert( nsdpblocks > 0 );
1027 assert( sdpconstnblocknonz!= NULL );
1028 assert( sdpconstcol != NULL );
1029 assert( sdpconstrow != NULL );
1030 assert( sdpconstval != NULL );
1032 for (block = 0; block < nsdpblocks; block++)
1034 if ( blockindchanges[block] == -1 )
1036 #ifdef SCIP_MORE_DEBUG
1037 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
1039 for (k = 0; k < sdpconstnblocknonz[block]; k++)
1042 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
1044 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
1045 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
1047 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
1048 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
1051 #ifdef SCIP_MORE_DEBUG
1052 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
1053 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1054 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1055 sdpisolver->sdpcounter);
1057 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
1058 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
1059 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
1060 sdpconstval[block][k], checkinput);
1065 #ifdef SCIP_MORE_DEBUG
1066 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
1070 for (i = 0; i < lpnnonz; i++)
1072 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
1073 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
1074 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
1077 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1080 assert( rownactivevars[lprow[i]] > 0 );
1081 if ( rownactivevars[lprow[i]] > 1 )
1083 if ( lprow[i] > lastrow )
1087 if ( penaltyparam >= sdpisolver->epsilon )
1090 if ( rowmapper[2*lastrow] > -1 )
1092 #ifdef SCIP_MORE_DEBUG
1093 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1094 rowmapper[2*lastrow], rowmapper[2*lastrow], sdpisolver->sdpcounter);
1098 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1099 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], 1.0, checkinput);
1103 if ( rowmapper[2*lastrow + 1] > -1 )
1105 #ifdef SCIP_MORE_DEBUG
1106 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
1107 rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
1111 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1112 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], 1.0, checkinput);
1117 if ( rowmapper[2*lastrow] > -1 )
1119 #ifdef SCIP_MORE_DEBUG
1120 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1121 lpval[i], rowmapper[2*lastrow], rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1124 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1125 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], lpval[i], checkinput);
1128 if ( rowmapper[2*lastrow + 1] > -1 )
1130 #ifdef SCIP_MORE_DEBUG
1131 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1132 -1 * lpval[i], rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
1136 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
1137 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
1145 for (i = 0; i < nlpcons; i++)
1150 #ifdef SCIP_MORE_DEBUG
1151 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1154 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1155 (
long long) lpconsind, lplhs[i], checkinput);
1162 #ifdef SCIP_MORE_DEBUG
1163 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
1167 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
1168 (
long long) lpconsind, -1 * lprhs[i], checkinput);
1173 assert( lpconsind == nlpineqs + 1 );
1176 #ifdef SCIP_MORE_DEBUG
1179 for (i = 0; i < lpnnonz; i++)
1182 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
1184 if ( rownactivevars[lprow[i]] > 1 )
1186 if ( lprow[i] > lastrow )
1191 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1193 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1198 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"%f <= ", lplhs[ind]);
1200 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"+ %f <x%d> ", lpval[i], lpcol[i]);
1207 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
" <= %f\n", lprhs[ind]);
1209 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
1211 assert( ind == nlpcons - 1 );
1216 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &rowmapper);
1220 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) || (! rbound) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
1222 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
1225 if ( sdpisolver->varboundpos[i] < 0 )
1229 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1230 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1232 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1235 #ifdef SCIP_MORE_DEBUG
1236 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1237 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1238 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1240 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1241 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
1246 #ifdef SCIP_MORE_DEBUG
1247 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1248 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
1249 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1259 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1260 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1262 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1265 #ifdef SCIP_MORE_DEBUG
1266 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1267 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1268 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1270 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1271 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1276 #ifdef SCIP_MORE_DEBUG
1277 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1278 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1279 sdpisolver->varboundpos[i]);
1285 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1288 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1289 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1290 #ifdef SCIP_MORE_DEBUG
1291 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1296 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &sdpavarbounds);
1299 sdpisolver->sdpa->initializeUpperTriangle();
1300 sdpisolver->sdpa->initializeSolve();
1303 if ( start != NULL && penaltyparam < sdpisolver->epsilon )
1305 SCIPdebugMessage(
"Starting with a previous solution is not yet tested for the interface, only x-vector is given, not y and Z");
1306 for (i = 1; i <= sdpisolver->nactivevars; i++)
1307 sdpisolver->sdpa->inputInitXVec((
long long) i, start[sdpisolver->sdpatoinputmapper[i] - 1]);
1309 else if ( penaltyparam >= sdpisolver->epsilon )
1310 SCIPdebugMessage(
"Skipping insertion of starting point, as this is not yet supported for penalty formulation.\n");
1312 #ifdef SCIP_DEBUG_PRINTTOFILE
1314 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1315 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1318 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1319 sdpisolver->sdpa->solve();
1320 sdpisolver->solved = TRUE;
1323 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1324 sdpisolver->nsdpcalls += 1;
1328 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1329 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1335 else if ( penaltyparam >= sdpisolver->epsilon )
1340 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1341 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1342 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1349 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1352 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1353 sdpisolver->sdpa->setParameterEpsilonStar(
GAPTOLCHANGE * sdpisolver->gaptol);
1354 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->sdpsolverfeastol);
1355 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1358 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1360 sdpisolver->sdpa->setParameterUpperBound(1e8);
1363 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1365 #ifdef SCIP_MORE_DEBUG
1366 sdpisolver->sdpa->printParameters(stdout);
1368 sdpisolver->sdpa->setInitPoint(
false);
1369 #ifdef SDPA_RESETPARAMS
1370 sdpisolver->sdpa->resetParameters();
1372 sdpisolver->sdpa->initializeSolve();
1374 sdpisolver->sdpa->solve();
1375 sdpisolver->solved = TRUE;
1378 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1379 sdpisolver->nsdpcalls += 1;
1387 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1388 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1393 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1394 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1395 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1402 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1405 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1408 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1411 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1413 sdpisolver->sdpa->setParameterUpperBound(1e8);
1416 sdpisolver->sdpa->setParameterLambdaStar(sdpisolver->lambdastar);
1418 #ifdef SCIP_MORE_DEBUG
1419 sdpisolver->sdpa->printParameters(stdout);
1421 sdpisolver->sdpa->setInitPoint(
false);
1422 #ifdef SDPA_RESETPARAMS
1423 sdpisolver->sdpa->resetParameters();
1425 sdpisolver->sdpa->initializeSolve();
1427 sdpisolver->sdpa->solve();
1428 sdpisolver->solved = TRUE;
1431 sdpisolver->niterations += (int) sdpisolver->sdpa->getIteration();
1432 sdpisolver->nsdpcalls += 1;
1440 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1441 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1446 SCIP_CALL(
checkFeastolAndResolve(sdpisolver, penaltyparam, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1447 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
1448 nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval, &feastol) );
1451 #ifdef SCIP_MORE_DEBUG
1452 (void) fclose(fpOut);
1456 if ( penaltyparam >= sdpisolver->epsilon )
1463 SCIP_Real trace = 0.0;
1466 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1468 sdpasol = sdpisolver->sdpa->getResultXVec();
1471 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1476 sdpisolver->feasorig = *feasorig;
1480 if ( ! *feasorig && penaltybound != NULL )
1484 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1489 nblockssdpa = (int) sdpisolver->sdpa->getBlockNumber();
1490 for (b = 1; b <= nblockssdpa; b++)
1493 X = sdpisolver->sdpa->getResultYMat((
long long) b);
1494 nrow = (int) sdpisolver->sdpa->getBlockSize((
long long) b);
1495 assert( nrow >= 0 );
1498 if ( sdpisolver->sdpa->getBlockType((
long long) b) == SDPA::LP )
1501 for (i = 0; i < nrow - sdpisolver->nvarbounds; i++)
1507 for (i = 0; i < nrow; i++)
1508 trace += X[i + i*nrow];
1515 if ( penaltybound != NULL )
1516 *penaltybound = TRUE;
1517 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1518 trace, penaltyparam);
1520 else if ( penaltybound != NULL )
1521 *penaltybound = FALSE;
1547 assert( sdpisolver != NULL );
1548 return sdpisolver->solved;
1561 SDPA::PhaseType phasetype;
1563 assert( sdpisolver != NULL );
1564 assert( sdpisolver->sdpa != NULL);
1567 phasetype = sdpisolver->sdpa->getPhaseValue();
1569 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1578 SCIP_Bool* primalfeasible,
1579 SCIP_Bool* dualfeasible
1582 SDPA::PhaseType phasetype;
1584 assert( sdpisolver != NULL );
1585 assert( sdpisolver->sdpa != NULL );
1586 assert( primalfeasible != NULL );
1587 assert( dualfeasible != NULL );
1590 phasetype = sdpisolver->sdpa->getPhaseValue();
1592 switch ( phasetype )
1595 *primalfeasible = TRUE;
1596 *dualfeasible = TRUE;
1599 *primalfeasible = TRUE;
1600 *dualfeasible = TRUE;
1602 case SDPA::pFEAS_dINF:
1603 *primalfeasible = TRUE;
1604 *dualfeasible = FALSE;
1606 case SDPA::pINF_dFEAS:
1607 *primalfeasible = FALSE;
1608 *dualfeasible = TRUE;
1611 *primalfeasible = TRUE;
1612 *dualfeasible = FALSE;
1613 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
1616 *primalfeasible = FALSE;
1617 *dualfeasible = TRUE;
1618 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
1621 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
1622 return SCIP_LPERROR;
1634 SDPA::PhaseType phasetype;
1636 assert( sdpisolver != NULL );
1637 assert( sdpisolver->sdpa != NULL );
1640 phasetype = sdpisolver->sdpa->getPhaseValue();
1642 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1644 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
1647 else if ( phasetype == SDPA::pFEAS_dINF )
1649 else if ( phasetype == SDPA::pUNBD )
1651 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1664 SDPA::PhaseType phasetype;
1666 assert( sdpisolver != NULL );
1667 assert( sdpisolver->sdpa != NULL );
1670 phasetype = sdpisolver->sdpa->getPhaseValue();
1672 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1674 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
1677 else if ( phasetype == SDPA::pINF_dFEAS )
1679 else if ( phasetype == SDPA::dUNBD )
1681 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1694 SDPA::PhaseType phasetype;
1696 assert( sdpisolver != NULL );
1697 assert( sdpisolver->sdpa != NULL );
1700 phasetype = sdpisolver->sdpa->getPhaseValue();
1702 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1704 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1707 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
1709 else if ( phasetype == SDPA::dUNBD )
1711 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1724 SDPA::PhaseType phasetype;
1726 assert( sdpisolver != NULL );
1727 assert( sdpisolver->sdpa != NULL);
1730 phasetype = sdpisolver->sdpa->getPhaseValue();
1732 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1734 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
1737 else if ( phasetype == SDPA::pINF_dFEAS )
1739 else if ( phasetype == SDPA::dUNBD )
1741 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1754 SDPA::PhaseType phasetype;
1756 assert( sdpisolver != NULL );
1757 assert( sdpisolver->sdpa != NULL);
1760 phasetype = sdpisolver->sdpa->getPhaseValue();
1762 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1764 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
1767 else if ( phasetype == SDPA::pFEAS_dINF )
1769 else if ( phasetype == SDPA::pUNBD )
1771 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1784 SDPA::PhaseType phasetype;
1786 assert( sdpisolver != NULL );
1787 assert( sdpisolver->sdpa != NULL);
1790 phasetype = sdpisolver->sdpa->getPhaseValue();
1792 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1794 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1797 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1799 else if ( phasetype == SDPA::dUNBD )
1801 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1813 SDPA::PhaseType phasetype;
1815 assert( sdpisolver != NULL );
1816 assert( sdpisolver->sdpa != NULL );
1819 phasetype = sdpisolver->sdpa->getPhaseValue();
1821 if ( phasetype == SDPA::pdOPT )
1832 SDPA::PhaseType phasetype;
1834 assert( sdpisolver != NULL );
1835 assert( sdpisolver->sdpa != NULL );
1838 phasetype = sdpisolver->sdpa->getPhaseValue();
1840 if ( phasetype == SDPA::pUNBD )
1851 SDPA::PhaseType phasetype;
1853 assert( sdpisolver != NULL );
1854 assert( sdpisolver->sdpa != NULL);
1857 phasetype = sdpisolver->sdpa->getPhaseValue();
1859 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1861 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
1873 assert( sdpisolver != NULL );
1875 return sdpisolver->timelimit;
1892 SDPA::PhaseType phasetype;
1894 assert( sdpisolver != NULL );
1895 assert( sdpisolver->sdpa != NULL );
1897 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
1900 phasetype = sdpisolver->sdpa->getPhaseValue();
1902 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
1904 if ( phasetype == SDPA::pdINF )
1906 if ( phasetype == SDPA::pUNBD)
1908 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1919 SDPA::PhaseType phasetype;
1921 assert( sdpisolver != NULL );
1922 assert( sdpisolver->sdpa != NULL );
1924 if ( ! sdpisolver->solved )
1927 phasetype = sdpisolver->sdpa->getPhaseValue();
1929 if ( phasetype == SDPA::pdOPT )
1941 SDPA::PhaseType phasetype;
1943 assert( sdpisolver != NULL );
1944 assert( sdpisolver->sdpa != NULL );
1946 if ( sdpisolver->timelimit )
1949 if ( ! sdpisolver->solved )
1952 phasetype = sdpisolver->sdpa->getPhaseValue();
1956 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
1968 SCIPdebugMessage(
"Not implemented yet\n");
1970 return SCIP_LPERROR;
1979 assert( sdpisolver != NULL );
1980 assert( sdpisolver->sdpa != NULL );
1981 assert( objval != NULL );
1984 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
1986 *objval = sdpisolver->sdpa->getPrimalObj();
1988 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
1989 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
1990 if ( gap > sdpisolver->gaptol )
1992 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
1993 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2004 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2005 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2006 sdpasol = sdpisolver->sdpa->getResultXVec();
2009 for (v = 0; v < sdpisolver->nactivevars; v++)
2011 if ( REALABS(sdpasol[v]) > sdpisolver->epsilon )
2012 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2017 *objval += sdpisolver->fixedvarsobjcontr;
2037 assert( sdpisolver != NULL );
2038 assert( sdpisolver->sdpa != NULL );
2039 assert( dualsollength != NULL );
2042 if ( objval != NULL )
2044 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ) )
2046 *objval = sdpisolver->sdpa->getPrimalObj();
2048 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
2049 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
2050 if ( gap > sdpisolver->gaptol )
2052 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
2053 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
2061 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2062 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2063 sdpasol = sdpisolver->sdpa->getResultXVec();
2066 for (v = 0; v < sdpisolver->nactivevars; v++)
2068 if ( REALABS(sdpasol[v]) > sdpisolver->epsilon )
2069 *objval += sdpasol[v] * sdpisolver->objcoefs[v];
2074 *objval += sdpisolver->fixedvarsobjcontr;
2077 if ( *dualsollength > 0 )
2079 assert( dualsol != NULL );
2080 if ( *dualsollength < sdpisolver->nvars )
2082 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2083 *dualsollength = sdpisolver->nvars;
2089 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
2090 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
2091 sdpasol = sdpisolver->sdpa->getResultXVec();
2093 for (v = 0; v < sdpisolver->nvars; v++)
2095 if ( sdpisolver->inputtosdpamapper[v] > 0 )
2098 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
2103 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
2104 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
2131 assert( sdpisolver != NULL );
2132 assert( sdpisolver->sdpa != NULL );
2133 assert( lbvars != NULL );
2134 assert( ubvars != NULL );
2135 assert( arraylength != NULL );
2136 assert( *arraylength >= 0 );
2140 if ( *arraylength < sdpisolver->nvars )
2142 *arraylength = sdpisolver->nvars;
2143 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2148 for (i = 0; i < sdpisolver->nvars; i++)
2155 if ( sdpisolver->nvarbounds == 0 )
2157 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
2162 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
2163 assert( sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP );
2164 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
2165 assert( nlpcons >= 0 );
2167 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
2170 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
2172 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
2174 if ( sdpisolver->varboundpos[i] < 0 )
2178 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2184 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
2197 assert( sdpisolver != NULL );
2198 assert( sdpisolver->sdpa != NULL );
2199 assert( iterations != NULL );
2201 *iterations = sdpisolver->niterations;
2212 assert( sdpisolver != NULL );
2213 assert( sdpisolver->sdpa != NULL );
2214 assert( calls != NULL );
2216 *calls = sdpisolver->nsdpcalls;
2227 assert( sdpisolver != NULL );
2228 assert( usedsetting != NULL );
2231 *usedsetting = sdpisolver->usedsetting;
2272 assert( sdpisolver != NULL );
2273 assert( dval != NULL );
2278 *dval = sdpisolver->epsilon;
2281 *dval = sdpisolver->gaptol;
2284 *dval = sdpisolver->feastol;
2287 *dval = sdpisolver->sdpsolverfeastol;
2291 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
2294 *dval = sdpisolver->objlimit;
2297 *dval = sdpisolver->lambdastar;
2300 return SCIP_PARAMETERUNKNOWN;
2313 assert( sdpisolver != NULL );
2318 sdpisolver->epsilon = dval;
2319 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2322 sdpisolver->gaptol = dval;
2323 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2326 sdpisolver->feastol = dval;
2327 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2330 sdpisolver->sdpsolverfeastol = dval;
2331 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2334 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_PENALTYPARAM not used by SDPA");
2337 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2338 sdpisolver->objlimit = dval;
2341 SCIPdebugMessage(
"Setting sdpisolver lambdastar parameter to %f.\n", dval);
2342 sdpisolver->lambdastar = dval;
2345 return SCIP_PARAMETERUNKNOWN;
2358 assert( sdpisolver != NULL );
2363 *ival = (int) sdpisolver->sdpinfo;
2364 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2367 return SCIP_PARAMETERUNKNOWN;
2380 assert( sdpisolver != NULL );
2385 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2386 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2389 return SCIP_PARAMETERUNKNOWN;
2403 assert( sdpisolver != NULL );
2408 #ifdef LAMBDASTAR_TWOPOINTS
2429 sdpisolver->lambdastar = compval;
2430 SCIPdebugMessage(
"Setting lambdastar to %f.\n", compval);
2440 SCIP_Real* penaltyparam
2445 assert( sdpisolver != NULL );
2446 assert( penaltyparam != NULL );
2462 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2463 *penaltyparam = compval;
2471 SCIP_Real penaltyparam,
2472 SCIP_Real* maxpenaltyparam
2477 assert( sdpisolver != NULL );
2478 assert( maxpenaltyparam != NULL );
2484 *maxpenaltyparam = compval;
2485 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2514 SCIPdebugMessage(
"Not implemented yet\n");
2515 return SCIP_LPERROR;
2524 assert( fname != NULL );
2526 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
const char * SCIPsdpiSolverGetSolverName(void)
static SCIP_RETCODE checkFeastolAndResolve(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, 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, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *feastol)
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
#define INFEASFEASTOLCHANGE
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
#define PENALTYPARAM_FACTOR
const char * SCIPsdpiSolverGetSolverDesc(void)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
interface methods for specific SDP-solvers
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
#define MAXPENALTYPARAM_FACTOR
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverFeastol(void)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
#define LAMBDASTAR_THRESHOLD
SCIP_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
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, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
#define LAMBDASTAR_FACTOR
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
checks a given SDP solution for feasibility
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
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, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
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, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *lprownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)