Alexandria  2.19
Please provide a description of the project.
Histogram.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012-2021 Euclid Science Ground Segment
3  *
4  * This library is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU Lesser General Public License as published by the Free
6  * Software Foundation; either version 3.0 of the License, or (at your option)
7  * any later version.
8  *
9  * This library is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12  * details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
25 #ifndef ALEXANDRIA_HISTOGRAM_HISTOGRAM_H
26 #define ALEXANDRIA_HISTOGRAM_HISTOGRAM_H
27 
30 #include <algorithm>
31 #include <cassert>
32 #include <cmath>
33 #include <memory>
34 #include <tuple>
35 #include <type_traits>
36 #include <utility>
37 #include <vector>
38 
39 namespace Euclid {
40 namespace Histogram {
41 
48 template <typename VarType>
49 class BinStrategy {
50 public:
56  BinStrategy() : m_nbins(0) {}
57 
61  virtual ~BinStrategy() = default;
62 
66  size_t getBinCount() const {
67  return m_nbins;
68  }
69 
78  virtual ssize_t getBinIndex(VarType value) const = 0;
79 
86  virtual std::vector<VarType> getEdges() const {
87  std::vector<VarType> edges(m_nbins + 1);
88  size_t i = 0;
89  std::generate(edges.begin(), edges.end(), [this, &i]() { return getEdge(i++); });
90  return edges;
91  }
92 
100  virtual std::pair<VarType, VarType> getBinEdges(size_t i) const {
101  return std::make_pair(getEdge(i), getEdge(i + 1));
102  }
103 
108  virtual VarType getEdge(size_t e) const = 0;
109 
120  virtual VarType getBin(size_t i) const {
121  auto edges = getBinEdges(i);
122  return (edges.second + edges.first) / 2;
123  }
124 
125 protected:
126  size_t m_nbins;
127 };
128 
136 template <typename VarType, typename WeightType = float>
137 class Histogram {
138 public:
139  static_assert(std::is_arithmetic<VarType>::value, "Histogram only supports numerical types");
140  static_assert(std::is_arithmetic<WeightType>::value, "Histogram only supports numerical weights");
141 
155  template <typename IterType, typename BinType,
157  Histogram(IterType begin, IterType end, BinType&& bin_type) {
158  auto binning_impl = make_unique<ComputationImpl<BinType>>(std::move(bin_type));
159  binning_impl->computeBins(begin, end, ConstantWeight{});
160  m_binning_concept = std::move(binning_impl);
161  }
162 
184  template <typename IterType, typename WeightIterType, typename BinType,
186  Histogram(IterType begin, IterType end, WeightIterType wbegin, WeightIterType wend, BinType&& bin_type) {
187  assert(wend - wbegin == end - begin);
188  auto binning_impl = make_unique<ComputationImpl<BinType>>(std::move(bin_type));
189  binning_impl->computeBins(begin, end, wbegin);
190  m_binning_concept = std::move(binning_impl);
191  }
192 
196  Histogram(const Histogram& other) {
197  m_binning_concept = other.m_binning_concept->clone();
198  }
199 
203  Histogram(Histogram&&) = default;
204 
208  Histogram& operator=(const Histogram&) = default;
209 
214 
219  size_t size() const {
220  return m_binning_concept->size();
221  }
222 
228  return std::vector<WeightType>(m_binning_concept->m_counts->begin() + m_binning_concept->m_clip_left,
229  m_binning_concept->m_counts->begin() + m_binning_concept->m_clip_right + 1);
230  }
231 
239  return m_binning_concept->getBinStrategy().getEdges();
240  }
241 
247  std::vector<VarType> bins(m_binning_concept->m_counts->size());
248  size_t i = 0;
249  std::generate(bins.begin(), bins.end(), [this, &i]() { return m_binning_concept->getBinStrategy().getBin(i++); });
250  return bins;
251  }
252 
260  return m_binning_concept->getBinStrategy().getBinEdges(i);
261  }
262 
270  void clip(VarType min, VarType max) {
271  m_binning_concept->clip(min, max);
272  }
273 
290  return m_binning_concept->getStats();
291  }
292 
293 private:
297  struct ConstantWeight {
299  return *this;
300  }
301 
302  WeightType operator*() const {
303  return 1;
304  }
305  };
306 
318 
319  virtual ~ComputationInterface() = default;
320 
321  ComputationInterface() : m_counts(new std::vector<WeightType>()), m_clip_left(0), m_clip_right(m_counts->size() - 1) {}
322 
323  size_t size() const {
324  return m_clip_right - m_clip_left + 1;
325  }
326 
327  virtual const BinStrategy<VarType>& getBinStrategy() const = 0;
328 
330 
331  virtual void clip(VarType min, VarType max) = 0;
332 
334  };
335 
341  template <typename BinType>
346  BinType m_binning;
347 
348  explicit ComputationImpl(BinType&& bin_type) : m_binning(std::move(bin_type)) {}
349 
350  ComputationImpl(const ComputationImpl&) = default;
351 
352  const BinStrategy<VarType>& getBinStrategy() const final {
353  return m_binning;
354  }
355 
357  return make_unique<ComputationImpl<BinType>>(*this);
358  }
359 
373  template <typename IterType, typename WeightIterType>
374  void computeBins(IterType begin, IterType end, WeightIterType wbegin);
375 
376  void clip(VarType min, VarType max) final;
377 
379  };
380 
382 };
383 
384 } // end of namespace Histogram
385 } // end of namespace Euclid
386 
387 #include "Histogram/_impl/ComputationImpl.icpp"
388 
389 #endif // ALEXANDRIA_HISTOGRAM_HISTOGRAM_H
Euclid::Histogram::Histogram::ComputationInterface::clip
virtual void clip(VarType min, VarType max)=0
Euclid::Histogram::Histogram::ComputationImpl::computeBins
void computeBins(IterType begin, IterType end, WeightIterType wbegin)
std::shared_ptr
STL class.
std::move
T move(T... args)
std::pair
Euclid::Histogram::Histogram::ComputationImpl::ComputationImpl
ComputationImpl(BinType &&bin_type)
Definition: Histogram.h:348
std::vector< VarType >
Euclid::Histogram::Histogram::operator=
Histogram & operator=(Histogram &&)=default
Euclid::Histogram::BinStrategy::getBinCount
size_t getBinCount() const
Definition: Histogram.h:66
Euclid::Histogram::Histogram::ComputationInterface::ComputationInterface
ComputationInterface()
Definition: Histogram.h:321
Euclid::Histogram::BinStrategy::getBin
virtual VarType getBin(size_t i) const
Definition: Histogram.h:120
Euclid::Histogram::Histogram::ComputationInterface::m_clip_left
ssize_t m_clip_left
Definition: Histogram.h:317
Euclid::Histogram::BinStrategy::getEdges
virtual std::vector< VarType > getEdges() const
Definition: Histogram.h:86
Euclid::Histogram::BinStrategy::getBinEdges
virtual std::pair< VarType, VarType > getBinEdges(size_t i) const
Definition: Histogram.h:100
std::generate
T generate(T... args)
std::tuple
Euclid::Histogram::Histogram::ComputationInterface::clone
virtual std::unique_ptr< ComputationInterface > clone() const =0
Euclid::Histogram::Histogram::ConstantWeight
Definition: Histogram.h:297
Euclid::Histogram::BinStrategy::BinStrategy
BinStrategy()
Definition: Histogram.h:56
Euclid::Histogram::Histogram::getCounts
std::vector< WeightType > getCounts() const
Definition: Histogram.h:227
Euclid::Histogram::Histogram::ComputationInterface::~ComputationInterface
virtual ~ComputationInterface()=default
Euclid::Histogram::Histogram::Histogram
Histogram(IterType begin, IterType end, BinType &&bin_type)
Definition: Histogram.h:157
Euclid::Histogram::Histogram::ComputationInterface::m_counts
std::shared_ptr< std::vector< WeightType > > m_counts
Definition: Histogram.h:316
Euclid::Histogram::Histogram::getEdges
std::vector< VarType > getEdges() const
Definition: Histogram.h:238
Euclid::Histogram::Histogram::getBinEdges
std::pair< VarType, VarType > getBinEdges(size_t i) const
Definition: Histogram.h:259
Euclid::Histogram::Histogram::Histogram
Histogram(const Histogram &other)
Definition: Histogram.h:196
Euclid::Histogram::Histogram::ComputationImpl::clone
std::unique_ptr< ComputationInterface > clone() const final
Definition: Histogram.h:356
Euclid::Histogram::Histogram::ComputationInterface::getStats
virtual std::tuple< VarType, VarType, VarType > getStats() const =0
Euclid::Histogram::Histogram::ComputationImpl::getStats
std::tuple< VarType, VarType, VarType > getStats() const final
std::is_arithmetic
Euclid::Histogram::Histogram::getBins
std::vector< VarType > getBins() const
Definition: Histogram.h:246
std::enable_if
Euclid::Histogram::Histogram::ComputationInterface::size
size_t size() const
Definition: Histogram.h:323
Exception.h
Euclid::Histogram::Histogram::ComputationInterface::m_clip_right
ssize_t m_clip_right
Definition: Histogram.h:317
Euclid::Histogram::BinStrategy::m_nbins
size_t m_nbins
Definition: Histogram.h:126
Euclid::Histogram::Histogram::Histogram
Histogram(Histogram &&)=default
Euclid::Histogram::Histogram::Histogram
Histogram(IterType begin, IterType end, WeightIterType wbegin, WeightIterType wend, BinType &&bin_type)
Definition: Histogram.h:186
Euclid::Histogram::Histogram::size
size_t size() const
Definition: Histogram.h:219
Euclid::Histogram::Histogram::ComputationImpl::clip
void clip(VarType min, VarType max) final
Euclid::Histogram::BinStrategy::getEdge
virtual VarType getEdge(size_t e) const =0
Euclid::Histogram::Histogram::ConstantWeight::operator*
WeightType operator*() const
Definition: Histogram.h:302
Euclid::Histogram::BinStrategy::~BinStrategy
virtual ~BinStrategy()=default
Euclid::Histogram::Histogram::operator=
Histogram & operator=(const Histogram &)=default
Euclid::Histogram::Histogram::ComputationInterface
Definition: Histogram.h:315
Euclid::Histogram::Histogram::ComputationInterface::getBinStrategy
virtual const BinStrategy< VarType > & getBinStrategy() const =0
std::vector::begin
T begin(T... args)
Euclid::Histogram::Histogram::m_binning_concept
std::unique_ptr< ComputationInterface > m_binning_concept
Definition: Histogram.h:381
std
STL namespace.
Euclid::Histogram::Histogram::ConstantWeight::operator++
ConstantWeight & operator++()
Definition: Histogram.h:298
Euclid::Histogram::Histogram::ComputationImpl::m_binning
BinType m_binning
Definition: Histogram.h:346
Euclid::Histogram::Histogram::clip
void clip(VarType min, VarType max)
Definition: Histogram.h:270
Euclid::Histogram::BinStrategy::getBinIndex
virtual ssize_t getBinIndex(VarType value) const =0
Euclid::Histogram::Histogram::ComputationImpl
Definition: Histogram.h:342
std::make_pair
T make_pair(T... args)
Euclid::Histogram::Histogram::ComputationImpl::ComputationImpl
ComputationImpl(const ComputationImpl &)=default
std::vector::end
T end(T... args)
Euclid::Histogram::Histogram::getStats
std::tuple< VarType, VarType, VarType > getStats() const
Definition: Histogram.h:289
memory_tools.h
Euclid::Histogram::Histogram::ComputationImpl::getBinStrategy
const BinStrategy< VarType > & getBinStrategy() const final
Definition: Histogram.h:352
std::unique_ptr
STL class.
Euclid
Definition: InstOrRefHolder.h:29
Euclid::Histogram::BinStrategy
Definition: Histogram.h:49
Euclid::Histogram::Histogram
Definition: Histogram.h:137