SkelGIS
3.0
|
00001 /*! \file pmap_nodes_impl.hpp 00002 * \brief Definitions of the object PMap_Nodes_impl implementation to map data to the nodes of a DDAG. Three template specializations are available. 00003 */ 00004 #ifndef DPMAP_NODES_IMPL_H 00005 #define DPMAP_NODES_IMPL_H 00006 00007 #include "ddag.hpp" 00008 #include "../../iterators/DDAG/iterator.hpp" 00009 #include "../../util/communications.hpp" 00010 #include<vector> 00011 00012 namespace skelgis{ 00013 00014 //------------------------------------------------------------------------------- 00015 //! base template class of Property map on nodes 00016 /*! 00017 This template class defines the base PMap_Nodes_impl 00018 \tparam DD is the type of the DDAG 00019 \tparam T is the type of data in the property map 00020 \tparam overlap is the overlap size needed to compute the data 00021 00022 for a standard type T (two first specializations) the overlap can be 0 or 1 and the size is the default one = 1 00023 for a pointer type T (two second specializations) the overlap can be any value and the size is > 1 because a table is gonna be mapped to each node 00024 */ 00025 //------------------------------------------------------------------------------- 00026 template<class DD,class T, int overlap> struct DPMap_Nodes_impl; 00027 //------------------------------------------------------------------------------- 00028 //! first specialization of DPMap_Nodes_impl 00029 /*! 00030 \tparam DD is the type of the DDAG 00031 \tparam T is the type of data in the property map 00032 00033 The type T is a simple type in this case as float, double, int etc. 00034 The overlap is specialized to the value 1 00035 */ 00036 //------------------------------------------------------------------------------- 00037 template<class DD,class T> struct DPMap_Nodes_impl<DD,T,1> 00038 //------------------------------------------------------------------------------- 00039 { 00040 protected : 00041 /*!< ddag is the pointer to the ddag data structure the property is mapped on */ 00042 DDAG_impl<DD::nod,DD::edg> * ddag; 00043 /*!< object to make MPI communications */ 00044 Communications<T> * comm; 00045 00046 //------------------------------------------------------------------------------- 00047 //! to read input initialize file 00048 /*! 00049 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00050 */ 00051 //------------------------------------------------------------------------------- 00052 void read(const char * file) 00053 //------------------------------------------------------------------------------- 00054 { 00055 //parallel read to write CF DMatrix 00056 FILE *pmapfile=fopen(file,"r"); 00057 00058 T any=0; 00059 for(unsigned int i=0;i<dim_node+dim_tor;i++) 00060 { 00061 for(unsigned int j=0;j<ddag->getIndexNode(i);j++) 00062 int read = fscanf(pmapfile,"%lf", &any); 00063 int read = fscanf(pmapfile,"%lf", &data[i]); 00064 int seek = fseek(pmapfile,0,SEEK_SET); 00065 } 00066 00067 fclose(pmapfile); 00068 } 00069 //------------------------------------------------------------------------------- 00070 //! init function with values in file 00071 /*! 00072 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00073 */ 00074 //------------------------------------------------------------------------------- 00075 void init(const char * file) 00076 //------------------------------------------------------------------------------- 00077 { 00078 dim_node = ddag->getDimNode(); 00079 dim_tor = ddag->getDimTorIn()+ddag->getDimTorOut(); 00080 data = new T[dim_node+dim_tor](); 00081 read(file); 00082 } 00083 //------------------------------------------------------------------------------- 00084 //! init function with default value 00085 /*! 00086 \param val is the value to intiate nodes to 00087 */ 00088 //------------------------------------------------------------------------------- 00089 void init(T val) 00090 //------------------------------------------------------------------------------- 00091 { 00092 dim_node = ddag->getDimNode(); 00093 dim_tor = ddag->getDimTorIn()+ddag->getDimTorOut(); 00094 data = new T[dim_node+dim_tor](); 00095 for(unsigned int i=0;i<dim_node+dim_tor;i++) 00096 { 00097 data[i] = val; 00098 } 00099 } 00100 //------------------------------------------------------------------------------- 00101 //! init function for MPI communications 00102 /*! 00103 */ 00104 //------------------------------------------------------------------------------- 00105 void init_comm() 00106 { 00107 //init the communication object 00108 comm = new Communications<T>(); 00109 } 00110 //------------------------------------------------------------------------------- 00111 00112 public: 00113 /*!< dim_node is the number of local nodes */ 00114 unsigned int dim_node; 00115 /*!< dim_tor is the number of additionnal nodes to receive */ 00116 unsigned int dim_tor; 00117 /*!< data mapped on nodes of the ddag */ 00118 T * data; 00119 00120 //------------------------------------------------------------------------------- 00121 //! constructor 00122 /*! 00123 \param dag is the DDAG the property is going to mapped 00124 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00125 */ 00126 //------------------------------------------------------------------------------- 00127 DPMap_Nodes_impl(DD &dag, const char * file) 00128 //------------------------------------------------------------------------------- 00129 { 00130 ddag = dag.getDDAG_impl(); 00131 //communication initialization 00132 init_comm(); 00133 //construction of data and read the file 00134 init(file); 00135 } 00136 //------------------------------------------------------------------------------- 00137 //! constructor of DPMap_Nodes 00138 /*! 00139 \param dag is the DDAG object associated to this map 00140 \param val is the default value of nodes for the map 00141 */ 00142 //------------------------------------------------------------------------------- 00143 DPMap_Nodes_impl(DD &dag, T val) 00144 //------------------------------------------------------------------------------- 00145 { 00146 ddag = dag.getDDAG_impl(); 00147 //communication initialization 00148 init_comm(); 00149 //construction of data and fill with val 00150 init(val); 00151 } 00152 //------------------------------------------------------------------------------- 00153 //! destructor of DPMap_Nodes 00154 /*! 00155 */ 00156 //------------------------------------------------------------------------------- 00157 ~DPMap_Nodes_impl() 00158 //------------------------------------------------------------------------------- 00159 { 00160 delete [] data; 00161 delete comm; 00162 } 00163 //------------------------------------------------------------------------------- 00164 //! to get the begin iterator on roots nodes 00165 /*! 00166 \return the begin iterator on roots nodes 00167 */ 00168 //------------------------------------------------------------------------------- 00169 inline iterator_dag begin_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());} 00170 //------------------------------------------------------------------------------- 00171 //! to get the end iterator on roots nodes 00172 /*! 00173 \return the end iterator on roots nodes 00174 */ 00175 //------------------------------------------------------------------------------- 00176 inline iterator_dag end_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());} 00177 //------------------------------------------------------------------------------- 00178 //! to get the begin iterator on leafs nodes 00179 /*! 00180 \return the begin iterator on leafs nodes 00181 */ 00182 //------------------------------------------------------------------------------- 00183 inline iterator_dag begin_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00184 //------------------------------------------------------------------------------- 00185 //! to get the end iterator on leafs nodes 00186 /*! 00187 \return the end iterator on leafs nodes 00188 */ 00189 //------------------------------------------------------------------------------- 00190 inline iterator_dag end_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());} 00191 //------------------------------------------------------------------------------- 00192 //! to get the begin iterator on nodes with communication with other processors 00193 /*! 00194 \return the begin iterator on communication nodes 00195 */ 00196 //------------------------------------------------------------------------------- 00197 inline iterator_dag begin_comm(){return iterator_dag(ddag->getDimLoc());} 00198 //------------------------------------------------------------------------------- 00199 //! to get the end iterator on nodes with communication with other processors 00200 /*! 00201 \return the end iterator on communication nodes 00202 */ 00203 //------------------------------------------------------------------------------- 00204 inline iterator_dag end_comm(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00205 //------------------------------------------------------------------------------- 00206 //! to get the begin iterator on nodes without communication with other processors 00207 /*! 00208 \return the begin iterator on local nodes 00209 */ 00210 //------------------------------------------------------------------------------- 00211 inline iterator_dag begin_loc(){return iterator_dag(0);} 00212 //------------------------------------------------------------------------------- 00213 //! to get the end iterator on nodes without communication with other processors 00214 /*! 00215 \return the end iterator on local nodes 00216 */ 00217 //------------------------------------------------------------------------------- 00218 inline iterator_dag end_loc(){return iterator_dag(ddag->getDimLoc());} 00219 //------------------------------------------------------------------------------- 00220 //! to get the begin iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes) 00221 /*! 00222 \return the begin iterator on inside nodes 00223 */ 00224 //------------------------------------------------------------------------------- 00225 inline iterator_dag begin_in(){return iterator_dag(0);} 00226 //------------------------------------------------------------------------------- 00227 //! to get the end iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes) 00228 /*! 00229 \return the end iterator on inside nodes 00230 */ 00231 //------------------------------------------------------------------------------- 00232 inline iterator_dag end_in(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00233 //------------------------------------------------------------------------------- 00234 //! to get the begin iterator on all nodes (roots, leafs, comm and loc) 00235 /*! 00236 \return the begin iterator on all nodes 00237 */ 00238 //------------------------------------------------------------------------------- 00239 inline iterator_dag begin_all(){return iterator_dag(0);} 00240 //------------------------------------------------------------------------------- 00241 //! to get the end iterator on all nodes (roots, leafs, comm and loc) 00242 /*! 00243 \return the end iterator on all nodes 00244 */ 00245 //------------------------------------------------------------------------------- 00246 inline iterator_dag end_all(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());} 00247 //------------------------------------------------------------------------------- 00248 //! to get a vector of iterator on input edges for the node it 00249 /*! 00250 \param it is the iterator on the node to get input edges 00251 \return a vector of iterator 00252 */ 00253 //------------------------------------------------------------------------------- 00254 inline std::vector<iterator_dag> getInEdges(iterator_dag it){return ddag->getInEdges(it._rank);} 00255 //------------------------------------------------------------------------------- 00256 //! to get a vector of iterator on output edges for the node it 00257 /*! 00258 \param it is the iterator on the node to get output edges 00259 \return a vector of iterator 00260 */ 00261 //------------------------------------------------------------------------------- 00262 inline std::vector<iterator_dag> getOutEdges(iterator_dag it){return ddag->getOutEdges(it._rank);} 00263 //------------------------------------------------------------------------------- 00264 //! to get a vector of iterator on input nodes for the node it 00265 /*! 00266 \param it is the iterator on the node to get input nodes 00267 \return a vector of iterator 00268 */ 00269 //------------------------------------------------------------------------------- 00270 inline std::vector<iterator_dag> getInNodes(iterator_dag it){return ddag->getInNodes(it._rank);} 00271 //------------------------------------------------------------------------------- 00272 //! to get a vector of iterator on output nodes for the node it 00273 /*! 00274 \param it is the iterator on the node to get output nodes 00275 \return a vector of iterator 00276 */ 00277 //------------------------------------------------------------------------------- 00278 inline std::vector<iterator_dag> getOutNodes(iterator_dag it){return ddag->getOutNodes(it._rank);} 00279 //------------------------------------------------------------------------------- 00280 //! start the communication process for the dpmap_nodes property 00281 /*! 00282 prepare data to send 00283 launch non blocking MPI communications 00284 */ 00285 //------------------------------------------------------------------------------- 00286 void start_communications() 00287 //------------------------------------------------------------------------------- 00288 { 00289 for(int j=0;j<Mpi_::mpi_nb;j++) 00290 { 00291 //prepare data to send 00292 unsigned int nb_toSend = ddag->getNbNodesToSend(j); 00293 if(nb_toSend>0) 00294 { 00295 T * toSend = (T*)calloc(nb_toSend,sizeof(T)); 00296 unsigned int * indexes = ddag->getNodesToSend(j); 00297 for(unsigned int i=0;i<nb_toSend;i++) 00298 toSend[i] = data[indexes[i]]; 00299 00300 comm->ISend(toSend, nb_toSend, j); 00301 00302 free(indexes); 00303 free(toSend); 00304 } 00305 //prepare data to receive 00306 unsigned int nb_toRecv = ddag->getNbNodesToRecv(j); 00307 if(nb_toRecv>0) 00308 comm->IRecv(nb_toRecv, j); 00309 00310 } 00311 } 00312 //------------------------------------------------------------------------------- 00313 //! end the communication process for the dpmap_nodes property 00314 /*! 00315 wait for the end of non-blocking communications 00316 put received values in the dpmap_nodes property 00317 */ 00318 //------------------------------------------------------------------------------- 00319 void end_communications() 00320 //------------------------------------------------------------------------------- 00321 { 00322 for(int j=0;j<Mpi_::mpi_nb;j++) 00323 { 00324 //prepare data to send 00325 unsigned int nb_toSend = ddag->getNbNodesToSend(j); 00326 if(nb_toSend>0) 00327 comm->Wait_s(j); 00328 unsigned int nb_toRecv = ddag->getNbNodesToRecv(j); 00329 if(nb_toRecv>0) 00330 { 00331 T * toRecv = (T*)calloc(nb_toRecv,sizeof(T)); 00332 comm->Wait_r(toRecv,j,nb_toRecv); 00333 unsigned int * indexes = ddag->getNodesToRecv(j); 00334 //change values in data 00335 for(int k=0;k<nb_toRecv;k++) 00336 data[indexes[k]] = toRecv[k]; 00337 free(indexes); 00338 free(toRecv); 00339 } 00340 } 00341 } 00342 //------------------------------------------------------------------------------- 00343 }; 00344 //------------------------------------------------------------------------------- 00345 //! second specialization of DPMap_Nodes_impl 00346 /*! 00347 \tparam DD is the type of the DDAG 00348 \tparam T is the type of data in the property map 00349 00350 The type T is a simple type in this case as float, double, int etc. 00351 The overlap is specialized to the value 0 00352 */ 00353 //------------------------------------------------------------------------------- 00354 template<class DD, class T> struct DPMap_Nodes_impl<DD,T,0> 00355 { 00356 protected : 00357 /*!< ddag is the pointer to the ddag data structure the property is mapped on */ 00358 DDAG_impl<DD::nod,DD::edg> * ddag; 00359 00360 //------------------------------------------------------------------------------- 00361 //! to read input initialize file 00362 /*! 00363 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00364 */ 00365 //------------------------------------------------------------------------------- 00366 void read(const char * file) 00367 //------------------------------------------------------------------------------- 00368 { 00369 //parallel read to write CF DMatrix 00370 FILE *pmapfile=fopen(file,"r"); 00371 00372 T any=0; 00373 for(unsigned int i=0;i<dim_node;i++) 00374 { 00375 for(unsigned int j=0;j<ddag->getIndexNode(i);j++) 00376 int read = fscanf(pmapfile,"%lf", &any); 00377 int read = fscanf(pmapfile,"%lf", &data[i]); 00378 int seek = fseek(pmapfile,0,SEEK_SET); 00379 } 00380 00381 fclose(pmapfile); 00382 } 00383 //------------------------------------------------------------------------------- 00384 //! init function with values in file 00385 /*! 00386 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00387 */ 00388 //------------------------------------------------------------------------------- 00389 void init(const char * file) 00390 //------------------------------------------------------------------------------- 00391 { 00392 dim_node = ddag->getDimNode(); 00393 data = new T[dim_node](); 00394 read(file); 00395 } 00396 //------------------------------------------------------------------------------- 00397 //! init function with default value 00398 /*! 00399 \param val is the value to intiate nodes to 00400 */ 00401 //------------------------------------------------------------------------------- 00402 void init(T val) 00403 //------------------------------------------------------------------------------- 00404 { 00405 dim_node = ddag->getDimNode(); 00406 data = new T[dim_node](); 00407 for(unsigned int i=0;i<dim_node;i++) 00408 { 00409 data[i] = val; 00410 } 00411 } 00412 00413 public: 00414 /*!< dim_node is the number of local nodes */ 00415 unsigned int dim_node; 00416 /*!< data mapped on nodes of the ddag */ 00417 T * data; 00418 00419 //------------------------------------------------------------------------------- 00420 //! constructor 00421 /*! 00422 \param dag is the DDAG the property is going to mapped 00423 \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file) 00424 */ 00425 //------------------------------------------------------------------------------- 00426 DPMap_Nodes_impl(DD &dag, const char * file) 00427 //------------------------------------------------------------------------------- 00428 { 00429 ddag = dag.getDDAG_impl(); 00430 //construction of data and read the file 00431 init(file); 00432 } 00433 //------------------------------------------------------------------------------- 00434 //! constructor of DPMap_Nodes 00435 /*! 00436 \param dag is the DDAG object associated to this map 00437 \param val is the default value of nodes for the map 00438 */ 00439 //------------------------------------------------------------------------------- 00440 DPMap_Nodes_impl(DD &dag, T val) 00441 //------------------------------------------------------------------------------- 00442 { 00443 ddag = dag.getDDAG_impl(); 00444 //construction of data and fill with val 00445 init(val); 00446 } 00447 //------------------------------------------------------------------------------- 00448 //! destructor of DPMap_Nodes 00449 /*! 00450 */ 00451 //------------------------------------------------------------------------------- 00452 ~DPMap_Nodes_impl() 00453 //------------------------------------------------------------------------------- 00454 { 00455 delete [] data; 00456 } 00457 //------------------------------------------------------------------------------- 00458 //! to get the begin iterator on roots nodes 00459 /*! 00460 \return the begin iterator on roots nodes 00461 */ 00462 //------------------------------------------------------------------------------- 00463 inline iterator_dag begin_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());} 00464 //------------------------------------------------------------------------------- 00465 //! to get the end iterator on roots nodes 00466 /*! 00467 \return the end iterator on roots nodes 00468 */ 00469 //------------------------------------------------------------------------------- 00470 inline iterator_dag end_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());} 00471 //------------------------------------------------------------------------------- 00472 //! to get the begin iterator on leafs nodes 00473 /*! 00474 \return the begin iterator on leafs nodes 00475 */ 00476 //------------------------------------------------------------------------------- 00477 inline iterator_dag begin_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00478 //------------------------------------------------------------------------------- 00479 //! to get the end iterator on leafs nodes 00480 /*! 00481 \return the end iterator on leafs nodes 00482 */ 00483 //------------------------------------------------------------------------------- 00484 inline iterator_dag end_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());} 00485 //------------------------------------------------------------------------------- 00486 //! to get the begin iterator on nodes with communication with other processors 00487 /*! 00488 \return the begin iterator on communication nodes 00489 */ 00490 //------------------------------------------------------------------------------- 00491 inline iterator_dag begin_comm(){return iterator_dag(ddag->getDimLoc());} 00492 //------------------------------------------------------------------------------- 00493 //! to get the end iterator on nodes with communication with other processors 00494 /*! 00495 \return the end iterator on communication nodes 00496 */ 00497 //------------------------------------------------------------------------------- 00498 inline iterator_dag end_comm(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00499 //------------------------------------------------------------------------------- 00500 //! to get the begin iterator on nodes without communication with other processors 00501 /*! 00502 \return the begin iterator on local nodes 00503 */ 00504 //------------------------------------------------------------------------------- 00505 inline iterator_dag begin_loc(){return iterator_dag(0);} 00506 //------------------------------------------------------------------------------- 00507 //! to get the end iterator on nodes without communication with other processors 00508 /*! 00509 \return the end iterator on local nodes 00510 */ 00511 //------------------------------------------------------------------------------- 00512 inline iterator_dag end_loc(){return iterator_dag(ddag->getDimLoc());} 00513 //------------------------------------------------------------------------------- 00514 //! to get the begin iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes) 00515 /*! 00516 \return the begin iterator on inside nodes 00517 */ 00518 //------------------------------------------------------------------------------- 00519 inline iterator_dag begin_in(){return iterator_dag(0);} 00520 //------------------------------------------------------------------------------- 00521 //! to get the end iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes) 00522 /*! 00523 \return the end iterator on inside nodes 00524 */ 00525 //------------------------------------------------------------------------------- 00526 inline iterator_dag end_in(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());} 00527 //------------------------------------------------------------------------------- 00528 //! to get a vector of iterator on input edges for the node it 00529 /*! 00530 \param it is the iterator on the node to get input edges 00531 \return a vector of iterator 00532 */ 00533 //------------------------------------------------------------------------------- 00534 inline std::vector<iterator_dag> getInEdges(iterator_dag it){return ddag->getInEdges(it._rank);} 00535 //------------------------------------------------------------------------------- 00536 //! to get a vector of iterator on output edges for the node it 00537 /*! 00538 \param it is the iterator on the node to get output edges 00539 \return a vector of iterator 00540 */ 00541 //------------------------------------------------------------------------------- 00542 inline std::vector<iterator_dag> getOutEdges(iterator_dag it){return ddag->getOutEdges(it._rank);} 00543 //------------------------------------------------------------------------------- 00544 //! to get a vector of iterator on input nodes for the node it 00545 /*! 00546 \param it is the iterator on the node to get input nodes 00547 \return a vector of iterator 00548 */ 00549 //------------------------------------------------------------------------------- 00550 inline std::vector<iterator_dag> getInNodes(iterator_dag it){return ddag->getInNodes(it._rank);} 00551 //------------------------------------------------------------------------------- 00552 //! to get a vector of iterator on output nodes for the node it 00553 /*! 00554 \param it is the iterator on the node to get output nodes 00555 \return a vector of iterator 00556 */ 00557 //------------------------------------------------------------------------------- 00558 inline std::vector<iterator_dag> getOutNodes(iterator_dag it){return ddag->getOutNodes(it._rank);} 00559 //------------------------------------------------------------------------------- 00560 //! start the communication process for the dpmap_nodes property 00561 /*! 00562 prepare data to send 00563 launch non blocking MPI communications 00564 */ 00565 //------------------------------------------------------------------------------- 00566 inline void start_communications(){} 00567 //------------------------------------------------------------------------------- 00568 //! end the communication process for the dpmap_nodes property 00569 /*! 00570 wait for the end of non-blocking communications 00571 put received values in the dpmap_nodes property 00572 */ 00573 //------------------------------------------------------------------------------- 00574 inline void end_communications(){} 00575 //------------------------------------------------------------------------------- 00576 00577 }; 00578 //------------------------------------------------------------------------------- 00579 //! third specialization of DPMap_Nodes_impl 00580 /*! 00581 \tparam DD is the type of the DDAG 00582 \tparam T is the type of data in the property map 00583 \tapram overlap is the overlap size needed to compute the data 00584 00585 The type T is specialized with a specific pointer type in this case as float*, double*, int* etc. 00586 The overlap is not specialized and is [0,...,size] 00587 The size is not specialized, it is the number of elements in the pointer table to map 00588 */ 00589 //------------------------------------------------------------------------------- 00590 template<class DD, class T,int overlap> struct DPMap_Nodes_impl<DD,T*,overlap> 00591 { 00592 protected : 00593 00594 public: 00595 DPMap_Nodes_impl(){}; 00596 ~DPMap_Nodes_impl(){}; 00597 }; 00598 //------------------------------------------------------------------------------- 00599 //! fourth specialization of DPMap_Nodes_impl 00600 /*! 00601 \tparam DD is the type of the DDAG 00602 \tparam T is the type of data in the property map 00603 \tapram overlap is the overlap size needed to compute the data 00604 00605 The type T is specialized with a specific pointer type in this case as float*, double*, int* etc. 00606 The overlap is specialized to the value 0 00607 The size is not specialized, it is the number of elements in the pointer table to map 00608 */ 00609 //------------------------------------------------------------------------------- 00610 template<class DD, class T> struct DPMap_Nodes_impl<DD,T*,0> 00611 { 00612 protected : 00613 00614 public: 00615 DPMap_Nodes_impl(){}; 00616 ~DPMap_Nodes_impl(){}; 00617 }; 00618 00619 }; 00620 00621 00622 #endif