Changeset 1049


Ignore:
Timestamp:
Aug 20, 2008 4:36:45 AM (11 years ago)
Author:
stefan
Message:

merge changeset 1048 from Cbc 2.2 stable into this branch to have gamsTest fixed; take out change 1042 because it is redundant

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

Legend:

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

    r912 r1049  
    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/BSP/Cbc/src/CbcSolver.cpp

    r1042 r1049  
    36213621  CbcModel * babModel_ = NULL;
    36223622  int returnMode=1;
     3623  CbcOrClpRead_mode=1;
    36233624  int statusUserFunction_[1];
    36243625  int numberUserFunctions_=1; // to allow for ampl
     
    36323633#endif
    36333634  // Statistics
    3634   CbcOrClpRead_mode = 1;
    36353635  double statistics_seconds=0.0, statistics_obj=0.0;
    36363636  double statistics_continuous=0.0, statistics_tighter=0.0;
     
    66076607                            CbcSimpleInteger * obj =
    66086608                              dynamic_cast <CbcSimpleInteger *>(oldObjects[iObj]) ;
    6609                             assert (obj);
    6610                             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                            }
    66116618                            oldObjects[n++]=oldObjects[iObj];
    66126619                          } else {
     
    76697676                  bestSolution = new double [n];
    76707677                  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                  }
    76717698                  ClpSimplex * lpSolver = clpSolver->getModelPtr();
    76727699                  lpSolver->setSpecialOptions(lpSolver->specialOptions()|IN_BRANCH_AND_BOUND); // say is Cbc (and in branch and bound)
    76737700                  process.postProcess(*babModel_->solver());
    76747701                  // 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
    76757756                  babModel_->assignSolver(saveSolver);
    76767757                  memcpy(bestSolution,babModel_->solver()->getColSolution(),n*sizeof(double));
     
    77057786                  originalSolver->setBasis(*basis);
    77067787                  delete basis;
     7788                  originalSolver->resolve();
     7789                  assert (originalSolver->isProvenOptimal());
    77077790                }
    77087791#endif
Note: See TracChangeset for help on using the changeset viewer.