00001 /************************************************************************** 00002 * Copyright (c) 2007 Clifford Conley Owens III * 00003 * * 00004 * This file is part of Biorithm. * 00005 * * 00006 * Biorithm is free software: you can redistribute it and/or modify * 00007 * it under the terms of the GNU General Public License as published by * 00008 * the Free Software Foundation, either version 3 of the License, or * 00009 * (at your option) any later version. * 00010 * * 00011 * Biorithm is distributed in the hope that it will be useful, * 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00014 * GNU General Public License for more details. * 00015 * * 00016 * You should have received a copy of the GNU General Public License * 00017 * along with Biorithm. If not, see <http://www.gnu.org/licenses/>. * 00018 * * 00019 **************************************************************************/ 00020 00033 #ifndef ITEMSETLEVEL_H 00034 #define ITEMSETLEVEL_H 00035 00036 // ---------------------------- Internal Headers ---------------------------- // 00037 00038 #include "ItemsetCompare.h" 00039 00040 // ---------------------------- External Headers ---------------------------- // 00041 00042 #include <map> 00043 #include <vector> 00044 #include <ext/hash_map> 00045 00046 #include <iostream> 00047 00054 template <typename t> class ItemsetLevel 00055 { 00056 private: 00057 // ----------------------------- Definitions ---------------------------- // 00058 typedef __gnu_cxx::hash_map<Itemset*, unsigned int, hash<const Itemset*>, 00059 eqis> h_map; 00060 typedef h_map::iterator h_iter; 00061 typedef h_map::const_iterator h_citer; 00062 typedef map<Itemset*, unsigned int, ltis<const Itemset*> > o_map; 00063 typedef o_map::iterator o_iter; 00064 typedef o_map::const_iterator o_citer; 00065 00066 // This is the vector of itemsets 00067 vector<Itemset*> vsets; 00068 00069 // This is the vector of values 00070 vector<t*> vvals; 00071 00072 // This is the hash table of itemsets 00073 h_map hsets; 00074 00075 // This is the ordered map of itemsets 00076 map<Itemset*, unsigned int> msets; 00077 00078 // This is the level 00079 unsigned int level; 00080 00081 // Whether or not we should order them 00082 bool order; 00083 00084 public: 00085 typedef map<Itemset*, unsigned int, ltis<const Itemset*> >::iterator 00086 iterator; 00087 typedef map<Itemset*, unsigned int, 00088 ltis<const Itemset*> >::const_iterator const_iterator; 00089 00091 // The constructor // 00093 ItemsetLevel(unsigned int level = 0, bool order = false) 00094 { 00095 this->level = level; 00096 this->order = order; 00097 } 00098 00100 // The copy constructor // 00101 // // 00102 // --------------------------- Parameters --------------------------- // 00103 // const ItemsetLevel& src // 00104 // The source itemset level // 00106 ItemsetLevel(const ItemsetLevel& src) 00107 { 00108 *this = src; 00109 } 00110 00112 // The destructor // 00114 ~ItemsetLevel() 00115 { 00116 00117 } 00118 00120 // The = operator // 00121 // // 00122 // --------------------------- Parameters --------------------------- // 00123 // const ItemsetLevel& rhs // 00124 // The right hand side // 00125 // // 00126 // ----------------------------- Return ----------------------------- // 00127 // *this // 00129 ItemsetLevel& operator =(const ItemsetLevel& rhs) 00130 { 00131 vsets = rhs.vsets; 00132 vvals = rhs.vvals; 00133 hsets = rhs.hsets; 00134 level = rhs.level; 00135 order = rhs.order; 00136 return *this; 00137 } 00138 00140 // If we are adding by order, we can use the [] operator to access // 00141 // itemsets // 00142 // // 00143 // --------------------------- Parameters --------------------------- // 00144 // unsigned int index // 00145 // The index // 00146 // // 00147 // ----------------------------- Return ----------------------------- // 00148 // A pointer to the itemset at that index // 00150 Itemset* operator [](unsigned int index) 00151 { 00152 return vsets[index]; 00153 } 00154 00156 // If we are adding by order, we can use the [] operator to access // 00157 // the last itemset // 00158 // // 00159 // ----------------------------- Return ----------------------------- // 00160 // A pointer to the last itemset // 00162 Itemset* back() 00163 { 00164 return vsets.back(); 00165 } 00166 00168 // Clears the structure // 00170 void clear() 00171 { 00172 vsets.clear(); 00173 vvals.clear(); 00174 hsets.clear(); 00175 msets.clear(); 00176 } 00177 00179 // Destroys all the itemsets // 00181 void destroy() 00182 { 00183 // See if we need to delete the itemsets from the map 00184 if (order) 00185 { 00186 for (o_iter i = msets.begin(); i != msets.end(); i++) 00187 { 00188 delete i->first; 00189 } 00190 } 00191 00192 // If we reach this else, we need to delete the itemsets from 00193 // the vector 00194 else 00195 { 00196 for (unsigned int i = 0; i < vsets.size(); i++) 00197 { 00198 /*cout << "i: " << i << " / " << vsets.size() << endl; 00199 for (unsigned int j = 0; j < vsets[i]->getSize(); j++) 00200 { 00201 if (j) 00202 { 00203 cout << ", "; 00204 } 00205 cout << vsets[i]->getItem(j); 00206 } 00207 cout << endl;*/ 00208 delete vsets[i]; 00209 } 00210 } 00211 00212 // Delete the values 00213 for (unsigned int i = 0; i < vvals.size(); i++) 00214 { 00215 delete vvals[i]; 00216 } 00217 } 00218 00220 // Tests to see if we have no itemsets // 00221 // // 00222 // ----------------------------- Return ----------------------------- // 00223 // true: we have no itemsets // 00224 // false: we have itemsets // 00226 bool isEmpty() const 00227 { 00228 return vvals.empty(); 00229 } 00230 00232 // Inserts an itemset into the structure // 00233 // // 00234 // --------------------------- Parameters --------------------------- // 00235 // Itemset* is // 00236 // The itemset // 00237 // const t& value // 00238 // the value that we want to add // 00240 void insert(Itemset* is, const t& value) 00241 { 00242 insert(is, new t(value)); 00243 } 00244 00246 // Inserts an itemset into the structure // 00247 // // 00248 // --------------------------- Parameters --------------------------- // 00249 // Itemset* is // 00250 // The itemset // 00251 // const t* value // 00252 // the value that we want to add // 00254 void insert(Itemset* is, t* value = new t) 00255 { 00256 // Insert the itemset into the hashmap 00257 hsets[is] = vvals.size(); 00258 00259 // See if we need to add it to the map 00260 if (order) 00261 { 00262 msets[is] = vvals.size(); 00263 } 00264 00265 // At this point, we know we need to add it to the vector 00266 else 00267 { 00268 vsets.push_back(is); 00269 } 00270 00271 // Insert the value into the vector 00272 vvals.push_back(value); 00273 } 00274 00276 // gets the size of the structure // 00277 // // 00278 // ----------------------------- Return ----------------------------- // 00279 // the size // 00281 unsigned int getSize() const 00282 { 00283 return vvals.size(); 00284 } 00285 00287 // Sets the level // 00288 // // 00289 // --------------------------- Parameters --------------------------- // 00290 // unsigned int level // 00291 // the level // 00293 void setLevel(unsigned int level) 00294 { 00295 this->level = level; 00296 } 00297 00299 // Gets the level // 00300 // // 00301 // ----------------------------- Return ----------------------------- // 00302 // The level // 00304 unsigned int getLevel() const 00305 { 00306 return level; 00307 } 00308 00310 // Gets the value // 00311 // // 00312 // --------------------------- Parameters --------------------------- // 00313 // unsigned int index // 00314 // the index // 00315 // // 00316 // ----------------------------- Return ----------------------------- // 00317 // A pointer to the value // 00319 t* getValue(unsigned int index) 00320 { 00321 return vvals[index]; 00322 } 00323 00325 // Gets the value // 00326 // // 00327 // --------------------------- Parameters --------------------------- // 00328 // unsigned int index // 00329 // the index // 00330 // // 00331 // ----------------------------- Return ----------------------------- // 00332 // A pointer to the value // 00334 const t* getValue(unsigned int index) const 00335 { 00336 return vvals[index]; 00337 } 00338 00340 // Gets the value // 00341 // // 00342 // --------------------------- Parameters --------------------------- // 00343 // const Itemset* is // 00344 // the itemset // 00345 // // 00346 // ----------------------------- Return ----------------------------- // 00347 // A pointer to the value // 00349 t* getValue(/*const*/ Itemset* is) 00350 { 00351 h_iter iter = hsets.find(is); 00352 if (iter == hsets.end()) 00353 { 00354 return NULL; 00355 } 00356 return vvals[(*iter).second]; 00357 } 00358 00360 // Gets the value // 00361 // // 00362 // --------------------------- Parameters --------------------------- // 00363 // const Itemset& is // 00364 // the itemset // 00365 // // 00366 // ----------------------------- Return ----------------------------- // 00367 // A pointer to the value // 00369 /*const t* getValue(const Itemset& is) const 00370 { 00371 // Ugly ugly hack 00372 // should be: return getValue(&is) 00373 Itemset* dummy = new Itemset(is.getSize()); 00374 for (unsigned int i = 0; i < is.getSize(); i++) 00375 { 00376 dummy->setItem(i, is[i]); 00377 } 00378 t* ret = getValue(dummy); 00379 delete dummy; 00380 return ret; 00381 }*/ 00382 00384 // Gets the value // 00385 // // 00386 // --------------------------- Parameters --------------------------- // 00387 // const Itemset& is // 00388 // the itemset // 00389 // // 00390 // ----------------------------- Return ----------------------------- // 00391 // A pointer to the value // 00393 t* getValue(const Itemset& is) 00394 { 00395 // Ugly ugly hack 00396 // should be: return getValue(&is) 00397 Itemset* dummy = new Itemset(is.getSize()); 00398 for (unsigned int i = 0; i < is.getSize(); i++) 00399 { 00400 dummy->setItem(i, is[i]); 00401 } 00402 t* ret = getValue(dummy); 00403 delete dummy; 00404 return ret; 00405 } 00406 00408 // Gets an itemset // 00409 // // 00410 // --------------------------- Parameters --------------------------- // 00411 // unsigned int index // 00412 // the index // 00413 // // 00414 // ----------------------------- Return ----------------------------- // 00415 // A pointer to the itemset // 00417 const Itemset* getItemset(unsigned int index) const 00418 { 00419 return vsets[index]; 00420 } 00421 00423 // Sees if an itemset exists at this level // 00424 // // 00425 // --------------------------- Parameters --------------------------- // 00426 // Itemset* is // 00427 // the itemset // 00428 // // 00429 // ----------------------------- Return ----------------------------- // 00430 // true: // 00431 // The itemset does exist // 00432 // false: // 00433 // The itemset does not exist // 00435 bool contains(Itemset* is) 00436 { 00437 return hsets.find(is) != hsets.end(); 00438 } 00439 00441 // Sees if an itemset exists at this level // 00442 // // 00443 // --------------------------- Parameters --------------------------- // 00444 // Itemset& is // 00445 // the itemset // 00446 // // 00447 // ----------------------------- Return ----------------------------- // 00448 // true: // 00449 // The itemset does exist // 00450 // false: // 00451 // The itemset does not exist // 00453 bool contains(Itemset& is) 00454 { 00455 return contains(&is); 00456 } 00457 00459 // Gets an iterator to the beginning of the level // 00460 // // 00461 // -------------------------- Preconditions ------------------------- // 00462 // order // 00463 // // 00464 // ----------------------------- Return ----------------------------- // 00465 // An iterator to the beginning of the map // 00467 iterator begin() 00468 { 00469 return msets.begin(); 00470 } 00471 00473 // Gets an iterator to the end of the level // 00474 // // 00475 // -------------------------- Preconditions ------------------------- // 00476 // order // 00477 // // 00478 // ----------------------------- Return ----------------------------- // 00479 // An iterator to the end of the map // 00481 iterator end() 00482 { 00483 return msets.end(); 00484 } 00485 }; 00486 00487 #endif