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
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 SmiStageIndex branch, SmiScenarioIndex anc, double prob,
00112 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00113
00129 SmiScenarioIndex generateScenario(SmiCoreData *core,
00130 CoinPackedMatrix *matrix,
00131 CoinPackedVector *dclo, CoinPackedVector *dcup,
00132 CoinPackedVector *dobj,
00133 CoinPackedVector *drlo, CoinPackedVector *drup,
00134 vector<int>labels, double prob,
00135 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00136
00148 OsiSolverInterface * loadOsiSolverData();
00149
00151
00152
00153 SmiScenarioIndex getNumScenarios(){ return smiTree_.getNumScenarios();}
00154 double getScenarioProb(SmiScenarioIndex ns);
00155 SmiScnNode * getLeafNode(SmiScenarioIndex i){ return smiTree_.getLeaf(i)->getDataPtr(); }
00156 SmiScnNode * getRootNode(){ return smiTree_.getRoot()->getDataPtr(); }
00157
00158
00159
00160 double getObjectiveValue(SmiScenarioIndex ns);
00161 double *getColSolution(SmiScenarioIndex ns, int *length);
00162 double *getRowSolution(SmiScenarioIndex ns, int *length);
00163
00164
00165 void setOsiSolverHandle(OsiSolverInterface &osi)
00166 {
00167 osiStoch_ = osi.clone(false);
00168 }
00169 void setOsiSolverHandle(OsiSolverInterface *osi)
00170 {
00171 osiStoch_ = osi->clone(false);
00172 }
00173 OsiSolverInterface * getOsiSolverInterface();
00174
00175 inline void releaseSolver() {osiStoch_=NULL;}
00176
00177
00178
00179 SmiScnModel():
00180 osiStoch_(NULL),
00181 drlo_(NULL), drup_(NULL), dobj_(NULL), dclo_(NULL), dcup_(NULL), matrix_(NULL),
00182 solve_synch_(false),totalProb_(0),core_(NULL)
00183 { }
00184
00185
00186 ~SmiScnModel();
00187
00188 void addNode(SmiScnNode *node);
00189
00190 private:
00191 CoinMessageHandler *handler_;
00192 SmiMessage *messages_;
00193
00194
00195 OsiSolverInterface * osiStoch_;
00196
00197 int nrow_;
00198 int ncol_;
00199 int nels_;
00200 int nels_max;
00201
00202 double *drlo_;
00203 double *drup_;
00204 double *dobj_;
00205 double *dclo_;
00206 double *dcup_;
00207 CoinPackedMatrix *matrix_;
00208 double *dels_;
00209 int *indx_;
00210 int *rstrt_;
00211
00212
00213
00214 int minrow_;
00215
00216 bool solve_synch_;
00217
00218 double totalProb_;
00219
00220 SmiCoreData * core_;
00221
00222 SmiScenarioTree<SmiScnNode *> smiTree_;
00223 };
00224
00225 class SmiScnNode
00226 {
00227 friend class SmiScnModel;
00228 public:
00229 int getCoreColIndex(int i);
00230 int getCoreRowIndex(int i);
00231 inline void setScenarioIndex(SmiScenarioIndex i){ scen_=i;}
00232 inline SmiScenarioIndex getScenarioIndex() {return scen_;}
00233 inline int getColStart() {return coffset_;}
00234 inline int getRowStart() {return roffset_;}
00235 inline int getNumCols(){ return node_->getCore()->getNumCols(node_->getStage());}
00236 inline int getNumRows(){ return node_->getCore()->getNumRows(node_->getStage());}
00237 inline double getModelProb(){return mdl_prob_;}
00238 inline SmiScnNode * getParent(){ return parent_;}
00239
00240 inline void zapNode() {node_=NULL;}
00241
00242 ~SmiScnNode(){delete node_;}
00243
00244 private:
00245 inline void setRowOffset(int r) {roffset_ = r;}
00246 inline void setParent(SmiScnNode * g) {parent_=g;}
00247 inline void setColOffset(int c) {coffset_ = c;}
00248 inline double addProb(double prob){ return prob_+=prob;}
00249 inline double getProb(){return prob_;}
00250 inline void setProb(double p){prob_=p;}
00251 inline void setModelProb(double p){mdl_prob_=p;}
00252 inline SmiNodeData *getNode() {return node_;}
00253 SmiScnNode(SmiNodeData *&node) {node_=node;prob_=0;parent_=NULL;}
00254
00255 private:
00256 SmiNodeData *node_;
00257 SmiScnNode *parent_;
00258 double prob_;
00259 double mdl_prob_;
00260 int coffset_;
00261 int roffset_;
00262 SmiScenarioIndex scen_;
00263 };
00264
00265
00266 class SmiScnModelAddNode{
00267 public:
00268 void operator() (SmiScnNode *node)
00269 {
00270 s_->addNode(node);
00271 }
00272
00273 SmiScnModelAddNode(SmiScnModel *s) { s_ = s;}
00274 private:
00275 SmiScnModel *s_;
00276
00277
00278 };
00279
00280
00281 #endif //#define SmiScnModel_HPP