17 #ifndef HPP_STATISTICS_DISTRIBUTION_HH
18 #define HPP_STATISTICS_DISTRIBUTION_HH
29 namespace statistics {
30 template <
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;
168 #endif // HPP_STATISTICS_DISTRIBUTION_HH