ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
HashMap.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
11 #include "cloudViewer/core/Dtype.h"
15 
16 namespace cloudViewer {
17 namespace core {
18 
19 class DeviceHashBackend;
20 
22 
23 class HashMap : public IsDevice {
24 public:
26  HashMap(int64_t init_capacity,
27  const Dtype& key_dtype,
28  const SizeVector& key_element_shape,
29  const Dtype& value_dtype,
30  const SizeVector& value_element_shapes,
31  const Device& device,
32  const HashBackendType& backend = HashBackendType::Default);
33 
37  HashMap(int64_t init_capacity,
38  const Dtype& key_dtype,
39  const SizeVector& key_element_shape,
40  const std::vector<Dtype>& dtypes_value,
41  const std::vector<SizeVector>& element_shapes_value,
42  const Device& device,
43  const HashBackendType& backend = HashBackendType::Default);
44 
46  ~HashMap() = default;
47 
49  void Reserve(int64_t capacity);
50 
59  std::pair<Tensor, Tensor> Insert(const Tensor& input_keys,
60  const Tensor& input_values);
61 
66  std::pair<Tensor, Tensor> Insert(
67  const Tensor& input_keys,
68  const std::vector<Tensor>& input_values_soa);
69 
75  std::pair<Tensor, Tensor> Activate(const Tensor& input_keys);
76 
81  std::pair<Tensor, Tensor> Find(const Tensor& input_keys);
82 
86  Tensor Erase(const Tensor& input_keys);
87 
91  Tensor GetActiveIndices() const;
92 
96  void Insert(const Tensor& input_keys,
97  const Tensor& input_values,
98  Tensor& output_buf_indices,
99  Tensor& output_masks);
100 
104  void Insert(const Tensor& input_keys,
105  const std::vector<Tensor>& input_values_soa,
106  Tensor& output_buf_indices,
107  Tensor& output_masks);
108 
112  void Activate(const Tensor& input_keys,
113  Tensor& output_buf_indices,
114  Tensor& output_masks);
115 
119  void Find(const Tensor& input_keys,
120  Tensor& output_buf_indices,
121  Tensor& output_masks);
122 
125  void Erase(const Tensor& input_keys, Tensor& output_masks);
126 
129  void GetActiveIndices(Tensor& output_buf_indices) const;
130 
132  void Clear();
133 
138  void Save(const std::string& file_name);
139 
142  static HashMap Load(const std::string& file_name);
143 
145  HashMap Clone() const;
146 
148  HashMap To(const Device& device, bool copy = false) const;
149 
151  int64_t Size() const;
152 
154  int64_t GetCapacity() const;
155 
157  int64_t GetBucketCount() const;
158 
160  Device GetDevice() const override;
161 
165  Tensor GetKeyTensor() const;
166 
170  std::vector<Tensor> GetValueTensors() const;
171 
175  Tensor GetValueTensor(size_t index = 0) const;
176 
178  std::vector<int64_t> BucketSizes() const;
179 
181  float LoadFactor() const;
182 
184  std::shared_ptr<DeviceHashBackend> GetDeviceHashBackend() const {
185  return device_hashmap_;
186  }
187 
188 protected:
189  void Init(int64_t init_capacity,
190  const Device& device,
191  const HashBackendType& backend);
192 
193  void InsertImpl(const Tensor& input_keys,
194  const std::vector<Tensor>& input_values_soa,
195  Tensor& output_buf_indices,
196  Tensor& output_masks,
197  bool is_activate_op = false);
198 
199  void CheckKeyLength(const Tensor& input_keys) const;
201  const Tensor& input_keys,
202  const std::vector<Tensor>& input_values_soa) const;
203  void CheckKeyCompatibility(const Tensor& input_keys) const;
205  const std::vector<Tensor>& input_values_soa) const;
206 
207  void PrepareIndicesOutput(Tensor& output_buf_indices, int64_t length) const;
208  void PrepareMasksOutput(Tensor& output_masks, int64_t length) const;
209 
210  std::pair<int64_t, std::vector<int64_t>> GetCommonValueSizeDivisor();
211 
212 private:
213  std::shared_ptr<DeviceHashBackend> device_hashmap_;
214 
215  Dtype key_dtype_;
216  SizeVector key_element_shape_;
217 
218  std::vector<Dtype> dtypes_value_;
219  std::vector<SizeVector> element_shapes_value_;
220 };
221 
222 } // namespace core
223 } // namespace cloudViewer
bool copy
Definition: VtkUtils.cpp:74
void PrepareMasksOutput(Tensor &output_masks, int64_t length) const
Definition: HashMap.cpp:438
std::vector< int64_t > BucketSizes() const
Return number of elements per bucket.
Definition: HashMap.cpp:313
void PrepareIndicesOutput(Tensor &output_buf_indices, int64_t length) const
Definition: HashMap.cpp:429
HashMap(int64_t init_capacity, const Dtype &key_dtype, const SizeVector &key_element_shape, const Dtype &value_dtype, const SizeVector &value_element_shapes, const Device &device, const HashBackendType &backend=HashBackendType::Default)
Initialize a hash map given a key and a value dtype and element shape.
Definition: HashMap.cpp:20
std::pair< Tensor, Tensor > Activate(const Tensor &input_keys)
Definition: HashMap.cpp:94
void InsertImpl(const Tensor &input_keys, const std::vector< Tensor > &input_values_soa, Tensor &output_buf_indices, Tensor &output_masks, bool is_activate_op=false)
Definition: HashMap.cpp:118
std::pair< Tensor, Tensor > Find(const Tensor &input_keys)
Definition: HashMap.cpp:100
void CheckKeyCompatibility(const Tensor &input_keys) const
Definition: HashMap.cpp:383
HashMap To(const Device &device, bool copy=false) const
Convert the hash map to another device.
Definition: HashMap.cpp:229
std::vector< Tensor > GetValueTensors() const
Definition: HashMap.cpp:275
void CheckKeyValueLengthCompatibility(const Tensor &input_keys, const std::vector< Tensor > &input_values_soa) const
Definition: HashMap.cpp:364
void Clear()
Clear stored map without reallocating the buffers.
Definition: HashMap.cpp:217
int64_t GetBucketCount() const
Get the number of buckets of the internal hash map.
Definition: HashMap.cpp:260
Tensor Erase(const Tensor &input_keys)
Definition: HashMap.cpp:106
void CheckKeyLength(const Tensor &input_keys) const
Definition: HashMap.cpp:357
static HashMap Load(const std::string &file_name)
Definition: HashMap.cpp:223
void Save(const std::string &file_name)
Definition: HashMap.cpp:219
void Init(int64_t init_capacity, const Device &device, const HashBackendType &backend)
Definition: HashMap.cpp:319
std::shared_ptr< DeviceHashBackend > GetDeviceHashBackend() const
Return the implementation of the device hash backend.
Definition: HashMap.h:184
int64_t GetCapacity() const
Get the capacity of the hash map.
Definition: HashMap.cpp:258
std::pair< Tensor, Tensor > Insert(const Tensor &input_keys, const Tensor &input_values)
Definition: HashMap.cpp:80
void Reserve(int64_t capacity)
Reserve the internal hash map with the given capacity by rehashing.
Definition: HashMap.cpp:48
Tensor GetActiveIndices() const
Definition: HashMap.cpp:112
Tensor GetKeyTensor() const
Definition: HashMap.cpp:266
void CheckValueCompatibility(const std::vector< Tensor > &input_values_soa) const
Definition: HashMap.cpp:398
float LoadFactor() const
Return size / bucket_count.
Definition: HashMap.cpp:317
~HashMap()=default
Default destructor.
Device GetDevice() const override
Get the device of the hash map.
Definition: HashMap.cpp:264
int64_t Size() const
Get the size (number of active entries) of the hash map.
Definition: HashMap.cpp:256
Tensor GetValueTensor(size_t index=0) const
Definition: HashMap.cpp:294
HashMap Clone() const
Clone the hash map with buffers.
Definition: HashMap.cpp:227
std::pair< int64_t, std::vector< int64_t > > GetCommonValueSizeDivisor()
__host__ __device__ float length(float2 v)
Definition: cutil_math.h:1162
Generic file read and write utility for python interface.