69 template <
class dataType>
71 std::vector<dataType> &img2,
72 bool emptyFieldDistance =
false) {
73 size_t const noPoints = img1.size();
75 std::vector<dataType> secondField = img2;
76 if(emptyFieldDistance)
77 secondField = std::vector<dataType>(noPoints, 0);
79 dataType distance = 0;
81 for(
size_t i = 0; i < noPoints; ++i)
82 distance += std::pow((img1[i] - secondField[i]), 2);
84 distance = std::sqrt(distance);
89 template <
class dataType>
91 std::vector<dataType> &img2,
94 size_t const noPoints = img1.size();
96 std::vector<dataType> barycenter(noPoints);
97 for(
size_t i = 0; i < noPoints; ++i)
98 barycenter[i] = alpha * img1[i] * (1 - alpha) * img2[i];
103 template <
class dataType>
106 bool emptyTreeDistance =
false) {
146 std::vector<std::tuple<ftm::idNode, ftm::idNode, double>> matching;
148 = mergeTreeDistance.
execute<dataType>(mTree1, mTree2, matching);
154 template <
class dataType>
172 mergeTreeBarycenter.
setAlpha(alpha);
193 std::vector<ftm::MergeTree<dataType>> intermediateTrees;
194 intermediateTrees.push_back(mTree1);
195 intermediateTrees.push_back(mTree2);
196 std::vector<std::vector<std::tuple<ftm::idNode, ftm::idNode, double>>>
197 outputMatchingBarycenter(2);
199 mergeTreeBarycenter.
execute<dataType>(
200 intermediateTrees, outputMatchingBarycenter, barycenter);
208 return 1 - ((double)middleIndex - index1) / (index2 - index1);
211 template <
class dataType>
214 std::vector<int> &removed,
216 std::vector<std::vector<dataType>> &barycentersL2) {
217 std::vector<bool> treeRemoved(mTrees.size(),
false);
220 toRemoved = std::min(toRemoved, (
int)(mTrees.size() - 2));
222 std::vector<std::vector<dataType>> images(
fieldL2_.size());
223 for(
size_t i = 0; i <
fieldL2_.size(); ++i)
224 for(
size_t j = 0; j <
fieldL2_[i].size(); ++j)
225 images[i].push_back(
static_cast<dataType
>(
fieldL2_[i][j]));
227 for(
int iter = 0; iter < toRemoved; ++iter) {
228 dataType bestCost = std::numeric_limits<dataType>::max();
229 int bestMiddleIndex = -1;
231 std::vector<std::tuple<ftm::MergeTree<dataType>,
int>>
232 bestBarycentersOnPath;
233 std::vector<dataType> bestBarycenterL2;
234 std::vector<std::tuple<std::vector<dataType>,
int>>
235 bestBarycentersL2OnPath;
238 printMsg(
"Compute barycenter for each pair of trees",
240 unsigned int index1 = 0, index2 = 0;
241 while(index2 != mTrees.size() - 1) {
244 int middleIndex = index1 + 1;
245 while(treeRemoved[middleIndex])
249 index2 = middleIndex + 1;
250 while(treeRemoved[index2])
255 double const alpha =
computeAlpha(index1, middleIndex, index2);
257 std::vector<dataType> barycenterL2;
260 mTrees[index1], mTrees[index2], alpha);
263 images[index1], images[index2], alpha);
277 printMsg(
"Compute distances of previously removed trees",
279 std::vector<std::tuple<ftm::MergeTree<dataType>,
int>>
281 std::vector<std::tuple<std::vector<dataType>,
int>>
283 for(
unsigned int i = 0; i < 2; ++i) {
284 int const toReach = (i == 0 ? index1 : index2);
285 int const offset = (i == 0 ? -1 : 1);
286 int tIndex = middleIndex + offset;
287 while(tIndex != toReach) {
290 double const alphaT =
computeAlpha(index1, tIndex, index2);
292 std::vector<dataType> barycenterPL2;
295 mTrees[index1], mTrees[index2], alphaT);
298 images[index1], images[index2], alphaT);
310 barycentersOnPath.push_back(
311 std::make_tuple(barycenterP, tIndex));
313 barycentersL2OnPath.push_back(
314 std::make_tuple(barycenterPL2, tIndex));
320 if(cost < bestCost) {
322 bestMiddleIndex = middleIndex;
324 bestBarycenter = barycenter;
325 bestBarycentersOnPath = barycentersOnPath;
327 bestBarycenterL2 = barycenterL2;
328 bestBarycentersL2OnPath = barycentersL2OnPath;
333 index1 = middleIndex;
339 removed.push_back(bestMiddleIndex);
340 treeRemoved[bestMiddleIndex] =
true;
342 barycenters[bestMiddleIndex] = bestBarycenter;
343 for(
auto &tup : bestBarycentersOnPath)
344 barycenters[std::get<1>(tup)] = std::get<0>(tup);
346 barycentersL2[bestMiddleIndex] = bestBarycenterL2;
347 for(
auto &tup : bestBarycentersL2OnPath)
348 barycentersL2[std::get<1>(tup)] = std::get<0>(tup);
353 template <
class dataType>
355 std::vector<double> &emptyTreeDistances,
362 for(
unsigned int i = 0; i < mTrees.size(); ++i) {
409 std::vector<ftm::MergeTree<dataType>> barycenters(mTrees.size());
410 std::vector<std::vector<dataType>> barycentersL2(mTrees.size());
411 std::vector<int> removed;
414 for(
size_t i = 0; i < mTrees.size(); ++i)
418 mTrees, removed, barycenters, barycentersL2);
421 std::vector<std::vector<dataType>> images(
fieldL2_.size());
422 for(
size_t i = 0; i <
fieldL2_.size(); ++i)
423 for(
size_t j = 0; j <
fieldL2_[i].size(); ++j)
424 images[i].push_back(
static_cast<dataType
>(
fieldL2_[i][j]));
426 for(
auto &mt : mTrees)
428 std::vector<bool> removedB(mTrees.size(),
false);
429 for(
auto r : removed)
431 for(
unsigned int i = 0; i < barycenters.size(); ++i)
434 allMT.push_back(barycenters[i]);
436 images.push_back(barycentersL2[i]);
440 unsigned int const distMatSize
442 for(
unsigned int i = 0; i < distMatSize; ++i) {
448 emptyTreeDistances.push_back(distance);
453 for(
unsigned int i = 0; i < allMT.size(); ++i)
455 for(
unsigned int i = 0; i < mTrees.size(); ++i)
460 std::stringstream ss, ss2, ss3;
461 ss <<
"input size = " << mTrees.size();
463 ss2 <<
"output size = "
464 << mTrees.size() - (distMatSize - mTrees.size());
467 for(
unsigned int i = 0; i < removed.size(); ++i) {
470 if(i < removed.size() - 1)
475 sort(removed.begin(), removed.end());
virtual int setThreadNumber(const int threadNumber)
virtual int setDebugLevel(const int &debugLevel)
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 setBaseModule(int m)
void setAlpha(double alpha)
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)
bool normalizedWasserstein_
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)
double persistenceThreshold_
void setUseMinMaxPair(bool useMinMaxPair)
void setEpsilon3Tree2(double epsilon)
bool branchDecomposition_
void setParallelize(bool para)
void setOnlyEmptyTreeDistance(double only)
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, bool emptyTreeDistance=false)
double computeAlpha(int index1, int middleIndex, int index2)
std::vector< int > execute(std::vector< ftm::MergeTree< dataType > > &mTrees, std::vector< double > &emptyTreeDistances, std::vector< ftm::MergeTree< dataType > > &allMT)
std::vector< std::vector< double > > fieldL2_
ftm::MergeTree< dataType > computeBarycenter(ftm::MergeTree< dataType > &mTree1, ftm::MergeTree< dataType > &mTree2, double alpha)
void temporalSubsampling(std::vector< ftm::MergeTree< dataType > > &mTrees, std::vector< int > &removed, std::vector< ftm::MergeTree< dataType > > &barycenters, std::vector< std::vector< dataType > > &barycentersL2)
std::vector< dataType > computeL2Barycenter(std::vector< dataType > &img1, std::vector< dataType > &img2, double alpha)
void setPathMappings(bool usePM)
bool useCustomTimeVariable_
MergeTreeTemporalReduction()
void setUseL2Distance(bool useL2)
double removalPercentage_
void setRemovalPercentage(double rs)
dataType computeL2Distance(std::vector< dataType > &img1, std::vector< dataType > &img2, bool emptyFieldDistance=false)
std::vector< double > timeVariable_
void setAssignmentSolver(int assignmentSolver)
void setComputeMapping(bool m)
void setPreprocess(bool p)
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)
TTK base package defining the standard types.
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/| (_) |"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)