|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r74610 - in sandbox-branches/geometry/index: boost/geometry/extensions/index/rtree/visitors tests
From: adam.wulkiewicz_at_[hidden]
Date: 2011-09-29 09:38:03
Author: awulkiew
Date: 2011-09-29 09:38:03 EDT (Thu, 29 Sep 2011)
New Revision: 74610
URL: http://svn.boost.org/trac/boost/changeset/74610
Log:
nearest query optimized by rejecting distant nodes before adding them to the active branches list.
Text files modified:
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp | 21 ++++++++++++++++++---
sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp | 24 +++++++++++++++++++++++-
2 files changed, 41 insertions(+), 4 deletions(-)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp 2011-09-29 09:38:03 EDT (Thu, 29 Sep 2011)
@@ -167,7 +167,7 @@
, m_result(r)
{}
- //TODO: awulkiew - check this approach: store one, global vector of active branches, add branches only if mindist is ok
+ //TODO: awulkiew - consider this approach: store one, global vector of active branches, add branches only if mindist is ok
inline void operator()(internal_node const& n)
{
@@ -191,6 +191,17 @@
// calculate node's distance(s) for distance predicate
node_distances_type node_dist_data = node_distances_calc::apply(m_dist_pred, it->first);
+ // TODO: awulkiew - consider at first calculating just near distance,
+ // comparing it with m_result.comparable_distance if it's valid,
+ // after that calculate the rest of distances and check predicates
+
+ // if current node is further than found neighbors - don't analyze it
+ if ( m_result.is_comparable_distance_valid() &&
+ is_node_prunable(m_result.comparable_distance(), node_dist_data) )
+ {
+ continue;
+ }
+
// if current node distance(s) meets distance predicate
if ( node_distances_predicates_check::apply(m_dist_pred, node_dist_data) )
{
@@ -235,6 +246,10 @@
// calculate values distance for distance predicate
value_distances_type distances = value_distances_calc::apply(m_dist_pred, m_tr(*it));
+ // TODO: awulkiew - consider at first calculating just point relation distance,
+ // comparing it with m_result.comparable_distance if it's valid,
+ // after that calculate the rest of distances and check predicates
+
// if distance meets distance predicate
if ( value_distances_predicates_check::apply(m_dist_pred, distances) )
{
@@ -261,7 +276,7 @@
{
// prune if box's mindist is further than value's mindist
while ( !abl.empty() &&
- prune_node(m_result.comparable_distance(), abl.back().first) )
+ is_node_prunable(m_result.comparable_distance(), abl.back().first) )
{
abl.pop_back();
}
@@ -279,7 +294,7 @@
}
template <typename Distance>
- static inline bool prune_node(Distance const& smallest_dist, node_distances_type const& d)
+ static inline bool is_node_prunable(Distance const& smallest_dist, node_distances_type const& d)
{
return smallest_dist
< index::detail::cdist_value<node_distances_type>
Modified: sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp
==============================================================================
--- sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp (original)
+++ sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp 2011-09-29 09:38:03 EDT (Thu, 29 Sep 2011)
@@ -221,7 +221,7 @@
// searching test
{
- std::cout << "query(B) and value(odd index) searching time test... ("
+ std::cout << "pair: query(B) and value(odd index) searching time test... ("
<< queries_count << ")\n";
tim.restart();
size_t temp = 0;
@@ -243,6 +243,28 @@
// searching test
{
+ std::cout << "tuple: query(B) and value(odd index) searching time test... ("
+ << queries_count << ")\n";
+ tim.restart();
+ size_t temp = 0;
+ for (size_t i = 0 ; i < queries_count ; ++i )
+ {
+ float x = coords[i].first;
+ float y = coords[i].second;
+ std::deque< std::pair<B, size_t> > result;
+ t.query(
+ boost::make_tuple(
+ B(P(x - 10, y - 10), P(x + 10, y + 10)),
+ bgi::value(test_pred< std::pair<B, size_t> >())
+ ), std::back_inserter(result));
+ temp += result.size();
+ }
+ std::cout << "time: " << tim.elapsed() << "s\n";
+ std::cout << "found: " << temp << "\n";
+ }
+
+ // searching test
+ {
std::cout << "vector searching time test... ("
<< queries_count / 1000 << ")\n";
tim.restart();
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk