TTK
Loading...
Searching...
No Matches
MergeTreeAxesAlgorithmBase.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <Geometry.h>
15#include <MergeTreeBarycenter.h>
16#include <MergeTreeBase.h>
17#include <MergeTreeDistance.h>
18#include <MergeTreeUtils.h>
19#include <Statistics.h>
20
21#define ENERGY_COMPARISON_TOLERANCE 1e-6
22
23namespace ttk {
24
25 class MergeTreeAxesAlgorithmBase : virtual public Debug,
26 public MergeTreeBase {
27
28 protected:
29 bool deterministic_ = true;
30 unsigned int numberOfAxes_ = 2;
31 unsigned int k_ = 16;
34
35 // Clean correspondence
36 std::vector<std::vector<int>> trees2NodeCorr_;
37
38 public:
41 "MergeTreeAxesAlgorithmBase"); // inherited from Debug: prefix will
42 // be printed at the beginning of
43 // every msg
44 }
45
46 //----------------------------------------------------------------------------
47 // Setter
48 //----------------------------------------------------------------------------
49 void setDeterministic(const bool deterministic);
50
51 void setNumberOfProjectionSteps(const unsigned int k);
52
53 void setBarycenterSizeLimitPercent(const double barycenterSizeLimitPercent);
54
55 void setProbabilisticVectorsInit(const bool probabilisticVectorsInit);
56
57 //----------------------------------------------------------------------------
58 // Matching / Distance
59 //----------------------------------------------------------------------------
60 template <class dataType>
62 const ftm::MergeTree<dataType> &tree1,
63 const ftm::MergeTree<dataType> &tree2,
64 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> &matching,
65 dataType &distance,
66 bool isCalled = false,
67 bool useDoubleInput = false,
68 bool isFirstInput = true) {
69 MergeTreeDistance mergeTreeDistance;
70 mergeTreeDistance.setDebugLevel(std::min(debugLevel_, 2));
71 mergeTreeDistance.setPreprocess(false);
72 mergeTreeDistance.setPostprocess(false);
73 mergeTreeDistance.setBranchDecomposition(true);
75 mergeTreeDistance.setKeepSubtree(false);
77 mergeTreeDistance.setIsCalled(isCalled);
78 mergeTreeDistance.setThreadNumber(this->threadNumber_);
79 mergeTreeDistance.setDistanceSquaredRoot(true); // squared root
80 mergeTreeDistance.setNodePerTask(nodePerTask_);
81 if(useDoubleInput) {
82 double const weight = mixDistancesMinMaxPairWeight(isFirstInput);
83 mergeTreeDistance.setMinMaxPairWeight(weight);
84 }
85 distance = mergeTreeDistance.computeDistance<dataType>(
86 &(tree1.tree), &(tree2.tree), matching);
87 }
88
89 template <class dataType>
91 const ftm::MergeTree<dataType> &tree2,
92 dataType &distance,
93 bool isCalled = false,
94 bool useDoubleInput = false,
95 bool isFirstInput = true) {
96 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching;
97 computeOneDistance<dataType>(tree1, tree2, matching, distance, isCalled,
98 useDoubleInput, isFirstInput);
99 }
100
101 //----------------------------------------------------------------------------
102 // Init
103 //----------------------------------------------------------------------------
104 template <class dataType>
106 ftm::MergeTree<dataType> &barycenter,
108 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> &matching,
109 std::vector<std::vector<double>> &v) {
110 ftm::FTMTree_MT *barycenterTree = &(barycenter.tree);
111 ftm::FTMTree_MT *treeTree = &(tree.tree);
112
113 std::vector<ftm::idNode> matchingVector;
115 barycenter, tree, matching, matchingVector);
116
117 v.resize(barycenter.tree.getNumberOfNodes(), std::vector<double>(2, 0));
118 for(unsigned int j = 0; j < barycenter.tree.getNumberOfNodes(); ++j) {
119 if(barycenter.tree.isNodeAlone(j))
120 continue;
121 auto birthDeathBary
122 = getParametrizedBirthDeath<dataType>(barycenterTree, j);
123 std::tuple<dataType, dataType> birthDeath;
124 if(matchingVector[j] != std::numeric_limits<ftm::idNode>::max()) {
125 birthDeath
126 = getParametrizedBirthDeath<dataType>(treeTree, matchingVector[j]);
127 } else {
128 dataType projec
129 = (std::get<0>(birthDeathBary) + std::get<1>(birthDeathBary)) / 2.0;
130 birthDeath = std::make_tuple(projec, projec);
131 }
132 v[j][0] = std::get<0>(birthDeath) - std::get<0>(birthDeathBary);
133 v[j][1] = std::get<1>(birthDeath) - std::get<1>(birthDeathBary);
134 }
135 }
136
137 template <class dataType>
139 std::vector<std::vector<double>> &v,
140 std::vector<std::vector<std::vector<double>>> &vS,
141 std::vector<std::vector<std::vector<double>>> &v2s) {
142 // Get average norm of the previous vectors
143 std::vector<std::vector<double>> sumVs;
145 double newNorm = 0;
146 for(auto &sumVi : sumVs)
147 newNorm += ttk::Geometry::magnitude(sumVi) / sumVs.size();
148
149 // Generate random vector
150 v.resize(barycenter.tree.getNumberOfNodes(), std::vector<double>(2, 0));
151 for(unsigned int i = 0; i < barycenter.tree.getNumberOfNodes(); ++i) {
152 if(barycenter.tree.isNodeAlone(i))
153 continue;
154 v[i][0] = (double)rand() / RAND_MAX * newNorm * 2 - newNorm;
155 v[i][1] = (double)rand() / RAND_MAX * newNorm * 2 - newNorm;
156 }
157
158 // Change the norm of the random vector to be the average norm
159 double const normV = ttk::Geometry::magnitudeFlatten(v);
160 for(unsigned int i = 0; i < barycenter.tree.getNumberOfNodes(); ++i) {
161 if(barycenter.tree.isNodeAlone(i))
162 continue;
163 v[i][0] = v[i][0] / normV * newNorm;
164 v[i][1] = v[i][1] / normV * newNorm;
165 }
166 }
167
168 template <class dataType, typename F>
170 int axeNumber,
171 ftm::MergeTree<dataType> &barycenter,
172 std::vector<ftm::MergeTree<dataType>> &trees,
173 ftm::MergeTree<dataType> &barycenter2,
174 std::vector<ftm::MergeTree<dataType>> &trees2,
175 std::vector<std::vector<double>> &v1,
176 std::vector<std::vector<double>> &v2,
177 std::vector<std::vector<double>> &trees2V1,
178 std::vector<std::vector<double>> &trees2V2,
179 int newVectorOffset,
180 std::vector<double> &inputToOriginDistances,
181 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
182 &baryMatchings,
183 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
184 &baryMatchings2,
185 std::vector<std::vector<double>> &inputToAxesDistances,
186 std::vector<std::vector<std::vector<double>>> &vS,
187 std::vector<std::vector<std::vector<double>>> &v2s,
188 std::vector<std::vector<std::vector<double>>> &trees2Vs,
189 std::vector<std::vector<std::vector<double>>> &trees2V2s,
190 bool projectInitializedVectors,
191 F initializedVectorsProjection) {
192
193 bool doOffset = (newVectorOffset != 0);
194 // Get best distance, best matching and best index
195 dataType bestDistance = std::numeric_limits<dataType>::lowest();
196 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> bestMatching,
197 bestMatching2;
198 std::vector<std::tuple<double, unsigned int>> distancesAndIndexes(
199 trees.size());
200 int bestIndex = -1;
201 for(unsigned int i = 0; i < trees.size(); ++i) {
202 dataType distance = 0.0, distance2 = 0.0;
203 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching,
204 matching2;
205 if(axeNumber == 0) {
206 if(inputToOriginDistances.size() == 0) {
208 barycenter, trees[i], matching, distance, false, useDoubleInput_);
209 if(trees2.size() != 0) {
210 computeOneDistance<dataType>(barycenter2, trees2[i], matching2,
211 distance2, false, useDoubleInput_,
212 false);
213 distance = mixDistances(distance, distance2);
214 }
215 } else {
216 distance = inputToOriginDistances[i];
217 matching = baryMatchings[i];
218 if(trees2.size() != 0)
219 matching2 = baryMatchings2[i];
220 }
221 } else {
222 for(unsigned j = 0; j < inputToAxesDistances.size(); ++j)
223 distance += inputToAxesDistances[j][i];
224 distancesAndIndexes[i] = std::make_tuple(distance, i);
225 }
226 if(distance > bestDistance) {
227 bestDistance = distance;
228 bestMatching = matching;
229 bestMatching2 = matching2;
230 bestIndex = i;
231 }
232 }
233
234 // Sort all distances and their respective indexes
235 std::vector<double> scores;
236 std::random_device rd;
237 std::default_random_engine generator(deterministic_ ? 0 : rd());
238 if(axeNumber != 0) {
240 scores.resize(distancesAndIndexes.size());
241 for(unsigned int i = 0; i < distancesAndIndexes.size(); ++i)
242 scores[i] = std::get<0>(distancesAndIndexes[i]);
243 } else
244 std::sort(distancesAndIndexes.begin(), distancesAndIndexes.end(),
245 [](const std::tuple<double, unsigned int> &a,
246 const std::tuple<double, unsigned int> &b) -> bool {
247 return (std::get<0>(a) > std::get<0>(b));
248 });
249 }
250
251 // Init vectors according farthest input
252 // (repeat with the ith farthest until projection gives non null vector)
253 unsigned int i = 0;
254 bool foundGoodIndex = false;
255 while(not foundGoodIndex) {
256 // Get matching of the ith farthest input
257 if(bestIndex >= 0 and bestIndex < (int)trees.size()) {
258 if(axeNumber != 0) {
259 if(baryMatchings.size() == 0
260 and (baryMatchings.size() == 0 or trees2.size() == 0)) {
261 dataType distance;
262 computeOneDistance<dataType>(barycenter, trees[bestIndex],
263 bestMatching, distance, false,
265 if(trees2.size() != 0)
266 computeOneDistance<dataType>(barycenter2, trees2[bestIndex],
267 bestMatching2, distance, false,
268 useDoubleInput_, false);
269 } else {
270 bestMatching = baryMatchings[bestIndex];
271 if(trees2.size() != 0)
272 bestMatching2 = baryMatchings2[bestIndex];
273 }
274 }
275
276 // Init vectors from matching
278 barycenter, trees[bestIndex], bestMatching, v1);
279 v2 = v1;
280 if(trees2.size() != 0) {
282 barycenter2, trees2[bestIndex], bestMatching2, trees2V1);
283 trees2V2 = trees2V1;
284 }
285 } else {
286 initRandomVector(barycenter, v1, vS, v2s);
287 v2 = v1;
288 if(trees2.size() != 0) {
289 initRandomVector(barycenter2, trees2V1, trees2Vs, trees2V2s);
290 trees2V2 = trees2V1;
291 }
292 }
293
294 // Project initialized vectors to satisfy constraints
295 if(projectInitializedVectors) {
296 initializedVectorsProjection(
297 axeNumber, barycenter, v1, v2, vS, v2s, barycenter2, trees2V1,
298 trees2V2, trees2Vs, trees2V2s, (trees2.size() != 0), 1);
299 }
300
301 // Check if the initialized vectors are good
302 foundGoodIndex
303 = (axeNumber == 0 or not ttk::Geometry::isVectorNullFlatten(v1));
304
305 // Init next bestIndex
306 if(not foundGoodIndex) {
307 i += 1;
308 if(i >= distancesAndIndexes.size())
309 bestIndex = -1;
311 scores[bestIndex] = 0;
312 std::discrete_distribution<int> distribution(
313 scores.begin(), scores.end());
314 bestIndex = distribution(generator);
315 } else
316 bestIndex = std::get<1>(distancesAndIndexes[i]);
317 }
318
319 // If newVector jump to the next valid bestIndex
320 if(foundGoodIndex and doOffset and bestIndex >= 0) {
321 bestIndex += newVectorOffset;
322 if(bestIndex >= (int)trees.size())
323 bestIndex = -1;
324 foundGoodIndex = false;
325 doOffset = false;
326 }
327 }
328 return bestIndex;
329 }
330
331 //----------------------------------------------------------------------------
332 // Barycenter
333 //----------------------------------------------------------------------------
334 template <class dataType>
336 std::vector<ftm::MergeTree<dataType>> &trees,
337 ftm::MergeTree<dataType> &baryMergeTree,
338 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
339 &matchings,
340 std::vector<double> &finalDistances,
341 double barycenterSizeLimitPercent,
342 unsigned int barycenterMaximumNumberOfPairs,
343 int barycenterInitIndex,
344 bool oneIter,
345 bool useDoubleInput = false,
346 bool isFirstInput = true) {
347 MergeTreeBarycenter mergeTreeBary;
348 mergeTreeBary.setDebugLevel(std::min(debugLevel_, 2));
349 mergeTreeBary.setPreprocess(false);
350 mergeTreeBary.setPostprocess(false);
351 mergeTreeBary.setBranchDecomposition(true);
353 mergeTreeBary.setKeepSubtree(false);
355 mergeTreeBary.setThreadNumber(this->threadNumber_);
356 mergeTreeBary.setDeterministic(deterministic_);
358 mergeTreeBary.setBarycenterSizeLimitPercent(barycenterSizeLimitPercent);
360 barycenterMaximumNumberOfPairs);
361 mergeTreeBary.setBarycenterInitIndex(barycenterInitIndex);
362 if(oneIter)
363 mergeTreeBary.setBarycenterMaxIter(1);
364
365 matchings.resize(trees.size());
366 mergeTreeBary.execute<dataType>(
367 trees, matchings, baryMergeTree, useDoubleInput, isFirstInput);
368 finalDistances = mergeTreeBary.getFinalDistances();
369 }
370
371 template <class dataType>
373 std::vector<ftm::MergeTree<dataType>> &trees,
374 ftm::MergeTree<dataType> &baryMergeTree,
375 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
376 &matchings,
377 std::vector<double> &finalDistances,
378 double barycenterSizeLimitPercent,
379 unsigned int barycenterMaximumNumberOfPairs,
380 bool useDoubleInput = false,
381 bool isFirstInput = true) {
382 computeOneBarycenter(trees, baryMergeTree, matchings, finalDistances,
383 barycenterSizeLimitPercent,
384 barycenterMaximumNumberOfPairs, -1, false,
385 useDoubleInput, isFirstInput);
386 }
387
388 template <class dataType>
390 std::vector<ftm::MergeTree<dataType>> &trees,
391 ftm::MergeTree<dataType> &baryMergeTree,
392 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
393 &matchings,
394 std::vector<double> &finalDistances,
395 double barycenterSizeLimitPercent,
396 bool useDoubleInput = false,
397 bool isFirstInput = true) {
398 unsigned int const barycenterMaximumNumberOfPairs = 0;
399 computeOneBarycenter(trees, baryMergeTree, matchings, finalDistances,
400 barycenterSizeLimitPercent,
401 barycenterMaximumNumberOfPairs, useDoubleInput,
402 isFirstInput);
403 }
404
405 template <class dataType>
407 std::vector<ftm::MergeTree<dataType>> &trees,
408 ftm::MergeTree<dataType> &baryMergeTree,
409 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
410 &matchings,
411 std::vector<double> &finalDistances,
412 bool useDoubleInput = false,
413 bool isFirstInput = true) {
414 computeOneBarycenter(trees, baryMergeTree, matchings, finalDistances,
415 barycenterSizeLimitPercent_, useDoubleInput,
416 isFirstInput);
417 }
418
419 template <class dataType>
421 std::vector<ftm::MergeTree<dataType>> &trees,
422 ftm::MergeTree<dataType> &baryMergeTree,
423 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
424 &matchings) {
425 std::vector<double> finalDistances;
427 trees, baryMergeTree, matchings, finalDistances);
428 }
429
430 template <class dataType>
432 ftm::MergeTree<dataType> &baryMergeTree) {
433 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
434 matchings;
435 computeOneBarycenter<dataType>(trees, baryMergeTree, matchings);
436 }
437
438 //----------------------------------------------------------------------------
439 // Preprocessing
440 //----------------------------------------------------------------------------
441 template <class dataType>
443 std::vector<std::vector<int>> &nodeCorr,
444 bool useMinMaxPairT = true) {
445 nodeCorr.resize(trees.size());
446#ifdef TTK_ENABLE_OPENMP
447#pragma omp parallel for schedule(dynamic) num_threads(this->threadNumber_)
448#endif
449 for(unsigned int i = 0; i < trees.size(); ++i) {
452 branchDecomposition_, useMinMaxPairT, cleanTree_, nodeCorr[i]);
453 if(trees.size() < 40)
454 printTreeStats(trees[i]);
455 }
456 if(trees.size() != 0)
457 printTreesStats(trees);
458 }
459
460 template <class dataType>
462 bool useMinMaxPairT = true) {
463 std::vector<std::vector<int>> nodeCorr(trees.size());
464 preprocessingTrees(trees, nodeCorr, useMinMaxPairT);
465 }
466
467 //----------------------------------------------------------------------------
468 // Utils
469 //----------------------------------------------------------------------------
470 template <class dataType>
471 std::tuple<dataType, dataType>
476
477 //----------------------------------------------------------------------------
478 // Utils
479 //----------------------------------------------------------------------------
480 template <class dataType>
482 const ftm::MergeTree<dataType> &barycenter,
483 std::vector<ftm::MergeTree<dataType>> &trees,
484 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
485 &baryMatchings,
486 std::vector<std::vector<double>> &allTs,
487 std::vector<std::vector<double>> &branchesCorrelationMatrix,
488 std::vector<std::vector<double>> &persCorrelationMatrix) {
489 branchesCorrelationMatrix.resize(barycenter.tree.getNumberOfNodes(),
490 std::vector<double>(allTs.size(), 0.0));
491 persCorrelationMatrix = branchesCorrelationMatrix;
492
493 // m[i][j] contains the node in trees[j] matched to the node i in the
494 // barycenter
495 std::vector<std::vector<ftm::idNode>> matchingMatrix;
497 barycenter, trees, baryMatchings, matchingMatrix);
498
499 std::queue<ftm::idNode> queue;
500 queue.emplace(barycenter.tree.getRoot());
501 while(!queue.empty()) {
502 ftm::idNode node = queue.front();
503 queue.pop();
504
505 // Get births and deaths array
506 std::vector<double> births(trees.size(), 0.0),
507 deaths(trees.size(), 0.0), pers(trees.size(), 0.0);
508 for(unsigned int i = 0; i < trees.size(); ++i) {
509 auto matched = matchingMatrix[node][i];
510 std::tuple<dataType, dataType> birthDeath;
511 if(matched == std::numeric_limits<ftm::idNode>::max()) {
512 birthDeath = barycenter.tree.template getBirthDeath<dataType>(node);
513 auto projec
514 = (std::get<0>(birthDeath) + std::get<1>(birthDeath)) / 2.0;
515 birthDeath = std::make_tuple(projec, projec);
516 } else
517 birthDeath
518 = trees[i].tree.template getBirthDeath<dataType>(matched);
519 births[i] = std::get<0>(birthDeath);
520 deaths[i] = std::get<1>(birthDeath);
521 pers[i] = deaths[i] - births[i];
522 }
523
524 // Compute correlations
525 for(unsigned int g = 0; g < allTs.size(); ++g) {
526 double birthCorr = ttk::Statistics::corr(births, allTs[g]);
527 double deathCorr = ttk::Statistics::corr(deaths, allTs[g]);
528 double persCorr = ttk::Statistics::corr(pers, allTs[g]);
529
530 if(std::isnan(birthCorr))
531 birthCorr = 0.0;
532 if(std::isnan(deathCorr))
533 deathCorr = 0.0;
534 if(std::isnan(persCorr))
535 persCorr = 0.0;
536
537 auto birthDeathNode
538 = barycenter.tree.template getBirthDeathNode<dataType>(node);
539 auto birthNode = std::get<0>(birthDeathNode);
540 auto deathNode = std::get<1>(birthDeathNode);
541 branchesCorrelationMatrix[birthNode][g] = birthCorr;
542 branchesCorrelationMatrix[deathNode][g] = deathCorr;
543 persCorrelationMatrix[birthNode][g] = persCorr;
544 persCorrelationMatrix[deathNode][g] = persCorr;
545 }
546
547 // Push children to the queue
548 std::vector<ftm::idNode> children;
549 barycenter.tree.getChildren(node, children);
550 for(auto child : children)
551 queue.emplace(child);
552 }
553 }
554 }; // MergeTreeAxesAlgorithmBase class
555
556} // namespace ttk
virtual int setThreadNumber(const int threadNumber)
Definition BaseClass.h:80
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
std::vector< std::vector< int > > trees2NodeCorr_
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings)
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< double > &finalDistances, double barycenterSizeLimitPercent, unsigned int barycenterMaximumNumberOfPairs, bool useDoubleInput=false, bool isFirstInput=true)
std::tuple< dataType, dataType > getParametrizedBirthDeath(ftm::FTMTree_MT *tree, ftm::idNode node)
void setNumberOfProjectionSteps(const unsigned int k)
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< double > &finalDistances, double barycenterSizeLimitPercent, unsigned int barycenterMaximumNumberOfPairs, int barycenterInitIndex, bool oneIter, bool useDoubleInput=false, bool isFirstInput=true)
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< double > &finalDistances, double barycenterSizeLimitPercent, bool useDoubleInput=false, bool isFirstInput=true)
void setBarycenterSizeLimitPercent(const double barycenterSizeLimitPercent)
void computeOneDistance(const ftm::MergeTree< dataType > &tree1, const ftm::MergeTree< dataType > &tree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &matching, dataType &distance, bool isCalled=false, bool useDoubleInput=false, bool isFirstInput=true)
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< double > &finalDistances, bool useDoubleInput=false, bool isFirstInput=true)
void computeOneBarycenter(std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &baryMergeTree)
void preprocessingTrees(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< int > > &nodeCorr, bool useMinMaxPairT=true)
void setDeterministic(const bool deterministic)
void computeBranchesCorrelationMatrix(const ftm::MergeTree< dataType > &barycenter, std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &baryMatchings, std::vector< std::vector< double > > &allTs, std::vector< std::vector< double > > &branchesCorrelationMatrix, std::vector< std::vector< double > > &persCorrelationMatrix)
void computeOneDistance(const ftm::MergeTree< dataType > &tree1, const ftm::MergeTree< dataType > &tree2, dataType &distance, bool isCalled=false, bool useDoubleInput=false, bool isFirstInput=true)
void setProbabilisticVectorsInit(const bool probabilisticVectorsInit)
void initRandomVector(ftm::MergeTree< dataType > &barycenter, std::vector< std::vector< double > > &v, std::vector< std::vector< std::vector< double > > > &vS, std::vector< std::vector< std::vector< double > > > &v2s)
int initVectors(int axeNumber, ftm::MergeTree< dataType > &barycenter, std::vector< ftm::MergeTree< dataType > > &trees, ftm::MergeTree< dataType > &barycenter2, std::vector< ftm::MergeTree< dataType > > &trees2, std::vector< std::vector< double > > &v1, std::vector< std::vector< double > > &v2, std::vector< std::vector< double > > &trees2V1, std::vector< std::vector< double > > &trees2V2, int newVectorOffset, std::vector< double > &inputToOriginDistances, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &baryMatchings, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &baryMatchings2, std::vector< std::vector< double > > &inputToAxesDistances, std::vector< std::vector< std::vector< double > > > &vS, std::vector< std::vector< std::vector< double > > > &v2s, std::vector< std::vector< std::vector< double > > > &trees2Vs, std::vector< std::vector< std::vector< double > > > &trees2V2s, bool projectInitializedVectors, F initializedVectorsProjection)
void preprocessingTrees(std::vector< ftm::MergeTree< dataType > > &trees, bool useMinMaxPairT=true)
void initVectorFromMatching(ftm::MergeTree< dataType > &barycenter, ftm::MergeTree< dataType > &tree, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &matching, std::vector< std::vector< double > > &v)
void setBarycenterMaxIter(int barycenterMaxIter)
void setPreprocess(bool preproc)
void setPostprocess(bool postproc)
void setBarycenterInitIndex(int barycenterInitIndex)
void setDeterministic(bool deterministicT)
void setBarycenterMaximumNumberOfPairs(unsigned int maxi)
void setBarycenterSizeLimitPercent(double percent)
std::vector< double > getFinalDistances()
void execute(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< double > &alphas, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &finalMatchings, ftm::MergeTree< dataType > &baryMergeTree, bool finalAsgnDoubleInput=false, bool finalAsgnFirstInput=true)
void setBranchDecomposition(bool useBD)
void setNormalizedWasserstein(bool normalizedWasserstein)
void setDistanceSquaredRoot(bool distanceSquaredRoot)
void setAssignmentSolver(int assignmentSolver)
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)
void setNodePerTask(int npt)
double mixDistances(dataType distance1, dataType distance2)
void printTreesStats(std::vector< ftm::FTMTree_MT * > &trees)
void setKeepSubtree(bool keepSubtree)
double mixDistancesMinMaxPairWeight(bool isFirstInput)
void setIsPersistenceDiagram(bool isPD)
void setPreprocess(bool preproc)
void setPostprocess(bool postproc)
void setMinMaxPairWeight(double weight)
dataType computeDistance(const ftm::FTMTree_MT *tree1, const ftm::FTMTree_MT *tree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &outputMatching)
void getChildren(idNode nodeId, std::vector< idNode > &res) const
idNode getNumberOfNodes() const
Definition FTMTree_MT.h:389
idNode getRoot() const
bool isNodeAlone(idNode nodeId) const
bool isVectorNullFlatten(const std::vector< std::vector< T > > &a)
Definition Geometry.cpp:735
T magnitudeFlatten(const std::vector< std::vector< T > > &v)
Definition Geometry.cpp:519
T magnitude(const T *v, const int &dimension=3)
Definition Geometry.cpp:509
int multiAddVectorsFlatten(const std::vector< std::vector< std::vector< T > > > &a, const std::vector< std::vector< std::vector< T > > > &b, std::vector< std::vector< T > > &out)
Definition Geometry.cpp:635
T corr(const T *v1, const T *v2, const int &dimension1=3, const int &dimension2=3)
void getMatchingMatrix(const ftm::MergeTree< dataType > &barycenter, std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< std::vector< ftm::idNode > > &matchingMatrix)
void getMatchingVector(const ftm::MergeTree< dataType > &barycenter, const ftm::MergeTree< dataType > &tree, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &matchings, std::vector< ftm::idNode > &matchingVector)
unsigned int idNode
Node index in vect_nodes_.
TTK base package defining the standard types.
std::tuple< dataType, dataType > getParametrizedBirthDeath(ftm::FTMTree_MT *tree, ftm::idNode node, bool normalize)
ftm::FTMTree_MT tree
Definition FTMTree_MT.h:906