Changeset 41 for branches


Ignore:
Timestamp:
Oct 14, 2002 9:12:24 AM (17 years ago)
Author:
forrest
Message:

Testing presolve on nasty burlington problem

Location:
branches/devel-1
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/devel-1/Makefile.Clp

    r33 r41  
    5656ifeq ($(OptLevel),-g)
    5757     CXXFLAGS += -DCLP_DEBUG
    58 #    CXXFLAGS += -DPRESOLVE_SUMMARY=1 -DDEBUG_PRESOLVE
     58#    CXXFLAGS += -DPRESOLVE_SUMMARY=1 -DDEBUG_PRESOLVE -DCHECK_CONSISTENCY=1
    5959endif
    6060
  • branches/devel-1/Presolve.cpp

    r40 r41  
    22// Corporation and others.  All Rights Reserved.
    33
    4 #define CHECK_CONSISTENCY       1
     4//#define       CHECK_CONSISTENCY       1
    55
    66#include <stdio.h>
     
    204204    presolvedModel_ = new ClpSimplex(si);
    205205   
     206
    206207    // drop integer information if wanted
    207208    if (!keepIntegers)
     
    213214                        *presolvedModel_,
    214215                        nrows_, nelems_,true);
     216    // make sure row solution correct
     217    {
     218      double *colels    = prob.colels_;
     219      int *hrow         = prob.hrow_;
     220      int *mcstrt               = prob.mcstrt_;
     221      int *hincol               = prob.hincol_;
     222      int ncols         = prob.ncols_;
     223     
     224     
     225      double * csol = prob.sol_;
     226      double * acts = prob.acts_;
     227      int nrows = prob.nrows_;
     228
     229      int colx;
     230
     231      memset(acts,0,nrows*sizeof(double));
     232     
     233      for (colx = 0; colx < ncols; ++colx) {
     234        double solutionValue = csol[colx];
     235        for (int i=mcstrt[colx]; i<mcstrt[colx]+hincol[colx]; ++i) {
     236          int row = hrow[i];
     237          double coeff = colels[i];
     238          acts[row] += solutionValue*coeff;
     239        }
     240      }
     241    }
    215242    prob.handler_ = presolvedModel_->messageHandler();
    216243    prob.messages_ = presolvedModel_->messages();
     
    417444#endif
    418445}
    419 
    420 #ifdef  DEBUG_PRESOLVE
    421 void check_sol(PresolveMatrix *prob)
     446//#define DEBUG_PRESOLVE 1
     447#if DEBUG_PRESOLVE
     448void check_sol(PresolveMatrix *prob,double tol)
    422449{
    423450  double *colels        = prob->colels_;
     
    425452  int *mcstrt           = prob->mcstrt_;
    426453  int *hincol           = prob->hincol_;
     454  int *hinrow           = prob->hinrow_;
    427455  int ncols             = prob->ncols_;
    428456
    429457
    430458  double * csol = prob->sol_;
     459  double * acts = prob->acts_;
    431460  double * clo = prob->clo_;
    432461  double * cup = prob->cup_;
     
    451480        rsol[row] += solutionValue*coeff;
    452481      }
    453       if (csol[colx]<clo[colx]-1.0e-4) {
     482      if (csol[colx]<clo[colx]-tol) {
    454483        printf("low CSOL:  %d  - %g %g %g\n",
    455484                   colx, clo[colx], csol[colx], cup[colx]);
    456       } else if (csol[colx]>cup[colx]+1.0e-4) {
     485      } else if (csol[colx]>cup[colx]+tol) {
    457486        printf("high CSOL:  %d  - %g %g %g\n",
    458487                   colx, clo[colx], csol[colx], cup[colx]);
     
    462491  int rowx;
    463492  for (rowx = 0; rowx < nrows; ++rowx) {
    464     if (1) {
    465       if (rsol[rowx]<rlo[rowx]-1.0e-4) {
     493    if (hinrow[rowx]) {
     494      if (fabs(rsol[rowx]-acts[rowx])>tol)
     495        printf("inacc RSOL:  %d - %g %g (acts_ %g) %g\n",
     496                   rowx,  rlo[rowx], rsol[rowx], acts[rowx], rup[rowx]);
     497      if (rsol[rowx]<rlo[rowx]-tol) {
    466498        printf("low RSOL:  %d - %g %g %g\n",
    467499                   rowx,  rlo[rowx], rsol[rowx], rup[rowx]);
    468       } else if (rsol[rowx]>rup[rowx]+1.0e-4) {
     500      } else if (rsol[rowx]>rup[rowx]+tol ) {
    469501        printf("high RSOL:  %d - %g %g %g\n",
    470502                   rowx,  rlo[rowx], rsol[rowx], rup[rowx]);
     
    514546
    515547    int iLoop;
     548#if     DEBUG_PRESOLVE
     549        check_sol(prob,1.0e0);
     550#endif
    516551
    517552    for (iLoop=0;iLoop<numberPasses_;iLoop++) {
     
    558593        }
    559594       
    560        
    561 #if     DEBUG_PRESOLVE
    562         check_sol(prob);
     595#if     DEBUG_PRESOLVE
     596        check_sol(prob,1.0e0);
    563597#endif
    564598
     
    576610#endif
    577611       
    578 #if     PRESOLVE_SUMMARY
    579612        prob->whichpass_++;
    580 #endif
    581613         
    582614        // set up for next pass
     
    632664      printf("Starting expensive\n");
    633665#endif
    634 
    635666      if (dual) {
    636667        int itry;
     
    656687          break;
    657688      }
     689#if     DEBUG_PRESOLVE
     690        check_sol(prob,1.0e0);
     691#endif
    658692     
    659693      if (duprow) {
     
    662696          break;
    663697      }
     698#if     DEBUG_PRESOLVE
     699      check_sol(prob,1.0e0);
     700#endif
     701      {
     702        int * hinrow = prob->hinrow_;
     703        int numberDropped=0;
     704        for (i=0;i<nrows_;i++)
     705          if (!hinrow[i])
     706            numberDropped++;
     707        printf("%d rows dropped after pass %d\n",numberDropped,
     708               prob->whichpass_+1);
     709      }
    664710      if (paction_ == paction0)
    665711        break;
     
    669715  if (!prob->status_) {
    670716    paction_ = drop_zero_coefficients(prob, paction_);
     717#if     DEBUG_PRESOLVE
     718        check_sol(prob,1.0e0);
     719#endif
    671720
    672721    paction_ = drop_empty_cols_action::presolve(prob, paction_);
    673722    paction_ = drop_empty_rows_action::presolve(prob, paction_);
     723#if     DEBUG_PRESOLVE
     724        check_sol(prob,1.0e0);
     725#endif
    674726  }
    675727 
     
    839891void check_djs(PostsolveMatrix *prob)
    840892{
     893  return;
    841894  double *colels        = prob->colels_;
    842895  int *hrow             = prob->hrow_;
  • branches/devel-1/PresolveDoubleton.cpp

    r39 r41  
    223223static bool elim_doubleton(const char *msg,
    224224                           int *mcstrt,
    225                            double *rlo, double *rup,
     225                           double *rlo, double * acts, double *rup,
    226226                           double *colels,
    227227                           int *hrow, int *hcol,
     
    264264        if (rup[row] < PRESOLVE_INF)
    265265          rup[row] -= colels[kcoly] * bounds_factor;
     266
     267        // and solution
     268        acts[row] -= colels[kcoly] * bounds_factor;
    266269      }
    267270
     
    730733        /* transfer the colx factors to coly */
    731734        bool no_mem = elim_doubleton("ELIMD",
    732                                      mcstrt, rlo, rup, colels,
     735                                     mcstrt, rlo, acts, rup, colels,
    733736                                     hrow, hcol, hinrow, hincol,
    734737                                     clink, ncols,
  • branches/devel-1/PresolveFixed.cpp

    r29 r41  
    4444  double *rlo   = prob->rlo_;
    4545  double *rup   = prob->rup_;
     46  double *acts  = prob->acts_;
    4647
    4748  double *dcost = prob->cost_;
     
    8081      rlo[row] -= sol * coeff;
    8182      rup[row] -= sol * coeff;
     83      acts[row] -= sol * coeff;
    8284
    8385      // remove this column from all rows it occurs in in the row rep
  • branches/devel-1/PresolveImpliedFree.cpp

    r40 r41  
    238238      }
    239239
    240       const bool nonzero_cost = (cost[j] != 0.0);
     240      const bool nonzero_cost = (cost[j] != 0.0&&fabs(rup[row]-rlo[row])<=tol);
    241241
    242242      double *save_costs = nonzero_cost ? new double[hinrow[row]] : NULL;
  • branches/devel-1/PresolveSubst.cpp

    r40 r41  
    139139// add coeff_factor * rowy to rowx
    140140void add_row(int *mrstrt,
    141              double *rlo, double *rup,
     141             double *rlo, double * acts, double *rup,
    142142             double *rowels,
    143143             int *hcol,
     
    206206      rup[irowx] += rhsy * coeff_factor;
    207207    }
     208    acts[irowx] += rhsy * coeff_factor;
    208209  }
    209210
     
    464465  double *rlo   = prob->rlo_;
    465466  double *rup   = prob->rup_;
     467  double *acts  = prob->acts_;
    466468
    467469  double *dcost         = prob->cost_;
     
    883885                // may introduce (or cancel) elements in rowx
    884886                add_row(mrstrt,
    885                         rlo, rup,
     887                        rlo, acts, rup,
    886888                        rowels, hcol,
    887889                        hinrow,
  • branches/devel-1/Samples/ekk_interface.cpp

    r38 r41  
    153153    delete clp;
    154154    delete presolveInfo;
     155    presolveInfo=NULL;
    155156    clp = clpOriginal;
    156157    if (presolve==3||(presolve==2&&clp->status())) {
  • branches/devel-1/Test/ClpMain.cpp

    r34 r41  
    10821082#ifdef USE_PRESOLVE
    10831083              Presolve pinfo;
    1084               if (preSolve)
     1084              if (preSolve) {
    10851085                model2 = pinfo.presolvedModel(models[iModel],1.0e-8,preSolve);
     1086                model2->checkSolution();
     1087#ifdef CLP_DEBUG
     1088                printf("%g %g (%d) %g (%d)\n"
     1089                       ,model2->objectiveValue()
     1090                       ,model2->sumDualInfeasibilities()
     1091                       ,model2->numberDualInfeasibilities()
     1092                       ,model2->sumPrimalInfeasibilities()
     1093                       ,model2->numberPrimalInfeasibilities());
     1094#endif
     1095                if (type==DUALSIMPLEX) {
     1096                  int numberInfeasibilities = model2->tightenPrimalBounds();
     1097                  if (numberInfeasibilities)
     1098                    std::cout<<"** Analysis indicates model infeasible"
     1099                             <<std::endl;
     1100                }
     1101              }
    10861102#endif
    10871103#ifdef READLINE     
     
    11031119#endif
    11041120                models[iModel].primal(1);
     1121#ifdef CLP_DEBUG
     1122                models[iModel].checkSolution();
     1123                printf("%g dual %g(%d) Primal %g(%d)\n",
     1124                       models[iModel].objectiveValue(),
     1125                       models[iModel].sumDualInfeasibilities(),
     1126                       models[iModel].numberDualInfeasibilities(),
     1127                       models[iModel].sumPrimalInfeasibilities(),
     1128                       models[iModel].numberPrimalInfeasibilities());
     1129                {
     1130                  Presolve pinfoA;
     1131                  model2 = pinfoA.presolvedModel(models[iModel],1.0e-8);
     1132                 
     1133                  printf("Resolving from presolved optimal solution\n");
     1134                  model2->primal(1);
     1135                 
     1136                  delete model2;
     1137                }
     1138#endif
    11051139              }
    11061140#endif
     
    11221156          case TIGHTEN:
    11231157            if (goodModels[iModel]) {
    1124               int numberInfeasibilities = models[iModel].tightenPrimalBounds();
     1158              int numberInfeasibilities = models[iModel].tightenPrimalBounds();
    11251159              if (numberInfeasibilities)
    11261160                std::cout<<"** Analysis indicates model infeasible"<<std::endl;
  • branches/devel-1/include/PresolveMatrix.hpp

    r39 r41  
    446446};
    447447
    448 
    449448void PresolveMatrix::change_bias(double change_amount)
    450449{
    451450  dobias_ += change_amount;
     451#if DEBUG_PRESOLVE
     452  assert(fabs(change_amount)<1.0e50);
     453#endif
    452454  if (change_amount)
    453455    PRESOLVE_STMT(printf("changing bias by %g to %g\n",
Note: See TracChangeset for help on using the changeset viewer.