00001
00002
00003
00004
00005 #ifndef OsiSolverBranch_H
00006 #define OsiSolverBranch_H
00007
00008 class OsiSolverInterface;
00009 #include "CoinWarmStartBasis.hpp"
00010
00011
00012
00018 class OsiSolverBranch {
00019
00020 public:
00022
00023
00024 void addBranch(int iColumn, double value);
00025
00027 void addBranch(int way,int numberTighterLower, const int * whichLower, const double * newLower,
00028 int numberTighterUpper, const int * whichUpper, const double * newUpper);
00030 void addBranch(int way,int numberColumns,const double * oldLower, const double * newLower,
00031 const double * oldUpper, const double * newUpper);
00032
00034 void applyBounds(OsiSolverInterface & solver,int way) const;
00036 bool feasibleOneWay(const OsiSolverInterface & solver) const;
00038 inline const int * starts() const
00039 { return start_;}
00041 inline const int * which() const
00042 { return indices_;}
00044 inline const double * bounds() const
00045 { return bound_;}
00047
00048
00050
00051
00052 OsiSolverBranch();
00053
00055 OsiSolverBranch(const OsiSolverBranch & rhs);
00056
00058 OsiSolverBranch & operator=(const OsiSolverBranch & rhs);
00059
00061 ~OsiSolverBranch ();
00062
00064
00065 private:
00067
00068
00069 int start_[5];
00071 int * indices_;
00073 double * bound_;
00075 };
00076
00077
00083 class OsiSolverResult {
00084
00085 public:
00087
00088
00089 void createResult(const OsiSolverInterface & solver,const double * lowerBefore,
00090 const double * upperBefore);
00091
00093 void restoreResult(OsiSolverInterface & solver) const;
00094
00096 inline const CoinWarmStartBasis & basis() const
00097 { return basis_;}
00098
00100 inline double objectiveValue() const
00101 { return objectiveValue_;}
00102
00104 inline const double * primalSolution() const
00105 { return primalSolution_;}
00106
00108 inline const double * dualSolution() const
00109 { return dualSolution_;}
00110
00112 inline const OsiSolverBranch & fixed() const
00113 { return fixed_;}
00115
00116
00118
00119
00120 OsiSolverResult();
00121
00123 OsiSolverResult(const OsiSolverInterface & solver,const double * lowerBefore,
00124 const double * upperBefore);
00125
00127 OsiSolverResult(const OsiSolverResult & rhs);
00128
00130 OsiSolverResult & operator=(const OsiSolverResult & rhs);
00131
00133 ~OsiSolverResult ();
00134
00136
00137 private:
00139
00140
00141 double objectiveValue_;
00143 CoinWarmStartBasis basis_;
00145 double * primalSolution_;
00147 double * dualSolution_;
00149 OsiSolverBranch fixed_;
00151 };
00152 #endif