olena-2.0-138-g5ce0f97 Add specific accumulators to work in kn.

* mln/accu/stat/median_h_interval.hh, * tests/accu/stat/median_h_interval.cc: Move... * mln/world/kn/accu/median_h_interval.hh, * tests/world/kn/accu/median_h_interval.cc: ... Here. * mln/world/kn/accu/max_interval.hh, * mln/world/kn/accu/min_interval.hh, * tests/world/kn/accu/Makefile.am, * tests/world/kn/accu/max_interval.cc, * tests/world/kn/accu/min_interval.cc: New. * tests/accu/stat/Makefile.am, * tests/world/kn/Makefile.am: Update targets. --- milena/ChangeLog | 18 ++ milena/mln/accu/stat/median_h_interval.hh | 170 ----------------- milena/mln/world/kn/accu/max_interval.hh | 223 +++++++++++++++++++++++ milena/mln/world/kn/accu/median_h_interval.hh | 192 +++++++++++++++++++ milena/mln/world/kn/accu/min_interval.hh | 210 +++++++++++++++++++++ milena/tests/accu/stat/Makefile.am | 2 - milena/tests/accu/stat/median_h_interval.cc | 96 ---------- milena/tests/world/kn/Makefile.am | 2 + milena/tests/world/kn/accu/Makefile.am | 28 +++ milena/tests/world/kn/accu/max_interval.cc | 108 +++++++++++ milena/tests/world/kn/accu/median_h_interval.cc | 96 ++++++++++ milena/tests/world/kn/accu/min_interval.cc | 108 +++++++++++ 12 files changed, 985 insertions(+), 268 deletions(-) delete mode 100644 milena/mln/accu/stat/median_h_interval.hh create mode 100644 milena/mln/world/kn/accu/max_interval.hh create mode 100644 milena/mln/world/kn/accu/median_h_interval.hh create mode 100644 milena/mln/world/kn/accu/min_interval.hh delete mode 100644 milena/tests/accu/stat/median_h_interval.cc create mode 100644 milena/tests/world/kn/accu/Makefile.am create mode 100644 milena/tests/world/kn/accu/max_interval.cc create mode 100644 milena/tests/world/kn/accu/median_h_interval.cc create mode 100644 milena/tests/world/kn/accu/min_interval.cc diff --git a/milena/ChangeLog b/milena/ChangeLog index 45480d5..41719b9 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,5 +1,23 @@ 2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Add specific accumulators to work in kn. + + * mln/accu/stat/median_h_interval.hh, + * tests/accu/stat/median_h_interval.cc: Move... + * mln/world/kn/accu/median_h_interval.hh, + * tests/world/kn/accu/median_h_interval.cc: ... Here. + + * mln/world/kn/accu/max_interval.hh, + * mln/world/kn/accu/min_interval.hh, + * tests/world/kn/accu/Makefile.am, + * tests/world/kn/accu/max_interval.cc, + * tests/world/kn/accu/min_interval.cc: New. + + * tests/accu/stat/Makefile.am, + * tests/world/kn/Makefile.am: Update targets. + +2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Add kn::holes() and kn::saturate(). * mln/world/kn/holes.hh, diff --git a/milena/mln/accu/stat/median_h_interval.hh b/milena/mln/accu/stat/median_h_interval.hh deleted file mode 100644 index ebe6b8d..0000000 --- a/milena/mln/accu/stat/median_h_interval.hh +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) -// -// This file is part of Olena. -// -// Olena is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, version 2 of the License. -// -// Olena is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Olena. If not, see <http://www.gnu.org/licenses/>. -// -// As a special exception, you may use this file as part of a free -// software project without restriction. Specifically, if other files -// instantiate templates or use macros or inline functions from this -// file, or you compile this file and link it with other files to produce -// an executable, this file does not by itself cause the resulting -// executable to be covered by the GNU General Public License. This -// exception does not however invalidate any other reasons why the -// executable file might be covered by the GNU General Public License. - -#ifndef MLN_ACCU_STAT_MEDIAN_H_INTERVAL_HH -# define MLN_ACCU_STAT_MEDIAN_H_INTERVAL_HH - -/// \file -/// -/// \brief Define a median accumulator class based on a histogram and -/// working on a specific interval. - -# include <vector> -# include <mln/accu/internal/base.hh> -# include <mln/value/interval.hh> -# include <mln/trait/routine/mean.hh> - - - -namespace mln -{ - - namespace accu - { - - namespace stat - { - - /// \brief Define a median accumulator class based on a histogram and - /// working on a specific interval. - template <typename T, - typename R = mln_trait_routine_mean(2,T) > - struct median_h_interval - : public mln::accu::internal::base< R, median_h_interval<T,R> > - { - typedef T argument; - typedef R result; - - median_h_interval(const value::interval<argument>& inter); - median_h_interval(const argument& first, const argument& last); - - void init(); - - void take(const argument& v); - void take(const median_h_interval<T,R>& v); - - // nota bene: no untake with this accumulator - - result to_result() const; - - bool is_valid() const; - - protected: - - value::interval<argument> inter_; - std::vector<unsigned> h_; - unsigned nitems_; - }; - -# ifndef MLN_INCLUDE_ONLY - - template <typename T, typename R> - median_h_interval<T,R>::median_h_interval(const value::interval<argument>& inter) - : inter_(inter) - { - h_.resize(inter_.nelements()); - init(); - } - - template <typename T, typename R> - median_h_interval<T,R>::median_h_interval(const argument& first, - const argument& last) - : inter_(first, last) - { - h_.resize(inter_.nelements()); - init(); - } - - template <typename T, typename R> - void - median_h_interval<T,R>::init() - { - std::fill(h_.begin(), h_.end(), 0u); - nitems_ = 0; - } - - template <typename T, typename R> - void - median_h_interval<T,R>::take(const argument& v) - { - h_[inter_.index_of(v)] += 1; - nitems_ += 1; - } - - template <typename T, typename R> - void - median_h_interval<T,R>::take(const median_h_interval<T,R>& other) - { - mln_precondition(other.inter_ == inter_); - for (unsigned i = 0; i < other.h_.size(); ++i) - h_[i] += other.h_[i]; - nitems_ += other.nitems_; - } - - template <typename T, typename R> - typename median_h_interval<T,R>::result - median_h_interval<T,R>::to_result() const - { - mln_precondition(is_valid()); - unsigned i = 0, n = h_.size(); - unsigned sum = h_[0], mid = (nitems_ + 1) / 2; - while (i < n && sum < mid) - { - ++i; - sum += h_[i]; - } - if (nitems_ % 2) // nitems_ is odd. - return inter_.ith_element(i); - - // nitems_ is even. - if (sum > mid) - return inter_.ith_element(i); - // looking for next non null value - unsigned i_memo = i; - do - ++i; - while (h_[i] == 0); - return (result(inter_.ith_element(i_memo)) - + result(inter_.ith_element(i))) / 2; - } - - template <typename T, typename R> - bool - median_h_interval<T,R>::is_valid() const - { - return nitems_ != 0; - } - - -# endif // ! MLN_INCLUDE_ONLY - - } // end of namespace mln::accu::stat - - } // end of namespace mln::accu - -} // end of namespace mln - - -#endif // ! MLN_ACCU_STAT_MEDIAN_H_INTERVAL_HH diff --git a/milena/mln/world/kn/accu/max_interval.hh b/milena/mln/world/kn/accu/max_interval.hh new file mode 100644 index 0000000..8d49932 --- /dev/null +++ b/milena/mln/world/kn/accu/max_interval.hh @@ -0,0 +1,223 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#ifndef MLN_WORLD_KN_ACCU_MAX_INTERVAL_HH +# define MLN_WORLD_KN_ACCU_MAX_INTERVAL_HH + +/// \file +/// +/// \brief Define an accumulator that computes a max on a specific +/// interval. + +# include <mln/core/concept/meta_accumulator.hh> +# include <mln/accu/internal/base.hh> +# include <mln/trait/value_.hh> +# include <mln/util/pix.hh> +# include <mln/value/interval.hh> + + +namespace mln +{ + + + // Forward declaration. + namespace world { + namespace kn { + namespace accu { + template <typename T> struct max_interval; + } + } + } + + + // Traits. + + namespace trait + { + + template <typename T> + struct accumulator_< world::kn::accu::max_interval<T> > + { + typedef accumulator::has_untake::no has_untake; + typedef accumulator::has_set_value::yes has_set_value; + typedef accumulator::has_stop::no has_stop; + typedef accumulator::when_pix::use_v when_pix; + }; + + } // end of namespace mln::trait + + + namespace world + { + + namespace kn + { + + namespace accu + { + + /// \brief Minimum accumulator restricted to a specific + /// interval. + /// + /// The parameter \c T is the type of values. + /// + /// \ingroup modaccuvalues + template <typename T> + struct max_interval + : public mln::accu::internal::base< const T& , max_interval<T> > + { + typedef T argument; + + max_interval(); + max_interval(const value::interval<T>& inter); + template <typename U, typename V> + max_interval(const U& first, const V& last); + + /// Manipulators. + /// \{ + void init(); + void take_as_init_(const argument& t); + void take(const argument& t); + void take(const max_interval<T>& other); + /// \} + + /// Force the value of the min to \a t. + void set_value(const T& t); + + /// Get the value of the accumulator. + const T& to_result() const; + + /// Check whether this accu is able to return a result. + /// Always true here. + bool is_valid() const; + + protected: + + T t_; + value::interval<T> inter_; + }; + + + template <typename I> struct max_interval< util::pix<I> >; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename T> + inline + max_interval<T>::max_interval() + { + inter_ = value::interval<T>(mln_min(T), mln_max(T)); + init(); + } + + template <typename T> + inline + max_interval<T>::max_interval(const value::interval<T>& inter) + { + inter_ = inter; + init(); + } + + template <typename T> + template <typename U, typename V> + max_interval<T>::max_interval(const U& first, const V& last) + { + mlc_converts_to(U,T)::check(); + mlc_converts_to(V,T)::check(); + inter_ = value::interval<T>(first, last); + init(); + } + + template <typename T> + inline + void + max_interval<T>::init() + { + t_ = inter_.first(); + } + + template <typename T> + inline + void + max_interval<T>::take_as_init_(const argument& t) + { + t_ = t; + } + + template <typename T> + inline + void + max_interval<T>::take(const argument& t) + { + if (t > t_) + t_ = t; + } + + template <typename T> + inline + void + max_interval<T>::take(const max_interval<T>& other) + { + if (other.t_ > t_) + t_ = other.t_; + } + + template <typename T> + inline + void + max_interval<T>::set_value(const T& t) + { + t_ = t; + } + + template <typename T> + inline + const T& + max_interval<T>::to_result() const + { + return t_; + } + + template <typename T> + inline + bool + max_interval<T>::is_valid() const + { + return true; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::world::kn::accu + + } // end of namespace mln::world::kn + + } // end of namespace mln::world + +} // end of namespace mln + + +#endif // ! MLN_WORLD_KN_ACCU_MAX_INTERVAL_HH diff --git a/milena/mln/world/kn/accu/median_h_interval.hh b/milena/mln/world/kn/accu/median_h_interval.hh new file mode 100644 index 0000000..1d81339 --- /dev/null +++ b/milena/mln/world/kn/accu/median_h_interval.hh @@ -0,0 +1,192 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#ifndef MLN_WORLD_KN_ACCU_MEDIAN_H_INTERVAL_HH +# define MLN_WORLD_KN_ACCU_MEDIAN_H_INTERVAL_HH + +/// \file +/// +/// \brief Define a median accumulator class based on a histogram and +/// working on a specific interval. + +# include <vector> +# include <mln/accu/internal/base.hh> +# include <mln/value/interval.hh> +# include <mln/trait/routine/mean.hh> +# include <mln/math/mean.hh> + + +namespace mln +{ + + namespace world + { + + namespace kn + { + + namespace accu + { + + /// \brief Define a median accumulator class based on a histogram and + /// working on a specific interval. + template <typename T, + typename R = mln_trait_routine_mean(2,T) > + struct median_h_interval + : public mln::accu::internal::base< R, median_h_interval<T,R> > + { + typedef T argument; + typedef R result; + + median_h_interval(const value::interval<argument>& inter); + median_h_interval(const argument& first, const argument& last); + template <typename U, typename V> + median_h_interval(const U& first, const V& last); + + void init(); + + void take(const argument& v); + void take(const median_h_interval<T,R>& v); + + // nota bene: no untake with this accumulator + + result to_result() const; + + bool is_valid() const; + + protected: + + value::interval<argument> inter_; + std::vector<unsigned> h_; + unsigned nitems_; + }; + +# ifndef MLN_INCLUDE_ONLY + + template <typename T, typename R> + median_h_interval<T,R>::median_h_interval(const value::interval<argument>& inter) + : inter_(inter) + { + h_.resize(inter_.nelements()); + init(); + } + + template <typename T, typename R> + median_h_interval<T,R>::median_h_interval(const argument& first, + const argument& last) + : inter_(first, last) + { + h_.resize(inter_.nelements()); + init(); + } + + template <typename T, typename R> + template <typename U, typename V> + median_h_interval<T,R>::median_h_interval(const U& first, + const V& last) + { + mlc_converts_to(U,T)::check(); + mlc_converts_to(V,T)::check(); + + inter_ = value::interval<T>(first, last); + h_.resize(inter_.nelements()); + init(); + } + + template <typename T, typename R> + void + median_h_interval<T,R>::init() + { + std::fill(h_.begin(), h_.end(), 0u); + nitems_ = 0; + } + + template <typename T, typename R> + void + median_h_interval<T,R>::take(const argument& v) + { + h_[inter_.index_of(v)] += 1; + nitems_ += 1; + } + + template <typename T, typename R> + void + median_h_interval<T,R>::take(const median_h_interval<T,R>& other) + { + mln_precondition(other.inter_ == inter_); + for (unsigned i = 0; i < other.h_.size(); ++i) + h_[i] += other.h_[i]; + nitems_ += other.nitems_; + } + + template <typename T, typename R> + typename median_h_interval<T,R>::result + median_h_interval<T,R>::to_result() const + { + if (!nitems_) + return result(math::mean(inter_.first(), inter_.last())); + + mln_precondition(is_valid()); + unsigned i = 0, n = h_.size(); + unsigned sum = h_[0], mid = (nitems_ + 1) / 2; + while (i < n && sum < mid) + { + ++i; + sum += h_[i]; + } + if (nitems_ % 2) // nitems_ is odd. + return inter_.ith_element(i); + + // nitems_ is even. + if (sum > mid) + return inter_.ith_element(i); + // looking for next non null value + unsigned i_memo = i; + do + ++i; + while (h_[i] == 0); + return (result(inter_.ith_element(i_memo)) + + result(inter_.ith_element(i))) / 2; + } + + template <typename T, typename R> + bool + median_h_interval<T,R>::is_valid() const + { + return nitems_ != 0; + } + + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::world::kn::accu + + } // end of namespace mln::world::kn + + } // end of namespace mln::world + +} // end of namespace mln + +#endif // ! MLN_WORLD_KN_ACCU_MEDIAN_H_INTERVAL_HH diff --git a/milena/mln/world/kn/accu/min_interval.hh b/milena/mln/world/kn/accu/min_interval.hh new file mode 100644 index 0000000..df6120d --- /dev/null +++ b/milena/mln/world/kn/accu/min_interval.hh @@ -0,0 +1,210 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#ifndef MLN_WORLD_KN_ACCU_MIN_INTERVAL_HH +# define MLN_WORLD_KN_ACCU_MIN_INTERVAL_HH + +/// \file +/// +/// Define an accumulator that computes a min on a specific interval. + +# include <mln/accu/internal/base.hh> +# include <mln/core/concept/meta_accumulator.hh> +# include <mln/trait/value_.hh> +# include <mln/util/pix.hh> +# include <mln/value/interval.hh> + +namespace mln +{ + + + // Forward declaration. + namespace world { + namespace kn { + namespace accu { + template <typename T> struct min_interval; + } + } + } + + + // Traits. + + namespace trait + { + + template <typename T> + struct accumulator_< world::kn::accu::min_interval<T> > + { + typedef accumulator::has_untake::no has_untake; + typedef accumulator::has_set_value::yes has_set_value; + typedef accumulator::has_stop::no has_stop; + typedef accumulator::when_pix::use_v when_pix; + }; + + } // end of namespace mln::trait + + + namespace world + { + + namespace kn + { + + namespace accu + { + + /// \brief Minimum accumulator restricted to a specific + /// interval. + /*! + * The parameter \c T is the type of values. + * + * \ingroup modaccuvalues + */ + template <typename T> + struct min_interval + : public mln::accu::internal::base< const T&, min_interval<T> > + { + typedef T argument; + + min_interval(); + min_interval(const value::interval<T>& inter); + template <typename U, typename V> + min_interval(const U& first, const V& last); + + /// Manipulators. + /// \{ + void init(); + void take_as_init_(const argument& t); + void take(const argument& t); + void take(const min_interval<T>& other); + /// \} + + /// Get the value of the accumulator. + const T& to_result() const; + + /// Check whether this accu is able to return a result. + /// Always true here. + bool is_valid() const; + + protected: + + T t_; + value::interval<T> inter_; + }; + + + template <typename I> struct min_interval< util::pix<I> >; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename T> + inline + min_interval<T>::min_interval() + { + inter_ = value::interval<T>(mln_min(T), mln_max(T)); + init(); + } + + template <typename T> + inline + min_interval<T>::min_interval(const value::interval<T>& inter) + { + inter_ = inter; + init(); + } + + template <typename T> + template <typename U, typename V> + inline + min_interval<T>::min_interval(const U& first, const V& last) + { + mlc_converts_to(U,T)::check(); + mlc_converts_to(V,T)::check(); + inter_ = value::interval<T>(first, last); + init(); + } + + template <typename T> + inline + void + min_interval<T>::init() + { + t_ = inter_.last(); + } + + template <typename T> + inline + void min_interval<T>::take_as_init_(const argument& t) + { + t_ = t; + } + + template <typename T> + inline + void min_interval<T>::take(const argument& t) + { + if (t < t_) + t_ = t; + } + + template <typename T> + inline + void + min_interval<T>::take(const min_interval<T>& other) + { + if (other.t_ < t_) + t_ = other.t_; + } + + template <typename T> + inline + const T& + min_interval<T>::to_result() const + { + return t_; + } + + template <typename T> + inline + bool + min_interval<T>::is_valid() const + { + return true; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::world::kn::accu + + } // end of namespace mln::world::kn + + } // end of namespace mln::world + +} // end of namespace mln + + +#endif // ! MLN_WORLD_KN_ACCU_MIN_INTERVAL_HH diff --git a/milena/tests/accu/stat/Makefile.am b/milena/tests/accu/stat/Makefile.am index f86dd88..cb647d2 100644 --- a/milena/tests/accu/stat/Makefile.am +++ b/milena/tests/accu/stat/Makefile.am @@ -27,7 +27,6 @@ check_PROGRAMS = \ max_h \ median_few \ median_h \ - median_h_interval \ mean \ rank @@ -36,7 +35,6 @@ var_SOURCES = var.cc mean_SOURCES = mean.cc median_h_SOURCES = median_h.cc median_few_SOURCES = median_few.cc -median_h_interval_SOURCES = median_h_interval.cc min_SOURCES = min.cc min_h_SOURCES = min_h.cc max_SOURCES = max.cc diff --git a/milena/tests/accu/stat/median_h_interval.cc b/milena/tests/accu/stat/median_h_interval.cc deleted file mode 100644 index b20489d..0000000 --- a/milena/tests/accu/stat/median_h_interval.cc +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) -// -// This file is part of Olena. -// -// Olena is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, version 2 of the License. -// -// Olena is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Olena. If not, see <http://www.gnu.org/licenses/>. -// -// As a special exception, you may use this file as part of a free -// software project without restriction. Specifically, if other files -// instantiate templates or use macros or inline functions from this -// file, or you compile this file and link it with other files to produce -// an executable, this file does not by itself cause the resulting -// executable to be covered by the GNU General Public License. This -// exception does not however invalidate any other reasons why the -// executable file might be covered by the GNU General Public License. - -#include <mln/value/interval.hh> -#include <mln/value/intsub.hh> -#include <mln/accu/stat/median_h_interval.hh> - - -template <typename T> -void doit(const mln::value::interval<T>& inter) -{ - typedef mln::accu::stat::median_h_interval<T> M; - - { - M m(inter); - m.init(); - m.take(6); - mln_postcondition(m.to_result() == 6); - } - - { - M m(inter); - m.init(); - m.take(6); - m.take(6); - mln_postcondition(m.to_result() == 6); - } - - { - M m(inter); - m.init(); - m.take(6); - m.take(6); - m.take(0); - mln_postcondition(m.to_result() == 6); - } - - { - M m(inter); - m.init(); - m.take(12); - m.take(0); - m.take(0); - m.take(24); - mln_postcondition(m.to_result() == 6); - } - - { - M m(inter); - m.init(); - m.take(1); - m.take(0); - mln_postcondition(m.to_result() == 0.5); - } -} - - -int main() -{ - using namespace mln; - - { - typedef int T; - value::interval<T> inter(0, 30); - doit(inter); - } - - { - typedef value::intsub<2> T; - value::interval<T> inter(0, 30); - doit(inter); - } - -} diff --git a/milena/tests/world/kn/Makefile.am b/milena/tests/world/kn/Makefile.am index 2a89e48a..5147ad9 100644 --- a/milena/tests/world/kn/Makefile.am +++ b/milena/tests/world/kn/Makefile.am @@ -16,6 +16,8 @@ include $(top_srcdir)/milena/tests/tests.mk +SUBDIRS = accu + check_PROGRAMS = \ fill_0_1_faces_internal_border \ fill_0_from_1_faces \ diff --git a/milena/tests/world/kn/accu/Makefile.am b/milena/tests/world/kn/accu/Makefile.am new file mode 100644 index 0000000..98651eb --- /dev/null +++ b/milena/tests/world/kn/accu/Makefile.am @@ -0,0 +1,28 @@ +# Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE). +# +# This file is part of Olena. +# +# Olena is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, version 2 of the License. +# +# Olena is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Olena. If not, see <http://www.gnu.org/licenses/>. + +include $(top_srcdir)/milena/tests/tests.mk + +check_PROGRAMS = \ + max_interval \ + median_h_interval \ + min_interval + +max_interval_SOURCES = max_interval.cc +median_h_interval_SOURCES = median_h_interval.cc +min_interval_SOURCES = min_interval.cc + +TESTS = $(check_PROGRAMS) diff --git a/milena/tests/world/kn/accu/max_interval.cc b/milena/tests/world/kn/accu/max_interval.cc new file mode 100644 index 0000000..9686ad7 --- /dev/null +++ b/milena/tests/world/kn/accu/max_interval.cc @@ -0,0 +1,108 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#include <mln/value/interval.hh> +#include <mln/value/intsub.hh> +#include <mln/world/kn/accu/max_interval.hh> + + +template <typename T> +void doit(const mln::value::interval<T>& inter) +{ + typedef mln::world::kn::accu::max_interval<T> M; + + { + M m(inter); + m.init(); + mln_assertion(m.to_result() == inter.first()); + } + + { + M m; + m.init(); + mln_assertion(m.to_result() == mln_min(T)); + } + + { + M m(inter); + m.init(); + m.take(6); + mln_assertion(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + mln_assertion(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + m.take(0); + mln_assertion(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(12); + m.take(0); + m.take(0); + m.take(24); + mln_assertion(m.to_result() == 24); + } + + { + M m(inter); + m.init(); + m.take(1); + m.take(0); + mln_assertion(m.to_result() == 1); + } +} + + +int main() +{ + using namespace mln; + + { + typedef int T; + value::interval<T> inter(0, 30); + doit(inter); + } + + { + typedef value::intsub<2> T; + value::interval<T> inter(0, 30); + doit(inter); + } + +} diff --git a/milena/tests/world/kn/accu/median_h_interval.cc b/milena/tests/world/kn/accu/median_h_interval.cc new file mode 100644 index 0000000..509bec4 --- /dev/null +++ b/milena/tests/world/kn/accu/median_h_interval.cc @@ -0,0 +1,96 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#include <mln/value/interval.hh> +#include <mln/value/intsub.hh> +#include <mln/world/kn/accu/median_h_interval.hh> + + +template <typename T> +void doit(const mln::value::interval<T>& inter) +{ + typedef mln::world::kn::accu::median_h_interval<T> M; + + { + M m(inter); + m.init(); + m.take(6); + mln_postcondition(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + mln_postcondition(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + m.take(0); + mln_postcondition(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(12); + m.take(0); + m.take(0); + m.take(24); + mln_postcondition(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(1); + m.take(0); + mln_postcondition(m.to_result() == 0.5); + } +} + + +int main() +{ + using namespace mln; + + { + typedef int T; + value::interval<T> inter(0, 30); + doit(inter); + } + + { + typedef value::intsub<2> T; + value::interval<T> inter(0, 30); + doit(inter); + } + +} diff --git a/milena/tests/world/kn/accu/min_interval.cc b/milena/tests/world/kn/accu/min_interval.cc new file mode 100644 index 0000000..7b5a0e2 --- /dev/null +++ b/milena/tests/world/kn/accu/min_interval.cc @@ -0,0 +1,108 @@ +// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#include <mln/value/interval.hh> +#include <mln/value/intsub.hh> +#include <mln/world/kn/accu/min_interval.hh> + + +template <typename T> +void doit(const mln::value::interval<T>& inter) +{ + typedef mln::world::kn::accu::min_interval<T> M; + + { + M m(inter); + m.init(); + mln_assertion(m.to_result() == inter.last()); + } + + { + M m; + m.init(); + mln_assertion(m.to_result() == mln_max(T)); + } + + { + M m(inter); + m.init(); + m.take(6); + mln_assertion(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + mln_assertion(m.to_result() == 6); + } + + { + M m(inter); + m.init(); + m.take(6); + m.take(6); + m.take(0); + mln_assertion(m.to_result() == 0); + } + + { + M m(inter); + m.init(); + m.take(12); + m.take(0); + m.take(0); + m.take(24); + mln_assertion(m.to_result() == 0); + } + + { + M m(inter); + m.init(); + m.take(1); + m.take(0); + mln_assertion(m.to_result() == 0); + } +} + + +int main() +{ + using namespace mln; + + { + typedef int T; + value::interval<T> inter(0, 30); + doit(inter); + } + + { + typedef value::intsub<2> T; + value::interval<T> inter(0, 30); + doit(inter); + } + +} -- 1.7.2.5
participants (1)
-
Guillaume Lazzara