4 template<
typename VarType,
typename WeightType>
5 template<
typename BinType>
11 auto min_bin = m_binning.getBinIndex(min);
12 if (min_bin > m_clip_left && min_bin <= m_clip_right)
13 m_clip_left = min_bin;
15 auto max_bin = m_binning.getBinIndex(max);
16 if (max_bin >= m_clip_left && max_bin < m_clip_right)
17 m_clip_right = max_bin;
21 template<
typename VarType,
typename WeightType>
22 template<
typename BinType>
24 VarType total = 0, total_count = 0;
28 for (
auto i = m_clip_left; i <= m_clip_right; ++i) {
29 auto center = m_binning.getBin(i);
30 total += (*m_counts)[i] * center;
31 total_count += (*m_counts)[i];
32 sigma += (*m_counts)[i] * center * center;
35 VarType mean = total / total_count;
36 sigma = sigma / total_count - mean * mean;
43 WeightType low_sum = 0., high_sum = 0.;
44 auto low_i = m_clip_left, high_i = m_clip_right;
45 while (low_i <= high_i) {
46 if (low_sum < high_sum) {
47 low_sum += (*m_counts)[low_i++];
50 high_sum += (*m_counts)[high_i--];
54 assert(low_sum + high_sum == total_count);
58 auto edges = m_binning.getBinEdges(high_i + 1);
59 auto bin_width = (edges.second - edges.first);
60 auto max_counts =
std::max((*m_counts)[low_i], (*m_counts)[high_i]);
61 median = edges.first + bin_width * (high_sum - low_sum) / (2.0 * max_counts);
64 median = m_binning.getBin(0);
76 template<
typename BinType,
typename IterType>
79 template <
typename U,
typename = decltype(std::declval<U>().computeBins(std::declval<IterType>(), std::declval<IterType>()))>
struct SFINAE;
81 template<
typename U>
static int Test(...);
82 static constexpr
bool value =
sizeof(Test<BinType>(0)) ==
sizeof(char);
88 template<
typename BinType,
typename IterType>
90 binning.computeBins(begin, end);
96 template<
typename BinType,
typename IterType>
100 template<
typename VarType,
typename WeightType>
101 template<
typename BinType>
102 template<
typename IterType,
typename WeightIterType>
109 m_clip_right = m_binning.getBinCount() - 1;
110 m_counts->resize(m_binning.getBinCount());
112 ssize_t nbins = m_counts->size();
115 for (; i != end; ++i, ++wi) {
116 auto bin = m_binning.getBinIndex(*i);
117 if (bin >= 0 && bin < nbins) {
118 (*m_counts)[bin] += *wi;
void computeBinsForwarder(BinType &binning, IterType begin, IterType end, std::true_type)
static constexpr bool value
static char Test(SFINAE< U > *)