[mlpack-git] master: Avoid calculating distances after an Elkan prune. Slight, nearly negligible performance gains. (4a5add5)
gitdub at big.cc.gt.atl.ga.us
gitdub at big.cc.gt.atl.ga.us
Thu Mar 12 16:01:43 EDT 2015
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/eddd7167d69b6c88b271ef2e51d1c20e13f1acd8...70342dd8e5c17e0c164cfb8189748671e9c0dd44
>---------------------------------------------------------------
commit 4a5add507fc5722cd3a992dca825392dd45af33b
Author: Ryan Curtin <ryan at ratml.org>
Date: Tue Jan 13 16:04:44 2015 -0500
Avoid calculating distances after an Elkan prune. Slight, nearly negligible performance gains.
>---------------------------------------------------------------
4a5add507fc5722cd3a992dca825392dd45af33b
.../methods/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 3208737..8608c03 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<MetricType, TreeType>::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<MetricType, TreeType>::Score(
referenceNode.Stat().MaxQueryNodeDistance());
}
- 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))
+ if (score != DBL_MAX)
{
- 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)
More information about the mlpack-git
mailing list