[mlpack-git] master: Elkan pruning can't prune the best query node. Bugfix. Trivial slowdown. (f8a73a3)
gitdub at big.cc.gt.atl.ga.us
gitdub at big.cc.gt.atl.ga.us
Thu Mar 12 16:02:20 EDT 2015
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/eddd7167d69b6c88b271ef2e51d1c20e13f1acd8...70342dd8e5c17e0c164cfb8189748671e9c0dd44
>---------------------------------------------------------------
commit f8a73a38ae2e3eb91e6c7b513bb5e6d12acd9d38
Author: Ryan Curtin <ryan at ratml.org>
Date: Wed Jan 14 16:50:34 2015 -0500
Elkan pruning can't prune the best query node. Bugfix. Trivial slowdown.
>---------------------------------------------------------------
f8a73a38ae2e3eb91e6c7b513bb5e6d12acd9d38
src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp | 12 ++++++++----
1 file changed, 8 insertions(+), 4 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 d456c83..321de5d 100644
--- a/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp
+++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_rules_impl.hpp
@@ -112,8 +112,6 @@ double DualTreeKMeansRules<MetricType, TreeType>::Score(
traversalInfo.LastReferenceNode() = &referenceNode;
- double score = ElkanTypeScore(queryNode, referenceNode);
-
// If there's no closest query node assigned, but the parent has one, take
// that one.
if (referenceNode.Stat().ClosestQueryNode() == NULL &&
@@ -127,6 +125,8 @@ double DualTreeKMeansRules<MetricType, TreeType>::Score(
referenceNode.Stat().MaxQueryNodeDistance());
}
+ double score = ElkanTypeScore(queryNode, referenceNode);
+
if (score != DBL_MAX)
{
// We also have to update things if the closest query node is null. This
@@ -229,16 +229,20 @@ double DualTreeKMeansRules<MetricType, TreeType>::ElkanTypeScore(
template<typename MetricType, typename TreeType>
double DualTreeKMeansRules<MetricType, TreeType>::ElkanTypeScore(
- TreeType& /* queryNode */,
+ TreeType& queryNode,
TreeType& referenceNode,
const double minQueryDistance) const
{
// See if we can do an Elkan-type prune on between-centroid distances.
+
const double maxDistance = referenceNode.Stat().MaxQueryNodeDistance();
if (maxDistance == DBL_MAX)
return minQueryDistance;
- if (minQueryDistance > 2.0 * maxDistance)
+ if ((minQueryDistance > 2.0 * maxDistance) &&
+ !(IsDescendantOf(*(TreeType*) referenceNode.Stat().ClosestQueryNode(),
+ queryNode)) &&
+ (&queryNode != (TreeType*) referenceNode.Stat().ClosestQueryNode()))
{
// Then we can conclude d_max(best(N_r), N_r) <= d_min(N_q, N_r) which
// means that N_q cannot possibly hold any clusters that own any points in
More information about the mlpack-git
mailing list