[mlpack-svn] r16302 - mlpack/trunk/src/mlpack/methods/range_search
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Mon Feb 17 09:53:41 EST 2014
Author: rcurtin
Date: Mon Feb 17 09:53:41 2014
New Revision: 16302
Log:
Clean up RangeSearch implementation so it works with TraversalInfo struct.
Modified:
mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp
Modified: mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/range_search/range_search_rules_impl.hpp Mon Feb 17 09:53:41 2014
@@ -49,9 +49,6 @@
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 @@
{
// 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();
+ baseCase = traversalInfo.LastBaseCase();
- // 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;
- }
- }
+ // Make sure that if BaseCase() is called, we don't duplicate results.
+ lastQueryIndex = queryNode.Point(0);
+ lastReferenceIndex = referenceNode.Point(0);
}
-
- if (!alreadyDone)
+ else
{
// 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);
- }
distances.Lo() = baseCase - queryNode.FurthestDescendantDistance()
- referenceNode.FurthestDescendantDistance();
@@ -217,10 +168,7 @@
+ 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 @@
// 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-svn
mailing list