Ignore:
Timestamp:
Feb 9, 2012 1:09:23 AM (8 years ago)
Author:
pbelotti
Message:

cleaned up output, especially in infeasible instances. More cleanup of code

File:
1 edited

Legend:

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

    r820 r821  
    8787  char * pbName = NULL;
    8888
    89   const int infeasible = 1;
     89  bool infeasible = false;
    9090
    9191  try {
     
    113113
    114114    CouenneSetup couenne;
    115 
    116     if (!couenne.InitializeCouenne (argv, p, NULL, ci, &bb))
    117       throw infeasible;
    118 
    119     //////////////////////////////
    120115    CouenneCutGenerator *cg = NULL;
     116    ConstJnlstPtr jnlst;
     117    CouenneProblem *prob = NULL;
     118
     119    infeasible =  !(couenne.InitializeCouenne (argv, p, NULL, ci, &bb));
    121120
    122121    // there is only one CouenneCutGenerator object; scan array until
     
    126125
    127126      for (std::list <Bonmin::BabSetupBase::CuttingMethod>::iterator
    128                    i  = couenne.cutGenerators () . begin ();
     127             i  = couenne.cutGenerators () . begin ();
    129128           !cg && (i != couenne.cutGenerators () . end ());
    130129           ++i)
     
    141140      cg -> setBabPtr (&bb);
    142141
    143     else {
     142    else if (!infeasible) {
     143
    144144      printf ("main(): ### ERROR: Can not get CouenneCutGenerator\n");
    145145      exit (-1);
     
    148148    // initial printout
    149149
    150     ConstJnlstPtr jnlst = couenne. couennePtr () -> Jnlst ();
    151 
    152     CouenneProblem *prob = couenne. couennePtr () -> Problem ();
     150    jnlst = couenne. couennePtr () -> Jnlst ();
     151    prob  = couenne. couennePtr () -> Problem ();
    153152
    154153    bb. setProblem (prob);
     154
     155    int retcomp = 2; // unspecified.
    155156
    156157    jnlst -> Printf (J_ERROR, J_COUENNE, "\
     
    183184    //////////////////////////////////
    184185
    185     bb (couenne); // do branch and bound
     186    if (!infeasible)
     187      bb (couenne); // do branch and bound
    186188
    187189#ifdef COIN_HAS_NTY
     
    201203
    202204#if defined (FM_TRACE_OPTSOL) || defined (FM_FRES)
    203     double cbcLb = bb.model ().getBestPossibleObjValue();
     205    double cbcLb = (infeasible ? -COIN_DBL_MAX : bb.model (). getBestPossibleObjValue ());
    204206    double printObj = 0;
    205207    bool foundSol = false;
     
    216218
    217219    if(cp != NULL) {
    218       double cbcObjVal = bb.model().getObjValue();
    219       int modelNvars = bb.model().getNumCols();
     220      double cbcObjVal = infeasible ? COIN_DBL_MAX : bb.model().getObjValue();
     221      int modelNvars = prob -> nVars ();//bb.model().getNumCols();
    220222
    221223      CouenneRecordBestSol *rs = cp->getRecordBestSol();
    222       const double *cbcSol = bb.model().getColSolution();
     224      const double *cbcSol = infeasible ? NULL : bb.model().getColSolution();
    223225      double *modCbcSol = new double[modelNvars];
    224226      double modCbcSolVal= 1e100, modCbcSolMaxViol = 0;
     
    231233      }
    232234
    233       if(cbcObjVal < 1e49) {
     235      if (cbcObjVal < 1e49 && !infeasible) {
    234236
    235237#ifdef FM_CHECKNLP2
     
    274276      }
    275277
    276       int retcomp = rs->compareAndSave(modCbcSol, modCbcSolVal,
     278      retcomp = rs->compareAndSave(modCbcSol, modCbcSolVal,
    277279                                       modCbcSolMaxViol, cbcSolIsFeas,
    278280                                       modCouenneSol, modCouenneSolVal,
    279281                                       modCouenneSolMaxViol, couenneSolIsFeas,
    280282                                       modelNvars, cp->getFeasTol());
    281       switch (retcomp) {
    282       case -1: printf("No solution found\n"); break;
    283       case 0: printf("Best solution found by Cbc. Value: %10.4f. Tolerance: %10g\n", modCbcSolVal, modCbcSolMaxViol); break;
    284       case 1: //printf("Best solution found by Couenne  Value: %10.4f  Tolerance: %10g\n", modCouenneSolVal, modCouenneSolMaxViol); break;
    285       default: break; // never happens
    286       }
     283      // switch (retcomp) {
     284      // case -1: printf("No solution found\n"); break;
     285      // case 0: printf("Best solution found by Cbc. Value: %10.4f. Tolerance: %10g\n", modCbcSolVal, modCbcSolMaxViol); break;
     286      // case 1: //printf("Best solution found by Couenne  Value: %10.4f  Tolerance: %10g\n", modCouenneSolVal, modCouenneSolMaxViol); break;
     287      // default: break; // never happens
     288      // }
    287289
    288290      if(rs->getHasSol()) {
     
    330332        fprintf(f_res, "         *");
    331333      }
    332       fprintf(f_res, " %10d %10.4f\n", bb.numNodes (),
     334      fprintf(f_res, " %10d %10.4f\n", infeasible ? 0 : bb.numNodes (),
    333335              CoinCpuTime () - time_start);
    334336      fclose(f_res);
     
    341343
    342344    double
    343       ub = bb. model (). getObjValue (),
    344       lb = bb. model (). getBestPossibleObjValue ();
     345      ub = infeasible ?  COIN_DBL_MAX : bb. model (). getObjValue (),
     346      lb = infeasible ? -COIN_DBL_MAX : bb. model (). getBestPossibleObjValue ();
    345347
    346348    if (cp -> getRecordBestSol () &&
     
    354356
    355357    char
    356       *gapstr = new char [80],
    357       *lbstr  = new char [80],
    358       *ubstr  = new char [80];
     358      *gapstr = new char [40],
     359      *lbstr  = new char [40],
     360      *ubstr  = new char [40];
    359361
    360362    sprintf (lbstr,  "%10g",     lb);
     
    362364    sprintf (gapstr, "%.2f%%", fabs (100. * (ub - lb) / (1. + fabs (lb))));
    363365
    364     jnlst -> Printf (J_ERROR, J_COUENNE, "\n\
     366    if (!infeasible)
     367      jnlst -> Printf (J_ERROR, J_COUENNE, "\n\
    365368Linearization cuts added at root node:   %8d\n\
    366 Linearization cuts added in total:       %8d  (separation time: %gs)\n\
    367 Total solving time:                      %8gs (%gs in branch-and-bound)\n\
     369Linearization cuts added in total:       %8d  (separation time: %gs)\n",
     370                       nr, nt, st);
     371
     372    else jnlst -> Printf (J_ERROR, J_COUENNE, "Problem infeasible\n");
     373
     374    jnlst -> Printf (J_NONE, J_COUENNE, "\
     375Total time:                              %8gs (%gs in branch-and-bound)\n\
    368376Lower bound:                           %s\n\
    369377Upper bound:                           %s  (gap: %s)\n\
    370378Branch-and-bound nodes:                  %8d\n",
    371                      nr, nt, st,
    372379                     CoinCpuTime () - time_start,
    373380                     cg ? (CoinCpuTime () - cg -> rootTime ()) : CoinCpuTime (),
    374                      (lb < -9e12) ||
    375                      (lb > COUENNE_INFINITY/1e4) ? "      -inf" : lbstr,
    376                      (ub > COUENNE_INFINITY/1e4) ? "       inf" : ubstr,
    377                      (ub > COUENNE_INFINITY/1e4) ? "--" : gapstr,
    378                      bb.numNodes ());
    379 
    380     if (fabs (ub - bb. model (). getObjValue ()) > COUENNE_EPS * fabs (ub))
    381       jnlst -> Printf (J_ERROR, J_COUENNE,
    382                        "Warning: upper bounds differ between Couenne and Cbc. Saving Couenne's (more reliable).\n");
     381                     (lb <= -9e12) ||
     382                     (                 infeasible ||          (fabs (lb)             > COUENNE_INFINITY/1e4)) ? "      -inf" : lbstr,
     383                     ((retcomp < 0) || infeasible ||                            (ub  > COUENNE_INFINITY/1e4)) ? "       inf" : ubstr,
     384                     (                 infeasible || (CoinMax (fabs (lb), fabs (ub)) > COUENNE_INFINITY/1e4)) ? "--"        : gapstr,
     385                     infeasible ? 0 : bb.numNodes ());
     386
     387    // if (fabs (ub - bb. model (). getObjValue ()) > COUENNE_EPS * fabs (ub))
     388    //   jnlst -> Printf (J_ERROR, J_COUENNE,
     389    //                 "Warning: upper bounds differ between Couenne and Cbc. Saving Couenne's (more reliable).\n");
    383390
    384391    delete [] lbstr;
     
    388395    if (global_opt < COUENNE_INFINITY) { // some value found in couenne.opt
    389396
    390       double opt = bb.model (). getBestPossibleObjValue ();
     397      double opt = infeasible ? -COIN_DBL_MAX : bb.model (). getBestPossibleObjValue ();
    391398
    392399      printf ("Global Optimum Test on %-40s %s\n",
     
    420427                //bb.bestBound (),
    421428                //bb.bestObj (),
    422                 bb.numNodes ());
     429                infeasible ? 0 : bb.numNodes ());
    423430                //bb.iterationCount ());
    424431                //status.c_str (), message.c_str ());
     
    449456   std::cerr<<"Ipopt exception : "<<E.Message()<<std::endl;
    450457  }
    451   catch (int generic_error) {
    452     if (generic_error == infeasible)
    453       printf ("problem infeasible\n");
    454   }
     458  // catch (int generic_error) {
     459  //   // if (generic_error == infeasible)
     460  //   //   printf ("problem infeasible\n");
     461  // }
    455462
    456463//  catch(...) {
Note: See TracChangeset for help on using the changeset viewer.