|
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