41#define treesMatchingVector \
42 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
43#define matchingVectorType std::vector<treesMatchingVector>
62 template <
class dataType2>
66 bool parallelizeUpdate_ =
true;
68 unsigned int noCentroids_ = 2;
71 int noIterationC_ = 0;
72 double addDeletedNodesTime_ = 0;
75 bool acceleratedInitialized_ =
false;
76 std::vector<std::vector<double>> lowerBound_;
77 std::vector<double> upperBound_;
78 std::vector<int> bestCentroid_, oldBestCentroid_;
79 std::vector<double> bestDistance_;
80 std::vector<bool> recompute_;
81 std::vector<ftm::MergeTree<dataType2>> oldCentroids_, oldCentroids2_;
84 std::vector<std::vector<int>> trees2NodeCorr_;
89 "MergeTreeClustering");
95 noCentroids_ = noCentroidsT;
103 return trees2NodeCorr_;
114 template <
class dataType>
116 std::vector<ftm::FTMTree_MT *> &trees,
117 std::vector<ftm::FTMTree_MT *> &trees2,
121 std::vector<dataType> distances(
122 trees.size(), std::numeric_limits<dataType>::max());
126 std::vector<ftm::MergeTree<dataType>> mTreesLimited, mTrees2Limited;
132 if(trees2.size() != 0)
134 limitPercent, mTrees2Limited);
138 for(
unsigned int i = 0; i < noCentroids_; ++i) {
142 trees, trees2, limitPercent,
false);
146 for(
auto val : distances)
148 double bestValue = std::numeric_limits<double>::lowest();
149 std::vector<double> probabilities(trees.size());
150 for(
unsigned int j = 0; j < distances.size(); ++j) {
152 = (sum != 0 ? distances[j] / sum : 1.0 / distances.size());
153 if(probabilities[j] > bestValue) {
154 bestValue = probabilities[j];
159 std::random_device rd;
160 std::default_random_engine generator(rd());
161 std::discrete_distribution<int> distribution(
162 probabilities.begin(), probabilities.end());
163 bestIndex = distribution(generator);
173 if(trees2.size() != 0) {
180 if(i == noCentroids_ - 1)
182#ifdef TTK_ENABLE_OPENMP44
183#pragma omp parallel for schedule(dynamic) shared(allCentroids) \
184 num_threads(this->threadNumber_) if(parallelize_)
186 for(
unsigned int j = 0; j < trees.size(); ++j) {
187 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching,
189 dataType distanceT, distanceT2;
191 = (doSizeLimit ? &(mTreesLimited[j].tree) : trees[j]);
194 if(trees2.size() != 0) {
196 = (doSizeLimit ? &(mTrees2Limited[j].tree) : trees2[j]);
202 distances[j] = std::min(distances[j], distanceT);
207 template <
class dataType>
211 std::vector<std::tuple<double, int>> distancesAndIndexes(
212 bestDistance_.size());
213 for(
unsigned int i = 0; i < bestDistance_.size(); ++i)
214 distancesAndIndexes[i] = std::make_tuple(-bestDistance_[i], i);
215 std::sort(distancesAndIndexes.begin(), distancesAndIndexes.end());
216 int const bestIndex = std::get<1>(distancesAndIndexes[noNewCentroid]);
223 template <
class dataType>
225 std::vector<ftm::FTMTree_MT *> &trees,
227 std::vector<ftm::FTMTree_MT *> &
ttkNotUsed(trees2)) {
230 trees.size(), std::vector<double>(centroids.size(), 0));
232 upperBound_.resize(trees.size(), std::numeric_limits<double>::max());
233 bestCentroid_.clear();
234 bestCentroid_.resize(trees.size(), -1);
235 oldBestCentroid_.clear();
236 oldBestCentroid_.resize(trees.size(), -1);
237 bestDistance_.clear();
238 bestDistance_.resize(trees.size(), std::numeric_limits<double>::max());
240 recompute_.resize(trees.size(),
true);
243 template <
class dataType>
247 std::vector<ftm::FTMTree_MT *> &trees2,
249 acceleratedInitialized_ =
true;
250 std::vector<std::tuple<int, int>> assignmentC;
251 std::vector<dataType> bestDistanceT(
252 trees.size(), std::numeric_limits<dataType>::max());
254 trees, centroids, assignmentC, bestDistanceT, trees2, centroids2);
255 for(
unsigned int i = 0; i < bestDistanceT.size(); ++i)
256 bestDistance_[i] = bestDistanceT[i];
257 for(
auto asgn : assignmentC)
258 bestCentroid_[std::get<1>(asgn)] = std::get<0>(asgn);
259 for(
unsigned int i = 0; i < bestDistance_.size(); ++i)
260 upperBound_[i] = bestDistance_[i];
263 template <
class dataType>
266 oldCentroids.clear();
267 for(
unsigned int i = 0; i < centroids.size(); ++i)
274 template <
class dataType>
276 std::vector<ftm::FTMTree_MT *> &trees,
278 std::vector<std::tuple<int, int>> &assignmentC,
279 std::vector<dataType> &bestDistanceT,
280 std::vector<ftm::FTMTree_MT *> &trees2,
282 if(not acceleratedInitialized_) {
286 std::vector<dataType> distanceShift(centroids.size()),
287 distanceShift2(centroids2.size());
288#ifdef TTK_ENABLE_OPENMP4
289#pragma omp parallel for schedule(dynamic) \
290 shared(centroids, centroids2, oldCentroids_, oldCentroids2_) \
291 num_threads(this->threadNumber_) if(parallelize_)
293 for(
unsigned int i = 0; i < centroids.size(); ++i) {
294 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching,
298 if(trees2.size() != 0) {
300 matching2, distanceShift2[i],
308 for(
unsigned int i = 0; i < trees.size(); ++i)
309 for(
unsigned int c = 0; c < centroids.size(); ++c)
311 = std::max(lowerBound_[i][c] - distanceShift[c], 0.0);
314 for(
unsigned int i = 0; i < trees.size(); ++i) {
315 upperBound_[i] = upperBound_[i] + distanceShift[bestCentroid_[i]];
316 recompute_[i] =
true;
321 std::vector<std::vector<double>> centroidsDistance, centroidsDistance2;
324 if(trees2.size() != 0) {
329 std::vector<double> centroidScore(
330 centroids.size(), std::numeric_limits<double>::max());
331 for(
unsigned int i = 0; i < centroids.size(); ++i)
332 for(
unsigned int j = i + 1; j < centroids.size(); ++j) {
333 if(0.5 * centroidsDistance[i][j] < centroidScore[i])
334 centroidScore[i] = 0.5 * centroidsDistance[i][j];
335 if(0.5 * centroidsDistance[i][j] < centroidScore[j])
336 centroidScore[j] = 0.5 * centroidsDistance[i][j];
340 std::vector<bool> identified(trees.size());
341 for(
unsigned int i = 0; i < trees.size(); ++i)
342 identified[i] = (upperBound_[i] <= centroidScore[bestCentroid_[i]]);
345#ifdef TTK_ENABLE_OPENMP4
346#pragma omp parallel for schedule(dynamic) shared(centroids, centroids2) \
347 num_threads(this->threadNumber_) if(parallelize_)
349 for(
unsigned int i = 0; i < trees.size(); ++i)
350 for(
unsigned int c = 0; c < centroids.size(); ++c) {
351 if(not identified[i] and (
int) c != bestCentroid_[i]
352 and upperBound_[i] > lowerBound_[i][c]
354 > 0.5 * centroidsDistance[bestCentroid_[i]][c]) {
357 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>
359 dataType distance, distance2;
361 centroids[bestCentroid_[i]],
363 if(trees2.size() != 0) {
365 trees2[i], centroids2[bestCentroid_[i]], matching2, distance2,
369 recompute_[i] =
false;
370 lowerBound_[i][bestCentroid_[i]] = distance;
371 upperBound_[i] = distance;
372 bestDistance_[i] = distance;
374 bestDistance_[i] = upperBound_[i];
377 if(bestDistance_[i] > lowerBound_[i][c]
379 > 0.5 * centroidsDistance[bestCentroid_[i]][c]) {
380 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>
382 dataType distance, distance2;
385 if(trees2.size() != 0) {
387 matching2, distance2,
391 lowerBound_[i][c] = distance;
392 if(distance < bestDistance_[i]) {
393 bestCentroid_[i] = c;
394 upperBound_[i] = distance;
395 bestDistance_[i] = distance;
403 if(trees2.size() != 0)
407 for(
unsigned int i = 0; i < bestDistance_.size(); ++i)
408 bestDistanceT[i] = bestDistance_[i];
409 for(
unsigned int i = 0; i < bestCentroid_.size(); ++i)
410 assignmentC.emplace_back(bestCentroid_[i], i);
413 template <
class dataType>
417 std::vector<std::tuple<int, int>> &assignmentC,
418 std::vector<dataType> &bestDistanceT,
419 std::vector<ftm::FTMTree_MT *> &trees2,
421 oldBestCentroid_ = bestCentroid_;
423 trees, centroids, assignmentC, bestDistanceT, trees2, centroids2);
426 template <
class dataType>
428 std::vector<ftm::FTMTree_MT *> &trees,
431 std::vector<std::tuple<int, int>> &assignmentC,
432 std::vector<dataType> &bestDistanceT,
433 std::vector<ftm::FTMTree_MT *> &trees2,
436 int noC = centroids.size();
437 std::vector<std::vector<ftm::FTMTree_MT *>> assignedTrees(noC),
439 std::vector<std::vector<int>> assignedTreesIndex(noC);
441 for(
auto asgn : assignmentC) {
442 assignedTreesIndex[std::get<0>(asgn)].push_back(std::get<1>(asgn));
443 assignedTrees[std::get<0>(asgn)].push_back(trees[std::get<1>(asgn)]);
444 if(trees2.size() != 0)
445 assignedTrees2[std::get<0>(asgn)].push_back(
446 trees2[std::get<1>(asgn)]);
449#ifdef TTK_ENABLE_OPENMP4
450#pragma omp parallel for schedule(dynamic) shared(centroids, centroids2) \
451 num_threads(this->threadNumber_) if(parallelize_)
453 for(
unsigned int i = 0; i < centroids.size(); ++i) {
454 std::vector<dataType> distances(assignedTrees[i].size(), 0);
455 std::vector<dataType> distances2(assignedTrees[i].size(), 0);
457 std::vector<std::vector<std::pair<std::pair<ftm::idNode, ftm::idNode>,
458 std::pair<ftm::idNode, ftm::idNode>>>>
459 matching_path(trees.size());
462 assignedTrees[i], centroids[i], matching, matching_path, distances);
463 matchingsC[i] = matching;
467 matchingsC[i] = matching;
468 if(trees2.size() != 0) {
472 matchingsC2[i] = matching2;
473 for(
unsigned int j = 0; j < assignedTreesIndex[i].size(); ++j)
478 for(
unsigned int j = 0; j < assignedTreesIndex[i].size(); ++j) {
479 int const index = assignedTreesIndex[i][j];
480 bestDistanceT[index] = distances[j];
485 template <
class dataType>
487 std::vector<ftm::FTMTree_MT *> &trees,
489 std::vector<std::tuple<int, int>> &assignmentC,
490 std::vector<dataType> &bestDistanceT,
491 std::vector<ftm::FTMTree_MT *> &trees2,
493 std::vector<int> bestCentroidT(trees.size(), -1);
495#ifdef TTK_ENABLE_OPENMP4
496#pragma omp parallel for schedule(dynamic) shared(centroids, centroids2) \
497 num_threads(this->threadNumber_) if(parallelize_)
499 for(
unsigned int i = 0; i < trees.size(); ++i) {
500 for(
unsigned int j = 0; j < centroids.size(); ++j) {
501 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching;
502 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching2;
503 dataType distance, distance2;
506 if(trees2.size() != 0) {
511 if(distance < bestDistanceT[i]) {
512 bestDistanceT[i] = distance;
513 bestDistance_[i] = distance;
514 bestCentroidT[i] = j;
515 bestCentroid_[i] = j;
520 for(
unsigned int i = 0; i < bestCentroidT.size(); ++i)
521 assignmentC.emplace_back(bestCentroidT[i], i);
524 template <
class dataType>
527 std::vector<std::vector<double>> &distanceMatrix,
528 bool useDoubleInput =
false,
529 bool isFirstInput =
true) {
530 std::vector<ftm::FTMTree_MT *> trees(centroids.size());
531 for(
size_t i = 0; i < centroids.size(); ++i) {
532 trees[i] = &(centroids[i].tree);
535 trees, distanceMatrix, useDoubleInput, isFirstInput);
539 std::vector<int> &nodeCorr,
540 std::vector<int> &assignedTreesIndex) {
541 for(
int const i : assignedTreesIndex) {
542 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> newMatching;
543 for(
auto tup : matchingT[i])
544 newMatching.emplace_back(
545 nodeCorr[std::get<0>(tup)], std::get<1>(tup), std::get<2>(tup));
546 matchingT[i] = newMatching;
554 for(
unsigned int i = 0; i < bestCentroid_.size(); ++i)
555 if(bestCentroid_[i] == clusterId
556 and bestCentroid_[i] != oldBestCentroid_[i])
561 template <
class dataType>
564 std::vector<double> &alphas,
565 std::vector<std::tuple<int, int>> &assignmentC) {
566 bool oneCentroidUpdated =
false;
567 int noC = centroids.size();
568 std::vector<std::vector<ftm::FTMTree_MT *>> assignedTrees(noC);
569 std::vector<std::vector<int>> assignedTreesIndex(noC);
570 std::vector<std::vector<double>> assignedAlphas(noC);
572 for(
auto asgn : assignmentC) {
573 assignedTrees[std::get<0>(asgn)].push_back(trees[std::get<1>(asgn)]);
574 assignedTreesIndex[std::get<0>(asgn)].push_back(std::get<1>(asgn));
575 assignedAlphas[std::get<0>(asgn)].push_back(alphas[std::get<1>(asgn)]);
579 std::vector<int> noNewCentroid(centroids.size(), -1);
580 for(
unsigned int i = 0; i < centroids.size(); ++i)
581 if(assignedTrees[i].size() == 0) {
582 noNewCentroid[i] = cpt;
586#ifdef TTK_ENABLE_OPENMP4
587#pragma omp parallel num_threads(this->threadNumber_) \
588 shared(centroids) if(parallelize_ and parallelizeUpdate_)
590#pragma omp single nowait
593 for(
unsigned int i = 0; i < centroids.size(); ++i) {
594#ifdef TTK_ENABLE_OPENMP4
595#pragma omp task firstprivate(i) shared(centroids)
598 if(assignedTrees[i].size() == 0) {
601 trees, centroids[i], noNewCentroid[i]);
602 for(
unsigned int t = 0; t < trees.size(); ++t)
603 lowerBound_[t][i] = 0;
604 }
else if(assignedTrees[i].size() == 1) {
612 oneCentroidUpdated =
true;
613 double alphasSum = 0;
614 for(
unsigned int j = 0; j < assignedAlphas[i].size(); ++j)
615 alphasSum += assignedAlphas[i][j];
616 for(
unsigned int j = 0; j < assignedAlphas[i].size(); ++j)
617 assignedAlphas[i][j] /= alphasSum;
620 assignedTrees[i], centroids[i], assignedAlphas[i], matching);
621 std::vector<ftm::idNode> deletedNodesT;
623 &(centroids[i].tree), 0, deletedNodesT);
626#ifdef TTK_ENABLE_OPENMP4
630#ifdef TTK_ENABLE_OPENMP4
635 return oneCentroidUpdated;
638 template <
class dataType>
640 std::vector<ftm::FTMTree_MT *> &trees,
642 std::vector<double> &alphas,
643 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
677 std::vector<std::vector<std::pair<std::pair<ftm::idNode, ftm::idNode>,
678 std::pair<ftm::idNode, ftm::idNode>>>>
679 finalMatchings_path(trees.size());
681 trees, baryMergeTree, alphas, finalMatchings, finalMatchings_path);
697 template <
class dataType>
701 std::vector<double> &alphas,
702 std::vector<int> &clusteringAssignment,
703 std::vector<ftm::FTMTree_MT *> &trees2,
711 int noCentroidsT = centroids.size();
712 bool converged =
false;
713 dataType inertia = -1;
714 dataType minInertia = std::numeric_limits<dataType>::max();
717 std::vector<std::tuple<int, int>> assignmentC;
718 std::vector<dataType> bestDistanceT(
719 trees.size(), std::numeric_limits<dataType>::max());
720 while(not converged) {
724 std::stringstream ssIter;
725 ssIter <<
"Iteration " << noIterationC_;
731 trees, centroids, assignmentC, bestDistanceT, trees2, centroids2);
737 bool trees1Updated =
true, trees2Updated =
true;
740 if(trees2.size() != 0)
742 trees2, centroids2, alphas, assignmentC);
748 dataType currentInertia = 0;
749 for(
auto distance : bestDistanceT)
750 currentInertia += distance * distance;
751 converged = std::abs((
double)(inertia - currentInertia)) < 0.01;
752 inertia = currentInertia;
753 std::stringstream ss3;
754 ss3 <<
"Inertia : " << inertia;
757 minInertia = std::min(minInertia, inertia);
759 cptBlocked += (minInertia < inertia) ? 1 : 0;
760 converged = (cptBlocked >= 10);
765 converged = converged or (not trees1Updated and not trees2Updated);
770 bestDistanceT.clear();
771 bestDistanceT.resize(
772 trees.size(), std::numeric_limits<dataType>::max());
782 assignmentC, bestDistanceT, trees2,
783 centroids2, matchingsC2);
784 for(
auto dist : bestDistanceT)
786 dataType currentInertia = 0;
787 for(
auto distance : bestDistanceT)
788 currentInertia += distance * distance;
789 std::stringstream ss;
790 ss <<
"Inertia : " << currentInertia;
794 std::vector<int> cptCentroid(centroids.size(), 0);
795 for(
auto asgn : assignmentC) {
796 int const centroid = std::get<0>(asgn);
797 int const tree = std::get<1>(asgn);
799 clusteringAssignment[tree] = centroid;
800 outputMatching[centroid][tree]
801 = matchingsC[centroid][cptCentroid[centroid]];
802 if(trees2.size() != 0)
803 outputMatching2[centroid][tree]
804 = matchingsC2[centroid][cptCentroid[centroid]];
805 ++cptCentroid[centroid];
808 auto clusteringTime = t_clust.
getElapsedTime() - addDeletedNodesTime_;
812 template <
class dataType>
815 std::vector<double> &alphas,
816 std::vector<int> &clusteringAssignment,
825 if(trees2.size() != 0) {
826 trees2NodeCorr_.resize(trees2.size());
829 std::vector<ftm::FTMTree_MT *> treesT;
831 std::vector<ftm::FTMTree_MT *> treesT2;
836 std::vector<std::vector<ftm::MergeTree<dataType>>> allCentroids;
838 centroids = allCentroids[0];
839 if(trees2.size() != 0)
840 centroids2 = allCentroids[1];
852 clusteringAssignment, treesT2, centroids2,
859 trees, centroids, outputMatching, clusteringAssignment);
868 template <
class dataType>
871 std::vector<int> &clusteringAssignment,
876 if(trees2.size() != 0)
877 printMsg(
"Use join and split trees");
879 std::vector<double> alphas;
880 for(
unsigned int i = 0; i < trees.size(); ++i)
881 alphas.push_back(1.0 / trees.size());
884 trees2, outputMatching2, centroids, centroids2);
887 template <
class dataType>
890 std::vector<int> &clusteringAssignment,
892 std::vector<ftm::MergeTree<dataType>> trees2, centroids2;
895 outputMatching2, centroids, centroids2);
901 template <
class dataType>
903 std::vector<std::vector<int>> &nodeCorr,
904 bool useMinMaxPairT =
true) {
905 for(
unsigned int i = 0; i < trees.size(); ++i) {
910 if(trees.size() < 40)
911 printTreeStats(trees[i]);
919 template <
class dataType>
922 for(
unsigned int i = 0; i < centroids.size(); ++i)
926 template <
class dataType>
929 for(
unsigned int i = 0; i < centroids2.size(); ++i)
933 template <
class dataType>
938 std::vector<int> &clusteringAssignment) {
939 for(
unsigned int i = 0; i < trees.size(); ++i)
941 for(
unsigned int i = 0; i < centroids.size(); ++i)
943 for(
unsigned int c = 0; c < centroids.size(); ++c)
944 for(
unsigned int i = 0; i < trees.size(); ++i)
945 if(clusteringAssignment[i] == (
int)c)
947 &(centroids[c].tree), &(trees[i].tree), outputMatching[c][i]);
953 template <
class dataType>
957 for(
auto ¢roid : centroids)
959 for(
auto ¢roid : centroids2)
#define ttkNotUsed(x)
Mark function/method parameters that are not used in the function body at all.
#define matchingVectorType
#define treesMatchingVector
virtual int setThreadNumber(const int threadNumber)
void setDebugMsgPrefix(const std::string &prefix)
virtual int setDebugLevel(const int &debugLevel)
int getBestInitTreeIndex(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::FTMTree_MT * > &trees2, unsigned int barycenterMaximumNumberOfPairs, double sizeLimitPercent, bool distMinimizer=true)
void limitSizeBarycenter(ftm::MergeTree< dataType > &bary, std::vector< ftm::FTMTree_MT * > &trees, unsigned int barycenterMaximumNumberOfPairs, double percent, bool useBD=true)
double getAddDeletedNodesTime()
void fixMergedRootOriginBarycenter(ftm::MergeTree< dataType > &barycenter)
void setAddNodes(bool addNodesT)
void setIsCalled(bool ic)
void getDistanceMatrix(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< std::vector< double > > &distanceMatrix, bool useDoubleInput=false, bool isFirstInput=true)
double barycenterSizeLimitPercent_
void setPostprocess(bool postproc)
unsigned int barycenterMaximumNumberOfPairs_
void setDeterministic(bool deterministicT)
void computeBarycenter(std::vector< ftm::FTMTree_MT * > &trees, ftm::MergeTree< dataType > &baryMergeTree, 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, bool finalAsgnDoubleInput=false, bool finalAsgnFirstInput=true)
void computeOneDistance(ftm::FTMTree_MT *tree, ftm::FTMTree_MT *baryTree, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &matching, std::vector< std::pair< std::pair< ftm::idNode, ftm::idNode >, std::pair< ftm::idNode, ftm::idNode > > > &matching_path, dataType &distance, bool useDoubleInput=false, bool isFirstInput=true)
std::vector< double > finalDistances_
bool progressiveBarycenter_
void setBaseModule(int m)
void setPathMetric(int m)
void getSizeLimitedTrees(std::vector< ftm::FTMTree_MT * > &trees, unsigned int barycenterMaximumNumberOfPairs, double sizeLimitPercent, std::vector< ftm::MergeTree< dataType > > &mTreesLimited)
void printBaryStats(ftm::FTMTree_MT *baryTree, const debug::Priority &priority=debug::Priority::INFO)
void setProgressiveBarycenter(bool progressive)
void setBarycenterMaximumNumberOfPairs(unsigned int maxi)
void setBarycenterSizeLimitPercent(double percent)
void assignment(std::vector< ftm::FTMTree_MT * > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &matchings, std::vector< std::vector< std::pair< std::pair< ftm::idNode, ftm::idNode >, std::pair< ftm::idNode, ftm::idNode > > > > &matchings_path, std::vector< dataType > &distances, bool useDoubleInput=false, bool isFirstInput=true)
void setBranchDecomposition(bool useBD)
void setNormalizedWasserstein(bool normalizedWasserstein)
void setDistanceSquaredRoot(bool distanceSquaredRoot)
double mixtureCoefficient_
void setAssignmentSolver(int assignmentSolver)
void convertBranchDecompositionMatching(ftm::FTMTree_MT *tree1, ftm::FTMTree_MT *tree2, std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > &outputMatching)
bool normalizedWasserstein_
double mixDistances(dataType distance1, dataType distance2)
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)
void copyMinMaxPair(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, bool setOrigins=false)
std::vector< std::vector< int > > treesNodeCorr_
void preprocessTree(ftm::FTMTree_MT *tree, bool deleteInconsistentNodes=true)
void setKeepSubtree(bool keepSubtree)
void persistenceThresholding(ftm::FTMTree_MT *tree, double persistenceThresholdT, std::vector< ftm::idNode > &deletedNodes)
bool branchDecomposition_
void mixDistancesMatrix(std::vector< std::vector< dataType > > &distanceMatrix, std::vector< std::vector< dataType > > &distanceMatrix2)
void computeCentroids(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, matchingVectorType &outputMatching, std::vector< double > &alphas, std::vector< int > &clusteringAssignment, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2, matchingVectorType &outputMatching2)
void assignmentCentroidsNaive(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< std::tuple< int, int > > &assignmentC, std::vector< dataType > &bestDistanceT, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2)
void copyCentroids(std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::MergeTree< dataType > > &oldCentroids)
void setMixtureCoefficient(double coef)
void postprocessingClustering(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, matchingVectorType &outputMatching, std::vector< int > &clusteringAssignment)
void initAcceleratedKMeans(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2)
void fixMergedRootOriginClustering(std::vector< ftm::MergeTree< dataType > > ¢roids)
void getCentroidsDistanceMatrix(std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< std::vector< double > > &distanceMatrix, bool useDoubleInput=false, bool isFirstInput=true)
void initAcceleratedKMeansVectors(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::FTMTree_MT * > &ttkNotUsed(trees2))
void printCentroidsStats(std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::MergeTree< dataType > > ¢roids2)
void computeOneBarycenter(std::vector< ftm::FTMTree_MT * > &trees, ftm::MergeTree< dataType > &baryMergeTree, std::vector< double > &alphas, std::vector< std::vector< std::tuple< ftm::idNode, ftm::idNode, double > > > &finalMatchings)
void setNoCentroids(unsigned int noCentroidsT)
void preprocessingClustering(std::vector< ftm::MergeTree< dataType > > &trees, std::vector< std::vector< int > > &nodeCorr, bool useMinMaxPairT=true)
void finalAssignmentCentroids(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, matchingVectorType &matchingsC, std::vector< std::tuple< int, int > > &assignmentC, std::vector< dataType > &bestDistanceT, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2, matchingVectorType &matchingsC2)
void execute(std::vector< ftm::MergeTree< dataType > > &trees, matchingVectorType &outputMatching, std::vector< double > &alphas, std::vector< int > &clusteringAssignment, std::vector< ftm::MergeTree< dataType > > &trees2, matchingVectorType &outputMatching2, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::MergeTree< dataType > > ¢roids2)
std::vector< std::vector< int > > getTrees2NodeCorr()
void assignmentCentroidsAccelerated(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< std::tuple< int, int > > &assignmentC, std::vector< dataType > &bestDistanceT, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2)
void execute(std::vector< ftm::MergeTree< dataType > > &trees, matchingVectorType &outputMatching, std::vector< int > &clusteringAssignment, std::vector< ftm::MergeTree< dataType > > ¢roids)
void putBackMinMaxPair(std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::MergeTree< dataType > > ¢roids2)
bool samePreviousAssignment(int clusterId)
bool updateCentroids(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< double > &alphas, std::vector< std::tuple< int, int > > &assignmentC)
void initCentroids(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< std::vector< ftm::MergeTree< dataType > > > &allCentroids)
void execute(std::vector< ftm::MergeTree< dataType > > &trees, matchingVectorType &outputMatching, std::vector< int > &clusteringAssignment, std::vector< ftm::MergeTree< dataType > > &trees2, matchingVectorType &outputMatching2, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< ftm::MergeTree< dataType > > ¢roids2)
~MergeTreeClustering() override=default
void matchingCorrespondence(treesMatchingVector &matchingT, std::vector< int > &nodeCorr, std::vector< int > &assignedTreesIndex)
void initNewCentroid(std::vector< ftm::FTMTree_MT * > &trees, ftm::MergeTree< dataType > ¢roid, int noNewCentroid)
void assignmentCentroids(std::vector< ftm::FTMTree_MT * > &trees, std::vector< ftm::MergeTree< dataType > > ¢roids, std::vector< std::tuple< int, int > > &assignmentC, std::vector< dataType > &bestDistanceT, std::vector< ftm::FTMTree_MT * > &trees2, std::vector< ftm::MergeTree< dataType > > ¢roids2)
Node * getNode(idNode nodeId) const
idNode getNumberOfNodes() const
void setOrigin(SimplexId linked)
MergeTree< dataType > cleanMergeTree(ftm::FTMTree_MT *tree, std::vector< int > &nodeCorr, bool useBD=true)
MergeTree< dataType > copyMergeTree(const ftm::FTMTree_MT *tree, bool doSplitMultiPersPairs=false)
void mergeTreeToFTMTree(std::vector< MergeTree< dataType > > &trees, std::vector< ftm::FTMTree_MT * > &treesT)
unsigned int idNode
Node index in vect_nodes_.
TTK base package defining the standard types.
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/| (_) |"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)