Changeset 1048 for stable/2.2


Ignore:
Timestamp:
Aug 20, 2008 3:17:05 AM (10 years ago)
Author:
forrest
Message:

2.1 changes to 2.2 for Stefan

Location:
stable/2.2/Cbc/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • stable/2.2/Cbc/src/CbcBranchLotsize.hpp

    r912 r1048  
    9696  inline int modelSequence() const
    9797  {return columnNumber_;}
     98  /// Set model column number
     99  inline void setModelSequence(int value)
     100  {columnNumber_ = value;}
    98101
    99102  /** Column number if single column object -1 otherwise,
  • stable/2.2/Cbc/src/CbcSolver.cpp

    r1030 r1048  
    36213621  CbcModel * babModel_ = NULL;
    36223622  int returnMode=1;
     3623  CbcOrClpRead_mode=1;
    36233624  int statusUserFunction_[1];
    36243625  int numberUserFunctions_=1; // to allow for ampl
     
    66066607                            CbcSimpleInteger * obj =
    66076608                              dynamic_cast <CbcSimpleInteger *>(oldObjects[iObj]) ;
    6608                             assert (obj);
    6609                             obj->setColumnNumber(iColumn);
     6609                            if (obj) {
     6610                              obj->setColumnNumber(iColumn);
     6611                            } else {
     6612                              // only other case allowed is lotsizing
     6613                              CbcLotsize * obj2 =
     6614                                dynamic_cast <CbcLotsize *>(oldObjects[iObj]) ;
     6615                              assert (obj2);
     6616                              obj2->setModelSequence(iColumn);
     6617                            }
    66106618                            oldObjects[n++]=oldObjects[iObj];
    66116619                          } else {
     
    76687676                  bestSolution = new double [n];
    76697677                  OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (babModel_->solver());
     7678                  // Save bounds on processed model
     7679                  const int * originalColumns = process.originalColumns();
     7680                  int numberColumns2 = clpSolver->getNumCols();
     7681                  double * solution2 = new double[n];
     7682                  double * lower2 = new double [n];
     7683                  double * upper2 = new double [n];
     7684                  for (int i=0;i<n;i++) {
     7685                    solution2[i]=COIN_DBL_MAX;
     7686                    lower2[i]=COIN_DBL_MAX;
     7687                    upper2[i]=-COIN_DBL_MAX;
     7688                  }
     7689                  const double *columnLower = clpSolver->getColLower() ;
     7690                  const double * columnUpper = clpSolver->getColUpper() ;
     7691                  const double * solution = babModel_->bestSolution();
     7692                  for (int i=0;i<numberColumns2;i++) {
     7693                    int jColumn = originalColumns[i];
     7694                    solution2[jColumn]=solution[i];
     7695                    lower2[jColumn]=columnLower[i];
     7696                    upper2[jColumn]=columnUpper[i];
     7697                  }
    76707698                  ClpSimplex * lpSolver = clpSolver->getModelPtr();
    76717699                  lpSolver->setSpecialOptions(lpSolver->specialOptions()|IN_BRANCH_AND_BOUND); // say is Cbc (and in branch and bound)
    76727700                  process.postProcess(*babModel_->solver());
    76737701                  // Solution now back in saveSolver
     7702                  // Double check bounds
     7703                  columnLower = saveSolver->getColLower() ;
     7704                  columnUpper = saveSolver->getColUpper() ;
     7705                  solution = saveSolver->getColSolution();
     7706                  int numberChanged=0;
     7707                  for (int i=0;i<n;i++) {
     7708                    if (lower2[i]!=COIN_DBL_MAX) {
     7709                      if (lower2[i]!=columnLower[i]||
     7710                          upper2[i]!=columnUpper[i]) {
     7711                        if (lower2[i]<columnLower[i]||
     7712                            upper2[i]>columnUpper[i]) {
     7713#ifdef COIN_DEVELOP
     7714                          printf("odd bounds tighter");
     7715                          printf("%d bab bounds %g %g now %g %g\n",
     7716                                 i,lower2[i],upper2[i],columnLower[i],
     7717                                 columnUpper[i]);
     7718#endif
     7719                        } else {
     7720#ifdef COIN_DEVELOP
     7721                          printf("%d bab bounds %g %g now %g %g\n",
     7722                                 i,lower2[i],upper2[i],columnLower[i],
     7723                                 columnUpper[i]);
     7724#endif
     7725                          numberChanged++;
     7726                          saveSolver->setColLower(i,lower2[i]);
     7727                          saveSolver->setColUpper(i,upper2[i]);
     7728                        }
     7729                      }
     7730                    }
     7731                  }
     7732                  delete [] solution2;
     7733                  delete [] lower2;
     7734                  delete [] upper2;
     7735                  if (numberChanged) {
     7736                    sprintf(generalPrint,"%d bounds tightened after postprocessing\n",
     7737                            numberChanged);
     7738                    generalMessageHandler->message(CLP_GENERAL,generalMessages)
     7739                      << generalPrint
     7740                      <<CoinMessageEol;
     7741                    saveSolver->resolve();
     7742                    assert (saveSolver->isProvenOptimal());
     7743                  }
     7744#if NEW_STYLE_SOLVER==0
     7745                  // and original solver
     7746                  assert (n==originalSolver->getNumCols());
     7747                  originalSolver->setColLower(saveSolver->getColLower());
     7748                  originalSolver->setColUpper(saveSolver->getColUpper());
     7749                  // basis
     7750                  CoinWarmStartBasis * basis = dynamic_cast<CoinWarmStartBasis *> (babModel_->solver()->getWarmStart());
     7751                  originalSolver->setBasis(*basis);
     7752                  delete basis;
     7753                  originalSolver->resolve();
     7754                  assert (originalSolver->isProvenOptimal());
     7755#endif
    76747756                  babModel_->assignSolver(saveSolver);
    76757757                  memcpy(bestSolution,babModel_->solver()->getColSolution(),n*sizeof(double));
     
    77047786                  originalSolver->setBasis(*basis);
    77057787                  delete basis;
     7788                  originalSolver->resolve();
     7789                  assert (originalSolver->isProvenOptimal());
    77067790                }
    77077791#endif
Note: See TracChangeset for help on using the changeset viewer.