[mlpack-git] master, mlpack-1.0.x: Clean up RangeSearch implementation so it works with TraversalInfo struct. (945fac6)
gitdub at big.cc.gt.atl.ga.us
gitdub at big.cc.gt.atl.ga.us
Thu Mar 5 21:43:59 EST 2015
Repository : https://github.com/mlpack/mlpack
On branches: master,mlpack-1.0.x
Link : https://github.com/mlpack/mlpack/compare/904762495c039e345beba14c1142fd719b3bd50e...f94823c800ad6f7266995c700b1b630d5ffdcf40
>---------------------------------------------------------------
commit 945fac6fcd0cbfa7b108e254d7c6679785d3fb52
Author: Ryan Curtin <ryan at ratml.org>
Date: Mon Feb 17 14:53:41 2014 +0000
Clean up RangeSearch implementation so it works with TraversalInfo struct.
>---------------------------------------------------------------
945fac6fcd0cbfa7b108e254d7c6679785d3fb52
.../range_search/range_search_rules_impl.hpp | 76 ++++------------------
1 file changed, 13 insertions(+), 63 deletions(-)
diff --git a/src/mlpack/methods/range_search/range_search_rules_impl.hpp b/src/mlpack/methods/range_search/range_search_rules_impl.hpp
index 8103efb..f84ba37 100644
--- a/src/mlpack/methods/range_search/range_search_rules_impl.hpp
+++ b/src/mlpack/methods/range_search/range_search_rules_impl.hpp
@@ -49,9 +49,6 @@ double RangeSearchRules<MetricType, TreeType>::BaseCase(
if ((lastQueryIndex == queryIndex) && (lastReferenceIndex == referenceIndex))
return 0.0; // No value to return... this shouldn't do anything bad.
-// if (queryIndex == 0 && referenceIndex == 0)
-// Log::Warn << "base case 0 0 called!\n";
-
const double distance = metric.Evaluate(querySet.unsafe_col(queryIndex),
referenceSet.unsafe_col(referenceIndex));
@@ -148,68 +145,22 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
{
// It is possible that the base case has already been calculated.
double baseCase = 0.0;
- bool alreadyDone = false;
- if (tree::TreeTraits<TreeType>::HasSelfChildren)
+ if ((traversalInfo.LastQueryNode() != NULL) &&
+ (traversalInfo.LastReferenceNode() != NULL) &&
+ (traversalInfo.LastQueryNode()->Point(0) == queryNode.Point(0)) &&
+ (traversalInfo.LastReferenceNode()->Point(0) == referenceNode.Point(0)))
{
- TreeType* lastQuery = (TreeType*) referenceNode.Stat().LastDistanceNode();
- TreeType* lastRef = (TreeType*) queryNode.Stat().LastDistanceNode();
-
- // Did the query node's last combination do the base case?
- if ((lastRef != NULL) && (referenceNode.Point(0) == lastRef->Point(0)))
- {
- baseCase = queryNode.Stat().LastDistance();
- alreadyDone = true;
- }
-
- // Did the reference node's last combination do the base case?
- if ((lastQuery != NULL) && (queryNode.Point(0) == lastQuery->Point(0)))
- {
- baseCase = referenceNode.Stat().LastDistance();
- alreadyDone = true;
- }
-
- // If the query node is a self-child, did the query parent's last
- // combination do the base case?
- if ((queryNode.Parent() != NULL) &&
- (queryNode.Point(0) == queryNode.Parent()->Point(0)))
- {
- TreeType* lastParentRef = (TreeType*)
- queryNode.Parent()->Stat().LastDistanceNode();
- if ((lastParentRef != NULL) &&
- (referenceNode.Point(0) == lastParentRef->Point(0)))
- {
- baseCase = queryNode.Parent()->Stat().LastDistance();
- alreadyDone = true;
- }
- }
-
- // If the reference node is a self-child, did the reference parent's last
- // combination do the base case?
- if ((referenceNode.Parent() != NULL) &&
- (referenceNode.Point(0) == referenceNode.Parent()->Point(0)))
- {
- TreeType* lastQueryRef = (TreeType*)
- referenceNode.Parent()->Stat().LastDistanceNode();
- if ((lastQueryRef != NULL) &&
- (queryNode.Point(0) == lastQueryRef->Point(0)))
- {
- baseCase = referenceNode.Parent()->Stat().LastDistance();
- alreadyDone = true;
- }
- }
- }
+ baseCase = traversalInfo.LastBaseCase();
- if (!alreadyDone)
- {
- // We must calculate the base case.
- baseCase = BaseCase(queryNode.Point(0), referenceNode.Point(0));
- }
- else
- {
// Make sure that if BaseCase() is called, we don't duplicate results.
lastQueryIndex = queryNode.Point(0);
lastReferenceIndex = referenceNode.Point(0);
}
+ else
+ {
+ // We must calculate the base case.
+ baseCase = BaseCase(queryNode.Point(0), referenceNode.Point(0));
+ }
distances.Lo() = baseCase - queryNode.FurthestDescendantDistance()
- referenceNode.FurthestDescendantDistance();
@@ -217,10 +168,7 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
+ referenceNode.FurthestDescendantDistance();
// Update the last distances performed for the query and reference node.
- queryNode.Stat().LastDistanceNode() = (void*) &referenceNode;
- queryNode.Stat().LastDistance() = baseCase;
- referenceNode.Stat().LastDistanceNode() = (void*) &queryNode;
- referenceNode.Stat().LastDistance() = baseCase;
+ traversalInfo.LastBaseCase() = baseCase;
}
else
{
@@ -243,6 +191,8 @@ double RangeSearchRules<MetricType, TreeType>::Score(TreeType& queryNode,
// Otherwise the score doesn't matter. Recursion order is irrelevant in range
// search.
+ traversalInfo.LastQueryNode() = &queryNode;
+ traversalInfo.LastReferenceNode() = &referenceNode;
return 0.0;
}
More information about the mlpack-git
mailing list