Ignore:
Timestamp:
May 9, 2011 5:09:02 PM (9 years ago)
Author:
fmargot
Message:

CouenneRecordBestSol? and checkNLP2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Couenne/src/main/BonCouenne.cpp

    r571 r573  
    3333#include "CouenneCutGenerator.hpp"
    3434
     35#include "CouenneRecordBestSol.hpp"
     36
    3537using namespace Couenne;
    3638
     
    183185
    184186    CouenneProblem *cp = cg ? cg -> Problem () : NULL;
     187
     188    double cbcLb = bb.model ().getBestPossibleObjValue();
     189    double printObj = 0;
     190    bool foundSol = false;
     191
     192#ifdef FM_TRACE_OPTSOL
     193
     194    FILE *fSol = fopen("bidon.sol", "w");
     195    if(fSol == NULL) {
     196      printf("### ERROR: can not open bidon.sol\n");
     197      exit(1);
     198    }
     199
     200    if(cp != NULL) {
     201      double cbcObjVal = bb.model().getObjValue();
     202      int modelNvars = bb.model().getNumCols();
     203
     204      CouenneRecordBestSol *rs = cp->getRecordBestSol();
     205      const double *cbcSol = bb.model().getColSolution();
     206      double *modCbcSol = new double[modelNvars];
     207      double modCbcSolVal= 1e100, modCbcSolMaxViol = 0;
     208      bool cbcSolIsFeas = false;
     209
     210      if(modelNvars != cp->nVars()) {
     211        printf("### ERROR: modelNvars: %d nVars: %d\n",
     212               modelNvars, cp->nVars());
     213        exit(1);
     214      }
     215
     216      if(cbcObjVal < 1e49) {
     217
     218#ifdef FM_CHECKNLP2
     219        int cMS = rs->getCardModSol();
     220        cbcSolIsFeas = cp->checkNLP2(cbcSol, 0, false, // do not care about obj
     221                                     false, // do not stop at first viol
     222                                     true, // checkAll
     223                                     cp->getFeasTol());
     224        CoinCopyN(rs->getModSol(cMS), cMS, modCbcSol);
     225        modCbcSolVal = rs->getModSolVal();
     226        modCbcSolMaxViol = rs->getModSolMaxViol();
     227#else /* not FM_CHECKNLP2 */
     228        int cMS = cp->nVars();
     229        cbcSolIsFeas = cp->checkNLP(cbcSol, modCbcSolVal, true);
     230        CoinCopyN(cbcSol, cMS, modCbcSol);
     231        modCbcSolMaxViol = cp->getFeasTol();
     232#endif /* not FM_CHECKNLP2 */
     233        foundSol = true;
     234      }
     235
     236      const double *couenneSol = rs->getSol();
     237      double *modCouenneSol = new double[modelNvars];
     238      double modCouenneSolVal= 1e100, modCouenneSolMaxViol = 0;
     239      bool couenneSolIsFeas = false;
     240
     241      if(rs->getHasSol()) {
     242#ifdef FM_CHECKNLP2
     243        couenneSolIsFeas = cp->checkNLP2(couenneSol, 0, false,
     244                                         false, true,
     245                                         cp->getFeasTol());
     246        int cMS = rs->getCardModSol();
     247        CoinCopyN(rs->getModSol(cMS), cMS, modCouenneSol);
     248        modCouenneSolVal = rs->getModSolVal();
     249        modCouenneSolMaxViol = rs->getModSolMaxViol();
     250#else /* not FM_CHECKNLP2 */
     251        couenneSolIsFeas = cp->checkNLP(couenneSol, modCouenneSolVal, true);
     252        int cMS = cp->nVars();
     253        CoinCopyN(couenneSol, cMS, modCouenneSol);
     254        modCouenneSolMaxViol = cp->getFeasTol();
     255#endif /* not FM_CHECKNLP2 */
     256        foundSol = true;
     257      }
     258
     259      int retcomp = rs->compareAndSave(modCbcSol, modCbcSolVal,
     260                                       modCbcSolMaxViol, cbcSolIsFeas,
     261                                       modCouenneSol, modCouenneSolVal,
     262                                       modCouenneSolMaxViol, couenneSolIsFeas,
     263                                       modelNvars, cp->getFeasTol());
     264      switch (retcomp) {
     265      case -1: printf("No solution found\n"); break;
     266      case 0: printf("Best solution found by Cbc\n"); break;
     267      case 1: printf("Best solution found by Couenne\n"); break;
     268      default: break; // never happens
     269      }
     270
     271      if(rs->getHasSol()) {
     272        if(cbcLb > rs->getVal()) { // Best sol found by Couenne and not
     273                                   // transmitted to Cbc
     274          cbcLb = rs->getVal();
     275        }
     276        printObj = rs->getVal();
     277        rs->printSol(fSol);
     278      }
     279      delete[] modCbcSol;
     280      delete[] modCouenneSol;
     281    }
     282    fclose(fSol);
     283#endif /* FM_TRACE_OPTSOL */
     284
    185285
    186286    // retrieve test value to check
Note: See TracChangeset for help on using the changeset viewer.