TTK
Loading...
Searching...
No Matches
MergeTreeDistanceMatrix.h
Go to the documentation of this file.
1
16
17#pragma once
18
19// ttk common includes
20#include <Debug.h>
21
23#include <FTMTree.h>
24#include <FTMTreeUtils.h>
25#include <MergeTreeBase.h>
26#include <MergeTreeDistance.h>
27#include <PathMappingDistance.h>
28
29namespace ttk {
30
35 class MergeTreeDistanceMatrix : virtual public Debug,
36 virtual public MergeTreeBase {
37 protected:
38 int baseModule_ = 0;
40 int pathMetric_ = 0;
41
42 public:
45 "MergeTreeDistanceMatrix"); // inherited from Debug: prefix will be
46 // printed at the
47 // beginning of every msg
48 }
49 ~MergeTreeDistanceMatrix() override = default;
50
51 void setBaseModule(int m) {
52 baseModule_ = m;
53 }
54
55 void setBranchMetric(int m) {
56 branchMetric_ = m;
57 }
58
59 void setPathMetric(int m) {
60 pathMetric_ = m;
61 }
62
66 template <class dataType>
67 void execute(std::vector<ftm::MergeTree<dataType>> &trees,
68 std::vector<ftm::MergeTree<dataType>> &trees2,
69 std::vector<std::vector<double>> &distanceMatrix) {
70 executePara<dataType>(trees, distanceMatrix);
71 if(trees2.size() != 0) {
72 useDoubleInput_ = true;
73 std::vector<std::vector<double>> distanceMatrix2(
74 trees2.size(), std::vector<double>(trees2.size()));
75 executePara<dataType>(trees2, distanceMatrix2, false);
76 mixDistancesMatrix(distanceMatrix, distanceMatrix2);
77 }
78 }
79
80 template <class dataType>
81 void execute(std::vector<ftm::MergeTree<dataType>> &ftmtrees,
82 std::vector<std::vector<double>> &distanceMatrix) {
83 for(unsigned int i = 0; i < distanceMatrix.size(); ++i) {
84 if(i % std::max(int(distanceMatrix.size() / 10), 1) == 0) {
85 std::stringstream stream;
86 stream << i << " / " << distanceMatrix.size();
87 printMsg(stream.str());
88 }
89
90 BranchMappingDistance branchDist;
91 branchDist.setBaseMetric(branchMetric_);
93 branchDist.setSquared(not distanceSquaredRoot_);
94 PathMappingDistance pathDist;
95 pathDist.setBaseMetric(pathMetric_);
97 pathDist.setSquared(not distanceSquaredRoot_);
98 pathDist.setComputeMapping(true);
99
100 distanceMatrix[i][i] = 0.0;
101 // compareTrees(trees[i],&(ftmtrees[i].tree));
102 for(unsigned int j = i + 1; j < distanceMatrix[0].size(); ++j) {
103 // Execute
104 if(baseModule_ == 0) {
105 distanceMatrix[i][j] = 0;
106 } else if(baseModule_ == 1) {
107 dataType dist = branchDist.editDistance_branch<dataType>(
108 &(ftmtrees[i].tree), &(ftmtrees[j].tree));
109 distanceMatrix[i][j] = static_cast<double>(dist);
110 } else if(baseModule_ == 2) {
111 dataType dist = pathDist.editDistance_path<dataType>(
112 &(ftmtrees[i].tree), &(ftmtrees[j].tree));
113 distanceMatrix[i][j] = static_cast<double>(dist);
114 }
115 // distance matrix is symmetric
116 distanceMatrix[j][i] = distanceMatrix[i][j];
117 } // end for j
118 } // end for i
119 }
120
121 template <class dataType>
122 void executePara(std::vector<ftm::MergeTree<dataType>> &trees,
123 std::vector<std::vector<double>> &distanceMatrix,
124 bool isFirstInput = true) {
125#ifdef TTK_ENABLE_OPENMP
126#pragma omp parallel num_threads(this->threadNumber_)
127 {
128#pragma omp single nowait
129#endif
130 executeParaImpl<dataType>(trees, distanceMatrix, isFirstInput);
131#ifdef TTK_ENABLE_OPENMP
132#pragma omp taskwait
133 } // pragma omp parallel
134#endif
135 }
136
137 template <class dataType>
139 std::vector<std::vector<double>> &distanceMatrix,
140 bool isFirstInput = true) {
141 for(unsigned int i = 0; i < distanceMatrix.size(); ++i) {
142#ifdef TTK_ENABLE_OPENMP
143#pragma omp task firstprivate(i) UNTIED() shared(distanceMatrix, trees)
144 {
145#endif
146 if(i % std::max(int(distanceMatrix.size() / 10), 1) == 0) {
147 std::stringstream stream;
148 stream << i << " / " << distanceMatrix.size();
149 printMsg(stream.str());
150 }
151 distanceMatrix[i][i] = 0.0;
152 for(unsigned int j = i + 1; j < distanceMatrix[0].size(); ++j) {
153 // Execute
154 if(baseModule_ == 0) {
155 MergeTreeDistance mergeTreeDistance;
156 mergeTreeDistance.setAssignmentSolver(assignmentSolverID_);
157 mergeTreeDistance.setEpsilonTree1(epsilonTree1_);
158 mergeTreeDistance.setEpsilonTree2(epsilonTree2_);
159 mergeTreeDistance.setEpsilon2Tree1(epsilon2Tree1_);
160 mergeTreeDistance.setEpsilon2Tree2(epsilon2Tree2_);
161 mergeTreeDistance.setEpsilon3Tree1(epsilon3Tree1_);
162 mergeTreeDistance.setEpsilon3Tree2(epsilon3Tree2_);
164 mergeTreeDistance.setParallelize(parallelize_);
166 mergeTreeDistance.setDebugLevel(std::min(debugLevel_, 2));
167 mergeTreeDistance.setThreadNumber(this->threadNumber_);
168 mergeTreeDistance.setNormalizedWasserstein(
170 mergeTreeDistance.setKeepSubtree(keepSubtree_);
172 mergeTreeDistance.setUseMinMaxPair(useMinMaxPair_);
173 mergeTreeDistance.setSaveTree(true);
174 mergeTreeDistance.setCleanTree(true);
175 mergeTreeDistance.setIsCalled(true);
176 mergeTreeDistance.setPostprocess(false);
178 if(useDoubleInput_) {
179 double const weight
180 = mixDistancesMinMaxPairWeight(isFirstInput);
181 mergeTreeDistance.setMinMaxPairWeight(weight);
182 mergeTreeDistance.setDistanceSquaredRoot(true);
183 }
184 std::vector<std::tuple<ftm::idNode, ftm::idNode>> outputMatching;
185 distanceMatrix[i][j] = mergeTreeDistance.execute<dataType>(
186 trees[i], trees[j], outputMatching);
187 } else {
188 distanceMatrix[i][j] = 0;
189 }
190 // distance matrix is symmetric
191 distanceMatrix[j][i] = distanceMatrix[i][j];
192 } // end for j
193#ifdef TTK_ENABLE_OPENMP
194 } // end task
195#endif
196 } // end for i
197 }
198
199 }; // MergeTreeDistanceMatrix class
200
201} // namespace ttk
virtual int setThreadNumber(const int threadNumber)
Definition BaseClass.h:80
dataType editDistance_branch(ftm::FTMTree_MT *tree1, ftm::FTMTree_MT *tree2)
void setAssignmentSolver(int assignmentSolver)
Minimalist debugging class.
Definition Debug.h:88
int debugLevel_
Definition Debug.h:379
void setDebugMsgPrefix(const std::string &prefix)
Definition Debug.h:364
virtual int setDebugLevel(const int &debugLevel)
Definition Debug.cpp:147
void setBranchDecomposition(bool useBD)
void setNormalizedWasserstein(bool normalizedWasserstein)
void setDistanceSquaredRoot(bool distanceSquaredRoot)
void setEpsilon3Tree1(double epsilon)
void setEpsilonTree1(double epsilon)
void setAssignmentSolver(int assignmentSolver)
void setEpsilon2Tree1(double epsilon)
void setEpsilonTree2(double epsilon)
void setPersistenceThreshold(double pt)
void setCleanTree(bool clean)
void setEpsilon2Tree2(double epsilon)
void setKeepSubtree(bool keepSubtree)
void setUseMinMaxPair(bool useMinMaxPair)
void setEpsilon3Tree2(double epsilon)
double mixDistancesMinMaxPairWeight(bool isFirstInput)
void setParallelize(bool para)
void setIsPersistenceDiagram(bool isPD)
void mixDistancesMatrix(std::vector< std::vector< dataType > > &distanceMatrix, std::vector< std::vector< dataType > > &distanceMatrix2)
void executePara(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< double > > &distanceMatrix, bool isFirstInput=true)
void execute(std::vector< ftm::MergeTree< dataType > > &ftmtrees, std::vector< std::vector< double > > &distanceMatrix)
void executeParaImpl(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< double > > &distanceMatrix, bool isFirstInput=true)
void execute(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< ftm::MergeTree< dataType > > &trees2, std::vector< std::vector< double > > &distanceMatrix)
~MergeTreeDistanceMatrix() override=default
void setPostprocess(bool postproc)
void setSaveTree(bool save)
void setMinMaxPairWeight(double weight)
dataType execute(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &outputMatching)
void setAssignmentSolver(int assignmentSolver)
dataType editDistance_path(ftm::FTMTree_MT *tree1, ftm::FTMTree_MT *tree2)
The Topology ToolKit.
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/|__ _|"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)