Changeset 1331 for trunk/Clp


Ignore:
Timestamp:
Feb 6, 2009 11:37:09 AM (11 years ago)
Author:
forrest
Message:

improve dualize

Location:
trunk/Clp/src
Files:
2 edited

Legend:

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

    r1329 r1331  
    97269726      numberPrimalInfeasibilities_ ++;
    97279727    } else {
    9728       switch(getColumnStatus(iRow)) {
     9728      switch(getColumnStatus(iColumn)) {
    97299729       
    97309730      case basic:
  • trunk/Clp/src/ClpSimplexOther.cpp

    r1330 r1331  
    10081008        reducedCost_[iColumn]=objValue-dualActs[iColumn];
    10091009        if (columnUpper_[iColumn]>1.0e20) {
    1010           setColumnStatus(iColumn,atLowerBound);
    1011           columnActivity_[iColumn]=columnLower_[iColumn];
     1010          if (columnLower_[iColumn]>-1.0e20) {
     1011            if (columnUpper_[iColumn]>columnLower_[iColumn])
     1012              setColumnStatus(iColumn,atLowerBound);
     1013            else
     1014              setColumnStatus(iColumn,isFixed);
     1015            columnActivity_[iColumn]=columnLower_[iColumn];
     1016          } else {
     1017            // free
     1018            setColumnStatus(iColumn,isFree);
     1019            columnActivity_[iColumn]=0.0;
     1020          }
    10121021        } else {
    10131022          setColumnStatus(iColumn,atUpperBound);
     
    10181027        //printf("other dual sol %g\n",otherValue);
    10191028        if (fabs(otherValue-columnLower_[iColumn])<1.0e-5) {
    1020           setColumnStatus(iColumn,atLowerBound);
     1029          if (columnUpper_[iColumn]>columnLower_[iColumn])
     1030            setColumnStatus(iColumn,atLowerBound);
     1031          else
     1032            setColumnStatus(iColumn,isFixed);
    10211033          columnActivity_[iColumn]=columnLower_[iColumn];
    10221034        } else if (fabs(otherValue-columnUpper_[iColumn])<1.0e-5) {
    1023           setColumnStatus(iColumn,atUpperBound);
     1035          if (columnUpper_[iColumn]>columnLower_[iColumn])
     1036            setColumnStatus(iColumn,atUpperBound);
     1037          else
     1038            setColumnStatus(iColumn,isFixed);
    10241039          columnActivity_[iColumn]=columnUpper_[iColumn];
    10251040        } else {
     
    10551070          reducedCost_[iColumn]=objValue-dualActs[iColumn];
    10561071          if (fabs(otherValue-columnLower_[iColumn])<1.0e-5) {
    1057             setColumnStatus(iColumn,atLowerBound);
     1072            if (columnUpper_[iColumn]>columnLower_[iColumn])
     1073              setColumnStatus(iColumn,atLowerBound);
     1074            else
     1075              setColumnStatus(iColumn,isFixed);
    10581076            columnActivity_[iColumn]=columnLower_[iColumn];
    10591077          } else if (fabs(otherValue-columnUpper_[iColumn])<1.0e-5) {
    1060             setColumnStatus(iColumn,atUpperBound);
     1078            if (columnUpper_[iColumn]>columnLower_[iColumn])
     1079              setColumnStatus(iColumn,atUpperBound);
     1080            else
     1081              setColumnStatus(iColumn,isFixed);
    10611082            columnActivity_[iColumn]=columnUpper_[iColumn];
    10621083          } else {
     
    10681089  }
    10691090  // now rows
    1070   int kRow=0;
    10711091  int kExtraRow=jColumn;
    10721092  int numberRanges=0;
    10731093  for (iRow=0;iRow<numberRows_;iRow++) {
    1074     Status status = dualProblem->getColumnStatus(kRow);
     1094    Status status = dualProblem->getColumnStatus(iRow);
    10751095    if (status==basic) {
    10761096      // row is at bound
    1077       dual_[iRow]=dualSol[kRow];;
     1097      dual_[iRow]=dualSol[iRow];;
    10781098    } else {
    10791099      // row basic
     
    10871107        setRowStatus(iRow,atUpperBound);
    10881108      } else {
    1089         rowActivity_[iRow]=rowUpper_[iRow]+dualSol[kRow];
     1109        assert (dualDj[iRow]<1.0e-5);
     1110        rowActivity_[iRow]=rowUpper_[iRow]+dualDj[iRow];
    10901111      }       
    1091       kRow++;
    10921112    } else if (rowUpper_[iRow]>1.0e20) {
    10931113      if (status==basic) {
     
    10951115        setRowStatus(iRow,atLowerBound);
    10961116      } else {
    1097         rowActivity_[iRow]=rowLower_[iRow]+dualSol[kRow];
     1117        rowActivity_[iRow]=rowLower_[iRow]+dualDj[iRow];
     1118        assert (dualDj[iRow]>-1.0e-5);
    10981119      }       
    1099       kRow++;
    11001120    } else {
    11011121      if (rowUpper_[iRow]==rowLower_[iRow]) {
    11021122        rowActivity_[iRow]=rowLower_[iRow];
    11031123        if (status==basic) {
    1104           setRowStatus(iRow,atLowerBound);
     1124          setRowStatus(iRow,isFixed);
    11051125        }       
    1106         kRow++;
    11071126      } else {
    11081127        // range
    11091128        numberRanges++;
    11101129        Status statusL = dualProblem->getColumnStatus(kExtraRow);
    1111         kExtraRow++;
     1130        //printf("range row %d (%d), extra %d (%d) - dualSol %g,%g dualDj %g,%g\n",
     1131        //     iRow,status,kExtraRow,statusL, dualSol[iRow],
     1132        //     dualSol[kExtraRow],dualDj[iRow],dualDj[kExtraRow]);
    11121133        if (status==basic) {
    11131134          assert (statusL!=basic);
     
    11151136          setRowStatus(iRow,atUpperBound);
    11161137        } else if (statusL==basic) {
     1138          numberBasic--; // already counted
    11171139          rowActivity_[iRow]=rowLower_[iRow];
    11181140          setRowStatus(iRow,atLowerBound);
     1141          dual_[iRow]=dualSol[kExtraRow];;
    11191142        } else {
    1120           rowActivity_[iRow]=rowLower_[iRow]+dualSol[kRow];
     1143          rowActivity_[iRow]=rowLower_[iRow]-dualDj[iRow];
     1144          assert (dualDj[iRow]<1.0e-5);
    11211145          // row basic
    1122           setRowStatus(iRow,basic);
    1123           numberBasic++;
     1146          //setRowStatus(iRow,basic);
     1147          //numberBasic++;
    11241148          dual_[iRow]=0.0;
    11251149        }
    1126         kRow++;
     1150        kExtraRow++;
    11271151      }
    11281152    }
     
    11311155    printf("Bad basis - ranges - coding needed\n");
    11321156    assert (numberRanges);
    1133     returnCode=1;
     1157    abort();
    11341158  }
    11351159  if (optimizationDirection_<0.0) {
     
    11461170  checkSolutionInternal();
    11471171  // Below will go to ..DEBUG later
    1148   if (returnCode)
    1149     return 1; // Skip checks as will fail at present
    1150 #ifndef NDEBUG
     1172#if 0 //ndef NDEBUG
    11511173  // Check if correct
    11521174  double * columnActivity = CoinCopyOfArray(columnActivity_,numberColumns_);
     
    11541176  double * reducedCost = CoinCopyOfArray(reducedCost_,numberColumns_);
    11551177  double * dual = CoinCopyOfArray(dual_,numberRows_);
    1156   this->dual();
     1178  this->primal();
    11571179  CoinRelFltEq eq(1.0e-5);
     1180  for (iRow=0;iRow<numberRows_;iRow++) {
     1181    assert(eq(dual[iRow],dual_[iRow]));
     1182  }
    11581183  for (iColumn=0;iColumn<numberColumns_;iColumn++) {
    11591184    assert(eq(columnActivity[iColumn],columnActivity_[iColumn]));
    1160   }
    1161   for (iRow=0;iRow<numberRows_;iRow++) {
    1162     assert(eq(dual[iRow],dual_[iRow]));
    11631185  }
    11641186  for (iRow=0;iRow<numberRows_;iRow++) {
Note: See TracChangeset for help on using the changeset viewer.