Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/CbcCountRowCut.cpp

    r1883 r2094  
    365365    ipos=k;
    366366  }
    367   delete cut;
     367  hash_[ipos].index=-1;
    368368  // move last to found
    369369  numberCuts_--;
    370   if (numberCuts_) {
     370  assert (found==numberCuts_); // debug when fails
     371  if (numberCuts_&&found<numberCuts_) {
    371372    ipos = hashCut(*rowCut_[numberCuts_],hashSize);
    372373    while ( true ) {
     
    375376        int k = hash_[ipos].next;
    376377        ipos = k;
     378        assert (ipos>=0);
    377379      } else {
    378380        // change
     
    384386    }
    385387  }
    386   assert (!rowCut_[numberCuts_]);
     388  delete cut;
     389  rowCut_[numberCuts_]=NULL;
     390  //assert (!rowCut_[numberCuts_-1]);
     391}
     392// Truncate
     393void
     394CbcRowCuts::truncate(int numberAfter)
     395{
     396  if (numberAfter<0||numberAfter>=numberCuts_)
     397    return;
     398  for (int i=numberAfter;i<numberCuts_;i++) {
     399    delete rowCut_[i];
     400    rowCut_[i]=NULL;
     401  }
     402  numberCuts_=numberAfter;
     403  int hashSize= size_*hashMultiplier_;
     404  for (int i=0;i<hashSize;i++) {
     405    hash_[i].index=-1;
     406    hash_[i].next=-1;
     407  }
     408  OsiRowCut2 ** temp = new  OsiRowCut2 * [size_];
     409  lastHash_=-1;
     410  for (int i=0;i<numberCuts_;i++) {
     411    temp[i]=rowCut_[i];
     412    int ipos = hashCut(*temp[i],hashSize);
     413    int found = -1;
     414    int jpos=ipos;
     415    while ( true ) {
     416      int j1 = hash_[ipos].index;
     417      if ( j1 >= 0 ) {
     418        if ( !same(*temp[i],*temp[j1]) ) {
     419          int k = hash_[ipos].next;
     420          if ( k != -1 )
     421            ipos = k;
     422          else
     423            break;
     424        } else {
     425          found = j1;
     426          break;
     427        }
     428      } else {
     429        break;
     430      }
     431    }
     432    if (found<0) {
     433      assert (hash_[ipos].next==-1);
     434      if (ipos==jpos) {
     435        // first
     436        hash_[ipos].index=i;
     437      } else {
     438        // find next space
     439        while ( true ) {
     440          ++lastHash_;
     441          assert (lastHash_<hashSize);
     442          if ( hash_[lastHash_].index == -1 )
     443            break;
     444        }
     445        hash_[ipos].next = lastHash_;
     446        hash_[lastHash_].index = i;
     447      }
     448    }
     449  }
     450  delete [] rowCut_;
     451  rowCut_ = temp;
    387452}
    388453// Return 0 if added, 1 if not, -1 if not added because of space
     
    391456{
    392457  int hashSize= size_*hashMultiplier_;
     458  bool globallyValid=cut.globallyValid();
    393459  if (numberCuts_==size_) {
    394460    size_ = 2*size_+100;
     
    401467      hash_[i].next=-1;
    402468    }
     469    lastHash_=-1;
    403470    for (int i=0;i<numberCuts_;i++) {
    404471      temp[i]=rowCut_[i];
     
    507574      newCutPtr->setUb(newUb);
    508575      newCutPtr->setRow(vector);
     576      newCutPtr->setGloballyValid(globallyValid);
    509577      rowCut_[numberCuts_++]=newCutPtr;
     578      //printf("addedGlobalCut of size %d to %x - cuts size %d\n",
     579      //     cut.row().getNumElements(),this,numberCuts_);
    510580      return 0;
    511581    } else {
     
    531601      hash_[i].next=-1;
    532602    }
     603    lastHash_=-1;
    533604    for (int i=0;i<numberCuts_;i++) {
    534605      temp[i]=rowCut_[i];
     
    638709      newCutPtr->setRow(vector);
    639710      rowCut_[numberCuts_++]=newCutPtr;
     711      printf("addedGreedyGlobalCut of size %d to %x - cuts size %d\n",
     712             cut.row().getNumElements(),this,numberCuts_);
    640713      return 0;
    641714    } else {
Note: See TracChangeset for help on using the changeset viewer.