TTK
Loading...
Searching...
No Matches
DiscreteGradient.h
Go to the documentation of this file.
1
15
16#pragma once
17
18// base code includes
19#include <FTMTree.h>
20#include <Geometry.h>
21#include <Triangulation.h>
22#include <VisitedMask.h>
23#include <algorithm>
24#include <array>
25#include <functional>
26#include <queue>
27#include <set>
28#include <utility>
29
30namespace ttk {
31
32 namespace dcg {
37 struct Cell {
38 explicit Cell() = default;
39
40 explicit Cell(const int dim, const SimplexId id) : dim_{dim}, id_{id} {
41 }
42
43 inline bool operator==(const Cell &other) const {
44 return std::tie(this->dim_, this->id_)
45 == std::tie(other.dim_, other.id_);
46 }
47
48 inline std::string to_string() const {
49 return '{' + std::to_string(this->dim_) + ' '
50 + std::to_string(this->id_) + '}';
51 }
52
53 int dim_{-1};
55 };
56
58
62 struct CellExt : Cell {
63 explicit CellExt(const int dim, const SimplexId id) : Cell{dim, id} {
64 }
65 explicit CellExt(const int dim,
66 const SimplexId id,
67 const std::array<SimplexId, 3> &lowVerts,
68 const std::array<uint8_t, 3> &faces)
69 : Cell{dim, id}, lowVerts_{lowVerts}, faces_{faces} {
70 }
71
72 // (order field value on) lower vertices in current lower star
73 // (1 for edges, 2 for triangles, 3 for tetras)
74 const std::array<SimplexId, 3> lowVerts_{};
75 // indices of faces (cells of dimensions dim_ - 1) in lower star
76 // structure, only applicable for triangles (2 edge faces) and tetras (3
77 // triangle faces)
78 const std::array<uint8_t, 3> faces_{};
79 // if cell has been paired with another in current lower star
80 bool paired_{false};
81 };
82
87 struct VPath {
88 explicit VPath() = default;
89
90 explicit VPath(const bool isValid,
91 const SimplexId segmentId,
92 const SimplexId source,
93 const SimplexId destination,
94 const SimplexId sourceSlot,
95 const SimplexId destinationSlot,
96 const double persistence)
97 : isValid_{isValid}, states_{1}, segments_{segmentId}, source_{source},
98 destination_{destination}, sourceSlot_{sourceSlot},
99 destinationSlot_{destinationSlot}, persistence_{persistence} {
100 }
101
102 explicit VPath(const bool isValid,
103 const std::vector<char> &states,
104 const std::vector<SimplexId> &segments,
105 const SimplexId source,
106 const SimplexId destination,
107 const SimplexId sourceSlot,
108 const SimplexId destinationSlot,
109 const double persistence)
110 : isValid_{isValid}, states_{states}, segments_{segments},
111 source_{source}, destination_{destination}, sourceSlot_{sourceSlot},
112 destinationSlot_{destinationSlot}, persistence_{persistence} {
113 }
114
115 explicit VPath(const bool isValid,
116 std::vector<char> &&states,
117 std::vector<SimplexId> &&segments,
118 const SimplexId source,
119 const SimplexId destination,
120 const SimplexId sourceSlot,
121 const SimplexId destinationSlot,
122 const double persistence)
123 : isValid_{isValid}, states_{states}, segments_{segments},
124 source_{source}, destination_{destination}, sourceSlot_{sourceSlot},
125 destinationSlot_{destinationSlot}, persistence_{persistence} {
126 }
127
133 isValid_ = false;
134 source_ = -1;
135 destination_ = -1;
136 persistence_ = -1;
137 clear();
138
139 return 0;
140 }
141
145 int clear() {
146 states_.clear();
147 segments_.clear();
148
149 return 0;
150 }
151
152 bool isValid_{};
153 std::vector<char> states_{};
154 std::vector<SimplexId> segments_{};
159 double persistence_{};
160 };
161
166 explicit CriticalPoint() = default;
167
168 explicit CriticalPoint(const Cell &cell) : cell_{cell}, numberOfSlots_{} {
169 }
170
171 explicit CriticalPoint(const Cell &cell,
172 const std::vector<SimplexId> &vpaths)
173 : cell_{cell}, vpaths_{vpaths}, numberOfSlots_{} {
174 }
175
176 explicit CriticalPoint(const Cell &cell, std::vector<SimplexId> &&vpaths)
177 : cell_{cell}, vpaths_{vpaths}, numberOfSlots_{} {
178 }
179
185 SimplexId numberOfSlots = 0;
186
187#ifdef TTK_ENABLE_OPENMP
188#pragma omp atomic capture
189#endif
190 numberOfSlots = (numberOfSlots_++);
191
192 return numberOfSlots;
193 }
194
199 return (numberOfSlots_++);
200 }
201
205 int clear() {
206 vpaths_.clear();
207
208 return 0;
209 }
210
212 std::vector<SimplexId> vpaths_{};
214 };
215
220 template <typename dataType>
222 bool
223 operator()(const std::tuple<dataType, SimplexId, SimplexId> &v1,
224 const std::tuple<dataType, SimplexId, SimplexId> &v2) const {
225 const dataType persistence1 = std::get<0>(v1);
226 const dataType persistence2 = std::get<0>(v2);
227
228 const SimplexId vpathId1 = std::get<1>(v1);
229 const SimplexId vpathId2 = std::get<1>(v2);
230
231 const SimplexId saddleId1 = std::get<2>(v1);
232 const SimplexId saddleId2 = std::get<2>(v2);
233
234 if(persistence1 != persistence2) {
235 return (persistence1 < persistence2);
236 }
237
238 if(saddleId1 != saddleId2) {
239 return (saddleId1 < saddleId2);
240 }
241
242 return (vpathId1 < vpathId2);
243 }
244 };
245
251 class DiscreteGradient : virtual public Debug {
252
253 public:
258
260 this->setDebugMsgPrefix("DiscreteGradient");
261#ifdef TTK_ENABLE_MPI
262 hasMPISupport_ = true;
263#endif
264 }
265
270 template <typename dataType, typename triangulationType>
271 int buildGradient(const triangulationType &triangulation,
272 bool bypassCache = false,
273 const std::vector<bool> *updateMask = nullptr);
274
275 template <typename triangulationType>
276 int buildGradient(const triangulationType &triangulation,
277 bool bypassCache = false,
278 const std::vector<bool> *updateMask = nullptr);
279
280#ifdef TTK_ENABLE_MPI
281 template <typename triangulationType>
282 int getSimplexRankWithGradientType(const triangulationType &triangulation,
283 const ttk::SimplexId &lid,
284 const int gradientType);
285#endif
294 inline void setInputScalarField(const void *const data,
295 const size_t mTime) {
296 inputScalarField_ = std::make_pair(data, mTime);
297 }
298
299 inline void setBackend(const BACKEND newBackend) {
301 BackEnd = newBackend;
302 }
303
304 inline void setSeed(const unsigned int &newSeed) {
305 OldSeed = Seed;
306 Seed = newSeed;
307 }
308
309 inline void
310 setReturnSaddleConnectors(const bool &returnSaddleConnectors) {
312 ReturnSaddleConnectors = returnSaddleConnectors;
313 }
314
319
320 inline void setSaddleConnectorsPersistenceThreshold(double threshold) {
322 }
323
329 if(data != nullptr) {
330 const auto dim{data->getDimensionality()};
331
336 data->preconditionEdges();
337 data->preconditionEdgeStars();
338 if(dim >= 2) {
340 }
341 if(dim == 2) {
342 data->preconditionCellEdges();
343 } else if(dim == 3) {
347 data->preconditionTriangles();
351 }
352 }
353 }
354
355 static inline void
356 clearCache(const AbstractTriangulation &triangulation) {
357 triangulation.gradientCache_.clear();
358 }
359
363 inline void setLocalGradient() {
364 this->gradient_ = &this->localGradient_;
365 }
366
377 inline void setInputOffsets(const SimplexId *const data) {
378 inputOffsets_ = data;
379 }
380
384 int getDimensionality() const;
385
390 int getNumberOfDimensions() const;
391
395 template <typename triangulationType>
396 SimplexId getNumberOfCells(const int dimension,
397 const triangulationType &triangulation) const;
398
402 template <typename triangulationType>
403 bool isBoundary(const Cell &cell,
404 const triangulationType &triangulation) const;
405
410 bool isCellCritical(const int cellDim, const SimplexId cellId) const;
411 bool isCellCritical(const Cell &cell) const;
412
417 template <typename triangulationType>
418 SimplexId getPairedCell(const Cell &cell,
419 const triangulationType &triangulation,
420 bool isReverse = false) const;
421
425 template <typename triangulationType>
426 int getAscendingPath(const Cell &cell,
427 std::vector<Cell> &vpath,
428 const triangulationType &triangulation,
429 const bool enableCycleDetector = false) const;
430
434 template <typename triangulationType>
435 int getDescendingPath(const Cell &cell,
436 std::vector<Cell> &vpath,
437 const triangulationType &triangulation) const;
438
443 template <typename triangulationType>
444 bool getDescendingPathThroughWall(const Cell &saddle2,
445 const Cell &saddle1,
446 const std::vector<bool> &isVisited,
447 std::vector<Cell> *const vpath,
448 const triangulationType &triangulation,
449 const bool stopIfMultiConnected = false,
450 const bool enableCycleDetector
451 = false) const;
452
457 template <typename triangulationType>
458 bool getAscendingPathThroughWall(const Cell &saddle1,
459 const Cell &saddle2,
460 const std::vector<bool> &isVisited,
461 std::vector<Cell> *const vpath,
462 const triangulationType &triangulation,
463 const bool stopIfMultiConnected = false,
464 const bool enableCycleDetector = false,
465 bool *const cycleFound = nullptr) const;
466
471 template <typename triangulationType>
472 bool detectGradientCycle(const Cell &cell,
473 const triangulationType &triangulation) const;
474
478 template <typename triangulationType>
479 int getDescendingWall(const Cell &cell,
480 VisitedMask &mask,
481 const triangulationType &triangulation,
482 std::vector<Cell> *const wall = nullptr,
483 std::vector<SimplexId> *const saddles
484 = nullptr) const;
485
489 template <typename triangulationType>
490 int getAscendingWall(const Cell &cell,
491 VisitedMask &mask,
492 const triangulationType &triangulation,
493 std::vector<Cell> *const wall = nullptr,
494 std::vector<SimplexId> *const saddles
495 = nullptr) const;
496
501 template <typename triangulationType>
504 const triangulationType &triangulation) const;
505
510 template <typename triangulationType>
513 const triangulationType &triangulation) const;
514
523 template <typename triangulationType>
525 const std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
526 std::vector<std::array<float, 3>> &points,
527 std::vector<char> &cellDimensions,
528 std::vector<SimplexId> &cellIds,
529 std::vector<char> &isOnBoundary,
530 std::vector<SimplexId> &PLVertexIdentifiers,
531 const triangulationType &triangulation) const;
532
537 template <typename triangulationType>
538 int setCriticalPoints(std::vector<std::array<float, 3>> &points,
539 std::vector<char> &cellDimensions,
540 std::vector<SimplexId> &cellIds,
541 std::vector<char> &isOnBoundary,
542 std::vector<SimplexId> &PLVertexIdentifiers,
543 const triangulationType &triangulation) const;
544
548 template <typename triangulationType>
550 std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
551 const triangulationType &triangulation) const;
552
556 template <typename triangulationType>
557 int getCriticalPoints(std::vector<Cell> &criticalPoints,
558 const triangulationType &triangulation) const;
559
560#ifdef TTK_ENABLE_MPI
564 void setCellToGhost(const int cellDim, const SimplexId cellId);
565
566#endif
570 int setManifoldSize(
571 const std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
572 const SimplexId *const ascendingManifold,
573 const SimplexId *const descendingManifold,
574 std::vector<SimplexId> &manifoldSize) const;
575
579 template <typename triangulationType>
580 int setGradientGlyphs(std::vector<std::array<float, 3>> &points,
581 std::vector<char> &points_pairOrigins,
582 std::vector<char> &cells_pairTypes,
583 std::vector<SimplexId> &cellsIds,
584 std::vector<char> &cellsDimensions,
585 const triangulationType &triangulation) const;
586
591 CriticalType criticalTypeFromCellDimension(const int dim) const;
592
593 private:
597 using lowerStarType = std::array<std::vector<CellExt>, 4>;
598
608 template <typename triangulationType>
609 inline void lowerStar(lowerStarType &ls,
610 const SimplexId a,
611 const SimplexId *const offsets,
612 const triangulationType &triangulation) const;
613
623 template <typename triangulationType>
624 inline void lowerStarWithMask(lowerStarType &ls,
625 const SimplexId a,
626 const SimplexId *const offsets,
627 const triangulationType &triangulation,
628 const std::vector<bool> *updateMask
629 = nullptr) const;
630
640 std::pair<size_t, SimplexId>
641 numUnpairedFaces(const CellExt &c, const lowerStarType &ls) const;
642 std::pair<size_t, SimplexId>
643 numUnpairedFacesTriangle(const CellExt &c,
644 const lowerStarType &ls) const;
645 std::pair<size_t, SimplexId>
646 numUnpairedFacesTetra(const CellExt &c, const lowerStarType &ls) const;
647
654 template <typename triangulationType>
655 inline void pairCells(CellExt &alpha,
656 CellExt &beta,
657 const triangulationType &triangulation);
658
665 template <typename triangulationType>
666 int processLowerStars(const SimplexId *const offsets,
667 const triangulationType &triangulation);
668
675 template <typename triangulationType>
676 int processLowerStarsWithMask(const SimplexId *const offsets,
677 const triangulationType &triangulation,
678 const std::vector<bool> *updateMask
679 = nullptr);
680
681 template <typename dataType, typename triangulationType>
682 int processLowerStarsStochastic(const SimplexId *const offsets,
683 const triangulationType &triangulation);
684
685 template <typename triangulationType>
686 void buildStencil(const SimplexId &x,
687 const std::array<float, 3> xCoords,
688 const triangulationType &triangulation,
689 std::vector<SimplexId> &stencilIds,
690 std::vector<float> &stencilLength);
691
696 void computeDerivatives(
697 const SimplexId &x,
698 const std::vector<SimplexId> &stencilIds,
699 const std::array<float, 3> &xCoords,
700 const std::vector<std::array<float, 3>> &stencilCoords,
701 double (&grad)[3]);
702
706 void initMemory(const AbstractTriangulation &triangulation);
707
711
712 template <typename dataType, typename triangulationType>
713 int getRemovableSaddles1(
714 const std::vector<std::pair<SimplexId, char>> &criticalPoints,
715 const bool allowBoundary,
716 std::vector<char> &isRemovableSaddle,
717 std::vector<SimplexId> &pl2dmt_saddle,
718 const triangulationType &triangulation);
719
723
724 template <typename dataType, typename triangulationType>
725 int getRemovableSaddles2(
726 const std::vector<std::pair<SimplexId, char>> &criticalPoints,
727 const bool allowBoundary,
728 std::vector<char> &isRemovableSaddle,
729 std::vector<SimplexId> &pl2dmt_saddle,
730 const triangulationType &triangulation);
731
737 template <typename dataType, typename triangulationType>
738 int initializeSaddleSaddleConnections1(
739 const std::vector<char> &isRemovableSaddle1,
740 const std::vector<char> &isRemovableSaddle2,
741 const bool allowBruteForce,
742 std::vector<VPath> &vpaths,
743 std::vector<CriticalPoint> &criticalPoints,
744 std::vector<SimplexId> &saddle1Index,
745 std::vector<SimplexId> &saddle2Index,
746 const triangulationType &triangulation) const;
747
753
754 template <typename dataType, typename triangulationType>
755 int initializeSaddleSaddleConnections2(
756 const std::vector<char> &isRemovableSaddle1,
757 const std::vector<char> &isRemovableSaddle2,
758 const bool allowBruteForce,
759 std::vector<VPath> &vpaths,
760 std::vector<CriticalPoint> &criticalPoints,
761 std::vector<SimplexId> &saddle1Index,
762 std::vector<SimplexId> &saddle2Index,
763 const triangulationType &triangulation) const;
764
768
769 template <typename dataType>
770 int orderSaddleSaddleConnections1(
771 const std::vector<VPath> &vpaths,
772 std::vector<CriticalPoint> &criticalPoints,
773 std::set<std::tuple<dataType, SimplexId, SimplexId>,
775
779
780 template <typename dataType>
781 int orderSaddleSaddleConnections2(
782 const std::vector<VPath> &vpaths,
783 std::vector<CriticalPoint> &criticalPoints,
784 std::set<std::tuple<dataType, SimplexId, SimplexId>,
786
791 template <typename dataType, typename triangulationType>
792 int processSaddleSaddleConnections1(
793 const int iterationThreshold,
794 const std::vector<char> &isPL,
795 const bool allowBoundary,
796 const bool allowBruteForce,
797 const bool returnSaddleConnectors,
798 std::set<std::tuple<dataType, SimplexId, SimplexId>,
800 std::vector<SimplexId> &pl2dmt_saddle1,
801 std::vector<SimplexId> &pl2dmt_saddle2,
802 std::vector<char> &isRemovableSaddle1,
803 std::vector<char> &isRemovableSaddle2,
804 std::vector<VPath> &vpaths,
805 std::vector<CriticalPoint> &criticalPoints,
806 std::vector<SimplexId> &saddle1Index,
807 std::vector<SimplexId> &saddle2Index,
808 const triangulationType &triangulation);
809
814
815 template <typename dataType, typename triangulationType>
816 int processSaddleSaddleConnections2(
817 const int iterationThreshold,
818 const std::vector<char> &isPL,
819 const bool allowBoundary,
820 const bool allowBruteForce,
821 const bool returnSaddleConnectors,
822 std::set<std::tuple<dataType, SimplexId, SimplexId>,
824 std::vector<SimplexId> &pl2dmt_saddle1,
825 std::vector<SimplexId> &pl2dmt_saddle2,
826 std::vector<char> &isRemovableSaddle1,
827 std::vector<char> &isRemovableSaddle2,
828 std::vector<VPath> &vpaths,
829 std::vector<CriticalPoint> &criticalPoints,
830 std::vector<SimplexId> &saddle1Index,
831 std::vector<SimplexId> &saddle2Index,
832 const triangulationType &triangulation);
833
834 public:
838 template <typename dataType, typename triangulationType>
839 dataType getPersistence(const Cell &up,
840 const Cell &down,
841 const dataType *const scalars,
842 const triangulationType &triangulation) const;
843
848 bool isMinimum(const Cell &cell) const;
849
854 bool isSaddle1(const Cell &cell) const;
855
860 bool isSaddle2(const Cell &cell) const;
861
866 bool isMaximum(const Cell &cell) const;
867
871 template <typename triangulationType>
872 int reverseAscendingPath(const std::vector<Cell> &vpath,
873 const triangulationType &triangulation) const;
874
878 template <typename triangulationType>
879 int reverseDescendingPath(const std::vector<Cell> &vpath,
880 const triangulationType &triangulation) const;
881
885 template <typename triangulationType>
886 int reverseAscendingPathOnWall(const std::vector<Cell> &vpath,
887 const triangulationType &triangulation,
888 bool cancelReversal = false) const;
889
893 template <typename triangulationType>
895 const std::vector<Cell> &vpath,
896 const triangulationType &triangulation) const;
897
902 const std::vector<std::pair<SimplexId, char>> &criticalPoints,
903 std::vector<char> &isPL);
904
909 template <typename dataType, typename triangulationType>
911 const std::vector<std::pair<SimplexId, char>> &criticalPoints,
912 const std::vector<char> &isPL,
913 const int iterationThreshold,
914 const bool allowBoundary,
915 const bool allowBruteForce,
916 const bool returnSaddleConnectors,
917 const triangulationType &triangulation);
918
923 template <typename dataType, typename triangulationType>
925 const std::vector<std::pair<SimplexId, char>> &criticalPoints,
926 const std::vector<char> &isPL,
927 const int iterationThreshold,
928 const bool allowBoundary,
929 const bool allowBruteForce,
930 const bool returnSaddleConnectors,
931 const triangulationType &triangulation);
932
933 template <typename dataType, typename triangulationType>
934 int filterSaddleConnectors(const bool allowBoundary,
935 const triangulationType &triangulation);
936
937 protected:
944 unsigned int Seed{};
945 unsigned int OldSeed{};
948 // spare storage (bypass cache) for gradient internal structure
950 // cache key (scalar field pointer + timestamp)
952 // pointer to either cache entry corresponding to inputScalarField_ or
953 // localGradient_ (if cache is bypassed)
956 };
957
958 } // namespace dcg
959} // namespace ttk
960
AbstractTriangulation is an interface class that defines an interface for efficient traversal methods...
std::pair< const void *, size_t > gradientKeyType
Key type for gradientCacheType.
virtual int getDimensionality() const
std::array< std::vector< gradIdType >, 6 > gradientType
Discrete gradient internal struct.
void setDebugMsgPrefix(const std::string &prefix)
Definition Debug.h:364
void clear()
Definition Cache.h:38
int getCriticalPointMap(const std::vector< std::pair< SimplexId, char > > &criticalPoints, std::vector< char > &isPL)
SimplexId getCellLowerVertex(const Cell c, const triangulationType &triangulation) const
int reverseAscendingPath(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
bool isMinimum(const Cell &cell) const
void setInputOffsets(const SimplexId *const data)
int reverseDescendingPath(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int setGradientGlyphs(std::vector< std::array< float, 3 > > &points, std::vector< char > &points_pairOrigins, std::vector< char > &cells_pairTypes, std::vector< SimplexId > &cellsIds, std::vector< char > &cellsDimensions, const triangulationType &triangulation) const
int reverseAscendingPathOnWall(const std::vector< Cell > &vpath, const triangulationType &triangulation, bool cancelReversal=false) const
bool getDescendingPathThroughWall(const Cell &saddle2, const Cell &saddle1, const std::vector< bool > &isVisited, std::vector< Cell > *const vpath, const triangulationType &triangulation, const bool stopIfMultiConnected=false, const bool enableCycleDetector=false) const
bool isSaddle1(const Cell &cell) const
bool isMaximum(const Cell &cell) const
void setSaddleConnectorsPersistenceThreshold(double threshold)
bool isSaddle2(const Cell &cell) const
AbstractTriangulation::gradientKeyType inputScalarField_
int setManifoldSize(const std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, const SimplexId *const ascendingManifold, const SimplexId *const descendingManifold, std::vector< SimplexId > &manifoldSize) const
int simplifySaddleSaddleConnections1(const std::vector< std::pair< SimplexId, char > > &criticalPoints, const std::vector< char > &isPL, const int iterationThreshold, const bool allowBoundary, const bool allowBruteForce, const bool returnSaddleConnectors, const triangulationType &triangulation)
void setInputScalarField(const void *const data, const size_t mTime)
SimplexId getNumberOfCells(const int dimension, const triangulationType &triangulation) const
void setLocalGradient()
Use local storage instead of cache.
bool isBoundary(const Cell &cell, const triangulationType &triangulation) const
bool isCellCritical(const int cellDim, const SimplexId cellId) const
SimplexId getPairedCell(const Cell &cell, const triangulationType &triangulation, bool isReverse=false) const
int getAscendingWall(const Cell &cell, VisitedMask &mask, const triangulationType &triangulation, std::vector< Cell > *const wall=nullptr, std::vector< SimplexId > *const saddles=nullptr) const
int reverseDescendingPathOnWall(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int filterSaddleConnectors(const bool allowBoundary, const triangulationType &triangulation)
SimplexId getCellGreaterVertex(const Cell c, const triangulationType &triangulation) const
int getCriticalPoints(std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, const triangulationType &triangulation) const
static void clearCache(const AbstractTriangulation &triangulation)
bool getAscendingPathThroughWall(const Cell &saddle1, const Cell &saddle2, const std::vector< bool > &isVisited, std::vector< Cell > *const vpath, const triangulationType &triangulation, const bool stopIfMultiConnected=false, const bool enableCycleDetector=false, bool *const cycleFound=nullptr) const
CriticalType criticalTypeFromCellDimension(const int dim) const
Return the critical type corresponding to given dimension.
void preconditionTriangulation(AbstractTriangulation *const data)
dataType getPersistence(const Cell &up, const Cell &down, const dataType *const scalars, const triangulationType &triangulation) const
int setCriticalPoints(const std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, std::vector< std::array< float, 3 > > &points, std::vector< char > &cellDimensions, std::vector< SimplexId > &cellIds, std::vector< char > &isOnBoundary, std::vector< SimplexId > &PLVertexIdentifiers, const triangulationType &triangulation) const
int getDescendingPath(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation) const
int simplifySaddleSaddleConnections2(const std::vector< std::pair< SimplexId, char > > &criticalPoints, const std::vector< char > &isPL, const int iterationThreshold, const bool allowBoundary, const bool allowBruteForce, const bool returnSaddleConnectors, const triangulationType &triangulation)
int buildGradient(const triangulationType &triangulation, bool bypassCache=false, const std::vector< bool > *updateMask=nullptr)
bool detectGradientCycle(const Cell &cell, const triangulationType &triangulation) const
int getAscendingPath(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation, const bool enableCycleDetector=false) const
AbstractTriangulation::gradientType localGradient_
void setSeed(const unsigned int &newSeed)
int getDescendingWall(const Cell &cell, VisitedMask &mask, const triangulationType &triangulation, std::vector< Cell > *const wall=nullptr, std::vector< SimplexId > *const saddles=nullptr) const
void setBackend(const BACKEND newBackend)
AbstractTriangulation::gradientType * gradient_
const SimplexId * inputOffsets_
void setReturnSaddleConnectors(const bool &returnSaddleConnectors)
TTK base package defining the standard types.
int SimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:22
CriticalType
default value for critical index
Definition DataTypes.h:88
CellExt(const int dim, const SimplexId id)
Cell()=default
Auto-cleaning re-usable graph propagations data structure.
Definition VisitedMask.h:27
Extended Cell structure for processLowerStars.
CellExt(const int dim, const SimplexId id, const std::array< SimplexId, 3 > &lowVerts, const std::array< uint8_t, 3 > &faces)
CellExt(const int dim, const SimplexId id)
const std::array< SimplexId, 3 > lowVerts_
const std::array< uint8_t, 3 > faces_
std::string to_string() const
bool operator==(const Cell &other) const
Cell(const int dim, const SimplexId id)
Cell()=default
CriticalPoint(const Cell &cell, const std::vector< SimplexId > &vpaths)
CriticalPoint(const Cell &cell)
CriticalPoint(const Cell &cell, std::vector< SimplexId > &&vpaths)
std::vector< SimplexId > vpaths_
bool operator()(const std::tuple< dataType, SimplexId, SimplexId > &v1, const std::tuple< dataType, SimplexId, SimplexId > &v2) const
VPath(const bool isValid, std::vector< char > &&states, std::vector< SimplexId > &&segments, const SimplexId source, const SimplexId destination, const SimplexId sourceSlot, const SimplexId destinationSlot, const double persistence)
VPath(const bool isValid, const std::vector< char > &states, const std::vector< SimplexId > &segments, const SimplexId source, const SimplexId destination, const SimplexId sourceSlot, const SimplexId destinationSlot, const double persistence)
SimplexId destinationSlot_
std::vector< SimplexId > segments_
VPath(const bool isValid, const SimplexId segmentId, const SimplexId source, const SimplexId destination, const SimplexId sourceSlot, const SimplexId destinationSlot, const double persistence)
VPath()=default
std::vector< char > states_