Changeset 739


Ignore:
Timestamp:
Mar 10, 2006 5:40:12 PM (14 years ago)
Author:
forrest
Message:

trying to improve

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ClpInterior.cpp

    r719 r739  
    11431143ClpInterior::fixFixed(bool reallyFix)
    11441144{
     1145  // Arrays for change in columns and rhs
     1146  double * columnChange = new double[numberColumns_];
     1147  double * rowChange = new double[numberRows_];
     1148  CoinZeroN(columnChange,numberColumns_);
     1149  CoinZeroN(rowChange,numberRows_);
     1150  matrix_->times(1.0,columnChange,rowChange);
    11451151  int i;
     1152  double tolerance = primalTolerance();
    11461153  for (i=0;i<numberColumns_;i++) {
    11471154    if (columnUpper_[i]<1.0e20||columnLower_[i]>-1.0e20) {
     
    11491156        if (fixedOrFree(i)) {
    11501157          if (columnActivity_[i]-columnLower_[i]<columnUpper_[i]-columnActivity_[i]) {
    1151             if (reallyFix)
    1152               columnUpper_[i]=columnLower_[i];
    1153             columnActivity_[i]=columnLower_[i];
     1158            double change = columnLower_[i]-columnActivity_[i];
     1159            if (fabs(change)<tolerance) {
     1160              if (reallyFix)
     1161                columnUpper_[i]=columnLower_[i];
     1162              columnChange[i] = change;
     1163              columnActivity_[i]=columnLower_[i];
     1164            }
    11541165          } else {
    1155             if (reallyFix)
    1156               columnLower_[i]=columnUpper_[i];
    1157             columnActivity_[i]=columnUpper_[i];
     1166            double change = columnUpper_[i]-columnActivity_[i];
     1167            if (fabs(change)<tolerance) {
     1168              if (reallyFix)
     1169                columnLower_[i]=columnUpper_[i];
     1170              columnChange[i] = change;
     1171              columnActivity_[i]=columnUpper_[i];
     1172            }
    11581173          }
    11591174        }
     
    11611176    }
    11621177  }
     1178  CoinZeroN(rowChange,numberRows_);
     1179  matrix_->times(1.0,columnChange,rowChange);
     1180  // If makes mess of things then don't do
     1181  double newSum=0.0;
    11631182  for (i=0;i<numberRows_;i++) {
    1164     if (rowUpper_[i]<1.0e20||rowLower_[i]>-1.0e20) {
    1165       if (rowUpper_[i]>rowLower_[i]) {
    1166         if (fixedOrFree(i+numberColumns_)) {
    1167           if (rowActivity_[i]-rowLower_[i]<rowUpper_[i]-rowActivity_[i]) {
    1168             if (reallyFix)
    1169               rowUpper_[i]=rowLower_[i];
    1170             rowActivity_[i]=rowLower_[i];
    1171           } else {
    1172             if (reallyFix)
    1173               rowLower_[i]=rowUpper_[i];
    1174             rowActivity_[i]=rowUpper_[i];
     1183    double value=rowActivity_[i]+rowChange[i];
     1184    if (value>rowUpper_[i]+tolerance)
     1185      newSum += value-rowUpper_[i]-tolerance;
     1186    else if (value<rowLower_[i]-tolerance)
     1187      newSum -= value-rowLower_[i]+tolerance;
     1188  }
     1189  if (newSum>1.0e-5+1.5*sumPrimalInfeasibilities_) {
     1190    // put back and skip changes
     1191    for (i=0;i<numberColumns_;i++)
     1192      columnActivity_[i] -= columnChange[i];
     1193  } else {
     1194    CoinZeroN(rowActivity_,numberRows_);
     1195    matrix_->times(1.0,columnActivity_,rowActivity_);
     1196    if (reallyFix) {
     1197      for (i=0;i<numberRows_;i++) {
     1198        if (rowUpper_[i]<1.0e20||rowLower_[i]>-1.0e20) {
     1199          if (rowUpper_[i]>rowLower_[i]) {
     1200            if (fixedOrFree(i+numberColumns_)) {
     1201              if (rowActivity_[i]-rowLower_[i]<rowUpper_[i]-rowActivity_[i]) {
     1202                double change = rowLower_[i]-rowActivity_[i];
     1203                if (fabs(change)<tolerance) {
     1204                  if (reallyFix)
     1205                    rowUpper_[i]=rowLower_[i];
     1206                  rowActivity_[i]=rowLower_[i];
     1207                }
     1208              } else {
     1209                double change = rowLower_[i]-rowActivity_[i];
     1210                if (fabs(change)<tolerance) {
     1211                  if (reallyFix)
     1212                    rowLower_[i]=rowUpper_[i];
     1213                  rowActivity_[i]=rowUpper_[i];
     1214                }
     1215              }
     1216            }
    11751217          }
    11761218        }
     
    11781220    }
    11791221  }
     1222  delete [] rowChange;
     1223  delete [] columnChange;
    11801224}
    11811225/* Modifies djs to allow for quadratic.
  • trunk/ClpPredictorCorrector.cpp

    r729 r739  
    35633563      scaledRHSError>primalTolerance())
    35643564    primalFeasible=false;
     3565  // relax dual test if obj big and gap smallish
     3566  double gap=fabs(primalObjective_-dualObjective_);
     3567  double sizeObj = CoinMin(fabs(primalObjective_),fabs(dualObjective_))+1.0e-50;
     3568  //printf("gap %g sizeObj %g ratio %g comp %g\n",
     3569  //     gap,sizeObj,gap/sizeObj,complementarityGap_);
     3570  if (numberIterations_>100&&gap/sizeObj<1.0e-9&&complementarityGap_<1.0e-7*sizeObj)
     3571    dualTolerance *= 1.0e2;
    35653572  if (maximumDualError_>objectiveNorm_*dualTolerance)
    35663573    dualFeasible=false;
Note: See TracChangeset for help on using the changeset viewer.