VTK-m  2.0
augmented/ContourTree.h
Go to the documentation of this file.
1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //============================================================================
10 // Copyright (c) 2018, The Regents of the University of California, through
11 // Lawrence Berkeley National Laboratory (subject to receipt of any required approvals
12 // from the U.S. Dept. of Energy). All rights reserved.
13 //
14 // Redistribution and use in source and binary forms, with or without modification,
15 // are permitted provided that the following conditions are met:
16 //
17 // (1) Redistributions of source code must retain the above copyright notice, this
18 // list of conditions and the following disclaimer.
19 //
20 // (2) Redistributions in binary form must reproduce the above copyright notice,
21 // this list of conditions and the following disclaimer in the documentation
22 // and/or other materials provided with the distribution.
23 //
24 // (3) Neither the name of the University of California, Lawrence Berkeley National
25 // Laboratory, U.S. Dept. of Energy nor the names of its contributors may be
26 // used to endorse or promote products derived from this software without
27 // specific prior written permission.
28 //
29 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
30 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32 // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
37 // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
38 // OF THE POSSIBILITY OF SUCH DAMAGE.
39 //
40 //=============================================================================
41 //
42 // This code is an extension of the algorithm presented in the paper:
43 // Parallel Peak Pruning for Scalable SMP Contour Tree Computation.
44 // Hamish Carr, Gunther Weber, Christopher Sewell, and James Ahrens.
45 // Proceedings of the IEEE Symposium on Large Data Analysis and Visualization
46 // (LDAV), October 2016, Baltimore, Maryland.
47 //
48 // The PPP2 algorithm and software were jointly developed by
49 // Hamish Carr (University of Leeds), Gunther H. Weber (LBNL), and
50 // Oliver Ruebel (LBNL)
51 //==============================================================================
52 
53 #ifndef vtk_m_worklet_contourtree_augmented_contourtree_h
54 #define vtk_m_worklet_contourtree_augmented_contourtree_h
55 
56 // global includes
57 #include <algorithm>
58 #include <iomanip>
59 #include <iostream>
60 #include <sstream>
61 #include <string>
62 
63 // local includes
66 
67 //VTKM includes
68 #include <vtkm/Pair.h>
69 #include <vtkm/Types.h>
70 #include <vtkm/cont/Algorithm.h>
72 
73 namespace vtkm
74 {
75 namespace worklet
76 {
77 namespace contourtree_augmented
78 {
79 
80 constexpr int N_NODE_COLORS = 12;
81 constexpr const char* NODE_COLORS[N_NODE_COLORS] = { // nodeColors
82  "red", "red4", "green", "green4", "royalblue", "royalblue4",
83  "cyan", "cyan4", "magenta", "magenta4", "yellow", "yellow4"
84 }; // nodeColors
85 
86 
88 {
91  const vtkm::Pair<vtkm::Id, vtkm::Id>& b) const
92  {
93  if (a.first < b.first)
94  return true;
95  if (a.first > b.first)
96  return false;
97  if (a.second < b.second)
98  return true;
99  if (a.second > b.second)
100  return false;
101  return false;
102  }
103 };
104 
105 
107 { // class ContourTree
108 public:
109  // VECTORS INDEXED ON N = SIZE OF DATA
110 
111  // the list of nodes is implicit - but for some purposes, it's useful to have them pre-sorted by superarc
113 
114  // vector of (regular) arcs in the merge tree
116 
117  // vector storing which superarc owns each node
119 
120  // VECTORS INDEXED ON T = SIZE OF TREE
121 
122  // vector storing the list of supernodes by ID
123  // WARNING: THESE ARE NOT SORTED BY INDEX
124  // Instead, they are sorted by hyperarc, secondarily on index
126 
127  // vector of superarcs in the merge tree
128  // stored as supernode indices
130 
131  // for boundary augmented contour tree (note: these use the same convention as supernodes/superarcs)
134 
135  // vector of Hyperarcs to which each supernode/arc belongs
137 
138  // vector tracking which superarc was transferred on which iteration
140 
141  // VECTORS INDEXED ON H = SIZE OF HYPERTREE
142 
143  // vector of sort indices for the hypernodes
145 
146  // vector of Hyperarcs in the merge tree
147  // NOTE: These are supernode IDs, not hypernode IDs
148  // because not all Hyperarcs lead to hypernodes
150 
151  // counter for the number of iterations it took to construct the tree
152  // this is also used for hypersweep computations
154 
155  // vectors tracking the segments used in each iteration of the hypersweep
158 
159 
160  // ROUTINES
161 
162  // initialises contour tree arrays - rest is done by another class
163  inline ContourTree();
164 
165  // initialises contour tree arrays - rest is done by another class
166  inline void Init(vtkm::Id dataSize);
167 
168  // debug routine
169  inline std::string DebugPrint(const char* message, const char* fileName, long lineNum) const;
170 
171  // print contents
172  inline void PrintContent(std::ostream& outStream = std::cout) const;
173 
174  // print routines
175  inline void PrintDotSuperStructure() const;
176  inline std::string PrintHyperStructureStatistics(bool print = true) const;
177  inline std::string PrintArraySizes() const;
178 
179 }; // class ContourTree
180 
181 
182 
184  : Arcs()
185  , Superparents()
186  , Supernodes()
187  , Superarcs()
188  , Hyperparents()
189  , Hypernodes()
190  , Hyperarcs()
191 { // ContourTree()
192 } // ContourTree()
193 
194 
195 // initialises contour tree arrays - rest is done by another class
196 inline void ContourTree::Init(vtkm::Id dataSize)
197 { // Init()
199  static_cast<vtkm::Id>(NO_SUCH_ELEMENT), dataSize);
200  vtkm::cont::Algorithm::Copy(noSuchElementArray, this->Arcs);
201  vtkm::cont::Algorithm::Copy(noSuchElementArray, this->Superparents);
202 } // Init()
203 
204 
205 inline void ContourTree::PrintContent(std::ostream& outStream /*= std::cout*/) const
206 {
207  PrintHeader(this->Arcs.GetNumberOfValues(), outStream);
208  PrintIndices("Arcs", this->Arcs, -1, outStream); // -1 -> thisArcs.size()
209  PrintIndices("Superparents", this->Superparents, -1, outStream);
210  outStream << std::endl;
211  PrintHeader(this->Supernodes.GetNumberOfValues(), outStream);
212  PrintIndices("Supernodes", this->Supernodes, -1, outStream);
213  PrintIndices("Superarcs", this->Superarcs, -1, outStream);
214  PrintIndices("Hyperparents", this->Hyperparents, -1, outStream);
215  PrintIndices("When Xferred", this->WhenTransferred, -1, outStream);
216  outStream << std::endl;
217  PrintHeader(this->Hypernodes.GetNumberOfValues(), outStream);
218  PrintIndices("Hypernodes", this->Hypernodes, -1, outStream);
219  PrintIndices("Hyperarcs", this->Hyperarcs, -1, outStream);
221  PrintIndices("Augmentnodes", Augmentnodes, -1, outStream);
222  PrintIndices("Augmentarcs", this->Augmentarcs, -1, outStream);
223  outStream << std::endl;
224  outStream << "NumIterations: " << this->NumIterations << std::endl;
226  PrintIndices("First SN Per Iter", this->FirstSupernodePerIteration, -1, outStream);
227  PrintIndices("First HN Per Iter", this->FirstHypernodePerIteration, -1, outStream);
228 }
229 
230 inline std::string ContourTree::DebugPrint(const char* message,
231  const char* fileName,
232  long lineNum) const
233 { // DebugPrint()
234  std::stringstream resultStream;
235  resultStream << std::endl;
236  resultStream << "---------------------------" << std::endl;
237  resultStream << std::setw(30) << std::left << fileName << ":" << std::right << std::setw(4)
238  << lineNum << std::endl;
239  resultStream << std::left << std::string(message) << std::endl;
240  resultStream << "Contour Tree Contains: " << std::endl;
241  resultStream << "---------------------------" << std::endl;
242  resultStream << std::endl;
243 
244  this->PrintContent(resultStream);
245 
246  return resultStream.str();
247 
248 } // DebugPrint()
249 
251 { // PrintDotSuperStructure()
252  // print the header information
253  printf("digraph G\n\t{\n");
254  printf("\tsize=\"6.5, 9\"\n\tratio=\"fill\"\n");
255 
256  // We use regular ReadPortal here since we need access to most values on the host anyways
257  auto whenTransferredPortal = this->WhenTransferred.ReadPortal();
258  auto supernodesPortal = this->Supernodes.ReadPortal();
259  auto superarcsPortal = this->Superarcs.ReadPortal();
260  auto hypernodesPortal = this->Hypernodes.ReadPortal();
261  auto hyperparentsPortal = this->Hyperparents.ReadPortal();
262  auto hyperarcsPortal = this->Hyperarcs.ReadPortal();
263 
264  // colour the nodes by the iteration they transfer (mod # of colors) - paired iterations have similar colors RGBCMY
265  for (vtkm::Id supernode = 0; supernode < this->Supernodes.GetNumberOfValues(); supernode++)
266  { // per supernode
267  vtkm::Id iteration = MaskedIndex(whenTransferredPortal.Get(supernode));
268  printf("\tnode s%lli [style=filled,fillcolor=%s]\n",
269  static_cast<vtkm::Int64>(supernodesPortal.Get(supernode)),
270  NODE_COLORS[iteration % N_NODE_COLORS]);
271  } // per supernode
272 
273  // loop through supernodes
274  for (vtkm::Id supernode = 0; supernode < this->Supernodes.GetNumberOfValues(); supernode++)
275  { // per supernode
276  // skip the global root
277  if (NoSuchElement(superarcsPortal.Get(supernode)))
278  continue;
279 
280  if (IsAscending(superarcsPortal.Get(supernode)))
281  printf(
282  "\tedge s%lli -> s%lli[label=S%lli,dir=back]\n",
283  static_cast<vtkm::Int64>(supernodesPortal.Get(MaskedIndex(superarcsPortal.Get(supernode)))),
284  static_cast<vtkm::Int64>(supernodesPortal.Get(supernode)),
285  static_cast<vtkm::Int64>(supernode));
286  else
287  printf(
288  "\tedge s%lli -> s%lli[label=S%lli]\n",
289  static_cast<vtkm::Int64>(supernodesPortal.Get(supernode)),
290  static_cast<vtkm::Int64>(supernodesPortal.Get(MaskedIndex(superarcsPortal.Get(supernode)))),
291  static_cast<vtkm::Int64>(supernode));
292  } // per supernode
293 
294  // now loop through hypernodes to show hyperarcs
295  for (vtkm::Id hypernode = 0; hypernode < this->Hypernodes.GetNumberOfValues(); hypernode++)
296  { // per hypernode
297  // skip the global root
298  if (NoSuchElement(hyperarcsPortal.Get(hypernode)))
299  continue;
300 
301  printf(
302  "\ts%lli -> s%lli [constraint=false][width=5.0][label=\"H%lli\\nW%lli\"]\n",
303  static_cast<vtkm::Int64>(supernodesPortal.Get(hypernodesPortal.Get(hypernode))),
304  static_cast<vtkm::Int64>(supernodesPortal.Get(MaskedIndex(hyperarcsPortal.Get(hypernode)))),
305  static_cast<vtkm::Int64>(hypernode),
306  static_cast<vtkm::Int64>(
307  MaskedIndex(whenTransferredPortal.Get(hypernodesPortal.Get(hypernode)))));
308  } // per hypernode
309 
310  // now add the hyperparents
311  for (vtkm::Id supernode = 0; supernode < this->Supernodes.GetNumberOfValues(); supernode++)
312  { // per supernode
313  printf("\ts%lli -> s%lli [constraint=false][style=dotted]\n",
314  static_cast<vtkm::Int64>(supernodesPortal.Get(supernode)),
315  static_cast<vtkm::Int64>(
316  supernodesPortal.Get(hypernodesPortal.Get(hyperparentsPortal.Get(supernode)))));
317  } // per supernode
318 
319  // now use the hyperstructure to define subgraphs
320  for (vtkm::Id hypernode = 0; hypernode < this->Hypernodes.GetNumberOfValues(); hypernode++)
321  { // per hypernode
322  vtkm::Id firstChild = hypernodesPortal.Get(hypernode);
323  vtkm::Id childSentinel = (hypernode == this->Hypernodes.GetNumberOfValues() - 1)
324  ? this->Supernodes.GetNumberOfValues()
325  : hypernodesPortal.Get(hypernode + 1);
326  printf("\tsubgraph H%lli{ ", static_cast<vtkm::Int64>(hypernode));
327  for (vtkm::Id supernode = firstChild; supernode < childSentinel; supernode++)
328  {
329  printf("s%lli ", static_cast<vtkm::Int64>(supernodesPortal.Get(supernode)));
330  }
331  printf("}\n");
332  } // per hypernode
333 
334  // print the footer information
335  printf("\t}\n");
336 } // PrintDotSuperStructure()
337 
338 inline std::string ContourTree::PrintHyperStructureStatistics(bool print) const
339 { // PrintHyperStructureStatistics()
340  // arrays for collecting statistics
341  std::vector<vtkm::Id> minPath;
342  std::vector<vtkm::Id> maxPath;
343  std::vector<vtkm::Id> supernodeCount;
344  std::vector<vtkm::Id> hypernodeCount;
345  // We use regular ReadPortal here since we need access to all values anyways
346  auto whenTransferredPortal = this->WhenTransferred.ReadPortal();
347  auto hypernodesPortal = this->Hypernodes.ReadPortal();
348 
349  // set an initial iteration number to negative to get it started
350  long whichIteration = -1;
351 
352  // loop through the hypernodes
353  for (vtkm::Id hypernode = 0; hypernode < this->Hypernodes.GetNumberOfValues(); hypernode++)
354  { // per hypernode
355  // retrieve corresponding supernode ID
356  vtkm::Id supernodeID = hypernodesPortal.Get(hypernode);
357  // and the iteration of transfer
358  vtkm::Id iterationNo = MaskedIndex(whenTransferredPortal.Get(supernodeID));
359 
360  // if it doesn't match, we've hit a boundary
361  if (whichIteration != iterationNo)
362  { // new iteration
363  // initialise the next iteration
364  // this one is larger than the maximum possible to force minimum
365  minPath.push_back(static_cast<vtkm::Id>(this->Supernodes.GetNumberOfValues() + 1));
366  maxPath.push_back(0);
367  supernodeCount.push_back(0);
368  hypernodeCount.push_back(0);
369  // and increment the iteration ID
370  whichIteration++;
371  } // new iteration
372 
373  // now compute the new path length - default to off the end
374  vtkm::Id pathLength = static_cast<vtkm::Id>(this->Supernodes.GetNumberOfValues() - supernodeID);
375  // for all except the last, take the next one
376  if (hypernode != this->Hypernodes.GetNumberOfValues() - 1)
377  {
378  pathLength = hypernodesPortal.Get(hypernode + 1) - supernodeID;
379  }
380  // update the statistics
381  if (pathLength < minPath[static_cast<std::size_t>(whichIteration)])
382  {
383  minPath[static_cast<std::size_t>(whichIteration)] = pathLength;
384  }
385  if (pathLength > maxPath[static_cast<std::size_t>(whichIteration)])
386  {
387  maxPath[static_cast<std::size_t>(whichIteration)] = pathLength;
388  }
389  supernodeCount[static_cast<std::size_t>(whichIteration)] += pathLength;
390  hypernodeCount[static_cast<std::size_t>(whichIteration)]++;
391  } // per hypernode
392 
393  // now print out the statistics
394  std::stringstream resultString;
395  for (std::size_t iteration = 0; iteration < minPath.size(); iteration++)
396  { // per iteration
397  double averagePath = static_cast<double>(supernodeCount[iteration]) /
398  static_cast<double>(hypernodeCount[iteration]);
399  resultString << "Iteration: " << iteration << " Hyper: " << hypernodeCount[iteration]
400  << " Super: " << supernodeCount[iteration] << " Min: " << minPath[iteration]
401  << " Avg: " << averagePath << " Max: " << maxPath[iteration] << std::endl;
402  } // per iteration
403  resultString << "Total Hypernodes: " << this->Hypernodes.GetNumberOfValues()
404  << " Supernodes: " << this->Supernodes.GetNumberOfValues() << std::endl;
405  if (print)
406  {
407  std::cout << resultString.str() << std::endl;
408  }
409 
410  return resultString.str();
411 } // PrintHyperStructureStatistics()
412 
413 inline std::string ContourTree::PrintArraySizes() const
414 { // PrintArraySizes
415  std::stringstream arraySizeLog;
416  arraySizeLog << std::setw(42) << std::left << " #Nodes"
417  << ": " << this->Nodes.GetNumberOfValues() << std::endl
418  << std::setw(42) << std::left << " #Arcs"
419  << ": " << this->Arcs.GetNumberOfValues() << std::endl
420  << std::setw(42) << std::left << " #Superparents"
421  << ": " << this->Superparents.GetNumberOfValues() << std::endl
422  << std::setw(42) << std::left << " #Superarcs"
423  << ": " << this->Superarcs.GetNumberOfValues() << std::endl
424  << std::setw(42) << std::left << " #Supernodes"
425  << ": " << this->Supernodes.GetNumberOfValues() << std::endl
426  << std::setw(42) << std::left << " #Hyperparents"
427  << ": " << this->Hyperparents.GetNumberOfValues() << std::endl
428  << std::setw(42) << std::left << " #WhenTransferred"
429  << ": " << this->WhenTransferred.GetNumberOfValues() << std::endl
430  << std::setw(42) << std::left << " #Hypernodes"
431  << ": " << this->Hypernodes.GetNumberOfValues() << std::endl
432  << std::setw(42) << std::left << " #Hyperarcs"
433  << ": " << this->Hyperarcs.GetNumberOfValues() << std::endl;
434  return arraySizeLog.str();
435 } // PrintArraySizes
436 
437 } // namespace contourtree_augmented
438 } // worklet
439 } // vtkm
440 
441 #endif
vtkm::cont::ArrayHandle::GetNumberOfValues
VTKM_CONT vtkm::Id GetNumberOfValues() const
Returns the number of entries in the array.
Definition: ArrayHandle.h:448
vtkm::worklet::contourtree_augmented::ContourTree::Hyperparents
IdArrayType Hyperparents
Definition: augmented/ContourTree.h:136
vtkm::cont::ArrayHandle< vtkm::Id >
vtkm::worklet::contourtree_augmented::IsAscending
VTKM_EXEC_CONT bool IsAscending(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:121
vtkm::worklet::contourtree_augmented::ContourTree::DebugPrint
std::string DebugPrint(const char *message, const char *fileName, long lineNum) const
Definition: augmented/ContourTree.h:230
vtkm::worklet::contourtree_augmented::ContourTree::Hyperarcs
IdArrayType Hyperarcs
Definition: augmented/ContourTree.h:149
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
vtkm::worklet::contourtree_augmented::ContourTree::Supernodes
IdArrayType Supernodes
Definition: augmented/ContourTree.h:125
Types.h
vtkm::worklet::contourtree_augmented::NODE_COLORS
constexpr const char * NODE_COLORS[N_NODE_COLORS]
Definition: augmented/ContourTree.h:81
vtkm::worklet::contourtree_augmented::N_NODE_COLORS
constexpr int N_NODE_COLORS
Definition: augmented/ContourTree.h:80
vtkm::worklet::contourtree_augmented::ContourTree
Definition: augmented/ContourTree.h:106
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
Pair.h
vtkm::worklet::contourtree_augmented::ContourTree::PrintHyperStructureStatistics
std::string PrintHyperStructureStatistics(bool print=true) const
Definition: augmented/ContourTree.h:338
vtkm::worklet::contourtree_augmented::ContourTree::Superparents
IdArrayType Superparents
Definition: augmented/ContourTree.h:118
vtkm::worklet::contourtree_augmented::SaddlePeakSort::operator()
VTKM_EXEC_CONT bool operator()(const vtkm::Pair< vtkm::Id, vtkm::Id > &a, const vtkm::Pair< vtkm::Id, vtkm::Id > &b) const
Definition: augmented/ContourTree.h:90
vtkm::worklet::contourtree_augmented::ContourTree::Hypernodes
IdArrayType Hypernodes
Definition: augmented/ContourTree.h:144
vtkm::worklet::contourtree_augmented::ContourTree::Nodes
IdArrayType Nodes
Definition: augmented/ContourTree.h:112
ArrayHandleConstant.h
vtkm::cont::Algorithm::Copy
static VTKM_CONT bool Copy(vtkm::cont::DeviceAdapterId devId, const vtkm::cont::ArrayHandle< T, CIn > &input, vtkm::cont::ArrayHandle< U, COut > &output)
Definition: Algorithm.h:410
PrintVectors.h
vtkm::worklet::contourtree_augmented::MaskedIndex
VTKM_EXEC_CONT vtkm::Id MaskedIndex(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:127
vtkm::worklet::contourtree_augmented::ContourTree::Init
void Init(vtkm::Id dataSize)
Definition: augmented/ContourTree.h:196
vtkm::worklet::contourtree_augmented::ContourTree::PrintContent
void PrintContent(std::ostream &outStream=std::cout) const
Definition: augmented/ContourTree.h:205
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::contourtree_augmented::ContourTree::Augmentarcs
IdArrayType Augmentarcs
Definition: augmented/ContourTree.h:133
vtkm::worklet::contourtree_augmented::ContourTree::PrintArraySizes
std::string PrintArraySizes() const
Definition: augmented/ContourTree.h:413
vtkm::worklet::contourtree_augmented::ContourTree::Superarcs
IdArrayType Superarcs
Definition: augmented/ContourTree.h:129
vtkm::worklet::contourtree_augmented::ContourTree::NumIterations
vtkm::Id NumIterations
Definition: augmented/ContourTree.h:153
vtkm::worklet::contourtree_augmented::NoSuchElement
VTKM_EXEC_CONT bool NoSuchElement(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:97
Algorithm.h
vtkm::Pair::first
FirstType first
The pair's first object.
Definition: Pair.h:50
Types.h
vtkm::cont::ArrayHandleConstant
An array handle with a constant value.
Definition: ArrayHandleConstant.h:63
vtkm::cont::ArrayHandle::ReadPortal
VTKM_CONT ReadPortalType ReadPortal() const
Get an array portal that can be used in the control environment.
Definition: ArrayHandle.h:414
vtkm::worklet::contourtree_augmented::ContourTree::Arcs
IdArrayType Arcs
Definition: augmented/ContourTree.h:115
vtkm::worklet::contourtree_augmented::ContourTree::FirstHypernodePerIteration
IdArrayType FirstHypernodePerIteration
Definition: augmented/ContourTree.h:157
vtkm::worklet::contourtree_augmented::PrintIndices
void PrintIndices(std::string label, const vtkm::cont::ArrayHandle< T > &iVec, vtkm::Id nIndices=-1, std::ostream &outStream=std::cout)
Definition: augmented/PrintVectors.h:253
vtkm::worklet::contourtree_augmented::PrintHeader
void PrintHeader(vtkm::Id howMany, std::ostream &outStream=std::cout)
Definition: augmented/PrintVectors.h:151
vtkm::worklet::contourtree_augmented::ContourTree::PrintDotSuperStructure
void PrintDotSuperStructure() const
Definition: augmented/ContourTree.h:250
vtkm::worklet::contourtree_augmented::SaddlePeakSort
Definition: augmented/ContourTree.h:87
vtkm::Pair
A vtkm::Pair is essentially the same as an STL pair object except that the methods (constructors and ...
Definition: Pair.h:29
vtkm::worklet::contourtree_augmented::ContourTree::FirstSupernodePerIteration
IdArrayType FirstSupernodePerIteration
Definition: augmented/ContourTree.h:156
vtkm::worklet::contourtree_augmented::ContourTree::ContourTree
ContourTree()
Definition: augmented/ContourTree.h:183
vtkm::worklet::contourtree_augmented::NO_SUCH_ELEMENT
constexpr vtkm::Id NO_SUCH_ELEMENT
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:73
vtkm::Pair::second
SecondType second
The pair's second object.
Definition: Pair.h:55
vtkm::worklet::contourtree_augmented::ContourTree::WhenTransferred
IdArrayType WhenTransferred
Definition: augmented/ContourTree.h:139
vtkm::worklet::contourtree_augmented::ContourTree::Augmentnodes
IdArrayType Augmentnodes
Definition: augmented/ContourTree.h:132