27 #ifndef MLN_ACCU_STAT_MEDIAN_ALT_HH
28 # define MLN_ACCU_STAT_MEDIAN_ALT_HH
34 # include <mln/accu/internal/base.hh>
35 # include <mln/accu/histo.hh>
54 struct median_alt :
public mln::accu::internal::base< const mln_value(S)&, median_alt<S> >
56 typedef mln_value(S) argument;
62 void take(
const argument& t);
63 void untake(
const argument& t);
77 std::cout <<
" i = " << i_
79 <<
" s = " << sum_minus_ <<
" ; " << h_[i_] <<
" ; " << sum_plus_ <<
" = " << h_.sum()
89 unsigned sum_minus_, sum_plus_;
101 template <
typename T>
102 struct median_alt_on :
public median_alt< value::set<T> >
121 template <
typename T>
139 template <
typename T>
147 # ifndef MLN_INCLUDE_ONLY
152 template <
typename S>
154 median_alt<S>::median_alt(
const Value_Set<S>& s)
162 template <
typename S>
193 if (2 * sum_minus_ > h_.sum())
200 if (2 * sum_plus_ > h_.sum())
206 template <
typename S>
211 mln_precondition(h_(t) != 0);
228 if (2 * sum_plus_ > h_.sum())
234 if (2 * sum_minus_ > h_.sum())
243 if (sum_plus_ > sum_minus_)
250 if (2 * sum_plus_ > h_.sum())
252 else if (2 * sum_minus_ > h_.sum())
259 template <
typename S>
262 median_alt<S>::init()
267 i_ = (mln_max(argument) - mln_min(argument)) / 2;
271 template <
typename S>
273 const typename median_alt<S>::argument&
279 template <
typename S>
287 template <
typename S>
298 sum_minus_ -= h_[i_];
300 while (2 * sum_minus_ > h_.sum());
305 template <
typename S>
308 median_alt<S>::go_plus_()
312 sum_minus_ += h_[i_];
318 while (2 * sum_plus_ > h_.sum());
322 template <
typename S>
324 std::ostream& operator<<(std::ostream& ostr, const median_alt<S>& m)
332 # endif // ! MLN_INCLUDE_ONLY
339 #endif // ! MLN_ACCU_STAT_MEDIAN_ALT_HH