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

Testing presolve on nasty burlington problem

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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_;
Note: See TracChangeset for help on using the changeset viewer.