/home/coin/SVN-release/CoinAll-1.1.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                                 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         // get scenario problem data
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         // getXXX by scenario
00160         double getObjectiveValue(SmiScenarioIndex ns);
00161         double *getColSolution(SmiScenarioIndex ns, int *length);
00162         double *getRowSolution(SmiScenarioIndex ns, int *length);
00163 
00164         // OsiSolverInterface
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         // If user wants to delete SmiScnModel but keep OsiSolverInterface
00175         inline void releaseSolver() {osiStoch_=NULL;}
00176 
00177 
00178         // constructor
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         // destructor
00186         ~SmiScnModel();
00187 
00188         void addNode(SmiScnNode *node);
00189 
00190 private:
00191         CoinMessageHandler *handler_;
00192         SmiMessage *messages_;
00193 
00194         // internal clone of user declared OSI
00195         OsiSolverInterface * osiStoch_;
00196         // model statistics useful for predefining size of structures
00197         int nrow_;
00198         int ncol_;
00199         int nels_;
00200         int nels_max;
00201         // data pointers used in AddNode
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         // number of scenarios
00212 //      int scen_;
00213         // not sure if this is used
00214         int minrow_;
00215         // not sure if this is used
00216         bool solve_synch_;
00217         // total probability of added scenarios; used to normalize probability to one
00218         double totalProb_;
00219         //core model --- used for discrete distributions
00220         SmiCoreData * core_;
00221         // scenario tree pointer
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         // So can delete root node
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 // function object for addnode loop
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

Generated on Sun Nov 14 14:06:40 2010 for Coin-All by  doxygen 1.4.7