MP_data.hpp

Go to the documentation of this file.
00001 // ******************** FlopCpp **********************************************
00002 // File: MP_data.hpp
00003 // $Id$
00004 // Author: Tim Helge Hultberg (thh@mat.ua.pt)
00005 // Copyright (C) 2003 Tim Helge Hultberg
00006 // All Rights Reserved.
00007 // ****************************************************************************
00008 
00009 #ifndef _MP_data_hpp_
00010 #define _MP_data_hpp_
00011 
00012 #include <vector>
00013 #include "MP_index.hpp"    
00014 #include "MP_set.hpp"      
00015 #include "MP_constant.hpp" 
00016 #include "MP_boolean.hpp" 
00017 
00018 namespace flopc {
00019 
00020   class MP_data;
00021 
00027   class DataRef : public Constant_base, public Functor {
00028   public:
00029     DataRef(MP_data* d, 
00030             const MP_index_exp& i1,
00031             const MP_index_exp& i2,
00032             const MP_index_exp& i3,
00033             const MP_index_exp& i4,
00034             const MP_index_exp& i5,
00035             int s = 0) : 
00036       D(d),I1(i1),I2(i2),I3(i3),I4(i4),I5(i5),C(0),stochastic(s) {}
00037 
00038     ~DataRef() {} 
00039     DataRef& such_that(const MP_boolean& b);
00040     double evaluate() const;
00041     int getStage() const;
00042     const DataRef& operator=(const DataRef& r); 
00043     const DataRef& operator=(const Constant& c);
00044     void evaluate_lhs(double v) const;
00045     void operator()() const;
00046     DataRef& probability(double p) { return *this; }
00047   private:
00048     MP_data* D;
00049     MP_index_exp I1,I2,I3,I4,I5;
00050     Constant C;
00051     int stochastic;
00052     MP_boolean B;
00053   };
00054 
00071   class MP_data : public RowMajor, public Functor , public Named {
00072     friend class MP_variable;
00073     friend class DisplayData;
00074     friend class DataRef;
00075     friend class MP_model;
00076   public:
00077     void operator()() const;
00079     void initialize(double d) {
00080       for (int i=0; i<size(); i++) {
00081         v[i] = d;
00082       }
00083     }
00087     MP_data(const MP_set_base &s1 = MP_set::getEmpty(), 
00088             const MP_set_base &s2 = MP_set::getEmpty(), 
00089             const MP_set_base &s3 = MP_set::getEmpty(),
00090             const MP_set_base &s4 = MP_set::getEmpty(), 
00091             const MP_set_base &s5 = MP_set::getEmpty()) :
00092       RowMajor(s1.size(),s2.size(),s3.size(),s4.size(),s5.size()),
00093       S1(s1),S2(s2),S3(s3),S4(s4),S5(s5),
00094       v(new double[size()]), manageData(true) 
00095       {
00096         initialize(0); 
00097       }
00098 
00102     MP_data(double* value,
00103             const MP_set_base &s1 = MP_set::getEmpty(), 
00104             const MP_set_base &s2 = MP_set::getEmpty(), 
00105             const MP_set_base &s3 = MP_set::getEmpty(),
00106             const MP_set_base &s4 = MP_set::getEmpty(), 
00107             const MP_set_base &s5 = MP_set::getEmpty()) :
00108       RowMajor(s1.size(),s2.size(),s3.size(),s4.size(),s5.size()),
00109       S1(s1),S2(s2),S3(s3),S4(s4),S5(s5),
00110       v(value), manageData(false) 
00111       { }
00112 
00113     ~MP_data() {
00114       if (manageData == true) delete[] v;
00115     }
00116         
00118     void value(const double* d) {
00119       for (int i=0; i<size(); i++) {
00120         v[i] = d[i];
00121       }
00122     }
00123 
00125     operator double() {
00126       return operator()(0);
00127     }
00128     
00133     double& operator()(int i1, int i2=0, int i3=0, int i4=0, int i5=0) {
00134       i1 = S1.check(i1);
00135       i2 = S2.check(i2);
00136       i3 = S3.check(i3);
00137       i4 = S4.check(i4);
00138       i5 = S5.check(i5);
00139       int i = f(i1,i2,i3,i4,i5);
00140       if (i == outOfBound) {
00141         outOfBoundData = 0;
00142         return outOfBoundData;
00143       } else {
00144         return v[i];
00145       }
00146     }
00147     
00152     DataRef& operator() (
00153       const MP_index_exp& i1 = MP_index_exp::getEmpty(),
00154       const MP_index_exp& i2 = MP_index_exp::getEmpty(),
00155       const MP_index_exp& i3 = MP_index_exp::getEmpty(),
00156       const MP_index_exp& i4 = MP_index_exp::getEmpty(),
00157       const MP_index_exp& i5 = MP_index_exp::getEmpty()
00158       ) {
00159       myrefs.push_back(new DataRef(this, i1, i2, i3, i4, i5));
00160       return *myrefs.back();
00161     }
00162     
00163 
00165     void display(string s = "");
00166   protected:
00167     vector<DataRef*> myrefs;
00168   private:
00169     MP_data(const MP_data&); // Forbid copy constructor
00170     MP_data& operator=(const MP_data&); // Forbid assignment
00171 
00172     static double outOfBoundData;
00173 
00174     MP_index i1,i2,i3,i4,i5;
00175     const MP_set_base &S1,&S2,&S3,&S4,&S5;
00176     double* v;
00177     bool manageData;
00178   };
00179 
00180   class MP_stochastic_data : public MP_data {
00181   public:
00182     MP_stochastic_data(const MP_set_base &s1 = MP_set::getEmpty(), 
00183                        const MP_set_base &s2 = MP_set::getEmpty(), 
00184                        const MP_set_base &s3 = MP_set::getEmpty(),
00185                        const MP_set_base &s4 = MP_set::getEmpty(), 
00186                        const MP_set_base &s5 = MP_set::getEmpty()) :
00187       MP_data(s1,s2,s3,s4,s5) {}
00188 
00189     DataRef& operator() (
00190       const MP_index_exp& i1 = MP_index_exp::getEmpty(),
00191       const MP_index_exp& i2 = MP_index_exp::getEmpty(),
00192       const MP_index_exp& i3 = MP_index_exp::getEmpty(),
00193       const MP_index_exp& i4 = MP_index_exp::getEmpty(),
00194       const MP_index_exp& i5 = MP_index_exp::getEmpty()
00195       ) {
00196       myrefs.push_back(new DataRef(this, i1, i2, i3, i4, i5, 1));
00197       return *myrefs.back();
00198     }
00199   };
00200 
00201 } // End of namespace flopc
00202 #endif

Generated on Fri May 16 00:25:12 2008 for FLOPC++ by  doxygen 1.4.7