From 4a5add507fc5722cd3a992dca825392dd45af33b Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Tue, 13 Jan 2015 16:04:44 -0500 Subject: [PATCH] Avoid calculating distances after an Elkan prune. Slight, nearly negligible performance gains. --- .../kmeans/dual_tree_kmeans_rules_impl.hpp | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp index 3208737fe6..8608c03d8f 100644 --- a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp +++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp @@ -114,13 +114,8 @@ double DualTreeKMeansRules::Score( double score = ElkanTypeScore(queryNode, referenceNode); - // We also have to update things if the closest query node is null. This can - // probably be improved. - const double minDistance = referenceNode.MinDistance(&queryNode); - const double maxDistance = referenceNode.MaxDistance(&queryNode); - distanceCalculations += 2; - score = PellegMooreScore(queryNode, referenceNode, minDistance); - + // If there's no closest query node assigned, but the parent has one, take + // that one. if (referenceNode.Stat().ClosestQueryNode() == NULL && referenceNode.Parent() != NULL && referenceNode.Parent()->Stat().ClosestQueryNode() != NULL) @@ -132,19 +127,29 @@ double DualTreeKMeansRules::Score( referenceNode.Stat().MaxQueryNodeDistance()); } - if (maxDistance < referenceNode.Stat().MaxQueryNodeDistance() || - referenceNode.Stat().ClosestQueryNode() == NULL) + if (score != DBL_MAX) { - referenceNode.Stat().ClosestQueryNode() = (void*) &queryNode; - referenceNode.Stat().MinQueryNodeDistance() = minDistance; - referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; - } - else if (IsDescendantOf(*((TreeType*) - referenceNode.Stat().ClosestQueryNode()), queryNode)) - { - referenceNode.Stat().ClosestQueryNode() == (void*) &queryNode; - referenceNode.Stat().MinQueryNodeDistance() = minDistance; - referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; + // We also have to update things if the closest query node is null. This + // can probably be improved. + const double minDistance = referenceNode.MinDistance(&queryNode); + const double maxDistance = referenceNode.MaxDistance(&queryNode); + distanceCalculations += 2; + score = PellegMooreScore(queryNode, referenceNode, minDistance); + + if (maxDistance < referenceNode.Stat().MaxQueryNodeDistance() || + referenceNode.Stat().ClosestQueryNode() == NULL) + { + referenceNode.Stat().ClosestQueryNode() = (void*) &queryNode; + referenceNode.Stat().MinQueryNodeDistance() = minDistance; + referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; + } + else if (IsDescendantOf(*((TreeType*) + referenceNode.Stat().ClosestQueryNode()), queryNode)) + { + referenceNode.Stat().ClosestQueryNode() == (void*) &queryNode; + referenceNode.Stat().MinQueryNodeDistance() = minDistance; + referenceNode.Stat().MaxQueryNodeDistance() = maxDistance; + } } if (score == DBL_MAX)