cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
combined_sorter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <memory>
5#include <numeric>
6#include <utility>
7#include <vector>
8
9#include <cpp-toolbox/cpp-toolbox_export.hpp>
11
12namespace toolbox::pcl
13{
14
44template<typename DataType>
45class CPP_TOOLBOX_EXPORT combined_sorter_t
46 : public base_correspondence_sorter_t<combined_sorter_t<DataType>, DataType>
47{
48public:
49 using base_type =
51 using typename base_type::point_cloud_ptr;
52 using typename base_type::correspondences_ptr;
53 using typename base_type::quality_scores_t;
54
55 combined_sorter_t() = default;
56 ~combined_sorter_t() = default;
57
64 template<typename SorterType>
65 void add_sorter(std::shared_ptr<SorterType> sorter, DataType weight)
66 {
67 static_assert(
68 std::is_base_of_v<
70 "SorterType must inherit from base_correspondence_sorter_t");
71
72 m_sorters.emplace_back(
73 std::make_unique<sorter_wrapper_impl_t<SorterType>>(sorter), weight);
74 this->m_cached = false;
75 }
76
81 {
82 DataType sum = 0;
83 for (const auto& [sorter, weight] : m_sorters) {
84 sum += weight;
85 }
86
87 if (sum > std::numeric_limits<DataType>::epsilon()) {
88 for (auto& [sorter, weight] : m_sorters) {
89 weight /= sum;
90 }
91 }
92 this->m_cached = false;
93 }
94
99 [[nodiscard]] std::size_t get_num_sorters() const { return m_sorters.size(); }
100
106 [[nodiscard]] DataType get_weight(std::size_t index) const
107 {
108 if (index >= m_sorters.size()) {
109 return 0;
110 }
111 return m_sorters[index].second;
112 }
113
117 void clear_sorters()
118 {
119 m_sorters.clear();
120 this->m_cached = false;
121 }
122
123protected:
124 // Friend declaration to allow base class access
125 friend class base_correspondence_sorter_t<combined_sorter_t<DataType>,
126 DataType>;
127
133 {
134 if (m_sorters.empty()) {
135 LOG_WARN_S << "警告:组合排序器没有子排序器 / Warning: Combined sorter "
136 "has no sub-sorters";
137 std::fill(scores.begin(), scores.end(), 0);
138 return;
139 }
140
141 // 初始化分数为0 / Initialize scores to 0
142 std::fill(scores.begin(), scores.end(), 0);
143
144 // 计算加权组合分数 / Compute weighted combined scores
145 for (const auto& [sorter_wrapper, weight] : m_sorters) {
146 // 设置数据 / Set data
147 sorter_wrapper->set_point_clouds(this->m_source_cloud,
148 this->m_target_cloud);
149 sorter_wrapper->set_correspondences(this->m_correspondences);
150
151 // 计算子排序器的分数 / Compute sub-sorter scores
152 quality_scores_t sub_scores = sorter_wrapper->compute_quality_scores();
153
154 // 加权累加 / Weighted accumulation
155 for (std::size_t i = 0; i < scores.size(); ++i) {
156 scores[i] += weight * sub_scores[i];
157 }
158 }
159 }
160
165 [[nodiscard]] std::string get_sorter_name_impl() const
166 {
167 std::string name = "Combined(";
168 for (std::size_t i = 0; i < m_sorters.size(); ++i) {
169 if (i > 0) name += ",";
170 name += m_sorters[i].first->get_sorter_name();
171 name += ":" + std::to_string(m_sorters[i].second);
172 }
173 name += ")";
174 return name;
175 }
176
177private:
178 // Type-erased wrapper for sorters
179 class sorter_wrapper_base_t
180 {
181 public:
182 virtual ~sorter_wrapper_base_t() = default;
183 virtual void set_point_clouds(const point_cloud_ptr& source,
184 const point_cloud_ptr& target) = 0;
185 virtual void set_correspondences(
186 const correspondences_ptr& correspondences) = 0;
187 virtual quality_scores_t compute_quality_scores() = 0;
188 virtual std::string get_sorter_name() const = 0;
189 };
190
191 template<typename SorterType>
192 class sorter_wrapper_impl_t : public sorter_wrapper_base_t
193 {
194 public:
195 explicit sorter_wrapper_impl_t(std::shared_ptr<SorterType> sorter)
196 : m_sorter(sorter)
197 {
198 }
199
200 void set_point_clouds(const point_cloud_ptr& source,
201 const point_cloud_ptr& target) override
202 {
203 m_sorter->set_point_clouds(source, target);
204 }
205
206 void set_correspondences(
207 const correspondences_ptr& correspondences) override
208 {
209 m_sorter->set_correspondences(correspondences);
210 }
211
212 quality_scores_t compute_quality_scores() override
213 {
214 return m_sorter->compute_quality_scores();
215 }
216
217 std::string get_sorter_name() const override
218 {
219 return m_sorter->get_sorter_name();
220 }
221
222 private:
223 std::shared_ptr<SorterType> m_sorter;
224 };
225
226 // 存储排序器和权重的向量 / Vector storing sorters and weights
227 std::vector<std::pair<std::unique_ptr<sorter_wrapper_base_t>, DataType>>
228 m_sorters;
229};
230
231} // namespace toolbox::pcl
对应关系排序器的基类(CRTP模式) / Base class for correspondence sorters (CRTP pattern)
Definition base_correspondence_sorter.hpp:51
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_correspondence_sorter.hpp:54
std::vector< DataType > quality_scores_t
Definition base_correspondence_sorter.hpp:56
std::shared_ptr< std::vector< correspondence_t > > correspondences_ptr
Definition base_correspondence_sorter.hpp:55
组合多个排序器的对应关系排序器 / Correspondence sorter that combines multiple sorters
Definition combined_sorter.hpp:47
void normalize_weights()
归一化权重,使其总和为1 / Normalize weights to sum to 1
Definition combined_sorter.hpp:80
std::string get_sorter_name_impl() const
获取排序器名称实现 / Get sorter name implementation
Definition combined_sorter.hpp:165
void add_sorter(std::shared_ptr< SorterType > sorter, DataType weight)
添加子排序器及其权重 / Add a sub-sorter with its weight
Definition combined_sorter.hpp:65
void compute_quality_scores_impl(quality_scores_t &scores)
计算质量分数的实现 / Implementation of quality score computation
Definition combined_sorter.hpp:132
std::size_t get_num_sorters() const
获取子排序器数量 / Get number of sub-sorters
Definition combined_sorter.hpp:99
DataType get_weight(std::size_t index) const
获取指定索引的权重 / Get weight at specified index
Definition combined_sorter.hpp:106
#define LOG_WARN_S
WARN级别流式日志的宏 / Macro for WARN level stream logging.
Definition thread_logger.hpp:1331
Definition base_correspondence_generator.hpp:18