FLOPC++
MP_data.hpp
Go to the documentation of this file.
1 // ******************** FlopCpp **********************************************
2 // File: MP_data.hpp
3 // $Id$
4 // Author: Tim Helge Hultberg (thh@mat.ua.pt)
5 // Copyright (C) 2003 Tim Helge Hultberg
6 // All Rights Reserved.
7 // ****************************************************************************
8 
9 #ifndef _MP_data_hpp_
10 #define _MP_data_hpp_
11 
12 #include <vector>
13 #include "MP_index.hpp"
14 #include "MP_set.hpp"
15 #include "MP_constant.hpp"
16 #include "MP_boolean.hpp"
17 
18 namespace flopc {
19 
20  class MP_data;
21 
27  class DataRef : public Constant_base, public Functor {
28  public:
30  const MP_index_exp& i1,
31  const MP_index_exp& i2,
32  const MP_index_exp& i3,
33  const MP_index_exp& i4,
34  const MP_index_exp& i5,
35  int s = 0) :
36  D(d),I1(i1),I2(i2),I3(i3),I4(i4),I5(i5),C(0),stochastic(s) {}
37 
38  ~DataRef() {}
39  DataRef& such_that(const MP_boolean& b);
40  double evaluate() const;
41  int getStage() const;
42  const DataRef& operator=(const DataRef& r);
43  const DataRef& operator=(const Constant& c);
44  void evaluate_lhs(double v) const;
45  void operator()() const;
46  DataRef& probability(double p) { return *this; }
47  private:
53  };
54 
71  class MP_data : public RowMajor, public Functor , public Named {
72  friend class MP_variable;
73  friend class DisplayData;
74  friend class DataRef;
75  friend class MP_model;
76  public:
77  void operator()() const;
79  void initialize(double d) {
80  for (int i=0; i<size(); i++) {
81  v[i] = d;
82  }
83  }
88  const MP_set_base &s2 = MP_set::getEmpty(),
89  const MP_set_base &s3 = MP_set::getEmpty(),
90  const MP_set_base &s4 = MP_set::getEmpty(),
91  const MP_set_base &s5 = MP_set::getEmpty()) :
92  RowMajor(s1.size(),s2.size(),s3.size(),s4.size(),s5.size()),
93  S1(s1),S2(s2),S3(s3),S4(s4),S5(s5),
94  v(new double[size()]), manageData(true)
95  {
96  initialize(0);
97  }
98 
102  MP_data(double* value,
103  const MP_set_base &s1 = MP_set::getEmpty(),
104  const MP_set_base &s2 = MP_set::getEmpty(),
105  const MP_set_base &s3 = MP_set::getEmpty(),
106  const MP_set_base &s4 = MP_set::getEmpty(),
107  const MP_set_base &s5 = MP_set::getEmpty()) :
108  RowMajor(s1.size(),s2.size(),s3.size(),s4.size(),s5.size()),
109  S1(s1),S2(s2),S3(s3),S4(s4),S5(s5),
110  v(value), manageData(false)
111  { }
112 
114  if (manageData == true) delete[] v;
115  }
116 
118  void value(const double* d) {
119  for (int i=0; i<size(); i++) {
120  v[i] = d[i];
121  }
122  }
123 
125  operator double() {
126  return operator()(0);
127  }
128 
133  double& operator()(int lcli1, int lcli2=0, int lcli3=0, int lcli4=0, int lcli5=0) {
134  lcli1 = S1.check(lcli1);
135  lcli2 = S2.check(lcli2);
136  lcli3 = S3.check(lcli3);
137  lcli4 = S4.check(lcli4);
138  lcli5 = S5.check(lcli5);
139  int i = f(lcli1,lcli2,lcli3,lcli4,lcli5);
140  if (i == outOfBound) {
141  outOfBoundData = 0;
142  return outOfBoundData;
143  } else {
144  return v[i];
145  }
146  }
147 
153  const MP_index_exp& lcli1 = MP_index_exp::getEmpty(),
154  const MP_index_exp& lcli2 = MP_index_exp::getEmpty(),
155  const MP_index_exp& lcli3 = MP_index_exp::getEmpty(),
156  const MP_index_exp& lcli4 = MP_index_exp::getEmpty(),
157  const MP_index_exp& lcli5 = MP_index_exp::getEmpty()
158  ) {
159  myrefs.push_back(new DataRef(this, lcli1, lcli2, lcli3, lcli4, lcli5));
160  return *myrefs.back();
161  }
162 
163 
165  void display(string s = "");
166  protected:
167  vector<DataRef*> myrefs;
168  private:
169  MP_data(const MP_data&); // Forbid copy constructor
170  MP_data& operator=(const MP_data&); // Forbid assignment
171 
172  static double outOfBoundData;
173 
175  const MP_set_base &S1,&S2,&S3,&S4,&S5;
176  double* v;
178  };
179 
180  class MP_stochastic_data : public MP_data {
181  public:
183  const MP_set_base &s2 = MP_set::getEmpty(),
184  const MP_set_base &s3 = MP_set::getEmpty(),
185  const MP_set_base &s4 = MP_set::getEmpty(),
186  const MP_set_base &s5 = MP_set::getEmpty()) :
187  MP_data(s1,s2,s3,s4,s5) {}
188 
189  using flopc::MP_data::operator(); // From bugsquashing party. Some compiler needs this?
190 
192  const MP_index_exp& lcli1 = MP_index_exp::getEmpty(),
193  const MP_index_exp& lcli2 = MP_index_exp::getEmpty(),
194  const MP_index_exp& lcli3 = MP_index_exp::getEmpty(),
195  const MP_index_exp& lcli4 = MP_index_exp::getEmpty(),
196  const MP_index_exp& lcli5 = MP_index_exp::getEmpty()
197  ) {
198  myrefs.push_back(new DataRef(this, lcli1, lcli2, lcli3, lcli4, lcli5, 1));
199  return *myrefs.back();
200  }
201  };
202 
203 } // End of namespace flopc
204 #endif