48 #pragma GCC diagnostic ignored "-Wstrict-prototypes" 
   49 #include "sdpa_call.h"                        
   50 #pragma GCC diagnostic warning "-Wstrict-prototypes" 
   52 #include "blockmemshell/memory.h"             
   54 #include "scip/pub_misc.h"                    
   56 #define EPSILONCHANGE   0.1  
   57 #define FEASTOLCHANGE   0.1  
   60 #define BMS_CALL(x)   do                                                                                     \ 
   64                             SCIPerrorMessage("No memory in function call.\n");                               \ 
   65                             return SCIP_NOMEMORY;                                                            \ 
   71 #define CHECK_IF_SOLVED(sdpisolver)  do                                                                      \ 
   73                          if (!(sdpisolver->solved))                                                          \ 
   75                             SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter);  \ 
   76                             return SCIP_LPERROR;                                                             \ 
   82 #define CHECK_IF_SOLVED_BOOL(sdpisolver)  do                                                                 \ 
   84                          if (!(sdpisolver->solved))                                                          \ 
   86                             SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter);  \ 
   94 struct SCIP_SDPiSolver
 
   96    SCIP_MESSAGEHDLR*     messagehdlr;        
 
  101    int*                  inputtosdpamapper;  
 
  104    int*                  sdpatoinputmapper;  
 
  105    SCIP_Real*            fixedvarsval;       
 
  106    SCIP_Real             fixedvarsobjcontr;  
 
  137    assert( sdpisolver != NULL );
 
  138    assert( lb < ub + sdpisolver->feastol );
 
  140    return (REALABS(ub-lb) <= sdpisolver->feastol);
 
  143 #define isFixed(sdpisolver,lb,ub) (REALABS(ub-lb) <= sdpisolver->feastol) 
  168    return "Primal-dual Interior Point Solver for Semidefinite Programming developed by Katsuki Fujisawa et al. (sdpa.sourceforge.net)";
 
  181    assert( sdpisolver != NULL );
 
  182    return (
void*) sdpisolver->sdpa;
 
  198    SCIP_MESSAGEHDLR*     messagehdlr,       
 
  202    assert( sdpisolver != NULL );
 
  203    assert( blkmem != NULL );
 
  205    SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
 
  207    BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
 
  209    (*sdpisolver)->messagehdlr = messagehdlr;
 
  210    (*sdpisolver)->blkmem = blkmem;
 
  213    (*sdpisolver)->sdpa = NULL;
 
  215    (*sdpisolver)->nvars = 0;
 
  216    (*sdpisolver)->nactivevars = 0;
 
  217    (*sdpisolver)->inputtosdpamapper = NULL;
 
  218    (*sdpisolver)->sdpatoinputmapper = NULL;
 
  219    (*sdpisolver)->fixedvarsval = NULL;
 
  220    (*sdpisolver)->fixedvarsobjcontr = 0.0;
 
  221    (*sdpisolver)->nvarbounds = 0;
 
  222    (*sdpisolver)->varboundpos = NULL;
 
  223    (*sdpisolver)->solved = FALSE;
 
  224    (*sdpisolver)->sdpcounter = 0;
 
  226    (*sdpisolver)->epsilon = 1e-5;
 
  227    (*sdpisolver)->feastol = 1e-4;
 
  230    (*sdpisolver)->threads = 1;
 
  232    (*sdpisolver)->sdpinfo = FALSE;
 
  242    assert( sdpisolver != NULL );
 
  243    assert( *sdpisolver != NULL );
 
  245    SCIPdebugMessage(
"Freeing SDPISolver\n");
 
  247    if (((*sdpisolver)->sdpa) != NULL)
 
  250       delete (*sdpisolver)->sdpa;
 
  253    BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nvars); 
 
  255    if ( (*sdpisolver)->nvars > 0 )
 
  256       BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
 
  258    if ( (*sdpisolver)->nactivevars > 0 )
 
  259       BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
 
  261    if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
 
  262       BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars); 
 
  264    BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
 
  274    assert( sdpisolver != NULL );
 
  276    sdpisolver->sdpcounter++;
 
  286    assert( sdpisolver != NULL );
 
  288    SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
 
  289    sdpisolver->sdpcounter = 0;
 
  326    int*                  sdpconstnblocknonz, 
 
  330    SCIP_Real**           sdpconstval,        
 
  332    int**                 sdpnblockvarnonz,   
 
  342    int*                  blockindchanges,    
 
  348    int*                           lprownactivevars,   
 
  356    return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
 
  357                sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
 
  358                nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval, start, NULL);
 
  382    SCIP_Real             penaltyparam,       
 
  393    int*                  sdpconstnblocknonz, 
 
  397    SCIP_Real**           sdpconstval,        
 
  399    int**                 sdpnblockvarnonz,   
 
  409    int*                  blockindchanges,    
 
  425    SCIP_Real* sdpavarbounds;
 
  437 #ifdef SCIP_MORE_DEBUG 
  442    char phase_string[15];
 
  445    assert( sdpisolver != NULL );
 
  446    assert( penaltyparam > -1 * sdpisolver->epsilon );
 
  447    assert( penaltyparam < sdpisolver->epsilon || feasorig != NULL );
 
  449    assert( obj != NULL );
 
  450    assert( lb != NULL );
 
  451    assert( ub != NULL );
 
  452    assert( nsdpblocks >= 0 );
 
  453    assert( nsdpblocks == 0 || sdpblocksizes != NULL );
 
  454    assert( nsdpblocks == 0 || sdpnblockvars != NULL );
 
  455    assert( sdpconstnnonz >= 0 );
 
  456    assert( nsdpblocks == 0 || sdpconstnblocknonz != NULL );
 
  457    assert( nsdpblocks == 0 || sdpconstrow != NULL );
 
  458    assert( nsdpblocks == 0 || sdpconstcol != NULL );
 
  459    assert( nsdpblocks == 0 || sdpconstval != NULL );
 
  460    assert( sdpnnonz >= 0 );
 
  461    assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
 
  462    assert( nsdpblocks == 0 || sdpvar != NULL );
 
  463    assert( nsdpblocks == 0 || sdprow != NULL );
 
  464    assert( nsdpblocks == 0 || sdpcol != NULL );
 
  465    assert( nsdpblocks == 0 || sdpval != NULL );
 
  466    assert( nsdpblocks == 0 || indchanges != NULL );
 
  467    assert( nsdpblocks == 0 || nremovedinds != NULL );
 
  468    assert( nsdpblocks == 0 || blockindchanges != NULL );
 
  469    assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
 
  470    assert( nlpcons >= 0 );
 
  471    assert( noldlpcons >= nlpcons );
 
  472    assert( nlpcons == 0 || lplhs != NULL );
 
  473    assert( nlpcons == 0 || lprhs != NULL );
 
  474    assert( nlpcons == 0 || rownactivevars != NULL );
 
  475    assert( lpnnonz >= 0 );
 
  476    assert( nlpcons == 0 || lprow != NULL );
 
  477    assert( nlpcons == 0 || lpcol != NULL );
 
  478    assert( nlpcons == 0 || lpval != NULL );
 
  488    if ( penaltyparam < sdpisolver->epsilon )
 
  489       SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
 
  491       SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
 
  494    sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
 
  495    sdpisolver->rbound = rbound;
 
  499    BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
 
  500    BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
 
  501    BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) ); 
 
  503    sdpisolver->nvars = nvars;
 
  504    sdpisolver->nactivevars = 0;
 
  508    sdpisolver->fixedvarsobjcontr = 0.0;
 
  509    for (i = 0; i < nvars; i++)
 
  511       if ( 
isFixed(sdpisolver, lb[i], ub[i]) )
 
  513          sdpisolver->fixedvarsobjcontr += obj[i] * lb[i]; 
 
  514          sdpisolver->fixedvarsval[nfixedvars] = lb[i]; 
 
  516          sdpisolver->inputtosdpamapper[i] = -nfixedvars;
 
  517          SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
 
  521          sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
 
  522          sdpisolver->nactivevars++;
 
  523          sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars; 
 
  524 #ifdef SCIP_MORE_DEBUG 
  525          SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
 
  529    assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
 
  533       sdpisolver->fixedvarsobjcontr = 0.0;
 
  536    BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
 
  537    BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
 
  540    if ( sdpisolver->sdpa != 0 )
 
  543       delete sdpisolver->sdpa;
 
  544       sdpisolver->sdpa = 
new SDPA();
 
  547       sdpisolver->sdpa = 
new SDPA();
 
  548    assert( sdpisolver->sdpa != 0 );
 
  551    sdpisolver->nvarbounds = 0;
 
  552    BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) ); 
 
  553    if ( sdpisolver->varboundpos == NULL )
 
  555       BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nvars) ); 
 
  557    for (i = 0; i < sdpisolver->nactivevars; i++)
 
  559       assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
 
  562          sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
 
  563          sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1); 
 
  564          (sdpisolver->nvarbounds)++;
 
  568          sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
 
  569          sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1); 
 
  570          (sdpisolver->nvarbounds)++;
 
  577       BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2*noldlpcons) );  
 
  582       for (i = 0; i < noldlpcons; i++)
 
  584          if ( rownactivevars[i] >= 2 )
 
  588                rowmapper[2*i] = pos; 
 
  595                rowmapper[2*i + 1] = pos; 
 
  599                rowmapper[2*i + 1] = -1; 
 
  606             rowmapper[2*i + 1] = -1; 
 
  610       assert( nlpineqs <= 2*nlpcons ); 
 
  616    if ( penaltyparam >= sdpisolver->epsilon && rbound )
 
  617       sdpisolver->nvarbounds++;
 
  619    if ( sdpisolver->sdpinfo )
 
  620       sdpisolver->sdpa->setDisplay(stdout);
 
  622       sdpisolver->sdpa->setDisplay(0);
 
  624 #ifdef SCIP_MORE_DEBUG 
  625    FILE* fpOut = fopen(
"output.tmp", 
"w");
 
  628    sdpisolver->sdpa->setResultFile(fpOut);
 
  633       sdpisolver->sdpa->setInitPoint(
true);
 
  636    if ( penaltyparam < sdpisolver->epsilon ) 
 
  637       sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
 
  639       sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1); 
 
  642    sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
 
  643          nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks)); 
 
  646    for (block = 0; block < nsdpblocks; block++)
 
  648       if ( blockindchanges[block] >= 0 )
 
  650          SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
 
  651                block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]); 
 
  652          sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
 
  653                (
long long) sdpblocksizes[block] - nremovedinds[block]); 
 
  654          sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP); 
 
  657    if ( nlpineqs + sdpisolver->nvarbounds > 0 )
 
  660       sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds)); 
 
  661       sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP); 
 
  662       SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
 
  663             -(nlpineqs + sdpisolver->nvarbounds)); 
 
  665    sdpisolver->sdpa->initializeUpperTriangleSpace();
 
  668    for (i = 0; i < sdpisolver->nactivevars; i++)
 
  673          sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
 
  674 #ifdef SCIP_MORE_DEBUG 
  675          SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
 
  676                sdpisolver->sdpatoinputmapper[i], i+1);
 
  679       if ( penaltyparam >= sdpisolver->epsilon )
 
  680          sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam); 
 
  689       assert( nsdpblocks > 0 );
 
  690       assert( sdpnblockvarnonz != NULL );
 
  691       assert( sdpnblockvars != NULL );
 
  692       assert( sdpcol != NULL );
 
  693       assert( sdprow != NULL );
 
  694       assert( sdpval != NULL );
 
  695       assert( sdpvar != NULL );
 
  696       assert( indchanges != NULL );
 
  697       assert( nremovedinds != NULL );
 
  699       for (block = 0; block < nsdpblocks; block++)
 
  702          if ( blockindchanges[block] == -1 )
 
  704 #ifdef SCIP_MORE_DEBUG 
  705          SCIPdebugMessage(
"   -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
 
  708          for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
 
  710             v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
 
  712 #ifdef SCIP_MORE_DEBUG 
  713             SCIPdebugMessage(
"      -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
 
  714                              sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
 
  720                for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
 
  723                   assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
 
  725                   assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
 
  726                   assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
 
  728                   assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
 
  729                   assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
 
  732 #ifdef SCIP_MORE_DEBUG 
  733                   SCIPdebugMessage(
"         -> adding nonzero %g at (%d,%d) (%d)\n",
 
  734                         sdpval[block][blockvar][k],
 
  735                         sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
 
  736                         sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
 
  737                         sdpisolver->sdpcounter);
 
  740                   sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1, 
 
  741                         (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1, 
 
  742                         (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1, 
 
  743                         sdpval[block][blockvar][k], checkinput); 
 
  748          if ( penaltyparam >= sdpisolver->epsilon )
 
  750 #ifdef SCIP_MORE_DEBUG 
  751             SCIPdebugMessage(
"      -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
 
  753             for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
 
  755 #ifdef SCIP_MORE_DEBUG 
  756                   SCIPdebugMessage(
"         -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
 
  759                   sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1, 
 
  760                         (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
 
  767    if ( sdpconstnnonz > 0 )
 
  769       assert( nsdpblocks > 0 );
 
  770       assert( sdpconstnblocknonz!= NULL );
 
  771       assert( sdpconstcol != NULL );
 
  772       assert( sdpconstrow != NULL );
 
  773       assert( sdpconstval != NULL );
 
  775       for (block = 0; block < nsdpblocks; block++)
 
  777          if ( blockindchanges[block] == -1 )
 
  779 #ifdef SCIP_MORE_DEBUG 
  780          SCIPdebugMessage(
"   -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
 
  782          for (k = 0; k < sdpconstnblocknonz[block]; k++)
 
  785             assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
 
  787             assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
 
  788             assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
 
  790             assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
 
  791             assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
 
  794 #ifdef SCIP_MORE_DEBUG 
  795             SCIPdebugMessage(
"         -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
 
  796                sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
 
  797                sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
 
  798                sdpisolver->sdpcounter);
 
  800             sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1, 
 
  801                (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1, 
 
  802                (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1, 
 
  803                sdpconstval[block][k], checkinput);
 
  808 #ifdef SCIP_MORE_DEBUG 
  809          SCIPdebugMessage(
"   -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
 
  813    for (i = 0; i < lpnnonz; i++)
 
  815       assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
 
  816       assert( 0 <= lpcol[i] && lpcol[i] < nvars );
 
  817       assert( REALABS(lpval[i]) > sdpisolver->epsilon );
 
  820       if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
 
  823          assert( rownactivevars[lprow[i]] > 0 );
 
  824          if ( rownactivevars[lprow[i]] > 1 )
 
  826             if ( lprow[i] > lastrow )  
 
  830                if ( penaltyparam >= sdpisolver->epsilon )
 
  833                   if ( rowmapper[2*lastrow] > -1 ) 
 
  835 #ifdef SCIP_MORE_DEBUG 
  836             SCIPdebugMessage(
"         -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
 
  837                   rowmapper[2*lastrow], rowmapper[2*lastrow], sdpisolver->sdpcounter);
 
  841                      sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1, 
 
  842                            (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], 1.0, checkinput); 
 
  846                   if ( rowmapper[2*lastrow + 1] > -1 ) 
 
  848 #ifdef SCIP_MORE_DEBUG 
  849             SCIPdebugMessage(
"         -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
 
  850                   rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
 
  854                      sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1, 
 
  855                            (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], 1.0, checkinput); 
 
  860             if ( rowmapper[2*lastrow] > -1 ) 
 
  862 #ifdef SCIP_MORE_DEBUG 
  863             SCIPdebugMessage(
"         -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
  864                lpval[i], rowmapper[2*lastrow], rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
 
  867                sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1, 
 
  868                      (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], lpval[i], checkinput); 
 
  871             if ( rowmapper[2*lastrow + 1] > -1 ) 
 
  873 #ifdef SCIP_MORE_DEBUG 
  874             SCIPdebugMessage(
"         -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
  875                -1 * lpval[i], rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
 
  879                sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1, 
 
  880                      (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput); 
 
  888    for (i = 0; i < nlpcons; i++)
 
  893 #ifdef SCIP_MORE_DEBUG 
  894          SCIPdebugMessage(
"         -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
 
  897          sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind, 
 
  898                (
long long) lpconsind, lplhs[i], checkinput);
 
  904 #ifdef SCIP_MORE_DEBUG 
  905          SCIPdebugMessage(
"         -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
 
  909          sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind, 
 
  910                (
long long) lpconsind, -1 * lprhs[i], checkinput);
 
  915    assert( lpconsind == nlpineqs + 1 ); 
 
  918 #ifdef SCIP_MORE_DEBUG 
  921    for (i = 0; i < lpnnonz; i++)
 
  924       if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
 
  926          if ( rownactivevars[lprow[i]] > 1 )
 
  928             if ( lprow[i] > lastrow )  
 
  933                      printf(
" <= %f\n", lprhs[ind]);
 
  940                   printf(
"%f <= ", lplhs[ind]);
 
  942             printf(
"+ %f <x%d> ", lpval[i], lpcol[i]);
 
  949          printf(
" <= %f\n", lprhs[ind]);
 
  953    assert( ind == nlpcons - 1 ); 
 
  958       BMSfreeBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2 * noldlpcons);
 
  962    for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
 
  964       assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) ); 
 
  967       if ( sdpisolver->varboundpos[i] < 0 )
 
  971          sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1, 
 
  972                (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
 
  974          if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
 
  977 #ifdef SCIP_MORE_DEBUG 
  978             SCIPdebugMessage(
"         -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
  979                   sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
 
  980                   -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
 
  982             sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i, 
 
  983                   (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
 
  988 #ifdef SCIP_MORE_DEBUG 
  989             SCIPdebugMessage(
"         -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
  990                   nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
 
  991                -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
 
 1001          sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1, 
 
 1002                (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
 
 1004          if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
 
 1007 #ifdef SCIP_MORE_DEBUG 
 1008             SCIPdebugMessage(
"         -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
 1009                   sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
 
 1010                   sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
 
 1012             sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i, 
 
 1013                   (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
 
 1018 #ifdef SCIP_MORE_DEBUG 
 1019             SCIPdebugMessage(
"         -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
 
 1020                   0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
 
 1021                   sdpisolver->varboundpos[i]);
 
 1027    if ( penaltyparam >= sdpisolver->epsilon && rbound )
 
 1030       sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1, 
 
 1031             (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
 
 1032 #ifdef SCIP_MORE_DEBUG 
 1033       SCIPdebugMessage(
"         -> adding lower bound r >= 0 at (%d,%d)  in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
 
 1038    BMSfreeBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars); 
 
 1041    sdpisolver->sdpa->initializeUpperTriangle();
 
 1043 #ifdef SCIP_DEBUG_PRINTTOFILE 
 1045    sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
 
 1046    sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
 
 1049    sdpisolver->sdpa->initializeSolve();
 
 1052    if ( start != NULL && penaltyparam < sdpisolver->epsilon )
 
 1055       SCIPdebugMessage(
"Starting with a previous solution is not yet tested for the interface, only x-vector is given, not y and Z");
 
 1056       for (i = 1; i <= sdpisolver->nactivevars; i++) 
 
 1057          sdpisolver->sdpa->inputInitXVec((
long long) i, start[sdpisolver->sdpatoinputmapper[i] - 1]);
 
 1059    else if ( penaltyparam >= sdpisolver->epsilon )
 
 1060       SCIPdebugMessage(
"Skipping insertion of starting point, as this is not yet supported for penalty formulation.\n");
 
 1063    if ( penaltyparam < sdpisolver->epsilon )
 
 1065       sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
 
 1066       sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->epsilon);
 
 1067       sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->feastol);
 
 1071       sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW); 
 
 1076    sdpisolver->sdpa->setParameterLowerBound(-1e20);
 
 1080       sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
 
 1082       sdpisolver->sdpa->setParameterUpperBound(1e20);
 
 1083 #ifdef SCIP_MORE_DEBUG 
 1084    sdpisolver->sdpa->printParameters(stdout);
 
 1090    snprintf(str, 1024, 
"OMP_NUM_THREADS=%d", sdpisolver->threads);
 
 1091    int status = putenv(str);
 
 1094       SCIPdebugMessage(
"Setting the number of threads failed (%d, %d).\n", status, errno);
 
 1095       return SCIP_LPERROR;
 
 1099    SCIPdebugMessage(
"Calling SDPA solve (SDP: %d, threads: %d)\n", sdpisolver->sdpcounter, sdpisolver->sdpa->getNumThreads());
 
 1101    SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
 
 1103    sdpisolver->sdpa->solve();
 
 1104    sdpisolver->solved = TRUE;
 
 1108    sdpisolver->sdpa->getPhaseString((
char*)phase_string);
 
 1109    SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
 
 1116       SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
 
 1119       sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
 
 1120       sdpisolver->sdpa->setParameterEpsilonStar(
EPSILONCHANGE * sdpisolver->epsilon);
 
 1121       sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->feastol);
 
 1124          sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
 
 1126          sdpisolver->sdpa->setParameterUpperBound(1e20);
 
 1127 #ifdef SCIP_MORE_DEBUG 
 1128    sdpisolver->sdpa->printParameters(stdout);
 
 1130       sdpisolver->sdpa->solve();
 
 1131       sdpisolver->solved = TRUE;
 
 1135    sdpisolver->sdpa->getPhaseString((
char*)phase_string);
 
 1136    SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
 
 1142          SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
 
 1145          sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
 
 1150             sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
 
 1152             sdpisolver->sdpa->setParameterUpperBound(1e20);
 
 1153 #ifdef SCIP_MORE_DEBUG 
 1154    sdpisolver->sdpa->printParameters(stdout);
 
 1156          sdpisolver->sdpa->solve();
 
 1157          sdpisolver->solved = TRUE;
 
 1161    sdpisolver->sdpa->getPhaseString((
char*)phase_string);
 
 1162    SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
 
 1167 #ifdef SCIP_MORE_DEBUG 
 1168    (void) fclose(fpOut);
 
 1172    if ( penaltyparam >= sdpisolver->epsilon )
 
 1177       assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );  
 
 1179       sdpasol = sdpisolver->sdpa->getResultXVec();
 
 1182       *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol); 
 
 1185          SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
 
 1209    assert( sdpisolver != NULL );
 
 1210    return sdpisolver->solved;
 
 1223    SDPA::PhaseType phasetype;
 
 1225    assert( sdpisolver != NULL );
 
 1226    assert( sdpisolver->sdpa != NULL);
 
 1229    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1231    if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
 
 1240    SCIP_Bool*            primalfeasible,     
 
 1241    SCIP_Bool*            dualfeasible        
 
 1244    SDPA::PhaseType phasetype;
 
 1246    assert( sdpisolver != NULL );
 
 1247    assert( sdpisolver->sdpa != NULL );
 
 1248    assert( primalfeasible != NULL );
 
 1249    assert( dualfeasible != NULL );
 
 1252    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1254    switch ( phasetype )
 
 1257       *primalfeasible = TRUE;
 
 1258       *dualfeasible = TRUE;
 
 1261       *primalfeasible = TRUE;
 
 1262       *dualfeasible = TRUE;
 
 1264    case SDPA::pFEAS_dINF:
 
 1265       *primalfeasible = TRUE;
 
 1266       *dualfeasible = FALSE;
 
 1268    case SDPA::pINF_dFEAS:
 
 1269       *primalfeasible = FALSE;
 
 1270       *dualfeasible = TRUE;
 
 1273       *primalfeasible = TRUE;
 
 1274       *dualfeasible = FALSE;
 
 1275       SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
 
 1278       *primalfeasible = FALSE;
 
 1279       *dualfeasible = TRUE;
 
 1280       SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
 
 1283       SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
 
 1284       return SCIP_LPERROR;
 
 1296    SDPA::PhaseType phasetype;
 
 1298    assert( sdpisolver != NULL );
 
 1299    assert( sdpisolver->sdpa != NULL );
 
 1302    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1304    if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
 
 1306       SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
 
 1309    else if ( phasetype ==  SDPA::pFEAS_dINF )
 
 1311    else if ( phasetype == SDPA::pUNBD )
 
 1313       SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
 
 1326    SDPA::PhaseType phasetype;
 
 1328    assert( sdpisolver != NULL );
 
 1329    assert( sdpisolver->sdpa != NULL );
 
 1332    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1334    if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
 
 1336       SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
 
 1339    else if ( phasetype ==  SDPA::pINF_dFEAS )
 
 1341    else if ( phasetype == SDPA::dUNBD )
 
 1343       SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
 
 1356    SDPA::PhaseType phasetype;
 
 1358    assert( sdpisolver != NULL );
 
 1359    assert( sdpisolver->sdpa != NULL );
 
 1362    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1364    if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
 
 1366       SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
 
 1369    else if ( phasetype ==  SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS  || phasetype == SDPA::pdFEAS )
 
 1371    else if ( phasetype == SDPA::dUNBD )
 
 1373       SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
 
 1386    SDPA::PhaseType phasetype;
 
 1388    assert( sdpisolver != NULL );
 
 1389    assert( sdpisolver->sdpa != NULL);
 
 1392    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1394    if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
 
 1396       SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
 
 1399    else if ( phasetype ==  SDPA::pINF_dFEAS )
 
 1401    else if ( phasetype == SDPA::dUNBD )
 
 1403       SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
 
 1416    SDPA::PhaseType phasetype;
 
 1418    assert( sdpisolver != NULL );
 
 1419    assert( sdpisolver->sdpa != NULL);
 
 1422    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1424    if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
 
 1426       SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
 
 1429    else if ( phasetype ==  SDPA::pFEAS_dINF )
 
 1431    else if ( phasetype == SDPA::pUNBD )
 
 1433       SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
 
 1446    SDPA::PhaseType phasetype;
 
 1448    assert( sdpisolver != NULL );
 
 1449    assert( sdpisolver->sdpa != NULL);
 
 1452    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1454    if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
 
 1456       SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
 
 1459    else if ( phasetype ==  SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS  || phasetype == SDPA::pdFEAS )
 
 1461    else if ( phasetype == SDPA::dUNBD )
 
 1463       SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
 
 1475    SDPA::PhaseType phasetype;
 
 1477    assert( sdpisolver != NULL );
 
 1478    assert( sdpisolver->sdpa != NULL );
 
 1481    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1483    if ( phasetype == SDPA::pdOPT )
 
 1494    SDPA::PhaseType phasetype;
 
 1496    assert( sdpisolver != NULL );
 
 1497    assert( sdpisolver->sdpa != NULL );
 
 1500    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1502    if ( phasetype == SDPA::pUNBD )
 
 1513    SDPA::PhaseType phasetype;
 
 1515    assert( sdpisolver != NULL );
 
 1516    assert( sdpisolver->sdpa != NULL);
 
 1519    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1521    if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
 
 1523       if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
 
 1535    SCIPdebugMessage(
"Not implemented in SDPA!\n");
 
 1553    SDPA::PhaseType phasetype;
 
 1555    assert( sdpisolver != NULL );
 
 1556    assert( sdpisolver->sdpa != NULL );
 
 1558    if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
 
 1561    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1563    if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
 
 1565    if ( phasetype == SDPA::pdINF )
 
 1567    if ( phasetype == SDPA::pUNBD)
 
 1569    if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
 
 1580    SDPA::PhaseType phasetype;
 
 1582    assert( sdpisolver != NULL );
 
 1583    assert( sdpisolver->sdpa != NULL );
 
 1586    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1588    if ( phasetype == SDPA::pdOPT )
 
 1600    SDPA::PhaseType phasetype;
 
 1602    assert( sdpisolver != NULL );
 
 1603    assert( sdpisolver->sdpa != NULL );
 
 1606    phasetype = sdpisolver->sdpa->getPhaseValue();
 
 1610    if ( 
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
 
 1622    SCIPdebugMessage(
"Not implemented yet\n");
 
 1625    return SCIP_LPERROR;
 
 1634    assert( sdpisolver != NULL );
 
 1635    assert( sdpisolver->sdpa != NULL );
 
 1636    assert( objval != NULL );
 
 1639    *objval = sdpisolver->sdpa->getPrimalObj();
 
 1642    SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
 
 1643    SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval)))); 
 
 1644    if ( gap > sdpisolver->epsilon )
 
 1645       SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetObjval, " 
 1646             "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
 
 1650    *objval += sdpisolver->fixedvarsobjcontr;
 
 1670    assert( sdpisolver != NULL );
 
 1671    assert( sdpisolver->sdpa != NULL );
 
 1672    assert( dualsollength != NULL );
 
 1675    if ( objval != NULL )
 
 1677       *objval = sdpisolver->sdpa->getPrimalObj();
 
 1680       SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
 
 1681       SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval)))); 
 
 1682       if ( gap > sdpisolver->epsilon )
 
 1684          SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, " 
 1685             "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
 
 1690       *objval += sdpisolver->fixedvarsobjcontr;
 
 1693    if ( *dualsollength > 0 )
 
 1695       assert( dualsol != NULL );
 
 1696       if ( *dualsollength < sdpisolver->nvars )
 
 1698          SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
 
 1699          *dualsollength = sdpisolver->nvars;
 
 1705       assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) || 
 
 1706                sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() ); 
 
 1707       sdpasol = sdpisolver->sdpa->getResultXVec();
 
 1709       for (v = 0; v < sdpisolver->nvars; v++)
 
 1711          if ( sdpisolver->inputtosdpamapper[v] > 0 )
 
 1714             dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
 
 1719             assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
 
 1720             dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1]; 
 
 1747    assert( sdpisolver != NULL );
 
 1748    assert( sdpisolver->sdpa != NULL );
 
 1749    assert( lbvars != NULL );
 
 1750    assert( ubvars != NULL );
 
 1751    assert( arraylength != NULL );
 
 1752    assert( *arraylength >= 0 );
 
 1756    if ( *arraylength < sdpisolver->nvars )
 
 1758       *arraylength = sdpisolver->nvars;
 
 1759       SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
 
 1764    for (i = 0; i < sdpisolver->nvars; i++)
 
 1771    if ( sdpisolver->nvarbounds == 0 )
 
 1773       SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
 
 1778    lpblockind = (int) sdpisolver->sdpa->getBlockNumber(); 
 
 1779    assert( sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP );
 
 1780    nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
 
 1781    assert( nlpcons >= 0 );
 
 1783    X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
 
 1786    assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
 
 1788    for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
 
 1790       if ( sdpisolver->varboundpos[i] < 0 )
 
 1794          lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i]; 
 
 1800          ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i]; 
 
 1813    assert( sdpisolver != NULL );
 
 1814    assert( sdpisolver->sdpa != NULL );
 
 1815    assert( iterations != NULL );
 
 1818    *iterations = (int) sdpisolver->sdpa->getIteration();
 
 1875    assert( sdpisolver != NULL );
 
 1876    assert( dval != NULL );
 
 1881       *dval = sdpisolver->epsilon;
 
 1884       *dval = sdpisolver->feastol;
 
 1887       *dval = sdpisolver->objlimit;
 
 1890       return SCIP_PARAMETERUNKNOWN;
 
 1903    assert( sdpisolver != NULL );
 
 1908       sdpisolver->epsilon = dval;
 
 1909       SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
 
 1912       sdpisolver->feastol = dval;
 
 1913       SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
 
 1916       SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
 
 1917       sdpisolver->objlimit = dval;
 
 1920       return SCIP_PARAMETERUNKNOWN;
 
 1933    assert( sdpisolver != NULL );
 
 1938    case SCIP_SDPPAR_THREADS:
 
 1939       *ival = sdpisolver->threads;
 
 1940       SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
 
 1944       *ival = (int) sdpisolver->sdpinfo;
 
 1945       SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
 
 1948       return SCIP_PARAMETERUNKNOWN;
 
 1961    assert( sdpisolver != NULL );
 
 1966    case SCIP_SDPPAR_THREADS:
 
 1967       sdpisolver->threads = ival;
 
 1968       SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
 
 1972       sdpisolver->sdpinfo = (SCIP_Bool) ival;
 
 1973       SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
 
 1976       return SCIP_PARAMETERUNKNOWN;
 
 2000    SCIPdebugMessage(
"Not implemented yet\n");
 
 2001    return SCIP_LPERROR;
 
 2010    assert( fname != NULL );
 
 2012    sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
 
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Bool SCIPsdpiSolverIsGEMaxPenParam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
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 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_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
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_Bool *feasorig)
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 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_Real SCIPsdpiSolverMaxPenParam(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)