00001
00002
00003 #ifndef SmiDiscreteRV_H
00004 #define SmiDiscreteRV_H
00005
00006 #if defined(_MSC_VER)
00007
00008 # pragma warning(disable:4786)
00009 #endif
00010
00020 #include "SmiScnData.hpp"
00021 #include "SmiLinearData.hpp"
00022
00023 #include <vector>
00024 using namespace std;
00025
00026
00027 class SmiDiscreteRV;
00028
00029 class SmiDiscreteDistribution
00030 {
00031 friend void SmiDiscreteUnitTest();
00032 public:
00034 void addDiscreteRV(SmiDiscreteRV *s)
00035 { smiDiscrete_.push_back(s); }
00036
00038 SmiDiscreteRV * getDiscreteRV(int i) {return smiDiscrete_[i];}
00039
00041 int getNumRV() { return (int)smiDiscrete_.size(); }
00042
00044 SmiCoreData *getCore(){ return core_; }
00045
00047 inline void setCombineWithCoreRule(SmiCoreCombineRule *r){
00048 combineRule_ = r;
00049 }
00050
00052 inline SmiCoreCombineRule *getCombineWithCoreRule() { return combineRule_;}
00053
00054
00056 SmiDiscreteDistribution(SmiCoreData *c, SmiCoreCombineRule *r=SmiCoreCombineReplace::Instance())
00057 {
00058 core_=c;
00059 this->setCombineWithCoreRule(r);
00060 }
00061
00062 ~SmiDiscreteDistribution();
00063
00064 private:
00065 SmiDiscreteDistribution(){core_=NULL;}
00066 SmiCoreData *core_;
00067 vector<SmiDiscreteRV *> smiDiscrete_;
00068 SmiCoreCombineRule *combineRule_;
00069
00070
00071 };
00072
00073
00074 class SmiDiscreteEvent : public SmiLinearData
00075 {
00076 friend void SmiDiscreteUnitTest();
00077 public:
00078 inline void setEventProb(double p) {prob_ = p;}
00079 inline const double getEventProb () { return prob_; }
00080 SmiDiscreteEvent(SmiLinearData d, double p):SmiLinearData(d),prob_(p){}
00081 ~SmiDiscreteEvent(){}
00082 private:
00083 double prob_;
00084 };
00085
00086
00087 class SmiDiscreteRV
00088 {
00089 friend void SmiDiscreteUnitTest();
00090 public:
00091 void addEvent(CoinPackedMatrix &matrix,
00092 CoinPackedVector &dclo, CoinPackedVector &dcup,
00093 CoinPackedVector &dobj,
00094 CoinPackedVector &drlo, CoinPackedVector &drup, double prob)
00095 {
00096 SmiLinearData d(matrix,dclo,dcup,dobj,drlo,drup);
00097 SmiDiscreteEvent *e = new SmiDiscreteEvent(d,prob);
00098 events_.push_back(e);
00099 prob_+=prob;
00100 }
00101 void addEvent(OsiSolverInterface &osi, double prob)
00102 {
00103 SmiLinearData d(osi);
00104 SmiDiscreteEvent *e = new SmiDiscreteEvent(d,prob);
00105 events_.push_back(e);
00106 prob_+=prob;
00107 }
00108
00109 inline const CoinPackedMatrix &getEventMatrix(int i) {return events_[i]->getMatrix(); }
00110 inline const CoinPackedVector &getEventColLower(int i) {return events_[i]->getColLower();}
00111 inline const CoinPackedVector &getEventColUpper(int i) {return events_[i]->getColUpper();}
00112 inline const CoinPackedVector &getEventObjective(int i){return events_[i]->getObjective();}
00113 inline const CoinPackedVector &getEventRowLower(int i) {return events_[i]->getRowLower();}
00114 inline const CoinPackedVector &getEventRowUpper(int i) {return events_[i]->getRowUpper();}
00115 double getEventProb(int i) {
00116
00117 return events_[i]->getEventProb();
00118 }
00119 inline size_t getNumEvents() { return events_.size(); }
00120 inline int getStage() {return stg_;}
00121 inline void setStage(int p) {stg_=p;}
00122 SmiDiscreteRV(){prob_=0.0; stg_=-1;}
00123 SmiDiscreteRV(int p) {prob_=0.0; stg_=p;}
00124 ~SmiDiscreteRV(){}
00125 private:
00126 vector<SmiDiscreteEvent *> events_;
00127 SmiStageIndex stg_;
00128 double prob_;
00129 };
00130
00131 void SmiDiscreteUnitTest();
00132
00133 #endif //SmiDiscreteRV_H
00134