Changeset 1202


Ignore:
Timestamp:
May 14, 2008 7:53:13 AM (12 years ago)
Author:
forrest
Message:

for some of my experiments - not normally turned on

Location:
trunk/Clp/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Clp/src/ClpNode.cpp

    r1197 r1202  
    760760 
    761761  for ( i = 0; i < maxHash_; i++ ) {
    762     hash_[i].value = 0.0;
     762    hash_[i].value = -1.0e-100;
    763763    hash_[i].index = -1;
    764764    hash_[i].next = -1;
    765765  }
    766 
     766  // Put in +0
     767  hash_[0].value=0.0;
     768  hash_[0].index=0;
     769  numberHash_=1;
    767770  /*
    768771   * Initialize the hash table.  Only the index of the first value that
     
    774777    CoinBigIndex start = columnStart[i];
    775778    for (CoinBigIndex i=start;i<start+length;i++) {
    776       ipos = hash ( elementByColumn[i]);
     779      double value = elementByColumn[i];
     780      ipos = hash ( value);
    777781      if ( hash_[ipos].index == -1 ) {
    778782        hash_[ipos].index = numberHash_;
     
    887891ClpHashValue::index(double value) const
    888892{
     893  if (!value)
     894    return 0;
    889895  int ipos = hash ( value);
    890896  int returnCode=-1;
     
    911917 
    912918  assert (value!=hash_[ipos].value);
     919  if (hash_[ipos].index==-1) {
     920    // can put in here
     921    hash_[ipos].index = numberHash_;
     922    numberHash_++;
     923    hash_[ipos].value = value;
     924    return numberHash_-1;
     925  }
    913926  int k = hash_[ipos].next;
    914927  while (k!=-1) {
     
    964977  int i;
    965978  for ( i = 0; i < newSize; i++ ) {
    966     newHash[i].value = 0.0;
     979    newHash[i].value = -1.0e-100;
    967980    newHash[i].index = -1;
    968981    newHash[i].next = -1;
     
    986999        hash_[ipos].index = n;
    9871000        n++;
    988         hash_[ipos].value = hash_[i].value;
     1001        hash_[ipos].value = oldHash[i].value;
     1002        // unmark
     1003        oldHash[i].index=-1;
    9891004      }
    9901005    }
     
    10031018      int k;
    10041019      while ( true ) {
    1005         if (value==hash_[ipos].value)
    1006           break;
    1007         else
    1008           k = hash_[ipos].next;
    1009        
     1020        assert (value!=hash_[ipos].value);
     1021        k = hash_[ipos].next;
    10101022        if ( k == -1 ) {
    10111023          while ( true ) {
     
    10281040  }
    10291041  assert (n==numberHash_);
    1030 }
     1042  delete [] oldHash;
     1043}
  • trunk/Clp/src/ClpNode.hpp

    r1197 r1202  
    247247  /// Add value to list and return index
    248248  int addValue(double value) ;
     249  /// Number of different entries
     250  inline int numberEntries() const
     251  { return numberHash_;}
    249252  //@}
    250253
  • trunk/Clp/src/ClpSimplex.cpp

    r1197 r1202  
    1102711027  assert ((info->solverOptions_&65536)!=0);
    1102811028  int numberTotal = numberRows_+numberColumns_;
     11029#ifndef NDEBUG
     11030  if (columnScale_&&optimizationDirection_==1.0) {
     11031    //const double * obj = objective();
     11032    for (int i=0;i<numberColumns_;i++) {
     11033      //assert (fabs(cost_[i]-obj[i]*columnScale_[i])<1.0e-8);
     11034      if (lower_[i]>-1.0e30)
     11035        assert (fabs(lower_[i]-columnLower_[i]/columnScale_[i])<1.0e-8);
     11036      if (upper_[i]<1.0e30)
     11037        assert (fabs(upper_[i]-columnUpper_[i]/columnScale_[i])<1.0e-8);
     11038    }
     11039  }
     11040#endif
    1102911041  assert (info->saveCosts_);
    1103011042  CoinMemcpyN(info->saveCosts_,numberTotal,cost_);
     
    1117911191  info->solverOptions_ &= ~65536;
    1118011192}
     11193// Deals with crunch aspects
     11194ClpSimplex *
     11195ClpSimplex::fastCrunch(ClpNodeStuff * info, int mode)
     11196{
     11197  ClpSimplex * small=NULL;
     11198  if (mode==0) {
     11199    // before crunch
     11200    // crunch down
     11201    // Use dual region
     11202    double * rhs = dual_;
     11203    int * whichRow = new int[3*numberRows_];
     11204    int * whichColumn = new int[2*numberColumns_];
     11205    int nBound;
     11206    bool tightenBounds = ((specialOptions_&64)==0) ? false : true;
     11207    small =
     11208      ((ClpSimplexOther *) this)->crunch(rhs,whichRow,whichColumn,
     11209                                         nBound,false,tightenBounds);
     11210    if (small) {
     11211      info->large_=this;
     11212      info->whichRow_ = whichRow;
     11213      info->whichColumn_ = whichColumn;
     11214      info->nBound_ = nBound;
     11215      if (info->upPseudo_) {
     11216        const char * integerType2 = small->integerInformation();
     11217        int n=small->numberColumns();
     11218        int k=0;
     11219        int jColumn=0;
     11220        int j=0;
     11221        for (int i=0;i<n;i++) {
     11222          if (integerType2[i]) {
     11223            int iColumn = whichColumn[i];
     11224            // find
     11225            while (jColumn!=iColumn) {
     11226              if (integerType_[jColumn])
     11227                j++;
     11228              jColumn++;
     11229            }
     11230            info->upPseudo_[k]=info->upPseudo_[j];
     11231            info->numberUp_[k]=info->numberUp_[j];
     11232            info->downPseudo_[k]=info->downPseudo_[j];
     11233            info->numberDown_[k]=info->numberDown_[j];
     11234            assert (info->upPseudo_[k]>1.0e-40&&info->upPseudo_[k]<1.0e40);
     11235            assert (info->downPseudo_[k]>1.0e-40&&info->downPseudo_[k]<1.0e40);
     11236            k++;
     11237          }
     11238        }
     11239      }
     11240    } else {
     11241      delete [] whichRow;
     11242      delete [] whichColumn;
     11243    }
     11244  } else {
     11245    // after crunch
     11246    if (mode==1) {
     11247      // has solution
     11248      ClpSimplex * other = info->large_;
     11249      assert (other!=this);
     11250      ((ClpSimplexOther *) other)->afterCrunch(*this,
     11251                                               info->whichRow_,
     11252                                               info->whichColumn_,info->nBound_);
     11253      for (int i=0;i<other->numberColumns_;i++) {
     11254        if (other->integerType_[i]) {
     11255          double value = other->columnActivity_[i];
     11256          double value2 = floor(value+0.5);
     11257          assert (fabs(value-value2)<1.0e-4);
     11258          other->columnActivity_[i]=value2;
     11259          other->columnLower_[i]=value2;
     11260          other->columnUpper_[i]=value2;
     11261        }
     11262      }
     11263    }
     11264    delete [] info->whichRow_;
     11265    delete [] info->whichColumn_;
     11266  }
     11267  return small;
     11268}
    1118111269// Create C++ lines to get to current state
    1118211270void
  • trunk/Clp/src/ClpSimplex.hpp

    r1197 r1202  
    435435  /// Stops Fast dual2
    436436  void stopFastDual2(ClpNodeStuff * stuff);
     437  /** Deals with crunch aspects
     438      mode 0 - in
     439           1 - out with solution
     440           2 - out without solution
     441      returns small model or NULL
     442  */
     443  ClpSimplex * fastCrunch(ClpNodeStuff * stuff, int mode);
    437444  //@}
    438445
Note: See TracChangeset for help on using the changeset viewer.