17#ifndef HPP_STATISTICS_DISTRIBUTION_HH
18#define HPP_STATISTICS_DISTRIBUTION_HH
30template <
typename Value_t>
34 typedef typename std::pair<Weight_t, Value_t>
ProbaTPair;
35 typedef typename std::vector<ProbaTPair>::iterator
iterator;
41 assert(values_.size() > 0);
42 Weight_t r = rand() % cumulative_weights_.back();
49 assert(values_.size() > 0);
50 return values_[dichotomy(w % cumulative_weights_.back())].second;
58 WeightsIterator itcumul = cumulative_weights_.begin();
60 while (itv != values_.end()) {
61 if (itv->second == v)
break;
66 if (itv == values_.end()) {
68 cumulative_weights_.push_back(c + w);
69 if (cumulative_weights_.back() >= INT_MAX / 2) shrink();
73 while (itv != values_.end()) {
79 if (cumulative_weights_.back() >= INT_MAX / 2) shrink();
86 while (itv != values_.end()) {
87 if (itv->second == v)
return itv->first;
94 size_t size()
const {
return values_.size(); }
98 if (values_.empty())
return std::vector<Proba_t>(0);
99 std::vector<Proba_t> proba(values_.size());
100 Proba_t total = (double)cumulative_weights_.back();
101 for (
size_t i = 0; i < values_.size(); i++)
102 proba[i] = (
Proba_t)values_[i].first / total;
108 if (values_.empty())
return std::vector<Value_t>(0);
109 std::vector<Value_t> v(values_.size());
110 for (
size_t i = 0; i < values_.size(); i++) v[i] = values_[i].second;
116 if (cumulative_weights_.empty())
return 0;
117 return cumulative_weights_.back();
129 size_t dichotomy(
const Weight_t& r)
const {
130 if (r < cumulative_weights_[0])
return 0;
131 size_t l = 0, h = values_.size() - 1, m;
134 if (cumulative_weights_[m] <= r)
136 else if (cumulative_weights_[m] > r)
147 WeightsIterator itcumul = cumulative_weights_.begin();
149 while (itv != values_.end()) {
150 if (itv->first > 1) {
151 itv->first = itv->first >> 1;
160 std::vector<ProbaTPair> values_;
161 std::vector<Weight_t> cumulative_weights_;
163 typedef std::vector<Weight_t>::iterator WeightsIterator;
Definition distribution.hh:31
std::vector< Value_t > values() const
Return the values.
Definition distribution.hh:107
std::vector< ProbaTPair >::iterator iterator
Definition distribution.hh:35
const_iterator begin() const
Definition distribution.hh:124
size_t size() const
Return the number of value.
Definition distribution.hh:94
Weight_t get(const Value_t &v) const
Definition distribution.hh:84
iterator end()
Definition distribution.hh:125
std::vector< ProbaTPair >::const_iterator const_iterator
Definition distribution.hh:36
Value_t operator()(const Proba_t &p) const
Definition distribution.hh:45
iterator begin()
Definition distribution.hh:123
std::size_t Weight_t
Definition distribution.hh:33
DiscreteDistribution()=default
Value_t operator()() const
Definition distribution.hh:40
Weight_t totalWeight() const
Return the total weight.
Definition distribution.hh:115
std::pair< Weight_t, Value_t > ProbaTPair
Definition distribution.hh:34
void insert(Value_t v, Weight_t w=1)
Definition distribution.hh:56
Value_t operator()(const Weight_t &w) const
Definition distribution.hh:48
const_iterator end() const
Definition distribution.hh:126
std::vector< Proba_t > probabilities() const
Return the probabilities.
Definition distribution.hh:97
double Proba_t
Definition fwd.hh:22
Implementation.
Definition main.hh:17