Oracle_data.hpp
Go to the documentation of this file.00001
00002
00003
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
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
00103 friend class O_learner;
00104 };
00105
00108
00109
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
00142
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
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
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
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