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 weight = mixDistancesMinMaxPairWeight(isFirstInput);
180 mergeTreeDistance.setMinMaxPairWeight(weight);
181 mergeTreeDistance.setDistanceSquaredRoot(true);
182 }
183 std::vector<std::tuple<ftm::idNode, ftm::idNode>> outputMatching;
184 distanceMatrix[i][j] = mergeTreeDistance.execute<dataType>(
185 trees[i], trees[j], outputMatching);
186 } else {
187 distanceMatrix[i][j] = 0;
188 }
189 // distance matrix is symmetric
190 distanceMatrix[j][i] = distanceMatrix[i][j];
191 } // end for j
192#ifdef TTK_ENABLE_OPENMP
193 } // end task
194#endif
195 } // end for i
196 }
197
198 }; // MergeTreeDistanceMatrix class
199
200} // namespace ttk
int threadNumber_
Definition: BaseClass.h:95
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
int printMsg(const std::string &msg, const debug::Priority &priority=debug::Priority::INFO, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cout) const
Definition: Debug.h:118
void setBranchDecomposition(bool useBD)
void setNormalizedWasserstein(bool normalizedWasserstein)
void setDistanceSquaredRoot(bool distanceSquaredRoot)
void setEpsilon3Tree1(double epsilon)
Definition: MergeTreeBase.h:93
void setEpsilonTree1(double epsilon)
Definition: MergeTreeBase.h:77
void setAssignmentSolver(int assignmentSolver)
Definition: MergeTreeBase.h:69
void setEpsilon2Tree1(double epsilon)
Definition: MergeTreeBase.h:85
void setEpsilonTree2(double epsilon)
Definition: MergeTreeBase.h:81
void setPersistenceThreshold(double pt)
void setCleanTree(bool clean)
void setEpsilon2Tree2(double epsilon)
Definition: MergeTreeBase.h:89
void setKeepSubtree(bool keepSubtree)
double persistenceThreshold_
Definition: MergeTreeBase.h:34
void setUseMinMaxPair(bool useMinMaxPair)
void setEpsilon3Tree2(double epsilon)
Definition: MergeTreeBase.h:97
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.