SmiScnModel.hpp
Go to the documentation of this file.
1 // Copyright (C) 2003, International Business Machines
2 // Corporation and others. All Rights Reserved.
3 
4 #ifndef SmiScnModel_HPP
5 #define SmiScnModel_HPP
6 
7 // Include files
8 #include "CoinPragma.hpp"
10 #include "SmiScenarioTree.hpp"
11 #include "SmiScnData.hpp"
12 #include "OsiSolverInterface.hpp"
13 #include "CoinPackedVector.hpp"
14 #include "SmiMessage.hpp"
15 #include "ClpModel.hpp"
16 
17 
18 // STL declarations
19 #include <vector>
20 
21 // forward declaration of SmiScnNode
22 class SmiScnNode;
23 
24 
25 //#############################################################################
26 
50 {
51  friend void SmiScnModelDiscreteUnitTest();
52  friend void DecompUnitTest();
53 public:
54 
67  int readSmps(const char *name,
68  SmiCoreCombineRule *r=NULL);
69 
83  int writeSmps(const char *name, bool winFileExtensions = false, bool strictFormat = true);
84 
85  SmiCoreData * getCore() {return core_;}
86 
97 
98 
99 
102 
103  void setModelProb(double p) {totalProb_=p; }
104 
105  int addNodeToSubmodel(SmiScnNode * smiScnNode);
106 
125  CoinPackedMatrix *matrix,
126  CoinPackedVector *dclo, CoinPackedVector *dcup,
127  CoinPackedVector *dobj,
128  CoinPackedVector *drlo, CoinPackedVector *drup,
129  SmiStageIndex branch, SmiScenarioIndex anc, double prob,
131 
148  CoinPackedMatrix *matrix,
149  CoinPackedVector *dclo, CoinPackedVector *dcup,
150  CoinPackedVector *dobj,
151  CoinPackedVector *drlo, CoinPackedVector *drup,
152  std::vector<int>labels, double prob,
154 
173  CoinPackedMatrix *matrix,
174  CoinPackedVector *dclo, CoinPackedVector *dcup,
175  CoinPackedVector *dobj,
176  CoinPackedVector *drlo, CoinPackedVector *drup,
177  SmiStageIndex branch, SmiScenarioIndex anc, double prob,
179 
196  CoinPackedMatrix *matrix,
197  CoinPackedVector *dclo, CoinPackedVector *dcup,
198  CoinPackedVector *dobj,
199  CoinPackedVector *drlo, CoinPackedVector *drup,
200  std::vector<int>labels, double prob,
202 
207 
220  OsiSolverInterface * loadOsiSolverDataForSubproblem(int stage, int scenStart);
221 
222  std::vector< std::pair<double,double> > solveWS(OsiSolverInterface *osiSolver, double objSense); //Returns value of Wait-And-See solution, with objSense of 1 (= minimization) for default
223  std::pair<double,double*> solveEV(OsiSolverInterface *osiSolver, double objSense);
224  double solveEEV(OsiSolverInterface *osiSolver, double objSense);
225 
226  double getWSValue(OsiSolverInterface *osiSolver, double objSense);
227  double getEVValue(OsiSolverInterface* osiSolver, double objSense);
228  double getEEVValue(OsiSolverInterface* osiSolver, double objSense);
229 
230  //Let SmiScnModel own core data
231  void setCore(SmiCoreData * val) { core_ = val; }
232 
233  // get scenario problem data
238 
243 
244  inline std::vector<int> getIntIndices() {
245  return intIndices;
246  }
247  inline void addIntIndice(int indice) {
248  intIndices.push_back(indice);
249  }
250 
251  // getXXX by scenario
253  double *getColSolution(SmiScenarioIndex ns, int *length);
254  double *getRowSolution(SmiScenarioIndex ns, int *length);
255  double *getRowDuals(SmiScenarioIndex ns, int *length);
256  double getColSolution(SmiScenarioIndex ns, int stage, int colIndex);
257  double getRowSolution(SmiScenarioIndex ns, int stage, int rowIndex);
258  double getRowDuals(SmiScenarioIndex ns, int stage, int rowIndex);
259 
260  // base classes for getting values from solved SmiScnModel
261  double *getColValue(const double *d, SmiScenarioIndex ns, int*length);
262  double getColValue(const double *d, SmiScenarioIndex ns, int stage, int rowIndex);
263  double *getRowValue(const double *d, SmiScenarioIndex ns, int*length, bool isDual);
264  double getRowValue(const double *d, SmiScenarioIndex ns, int stage, int rowIndex, bool isDual);
265 
266  // OsiSolverInterface
268  {
269  osiStoch_ = osi.clone(false);
270  }
272  {
273  osiStoch_ = osi->clone(false);
274  }
276  // If user wants to delete SmiScnModel but keep OsiSolverInterface
277  inline void releaseSolver() {osiStoch_=NULL;}
278  inline void releaseCore() { core_=NULL; }
279 
280  //Quadratic
281  void setQuadraticSolver(ClpModel *clp){ clp_=clp; }
284 
285 
286  // constructor: Lesson from Effective C++: Initialize values in the same order as declared in .hpp file.
288  handler_(NULL),messages_(NULL),osiStoch_(NULL), nrow_(0), ncol_(0), nels_(0),nels_max(0),
289  drlo_(NULL), drup_(NULL), dobj_(NULL), dclo_(NULL), dcup_(NULL), matrix_(NULL),
290  dels_(NULL),indx_(NULL),rstrt_(NULL),minrow_(0),
292  {
293  nqels_=0;
294  }
295 
296  // destructor
297  ~SmiScnModel();
298  //Christian: this method adds data of current node to big det. eq. problem
299  void addNode(SmiScnNode *node, bool notDetEq = false);
300  void deleteNode(SmiScnNode *tnode);
301 
302  void addNode(SmiNodeData *node);
304 private:
307 
308  // internal clone of user declared OSI
310  // model statistics useful for predefining size of structures
311  int nrow_;
312  int ncol_;
313  int nels_;
314  int nels_max;
315  // data pointers used in AddNode and loadOsiSolverData aka generateDetEq
316  double *drlo_;
317  double *drup_;
318  double *dobj_;
319  double *dclo_;
320  double *dcup_;
322  double *dels_;
323  int *indx_;
324  int *rstrt_;
325  //Quadratic
326  int nqels_;
327  int *qstart_;
328  int *qindx_;
329  double *qdels_;
331 
332  // number of scenarios
333  // int scen_;
334  // not sure if this is used
335  int minrow_;
336  // not sure if this is used
338  // total probability of added scenarios; used to normalize probability to one
339  double totalProb_;
340  //core model --- used for discrete distributions
341 
342 private:
344 
346  void generateSolverArrays();
347 
348  // scenario tree
350 
353  int* binaryInd;
355 
356  std::vector<int> intIndices;
358 };
359 
361 {
362  friend class SmiScnModel;
363  friend void DecompUnitTest();
364 public:
365  int getCoreColIndex(int i);
366  int getCoreRowIndex(int i);
369  inline int getColStart() {return coffset_;}
370  inline int getRowStart() {return roffset_;}
371  inline int getNumCols(){ return node_->getCore()->getNumCols(node_->getStage());}
372  inline int getNumRows(){ return node_->getCore()->getNumRows(node_->getStage());}
373  //inline int getNumElements() { return node_->getCore()->getNumElements(node_>getStage());}
374  inline double getModelProb(){return mdl_prob_;}
375  inline SmiStageIndex getStage() { return node_->getStage(); }
376  inline SmiScnNode * getParent(){ return parent_;}
377  inline void setProb(double p){prob_=p;}
378  inline double addProb(double prob){ return prob_+=prob;}
379  inline double getProb() { return prob_; }
380  inline void setParent(SmiScnNode * g) {parent_=g;}
381 
382  inline bool isVirtualNode() { return !include_; }
383  // So can delete root node
384  inline void zapNode() {node_=NULL;}
385 
386 
387  inline SmiScnNode(SmiNodeData *node)
388  {
389  node_=node;
390  node->addPtr();
391  prob_=0;
392  condProb_ = 0;
393  parent_=NULL;
394  scen_=-1;
395  include_=true;
396  }
398  {
399  if (node_)
400  {
401  //Only delete non-core nodes. Core nodes get deleted via SmiCoreData..
402  if (!node_->isCoreNode()){
403  delete node_;
404  node_= NULL;
405  }
406  }
407 
408  }
409 
410 private:
411  inline void setRowOffset(int r) {roffset_ = r;}
412  inline void setColOffset(int c) {coffset_ = c;}
413 
414  inline double getCondProb(){return condProb_;}
415  inline void setCondProb(double p){condProb_=p;}
416  inline void setModelProb(double p){mdl_prob_=p;}
417  //Necessary to get access to the data node stored within the SmiScnNode
418 public:
419  inline SmiNodeData *getNode() {return node_;}
420 private:
421  inline void setIncludeOff() { include_=false; }
422  inline void setIncludeOn() { include_=true; }
423  inline bool getInclude() { return include_; }
424 
425 
426 
427 private:
430  double prob_;
431  double mdl_prob_;
432  double condProb_;
433  int coffset_;
434  int roffset_;
436  bool include_;
437 };
438 
439 // function object for addnode loop
441 public:
443  {
444  s_->addNode(node);
445  }
446 
448 private:
450 
451 
452 };
453 
454 // function object for deleteNode loop
456 public:
458  {
459  s_->deleteNode(node);
460  }
461 
463 private:
465 
466 
467 };
468 
469 #endif //#define SmiScnModel_HPP
OsiSolverInterface * osiStoch_
constructs LP and QP data arrays for Deterministic Equivalent
void releaseSolver()
constructs LP and QP data arrays for Deterministic Equivalent
double * dcup_
constructs LP and QP data arrays for Deterministic Equivalent
double * getRowDuals(SmiScenarioIndex ns, int *length)
constructs LP and QP data arrays for Deterministic Equivalent
void setModelProb(double p)
void setQuadraticSolver(ClpModel *clp)
constructs LP and QP data arrays for Deterministic Equivalent
void setColOffset(int c)
void operator()(SmiScnNode *node)
int * getBinaryIndices()
Definition: SmiScnData.hpp:232
int nels_
constructs LP and QP data arrays for Deterministic Equivalent
int * getIntegerIndices()
Definition: SmiScnData.hpp:230
int nrow_
constructs LP and QP data arrays for Deterministic Equivalent
void zapNode()
Base class for message handling.
double * dels_
constructs LP and QP data arrays for Deterministic Equivalent
int * maxNelsPerScenInStage
constructs LP and QP data arrays for Deterministic Equivalent
~SmiScnModel()
constructs LP and QP data arrays for Deterministic Equivalent
static SmiCoreCombineReplace * Instance()
SmiScnModel: COIN-SMI Scenario Model Class.
Definition: SmiScnModel.hpp:49
int getNumCols()
SmiScenarioIndex getNumScenarios()
constructs LP and QP data arrays for Deterministic Equivalent
SmiScenarioIndex generateScenario(SmiCoreData *core, CoinPackedMatrix *matrix, CoinPackedVector *dclo, CoinPackedVector *dcup, CoinPackedVector *dobj, CoinPackedVector *drlo, CoinPackedVector *drup, SmiStageIndex branch, SmiScenarioIndex anc, double prob, SmiCoreCombineRule *r=SmiCoreCombineReplace::Instance())
generate scenario with ancestor/branch node identification
SmiScenarioIndex getScenarioIndex()
ClpModel * getQuadraticSolver()
constructs LP and QP data arrays for Deterministic Equivalent
int * rstrt_
constructs LP and QP data arrays for Deterministic Equivalent
void processDiscreteDistributionIntoScenarios(SmiDiscreteDistribution *s, bool test=false)
generate scenarios from discrete distribution
const bool isCoreNode()
Definition: SmiScnData.hpp:71
double mdl_prob_
int * qstart_
constructs LP and QP data arrays for Deterministic Equivalent
double getEEVValue(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent
std::pair< double, double * > solveEV(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent
SmiMessage * messages_
constructs LP and QP data arrays for Deterministic Equivalent
void addNode(SmiScnNode *node, bool notDetEq=false)
constructs LP and QP data arrays for Deterministic Equivalent
int getStage()
Definition: SmiScnData.hpp:43
double prob_
double * getColValue(const double *d, SmiScenarioIndex ns, int *length)
constructs LP and QP data arrays for Deterministic Equivalent
Sparse Matrix Base Class.
int getIntegerLength()
Definition: SmiScnData.hpp:231
int getBinaryLength()
Definition: SmiScnData.hpp:233
SmiScnNode * getParent()
SmiScnNode * getLeafNode(SmiScenarioIndex i)
constructs LP and QP data arrays for Deterministic Equivalent
SmiTreeNode< T > * getRoot()
Get root node.
SmiScnModel * s_
SmiCoreData * getCore()
Definition: SmiScnModel.hpp:85
void addIntIndice(int indice)
constructs LP and QP data arrays for Deterministic Equivalent
void releaseCore()
constructs LP and QP data arrays for Deterministic Equivalent
This deals with Clp messages (as against Osi messages etc)
Definition: SmiMessage.hpp:20
SmiStageIndex getStage()
SmiScenarioTree< SmiScnNode * > smiTree_
constructs LP and QP data arrays for Deterministic Equivalent
double getCondProb()
std::vector< std::pair< double, double > > solveWS(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent
void setParent(SmiScnNode *g)
void setModelProb(double p)
generate scenarios from discrete distribution
int * indx_
constructs LP and QP data arrays for Deterministic Equivalent
int readSmps(const char *name, SmiCoreCombineRule *r=NULL)
void setRowOffset(int r)
int binaryLen
constructs LP and QP data arrays for Deterministic Equivalent
double getObjectiveValue(SmiScenarioIndex ns)
constructs LP and QP data arrays for Deterministic Equivalent
SmiCoreData * getCore()
Definition: SmiScnData.hpp:42
std::vector< int > getIntIndices()
constructs LP and QP data arrays for Deterministic Equivalent
void setOsiSolverHandle(OsiSolverInterface &osi)
constructs LP and QP data arrays for Deterministic Equivalent
double * qdels_
constructs LP and QP data arrays for Deterministic Equivalent
OsiSolverInterface * loadOsiSolverData()
constructs LP and QP data arrays for Deterministic Equivalent
double totalProb_
constructs LP and QP data arrays for Deterministic Equivalent
int * getIntegerInd()
constructs LP and QP data arrays for Deterministic Equivalent
double * getRowSolution(SmiScenarioIndex ns, int *length)
constructs LP and QP data arrays for Deterministic Equivalent
int ncol_
constructs LP and QP data arrays for Deterministic Equivalent
void setIncludeOn()
void setOsiSolverHandle(OsiSolverInterface *osi)
constructs LP and QP data arrays for Deterministic Equivalent
SmiTreeNode< T > * getLeaf(int scn)
Get leaf node.
int getNumRows()
ClpModel * loadQuadraticSolverData()
constructs LP and QP data arrays for Deterministic Equivalent
int writeSmps(const char *name, bool winFileExtensions=false, bool strictFormat=true)
SmiNodeData * getNode()
double * getColSolution(SmiScenarioIndex ns, int *length)
constructs LP and QP data arrays for Deterministic Equivalent
double getProb()
SmiScnNode * getRootNode()
constructs LP and QP data arrays for Deterministic Equivalent
bool getInclude()
int getColStart()
int getIntegerLen()
constructs LP and QP data arrays for Deterministic Equivalent
friend void SmiScnModelDiscreteUnitTest()
friend void DecompUnitTest()
bool solve_synch_
constructs LP and QP data arrays for Deterministic Equivalent
double getModelProb()
double * dobj_
constructs LP and QP data arrays for Deterministic Equivalent
Abstract Base Class for describing an interface to a solver.
int SmiStageIndex
Definition: SmiScnData.hpp:23
double getWSValue(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent
double * drup_
constructs LP and QP data arrays for Deterministic Equivalent
int integerLen
constructs LP and QP data arrays for Deterministic Equivalent
int nqels_
constructs LP and QP data arrays for Deterministic Equivalent
void generateSolverArrays()
constructs LP and QP data arrays for Deterministic Equivalent
SmiScenarioIndex scen_
This deals with combining Core and Stochastic data.
int SmiScenarioIndex
Definition: SmiScnData.hpp:22
int addNodeToSubmodel(SmiScnNode *smiScnNode)
generate scenarios from discrete distribution
void setProb(double p)
friend void DecompUnitTest()
int nels_max
constructs LP and QP data arrays for Deterministic Equivalent
SmiScnModelAddNode(SmiScnModel *s)
int getNumRows()
Definition: SmiScnData.hpp:206
SmiScnModelDeleteNode(SmiScnModel *s)
double addProb(double prob)
SmiScenarioTree< SmiScnNode * > * getSmiTree()
constructs LP and QP data arrays for Deterministic Equivalent
double * getRowValue(const double *d, SmiScenarioIndex ns, int *length, bool isDual)
constructs LP and QP data arrays for Deterministic Equivalent
SmiScnModel()
constructs LP and QP data arrays for Deterministic Equivalent
OsiSolverInterface * getOsiSolverInterface()
constructs LP and QP data arrays for Deterministic Equivalent
int getCoreRowIndex(int i)
int getBinaryLen()
constructs LP and QP data arrays for Deterministic Equivalent
void setIncludeOff()
Sparse Vector.
int minrow_
constructs LP and QP data arrays for Deterministic Equivalent
SmiScnNode(SmiNodeData *node)
virtual OsiSolverInterface * clone(bool copyData=true) const =0
Clone.
double condProb_
SmiScnNode * parent_
double getScenarioProb(SmiScenarioIndex ns)
constructs LP and QP data arrays for Deterministic Equivalent
SmiScenarioIndex generateScenarioFromCore(SmiCoreData *core, double prob, SmiCoreCombineRule *r=SmiCoreCombineReplace::Instance())
generate scenarios from discrete distribution
void setScenarioIndex(SmiScenarioIndex i)
OsiSolverInterface * loadOsiSolverDataForSubproblem(int stage, int scenStart)
constructs LP and QP data arrays for Deterministic Equivalent
bool isVirtualNode()
double * dclo_
constructs LP and QP data arrays for Deterministic Equivalent
std::vector< int > intIndices
constructs LP and QP data arrays for Deterministic Equivalent
int getNumScenarios()
get number of scenarios
SmiNodeData * node_
int getNumCols()
Definition: SmiScnData.hpp:205
void deleteNode(SmiScnNode *tnode)
constructs LP and QP data arrays for Deterministic Equivalent
int getCoreColIndex(int i)
int * qindx_
constructs LP and QP data arrays for Deterministic Equivalent
void setCondProb(double p)
double solveEEV(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent
int * getBinaryInd()
constructs LP and QP data arrays for Deterministic Equivalent
void operator()(SmiScnNode *node)
int * binaryInd
constructs LP and QP data arrays for Deterministic Equivalent
CoinMessageHandler * handler_
constructs LP and QP data arrays for Deterministic Equivalent
ClpModel * clp_
constructs LP and QP data arrays for Deterministic Equivalent
void setCore(SmiCoreData *val)
constructs LP and QP data arrays for Deterministic Equivalent
double * drlo_
constructs LP and QP data arrays for Deterministic Equivalent
int * integerInd
constructs LP and QP data arrays for Deterministic Equivalent
int getRowStart()
SmiCoreData * core_
constructs LP and QP data arrays for Deterministic Equivalent
CoinPackedMatrix * matrix_
constructs LP and QP data arrays for Deterministic Equivalent
double getEVValue(OsiSolverInterface *osiSolver, double objSense)
constructs LP and QP data arrays for Deterministic Equivalent