00001
00002
00003
00004 #ifndef SmiScnModel_HPP
00005 #define SmiScnModel_HPP
00006
00007 #if defined(_MSC_VER)
00008
00009 # pragma warning(disable:4786)
00010 #endif
00011
00012
00013 #include "SmiDiscreteDistribution.hpp"
00014 #include "SmiScenarioTree.hpp"
00015 #include "SmiScnData.hpp"
00016 #include "OsiSolverInterface.hpp"
00017 #include "CoinPackedVector.hpp"
00018 #include "SmiMessage.hpp"
00019
00020
00021 #include <map>
00022 #include <vector>
00023 using namespace std;
00024
00025
00026 class SmiScnNode;
00027
00028
00029
00030
00053 class SmiScnModel
00054 {
00055 friend void SmiScnModelDiscreteUnitTest();
00056 public:
00057
00070 int readSmps(const char *name,
00071 SmiCoreCombineRule *r=NULL );
00072
00073 SmiCoreData * getCore() {return core_;}
00074
00085
00086
00087
00089 void processDiscreteDistributionIntoScenarios(SmiDiscreteDistribution *s, bool test=false);
00090
00106 SmiScenarioIndex generateScenario(SmiCoreData *core,
00107 CoinPackedMatrix *matrix,
00108 CoinPackedVector *dclo, CoinPackedVector *dcup,
00109 CoinPackedVector *dobj,
00110 CoinPackedVector *drlo, CoinPackedVector *drup,
00111 vector<int>labels, double prob,
00112 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00113
00130 SmiScenarioIndex generateScenario(SmiCoreData *core,
00131 CoinPackedMatrix *matrix,
00132 CoinPackedVector *dclo, CoinPackedVector *dcup,
00133 CoinPackedVector *dobj,
00134 CoinPackedVector *drlo, CoinPackedVector *drup,
00135 SmiStageIndex branch, SmiScenarioIndex anc, double prob,
00136 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00137
00149 OsiSolverInterface * loadOsiSolverData();
00150
00152
00153
00154 SmiScenarioIndex getNumScenarios(){ return smiTree_.getNumScenarios();}
00155 double getScenarioProb(SmiScenarioIndex ns);
00156 SmiScnNode * getLeafNode(SmiScenarioIndex i){ return smiTree_.getLeaf(i)->getDataPtr(); }
00157 SmiScnNode * getRootNode(){ return smiTree_.getRoot()->getDataPtr(); }
00158
00159
00160
00161 double getObjectiveValue(SmiScenarioIndex ns);
00162 double *getColSolution(SmiScenarioIndex ns, int *length);
00163 double *getRowSolution(SmiScenarioIndex ns, int *length);
00164
00165
00166 void setOsiSolverHandle(OsiSolverInterface &osi)
00167 {
00168 osiStoch_ = osi.clone(false);
00169 }
00170 OsiSolverInterface * getOsiSolverInterface();
00171
00172 inline void releaseSolver() {osiStoch_=NULL;}
00173
00174
00175
00176 SmiScnModel():
00177 osiStoch_(NULL),
00178 drlo_(NULL), drup_(NULL), dobj_(NULL), dclo_(NULL), dcup_(NULL), matrix_(NULL),
00179 solve_synch_(false),totalProb_(0),core_(NULL)
00180 { }
00181
00182
00183 ~SmiScnModel();
00184
00185 void addNode(SmiScnNode *node);
00186
00187 private:
00188 CoinMessageHandler *handler_;
00189 SmiMessage *messages_;
00190
00191
00192 OsiSolverInterface * osiStoch_;
00193
00194 int nrow_;
00195 int ncol_;
00196 int nels_;
00197
00198 double *drlo_;
00199 double *drup_;
00200 double *dobj_;
00201 double *dclo_;
00202 double *dcup_;
00203 CoinPackedMatrix *matrix_;
00204
00205
00206
00207 int minrow_;
00208
00209 bool solve_synch_;
00210
00211 double totalProb_;
00212
00213 SmiCoreData * core_;
00214
00215 SmiScenarioTree<SmiScnNode *> smiTree_;
00216 };
00217
00218 class SmiScnNode
00219 {
00220 friend class SmiScnModel;
00221 public:
00222 int getCoreColIndex(int i);
00223 int getCoreRowIndex(int i);
00224 inline void setScenarioIndex(SmiScenarioIndex i){ scen_=i;}
00225 inline SmiScenarioIndex getScenarioIndex() {return scen_;}
00226 inline int getColStart() {return coffset_;}
00227 inline int getRowStart() {return roffset_;}
00228 inline int getNumCols(){ return node_->getCore()->getNumCols(node_->getStage());}
00229 inline int getNumRows(){ return node_->getCore()->getNumRows(node_->getStage());}
00230 inline double getModelProb(){return mdl_prob_;}
00231 inline SmiScnNode * getParent(){ return parent_;}
00232
00233 inline void zapNode() {node_=NULL;}
00234
00235 ~SmiScnNode(){delete node_;}
00236
00237 private:
00238 inline void setRowOffset(int r) {roffset_ = r;}
00239 inline void setParent(SmiScnNode * g) {parent_=g;}
00240 inline void setColOffset(int c) {coffset_ = c;}
00241 inline double addProb(double prob){ return prob_+=prob;}
00242 inline double getProb(){return prob_;}
00243 inline void setProb(double p){prob_=p;}
00244 inline void setModelProb(double p){mdl_prob_=p;}
00245 inline SmiNodeData *getNode() {return node_;}
00246 SmiScnNode(SmiNodeData *&node) {node_=node;prob_=0;parent_=NULL;}
00247
00248 private:
00249 SmiNodeData *node_;
00250 SmiScnNode *parent_;
00251 double prob_;
00252 double mdl_prob_;
00253 int coffset_;
00254 int roffset_;
00255 SmiScenarioIndex scen_;
00256 };
00257
00258
00259 class SmiScnModelAddNode{
00260 public:
00261 void operator() (SmiScnNode *node)
00262 {
00263 s_->addNode(node);
00264 }
00265
00266 SmiScnModelAddNode(SmiScnModel *s) { s_ = s;}
00267 private:
00268 SmiScnModel *s_;
00269
00270
00271 };
00272
00273
00274 #endif //#define SmiScnModel_HPP