TTK
Loading...
Searching...
No Matches
MergeTreeTemporalReductionDecoding.h
Go to the documentation of this file.
1
15
26#pragma once
27
28// ttk common includes
29#include <Debug.h>
30
31#include <FTMTreeUtils.h>
32#include <MergeTreeBarycenter.h>
33#include <MergeTreeBase.h>
34#include <MergeTreeDistance.h>
35#include <PathMappingDistance.h>
36
37namespace ttk {
38
44 public MergeTreeBase {
45 protected:
47 bool usePathMappings_ = false;
48
49 public:
51
52 void setPathMappings(bool usePM) {
53 usePathMappings_ = usePM;
54 }
55
56 template <class dataType>
60 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> &matching) {
61
63 PathMappingDistance mergeTreeDistance;
65 mergeTreeDistance.setEpsilonTree1(epsilonTree1_);
66 mergeTreeDistance.setEpsilonTree2(epsilonTree2_);
68 mergeTreeDistance.setThreadNumber(this->threadNumber_);
69 mergeTreeDistance.setDistanceSquaredRoot(false); // squared root
70 mergeTreeDistance.setDebugLevel(2);
71 mergeTreeDistance.setPreprocess(false);
72 mergeTreeDistance.setComputeMapping(true);
73
74 ftm::FTMTree_MT *mt1 = &(mTree1.tree);
75 ftm::FTMTree_MT *mt2 = &(mTree2.tree);
76 dataType distance
77 = mergeTreeDistance.computeDistance<dataType>(mt1, mt2, &matching);
78
79 return distance;
80 } else {
81 MergeTreeDistance mergeTreeDistance;
83 mergeTreeDistance.setEpsilonTree1(epsilonTree1_);
84 mergeTreeDistance.setEpsilonTree2(epsilonTree2_);
85 mergeTreeDistance.setEpsilon2Tree1(epsilon2Tree1_);
86 mergeTreeDistance.setEpsilon2Tree2(epsilon2Tree2_);
87 mergeTreeDistance.setEpsilon3Tree1(epsilon3Tree1_);
88 mergeTreeDistance.setEpsilon3Tree2(epsilon3Tree2_);
89 // mergeTreeDistance.setProgressiveComputation(progressiveComputation_);
91 mergeTreeDistance.setParallelize(parallelize_);
94 // mergeTreeDistance.setNormalizedWassersteinReg(normalizedWassersteinReg_);
95 // mergeTreeDistance.setRescaledWasserstein(rescaledWasserstein_);
96 mergeTreeDistance.setKeepSubtree(keepSubtree_);
97 mergeTreeDistance.setUseMinMaxPair(useMinMaxPair_);
98 mergeTreeDistance.setThreadNumber(this->threadNumber_);
99 mergeTreeDistance.setDistanceSquaredRoot(true); // squared root
100 mergeTreeDistance.setDebugLevel(2);
101 mergeTreeDistance.setPreprocess(false);
102 mergeTreeDistance.setPostprocess(false);
103 // mergeTreeDistance.setIsCalled(true);
104
105 dataType distance
106 = mergeTreeDistance.execute<dataType>(mTree1, mTree2, matching);
107
108 return distance;
109 }
110 }
111
112 template <class dataType>
114 ftm::MergeTree<dataType> &mTree2) {
115 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching;
116 return computeDistance<dataType>(mTree1, mTree2, matching);
117 }
118
119 template <class dataType>
122 double alpha) {
123 MergeTreeBarycenter mergeTreeBarycenter;
124 mergeTreeBarycenter.setAssignmentSolver(assignmentSolverID_);
125 mergeTreeBarycenter.setEpsilonTree1(epsilonTree1_);
126 mergeTreeBarycenter.setEpsilonTree2(epsilonTree2_);
127 mergeTreeBarycenter.setEpsilon2Tree1(epsilon2Tree1_);
128 mergeTreeBarycenter.setEpsilon2Tree2(epsilon2Tree2_);
129 mergeTreeBarycenter.setEpsilon3Tree1(epsilon3Tree1_);
130 mergeTreeBarycenter.setEpsilon3Tree2(epsilon3Tree2_);
131 mergeTreeBarycenter.setBranchDecomposition(branchDecomposition_);
132 mergeTreeBarycenter.setParallelize(parallelize_);
134 mergeTreeBarycenter.setKeepSubtree(keepSubtree_);
135 mergeTreeBarycenter.setUseMinMaxPair(useMinMaxPair_);
136 mergeTreeBarycenter.setThreadNumber(this->threadNumber_);
137 mergeTreeBarycenter.setAlpha(alpha);
138 mergeTreeBarycenter.setDebugLevel(2);
139 mergeTreeBarycenter.setPreprocess(false);
140 mergeTreeBarycenter.setPostprocess(false);
141 // mergeTreeBarycenter.setIsCalled(true);
142
143 if(usePathMappings_) {
144 mergeTreeBarycenter.setBaseModule(2);
145 mergeTreeBarycenter.setBranchDecomposition(false);
146 mergeTreeBarycenter.setNormalizedWasserstein(false);
147 mergeTreeBarycenter.setKeepSubtree(false);
148 mergeTreeBarycenter.setUseMinMaxPair(false);
149 mergeTreeBarycenter.setAddNodes(false);
150 mergeTreeBarycenter.setPostprocess(false);
151 } else {
152 mergeTreeBarycenter.setBranchDecomposition(true);
154 // mergeTreeBarycenter.setNormalizedWassersteinReg(normalizedWassersteinReg_);
155 // mergeTreeBarycenter.setRescaledWasserstein(rescaledWasserstein_);
156 }
157
158 std::vector<ftm::MergeTree<dataType>> intermediateTrees;
159 intermediateTrees.push_back(mTree1);
160 intermediateTrees.push_back(mTree2);
161 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
162 outputMatchingBarycenter(2);
163 ftm::MergeTree<dataType> barycenter;
164 mergeTreeBarycenter.execute<dataType>(
165 intermediateTrees, outputMatchingBarycenter, barycenter);
166 return barycenter;
167 }
168
169 template <class dataType>
171 std::vector<ftm::MergeTree<dataType>> &mTrees,
172 std::vector<std::tuple<double, int, int, int, int>> &coefs,
173 std::vector<ftm::MergeTree<dataType>> &allMT,
174 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
175 &allMatching) {
176 Timer t_tempSub;
177
178 // --- Preprocessing
179 // if(!usePathMappings_){
180 // treesNodeCorr_ = std::vector<std::vector<int>>(mTrees.size());
181 // for(unsigned int i = 0; i < mTrees.size(); ++i) {
182 // preprocessingPipeline<dataType>(
183 // mTrees[i], epsilonTree2_, epsilon2Tree2_, epsilon3Tree2_,
184 // branchDecomposition_, useMinMaxPair_, cleanTree_,
185 // treesNodeCorr_[i]);
186 // }
187 // printTreesStats<dataType>(mTrees);
188 // }
189 treesNodeCorr_ = std::vector<std::vector<int>>(mTrees.size());
190 for(unsigned int i = 0; i < mTrees.size(); ++i) {
194 true, usePathMappings_);
195 }
197
198 // if(usePathMappings_){
199 // treesNodeCorr_ = std::vector<std::vector<int>>(mTrees.size());
200 // printMsg("uses path mapping distance");
201 // for(unsigned int i = 0; i < mTrees.size(); ++i) {
202 // ftm::FTMTree_MT *tree = &(mTrees[i].tree);
203 // preprocessTree<dataType>(tree, true);
204
205 // // - Delete null persistence pairs and persistence thresholding
206 // persistenceThresholding<dataType>(tree, persistenceThreshold_);
207
208 // // - Merge saddle points according epsilon
209 // if(not isPersistenceDiagram_) {
210 // if(epsilonTree2_ != 0){
211 // std::vector<std::vector<ftm::idNode>> treeNodeMerged(
212 // tree->getNumberOfNodes() ); mergeSaddle<dataType>(tree,
213 // epsilonTree2_, treeNodeMerged); for(unsigned int j=0;
214 // j<treeNodeMerged.size(); j++){
215 // for(auto k : treeNodeMerged[j]){
216 // auto nodeToDelete = tree->getNode(j)->getOrigin();
217 // tree->getNode(k)->setOrigin(j);
218 // tree->getNode(nodeToDelete)->setOrigin(-1);
219 // }
220 // }
221 // ftm::cleanMergeTree<dataType>(mTrees[i], treesNodeCorr_[i],
222 // true);
223 // }
224 // else{
225 // std::vector<ttk::SimplexId>
226 // nodeCorri(tree->getNumberOfNodes()); for(unsigned int j=0;
227 // j<nodeCorri.size(); j++) nodeCorri[j] = j; treesNodeCorr_[i] =
228 // nodeCorri;
229 // }
230 // }
231 // if(deleteMultiPersPairs_)
232 // deleteMultiPersPairs<dataType>(tree, false);
233 // }
234 // }
235
236 // --- Execute
237 distancesToKeyFrames_ = std::vector<double>(coefs.size() * 2);
238 int index = 0;
239 size_t cpt = 0;
240 while(cpt < coefs.size()) {
241 while(cpt < coefs.size() and std::get<2>(coefs[cpt]) <= index) {
242 double const alpha = std::get<0>(coefs[cpt]);
243 int const index1 = std::get<1>(coefs[cpt]);
244 int const index2 = std::get<2>(coefs[cpt]);
246 mTrees[index1], mTrees[index2], alpha);
247 allMT.push_back(tree);
248 distancesToKeyFrames_[cpt * 2]
249 = computeDistance<dataType>(mTrees[index1], tree);
250 distancesToKeyFrames_[cpt * 2 + 1]
251 = computeDistance<dataType>(tree, mTrees[index2]);
252 ++cpt;
253 }
254 allMT.push_back(mTrees[index]);
255 ++index;
256 }
257
258 allMatching = std::vector<
259 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>(allMT.size()
260 - 1);
261 finalDistances_ = std::vector<double>(allMT.size() - 1);
262 for(unsigned int i = 0; i < allMT.size() - 1; ++i)
264 = computeDistance<dataType>(allMT[i], allMT[i + 1], allMatching[i]);
265
266 // --- Postprocessing
267 if(!usePathMappings_) {
268 for(unsigned int i = 0; i < allMT.size(); ++i)
269 postprocessingPipeline<dataType>(&(allMT[i].tree));
270 for(unsigned int i = 0; i < mTrees.size(); ++i)
271 postprocessingPipeline<dataType>(&(mTrees[i].tree));
272 }
273
274 // --- Print results
275 std::stringstream ss, ss2, ss3;
276 ss << "input size = " << mTrees.size();
277 printMsg(ss.str());
278 ss2 << "output size = " << allMT.size();
279 printMsg(ss2.str());
280 ss3 << "reconstructed : " << allMT.size() - mTrees.size();
281 printMsg(ss3.str());
282 printMsg("Decoding", 1, t_tempSub.getElapsedTime(), this->threadNumber_);
283 }
284
285 }; // MergeTreeTemporalReductionDecoding class
286
287} // namespace ttk
virtual int setThreadNumber(const int threadNumber)
Definition BaseClass.h:80
virtual int setDebugLevel(const int &debugLevel)
Definition Debug.cpp:147
void setAddNodes(bool addNodesT)
void setPreprocess(bool preproc)
void setPostprocess(bool postproc)
void execute(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< double > &alphas, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &finalMatchings, std::vector< std::vector< std::pair< std::pair< ftm::idNode, ftm::idNode >, std::pair< ftm::idNode, ftm::idNode > > > > &finalMatchings_path, ftm::MergeTree< dataType > &baryMergeTree, bool finalAsgnDoubleInput=false, bool finalAsgnFirstInput=true)
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 preprocessingPipeline(ftm::MergeTree< dataType > &mTree, double epsilonTree, double epsilon2Tree, double epsilon3Tree, bool branchDecompositionT, bool useMinMaxPairT, bool cleanTreeT, double persistenceThreshold, std::vector< int > &nodeCorr, bool deleteInconsistentNodes=true, bool removeMergedSaddles=false)
void printTreesStats(std::vector< ftm::FTMTree_MT * > &trees)
void postprocessingPipeline(ftm::FTMTree_MT *tree)
std::vector< std::vector< int > > treesNodeCorr_
void setEpsilon2Tree2(double epsilon)
void setKeepSubtree(bool keepSubtree)
void setUseMinMaxPair(bool useMinMaxPair)
void setEpsilon3Tree2(double epsilon)
void setParallelize(bool para)
void setPreprocess(bool preproc)
void setPostprocess(bool postproc)
dataType execute(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &outputMatching)
dataType computeDistance(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2)
dataType computeDistance(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &matching)
void execute(std::vector< ftm::MergeTree< dataType > > &mTrees, std::vector< std::tuple< double, int, int, int, int > > &coefs, std::vector< ftm::MergeTree< dataType > > &allMT, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &allMatching)
ftm::MergeTree< dataType > computeBarycenter(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, double alpha)
void setAssignmentSolver(int assignmentSolver)
dataType computeDistance(ftm::FTMTree_MT *tree1, ftm::FTMTree_MT *tree2, std::vector< std::pair< std::pair< ftm::idNode, ftm::idNode >, std::pair< ftm::idNode, ftm::idNode > > > *outputMatching)
double getElapsedTime()
Definition Timer.h:15
TTK base package defining the standard types.
ftm::FTMTree_MT tree
Definition FTMTree_MT.h:906
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/| (_) |"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)