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
|