Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r74497 - in sandbox-branches/geometry/index/boost/geometry/extensions/index: . rtree/visitors
From: adam.wulkiewicz_at_[hidden]
Date: 2011-09-21 14:50:16


Author: awulkiew
Date: 2011-09-21 14:50:15 EDT (Wed, 21 Sep 2011)
New Revision: 74497
URL: http://svn.boost.org/trac/boost/changeset/74497

Log:
distance calculators that will be used in knn implemented, some names changed to more general in knn results wrappers.
Added:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/distance_calc.hpp (contents, props changed)
Text files modified:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp | 6 +++++-
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp | 39 +++++++++++++++++++--------------------
   2 files changed, 24 insertions(+), 21 deletions(-)

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/distance_calc.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/distance_calc.hpp 2011-09-21 14:50:15 EDT (Wed, 21 Sep 2011)
@@ -0,0 +1,188 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.SpatialIndex - Spatial index distances calculators used in nearest query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_DISTANCE_CALC_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_DISTANCE_CALC_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+//TODO: awulkiew - consider storing values instead of const references
+// it may be faster and it eliminates problems with storing of references to temporaries
+
+struct distance_near_tag {};
+struct distance_far_tag {};
+struct distance_centroid_tag {};
+
+template <typename Point, typename Tag>
+struct distance_xxx
+ : nonassignable
+{
+ typedef typename index::traits::coordinate_type<Point>::type coordinate_type;
+ typedef typename geometry::default_distance_result<Point, Point>::type distance_type;
+
+ inline explicit distance_xxx(
+ Point const& p,
+ coordinate_type const& distance_near = coordinate_type(0),
+ coordinate_type const& distance_far = std::numeric_limits<coordinate_type>::max()
+ )
+ : point(p)
+ , comparable_near(distance_near * distance_near)
+ , comparable_far(distance_far * distance_far)
+ {}
+
+ Point const& point;
+ distance_type comparable_near;
+ distance_type comparable_far;
+};
+
+} // namespace detail
+
+template <typename Point>
+inline detail::distance_xxx<Point, detail::distance_near_tag>
+distance(
+ Point const& p,
+ typename index::traits::coordinate_type<Point>::type const& near
+ = typename index::traits::coordinate_type<Point>::type(0),
+ typename index::traits::coordinate_type<Point>::type const& far
+ = std::numeric_limits<typename index::traits::coordinate_type<Point>::type>::max()
+)
+{
+ return detail::detail::distance_xxx<Point, detail::distance_near_tag>(p, near, far);
+}
+
+template <typename Point>
+inline detail::distance_xxx<Point, detail::distance_near_tag>
+distance_near(
+ Point const& p,
+ typename index::traits::coordinate_type<Point>::type const& near
+ = typename index::traits::coordinate_type<Point>::type(0),
+ typename index::traits::coordinate_type<Point>::type const& far
+ = std::numeric_limits<typename index::traits::coordinate_type<Point>::type>::max()
+)
+{
+ return detail::detail::distance_xxx<Point, detail::distance_near_tag>(p, near, far);
+}
+
+template <typename Point>
+inline detail::distance_xxx<Point, detail::distance_far_tag>
+distance_far(
+ Point const& p,
+ typename index::traits::coordinate_type<Point>::type const& near
+ = typename index::traits::coordinate_type<Point>::type(0),
+ typename index::traits::coordinate_type<Point>::type const& far
+ = std::numeric_limits<typename index::traits::coordinate_type<Point>::type>::max()
+ )
+{
+ return detail::detail::distance_xxx<Point, detail::distance_far_tag>(p, near, far);
+}
+
+template <typename Point>
+inline detail::distance_xxx<Point, detail::distance_centroid_tag>
+distance_centroid(
+ Point const& p,
+ typename index::traits::coordinate_type<Point>::type const& near
+ = typename index::traits::coordinate_type<Point>::type(0),
+ typename index::traits::coordinate_type<Point>::type const& far
+ = std::numeric_limits<typename index::traits::coordinate_type<Point>::type>::max()
+ )
+{
+ return detail::detail::distance_xxx<Point, detail::distance_centroid_tag>(p, near, far);
+}
+
+namespace detail
+{
+
+template <typename Point, typename Indexable>
+struct distance_calc
+{
+ typedef typename geometry::default_distance_result<Point, Indexable>::type distance_type;
+
+ static inline distance_type apply(Point const& p, Indexable const& i)
+ {
+ return index::mindist(p, i);
+ }
+};
+
+template <typename Point, typename Indexable>
+struct distance_calc<
+ detail::distance_xxx<Point, detail::distance_near_tag>,
+ Indexable>
+{
+ typedef typename geometry::default_distance_result<Point, Indexable>::type distance_type;
+
+ static inline distance_type apply(
+ detail::distance_xxx<Point, detail::distance_near_tag> const& d,
+ Indexable const& i)
+ {
+ return index::mindist(d.point, i);
+ }
+};
+
+// TODO distance_centroid
+
+template <typename Point, typename Indexable>
+struct distance_calc<
+ detail::distance_xxx<Point, detail::distance_far_tag>,
+ Indexable>
+{
+ typedef typename geometry::default_distance_result<Point, Indexable>::type distance_type;
+
+ static inline distance_type apply(
+ detail::distance_xxx<Point, detail::distance_far_tag> const& d,
+ Indexable const& i)
+ {
+ return index::maxdist(d.point, i);
+ }
+};
+
+template <typename Point>
+struct is_distance_ok
+{
+ template <typename DistanceType>
+ static inline bool apply(Point const&, DistanceType const&)
+ {
+ return true;
+ }
+};
+
+template <typename Point, typename Tag>
+struct is_distance_ok< detail::distance_xxx<Point, Tag> >
+{
+ template <typename DistanceType>
+ static inline bool apply(
+ detail::distance_xxx<Point, Tag> const& dx,
+ DistanceType const& d)
+ {
+ return dx.comparable_near <= d && d <= dx.comparable_far;
+ }
+};
+
+} // namespace detail
+
+template <typename PointData, typename Indexable>
+inline typename detail::distance_calc<PointData, Indexable>::distance_type
+distance_calc(PointData const& p, Indexable const& i)
+{
+ return detail::distance_calc<PointData, Indexable>
+ ::apply(p, i);
+}
+
+template <typename PointData, typename DistanceType>
+inline bool
+is_distance_ok(PointData const& p, DistanceType const& d)
+{
+ return detail::is_distance_ok<PointData>
+ ::apply(p, d);
+}
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_DISTANCE_CALC_HPP

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp 2011-09-21 14:50:15 EDT (Wed, 21 Sep 2011)
@@ -96,7 +96,11 @@
 
 // predicate check
 
-// TODO: use empty definitions here + MPL_ASSERT
+// TODO: use empty definitions here + MPL_ASSERT ?
+// implement default values predicates applied to values in leafs, as a function/functor as simple as possible
+// bool fun(Value const& v);
+// distinguish between geometries and other types by use of geometry::tag
+// in predicate_check_default<..., GeomTag> -> predicate_check_default<..., void>
 
 template <typename Geometry, typename Tag>
 struct predicate_check

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-21 14:50:15 EDT (Wed, 21 Sep 2011)
@@ -14,6 +14,8 @@
 #include <boost/geometry/extensions/index/algorithms/minmaxdist.hpp>
 #include <boost/geometry/extensions/index/algorithms/maxdist.hpp>
 
+#include <boost/geometry/extensions/index/nearest_calc.hpp>
+
 #include <boost/geometry/extensions/index/rtree/node/node.hpp>
 
 namespace boost { namespace geometry { namespace index {
@@ -32,37 +34,37 @@
     typedef typename geometry::default_distance_result<Point, indexable_type>::type distance_type;
 
     inline nearest_one()
- : comp_mindist(std::numeric_limits<distance_type>::max())
+ : comp_dist(std::numeric_limits<distance_type>::max())
     {}
 
- inline void store(Value const& val, distance_type const& curr_mindist)
+ inline void store(Value const& val, distance_type const& curr_comp_dist)
     {
- if ( curr_mindist < comp_mindist )
+ if ( curr_comp_dist < comp_dist )
         {
- comp_mindist = curr_mindist;
+ comp_dist = curr_mindist;
             value = val;
         }
     }
 
- inline bool is_mindist_valid() const
+ inline bool is_comparable_distance_valid() const
     {
- return comp_mindist < std::numeric_limits<distance_type>::max();
+ return comp_dist < std::numeric_limits<distance_type>::max();
     }
 
- inline distance_type mindist() const
+ inline distance_type comparable_distance() const
     {
- return comp_mindist;
+ return comp_dist;
     }
 
     inline size_t get(Value & v)
     {
         v = value;
- return is_mindist_valid() ? 1 : 0;
+ return is_comparable_distance_valid() ? 1 : 0;
     }
 
 private:
     Value value;
- distance_type comp_mindist;
+ distance_type comp_dist;
 };
 
 template <typename Value, typename Translator, typename Point>
@@ -79,9 +81,9 @@
         m_neighbors.reserve(m_count + 1);
     }
 
- inline void store(Value const& val, distance_type const& curr_mindist)
+ inline void store(Value const& val, distance_type const& curr_comp_dist)
     {
- m_neighbors.push_back(std::make_pair(curr_mindist, val));
+ m_neighbors.push_back(std::make_pair(curr_comp_dist, val));
         std::sort(m_neighbors.begin(), m_neighbors.end(), neighbors_less);
 
         if ( m_count < m_neighbors.size() )
@@ -93,12 +95,12 @@
         // check the furthest distance at the first place, before push_back()
     }
 
- inline bool is_mindist_valid() const
+ inline bool is_comparable_distance_valid() const
     {
         return m_neighbors.size() == m_count;
     }
 
- inline distance_type mindist() const
+ inline distance_type comparable_distance() const
     {
         return m_neighbors.size() < m_count ?
             std::numeric_limits<distance_type>::max() :
@@ -134,10 +136,7 @@
     typename Box,
     typename Point,
     typename Predicates,
- typename Result = typename geometry::default_distance_result<
- Point,
- typename Translator::indexable_type
- >::type
+ typename Result
>
 class nearest
     : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
@@ -230,11 +229,11 @@
     inline void prune_nodes(ActiveBranchList & abl) const
     {
         // if some value were found
- if ( m_result.is_mindist_valid() )
+ if ( m_result.is_comparable_distance_valid() )
         {
             // prune if box's mindist is further than value's mindist
             while ( !abl.empty() &&
- m_result.mindist() < abl.back().first )
+ m_result.comparable_distance() < abl.back().first )
             {
                 abl.pop_back();
             }


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