/home/coin/SVN-release/Smi-0.81.0/Smi/src/SmiScnModel.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 #ifndef SmiScnModel_HPP
00005 #define SmiScnModel_HPP
00006 
00007 #if defined(_MSC_VER)
00008 // Turn off compiler warning about long names
00009 #  pragma warning(disable:4786)
00010 #endif
00011 
00012 // Include files
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 // STL declarations
00021 #include <map>
00022 #include <vector>
00023 using namespace std;
00024 
00025 // forward declaration of SmiScnNode
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         // get scenario problem data
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         // getXXX by scenario
00161         double getObjectiveValue(SmiScenarioIndex ns);
00162         double *getColSolution(SmiScenarioIndex ns, int *length);
00163         double *getRowSolution(SmiScenarioIndex ns, int *length);
00164 
00165         // OsiSolverInterface
00166         void setOsiSolverHandle(OsiSolverInterface &osi)
00167         {
00168                 osiStoch_ = osi.clone(false);
00169         }
00170         OsiSolverInterface * getOsiSolverInterface();
00171         // If user wants to delete SmiScnModel but keep OsiSolverInterface
00172         inline void releaseSolver() {osiStoch_=NULL;}
00173 
00174 
00175         // constructor 
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         // destructor
00183         ~SmiScnModel();
00184 
00185         void addNode(SmiScnNode *node);
00186 
00187 private:
00188         CoinMessageHandler *handler_;
00189         SmiMessage *messages_;
00190 
00191         // internal clone of user declared OSI
00192         OsiSolverInterface * osiStoch_;
00193         // model statistics useful for predefining size of structures
00194         int nrow_;
00195         int ncol_;
00196         int nels_;
00197         // data pointers used in AddNode
00198         double *drlo_; 
00199         double *drup_;
00200         double *dobj_;
00201         double *dclo_; 
00202         double *dcup_;
00203         CoinPackedMatrix *matrix_;
00204         // number of scenarios
00205 //      int scen_;
00206         // not sure if this is used
00207         int minrow_;
00208         // not sure if this is used
00209         bool solve_synch_;
00210         // total probability of added scenarios; used to normalize probability to one
00211         double totalProb_;
00212         //core model --- used for discrete distributions
00213         SmiCoreData * core_;
00214         // scenario tree pointer
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         // So can delete root node
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 // function object for addnode loop
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

Generated on Fri May 16 19:29:35 2008 by  doxygen 1.4.7