IntMap.h

Go to the documentation of this file.
00001 /** \file IntMap.h
00002  *  Author: Eric J Bohm
00003  *  Date Created: June 4th, 2006
00004  *
00005  * Simple abstraction to replace CkHashtable with a straight array of
00006  * integers when we know we can perfectly hash the keys into an int
00007  * and only want an int back.  Meaning storage is just int
00008  * map[numKeys] and lookup is a constant time array offset.  Array
00009  * offset is an int multiply and int add.  Should be significantly
00010  * speedier than CkHashtable for the conditions under which it is
00011  * appropriate.
00012  *
00013  * 
00014  * IntMap4 is for 4D paircalc
00015  *
00016  * IntMap2 is the more standard 2D
00017  *
00018  * This is a much less flexible object than CkHashtable and probably
00019  * only suitable for use within procmaps.
00020  */
00021 
00022 #ifndef _INTMAP_H_
00023 #define _INTMAP_H_
00024 extern int numPes;
00025 
00026 
00027 class IntMap4 {
00028  private:
00029   int ****Map;
00030   int keyWmax;
00031   int keyXmax;
00032   int keyYmax;
00033   int keyZmax;
00034   int keyStep;
00035   int *stepTable;
00036  public:
00037 
00038     IntMap4(int keyW, int keyX, int keyY, int keyZ, int step) 
00039            : keyWmax(keyW), keyXmax(keyX), keyYmax(keyY), keyZmax(keyZ), keyStep(step)
00040       {
00041         Map=new int***[keyWmax];
00042         for(int w=0;w<keyWmax;w++)
00043           {
00044             Map[w]= new int**[keyXmax];
00045             for(int x=0;x<keyXmax;x++)
00046               {
00047                 Map[w][x]= new int*[keyYmax];
00048                 for(int y=0;y<keyYmax;y++)
00049                   Map[w][x][y]= new int[keyZmax];
00050               }
00051         
00052           }
00053         stepTable= new int [keyXmax*keyStep];
00054         for(int s=0;s<keyXmax*keyStep;s++)
00055           stepTable[s]=s/keyStep;
00056       }
00057     ~IntMap4(){
00058       if(Map!=NULL)
00059         {
00060           for(int w=0;w<keyWmax;w++)
00061             {
00062               for(int x=0;x<keyXmax;x++)
00063                 {
00064                   for(int y=0;y<keyYmax;y++)
00065                     delete [] Map[w][x][y];
00066                   delete [] Map[w][x];
00067                 }
00068               delete [] Map[w];
00069             }
00070           delete [] Map;
00071           Map=NULL;
00072         }
00073       
00074     }
00075 
00076     void buildMap(int keyW=1, int keyX=1, int keyY=1, int keyZ=1, int step=1)
00077       {
00078         CkAssert(keyW>0);
00079         CkAssert(keyX>0);
00080         CkAssert(keyY>0);
00081         CkAssert(keyZ>0);
00082         keyWmax=keyW;
00083         keyXmax=keyX;
00084         keyYmax=keyY;
00085         keyZmax=keyZ;
00086         keyStep=step;
00087         Map=new int***[keyWmax];
00088         for(int w=0;w<keyWmax;w++)
00089           {
00090             Map[w]= new int**[keyXmax];
00091             for(int x=0;x<keyXmax;x++)
00092               {
00093                 Map[w][x]= new int*[keyYmax];
00094                 for(int y=0;y<keyYmax;y++)
00095                   Map[w][x][y]= new int[keyZmax];
00096               }
00097           }
00098         stepTable= new int [keyXmax*keyStep];
00099         for(int s=0;s<keyXmax*keyStep;s++)
00100           stepTable[s]=s/keyStep;
00101       }
00102     void pup(PUP::er &p)
00103       {
00104           p|keyWmax;
00105           p|keyXmax;
00106           p|keyYmax;
00107           p|keyZmax;
00108           p|keyStep;
00109           if(p.isUnpacking())
00110             Map=new int***[keyWmax];
00111           for(int w=0;w<keyWmax;w++)
00112             {
00113               if(p.isUnpacking())
00114                 Map[w]= new int**[keyXmax];
00115               for(int x=0;x<keyXmax;x++)
00116                 {
00117                   if(p.isUnpacking())
00118                     Map[w][x]= new int*[keyYmax];
00119                   for(int y=0;y<keyYmax;y++)
00120                     {
00121                       if(p.isUnpacking())
00122                         Map[w][x][y]= new int[keyZmax];
00123                       PUParray(p,Map[w][x][y],keyZmax);
00124                     }
00125                 }
00126             }
00127           if(p.isUnpacking())
00128             stepTable= new int[keyXmax*keyStep];
00129           PUParray(p,stepTable,keyXmax*keyStep);
00130 
00131       }
00132     inline int getWmax(){return(keyWmax);}
00133     inline int getXmax(){return(keyXmax);}
00134     inline int getYmax(){return(keyYmax);}
00135     inline int getZmax(){return(keyZmax);}
00136     inline int get(int W, int X, int Y, int Z)  {
00137       /*
00138       CkAssert(W<keyWmax);
00139       CkAssert(X/keyStep<keyXmax);
00140       CkAssert(Y/keyStep<keyYmax);
00141       CkAssert(Z<keyZmax);
00142       */
00143 #define USE_INT_MAP_MATH
00144 #ifdef USE_INT_MAP_MATH
00145        return(Map[W][X/keyStep][Y/keyStep][Z]);
00146 #else
00147        return(Map[W][stepTable[X]][stepTable[Y]][Z]);
00148 #endif
00149     }
00150     //    inline int &put(int W, int X, int Y, int Z){return(&(Map[W][X/keyStep][Y/keyStep][Z]));}
00151     inline void set(int W, int X, int Y, int Z, int value){
00152       CkAssert(W<keyWmax);
00153       CkAssert(X/keyStep<keyXmax);
00154       CkAssert(Y/keyStep<keyYmax);
00155       CkAssert(Z<keyZmax);
00156       CkAssert(numPes>value);
00157       Map[W][X/keyStep][Y/keyStep][Z]=value;
00158     }
00159     void dump()
00160       {
00161         for(int w=0;w<keyWmax;w++)
00162           for(int x=0;x<keyXmax;x++)
00163             for(int y=0;y<keyYmax;y++)
00164               for(int z=0;z<keyZmax;z++)
00165                 CkPrintf("%d %d %d %d %d \n",w,x,y,z, get(w,x*keyStep,y*keyStep,z));
00166       }
00167     IntMap4(){keyWmax=0;keyXmax=0; keyYmax=0, keyZmax=0; keyStep=1; Map=NULL;}
00168 };
00169 
00170 class IntMap3 {
00171  private:
00172   int ***Map;
00173   int keyXmax;
00174   int keyYmax;
00175   int keyZmax;
00176 
00177  public:
00178 
00179     IntMap3(int keyX, int keyY, int keyZ, int step) 
00180            :  keyXmax(keyX), keyYmax(keyY), keyZmax(keyZ)
00181       {
00182         Map=new int**[keyXmax];
00183         for(int x=0;x<keyXmax;x++)
00184           {
00185             Map[x]= new int*[keyYmax];
00186             for(int y=0;y<keyYmax;y++)
00187               {
00188                 Map[x][y]= new int[keyZmax];
00189                 memset(Map[x][y],-1,keyZmax*sizeof(int));
00190               }
00191           }
00192       }
00193     ~IntMap3(){
00194       if(Map!=NULL)
00195         {
00196           for(int x=0;x<keyXmax;x++)
00197             {
00198               for(int y=0;y<keyYmax;y++)
00199                 delete [] Map[x][y];
00200               delete [] Map[x];
00201             }
00202           Map=NULL;
00203         }
00204       
00205     }
00206 
00207     void buildMap(int keyX=1, int keyY=1, int keyZ=1, int step=1)
00208       {
00209         CkAssert(keyX>0);
00210         CkAssert(keyY>0);
00211         CkAssert(keyZ>0);
00212         keyXmax=keyX;
00213         keyYmax=keyY;
00214         keyZmax=keyZ;
00215         Map=new int**[keyXmax];
00216         for(int x=0;x<keyXmax;x++)
00217           {
00218             Map[x]= new int*[keyYmax];
00219             for(int y=0;y<keyYmax;y++)
00220               {
00221                 Map[x][y]= new int[keyZmax];
00222                 memset(Map[x][y],-1,keyZmax*sizeof(int));
00223               }
00224           }
00225       }
00226     void pup(PUP::er &p)
00227       {
00228           p|keyXmax;
00229           p|keyYmax;
00230           p|keyZmax;
00231           if(p.isUnpacking())
00232             Map=new int**[keyXmax];
00233           for(int x=0;x<keyXmax;x++)
00234             {
00235               if(p.isUnpacking())
00236                 Map[x]= new int*[keyYmax];
00237               for(int y=0;y<keyYmax;y++)
00238                 {
00239                   if(p.isUnpacking())
00240                     Map[x][y]= new int[keyZmax];
00241                   PUParray(p,Map[x][y],keyZmax);
00242                 }
00243             }
00244       }
00245     inline int getXmax(){return(keyXmax);}
00246     inline int getYmax(){return(keyYmax);}
00247     inline int getZmax(){return(keyZmax);}
00248     inline int get(int X, int Y, int Z)  {
00249       return(Map[X][Y][Z]);
00250     }
00251     //    inline int &put(int W, int X, int Y, int Z){return(&(Map[W][X/keyStep][Y/keyStep][Z]));}
00252     inline void set(int X, int Y, int Z, int value){
00253       CkAssert(X<keyXmax);
00254       CkAssert(Y<keyYmax);
00255       CkAssert(Z<keyZmax);
00256       CkAssert(numPes>value);
00257       Map[X][Y][Z]=value;
00258     }
00259     int getCentroid(int torusMap);
00260     void dump()
00261       {
00262           for(int x=0;x<keyXmax;x++)
00263             for(int y=0;y<keyYmax;y++)
00264               for(int z=0;z<keyZmax;z++)
00265                 CkPrintf("%d %d %d %d \n",x,y,z, get(x,y,z));
00266       }
00267     IntMap3(){keyXmax=0; keyYmax=0, keyZmax=0;  Map=NULL;}
00268 };
00269 
00270 class IntMap2on2 {
00271  private:
00272   int **Map;
00273   int keyXmax;
00274   int keyYmax;
00275  public:
00276     IntMap2on2(){keyXmax=0; keyYmax=0; Map=NULL;}
00277     ~IntMap2on2(){
00278       if(Map!=NULL)
00279         {
00280           for(int x=0;x<keyXmax;x++)
00281             delete [] Map[x];
00282           delete [] Map;
00283           Map=NULL;
00284         }
00285     }
00286     IntMap2on2(int keyX, int keyY): keyXmax(keyX), keyYmax(keyY) 
00287       {
00288         Map= new int*[keyXmax];
00289         for(int x=0;x<keyXmax;x++)
00290           {
00291             Map[x]= new int[keyYmax];
00292             memset(Map[x],-1,keyYmax*sizeof(int));
00293           }
00294         
00295       }
00296     void buildMap(int keyX=1, int keyY=1)
00297       {
00298         CkAssert(keyX>0);
00299         CkAssert(keyY>0);
00300         keyXmax=keyX;
00301         keyYmax=keyY;
00302         Map= new int*[keyXmax];
00303         for(int x=0;x<keyXmax;x++)
00304           {
00305             Map[x]= new int[keyYmax];
00306             memset(Map[x],-1,keyYmax*sizeof(int));
00307           }
00308         
00309       }
00310     void pup(PUP::er &p)
00311       {
00312           p|keyXmax;
00313           p|keyYmax;
00314           if(p.isUnpacking())
00315             Map=new int*[keyXmax];
00316           for(int x=0;x<keyXmax;x++)
00317             {
00318               if(p.isUnpacking())
00319                 Map[x]= new int[keyYmax];
00320               PUParray(p,Map[x], keyYmax);
00321             }
00322       }
00323     inline int getXmax(){return(keyXmax);}
00324     inline int getYmax(){return(keyYmax);}
00325     int getCentroid(int torusMap);
00326     inline int get(int X, int Y)  {
00327       /*
00328       CkAssert(X<keyXmax);
00329       CkAssert(Y<keyYmax);
00330       */
00331       return(Map[X][Y]);
00332     }
00333     //    inline &int put(int X, int Y){&(Map[X][Y]);}
00334     inline void set(int X, int Y, int value){
00335       CkAssert(numPes>value);
00336       CkAssert(X<keyXmax);
00337       CkAssert(Y<keyYmax);
00338       Map[X][Y]=value;
00339     }
00340     void dump()
00341       {
00342           for(int x=0;x<keyXmax;x++)
00343             for(int y=0;y<keyYmax;y++)
00344                 CkPrintf("%d %d %d \n",x,y, get(x,y));
00345       }
00346 };
00347 
00348 
00349 class IntMap2on1 {
00350  private:
00351   int *Map;
00352   int keyXmax;
00353   int keyYmax;
00354   int keymax;
00355  public:
00356     ~IntMap2on1(){
00357       if(keymax>0 && Map!=NULL)
00358         {
00359           delete [] Map;
00360           Map=NULL;
00361         }
00362     }
00363     IntMap2on1(){keyXmax=0; keyYmax=0; keymax=0;Map=NULL;}
00364     IntMap2on1(int keyX, int keyY): keyXmax(keyX), keyYmax(keyY) 
00365       {
00366         CkAssert(keyXmax>0);
00367         CkAssert(keyYmax>0);
00368         CkAssert(keyXmax>keyYmax);
00369         keymax=keyXmax*keyYmax;
00370         Map= new int[keymax];
00371       }
00372     void buildMap(int keyX=1, int keyY=1)
00373       {
00374         CkAssert(keyX>0);
00375         CkAssert(keyY>0);
00376         keyXmax=keyX;
00377         keyYmax=keyY;
00378         CkAssert(keyXmax>keyYmax);
00379         keymax=keyXmax*keyYmax;
00380         Map= new int[keyXmax];
00381       }
00382     void pup(PUP::er &p)
00383       {
00384           p|keyXmax;
00385           p|keyYmax;
00386           p|keymax;
00387           if(p.isUnpacking())
00388             Map=new int[keymax];
00389           PUParray(p,Map,keymax);
00390 
00391       }
00392     inline int getXmax(){return(keyXmax);}
00393     inline int getYmax(){return(keyYmax);}
00394     inline int getmax(){return(keymax);}
00395     inline int get(int X, int Y)  {
00396       /*
00397       CkAssert(X<keyXmax);
00398       CkAssert(Y<keyYmax);
00399       */
00400       return(Map[Y*keyXmax +X]);
00401     }
00402     //    inline &int put(int X, int Y){&(Map[X][Y]);}
00403     inline void set(int X, int Y, int value){
00404       CkAssert(numPes>value);
00405       CkAssert(X<keyXmax);
00406       CkAssert(Y<keyYmax);
00407       Map[Y*keyXmax +X]=value;
00408     }
00409     void dump()
00410       {
00411           for(int x=0;x<keyXmax;x++)
00412             for(int y=0;y<keyYmax;y++)
00413                 CkPrintf("%d %d %d \n",x,y, get(x,y));
00414       }
00415 };
00416 
00417 
00418 #endif
00419 

Generated on Thu Dec 6 18:25:31 2007 for leanCP by  doxygen 1.5.3