WoMax Documentation OMax Logo

Oracle_data.hpp

Go to the documentation of this file.
00001 /*-------------------------------------
00002  * Oracle_data.hpp
00003  * Created on 20/03/09 by BenCello
00004  *-------------------------------------*/
00005 
00007 
00008 #ifndef __ORACLE_DATA_HPP__
00009 #define __ORACLE_DATA_HPP__
00010 
00011 #include <vector>
00012 #include <map>
00013 using namespace std;
00014 
00015 #include "Oracle_label.hpp"
00016 
00020 
00021 // Prototypes //
00023 
00026 class O_data
00027 {
00028 protected:
00030         int size;
00032 
00033 
00034         map<int,int> * dates2states;
00036         map<int,int> * states2dates;
00038 
00039         vector<O_label *> state_vect;
00040 public:
00042 
00043 
00044         O_data();
00046         O_data(const O_data &);
00048         ~O_data();
00050         
00052 
00053 
00054         template<class O_DataType>
00055         void start();
00057         template<class O_DataType>
00058         void freestates();
00060         void clear_vect();
00062         
00064 
00065 
00066         template<class O_DataType>
00067         int add(int, O_label*);
00069         int get_size();
00071         
00073 
00074 
00075         void add_date(O_label &);
00077         void add_date(int,int);
00079         int get_state(int);
00081         void reset_D2S();
00083         
00085 
00086 
00087         void add_state(O_label &);
00089         void add_state(int,int);
00091         int get_date(int);
00093         void reset_S2D();
00095         
00097 
00098 
00099         O_label* operator[] (int) const;
00101         
00102         // friends
00103         friend class O_learner;
00104 };
00105 
00108 
00109 // Functions //
00111 
00112 O_data::O_data()
00113 {
00115         size = -1;
00116         states2dates = NULL;
00117         dates2states = NULL;
00118 }
00119 
00120 O_data::O_data(const O_data & datain)
00121 {
00122         size = datain.size;
00123         dates2states = datain.dates2states;
00124         state_vect = datain.state_vect;
00125 }
00126 
00127 O_data::~O_data()
00128 {
00130         delete dates2states;
00131         delete states2dates;
00132 }
00133 
00135 template<class O_DataType>
00136 void O_data::freestates()
00137 {
00138         vector<O_label *>::reverse_iterator O_it;
00139         for(O_it = state_vect.rbegin();O_it != state_vect.rend();++O_it)
00140         {
00141                 //cout<<*(O_DataType*)(*O_it)<<endl;
00142                 //delete (O_DataType*)(*O_it);
00143                 state_vect.pop_back();
00144         }
00145         size = state_vect.size();
00146 }
00147 
00148 int O_data::get_size()
00149 {
00150         return state_vect.size();
00151 }
00152 
00154 template<class O_DataType>
00155 void O_data::start()
00156 {
00157         if(size <= 0)
00158         {
00159                 O_DataType * newdata = new O_DataType();
00160                 state_vect.push_back((O_label*)newdata);
00161                 size = state_vect.size();
00162                 dates2states = new map<int,int>();
00163                 (*dates2states)[0]=0;
00164                 states2dates = new map<int,int>();
00165                 (*states2dates)[0]=0;
00166         }
00167 }
00168 
00170 void O_data::clear_vect()
00171 {
00172         state_vect.clear();
00173         size = state_vect.size();
00174 }
00175 
00177 template<class O_DataType>
00178 int O_data::add(int date, O_label* labelin)
00179 {
00181         if (state_vect.size()<1)
00182         {
00183                 start<O_DataType>();
00184         }
00185         
00186         state_vect.push_back(labelin);
00187         add_state(size, date);
00188         add_date(date, size);
00189         size = state_vect.size();
00191         return (size-1);
00192 }
00193 
00194 // dates to states functions
00195 
00196 void O_data::add_date(O_label & labelin)
00197 {
00198         (*dates2states)[labelin.get_bufferef()]=labelin.get_statenb();
00199 }
00200 
00203 void O_data::add_date(int datein, int statenb)
00204 {
00205         (*dates2states)[datein]=statenb;
00206 }
00207 
00209 int O_data::get_state(int date)
00210 {
00211         map<int,int>::iterator mapit;
00212         mapit = dates2states->upper_bound(date);
00213         --mapit;
00215         return (*mapit).second;
00216 }
00217 
00218 void O_data::reset_D2S()
00219 {
00220         if (dates2states != NULL)
00221                 dates2states->clear();
00222 }
00223 
00224 // states to dates functions
00225 void O_data::add_state(O_label & labelin)
00226 {
00227         (*states2dates)[labelin.get_statenb()]=labelin.get_bufferef();
00228 }
00229 
00232 void O_data::add_state(int statenb, int datein)
00233 {
00234         (*states2dates)[statenb]=datein;
00235 }
00236 
00237 int O_data::get_date(int statenb)
00238 {
00240         return (*states2dates)[statenb];
00241 }
00242 
00243 void O_data::reset_S2D()
00244 {
00245         if (states2dates != NULL)
00246                 states2dates->clear();
00247 }
00248 
00249 // operator overload
00250 O_label * O_data::operator[] (int i) const
00251 {
00252         if (this!= NULL && size>0 && i<size)
00253                 return(state_vect[i]);
00254         else
00255                 return NULL;
00256 }
00257 
00258 #endif

Generated on 16 Mar 2010 for Benjamin Lévy by  doxygen 1.6.1