00001
00002
00003
00004 #ifndef SmiScnModel_HPP
00005 #define SmiScnModel_HPP
00006
00007
00008 #include "CoinPragma.hpp"
00009 #include "SmiDiscreteDistribution.hpp"
00010 #include "SmiScenarioTree.hpp"
00011 #include "SmiScnData.hpp"
00012 #include "OsiSolverInterface.hpp"
00013 #include "CoinPackedVector.hpp"
00014 #include "SmiMessage.hpp"
00015 #include "ClpModel.hpp"
00016
00017
00018
00019 #include <vector>
00020
00021
00022 class SmiScnNode;
00023
00024
00025
00026
00049 class SmiScnModel
00050 {
00051 friend void SmiScnModelDiscreteUnitTest();
00052 friend void DecompUnitTest();
00053 public:
00054
00067 int readSmps(const char *name,
00068 SmiCoreCombineRule *r=NULL);
00069
00083 int writeSmps(const char *name, bool winFileExtensions = false, bool strictFormat = true);
00084
00085 SmiCoreData * getCore() {return core_;}
00086
00097
00098
00099
00101 void processDiscreteDistributionIntoScenarios(SmiDiscreteDistribution *s, bool test=false);
00102
00103 void setModelProb(double p) {totalProb_=p; }
00104
00105 int addNodeToSubmodel(SmiScnNode * smiScnNode);
00106
00124 SmiScenarioIndex generateScenario(SmiCoreData *core,
00125 CoinPackedMatrix *matrix,
00126 CoinPackedVector *dclo, CoinPackedVector *dcup,
00127 CoinPackedVector *dobj,
00128 CoinPackedVector *drlo, CoinPackedVector *drup,
00129 SmiStageIndex branch, SmiScenarioIndex anc, double prob,
00130 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00131
00147 SmiScenarioIndex generateScenario(SmiCoreData *core,
00148 CoinPackedMatrix *matrix,
00149 CoinPackedVector *dclo, CoinPackedVector *dcup,
00150 CoinPackedVector *dobj,
00151 CoinPackedVector *drlo, CoinPackedVector *drup,
00152 std::vector<int>labels, double prob,
00153 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00154
00172 SmiScenarioIndex generateScenario(
00173 CoinPackedMatrix *matrix,
00174 CoinPackedVector *dclo, CoinPackedVector *dcup,
00175 CoinPackedVector *dobj,
00176 CoinPackedVector *drlo, CoinPackedVector *drup,
00177 SmiStageIndex branch, SmiScenarioIndex anc, double prob,
00178 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00179
00195 SmiScenarioIndex generateScenario(
00196 CoinPackedMatrix *matrix,
00197 CoinPackedVector *dclo, CoinPackedVector *dcup,
00198 CoinPackedVector *dobj,
00199 CoinPackedVector *drlo, CoinPackedVector *drup,
00200 std::vector<int>labels, double prob,
00201 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00202
00203 SmiScenarioIndex generateScenarioFromCore(SmiCoreData *core, double prob,
00204 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00205 SmiScenarioIndex generateScenarioFromCore(double prob,
00206 SmiCoreCombineRule *r = SmiCoreCombineReplace::Instance());
00207
00219 OsiSolverInterface * loadOsiSolverData();
00220 OsiSolverInterface * loadOsiSolverDataForSubproblem(int stage, int scenStart);
00221
00222 std::vector< std::pair<double,double> > solveWS(OsiSolverInterface *osiSolver, double objSense);
00223 std::pair<double,double*> solveEV(OsiSolverInterface *osiSolver, double objSense);
00224 double solveEEV(OsiSolverInterface *osiSolver, double objSense);
00225
00226 double getWSValue(OsiSolverInterface *osiSolver, double objSense);
00227 double getEVValue(OsiSolverInterface* osiSolver, double objSense);
00228 double getEEVValue(OsiSolverInterface* osiSolver, double objSense);
00229
00230
00231 void setCore(SmiCoreData * val) { core_ = val; }
00232
00233
00234 SmiScenarioIndex getNumScenarios(){ return smiTree_.getNumScenarios();}
00235 double getScenarioProb(SmiScenarioIndex ns);
00236 SmiScnNode * getLeafNode(SmiScenarioIndex i){ return smiTree_.getLeaf(i)->getDataPtr(); }
00237 SmiScnNode * getRootNode(){ return smiTree_.getRoot()->getDataPtr(); }
00238
00239 int* getIntegerInd(){ return core_->getIntegerIndices();}
00240 int getIntegerLen(){return core_->getIntegerLength(); }
00241 int* getBinaryInd(){return core_->getBinaryIndices();}
00242 int getBinaryLen(){return core_->getBinaryLength();}
00243
00244 inline std::vector<int> getIntIndices() {
00245 return intIndices;
00246 }
00247 inline void addIntIndice(int indice) {
00248 intIndices.push_back(indice);
00249 }
00250
00251
00252 double getObjectiveValue(SmiScenarioIndex ns);
00253 double *getColSolution(SmiScenarioIndex ns, int *length);
00254 double *getRowSolution(SmiScenarioIndex ns, int *length);
00255 double *getRowDuals(SmiScenarioIndex ns, int *length);
00256 double getColSolution(SmiScenarioIndex ns, int stage, int colIndex);
00257 double getRowSolution(SmiScenarioIndex ns, int stage, int rowIndex);
00258 double getRowDuals(SmiScenarioIndex ns, int stage, int rowIndex);
00259
00260
00261 double *getColValue(const double *d, SmiScenarioIndex ns, int*length);
00262 double getColValue(const double *d, SmiScenarioIndex ns, int stage, int rowIndex);
00263 double *getRowValue(const double *d, SmiScenarioIndex ns, int*length, bool isDual);
00264 double getRowValue(const double *d, SmiScenarioIndex ns, int stage, int rowIndex, bool isDual);
00265
00266
00267 void setOsiSolverHandle(OsiSolverInterface &osi)
00268 {
00269 osiStoch_ = osi.clone(false);
00270 }
00271 void setOsiSolverHandle(OsiSolverInterface *osi)
00272 {
00273 osiStoch_ = osi->clone(false);
00274 }
00275 OsiSolverInterface * getOsiSolverInterface();
00276
00277 inline void releaseSolver() {osiStoch_=NULL;}
00278 inline void releaseCore() { core_=NULL; }
00279
00280
00281 void setQuadraticSolver(ClpModel *clp){ clp_=clp; }
00282 ClpModel * getQuadraticSolver() {return clp_;}
00283 ClpModel * loadQuadraticSolverData();
00284
00285
00286
00287 SmiScnModel():
00288 handler_(NULL),messages_(NULL),osiStoch_(NULL), nrow_(0), ncol_(0), nels_(0),nels_max(0),
00289 drlo_(NULL), drup_(NULL), dobj_(NULL), dclo_(NULL), dcup_(NULL), matrix_(NULL),
00290 dels_(NULL),indx_(NULL),rstrt_(NULL),minrow_(0),
00291 solve_synch_(false),totalProb_(0),core_(NULL),smiTree_(),integerInd(NULL),integerLen(0),binaryInd(NULL),binaryLen(0),intIndices(),maxNelsPerScenInStage(NULL)
00292 {
00293 nqels_=0;
00294 }
00295
00296
00297 ~SmiScnModel();
00298
00299 void addNode(SmiScnNode *node, bool notDetEq = false);
00300 void deleteNode(SmiScnNode *tnode);
00301
00302 void addNode(SmiNodeData *node);
00303 inline SmiScenarioTree<SmiScnNode *> * getSmiTree() { return &smiTree_; }
00304 private:
00305 CoinMessageHandler *handler_;
00306 SmiMessage *messages_;
00307
00308
00309 OsiSolverInterface * osiStoch_;
00310
00311 int nrow_;
00312 int ncol_;
00313 int nels_;
00314 int nels_max;
00315
00316 double *drlo_;
00317 double *drup_;
00318 double *dobj_;
00319 double *dclo_;
00320 double *dcup_;
00321 CoinPackedMatrix *matrix_;
00322 double *dels_;
00323 int *indx_;
00324 int *rstrt_;
00325
00326 int nqels_;
00327 int *qstart_;
00328 int *qindx_;
00329 double *qdels_;
00330 ClpModel *clp_;
00331
00332
00333
00334
00335 int minrow_;
00336
00337 bool solve_synch_;
00338
00339 double totalProb_;
00340
00341
00342 private:
00343 SmiCoreData * core_;
00344
00346 void generateSolverArrays();
00347
00348
00349 SmiScenarioTree<SmiScnNode *> smiTree_;
00350
00351 int* integerInd;
00352 int integerLen;
00353 int* binaryInd;
00354 int binaryLen;
00355
00356 std::vector<int> intIndices;
00357 int* maxNelsPerScenInStage;
00358 };
00359
00360 class SmiScnNode
00361 {
00362 friend class SmiScnModel;
00363 friend void DecompUnitTest();
00364 public:
00365 int getCoreColIndex(int i);
00366 int getCoreRowIndex(int i);
00367 inline void setScenarioIndex(SmiScenarioIndex i){ scen_=i;}
00368 inline SmiScenarioIndex getScenarioIndex() {return scen_;}
00369 inline int getColStart() {return coffset_;}
00370 inline int getRowStart() {return roffset_;}
00371 inline int getNumCols(){ return node_->getCore()->getNumCols(node_->getStage());}
00372 inline int getNumRows(){ return node_->getCore()->getNumRows(node_->getStage());}
00373
00374 inline double getModelProb(){return mdl_prob_;}
00375 inline SmiStageIndex getStage() { return node_->getStage(); }
00376 inline SmiScnNode * getParent(){ return parent_;}
00377 inline void setProb(double p){prob_=p;}
00378 inline double addProb(double prob){ return prob_+=prob;}
00379 inline double getProb() { return prob_; }
00380 inline void setParent(SmiScnNode * g) {parent_=g;}
00381
00382 inline bool isVirtualNode() { return !include_; }
00383
00384 inline void zapNode() {node_=NULL;}
00385
00386
00387 inline SmiScnNode(SmiNodeData *node)
00388 {
00389 node_=node;
00390 node->addPtr();
00391 prob_=0;
00392 condProb_ = 0;
00393 parent_=NULL;
00394 scen_=-1;
00395 include_=true;
00396 }
00397 ~SmiScnNode()
00398 {
00399 if (node_)
00400 {
00401
00402 if (!node_->isCoreNode()){
00403 delete node_;
00404 node_= NULL;
00405 }
00406 }
00407
00408 }
00409
00410 private:
00411 inline void setRowOffset(int r) {roffset_ = r;}
00412 inline void setColOffset(int c) {coffset_ = c;}
00413
00414 inline double getCondProb(){return condProb_;}
00415 inline void setCondProb(double p){condProb_=p;}
00416 inline void setModelProb(double p){mdl_prob_=p;}
00417
00418 public:
00419 inline SmiNodeData *getNode() {return node_;}
00420 private:
00421 inline void setIncludeOff() { include_=false; }
00422 inline void setIncludeOn() { include_=true; }
00423 inline bool getInclude() { return include_; }
00424
00425
00426
00427 private:
00428 SmiNodeData *node_;
00429 SmiScnNode *parent_;
00430 double prob_;
00431 double mdl_prob_;
00432 double condProb_;
00433 int coffset_;
00434 int roffset_;
00435 SmiScenarioIndex scen_;
00436 bool include_;
00437 };
00438
00439
00440 class SmiScnModelAddNode{
00441 public:
00442 void operator() (SmiScnNode *node)
00443 {
00444 s_->addNode(node);
00445 }
00446
00447 SmiScnModelAddNode(SmiScnModel *s) { s_ = s;}
00448 private:
00449 SmiScnModel *s_;
00450
00451
00452 };
00453
00454
00455 class SmiScnModelDeleteNode{
00456 public:
00457 void operator() (SmiScnNode *node)
00458 {
00459 s_->deleteNode(node);
00460 }
00461
00462 SmiScnModelDeleteNode(SmiScnModel *s) { s_ = s;}
00463 private:
00464 SmiScnModel *s_;
00465
00466
00467 };
00468
00469 #endif //#define SmiScnModel_HPP