From 4836bbabce34fb0c0b67ff07aedbed47127ca53e Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Thu, 17 Jan 2013 14:37:40 +0000 Subject: [PATCH] root box calculation after remove moved from rtree::raw_remove() to visitor::remove. [SVN r82522] --- .../geometry/extensions/index/rtree/rtree.hpp | 20 ++------- .../index/rtree/visitors/remove.hpp | 20 +++++++++ tests/additional_speed.cpp | 45 ++++++++++--------- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 2d582811e..830e16ebc 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -1057,6 +1056,8 @@ private: BOOST_GEOMETRY_INDEX_ASSERT(m_root, "The root must exist"); BOOST_GEOMETRY_INDEX_ASSERT(index::is_valid(m_translator(value)), "Indexable is invalid"); + geometry::expand(m_box, m_translator(value)); + detail::rtree::visitors::insert< value_type, value_type, options_type, translator_type, box_type, allocators_type, @@ -1072,8 +1073,6 @@ private: // TODO // If exception is thrown, m_values_count may be invalid ++m_values_count; - - geometry::expand(m_box, m_translator(value)); } /*! @@ -1091,7 +1090,7 @@ private: detail::rtree::visitors::remove< value_type, options_type, translator_type, box_type, allocators_type - > remove_v(m_root, m_leafs_level, value, m_parameters, m_translator, m_allocators); + > remove_v(m_root, m_leafs_level, m_box, value, m_parameters, m_translator, m_allocators); detail::rtree::apply_visitor(remove_v, *m_root); @@ -1103,19 +1102,6 @@ private: --m_values_count; - // Calculate new box - if ( m_values_count == 0 ) - { - geometry::assign_inverse(m_box); - } - else - { - detail::rtree::visitors::children_box - children_box_v(m_box, m_translator); - - detail::rtree::apply_visitor(children_box_v, *m_root); - } - return 1; } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp index a11837c19..25ca6eeff 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp @@ -38,6 +38,7 @@ class remove public: inline remove(node* & root, size_t & leafs_level, + Box & root_box, Value const& value, parameters_type const& parameters, Translator const& translator, @@ -47,6 +48,7 @@ public: , m_translator(translator) , m_allocators(allocators) , m_root_node(root) + , m_root_box(root_box) , m_leafs_level(leafs_level) , m_is_value_removed(false) , m_parent(0) @@ -110,6 +112,9 @@ public: { BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get(m_root_node), "node must be the root"); + // assign new root's box + assign_root_box(elements); + // reinsert elements from removed nodes (underflows) reinsert_removed_nodes_elements(); // MAY THROW (V, E: alloc, copy, N: alloc) @@ -155,6 +160,10 @@ public: rtree::elements(*m_parent)[m_current_child_index].first = rtree::elements_box(elements.begin(), elements.end(), m_translator); } + else + { + assign_root_box(elements); + } } } @@ -285,13 +294,24 @@ private: } } + template + void assign_root_box(Elements const& elements) + { + if ( elements.empty() ) + geometry::assign_inverse(m_root_box); + else + m_root_box = rtree::elements_box(elements.begin(), elements.end(), m_translator); + } + Value const& m_value; parameters_type const& m_parameters; Translator const& m_translator; Allocators & m_allocators; node* & m_root_node; + Box & m_root_box; size_t & m_leafs_level; + bool m_is_value_removed; UnderflowNodes m_underflowed_nodes; diff --git a/tests/additional_speed.cpp b/tests/additional_speed.cpp index 5ed9f558d..e362fd3af 100644 --- a/tests/additional_speed.cpp +++ b/tests/additional_speed.cpp @@ -71,8 +71,6 @@ int main() // inserting test { - std::cout << "rtree inserting time test... (" - << values_count << ")\n"; tim.restart(); for (size_t i = 0 ; i < values_count ; ++i ) { @@ -82,14 +80,8 @@ int main() t.insert(b); } - std::cout << "time: " << tim.elapsed() << "s\n"; - } - - { - float x = coords[0].first; - float y = coords[0].second; - B b(P(x - 0.5f, y - 0.5f), P(x + 0.5f, y + 0.5f)); - t.remove(b); + double time = tim.elapsed(); + std::cout << time << "s - insert " << values_count << '\n'; } std::vector result; @@ -98,8 +90,6 @@ int main() // query test { - std::cout << "query(B) searching time test... (" - << queries_count << ")\n"; tim.restart(); size_t temp = 0; for (size_t i = 0 ; i < queries_count ; ++i ) @@ -110,16 +100,14 @@ int main() t.spatial_query(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result)); temp += result.size(); } - std::cout << "time: " << tim.elapsed() << "s\n"; - std::cout << "found: " << temp << "\n"; + double time = tim.elapsed(); + std::cout << time << "s - spatial_query(B) " << queries_count << " found " << temp << '\n'; } result.clear(); // searching test { - std::cout << "nearest 10 searching time test... (" - << queries_count / 10 << ")\n"; tim.restart(); size_t temp = 0; for (size_t i = 0 ; i < queries_count / 10 ; ++i ) @@ -129,13 +117,11 @@ int main() result.clear(); temp += t.nearest_query(P(x, y), 5, std::back_inserter(result)); } - std::cout << "time: " << tim.elapsed() << "s\n"; - std::cout << "found: " << temp << "\n"; + double time = tim.elapsed(); + std::cout << time << "s - nearest_query(P, 5) " << (queries_count / 10) << " found " << temp << '\n'; } { - std::cout << "nearest 1 searching time test... (" - << queries_count / 10 << ")\n"; tim.restart(); size_t temp = 0; for (size_t i = 0 ; i < queries_count / 10 ; ++i ) @@ -144,8 +130,23 @@ int main() float y = coords[i].second + 100; temp += t.nearest_query(P(x, y), result_one); } - std::cout << "time: " << tim.elapsed() << "s\n"; - std::cout << "found: " << temp << "\n"; + double time = tim.elapsed(); + std::cout << time << "s - nearest_query(P) " << (queries_count / 10) << " found " << temp << '\n'; + } + + // inserting test + { + tim.restart(); + for (size_t i = 0 ; i < values_count / 10 ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + B b(P(x - 0.5f, y - 0.5f), P(x + 0.5f, y + 0.5f)); + + t.remove(b); + } + double time = tim.elapsed(); + std::cout << time << "s - remove " << values_count / 10 << '\n'; } }