27 #ifndef MLN_ACCU_STAT_MEDIAN_H_HH
28 # define MLN_ACCU_STAT_MEDIAN_H_HH
34 # include <mln/accu/internal/base.hh>
35 # include <mln/accu/histo.hh>
36 # include <mln/value/set.hh>
82 struct median_h :
public mln::accu::internal::base< const V&, median_h<V> >
92 void take(
const argument& t);
94 void untake(
const argument& t);
97 unsigned card()
const {
return h_.sum(); }
113 mutable unsigned sum_minus_, sum_plus_;
120 void update_()
const;
121 void go_minus_()
const;
122 void go_plus_()
const;
125 # ifndef MLN_INCLUDE_ONLY
127 template <
typename V>
136 template <
typename V>
139 median_h<V>::operator=(
const median_h<V>& rhs)
142 sum_minus_ = rhs.sum_minus_;
143 sum_plus_ = rhs.sum_plus_;
151 template <
typename V>
154 median_h<V>::take(
const argument& t)
167 template <
typename V>
170 median_h<V>::take(
const median_h<V>& other)
176 for (
unsigned i = 0; i < i_; ++i)
177 sum_minus_ += other.h_[i];
180 for (
unsigned i = i_ + 1; i < h_.nvalues(); ++i)
181 sum_plus_ += other.h_[i];
187 template <
typename V>
190 median_h<V>::untake(
const argument& t)
192 mln_precondition(h_(t) != 0);
204 template <
typename V>
207 median_h<V>::update_()
const
214 if (2 * sum_minus_ > h_.sum())
217 if (2 * sum_plus_ > h_.sum())
223 if (sum_plus_ > sum_minus_)
230 template <
typename V>
233 median_h<V>::go_minus_()
const
241 sum_minus_ -= h_[i_];
243 while (2 * sum_minus_ > h_.sum());
247 template <
typename V>
250 median_h<V>::go_plus_()
const
254 sum_minus_ += h_[i_];
260 while (2 * sum_plus_ > h_.sum());
264 template <
typename V>
272 i_ = (s_.index_of(mln_max(argument))
273 - s_.index_of(mln_min(argument))) / 2;
278 template <
typename V>
280 const typename median_h<V>::argument&
288 template <
typename V>
296 template <
typename V>
304 # endif // ! MLN_INCLUDE_ONLY
312 #endif // ! MLN_ACCU_STAT_MEDIAN_H_HH