TTK
Loading...
Searching...
No Matches
RipsPersistenceDiagramUtils.h
Go to the documentation of this file.
1
4
5#pragma once
6
7#include <array>
8#include <vector>
9
10#include <boost/dynamic_bitset.hpp>
11
12namespace ttk::rpd {
13 using id_t = int;
14 using value_t = double;
15 constexpr value_t inf = std::numeric_limits<value_t>::infinity();
16
17 using PointCloud = std::vector<std::vector<value_t>>;
18
19 using Simplex = std::vector<id_t>;
20 using FiltratedSimplex = std::pair<Simplex, value_t>;
21 using PersistencePair = std::pair<FiltratedSimplex, FiltratedSimplex>;
22 using Diagram = std::vector<PersistencePair>;
23 using MultidimensionalDiagram = std::vector<Diagram>;
24
25 using Edge = std::pair<id_t, id_t>;
26 using EdgeSet = std::vector<Edge>;
27 using EdgeSets3 = std::array<EdgeSet, 3>;
28 using EdgeSets4 = std::array<EdgeSet, 4>;
31
32 using Facet = std::array<id_t, 3>;
33 using Generator1 = std::pair<std::vector<Edge>, std::pair<value_t, value_t>>;
34 using Generator2 = std::pair<std::vector<Facet>, std::pair<value_t, value_t>>;
35
40 inline FiltratedEdge max(const FiltratedEdge &a, const FiltratedEdge &b) {
41 if(a.d > b.d)
42 return a;
43 return b;
44 }
45
48 int f1;
49 int f2;
51 };
52
54 std::tuple<id_t, id_t, id_t> t;
56 };
57
58 inline bool operator<(const FiltratedEdge &e1, const FiltratedEdge &e2) {
59 if(e1.d == e2.d)
60 return e1.e < e2.e;
61 return e1.d < e2.d;
62 }
63
64 inline bool operator<(const FiltratedTriangle &f1,
65 const FiltratedTriangle &f2) {
66 if(f1.d == f2.d)
67 return f1.t < f2.t;
68 return f1.d < f2.d;
69 }
70
71 class UnionFind {
72 private:
73 std::vector<int> parent_;
74 std::vector<unsigned char> rank_;
75
76 public:
77 explicit UnionFind(unsigned n);
78 int find(int x);
79 void merge(int x, int y);
80 int mergeRet(int x, int y);
81 [[nodiscard]] bool isRoot(int x) const;
82 };
83
85 public:
86 BoundaryContainer(std::vector<id_t> &simplices, unsigned size)
87 : ids_(simplices) {
88 mask_.resize(size, false);
89 for(id_t const &id : ids_)
90 mask_[id] = true;
91 }
92 void exclusiveAddBoundary(std::vector<id_t> const &boundary) {
93 for(id_t const &id : boundary) {
94 if(!mask_[id])
95 ids_.emplace_back(id);
96 else
97 ids_.erase(std::find(ids_.begin(), ids_.end(), id));
98 mask_.flip(id);
99 }
100 }
101
102 private:
103 std::vector<id_t> &ids_;
104 boost::dynamic_bitset<> mask_;
105 };
106
107} // namespace ttk::rpd
void exclusiveAddBoundary(std::vector< id_t > const &boundary)
BoundaryContainer(std::vector< id_t > &simplices, unsigned size)
FiltratedEdge max(const FiltratedEdge &a, const FiltratedEdge &b)
std::pair< id_t, id_t > Edge
std::array< EdgeSet, 4 > EdgeSets4
std::array< id_t, 3 > Facet
std::pair< FiltratedSimplex, FiltratedSimplex > PersistencePair
constexpr value_t inf
std::vector< std::vector< value_t > > PointCloud
bool operator<(const FiltratedEdge &e1, const FiltratedEdge &e2)
std::vector< Edge > EdgeSet
std::vector< Diagram > MultidimensionalDiagram
std::pair< std::vector< Edge >, std::pair< value_t, value_t > > Generator1
std::pair< Simplex, value_t > FiltratedSimplex
std::array< EdgeSet, 3 > EdgeSets3
std::pair< std::vector< Facet >, std::pair< value_t, value_t > > Generator2
std::vector< PersistencePair > Diagram
std::vector< id_t > Simplex
std::tuple< id_t, id_t, id_t > t