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 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
00102 inline const CoinPackedMatrix &getEventMatrix(int i) {return events_[i]->getMatrix(); }
00103 inline const CoinPackedVector &getEventColLower(int i) {return events_[i]->getColLower();}
00104 inline const CoinPackedVector &getEventColUpper(int i) {return events_[i]->getColUpper();}
00105 inline const CoinPackedVector &getEventObjective(int i){return events_[i]->getObjective();}
00106 inline const CoinPackedVector &getEventRowLower(int i) {return events_[i]->getRowLower();}
00107 inline const CoinPackedVector &getEventRowUpper(int i) {return events_[i]->getRowUpper();}
00108 double getEventProb(int i) {
00109
00110 return events_[i]->getEventProb();
00111 }
00112 inline int getNumEvents() { return events_.size(); }
00113 inline int getStage() {return stg_;}
00114 inline void setStage(int p) {stg_=p;}
00115 SmiDiscreteRV(){prob_=0.0; stg_=-1;}
00116 SmiDiscreteRV(int p) {prob_=0.0; stg_=p;}
00117 ~SmiDiscreteRV(){};
00118 private:
00119 vector<SmiDiscreteEvent *> events_;
00120 SmiStageIndex stg_;
00121 double prob_;
00122 };
00123
00124 void SmiDiscreteUnitTest();
00125
00126 #endif //SmiDiscreteRV_H
00127