00001
00004 #include <iostream>
00005 #include <cmath>
00006
00007
00008
00014 template<class T>
00015 void
00016 Reservoir<T>::init(int size, long seed) {
00017 srand(seed);
00018 this->reservoir_size = size;
00019 this->current_size = 0;
00020 exampleClasses = new int[reservoir_size];
00021 pFeatures = new T[reservoir_size];
00022 }
00023
00025
00029 template<class T>
00030 Reservoir<T>::Reservoir(int size) {
00031 init(size, time(NULL));
00032 }
00033
00039 template<class T>
00040 Reservoir<T>::Reservoir(int size, long seed) {
00041 init(size, seed);
00042 }
00043
00049 template<class T>
00050 void
00051 Reservoir<T>::swapClassesOfLabels(int i, int j) {
00052 int tempClass = exampleClasses[i];
00053 exampleClasses[i] = exampleClasses[j];
00054 exampleClasses[j] = tempClass;
00055 }
00056
00062 template<class T>
00063 void
00064 Reservoir<T>::swapVectors(int i, int j) {
00065 T tempVector = pFeatures[i];
00066 pFeatures[i] = pFeatures[j];
00067 pFeatures[j] = tempVector;
00068 }
00069
00073 template <class T>
00074 void
00075 Reservoir<T>::shuffle() {
00076 for(int i = 0; i < reservoir_size; i ++) {
00077 int randVal = int(floor(drand48() * reservoir_size));
00078 this->swapClassesOfLabels(randVal, i);
00079 this->swapVectors(randVal, i);
00080 }
00081 }
00088 template<class T>
00089 void
00090 Reservoir<T>::copyExample(int index, int classOfExample, T featureArray) {
00091 exampleClasses[index] = classOfExample;
00092 pFeatures[index] = featureArray;
00093 }
00094
00100 template<class T>
00101 void
00102 Reservoir<T>::addExample(int classOfExample, T featureArray) {
00103 if(current_size < reservoir_size) {
00104 copyExample(current_size, classOfExample, featureArray);
00105 current_size ++;
00106
00107 if(current_size == reservoir_size)
00108 shuffle();
00109 }
00110 else {
00111 int new_val = int(floor(drand48() * reservoir_size));
00112 copyExample(new_val, classOfExample, featureArray);
00113 }
00114 }
00115
00120 template<class T>
00121 void
00122 Reservoir<T>::addExample(std::string newExample) {
00123 int classOfExample;
00124 T featureArray;
00125 std::istringstream f;
00126 f.str(newExample + "\n");
00127 f >> classOfExample >> featureArray;
00128 addExample(classOfExample, featureArray);
00129 }
00130
00136 template<class T>
00137 int
00138 Reservoir<T>::getExampleClass(int index) {
00139 return exampleClasses[index];
00140 }
00141
00146 template<class T>
00147 int
00148 Reservoir<T>::getCurrentSize() {
00149 return current_size;
00150 }
00151
00157 template<class T>
00158 const T
00159 Reservoir<T>::getExampleFeatureVector(int index) {
00160 return pFeatures[index];
00161 }