WoMax Documentation

# 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