00001 #ifndef PMST_CLUSTER_MAKER_H 00002 #define PMST_CLUSTER_MAKER_H 00003 00004 //-------------------------------------------------------------------- 00005 // 00006 // This file is part of PEACE. 00007 // 00008 // PEACE is free software: you can redistribute it and/or modify it 00009 // under the terms of the GNU General Public License as published by 00010 // the Free Software Foundation, either version 3 of the License, or 00011 // (at your option) any later version. 00012 // 00013 // PEACE is distributed in the hope that it will be useful, but 00014 // WITHOUT ANY WARRANTY; without even the implied warranty of 00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 // General Public License for more details. 00017 // 00018 // You should have received a copy of the GNU General Public License 00019 // along with PEACE. If not, see <http://www.gnu.org/licenses/>. 00020 // 00021 // Miami University makes no representations or warranties about the 00022 // suitability of the software, either express or implied, including 00023 // but not limited to the implied warranties of merchantability, 00024 // fitness for a particular purpose, or non-infringement. Miami 00025 // University shall not be liable for any damages suffered by licensee 00026 // as a result of using, result of using, modifying or distributing 00027 // this software or its derivatives. 00028 // 00029 // By using or copying this Software, Licensee agrees to abide by the 00030 // intellectual property laws, and all other applicable laws of the 00031 // U.S., and the terms of GNU General Public License (version 3). 00032 // 00033 // Authors: Dhananjai M. Rao raodm@muohio.edu 00034 // 00035 //--------------------------------------------------------------------- 00036 00037 #include "ClusterMaker.h" 00038 #include "MSTHeapCache.h" 00039 #include "MST.h" 00040 #include "MSTCluster.h" 00041 #include "PartitionData.h" 00042 00043 /** A Minimum Spanning Tree (MST) based parallel cluster maker. 00044 00045 This class encapsulates the core functionality needed to construct 00046 a MST-based EST clusters in a parallel/distributed manner using 00047 the Message Passing Interface (MPI) library. This class includes 00048 functionality for both the Manager (MPI Rank == 0) and Worker (MPI 00049 Rank > 0) processes. Necessary functionality to distinguish and 00050 operate either as Manager or Worker is already built into the 00051 class. This class uses the MSTCache and MSTCluster classes to 00052 help in performing the various activities. Refer to the 00053 documentation on the various method for detailed description on 00054 their functionality and usage. 00055 */ 00056 class PMSTClusterMaker : public ClusterMaker { 00057 friend class ClusterMakerFactory; 00058 public: 00059 /** The set of tags exchanged between various processes. 00060 00061 This enum provides meanigful names to the various tags 00062 (integers) exchanged between the master and worker processes 00063 participating in the construction of a MST in a 00064 parallel/distributed manner. 00065 */ 00066 enum MessageTags{REPOPULATE_REQUEST, COMPUTE_SIMILARITY_REQUEST, 00067 SIMILARITY_LIST, SIMILARITY_COMPUTATION_DONE, 00068 COMPUTE_MAX_SIMILARITY_REQUEST, MAX_SIMILARITY_RESPONSE, 00069 ADD_EST, TRANSITIVITY_LIST, COMPUTE_TOTAL_ANALYSIS_COUNT}; 00070 00071 /** The destructor. 00072 00073 The destructor frees up all any dynamic memory allocated by 00074 this object for its operations. 00075 */ 00076 virtual ~PMSTClusterMaker(); 00077 00078 /** Display valid command line arguments for this cluster maker. 00079 00080 This method must be used to display all valid command line 00081 options that are supported by this cluster maker (and its base 00082 classes). 00083 00084 \note This method calls the base class's showArguments first. 00085 00086 \param[out] os The output stream to which the valid command 00087 line arguments must be written. 00088 */ 00089 virtual void showArguments(std::ostream& os); 00090 00091 /** Process command line arguments. 00092 00093 This method is used to process command line arguments specific 00094 to this cluster maker. This method is typically used from the 00095 main method just after the cluster maker has been 00096 instantiated. This method consumes all valid command line 00097 arguments. If the command line arguments were valid and 00098 successfully processed, then this method returns \c true. 00099 00100 \note This method consumes its custom command line arguments 00101 first and then call's the base class's parseArguments() method. 00102 00103 \param[in,out] argc The number of command line arguments to be 00104 processed. 00105 00106 \param[in,out] argv The array of command line arguments. 00107 00108 \return This method returns \c true if the command line 00109 arguments were successfully processed. Otherwise this method 00110 returns \c false. 00111 */ 00112 virtual bool parseArguments(int& argc, char **argv); 00113 00114 /** Method to begin clustering. 00115 00116 This method must be used to create clusters based on a given 00117 EST analysis method. This method performs the following 00118 tasks: 00119 00120 */ 00121 virtual int makeClusters(); 00122 00123 /** Method to display performance statistics. 00124 00125 This method overrides the empty implementation in the base 00126 class to display statistics on cache usage and MPI calls for 00127 tracking and reporting the performance and behavior of this 00128 class. 00129 00130 \param[out] os The output stream to which the statistics must 00131 be written. 00132 */ 00133 virtual void displayStats(std::ostream& os); 00134 00135 protected: 00136 /** Variable to indicate per-EST similarity cache size. 00137 00138 This variable is used to indicate the number of similarity 00139 metrics that must be cached for a given EST. This value is 00140 initialized to 128. The value is changed by the 00141 parseArguments() method if the user has specified an option to 00142 override the default. 00143 */ 00144 static int cacheSize; 00145 00146 /** Command line option to set percentile value to compute 00147 clustering threshold. 00148 00149 <p> This variable is used to indicate the percentile value 00150 that must be used to determine the threshold for clustering. 00151 This value is initialized to 1.0. This value is ultimately 00152 used in the MSTCluster::calculateThreshold() method to compute 00153 the threshold using the formula: </p> 00154 00155 <i> threshold = mean + (stDev * percentile); </i> 00156 00157 <p> The value is changed by the parseArguments() method if the 00158 user has specified the --percentile option to override the 00159 default. </p> 00160 */ 00161 static double percentile; 00162 00163 /** Variable to indicate if strict ordering of worker Ranks must 00164 be followed. 00165 00166 <p> If this member variable is \c true, then messages 00167 dispatched by workers and the manager are always read in a 00168 fixed order of increasing ranks. That is, messages from rank 00169 0 (zero) are processed first, then messages from process with 00170 rank 1, so on and so forth. On the other hand if this 00171 variable is \c false, then messages are processed in the order 00172 they are received. </p> 00173 00174 <p> The strictOrder approach guarantees consistent results for 00175 each run (involving the same number of processes) and the 00176 resulting MSTs are alll identical. However, a process may 00177 have to wait (idle wasting time) until a message from the 00178 appropriate process (with a given rank) is actually received. 00179 This may slow down the overall computational rate, 00180 particularly when the work load get's skewed toward the end of 00181 MST construction.</p> 00182 00183 <p> On the other hand, if strictOrder is relaxed (by setting 00184 strictOrder variable to \c false) then messsages are processed 00185 as soon as they are received, in the order in which messages 00186 arrive. This approach minimizes wait times. However, the MST 00187 constructed between multiple runs may not be identical as 00188 equidistant (or nodes with same similarity metrics) nodes may 00189 be processed in different order. Reordering of equidistant 00190 nodes occur because in this mode a total order is not enfored 00191 and only a partial order of nodes is performed.</p> 00192 00193 <p> By default strictOrder is enabled. However, the value can 00194 be changed by the user through command line arguments. The 00195 change of value occurs in the parseArguments() method if the 00196 user has specified an option to override the default. 00197 */ 00198 static bool strictOrder; 00199 00200 /** Command line option to avoid the clustering phase. 00201 00202 If this member variable is \c true, then this class only 00203 generates MST information and does not do clustering. By 00204 default this variable is initialized to \c false. However, 00205 the value can be changed by the user through command line 00206 arguments. The change of value occurs in the parseArguments() 00207 method if the user has specified an option to override the 00208 default. 00209 */ 00210 static bool dontCluster; 00211 00212 /** Command line option to print a pretty cluster tree. 00213 00214 If this member variable is \c true, then this class prints a 00215 pretty ASCII tree with the cluster information By default this 00216 variable is initialized to \c false. However, the value can 00217 be changed by the user through command line argument 00218 (--pretty-print). The change of value occurs in the 00219 parseArguments() method if the user has specified an option to 00220 override the default. 00221 */ 00222 static bool prettyPrint; 00223 00224 /** Variable to indicate if MST information must be simply read 00225 from a given file. 00226 00227 This member variable is used to hold the name of the file 00228 (with full path) from where MST information must be read. 00229 This instance variable is initialized to NULL. However, if 00230 the input MST file is specified then MST building is skipped 00231 and MST data read from the file is used for further processing. 00232 */ 00233 static char* inputMSTFile; 00234 00235 /** Variable to indicate if MST information must be written to a 00236 given file. 00237 00238 This member variable is used to hold the name of the file 00239 (with full path) to which MST information must be written. 00240 This instance variable is initialized to NULL. However, if 00241 the output MST file is specified then MST data built by this 00242 program is written to the specified file. 00243 */ 00244 static char* outputMSTFile; 00245 00246 /** Command line option to suppress cache repopulation. 00247 00248 <p> If this member variable is \c true, then this class does 00249 not repopulate caches once a EST cache becomes empty. By 00250 default this variable is initialized to \c false. However, 00251 the value can be changed by the user through command line 00252 argument (--no-cache-repop). The change of value occurs in 00253 the parseArguments() method if the user has specified an 00254 option to override the default.</p> 00255 00256 <p> If this parameter is not specified then the MSTCache will 00257 request lists to be repopulated when needed. Repopulating 00258 lists guarantees that ultimately a MST will be developed. If 00259 repopulation is suppressed via this parameter then the 00260 resulting spanning tree may not be a MST; however computation 00261 time decreases. </p> 00262 */ 00263 static bool noCacheRepop; 00264 00265 /** Command line option to enable maximum use of precomputed 00266 scores for building MST. 00267 00268 <p>If this member variable is set to a value other than -1, 00269 then the MSTClusterMaker will try to use all the ESTs that 00270 have a metric better than the value specified for 00271 maxUse. Maximally using good metrics will ultimately reduce 00272 the total number of analysis that need to be performed, 00273 thereby reducing overall time for clustering.</p> 00274 */ 00275 static int maxUse; 00276 00277 /** Command line option to set the type of cache to be used by 00278 PEACE. 00279 00280 This member variable is used to indicate the type of cache 00281 that must be used to store metrics to facilitate rapid 00282 construction of the MST. The default cache used in the 00283 MSTHashCache indicated by the cacheType set to \c "hash". The 00284 alternative cache in the MSTMultiListCache (indicated by 00285 cacheType value of \c "mlist"). The user may override the 00286 default using the command line parameter \c --cacheType. 00287 */ 00288 static char* cacheType; 00289 00290 /** Helper method to perform manager tasks. 00291 00292 This method has been introduced to streamline the operations 00293 of the MSTClusterMaker when it operates as the manager. The 00294 MPI process with Rank 0 (zero) acts as the manager and 00295 coordinates all the activities of the MSTClusterMaker. This 00296 method is invoked from the makeClusters() method. 00297 00298 \return This method returns 0 (zero) if clusters were created 00299 successfully. Otherwise this method returns a non-zero value 00300 indicating an error. 00301 */ 00302 virtual int manager(); 00303 00304 /** Helper method to perform worker tasks. 00305 00306 This method has been introduced to streamline the operations 00307 of the MSTClusterMaker when it operates as a worker. All the 00308 MPI processes with non-zero rank act as a worker and 00309 collaborate with the manager to assist in various activities 00310 of the MSTClusterMaker. This method is invoked from the 00311 makeClusters() method. 00312 00313 \return This method returns 0 (zero) if clusters were created 00314 successfully. Otherwise this method returns a non-zero value 00315 indicating an error. 00316 */ 00317 virtual int worker(); 00318 00319 /** Helper method to call the actual heavy-weight analysis 00320 method(s). 00321 00322 This is a helper method that is invoked from the 00323 populateCache() method to obtain the relationship metric 00324 (either via CLU or d2) between the current parent EST and the 00325 given otherEST. This method was introduced to enable chlid 00326 classes (such as TransMSTClusterMaker) to conveniently 00327 intercept analyzer calls and potentially shortcircuit them 00328 using concepts of conditional-transitivity. 00329 00330 \param[in] otherEST The index of the other EST to which the 00331 metric is required. 00332 00333 \return This method returns a similarity/distance metric by 00334 comparing the ESTs. This method may return -1, if the otherEST 00335 is significantly different from the reference EST (possibly 00336 warranting no further analysis) that a meanigful metric cannot 00337 be generated. 00338 */ 00339 virtual float analyze(const int otherEST); 00340 00341 /** Computes sends/receives similarity list for a given EST. 00342 00343 This method is a shared method that is used by both the 00344 manager and workers. This method is used to compute the 00345 similarity metric and cache the highest set of similarity 00346 metrics. This method operates as follows: 00347 00348 <ol> 00349 00350 <li>Each process computes a subset of the EST similarity 00351 metric in the range \em k*Rank < otherEstIdx < (\em k+1)*Rank, 00352 where k=estList.size() / MPI::COMM_WORLD.Get_size(), and Rank 00353 is the MPI rank of this process. </li> 00354 00355 <li>If this process is the cache owner for the est, (that is, 00356 estIdx % Rank == 0), then it receives data from other 00357 processes and merges the information with its own list, 00358 retaining the top-most similarity metrics.</li> 00359 00360 <li>If this process is \b not the cache owner for the est, 00361 (that is, estIdx % Rank != 0), then it sends the computed 00362 similarity metrics to the owner process. <li> 00363 00364 </ol> 00365 00366 \param[in] estIdx The index of the EST that was just added to 00367 the MST and for which the adjacent neighbors need to be 00368 determined. 00369 00370 \param[out] metricList If this pointer is not NULL, then this 00371 vector is populated with the set of metrics that were computed 00372 for estIdx <b>only on the owner process</b>. This list 00373 contains the metrics collated from all the processes 00374 participating in the distributed computing process. Currently, 00375 this feature is used by TransMSTClusterMaker to obtain the 00376 list of metrics computed. 00377 */ 00378 virtual void populateCache(const int estIdx, SMList* metricList = NULL); 00379 00380 void getOwnedESTidx(const int estIdx, int& startIndex, int& endIndex); 00381 00382 /** Helper method in Manager process to update distributed caches. 00383 00384 This is a helper method that is used only in the Manager 00385 process to perform the following tasks using the newly added 00386 estIdx value: 00387 00388 <ol> 00389 00390 <li>First, this method broadcasts the newly added EST index 00391 (\c estIdx) to all the workers.</li> 00392 00393 <li>Next it prunes it local cache via the 00394 MSTCache::pruneCaches() method.</li> 00395 00396 <li>It then collects requests to repopulate specific caches 00397 from all the workers.</li> 00398 00399 <li>It then adds the newly created est to the list of caches 00400 to be repopulated and broadcasts request to repopulate caches 00401 to each worker and participates in cache repopulation task by 00402 calling the populateCache() method.</li> 00403 00404 </ol> 00405 00406 \param[in] estIdx The index of the newly added EST. 00407 00408 \param[in] refreshEST If this flag is \c true (the default 00409 value), then the neighbors for the newly added EST (specified 00410 by estIdx) are computed and the caches are updated. 00411 00412 \return This method returns 0 on success or an suitable error 00413 code on failure. 00414 */ 00415 int managerUpdateCaches(int estIdx, const bool refreshEST = true); 00416 00417 /** Helper method in \b Manager process to collaboratively compute 00418 the next EST to be added to the MST. 00419 00420 This is a helper method that is used only in the Manager 00421 process to perform the following tasks using the newly added 00422 estIdx value: 00423 00424 <ol> 00425 00426 <li>First, this method sends request to compute the best local 00427 choice to each of the worker processes.</li> 00428 00429 <li>Next it computes its own local (at the Manager's end) best 00430 choice for the next EST node to be added.</li> 00431 00432 <li>It then collects response for best local choice from each 00433 worker process and tracks the best reported value.</li> 00434 00435 </ol> 00436 00437 \param[out] parentESTidx The source EST index from where the 00438 similarity metric is being measured. The srcESTidx is already 00439 present in the MST. 00440 00441 \param[out] estToAdd The destination EST index that is the 00442 best choice to be added to the MST (based on the local 00443 information). 00444 00445 \param[out] similarity The similarity metric between the 00446 srcESTidx and the destESTidx. 00447 00448 \param[out] alignmentData The alignment information between 00449 the two ESTs represented by their index values in parentESTidx 00450 and estToAdd. 00451 */ 00452 void computeNextESTidx(int& parentESTidx, int& estToAdd, 00453 float &similarity, int& alignmentData) const; 00454 00455 /** Determine the owner process Rank for a given estIdx. 00456 00457 This method is a convenience method to determine the Rank of 00458 the process that logically owns a given EST. The owning 00459 process is responsible for maintaining the cache for a given 00460 EST. The owners are assigned in a simple fashion and ESTs are 00461 evenly divided up amongst all the processes. 00462 00463 \param[in] estIdx The index of the EST whose owner process's 00464 rank is requested. It is assumed that the estIdx is valid. 00465 If invalid EST index values are supplied then the operation of 00466 this method is undefined. 00467 00468 \note This method must be invoked only after MPI::Intialize() 00469 has beeen called and the ESTs to be processed have be loaded 00470 (so that EST::getESTList() returns a valid list of ESTs). 00471 00472 00473 \return The rank of the owner process for the given estIdx. 00474 */ 00475 int getOwnerProcess(const int estIdx) const; 00476 00477 /** Helper method to compute the start and ending indexes of the 00478 EST that this process owns. 00479 00480 This method was introduced to keep the math and logic clutter 00481 involved in computing the list of owned ESTs out of the 00482 methods that use the information. This method returns the 00483 range, such that: \c startIndex <= \em ownedESTidx < \c 00484 endIndex. 00485 00486 00487 \note This method must be invoked only after MPI::Intialize() 00488 has beeen called and the ESTs to be processed have be loaded 00489 (so that EST::getESTList() returns a valid list of ESTs). 00490 */ 00491 void getOwnedPartition(); 00492 00493 /** Helper method for a worker process. 00494 00495 This method is invoked from the worker() method to receive and 00496 process various requests from the manager process. This 00497 method currently handles the following requests: 00498 00499 <ul> 00500 00501 <li>\c COMPUTE_SIMILARITY_REQUEST : Computes the subset of the 00502 similarity metric for the given EST index and returns the 00503 partial list back to the owner process.</li> 00504 00505 <li> \c COMPUTE_MAX_SIMILARITY_REQUEST : Computes the highest 00506 similarity value between all the ESTs on this cluster and 00507 returns the top entry back to the manager. Once this request 00508 has been processed this method returns control back. 00509 00510 </ul> 00511 */ 00512 void workerProcessRequests(); 00513 00514 /** Distribute data and tag to all the workers. 00515 00516 This method provides a convenient mechanism to broadcast a 00517 given integer data and tag to all the workers. 00518 00519 \param[in] data The integer to be sent to each and every 00520 worker. 00521 00522 \param[in] tag The message tag to be sent to each and every 00523 process. 00524 */ 00525 void sendToWorkers(int data, const int tag) const; 00526 00527 /** Method to detect if a given SMList has at least one, valid 00528 entry. 00529 00530 This method is used (in the populateCache()) to determine if a 00531 given SMList has at least one valid entry. This method is 00532 useful particularly when a empty SMList is received from a 00533 remote process and in this case there ine one entry in the 00534 SMList (-1, -1). 00535 00536 \param[in] list The list to check if it has a valid entry. 00537 */ 00538 bool hasValidSMEntry(const SMList& list) const; 00539 00540 /** Helper method to distribute index of newly added EST to all 00541 workers and gather cache repopulation requests. 00542 00543 This is a helper method that was added to streamline the code 00544 in managerUpdateCaches method. This method performs the 00545 following tasks: 00546 00547 <ol> 00548 00549 <li>First it uses the \c sendToWorkers() method to distribute 00550 the \c estIdx (parameter) value to all the workers. </li> 00551 00552 <li> Next it prunes the local caches on the manager.</li> 00553 00554 <li>It then obtains repopulation requests from each worker and 00555 places EST indexes to be repopulated in the repoulateList 00556 parameter.</li> 00557 00558 </ol> 00559 00560 \note This method must be inovked only on the manager. 00561 00562 \param[in] estIdx The index of the newly added EST that must 00563 be distributed to all the workers. 00564 00565 \param[out] repopulateList A vector that will contain the list 00566 of ESTs that need to be repopulated (based on requests 00567 received from various workers). 00568 */ 00569 void estAdded(const int estIdx, std::vector<int>& repopulateList); 00570 00571 /** Helper method in \b Manager process to add as many child nodes 00572 as possible for the given parent. 00573 00574 This is a helper method that is used only in the Manager 00575 process <b>only when the \c maxUse parameter is != -1</b>. 00576 This method tries to add more children rooted at the given 00577 parent to the MST as long as the metric is better than \c 00578 maxUse value. This method operates as follows: 00579 00580 <ol> 00581 00582 <li>First, this method sends request to compute the best local 00583 choice to each of the worker processes.</li> 00584 00585 <li>Next it computes its own local (at the Manager's end) best 00586 choice for the next EST node to be added.</li> 00587 00588 <li>It then collects response for best local choice from each 00589 worker process and tracks the best reported value.</li> 00590 00591 <li>If the next best entry is still rooted at this parent and 00592 the metric is better than \c maxUse then the EST is added to 00593 MST and the process is repeated from step 1. Otherwise, the 00594 parameters are updated to the last added EST and the method 00595 returns.</li> 00596 00597 </ol> 00598 00599 \param[in] parentESTidx The source EST index from where the 00600 similarity metric is being measured. The parentESTidx is 00601 already present in the MST. 00602 00603 \param[in,out] estToAdd The EST that has just been added to 00604 the MST. This method updates this value if additional ESTs 00605 are added to the MST by this method. 00606 00607 \param[in,out] metric The similarity/distance metric between 00608 the parentESTidx and the estToAdd. This method updates this 00609 value if additional ESTs are added to the MST by this method. 00610 00611 \param[in,out] alignmentData The alignment information between 00612 the two ESTs represented by their index values in parentESTidx 00613 and estToAdd. This method updates this value if additional 00614 ESTs are added to the MST by this method. 00615 00616 \param[in,out] pendingESTs The number of pending ESTs that 00617 have not yet been added to the MST. This value is used and 00618 udpated by this method each time it adds a EST. 00619 */ 00620 void addMoreChildESTs(const int parentESTidx, int& estToAdd, 00621 float &metric, int& alignmentData, 00622 int& pendingESTs); 00623 00624 // New methods 00625 int mergeManager(MSTCluster& rootCluster, const int threshold); 00626 00627 int mergeWorker(); 00628 00629 /** The default constructor. 00630 00631 The default constructor for this class. The constructor is 00632 made private so that this class cannot be directly 00633 instantiated. However, since the ClusterMakerFactory is a 00634 friend of this class, an object can be instantiated via the 00635 ClusterMakerFactory::create() method. 00636 00637 \param[in,out] analyzer The EST analyzer to be used for 00638 obtaining similarity metrics between two ESTs. This parameter 00639 is simply passed onto the base class. 00640 00641 \param[in] refESTidx The reference EST index value to be used 00642 to root the spanning tree created by this method. This 00643 parameter should be >= 0. This value is simply passed onto 00644 the base class. 00645 00646 \param[in] outputFile The name of the output file to which the 00647 raw MST cluster information is to be written. If this 00648 parameter is the empty string then output is written to 00649 standard output. This value is simply passed onto the base 00650 class. 00651 */ 00652 PMSTClusterMaker(ESTAnalyzer *analyzer, const int refESTidx, 00653 const std::string& outputFile); 00654 00655 /** The set of common arguments for the MST cluster maker. 00656 00657 This instance variable contains a static list of arguments 00658 that are common all the MST cluster maker objects. 00659 */ 00660 static arg_parser::arg_record argsList[]; 00661 00662 /** The cache that holds similarity metrics for MST construction. 00663 00664 This object is used to cache the similarity metrics for all 00665 ESTs that are owned by this process (that is, estIdx % Rank == 00666 0, where Rank is the MPI rank of this process). The cache 00667 contains similarity metrics to facilitate rapid construction 00668 of the MST. Both the manager and worker processes have their 00669 own caches and manage them independently. This spreads out 00670 the memory requirement for the caches across multiple 00671 processes enabling large (in 10s of GB) caches. 00672 00673 The cache is created just before the clustering process 00674 commences and is deleted immediately after the clustering 00675 process (to minimize memory footprint). 00676 */ 00677 MSTCache *cache; 00678 00679 PartitionData *pData; 00680 00681 private: 00682 /** The Minimum Spanning Tree (MST) built by this class. 00683 00684 This instance variable holds a pointer to the MST created by 00685 this class when it operates as a manager process. This 00686 pointer is initialized to NULL and a MST is created in the 00687 manager() method. 00688 */ 00689 MST* mst; 00690 }; 00691 00692 #endif