Ignore:
Timestamp:
Sep 3, 2002 1:43:51 PM (18 years ago)
Author:
forrest
Message:

Synchronizing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/devel-1/ClpSimplexPrimal.cpp

    r15 r17  
    376376  return problemStatus_;
    377377}
    378 void
     378/*
     379  Reasons to come out:
     380  -1 iterations etc
     381  -2 inaccuracy
     382  -3 slight inaccuracy (and done iterations)
     383  -4 end of values pass and done iterations
     384  +0 looks optimal (might be infeasible - but we will investigate)
     385  +2 looks unbounded
     386  +3 max iterations
     387*/
     388int
    379389ClpSimplexPrimal::whileIterating(int & firstSuperBasic)
    380390{
     
    382392  // Say if values pass
    383393  int ifValuesPass=0;
     394  int returnCode=-1;
    384395  if (firstSuperBasic<numberRows_+numberColumns_)
    385396    ifValuesPass=1;
     
    451462          problemStatus_=-2; // factorize now
    452463          pivotRow_=-1; // say no weights update
     464          returnCode=-4;
    453465          break;
    454466        }
     
    516528          rowArray_[1]->clear();
    517529          pivotRow_=-1; // say no weights update
     530          returnCode=-2;
    518531          break;
    519532        } else {
     
    541554        if (updateStatus==1) {
    542555          // slight error
    543           if (factorization_->pivots()>5)
     556          if (factorization_->pivots()>5) {
    544557            problemStatus_=-2; // factorize now
     558            returnCode=-3;
     559          }
    545560        } else if (updateStatus==2) {
    546561          // major error
     
    548563          if(saveNumber != numberIterations_) {
    549564            problemStatus_=-2; // factorize now
     565            returnCode=-2;
    550566            break;
    551567          } else {
     
    603619          }
    604620          rowArray_[0]->clear();
     621          returnCode=2;
    605622          break;
    606623        } else {
     
    628645        // maximum iterations or equivalent
    629646        problemStatus_= 3;
     647        returnCode=3;
    630648        break;
    631649      }
     
    638656      if (nonLinearCost_->numberInfeasibilities())
    639657        problemStatus_=-4; // might be infeasible
     658      returnCode=0;
    640659      break;
    641660    }
    642661  }
     662  return returnCode;
    643663}
    644664/* Checks if finished.  Updates status */
     
    658678  }
    659679  int tentativeStatus = problemStatus_;
    660 
    661680  if (problemStatus_>-3||problemStatus_==-4) {
    662681    // factorize
     
    666685    // This may save pivotRow_ for use
    667686    primalColumnPivot_->saveWeights(this,1);
    668     // is factorization okay?
    669     if (internalFactorize(1)) {
    670       // no - restore previous basis
    671       assert (type==1);
    672       memcpy(status_ ,saveStatus_,(numberColumns_+numberRows_)*sizeof(char));
    673       memcpy(rowActivityWork_,savedSolution_+numberColumns_ ,
    674              numberRows_*sizeof(double));
    675       memcpy(columnActivityWork_,savedSolution_ ,
    676              numberColumns_*sizeof(double));
    677       forceFactorization_=1; // a bit drastic but ..
    678       type = 2;
    679       assert (internalFactorize(1)==0);
    680       changeMade_++; // say change made
     687
     688    if (type) {
     689      // is factorization okay?
     690      if (internalFactorize(1)) {
     691        // no - restore previous basis
     692        assert (type==1);
     693        memcpy(status_ ,saveStatus_,(numberColumns_+numberRows_)*sizeof(char));
     694        memcpy(rowActivityWork_,savedSolution_+numberColumns_ ,
     695               numberRows_*sizeof(double));
     696        memcpy(columnActivityWork_,savedSolution_ ,
     697               numberColumns_*sizeof(double));
     698        forceFactorization_=1; // a bit drastic but ..
     699        type = 2;
     700        assert (internalFactorize(1)==0);
     701        changeMade_++; // say change made
     702      }
    681703    }
    682704    if (problemStatus_!=-4)
     
    9841006      index[numberRemaining++]=iRow;
    9851007      double value=oldValue-upperTheta*fabs(alpha);
    986       if (value<-primalTolerance_)
     1008      if (value<-primalTolerance_&&fabs(alpha)>=acceptablePivot)
    9871009        upperTheta = (oldValue+primalTolerance_)/fabs(alpha);
    9881010    }
     
    11191141              // back to previous one
    11201142              goBackOne = true;
     1143              //break;
    11211144            } else {
    1122               // can only get here if all pivots too small
     1145              // can only get here if all pivots so far too small
    11231146            }
    11241147            break;
Note: See TracChangeset for help on using the changeset viewer.