Changeset 115


Ignore:
Timestamp:
Feb 6, 2003 5:10:02 PM (17 years ago)
Author:
forrest
Message:

OsiSimplexInterface?

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ClpSimplex.cpp

    r114 r115  
    120120  // say Steepest pricing
    121121  primalColumnPivot_ = new ClpPrimalColumnSteepest();
     122  solveType_=1; // say simplex based life form
    122123 
    123124}
     
    11971198  // say Dantzig pricing
    11981199  primalColumnPivot_ = new ClpPrimalColumnDantzig();
     1200  solveType_=1; // say simplex based life form
    11991201 
    12001202}
     
    13161318  if (rhs.nonLinearCost_!=NULL)
    13171319    nonLinearCost_ = new ClpNonLinearCost(*rhs.nonLinearCost_);
     1320  solveType_=rhs.solveType_;
    13181321}
    13191322// type == 0 do everything, most + pivot data, 2 factorization data as well
     
    28262829ClpSimplexProgress::looping()
    28272830{
    2828   assert(model_);
     2831  if (!model_)
     2832    return -1;
    28292833  double objective = model_->objectiveValue();
    28302834  double infeasibility;
     
    36793683  upperIn_ = upper_[sequenceIn_];
    36803684  dualIn_ = dj_[sequenceIn_];
    3681   if (sequenceOut_>=0) {
     3685  if (sequenceOut_>=0&&sequenceIn_!=sequenceIn_) {
    36823686    assert (pivotRow_>=0&&pivotRow_<numberRows_);
    36833687    assert (pivotVariable_[pivotRow_]==sequenceOut_);
     
    37623766      for (i=0;i<number;i++) {
    37633767        int ii = index[i];
    3764         dj_[ii] -= element[i];
    3765         element[i]=0.0;
     3768        dj_[ii] += element[ii];
     3769        element[ii]=0.0;
    37663770      }
    37673771      columnArray_[0]->setNumElements(0);
     
    37723776      for (i=0;i<number;i++) {
    37733777        int ii = index[i];
    3774         dj_[ii+numberRows_] -= element[i];
    3775         element[i]=0.0;
     3778        dj_[ii+numberColumns_] += element[ii];
     3779        dual_[ii] = dj_[ii+numberColumns_];
     3780        element[ii]=0.0;
    37763781      }
    37773782      rowArray_[0]->setNumElements(0);
     
    38403845int ClpSimplex::primalPivotResult()
    38413846{
    3842   return ((ClpSimplexPrimal *) this)->pivotResult();
     3847  assert (sequenceIn_>=0);
     3848  valueIn_=solution_[sequenceIn_];
     3849  lowerIn_=lower_[sequenceIn_];
     3850  upperIn_=upper_[sequenceIn_];
     3851  dualIn_=dj_[sequenceIn_];
     3852
     3853  int returnCode = ((ClpSimplexPrimal *) this)->pivotResult();
     3854  if (returnCode<0&&returnCode>-4) {
     3855    return 0;
     3856  } else {
     3857    printf("Return code of %d from ClpSimplexPrimal::pivotResult\n",
     3858           returnCode);
     3859    return -1;
     3860  }
    38433861}
    38443862 
  • trunk/ClpSimplexPrimal.cpp

    r112 r115  
    281281  // status -3 to go to top without an invert
    282282  while (problemStatus_==-1) {
     283#define CLP_DEBUG 1
    283284#ifdef CLP_DEBUG
    284285    {
     
    419420      // is factorization okay?
    420421      if (internalFactorize(1)) {
     422        if (solveType_==2) {
     423          // say odd
     424          problemStatus_=5;
     425          return;
     426        }
    421427        // no - restore previous basis
    422428        assert (type==1);
     
    12971303      }
    12981304    }
    1299     if ((saveDj*dualIn_<1.0e-20&&!ifValuesPass&&solveType_==1)||
    1300         fabs(saveDj-dualIn_)>1.0e-3*(1.0+fabs(saveDj))) {
     1305    if (solveType_==1&&((saveDj*dualIn_<1.0e-20&&!ifValuesPass)||
     1306        fabs(saveDj-dualIn_)>1.0e-3*(1.0+fabs(saveDj)))) {
    13011307      handler_->message(CLP_PRIMAL_DJ,messages_)
    13021308        <<saveDj<<dualIn_
     
    13321338    if (pivotRow_>=0) {
    13331339      if (solveType_==2) {
     1340        // **** Coding for user interface
    13341341        // do ray
    13351342        primalRay(rowArray_[1]);
     1343        // update duals
     1344        if (pivotRow_>=0) {
     1345          alpha_ = rowArray_[1]->denseVector()[pivotRow_];
     1346          assert (fabs(alpha_)>1.0e-8);
     1347          double multiplier = dualIn_/alpha_;
     1348          rowArray_[0]->insert(pivotRow_,multiplier);
     1349          factorization_->updateColumnTranspose(rowArray_[2],rowArray_[0]);
     1350          // put row of tableau in rowArray[0] and columnArray[0]
     1351          matrix_->transposeTimes(this,-1.0,
     1352                                  rowArray_[0],columnArray_[1],columnArray_[0]);
     1353          // update column djs
     1354          int i;
     1355          int * index = columnArray_[0]->getIndices();
     1356          int number = columnArray_[0]->getNumElements();
     1357          double * element = columnArray_[0]->denseVector();
     1358          for (i=0;i<number;i++) {
     1359            int ii = index[i];
     1360            dj_[ii] += element[ii];
     1361            element[ii]=0.0;
     1362          }
     1363          columnArray_[0]->setNumElements(0);
     1364          // and row djs
     1365          index = rowArray_[0]->getIndices();
     1366          number = rowArray_[0]->getNumElements();
     1367          element = rowArray_[0]->denseVector();
     1368          for (i=0;i<number;i++) {
     1369            int ii = index[i];
     1370            dj_[ii+numberColumns_] += element[ii];
     1371            dual_[ii] = dj_[ii+numberColumns_];
     1372            element[ii]=0.0;
     1373          }
     1374          rowArray_[0]->setNumElements(0);
     1375          // check incoming
     1376          assert (fabs(dj_[sequenceIn_])<1.0e-6);
     1377        }
    13361378      }
    13371379      // if stable replace in basis
     
    14161458      }
    14171459    }
     1460
    14181461   
    14191462    // update primal solution
     
    14971540    ClpSimplexProgress dummyProgress;
    14981541    statusOfProblemInPrimal(lastCleaned,1,dummyProgress);
     1542    if (problemStatus_==5) {
     1543      printf("Singular basis\n");
     1544      problemStatus_=-1;
     1545      returnCode=5;
     1546    }
    14991547  }
    15001548#ifdef CLP_DEBUG
  • trunk/Test/unitTest.cpp

    r102 r115  
    293293        Presolve pinfo;
    294294        ClpSimplex * model2 = pinfo.presolvedModel(solution,1.0e-8);
    295         // change from 200
    296         model2->factorization()->maximumPivots(100+model2->numberRows()/50);
     295        // change from 200 (unless user has changed)
     296        if (model2->factorization()->maximumPivots()==200)
     297          model2->factorization()->maximumPivots(100+model2->numberRows()/100);
    297298        if (doDual) {
    298299          // faster if bounds tightened
  • trunk/include/ClpSimplex.hpp

    r114 r115  
    258258  inline int algorithm() const
    259259  {return algorithm_; } ;
     260  /// Set algorithm
     261  inline void setAlgorithm(int value)
     262  {algorithm_=value; } ;
    260263  /// Sum of dual infeasibilities
    261264  inline double sumDualInfeasibilities() const
     
    511514  inline void  setSequenceOut(int sequence)
    512515  { sequenceOut_=sequence;};
     516  /** Return direction In or Out */
     517  inline int directionIn() const
     518  {return directionIn_;};
     519  inline int directionOut() const
     520  {return directionOut_;};
     521  /** Set directionIn or Out */
     522  inline void  setDirectionIn(int direction)
     523  { directionIn_=direction;};
     524  inline void  setDirectionOut(int direction)
     525  { directionOut_=direction;};
    513526  /// Returns 1 if sequence indicates column
    514527  inline int isColumn(int sequence) const
     
    550563  { if (iSequence<numberColumns_) return columnUpper_[iSequence]; else
    551564    return rowUpper_[iSequence-numberColumns_];};
     565  /// Theta (pivot change)
     566  inline double theta() const
     567  { return theta_;};
    552568  /// Scaling
    553569  const double * rowScale() const {return rowScale_;};
Note: See TracChangeset for help on using the changeset viewer.