SmiScnData.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 SmiScnData_HPP
5 #define SmiScnData_HPP
6 
7 #include "CoinPragma.hpp"
8 #include "OsiSolverInterface.hpp"
9 #include "CoinPackedVector.hpp"
10 #include "CoinMpsIO.hpp"
11 #include "SmiCoreCombineRule.hpp"
12 #include "SmiQuadratic.hpp"
13 
14 //#include "SmiLinearData.hpp"
15 
16 #include <map>
17 #include <vector>
18 #include <exception>
19 
20 
21 typedef int SmiCoreIndex;
22 typedef int SmiScenarioIndex;
23 typedef int SmiStageIndex;
24 
25 class SmiCoreData;
26 
28  //: public SmiLinearData
29 {
30 public:
31  typedef std::map<int,CoinPackedVector *> SmiRowMap;
32  typedef std::map<int,double *> SmiDenseRowMap;
33  void setCoreNode();
34  /*
35  CoinPackedVector * getRow(int i) {
36  SmiRowMap::iterator r=rowMap.find(i);
37  if (r!=rowMap.end()) return r->second;
38  else return NULL;}
39  */
40  double * getDenseRow(int i);
41 
42  inline SmiCoreData * getCore() { return core_;}
43  inline int getStage() { return stg_;}
44 
47 
48  void copyRowLower(double * drlo);
49  void copyRowUpper(double * drup);
50  void copyColLower(double * dclo);
51  void copyColUpper(double * dcup);
52  void copyObjective(double * dobj);
53 
54  const int getNumMatrixElements(){
55  if (this->has_matrix_)
56  return this->strt_[getMatEnd()]-this->strt_[getMatStart()];
57  else
58  return 0;
59  }
60  const int getRowLength(int irow){
61  if (this->has_matrix_)
62  return getLength(this->getMatStart()+irow-this->rowbeg_);
63  else
64  return 0;
65  }
66  const int getRowLowerLength() {return getLength(this->getRloStart());}
67  const int getRowUpperLength() {return getLength(this->getRupStart());}
68  const int getColLowerLength() {return getLength(this->getCloStart());}
69  const int getColUpperLength() {return getLength(this->getCupStart());}
70  const int getObjectiveLength() {return getLength(this->getObjStart());}
71  const bool isCoreNode() { return isCoreNode_; }
72 
73  const int *getRowIndices(int irow){
74  if (this->has_matrix_)
75  return getIndices(this->getMatStart()+irow-this->rowbeg_);
76  else
77  return NULL;
78  }
79  int *getMutableRowIndices(int irow){
80  // using const_cast to stop warnings about cast-away constness
81  return const_cast<int *>(getRowIndices(irow));
82  }
83  const int *getRowLowerIndices() {return getIndices(this->getRloStart());}
84  const int *getRowUpperIndices() {return getIndices(this->getRupStart());}
85  const int *getColLowerIndices() {return getIndices(this->getCloStart());}
86  const int *getColUpperIndices() {return getIndices(this->getCupStart());}
87  const int *getObjectiveIndices() {return getIndices(this->getObjStart());}
88 
89  const double *getRowElements(int irow){
90  if (this->has_matrix_)
91  return getElements(this->getMatStart()+irow-this->rowbeg_);
92  else
93  return NULL;
94  }
95 
96  const int *getRowStarts(int irow){
97  if (this->has_matrix_)
98  return &strt_[this->getMatStart()+irow-this->rowbeg_];
99  else
100  return NULL;
101  }
102  double *getMutableRowElements(int irow){
103  // using const_cast to stop warnings about cast-away constness
104  return const_cast<double *>(getRowElements(irow));
105  }
106  const double *getRowLowerElements() {return getElements(this->getRloStart());}
107  const double *getRowUpperElements() {return getElements(this->getRupStart());}
108  const double *getColLowerElements() {return getElements(this->getCloStart());}
109  const double *getColUpperElements() {return getElements(this->getCupStart());}
110  const double *getObjectiveElements() {return getElements(this->getObjStart());}
111 
112 
114  int combineWithDenseCoreRow(double *dr,CoinPackedVector *cpv,double *dels,int *indx);
115  int combineWithDenseCoreRow(double *dr,const int nels,const int *inds, const double *dels, double *dest_dels,int *dest_indx);
116 
118  const CoinPackedMatrix *const matrix,
119  CoinPackedVector *dclo,
120  CoinPackedVector *dcup,
121  CoinPackedVector *dobj,
122  CoinPackedVector *drlo,
123  CoinPackedVector *drup);
124 
125  void addQuadraticObjective(int stage, SmiCoreData *smicore, SmiQuadraticData *sqdata);
126 
127  bool hasQdata() {return hasQdata_;}
128  void setHasQdata(bool b) {hasQdata_=b;}
129 
131 
132  int addPtr() { return ++ptr_count; }
133 
134  ~SmiNodeData();
135 
136 protected:
137  void combineWithCoreDoubleArray(double *d_out, const CoinPackedVector &cpv, int o);
138  void combineWithCoreDoubleArray(double *d_out, const int len, const int * inds, const double *dels, int o);
139  //Memory assignment/deletion
140  void assignMemory();
141  void deleteMemory();
142 
143  //Covers for starts of arrays
144  const int getMatStart() { return mat_strt_;}
145  const int getMatEnd() { return mat_strt_+nrow_;}
146  const int getRloStart() { return rlo_strt_;}
147  const int getRupStart() { return rup_strt_;}
148  const int getCloStart() { return clo_strt_;}
149  const int getCupStart() { return cup_strt_;}
150  const int getObjStart() { return obj_strt_;}
151 
152  //Access to stored memory
153  //Return number of Elements in row/bounds/ranges/objective istart
154  const int getLength (int istart){
155  return this->strt_[istart+1] - this->strt_[istart];
156  }
157  //Return index array that starts at row/bounds/ranges/objective istart
158  const int * getIndices (int istart){
159  return this->inds_+this->strt_[istart];
160  }
161  //Return double array that starts at row/bounds/ranges/objective istart
162  const double *getElements(int istart){
163  return this->dels_+this->strt_[istart];
164  }
165 
166 
167 private:
168 
169  SmiStageIndex stg_; //Stage to which the node belongs
170  SmiRowMap rowMap; //not used
171  SmiDenseRowMap dRowMap; //Map of <int,double*>, stores row entries in dense format
172 
173  SmiCoreData *core_; //Link to core data
174  bool isCoreNode_; //Is this node a core node? If so, it should, at least in my opinion, not turn up in the Tree
176 
177  int numarrays_; //= number of arrays used = 5 (clo,cup,rlo,rup,obj)
178  int nels_; //number of elements in the matrix and the other arrays
179  int nrow_; //number of rows (of corresponding stage in core model)
180  int ncol_; //number of columns (of corresponding stage in core model)
181  int rowbeg_; //index, where rows of corresponding stage begins in the core model
182  int colbeg_; //index, where columns begin wrt to the columns of the corresponding stage in the core model
183  int nstrt_; //number of strt indices = numarray + nrow+1 (see assignMemory())
184  bool has_matrix_; //If this node has a matrix entry
185  int mat_strt_; //start arrays for corresponding entries
191  double * dels_; //concrete elements
192  int * inds_; //indices for the elements
193  int * strt_; //start array, where new row begins
194 
195  int ptr_count; //Propably for memory management?!
196 
197  bool hasQdata_;
199 };
200 
201 
203 {
204 public:
205  inline int getNumCols(){ return ncol_;} //Gesamtzahl Variablen f�r das CoreModell
206  inline int getNumRows(){ return nrow_;} //Gesamtzahl Restriktionen f�r das CoreModell
207  inline int getNumElements(){ return nz_;} // Gesamtzahl Elemente f�r das CoreModell
208  inline int getNumStages(){ return nstag_;} //Anzahl an Stufen
209  inline int getNumCols(SmiStageIndex t){ return nColInStage_[t];} //Anzahl Variablen in Stufe t
210  inline int getNumRows(SmiStageIndex t){ return nRowInStage_[t];} //Number of Restrictions in stage t
211  inline int getColStart(SmiStageIndex t){ return stageColPtr_[t];} //Index where Variables of stage t starts
212  inline int getRowStart(SmiStageIndex t){ return stageRowPtr_[t];} //Index where Rows of stage t starts
213  inline int getColStage(int i){ return colStage_[i];} //Stage to Variable i
214  inline int getRowStage(int i){ return rowStage_[i];} //Stage to Row i
215  //Christian: TODO: In my Opinion these methods do not belong here, as it takes care of converting indices from/to det. eq. to core model formulation
216  inline int getRowInternalIndex(int i){ return rowEx2In_[i];} //Get Internal Index (in case of det. eq.) from external index (core model)
217  inline int getColInternalIndex(int i){ return colEx2In_[i];}
218  inline int getRowExternalIndex(int i){ return rowIn2Ex_[i];} //Get external index (core model) from internal index (det. eq. model)
219  inline int getColExternalIndex(int i){ return colIn2Ex_[i];}
220  /*
221  inline CoinPackedVector * getMatrixRow(SmiStageIndex t, int i){ return nodes_[t]->getRow(i);}
222  */
223  inline const double * getDenseRowLower(SmiStageIndex t){return cdrlo_[t];}
224  inline const double * getDenseRowUpper(SmiStageIndex t){return cdrup_[t];}
225  inline const double * getDenseColLower(SmiStageIndex t){return cdclo_[t];}
226  inline const double * getDenseColUpper(SmiStageIndex t){return cdcup_[t];}
227  inline const double * getDenseObjCoefficients(SmiStageIndex t){return cdobj_[t];}
228 
229  inline std::vector<int> getIntCols(int stage) { return intColsStagewise[stage]; };
230  inline int* getIntegerIndices() { return integerIndices_; } //indices of integer variables
231  inline int getIntegerLength() { return integerLength_; }
232  inline int* getBinaryIndices() { return binaryIndices_; } //indices of binary variables
233  inline int getBinaryLength() { return binaryLength_; }
234  inline double getInfinity() { return infinity_; }
235 
236  void copyRowLower(double * drlo,SmiStageIndex t );
237  void copyRowUpper(double * drup,SmiStageIndex t);
238  void copyColLower(double * dclo,SmiStageIndex t);
239  void copyColUpper(double * dcup,SmiStageIndex t);
240  void copyObjective(double * dobj,SmiStageIndex t);
241 
242  inline SmiNodeData * getNode(SmiStageIndex t){return nodes_[t];}
243 
244  inline void setColumnNames(char** namesStrict, char** namesFree) { this->colNamesStrict = namesStrict; this->colNamesFree = namesFree; }
245  inline char** getColumnNames(bool strictFormat = true) { if (strictFormat) return this->colNamesStrict; else return this->colNamesFree; }
246 
247  SmiCoreData(CoinMpsIO *cMps, int nstag, int *cstag, int *rstag,int *integerIndices = 0, int integerLength = 0, int *binaryIndices = 0, int binaryLength = 0);
248  SmiCoreData(OsiSolverInterface *osi, int nstag, int *cstag, int *rstag,int *integerIndices = 0, int integerLength = 0, int *binaryIndices = 0, int binaryLength = 0);
249 
251  void addQuadraticObjectiveToCore(int *starts,int *indx,double *dels);
252 
253  void setHasQdata (bool b) {hasQdata_ = b;}
254  bool hasQdata() {return hasQdata_;}
255 
256 
257 
258  ~SmiCoreData();
259 
260 private:
261 
262  //Christian: Creates SmiCoreData for whole tree from deterministic core model and information about stages. Splits
263  // rows and columns into nstag stages, given by cstag and rstag. Creates a core node for every stage.
264  void gutsOfConstructor(int nrow,int ncol,int nstag, int *cstag,int *rstag, CoinPackedMatrix *matrix, CoinPackedVector *dclo, CoinPackedVector *dcup, CoinPackedVector *dobj, CoinPackedVector *drlo, CoinPackedVector *drup, int* integerIndices = 0,int integerLength = 0,int* binaryIndices = 0,int binaryLength = 0);
265 
267 
268 
269 private:
270  int nrow_;
271  int ncol_;
272  int nz_; // We can count the total number of elements, but I do not if we need this at one point
273  SmiStageIndex nstag_; //Total number of stages in the problem, apart from the first stage. A two-stage problem has nstag_ = 1 and so on. If the problem is deterministic, nstag_ = 0.
274  int *nColInStage_; //Number of Columns in Stage
275  int *nRowInStage_; //Number of Rows in Stage
276  int *stageColPtr_; //Start Index of Columns in Stage, with respect to ncol_
277  int *stageRowPtr_; //Start Index of Rows in Stage, with respect to nrow_
278  int *colStage_; //To which stage belongs the column?
279  int *rowStage_; //To which stage belongs the row?
280  int *colEx2In_; //Not clear yet
281  int *rowEx2In_; //Not clear yet
282  int *colIn2Ex_; // Not clear yet
283  int *rowIn2Ex_; // Not clear yet
284  int *integerIndices_; //indices of integer variables
285  int integerLength_; //number of integer variables
286  int *binaryIndices_; //indices of binary variables
287  int binaryLength_; //number of binary variables
288  double infinity_; //Infinity of solver
289  double **cdrlo_;
290  double **cdrup_;
291  double **cdobj_;
292  double **cdclo_;
293  double **cdcup_;
295  bool hasQdata_;
296  std::vector<SmiNodeData*> nodes_; //Nodes, that contain stage dependent constraints (with Bounds,Ranges,Objective,Matrix), so called CoreNodes
297  std::vector<double *> pDenseRow_; //dense probability vector
298  std::vector< std::vector<int> > intColsStagewise; // For each stage separately, it contains the position of every integer column
300  char **colNamesFree;
301 };
302 
303 #endif //#define SmiScnData_HPP
int * stageColPtr_
Definition: SmiScnData.hpp:276
const double * getRowUpperElements()
Definition: SmiScnData.hpp:107
void copyColUpper(double *dcup)
const int getCloStart()
Definition: SmiScnData.hpp:148
int * stageRowPtr_
Definition: SmiScnData.hpp:277
int * colIn2Ex_
Definition: SmiScnData.hpp:282
const int getLength(int istart)
Definition: SmiScnData.hpp:154
SmiRowMap rowMap
Definition: SmiScnData.hpp:170
int * rowEx2In_
Definition: SmiScnData.hpp:281
double infinity_
Definition: SmiScnData.hpp:288
void setCoreCombineRule(SmiCoreCombineRule *r)
Definition: SmiScnData.hpp:45
const int * getRowIndices(int irow)
Definition: SmiScnData.hpp:73
int * getBinaryIndices()
Definition: SmiScnData.hpp:232
int getRowStart(SmiStageIndex t)
Definition: SmiScnData.hpp:212
int * getIntegerIndices()
Definition: SmiScnData.hpp:230
const int * getRowStarts(int irow)
Definition: SmiScnData.hpp:96
void copyColLower(double *dclo)
const double * getRowElements(int irow)
Definition: SmiScnData.hpp:89
int getRowExternalIndex(int i)
Definition: SmiScnData.hpp:218
const int * getColLowerIndices()
Definition: SmiScnData.hpp:85
int * rowStage_
Definition: SmiScnData.hpp:279
void combineWithCoreDoubleArray(double *d_out, const CoinPackedVector &cpv, int o)
const int * getRowUpperIndices()
Definition: SmiScnData.hpp:84
int getNumElements()
Definition: SmiScnData.hpp:207
void copyObjective(double *dobj)
const double * getObjectiveElements()
Definition: SmiScnData.hpp:110
SmiCoreCombineRule * getCoreCombineRule()
Definition: SmiScnData.hpp:46
SmiCoreData(CoinMpsIO *cMps, int nstag, int *cstag, int *rstag, int *integerIndices=0, int integerLength=0, int *binaryIndices=0, int binaryLength=0)
const int getObjectiveLength()
Definition: SmiScnData.hpp:70
int * integerIndices_
Definition: SmiScnData.hpp:284
SmiNodeData(SmiStageIndex stg, SmiCoreData *core, const CoinPackedMatrix *const matrix, CoinPackedVector *dclo, CoinPackedVector *dcup, CoinPackedVector *dobj, CoinPackedVector *drlo, CoinPackedVector *drup)
SmiStageIndex stg_
Definition: SmiScnData.hpp:169
std::vector< int > getIntCols(int stage)
Definition: SmiScnData.hpp:229
double getInfinity()
Definition: SmiScnData.hpp:234
double ** cdcup_
Definition: SmiScnData.hpp:293
void assignMemory()
SmiDenseRowMap dRowMap
Definition: SmiScnData.hpp:171
const bool isCoreNode()
Definition: SmiScnData.hpp:71
const double * getDenseColUpper(SmiStageIndex t)
Definition: SmiScnData.hpp:226
const double * getDenseRowLower(SmiStageIndex t)
Definition: SmiScnData.hpp:223
SmiStageIndex nstag_
Definition: SmiScnData.hpp:273
int getColStage(int i)
Definition: SmiScnData.hpp:213
int * colEx2In_
Definition: SmiScnData.hpp:280
double * getDenseRow(int i)
const double * getDenseObjCoefficients(SmiStageIndex t)
Definition: SmiScnData.hpp:227
const int * getColUpperIndices()
Definition: SmiScnData.hpp:86
int * nColInStage_
Definition: SmiScnData.hpp:274
int * getMutableRowIndices(int irow)
Definition: SmiScnData.hpp:79
int getNumRows(SmiStageIndex t)
Definition: SmiScnData.hpp:210
int getStage()
Definition: SmiScnData.hpp:43
const int getNumMatrixElements()
Definition: SmiScnData.hpp:54
char ** colNamesStrict
Definition: SmiScnData.hpp:299
Sparse Matrix Base Class.
int getIntegerLength()
Definition: SmiScnData.hpp:231
bool isCoreNode_
Definition: SmiScnData.hpp:174
int getBinaryLength()
Definition: SmiScnData.hpp:233
double ** cdrlo_
Definition: SmiScnData.hpp:289
std::vector< std::vector< int > > intColsStagewise
Definition: SmiScnData.hpp:298
void addQuadraticObjectiveToCore(int *starts, int *indx, double *dels)
Adds QP data after the constructor has been called.
int SmiCoreIndex
Definition: SmiScnData.hpp:21
const int * getIndices(int istart)
Definition: SmiScnData.hpp:158
char ** getColumnNames(bool strictFormat=true)
Definition: SmiScnData.hpp:245
const double * getColLowerElements()
Definition: SmiScnData.hpp:108
const int * getObjectiveIndices()
Definition: SmiScnData.hpp:87
CoinPackedVector * combineWithCoreRow(CoinPackedVector *cr, CoinPackedVector *nr)
void copyRowLower(double *drlo, SmiStageIndex t)
const int getRowLowerLength()
Definition: SmiScnData.hpp:66
SmiCoreCombineRule * combineRule_
Definition: SmiScnData.hpp:175
SmiQuadraticData * getQdata()
Definition: SmiScnData.hpp:130
SmiCoreData * getCore()
Definition: SmiScnData.hpp:42
const double * getDenseRowUpper(SmiStageIndex t)
Definition: SmiScnData.hpp:224
bool has_matrix_
Definition: SmiScnData.hpp:184
int getColExternalIndex(int i)
Definition: SmiScnData.hpp:219
const double * getElements(int istart)
Definition: SmiScnData.hpp:162
const int getMatEnd()
Definition: SmiScnData.hpp:145
void copyRowLower(double *drlo)
std::vector< SmiNodeData * > nodes_
Definition: SmiScnData.hpp:296
char ** colNamesFree
Definition: SmiScnData.hpp:300
void addQuadraticObjective(int stage, SmiCoreData *smicore, SmiQuadraticData *sqdata)
void copyRowUpper(double *drup, SmiStageIndex t)
SmiQuadraticData * sqp_
Definition: SmiScnData.hpp:294
const int getObjStart()
Definition: SmiScnData.hpp:150
const int * getRowLowerIndices()
Definition: SmiScnData.hpp:83
OsiSolverInterface * generateCoreProblem(OsiSolverInterface *osi)
int * nRowInStage_
Definition: SmiScnData.hpp:275
int integerLength_
Definition: SmiScnData.hpp:285
double * dels_
Definition: SmiScnData.hpp:191
int getColInternalIndex(int i)
Definition: SmiScnData.hpp:217
bool hasQdata()
Definition: SmiScnData.hpp:254
Abstract Base Class for describing an interface to a solver.
int SmiStageIndex
Definition: SmiScnData.hpp:23
int * colStage_
Definition: SmiScnData.hpp:278
void gutsOfConstructor(int nrow, int ncol, int nstag, int *cstag, int *rstag, CoinPackedMatrix *matrix, CoinPackedVector *dclo, CoinPackedVector *dcup, CoinPackedVector *dobj, CoinPackedVector *drlo, CoinPackedVector *drup, int *integerIndices=0, int integerLength=0, int *binaryIndices=0, int binaryLength=0)
const double * getRowLowerElements()
Definition: SmiScnData.hpp:106
const int getMatStart()
Definition: SmiScnData.hpp:144
This deals with combining Core and Stochastic data.
const int getRupStart()
Definition: SmiScnData.hpp:147
int SmiScenarioIndex
Definition: SmiScnData.hpp:22
int getColStart(SmiStageIndex t)
Definition: SmiScnData.hpp:211
int * binaryIndices_
Definition: SmiScnData.hpp:286
int combineWithDenseCoreRow(double *dr, CoinPackedVector *cpv, double *dels, int *indx)
const int getCupStart()
Definition: SmiScnData.hpp:149
int getNumRows()
Definition: SmiScnData.hpp:206
const double * getDenseColLower(SmiStageIndex t)
Definition: SmiScnData.hpp:225
void copyColLower(double *dclo, SmiStageIndex t)
const double * getColUpperElements()
Definition: SmiScnData.hpp:109
std::vector< double * > pDenseRow_
Definition: SmiScnData.hpp:297
SmiQuadraticDataDC * nqdata_
Definition: SmiScnData.hpp:198
Sparse Vector.
void setCoreNode()
int * rowIn2Ex_
Definition: SmiScnData.hpp:283
int getNumCols(SmiStageIndex t)
Definition: SmiScnData.hpp:209
double ** cdobj_
Definition: SmiScnData.hpp:291
const int getColLowerLength()
Definition: SmiScnData.hpp:68
SmiNodeData * getNode(SmiStageIndex t)
Definition: SmiScnData.hpp:242
int getRowStage(int i)
Definition: SmiScnData.hpp:214
void deleteMemory()
void setHasQdata(bool b)
Definition: SmiScnData.hpp:253
std::map< int, CoinPackedVector * > SmiRowMap
Definition: SmiScnData.hpp:31
int getRowInternalIndex(int i)
Definition: SmiScnData.hpp:216
void copyObjective(double *dobj, SmiStageIndex t)
double ** cdrup_
Definition: SmiScnData.hpp:290
int getNumCols()
Definition: SmiScnData.hpp:205
void copyColUpper(double *dcup, SmiStageIndex t)
bool hasQdata()
Definition: SmiScnData.hpp:127
void copyRowUpper(double *drup)
const int getRowUpperLength()
Definition: SmiScnData.hpp:67
const int getRowLength(int irow)
Definition: SmiScnData.hpp:60
const int getColUpperLength()
Definition: SmiScnData.hpp:69
int getNumStages()
Definition: SmiScnData.hpp:208
SmiCoreData * core_
Definition: SmiScnData.hpp:173
void setHasQdata(bool b)
Definition: SmiScnData.hpp:128
double * getMutableRowElements(int irow)
Definition: SmiScnData.hpp:102
const int getRloStart()
Definition: SmiScnData.hpp:146
double ** cdclo_
Definition: SmiScnData.hpp:292
MPS IO Interface.
Definition: CoinMpsIO.hpp:401
std::map< int, double * > SmiDenseRowMap
Definition: SmiScnData.hpp:32
void setColumnNames(char **namesStrict, char **namesFree)
Definition: SmiScnData.hpp:244