Changeset 1200 for trunk/Clp/src


Ignore:
Timestamp:
May 9, 2008 3:26:01 PM (12 years ago)
Author:
forrest
Message:

fix bug in ClpPackedMatrix?

Location:
trunk/Clp/src
Files:
2 edited

Legend:

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

    r1197 r1200  
    891891      double * array = columnArray->denseVector();
    892892      assert (!y->getNumElements());
    893       int * lookup = (int *) y->denseVector();
     893      // and set up mark as char array
     894      char * marked = (char *) (index+columnArray->capacity());
     895      int * lookup = y->getIndices();
    894896#ifndef NDEBUG
    895897      int numberColumns = matrix_->getNumCols();
    896898      for (int i=0;i<numberColumns;i++)
    897         assert(!lookup[i]);
     899        assert(!marked[i]);
    898900#endif
    899901      numberNonZero=gutsOfTransposeTimesByRowGE3(rowArray,index,array,
    900                                                  lookup,zeroTolerance,scalar);
     902                                                 lookup,marked,zeroTolerance,scalar);
    901903      columnArray->setNumElements(numberNonZero);
    902904    } else {
     
    10921094                                              double * COIN_RESTRICT output,
    10931095                                              int * COIN_RESTRICT lookup,
     1096                                              char * COIN_RESTRICT marked,
    10941097                                              const double tolerance,
    10951098                                              const double scalar) const
     
    11021105  const double * element = getElements();
    11031106  const int * whichRow = piVector->getIndices();
     1107#ifndef NDEBUG
     1108  int maxColumn=0;
     1109#endif
    11041110  // ** Row copy is already scaled
    11051111  int iRow;
     
    11111117    for (j=rowStart[iRow];j<rowStart[iRow+1];j++) {
    11121118      int iColumn = column[j];
     1119#ifndef NDEBUG
     1120      maxColumn=CoinMax(maxColumn,iColumn);
     1121#endif
    11131122      double elValue = element[j];
    1114       int k = lookup[iColumn];
    11151123      elValue *= value;
    1116       if (k) {
    1117         output[k-1] += elValue;
     1124      if (marked[iColumn]) {
     1125        int k = lookup[iColumn];
     1126        output[k] += elValue;
    11181127      } else {
    11191128        output[numberNonZero] = elValue;
     1129        marked[iColumn]=1;
     1130        lookup[iColumn]=numberNonZero;
    11201131        index[numberNonZero++]=iColumn;
    1121         lookup[iColumn]=numberNonZero;
    11221132      }
    11231133    }
     
    11291139  for (i=0;i<numberNonZero;i++) {
    11301140    int iColumn = index[i];
    1131     lookup[iColumn]=0;
     1141    marked[iColumn]=0;
    11321142    double value = output[i];
    11331143    if (fabs(value)<=tolerance) {
     
    11361146        value = output[numberNonZero];
    11371147        iColumn = index[numberNonZero];
    1138         lookup[iColumn]=0;
     1148        marked[iColumn]=0;
    11391149        if (i<numberNonZero) {
    11401150          output[numberNonZero]=0.0;
     
    11511161  for (i=numberNonZero;i<saveN;i++)
    11521162    assert(!output[i]);
     1163  for (i=0;i<=maxColumn;i++)
     1164    assert (!marked[i]);
    11531165#endif
    11541166  return numberNonZero;
  • trunk/Clp/src/ClpPackedMatrix.hpp

    r1197 r1200  
    342342                                   double * COIN_RESTRICT output,
    343343                                   int * COIN_RESTRICT lookup,
     344                                   char * COIN_RESTRICT marked,
    344345                                   const double tolerance,
    345346                                   const double scalar) const;
Note: See TracChangeset for help on using the changeset viewer.