Cbc  2.9.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OsiChooseVariable.hpp
Go to the documentation of this file.
1 // Copyright (C) 2006, International Business Machines
2 // Corporation and others. All Rights Reserved.
3 // This code is licensed under the terms of the Eclipse Public License (EPL).
4 
5 #ifndef OsiChooseVariable_H
6 #define OsiChooseVariable_H
7 
8 #include <string>
9 #include <vector>
10 
11 #include "CoinWarmStartBasis.hpp"
12 #include "OsiBranchingObject.hpp"
13 
14 class OsiSolverInterface;
15 class OsiHotInfo;
16 
34 
35 public:
36 
39 
41  OsiChooseVariable (const OsiSolverInterface * solver);
42 
45 
48 
50  virtual OsiChooseVariable * clone() const;
51 
53  virtual ~OsiChooseVariable ();
54 
59  virtual int setupList ( OsiBranchingInformation *info, bool initialize);
73  virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables);
75  virtual bool feasibleSolution(const OsiBranchingInformation * info,
76  const double * solution,
77  int numberObjects,
78  const OsiObject ** objects);
80  void saveSolution(const OsiSolverInterface * solver);
82  void clearGoodSolution();
84  virtual void updateInformation( const OsiBranchingInformation *info,
85  int branch, OsiHotInfo * hotInfo);
86 #if 1
87  virtual void updateInformation( int whichObject, int branch,
89  double changeInObjective, double changeInValue,
90  int status);
91 #endif
92  inline double goodObjectiveValue() const
94  { return goodObjectiveValue_;}
96  inline double upChange() const
97  { return upChange_;}
99  inline double downChange() const
100  { return downChange_;}
102  inline const double * goodSolution() const
103  { return goodSolution_;}
105  inline int bestObjectIndex() const
106  { return bestObjectIndex_;}
108  inline void setBestObjectIndex(int value)
109  { bestObjectIndex_ = value;}
111  inline int bestWhichWay() const
112  { return bestWhichWay_;}
114  inline void setBestWhichWay(int value)
115  { bestWhichWay_ = value;}
117  inline int firstForcedObjectIndex() const
118  { return firstForcedObjectIndex_;}
120  inline void setFirstForcedObjectIndex(int value)
121  { firstForcedObjectIndex_ = value;}
123  inline int firstForcedWhichWay() const
124  { return firstForcedWhichWay_;}
126  inline void setFirstForcedWhichWay(int value)
127  { firstForcedWhichWay_ = value;}
129  inline int numberUnsatisfied() const
130  {return numberUnsatisfied_;}
132  inline int numberStrong() const
133  { return numberStrong_;}
135  inline void setNumberStrong(int value)
136  { numberStrong_ = value;}
138  inline int numberOnList() const
139  { return numberOnList_;}
141  inline int numberStrongDone() const
142  { return numberStrongDone_;}
144  inline int numberStrongIterations() const
145  { return numberStrongIterations_;}
147  inline int numberStrongFixed() const
148  { return numberStrongFixed_;}
150  inline const int * candidates() const
151  { return list_;}
153  inline bool trustStrongForBound() const
154  { return trustStrongForBound_;}
156  inline void setTrustStrongForBound(bool yesNo)
157  { trustStrongForBound_ = yesNo;}
159  inline bool trustStrongForSolution() const
160  { return trustStrongForSolution_;}
162  inline void setTrustStrongForSolution(bool yesNo)
163  { trustStrongForSolution_ = yesNo;}
165  void setSolver (const OsiSolverInterface * solver);
177  inline int status() const
178  { return status_;}
179  inline void setStatus(int value)
180  { status_ = value;}
181 
182 
183 protected:
184  // Data
188  double upChange_;
190  double downChange_;
192  double * goodSolution_;
194  int * list_;
196  double * useful_;
199  /* Status -
200  -1 Node is infeasible
201  0 Normal termination - we have a candidate
202  1 All looks satisfied - no candidate
203  2 We can change the bound on a variable - but we also have a strong branching candidate
204  3 We can change the bound on a variable - but we have a non-strong branching candidate
205  4 We can change the bound on a variable - no other candidates
206  */
207  int status_;
233 };
234 
241 protected:
242  // Data
244  double * upTotalChange_;
248  int * upNumber_;
250  int * downNumber_;
255 
256 private:
257  void gutsOfDelete();
258  void gutsOfCopy(const OsiPseudoCosts& rhs);
259 
260 public:
261  OsiPseudoCosts();
262  virtual ~OsiPseudoCosts();
263  OsiPseudoCosts(const OsiPseudoCosts& rhs);
265 
267  inline int numberBeforeTrusted() const
268  { return numberBeforeTrusted_; }
270  inline void setNumberBeforeTrusted(int value)
271  { numberBeforeTrusted_ = value; }
273  void initialize(int n);
275  inline int numberObjects() const
276  { return numberObjects_; }
277 
280  inline double* upTotalChange() { return upTotalChange_; }
281  inline const double* upTotalChange() const { return upTotalChange_; }
282 
283  inline double* downTotalChange() { return downTotalChange_; }
284  inline const double* downTotalChange() const { return downTotalChange_; }
285 
286  inline int* upNumber() { return upNumber_; }
287  inline const int* upNumber() const { return upNumber_; }
288 
289  inline int* downNumber() { return downNumber_; }
290  inline const int* downNumber() const { return downNumber_; }
292 
294  virtual void updateInformation(const OsiBranchingInformation *info,
295  int branch, OsiHotInfo * hotInfo);
296 #if 1
297  virtual void updateInformation( int whichObject, int branch,
299  double changeInObjective, double changeInValue,
300  int status);
301 #endif
302 };
303 
319 
320 public:
321 
323  OsiChooseStrong ();
324 
326  OsiChooseStrong (const OsiSolverInterface * solver);
327 
330 
333 
335  virtual OsiChooseVariable * clone() const;
336 
338  virtual ~OsiChooseStrong ();
339 
344  virtual int setupList ( OsiBranchingInformation *info, bool initialize);
358  virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables);
359 
366  inline int shadowPriceMode() const
367  { return shadowPriceMode_;}
369  inline void setShadowPriceMode(int value)
370  { shadowPriceMode_ = value;}
371 
374  { return pseudoCosts_; }
375 
378  { return pseudoCosts_; }
379 
382  inline int numberBeforeTrusted() const {
384  inline void setNumberBeforeTrusted(int value) {
386  inline int numberObjects() const {
387  return pseudoCosts_.numberObjects(); }
388 
389 protected:
390 
403  int doStrongBranching( OsiSolverInterface * solver,
405  int numberToDo, int returnCriterion);
406 
408  void resetResults(int num);
409 
410 protected:
417 
420 
426 };
427 
432 class OsiHotInfo {
433 
434 public:
435 
437  OsiHotInfo ();
438 
440  OsiHotInfo ( OsiSolverInterface * solver,
441  const OsiBranchingInformation *info,
442  const OsiObject * const * objects,
443  int whichObject);
444 
446  OsiHotInfo (const OsiHotInfo &);
447 
449  OsiHotInfo & operator= (const OsiHotInfo& rhs);
450 
452  virtual OsiHotInfo * clone() const;
453 
455  virtual ~OsiHotInfo ();
456 
460  int updateInformation( const OsiSolverInterface * solver, const OsiBranchingInformation * info,
461  OsiChooseVariable * choose);
463  inline double originalObjectiveValue() const
464  { return originalObjectiveValue_;}
466  inline double upChange() const
467  { assert (branchingObject_->numberBranches()==2); return changes_[1];}
469  inline double downChange() const
470  { assert (branchingObject_->numberBranches()==2); return changes_[0];}
472  inline void setUpChange(double value)
473  { assert (branchingObject_->numberBranches()==2); changes_[1] = value;}
475  inline void setDownChange(double value)
476  { assert (branchingObject_->numberBranches()==2); changes_[0] = value;}
478  inline double change(int k) const
479  { return changes_[k];}
480 
482  inline int upIterationCount() const
483  { assert (branchingObject_->numberBranches()==2); return iterationCounts_[1];}
485  inline int downIterationCount() const
486  { assert (branchingObject_->numberBranches()==2); return iterationCounts_[0];}
488  inline int iterationCount(int k) const
489  { return iterationCounts_[k];}
490 
492  inline int upStatus() const
493  { assert (branchingObject_->numberBranches()==2); return statuses_[1];}
495  inline int downStatus() const
496  { assert (branchingObject_->numberBranches()==2); return statuses_[0];}
498  inline void setUpStatus(int value)
499  { assert (branchingObject_->numberBranches()==2); statuses_[1] = value;}
501  inline void setDownStatus(int value)
502  { assert (branchingObject_->numberBranches()==2); statuses_[0] = value;}
504  inline int status(int k) const
505  { return statuses_[k];}
508  { return branchingObject_;}
509  inline int whichObject() const
510  { return whichObject_;}
511 
512 protected:
513  // Data
517  double * changes_;
526  int * statuses_;
531 };
532 
533 
534 #endif
void resetResults(int num)
Clear out the results array.
virtual int setupList(OsiBranchingInformation *info, bool initialize)
Sets up strong list and clears all if initialize is true.
int downIterationCount() const
Down iteration count - invalid if n-way.
double upChange_
Estimate of up change or change on chosen if n-way.
void setNumberBeforeTrusted(int value)
Set number of times before trusted.
void setSolver(const OsiSolverInterface *solver)
Set solver and redo arrays.
double goodObjectiveValue_
Objective value for feasible solution.
int numberObjects() const
Give the number of objects for which pseudo costs are stored.
double * useful_
Useful array (for sorting etc)
double * goodSolution_
Good solution - deleted by finalize.
void setTrustStrongForSolution(bool yesNo)
Set trust results from strong branching for valid solution.
int numberStrongFixed() const
Number of strong branches which changed bounds.
int firstForcedObjectIndex() const
Index of forced object.
int firstForcedWhichWay_
Preferred way of forced object.
virtual int chooseVariable(OsiSolverInterface *solver, OsiBranchingInformation *info, bool fixVariables)
Choose a variable Returns - -1 Node is infeasible 0 Normal termination - we have a candidate 1 All lo...
virtual void updateInformation(const OsiBranchingInformation *info, int branch, OsiHotInfo *hotInfo)
Given a candidate fill in useful information e.g. estimates.
virtual OsiHotInfo * clone() const
Clone.
int numberStrong() const
Number of objects to choose for strong branching.
int whichObject_
Which object on list.
const double * downTotalChange() const
int numberStrongIterations() const
Number of strong iterations actually done.
OsiChooseStrong & operator=(const OsiChooseStrong &rhs)
Assignment operator.
int whichObject() const
void setBestObjectIndex(int value)
Set index of chosen object.
OsiPseudoCosts & pseudoCosts()
Accessor method to pseudo cost object.
OsiPseudoCosts & operator=(const OsiPseudoCosts &rhs)
void setNumberStrong(int value)
Set number of objects to choose for strong branching.
const int * candidates() const
List of candidates.
int bestObjectIndex_
Index of chosen object.
int numberStrongFixed_
Number of bound changes due to strong branching.
void setStatus(int value)
void setNumberBeforeTrusted(int value)
int numberStrong_
Number of objects to choose for strong branching.
OsiHotInfo * results_
The results of the strong branching done on the candidates where the pseudocosts were not sufficient...
int * list_
List of candidates.
double downChange_
Estimate of down change or max change on other possibilities if n-way.
Abstract branching object base class.
void setDownChange(double value)
Set down change - invalid if n-way.
double upChange() const
Up change - invalid if n-way.
int bestWhichWay() const
Preferred way of chosen object.
int status() const
Return status - -1 Node is infeasible 0 Normal termination - we have a candidate 1 All looks satisfie...
double downChange() const
Down change - invalid if n-way.
This class contains the result of strong branching on a variable When created it stores enough inform...
OsiBranchingObject * branchingObject() const
Branching object.
void setTrustStrongForBound(bool yesNo)
Set trust results from strong branching for changing bounds.
const double * goodSolution() const
Good solution - deleted by finalize.
bool trustStrongForSolution_
Trust results from strong branching for valid solution.
const OsiSolverInterface * solver_
Pointer to solver.
int * upNumber_
Number of times up.
void setBestWhichWay(int value)
Set preferred way of chosen object.
virtual bool feasibleSolution(const OsiBranchingInformation *info, const double *solution, int numberObjects, const OsiObject **objects)
Returns true if solution looks feasible against given objects.
void clearGoodSolution()
Clears out good solution after use.
Abstract Base Class for describing an interface to a solver.
int numberUnsatisfied() const
Get the number of objects unsatisfied at this node - accurate on first pass.
OsiChooseStrong()
Default Constructor.
int upIterationCount() const
Up iteration count - invalid if n-way.
void setDownStatus(int value)
Set down status - invalid if n-way.
void setShadowPriceMode(int value)
Set Shadow price mode.
int firstForcedWhichWay() const
Preferred way of forced object.
void initialize(int n)
Initialize the pseudocosts with n entries.
virtual ~OsiHotInfo()
Destructor.
OsiBranchingObject * branchingObject_
Branching object.
void gutsOfCopy(const OsiPseudoCosts &rhs)
int numberStrongDone_
Number of strong branches actually done.
virtual ~OsiChooseVariable()
Destructor.
double * downTotalChange_
Total of all changes down.
double * upTotalChange_
Total of all changes up.
double upChange() const
Estimate of up change or change on chosen if n-way.
int doStrongBranching(OsiSolverInterface *solver, OsiBranchingInformation *info, int numberToDo, int returnCriterion)
This is a utility function which does strong branching on a list of objects and stores the results in...
virtual OsiChooseVariable * clone() const
Clone.
void setFirstForcedObjectIndex(int value)
Set index of forced object.
virtual int chooseVariable(OsiSolverInterface *solver, OsiBranchingInformation *info, bool fixVariables)
Choose a variable Returns - -1 Node is infeasible 0 Normal termination - we have a candidate 1 All lo...
int shadowPriceMode_
Pseudo Shadow Price mode 0 - off 1 - use and multiply by strong info 2 - use.
double originalObjectiveValue() const
Original objective value.
void setUpStatus(int value)
Set up status - invalid if n-way.
int numberBeforeTrusted_
Number before we trust.
OsiChooseVariable()
Default Constructor.
int numberObjects_
Number of objects (could be found from solver)
This class is the placeholder for the pseudocosts used by OsiChooseStrong.
double originalObjectiveValue_
Original objective value.
double change(int k) const
Change on way k.
int numberBeforeTrusted() const
A feww pass-through methods to access members of pseudoCosts_ as if they were members of OsiChooseStr...
const int * downNumber() const
OsiPseudoCosts pseudoCosts_
The pseudo costs for the chooser.
OsiChooseVariable & operator=(const OsiChooseVariable &rhs)
Assignment operator.
const int * upNumber() const
virtual ~OsiPseudoCosts()
int * downNumber_
Number of times down.
int numberObjects() const
virtual void updateInformation(const OsiBranchingInformation *info, int branch, OsiHotInfo *hotInfo)
Given a candidate fill in useful information e.g. estimates.
bool trustStrongForBound_
List of unsatisfied objects - first numberOnList_ for strong branching Trust results from strong bran...
double * downTotalChange()
int numberStrongIterations_
Number of strong iterations actually done.
int * statuses_
Status -1 - not done 0 - feasible and finished 1 - infeasible 2 - not finished.
int * iterationCounts_
Iteration counts.
double * changes_
Objective changes.
double * upTotalChange()
int status(int k) const
Status on way k.
int numberStrongDone() const
Number of strong branches actually done.
int downStatus() const
Down status - invalid if n-way.
int numberBeforeTrusted() const
Number of times before trusted.
virtual OsiChooseVariable * clone() const
Clone.
const OsiPseudoCosts & pseudoCosts() const
Accessor method to pseudo cost object.
bool trustStrongForSolution() const
Trust results from strong branching for valid solution.
int bestWhichWay_
Preferred way of chosen object.
OsiHotInfo & operator=(const OsiHotInfo &rhs)
Assignment operator.
int numResults_
The number of OsiHotInfo objetcs that contain information.
virtual int setupList(OsiBranchingInformation *info, bool initialize)
Sets up strong list and clears all if initialize is true.
int numberUnsatisfied_
The number of objects unsatisfied at this node.
void gutsOfDelete()
This class chooses a variable to branch on.
int numberOnList() const
Number left on strong list.
int numberOnList_
Number left on strong list.
OsiHotInfo()
Default Constructor.
int bestObjectIndex() const
Index of chosen object.
int updateInformation(const OsiSolverInterface *solver, const OsiBranchingInformation *info, OsiChooseVariable *choose)
Fill in useful information after strong branch.
Abstract base class for `objects&#39;.
int firstForcedObjectIndex_
Index of forced object.
int upStatus() const
Up status - invalid if n-way.
int numberBranches() const
The number of branch arms created for this branching object.
int shadowPriceMode() const
Pseudo Shadow Price mode 0 - off 1 - use if no strong info 2 - use if strong not trusted 3 - use even...
double goodObjectiveValue() const
Objective value for feasible solution.
int iterationCount(int k) const
Iteration count on way k.
void setUpChange(double value)
Set up change - invalid if n-way.
double downChange() const
Estimate of down change or max change on other possibilities if n-way.
void saveSolution(const OsiSolverInterface *solver)
Saves a good solution.
This class chooses a variable to branch on.
void setFirstForcedWhichWay(int value)
Set preferred way of forced object.
const double * upTotalChange() const
virtual ~OsiChooseStrong()
Destructor.
bool trustStrongForBound() const
Trust results from strong branching for changing bounds.