annotate DEPENDENCIES/generic/include/boost/geometry/index/parameters.hpp @ 46:d572322e2efe

Fix to .cat file check (was susceptible to DOS line-endings) and subrepo update
author Chris Cannam
date Thu, 07 Aug 2014 14:39:38 +0100
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 // Boost.Geometry Index
Chris@16 2 //
Chris@16 3 // R-tree algorithms parameters
Chris@16 4 //
Chris@16 5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
Chris@16 6 //
Chris@16 7 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #ifndef BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
Chris@16 12 #define BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
Chris@16 13
Chris@16 14 #include <limits>
Chris@16 15
Chris@16 16 namespace boost { namespace geometry { namespace index {
Chris@16 17
Chris@16 18 namespace detail {
Chris@16 19
Chris@16 20 template <size_t MaxElements>
Chris@16 21 struct default_min_elements_s
Chris@16 22 {
Chris@16 23 // TODO - assert MaxElements <= (std::numeric_limits<size_t>::max)()/3
Chris@16 24 static const size_t raw_value = (MaxElements * 3) / 10;
Chris@16 25 static const size_t value = 1 <= raw_value ? raw_value : 1;
Chris@16 26 };
Chris@16 27
Chris@16 28 inline size_t default_min_elements_d()
Chris@16 29 {
Chris@16 30 return (std::numeric_limits<size_t>::max)();
Chris@16 31 }
Chris@16 32
Chris@16 33 inline size_t default_min_elements_d_calc(size_t max_elements, size_t min_elements)
Chris@16 34 {
Chris@16 35 if ( default_min_elements_d() == min_elements )
Chris@16 36 {
Chris@16 37 // TODO - assert MaxElements <= (std::numeric_limits<size_t>::max)()/3
Chris@16 38 size_t raw_value = (max_elements * 3) / 10;
Chris@16 39 return 1 <= raw_value ? raw_value : 1;
Chris@16 40 }
Chris@16 41
Chris@16 42 return min_elements;
Chris@16 43 }
Chris@16 44
Chris@16 45 template <size_t MaxElements>
Chris@16 46 struct default_rstar_reinserted_elements_s
Chris@16 47 {
Chris@16 48 // TODO - assert MaxElements <= (std::numeric_limits<size_t>::max)()/3
Chris@16 49 static const size_t value = (MaxElements * 3) / 10;
Chris@16 50 };
Chris@16 51
Chris@16 52 inline size_t default_rstar_reinserted_elements_d()
Chris@16 53 {
Chris@16 54 return (std::numeric_limits<size_t>::max)();
Chris@16 55 }
Chris@16 56
Chris@16 57 inline size_t default_rstar_reinserted_elements_d_calc(size_t max_elements, size_t reinserted_elements)
Chris@16 58 {
Chris@16 59 if ( default_rstar_reinserted_elements_d() == reinserted_elements )
Chris@16 60 {
Chris@16 61 // TODO - assert MaxElements <= (std::numeric_limits<size_t>::max)()/3
Chris@16 62 return (max_elements * 3) / 10;
Chris@16 63 }
Chris@16 64
Chris@16 65 return reinserted_elements;
Chris@16 66 }
Chris@16 67
Chris@16 68 } // namespace detail
Chris@16 69
Chris@16 70 /*!
Chris@16 71 \brief Linear r-tree creation algorithm parameters.
Chris@16 72
Chris@16 73 \tparam MaxElements Maximum number of elements in nodes.
Chris@16 74 \tparam MinElements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 75 */
Chris@16 76 template <size_t MaxElements,
Chris@16 77 size_t MinElements = detail::default_min_elements_s<MaxElements>::value
Chris@16 78 >
Chris@16 79 struct linear
Chris@16 80 {
Chris@16 81 BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
Chris@16 82 INVALID_STATIC_MIN_MAX_PARAMETERS, (linear));
Chris@16 83
Chris@16 84 static const size_t max_elements = MaxElements;
Chris@16 85 static const size_t min_elements = MinElements;
Chris@16 86
Chris@16 87 static size_t get_max_elements() { return MaxElements; }
Chris@16 88 static size_t get_min_elements() { return MinElements; }
Chris@16 89 };
Chris@16 90
Chris@16 91 /*!
Chris@16 92 \brief Quadratic r-tree creation algorithm parameters.
Chris@16 93
Chris@16 94 \tparam MaxElements Maximum number of elements in nodes.
Chris@16 95 \tparam MinElements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 96 */
Chris@16 97 template <size_t MaxElements,
Chris@16 98 size_t MinElements = detail::default_min_elements_s<MaxElements>::value>
Chris@16 99 struct quadratic
Chris@16 100 {
Chris@16 101 BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
Chris@16 102 INVALID_STATIC_MIN_MAX_PARAMETERS, (quadratic));
Chris@16 103
Chris@16 104 static const size_t max_elements = MaxElements;
Chris@16 105 static const size_t min_elements = MinElements;
Chris@16 106
Chris@16 107 static size_t get_max_elements() { return MaxElements; }
Chris@16 108 static size_t get_min_elements() { return MinElements; }
Chris@16 109 };
Chris@16 110
Chris@16 111 /*!
Chris@16 112 \brief R*-tree creation algorithm parameters.
Chris@16 113
Chris@16 114 \tparam MaxElements Maximum number of elements in nodes.
Chris@16 115 \tparam MinElements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 116 \tparam ReinsertedElements The number of elements reinserted by forced reinsertions algorithm.
Chris@16 117 If 0 forced reinsertions are disabled. Maximum value is Max+1-Min.
Chris@16 118 Greater values are truncated. Default: 0.3*Max.
Chris@16 119 \tparam OverlapCostThreshold The number of most suitable leafs taken into account while choosing
Chris@16 120 the leaf node to which currently inserted value will be added. If
Chris@16 121 value is in range (0, MaxElements) - the algorithm calculates
Chris@16 122 nearly minimum overlap cost, otherwise all leafs are analyzed
Chris@16 123 and true minimum overlap cost is calculated. Default: 32.
Chris@16 124 */
Chris@16 125 template <size_t MaxElements,
Chris@16 126 size_t MinElements = detail::default_min_elements_s<MaxElements>::value,
Chris@16 127 size_t ReinsertedElements = detail::default_rstar_reinserted_elements_s<MaxElements>::value,
Chris@16 128 size_t OverlapCostThreshold = 32>
Chris@16 129 struct rstar
Chris@16 130 {
Chris@16 131 BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
Chris@16 132 INVALID_STATIC_MIN_MAX_PARAMETERS, (rstar));
Chris@16 133
Chris@16 134 static const size_t max_elements = MaxElements;
Chris@16 135 static const size_t min_elements = MinElements;
Chris@16 136 static const size_t reinserted_elements = ReinsertedElements;
Chris@16 137 static const size_t overlap_cost_threshold = OverlapCostThreshold;
Chris@16 138
Chris@16 139 static size_t get_max_elements() { return MaxElements; }
Chris@16 140 static size_t get_min_elements() { return MinElements; }
Chris@16 141 static size_t get_reinserted_elements() { return ReinsertedElements; }
Chris@16 142 static size_t get_overlap_cost_threshold() { return OverlapCostThreshold; }
Chris@16 143 };
Chris@16 144
Chris@16 145 //template <size_t MaxElements, size_t MinElements>
Chris@16 146 //struct kmeans
Chris@16 147 //{
Chris@16 148 // static const size_t max_elements = MaxElements;
Chris@16 149 // static const size_t min_elements = MinElements;
Chris@16 150 //};
Chris@16 151
Chris@16 152 /*!
Chris@16 153 \brief Linear r-tree creation algorithm parameters - run-time version.
Chris@16 154 */
Chris@16 155 class dynamic_linear
Chris@16 156 {
Chris@16 157 public:
Chris@16 158 /*!
Chris@16 159 \brief The constructor.
Chris@16 160
Chris@16 161 \param max_elements Maximum number of elements in nodes.
Chris@16 162 \param min_elements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 163 */
Chris@16 164 dynamic_linear(size_t max_elements,
Chris@16 165 size_t min_elements = detail::default_min_elements_d())
Chris@16 166 : m_max_elements(max_elements)
Chris@16 167 , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
Chris@16 168 {
Chris@16 169 if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
Chris@16 170 detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_linear");
Chris@16 171 }
Chris@16 172
Chris@16 173 size_t get_max_elements() const { return m_max_elements; }
Chris@16 174 size_t get_min_elements() const { return m_min_elements; }
Chris@16 175
Chris@16 176 private:
Chris@16 177 size_t m_max_elements;
Chris@16 178 size_t m_min_elements;
Chris@16 179 };
Chris@16 180
Chris@16 181 /*!
Chris@16 182 \brief Quadratic r-tree creation algorithm parameters - run-time version.
Chris@16 183 */
Chris@16 184 class dynamic_quadratic
Chris@16 185 {
Chris@16 186 public:
Chris@16 187 /*!
Chris@16 188 \brief The constructor.
Chris@16 189
Chris@16 190 \param max_elements Maximum number of elements in nodes.
Chris@16 191 \param min_elements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 192 */
Chris@16 193 dynamic_quadratic(size_t max_elements,
Chris@16 194 size_t min_elements = detail::default_min_elements_d())
Chris@16 195 : m_max_elements(max_elements)
Chris@16 196 , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
Chris@16 197 {
Chris@16 198 if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
Chris@16 199 detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_quadratic");
Chris@16 200 }
Chris@16 201
Chris@16 202 size_t get_max_elements() const { return m_max_elements; }
Chris@16 203 size_t get_min_elements() const { return m_min_elements; }
Chris@16 204
Chris@16 205 private:
Chris@16 206 size_t m_max_elements;
Chris@16 207 size_t m_min_elements;
Chris@16 208 };
Chris@16 209
Chris@16 210 /*!
Chris@16 211 \brief R*-tree creation algorithm parameters - run-time version.
Chris@16 212 */
Chris@16 213 class dynamic_rstar
Chris@16 214 {
Chris@16 215 public:
Chris@16 216 /*!
Chris@16 217 \brief The constructor.
Chris@16 218
Chris@16 219 \param max_elements Maximum number of elements in nodes.
Chris@16 220 \param min_elements Minimum number of elements in nodes. Default: 0.3*Max.
Chris@16 221 \param reinserted_elements The number of elements reinserted by forced reinsertions algorithm.
Chris@16 222 If 0 forced reinsertions are disabled. Maximum value is Max-Min+1.
Chris@16 223 Greater values are truncated. Default: 0.3*Max.
Chris@16 224 \param overlap_cost_threshold The number of most suitable leafs taken into account while choosing
Chris@16 225 the leaf node to which currently inserted value will be added. If
Chris@16 226 value is in range (0, MaxElements) - the algorithm calculates
Chris@16 227 nearly minimum overlap cost, otherwise all leafs are analyzed
Chris@16 228 and true minimum overlap cost is calculated. Default: 32.
Chris@16 229 */
Chris@16 230 dynamic_rstar(size_t max_elements,
Chris@16 231 size_t min_elements = detail::default_min_elements_d(),
Chris@16 232 size_t reinserted_elements = detail::default_rstar_reinserted_elements_d(),
Chris@16 233 size_t overlap_cost_threshold = 32)
Chris@16 234 : m_max_elements(max_elements)
Chris@16 235 , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
Chris@16 236 , m_reinserted_elements(detail::default_rstar_reinserted_elements_d_calc(max_elements, reinserted_elements))
Chris@16 237 , m_overlap_cost_threshold(overlap_cost_threshold)
Chris@16 238 {
Chris@16 239 if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
Chris@16 240 detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_rstar");
Chris@16 241 }
Chris@16 242
Chris@16 243 size_t get_max_elements() const { return m_max_elements; }
Chris@16 244 size_t get_min_elements() const { return m_min_elements; }
Chris@16 245 size_t get_reinserted_elements() const { return m_reinserted_elements; }
Chris@16 246 size_t get_overlap_cost_threshold() const { return m_overlap_cost_threshold; }
Chris@16 247
Chris@16 248 private:
Chris@16 249 size_t m_max_elements;
Chris@16 250 size_t m_min_elements;
Chris@16 251 size_t m_reinserted_elements;
Chris@16 252 size_t m_overlap_cost_threshold;
Chris@16 253 };
Chris@16 254
Chris@16 255 }}} // namespace boost::geometry::index
Chris@16 256
Chris@16 257 #endif // BOOST_GEOMETRY_INDEX_PARAMETERS_HPP