Changeset 2140 for trunk


Ignore:
Timestamp:
Apr 6, 2015 11:04:32 AM (3 years ago)
Author:
forrest
Message:

improve handling of free variables in dual

Location:
trunk/Clp/src
Files:
2 edited

Legend:

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

    r2115 r2140  
    56155615     }
    56165616     if ((moreSpecialOptions_&524288)!=0&&
    5617          !nonLinearCost_->numberInfeasibilities()&&
     5617         (!nonLinearCost_||!nonLinearCost_->numberInfeasibilities())&&
    56185618         fabs(dblParam_[ClpDualObjectiveLimit])>1.0e30) {
    56195619       problemStatus_=0;
     
    76217621
    76227622     return 0;
     7623}
     7624/* Write the problem into an Lp file of the given filename.
     7625   If objSense is non zero then -1.0 forces the code to write a
     7626   maximization objective and +1.0 to write a minimization one.
     7627   If 0.0 then solver can do what it wants.
     7628*/
     7629void
     7630ClpSimplex::writeLp(const char *filename,
     7631                               const char *extension ,
     7632                               double epsilon ,
     7633                               int numberAcross ,
     7634                               int decimals ,
     7635                               double objSense ,
     7636                               bool changeNameOnRange) const
     7637{
     7638  std::string f(filename);
     7639  std::string e(extension);
     7640  std::string fullname;
     7641  if (e!="") {
     7642    fullname = f + "." + e;
     7643  } else {
     7644    // no extension so no trailing period
     7645    fullname = f;
     7646  }
     7647  FILE *fp = NULL;
     7648  fp = fopen(fullname.c_str(),"w");
     7649  if (!fp) {
     7650    printf("### ERROR: in OsiSolverInterface::writeLpNative(): unable to open file %s\n",
     7651           fullname.c_str());
     7652    exit(1);
     7653  }
     7654  // get names
     7655  const char * const * const rowNames = rowNamesAsChar();
     7656  const char * const * const columnNames = columnNamesAsChar();
     7657  const int numcols = getNumCols();
     7658  char *integrality = new char[numcols];
     7659  bool hasInteger = false;
     7660 
     7661  for (int i=0; i<numcols; i++) {
     7662    if (isInteger(i)) {
     7663      integrality[i] = 1;
     7664      hasInteger = true;
     7665    } else {
     7666      integrality[i] = 0;
     7667    }
     7668  }
     7669 
     7670  // Get multiplier for objective function - default 1.0
     7671  double *objective = new double[numcols];
     7672  const double *curr_obj = getObjCoefficients();
     7673 
     7674  //if(getObjSense() * objSense < 0.0) {
     7675  double locObjSense = (objSense == 0 ? 1 : objSense);
     7676  if(getObjSense() * locObjSense < 0.0) {
     7677    for (int i=0; i<numcols; i++) {
     7678      objective[i] = - curr_obj[i];
     7679    }
     7680  }
     7681  else {
     7682    for (int i=0; i<numcols; i++) {
     7683      objective[i] = curr_obj[i];
     7684    }
     7685  }
     7686 
     7687  CoinLpIO writer;
     7688  writer.setInfinity(COIN_DBL_MAX);
     7689  writer.setEpsilon(epsilon);
     7690  writer.setNumberAcross(numberAcross);
     7691  writer.setDecimals(decimals);
     7692 
     7693  // Get a row copy in standard format
     7694  CoinPackedMatrix rowCopy;
     7695  rowCopy.setExtraGap(0.0);
     7696  rowCopy.setExtraMajor(0.0);
     7697  rowCopy.reverseOrderedCopyOf(*matrix());
     7698  writer.setLpDataWithoutRowAndColNames(rowCopy,
     7699                                        getColLower(), getColUpper(),
     7700                                        objective, hasInteger ? integrality : 0,
     7701                                        getRowLower(), getRowUpper());
     7702 
     7703  writer.setLpDataRowAndColNames(rowNames, columnNames);
     7704
     7705  delete [] objective;
     7706  delete[] integrality;
     7707  writer.writeLp(fp, epsilon, numberAcross, decimals,
     7708                 changeNameOnRange);
     7709  if (rowNames) {
     7710    deleteNamesAsChar(rowNames, numberRows_+1);
     7711    deleteNamesAsChar(columnNames, numberColumns_);
     7712  }
     7713  fclose(fp);
    76237714}
    76247715#endif
  • trunk/Clp/src/ClpSimplexDual.cpp

    r2115 r2140  
    489489                                ifValuesPass);
    490490          if ((specialOptions_&2097152)!=0&&problemStatus_==1&&!ray_&&
    491               !numberRayTries) {
     491              !numberRayTries && numberIterations_) {
    492492            numberRayTries=1;
    493493            problemStatus_=-1;
     
    23332333                    double mult = multiplier[iStatus-1];
    23342334                    value *= mult;
    2335                     if (value < -tolerance) {
     2335                    // skip free
     2336                    if (value < -tolerance && iStatus > 0) {
    23362337                         // flipping bounds
    23372338                         double movement = mult * (lower[iSequence] - upper[iSequence]);
     
    23762377                         double mult = multiplier[iStatus-1];
    23772378                         value *= mult;
    2378                          if (value < -tolerance) {
     2379                         // skip free
     2380                         if (value < -tolerance && iStatus > 0) {
    23792381                              // flipping bounds
    23802382                              double movement = mult * (upper[iSequence] - lower[iSequence]);
Note: See TracChangeset for help on using the changeset viewer.