Biorithm  1.1
 All Classes Functions Variables Typedefs Friends
ItemsetLevel.h
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
 All Classes Functions Variables Typedefs Friends