加载中...
搜索中...
无匹配项
point_quadtree.cuh
1/*
2 * 版权所有 (c) 2022-2024, NVIDIA CORPORATION.
3 *
4 * 获得 Apache 许可证 2.0 版 ("许可证") 的许可;
5 * 除非遵守许可证,否则您不得使用此文件。
6 * 您可以在以下地址获取许可证的副本
7 *
8 * https://apache.ac.cn/licenses/LICENSE-2.0
9 *
10 * 除非适用法律要求或书面同意,软件是
11 * 根据许可证分发是基于“原样”分发的,
12 * 不附带任何形式的明示或暗示的担保或条件。
13 * 有关管理许可和
14 * 限制的特定语言,请参阅许可证。
15 */
16
17#pragma once
18
20#include <cuspatial/traits.hpp>
21
22#include <rmm/cuda_stream_view.hpp>
23#include <rmm/device_uvector.hpp>
24#include <rmm/mr/device/per_device_resource.hpp>
25#include <rmm/resource_ref.hpp>
26
27#include <thrust/iterator/zip_iterator.h>
28#include <thrust/tuple.h>
29
30#include <tuple>
31
32namespace cuspatial {
33
38
40 // quadtree 节点键的 uint32_t 向量
41 rmm::device_uvector<uint32_t> key;
42 // quadtree 层级的 uint8_t 向量
43 rmm::device_uvector<uint8_t> level;
44 // bool 向量,指示节点是父节点 (true) 还是叶节点 (false)
45 rmm::device_uvector<bool> internal_node_flag;
46 // 子节点数(如果是内部节点)或点数的 uint32_t 向量
47 rmm::device_uvector<uint32_t> length;
48 // 第一个子节点位置(如果是内部节点)或第一个点位置的 uint32_t 向量
49 rmm::device_uvector<uint32_t> offset;
50};
51
53 using key_iterator = decltype(point_quadtree::key)::const_iterator;
54 using level_iterator = decltype(point_quadtree::level)::const_iterator;
55 using internal_node_flag_iterator = decltype(point_quadtree::internal_node_flag)::const_iterator;
56 using length_iterator = decltype(point_quadtree::length)::const_iterator;
57 using offset_iterator = decltype(point_quadtree::offset)::const_iterator;
58
61 : _key_begin(quadtree.key.begin()),
62 _key_end(quadtree.key.end()),
63 _level_begin(quadtree.level.begin()),
64 _level_end(quadtree.level.end()),
65 _internal_node_flag_begin(quadtree.internal_node_flag.begin()),
66 _internal_node_flag_end(quadtree.internal_node_flag.end()),
67 _length_begin(quadtree.length.begin()),
68 _length_end(quadtree.length.end()),
69 _offset_begin(quadtree.offset.begin()),
70 _offset_end(quadtree.offset.end())
71 {
72 }
73
76 key_iterator key_end,
77 level_iterator level_begin,
78 internal_node_flag_iterator internal_node_flag_begin,
79 length_iterator length_begin,
80 offset_iterator offset_begin)
81 : _key_begin(key_begin),
82 _key_end(key_end),
83 _level_begin(level_begin),
84 _level_end(level_begin + std::distance(key_begin, key_end)),
85 _internal_node_flag_begin(internal_node_flag_begin),
86 _internal_node_flag_end(internal_node_flag_begin + std::distance(key_begin, key_end)),
87 _length_begin(length_begin),
88 _length_end(length_begin + std::distance(key_begin, key_end)),
89 _offset_begin(offset_begin),
90 _offset_end(offset_begin + std::distance(key_begin, key_end))
91 {
92 }
93
95 CUSPATIAL_HOST_DEVICE auto num_nodes() const { return std::distance(_key_begin, _key_end); }
96
98 CUSPATIAL_HOST_DEVICE auto key_begin() const { return _key_begin; }
100 CUSPATIAL_HOST_DEVICE auto key_end() const { return _key_end; }
101
103 CUSPATIAL_HOST_DEVICE auto level_begin() const { return _level_begin; }
105 CUSPATIAL_HOST_DEVICE auto level_end() const { return _level_end; }
106
108 CUSPATIAL_HOST_DEVICE auto internal_node_flag_begin() const { return _internal_node_flag_begin; }
110 CUSPATIAL_HOST_DEVICE auto internal_node_flag_end() const { return _internal_node_flag_end; }
111
113 CUSPATIAL_HOST_DEVICE auto length_begin() const { return _length_begin; }
115 CUSPATIAL_HOST_DEVICE auto length_end() const { return _length_end; }
116
118 CUSPATIAL_HOST_DEVICE auto offset_begin() const { return _offset_begin; }
120 CUSPATIAL_HOST_DEVICE auto offset_end() const { return _offset_end; }
121
122 protected
123 key_iterator _key_begin;
124 key_iterator _key_end;
125 level_iterator _level_begin;
126 level_iterator _level_end;
127 internal_node_flag_iterator _internal_node_flag_begin;
128 internal_node_flag_iterator _internal_node_flag_end;
129 length_iterator _length_begin;
130 length_iterator _length_end;
131 offset_iterator _offset_begin;
132 offset_iterator _offset_end;
133};
134
170template <class PointIterator, class T = typename cuspatial::iterator_value_type<PointIterator>>
171std::pair<rmm::device_uvector<uint32_t>, point_quadtree> quadtree_on_points(
172 PointIterator points_first,
173 PointIterator points_last,
174 vec_2d<T> vertex_1,
175 vec_2d<T> vertex_2,
176 T scale,
177 int8_t max_depth,
178 int32_t max_size,
179 rmm::cuda_stream_view stream = rmm::cuda_stream_default,
180 rmm::device_async_resource_ref mr = rmm::mr::get_current_device_resource());
181
185
186} // 命名空间 cuspatial
187
188#include <cuspatial/detail/point_quadtree.cuh>
一种通用的二维向量类型。
std::pair< rmm::device_uvector< uint32_t >, point_quadtree > quadtree_on_points(PointIterator points_first, PointIterator points_last, vec_2d< T > vertex_1, vec_2d< T > vertex_2, T scale, int8_t max_depth, int32_t max_size, rmm::cuda_stream_view stream=rmm::cuda_stream_default, rmm::device_async_resource_ref mr=rmm::mr::get_current_device_resource())
从点构造一个四叉树结构。
CUSPATIAL_HOST_DEVICE auto length_begin() const
返回指向四叉树第一个长度的迭代器。
CUSPATIAL_HOST_DEVICE auto offset_end() const
返回指向四叉树最后一个子节点/点偏移量的迭代器。
CUSPATIAL_HOST_DEVICE auto length_end() const
返回指向四叉树最后一个长度的迭代器。
CUSPATIAL_HOST_DEVICE auto offset_begin() const
返回指向四叉树第一个子节点/点偏移量的迭代器。
CUSPATIAL_HOST_DEVICE auto internal_node_flag_begin() const
返回指向四叉树第一个内部节点标志的迭代器。
CUSPATIAL_HOST_DEVICE auto key_begin() const
返回指向四叉树第一个环的迭代器。
CUSPATIAL_HOST_DEVICE auto num_nodes() const
返回四叉树中的键数量。
CUSPATIAL_HOST_DEVICE auto key_end() const
返回指向四叉树最后一个环的迭代器。
CUSPATIAL_HOST_DEVICE auto internal_node_flag_end() const
返回指向四叉树最后一个内部节点标志的迭代器。
point_quadtree_ref(key_iterator key_begin, key_iterator key_end, level_iterator level_begin, internal_node_flag_iterator internal_node_flag_begin, length_iterator length_begin, offset_iterator offset_begin)
从迭代器和大小构造。
point_quadtree_ref(point_quadtree const &quadtree)
从 point_quadtree 结构体构造。
CUSPATIAL_HOST_DEVICE auto level_end() const
返回指向四叉树最后一个层级的迭代器。
CUSPATIAL_HOST_DEVICE auto level_begin() const
返回指向四叉树第一个层级的迭代器。