Olena-patches
Threads by month
- ----- 2025 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
October 2012
- 9 participants
- 221 discussions

04 Oct '12
* mln/accu/stat/median_interval.hh,
* tests/accu/stat/median_interval.cc: New.
* tests/accu/stat/Makefile.am: New target.
---
milena/ChangeLog | 9 +
.../accu/stat/{median_h.hh => median_interval.hh} | 263 +++++++++-----------
milena/tests/accu/stat/Makefile.am | 6 +-
.../stat/median_interval.cc} | 25 ++-
4 files changed, 151 insertions(+), 152 deletions(-)
copy milena/mln/accu/stat/{median_h.hh => median_interval.hh} (50%)
copy milena/tests/{world/k1/is_primary_face.cc => accu/stat/median_interval.cc} (78%)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 0e6b384..596063a 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Add an accumulator median based on intervals.
+
+ * mln/accu/stat/median_interval.hh,
+ * tests/accu/stat/median_interval.cc: New.
+
+ * tests/accu/stat/Makefile.am: New target.
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Rename interval::nelements() to interval::nvalues().
* mln/value/interval.hh,
diff --git a/milena/mln/accu/stat/median_h.hh b/milena/mln/accu/stat/median_interval.hh
similarity index 50%
copy from milena/mln/accu/stat/median_h.hh
copy to milena/mln/accu/stat/median_interval.hh
index b38955d..a042bfa 100644
--- a/milena/mln/accu/stat/median_h.hh
+++ b/milena/mln/accu/stat/median_interval.hh
@@ -1,5 +1,4 @@
-// Copyright (C) 2007, 2008, 2009, 2011 EPITA Research and Development
-// Laboratory (LRDE)
+// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -24,16 +23,18 @@
// 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_HH
-# define MLN_ACCU_STAT_MEDIAN_H_HH
+#ifndef MLN_ACCU_STAT_MEDIAN_ALT_HH
+# define MLN_ACCU_STAT_MEDIAN_INTERVAL_HH
/// \file
///
-/// Define a generic median accumulator class.
+/// Define a median accumulator class accepting values restricted to a
+/// specific interval of values.
# include <mln/accu/internal/base.hh>
-# include <mln/accu/histo.hh>
-# include <mln/value/set.hh>
+# include <mln/value/interval.hh>
+# include <mln/value/intsub.hh>
+# include <mln/util/array.hh>
namespace mln
@@ -45,61 +46,31 @@ namespace mln
namespace stat
{
- // Forward declaration.
- template <typename V>
- struct median_h;
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- /// Meta accumulator for median_h.
- struct median_h : public Meta_Accumulator< median_h >
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::median_h<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- namespace stat
- {
-
- /// \brief Generic median function based on histogram over a value
- /// set with type \c V.
+ /// \brief Generic median_interval function based on histogram over a
+ /// value set with type \c S.
///
/// \ingroup modaccuvalues
- template <typename V>
- struct median_h : public mln::accu::internal::base< const V&, median_h<V> >
+ //
+ template <unsigned n>
+ struct median_interval
+ : public mln::accu::internal::base< const value::intsub<n>&, median_interval<n> >
{
- typedef V argument;
+ typedef value::intsub<n> argument;
- median_h();
- median_h& operator=(const median_h& rhs);
+ median_interval(const value::interval<value::intsub<n> >& inter);
+ median_interval(const value::intsub<n>& first, const value::intsub<n>& last);
/// Manipulators.
/// \{
- void init();
void take(const argument& t);
- void take(const median_h<V>& other);
+ void take(const median_interval& other);
void untake(const argument& t);
+ void init();
/// \}
- unsigned card() const { return h_.sum(); }
-
/// Get the value of the accumulator.
- const argument& to_result() const;
-
- const accu::histo<V>& histo() const;
+ const value::intsub<n>& to_result() const;
/// Check whether this accu is able to return a result.
/// Always true here.
@@ -107,114 +78,153 @@ namespace mln
protected:
- mutable accu::histo<V> h_;
- const value::set<V>& s_; // derived from h_
+ mutable util::array<unsigned> h_;
+ unsigned sum_;
mutable unsigned sum_minus_, sum_plus_;
mutable bool valid_;
- mutable unsigned i_; // the median_h index
- mutable argument t_; // the median_h value
+
+ /// the median index
+ mutable unsigned i_;
+ /// the median argument
+ mutable value::intsub<n> t_;
+
+ value::interval<value::intsub<n> > inter_;
// Auxiliary methods
- void update_() const;
void go_minus_() const;
void go_plus_() const;
+ void update_() const;
};
+ } // end of mln::accu::stat
+
+
# ifndef MLN_INCLUDE_ONLY
- template <typename V>
- inline
- median_h<V>::median_h()
- : h_(),
- s_(h_.vset())
+ namespace stat
+ {
+
+ template <unsigned n>
+ median_interval<n>::median_interval(const value::interval<value::intsub<n> >& inter)
+ : inter_(inter)
{
init();
}
- template <typename V>
- inline
- median_h<V>&
- median_h<V>::operator=(const median_h<V>& rhs)
+ template <unsigned n>
+ median_interval<n>::median_interval(const value::intsub<n>& first, const value::intsub<n>& last)
+ : inter_(first, last)
{
- h_ = rhs.h_;
- sum_minus_ = rhs.sum_minus_;
- sum_plus_ = rhs.sum_plus_;
- valid_ = rhs.valid_;
- i_ = rhs.i_;
- t_ = rhs.t_;
-
- return *this;
+ init();
}
- template <typename V>
- inline
+ template <unsigned n>
void
- median_h<V>::take(const argument& t)
+ median_interval<n>::take(const argument& t)
{
- h_.take(t);
+ mln_precondition(inter_.has(t));
+
+ unsigned index = inter_.index_of(t);
- if (t < t_)
+ // update h_
+ ++h_[index];
+ ++sum_;
+
+ if (index < i_)
++sum_minus_;
- else if (t > t_)
+ else if (index > i_)
++sum_plus_;
if (valid_)
valid_ = false;
}
- template <typename V>
+ template <unsigned n>
inline
void
- median_h<V>::take(const median_h<V>& other)
+ median_interval<n>::take(const median_interval<n>& other)
{
- // h_
- h_.take(other.h_);
+ for (unsigned i = 0; i < h_.size(); ++i)
+ h_[i] += other.h_[i];
// sum_minus_
for (unsigned i = 0; i < i_; ++i)
sum_minus_ += other.h_[i];
// sum_plus_
- for (unsigned i = i_ + 1; i < h_.nvalues(); ++i)
+ for (unsigned i = i_ + 1; i < h_.nelements(); ++i)
sum_plus_ += other.h_[i];
if (valid_)
valid_ = false;
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::untake(const argument& t)
+ median_interval<n>::untake(const argument& t)
{
- mln_precondition(h_(t) != 0);
- h_.untake(t);
+ mln_precondition(inter_.has(t));
+ mln_precondition(h_[inter_.index_of(t)] != 0);
+
+ unsigned index = inter_.index_of(t);
+
+ // update h_
+ --h_[index];
+ --sum_;
- if (t < t_)
+ if (index < i_)
--sum_minus_;
- else if (t > t_)
+ else if (index > i_)
--sum_plus_;
if (valid_)
valid_ = false;
}
- template <typename V>
+ template <unsigned n>
+ void
+ median_interval<n>::init()
+ {
+ h_.resize(inter_.nvalues(), 0);
+ sum_minus_ = 0;
+ sum_plus_ = 0;
+ i_ = inter_.nvalues() / 2;
+ t_ = inter_.ith_element(i_);
+ }
+
+ template <unsigned n>
+ const value::intsub<n>&
+ median_interval<n>::to_result() const
+ {
+ if (! valid_)
+ update_();
+ return t_;
+ }
+
+ template <unsigned n>
+ bool
+ median_interval<n>::is_valid() const
+ {
+ return true;
+ }
+
+ template <unsigned n>
inline
void
- median_h<V>::update_() const
+ median_interval<n>::update_() const
{
valid_ = true;
- if (h_.sum() == 0)
+ if (sum_ == 0)
return;
- if (2 * sum_minus_ > h_.sum())
+ if (2 * sum_minus_ > sum_)
go_minus_();
else
- if (2 * sum_plus_ > h_.sum())
+ if (2 * sum_plus_ > sum_)
go_plus_();
else
if (h_[i_] == 0)
@@ -227,10 +237,10 @@ namespace mln
}
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::go_minus_() const
+ median_interval<n>::go_minus_() const
{
do
{
@@ -240,14 +250,14 @@ namespace mln
while (h_[i_] == 0);
sum_minus_ -= h_[i_];
}
- while (2 * sum_minus_ > h_.sum());
- t_ = s_[i_];
+ while (2 * sum_minus_ > sum_);
+ t_ = inter_.ith_element(i_);
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::go_plus_() const
+ median_interval<n>::go_plus_() const
{
do
{
@@ -257,56 +267,23 @@ namespace mln
while (h_[i_] == 0);
sum_plus_ -= h_[i_];
}
- while (2 * sum_plus_ > h_.sum());
- t_ = s_[i_];
+ while (2 * sum_plus_ > sum_);
+ t_ = inter_.ith_element(i_);
}
- template <typename V>
- inline
- void
- median_h<V>::init()
+ template <unsigned n>
+ std::ostream& operator<<(std::ostream& ostr, const median_interval<n>& m)
{
- h_.init();
- sum_minus_ = 0;
- sum_plus_ = 0;
- i_ = (s_.index_of(mln_max(argument))
- - s_.index_of(mln_min(argument))) / 2;
- t_ = s_[i_];
- valid_ = true;
+ return ostr << m.to_result();
}
- template <typename V>
- inline
- const typename median_h<V>::argument&
- median_h<V>::to_result() const
- {
- if (! valid_)
- update_();
- return t_;
- }
-
- template <typename V>
- inline
- const accu::histo<V>&
- median_h<V>::histo() const
- {
- return h_;
- }
-
- template <typename V>
- inline
- bool
- median_h<V>::is_valid() const
- {
- return true;
- }
+ } // end of namespace mln::accu::stat
# 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_HH
+
+#endif // ! MLN_ACCU_STAT_MEDIAN_INTERVAL_HH
diff --git a/milena/tests/accu/stat/Makefile.am b/milena/tests/accu/stat/Makefile.am
index 47197c0..77bcf65 100644
--- a/milena/tests/accu/stat/Makefile.am
+++ b/milena/tests/accu/stat/Makefile.am
@@ -1,5 +1,5 @@
-# Copyright (C) 2009, 2010 EPITA Research and Development Laboratory
-# (LRDE).
+# Copyright (C) 2009, 2010, 2012 EPITA Research and Development
+# Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -26,6 +26,7 @@ check_PROGRAMS = \
max \
max_h \
median_h \
+ median_interval \
mean \
rank
@@ -33,6 +34,7 @@ deviation_SOURCES = deviation.cc
var_SOURCES = var.cc
mean_SOURCES = mean.cc
median_h_SOURCES = median_h.cc
+median_interval_SOURCES = median_interval.cc
min_SOURCES = min.cc
min_h_SOURCES = min_h.cc
max_SOURCES = max.cc
diff --git a/milena/tests/world/k1/is_primary_face.cc b/milena/tests/accu/stat/median_interval.cc
similarity index 78%
copy from milena/tests/world/k1/is_primary_face.cc
copy to milena/tests/accu/stat/median_interval.cc
index 32eb871..a0c05a9 100644
--- a/milena/tests/world/k1/is_primary_face.cc
+++ b/milena/tests/accu/stat/median_interval.cc
@@ -23,17 +23,28 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-/// \file
+#include <mln/accu/stat/median_interval.hh>
-#include <mln/core/alias/point2d.hh>
-#include <mln/world/k1/is_primary_face.hh>
int main()
{
using namespace mln;
- mln_assertion(!world::k1::is_primary_face(point2d(-1, -1)));
- mln_assertion(!world::k1::is_primary_face(point2d(-1, 0)));
- mln_assertion(!world::k1::is_primary_face(point2d(0, -1)));
- mln_assertion(world::k1::is_primary_face(point2d(0, 0)));
+ {
+ accu::stat::median_interval<2> med(2, 5);
+
+ med.take(2);
+ med.take(2);
+ med.take(2.5);
+ med.take(2.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(5);
+ med.take(5);
+ med.take(5);
+
+ mln_assertion(med.to_result() == 4.5);
+ }
}
--
1.7.2.5
1
0

04 Oct '12
* mln/accu/stat/median_interval.hh,
* tests/accu/stat/median_interval.cc: New.
* tests/accu/stat/Makefile.am: New target.
---
milena/ChangeLog | 9 +
.../accu/stat/{median_h.hh => median_interval.hh} | 263 +++++++++-----------
milena/tests/accu/stat/Makefile.am | 6 +-
.../stat/median_interval.cc} | 25 ++-
4 files changed, 151 insertions(+), 152 deletions(-)
copy milena/mln/accu/stat/{median_h.hh => median_interval.hh} (50%)
copy milena/tests/{world/k1/is_primary_face.cc => accu/stat/median_interval.cc} (78%)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 4216a2c..18fa3cb 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Add an accumulator median based on intervals.
+
+ * mln/accu/stat/median_interval.hh,
+ * tests/accu/stat/median_interval.cc: New.
+
+ * tests/accu/stat/Makefile.am: New target.
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Rename interval::nelements() to interval::nvalues().
* mln/value/interval.hh,
diff --git a/milena/mln/accu/stat/median_h.hh b/milena/mln/accu/stat/median_interval.hh
similarity index 50%
copy from milena/mln/accu/stat/median_h.hh
copy to milena/mln/accu/stat/median_interval.hh
index b38955d..a042bfa 100644
--- a/milena/mln/accu/stat/median_h.hh
+++ b/milena/mln/accu/stat/median_interval.hh
@@ -1,5 +1,4 @@
-// Copyright (C) 2007, 2008, 2009, 2011 EPITA Research and Development
-// Laboratory (LRDE)
+// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -24,16 +23,18 @@
// 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_HH
-# define MLN_ACCU_STAT_MEDIAN_H_HH
+#ifndef MLN_ACCU_STAT_MEDIAN_ALT_HH
+# define MLN_ACCU_STAT_MEDIAN_INTERVAL_HH
/// \file
///
-/// Define a generic median accumulator class.
+/// Define a median accumulator class accepting values restricted to a
+/// specific interval of values.
# include <mln/accu/internal/base.hh>
-# include <mln/accu/histo.hh>
-# include <mln/value/set.hh>
+# include <mln/value/interval.hh>
+# include <mln/value/intsub.hh>
+# include <mln/util/array.hh>
namespace mln
@@ -45,61 +46,31 @@ namespace mln
namespace stat
{
- // Forward declaration.
- template <typename V>
- struct median_h;
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- /// Meta accumulator for median_h.
- struct median_h : public Meta_Accumulator< median_h >
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::median_h<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- namespace stat
- {
-
- /// \brief Generic median function based on histogram over a value
- /// set with type \c V.
+ /// \brief Generic median_interval function based on histogram over a
+ /// value set with type \c S.
///
/// \ingroup modaccuvalues
- template <typename V>
- struct median_h : public mln::accu::internal::base< const V&, median_h<V> >
+ //
+ template <unsigned n>
+ struct median_interval
+ : public mln::accu::internal::base< const value::intsub<n>&, median_interval<n> >
{
- typedef V argument;
+ typedef value::intsub<n> argument;
- median_h();
- median_h& operator=(const median_h& rhs);
+ median_interval(const value::interval<value::intsub<n> >& inter);
+ median_interval(const value::intsub<n>& first, const value::intsub<n>& last);
/// Manipulators.
/// \{
- void init();
void take(const argument& t);
- void take(const median_h<V>& other);
+ void take(const median_interval& other);
void untake(const argument& t);
+ void init();
/// \}
- unsigned card() const { return h_.sum(); }
-
/// Get the value of the accumulator.
- const argument& to_result() const;
-
- const accu::histo<V>& histo() const;
+ const value::intsub<n>& to_result() const;
/// Check whether this accu is able to return a result.
/// Always true here.
@@ -107,114 +78,153 @@ namespace mln
protected:
- mutable accu::histo<V> h_;
- const value::set<V>& s_; // derived from h_
+ mutable util::array<unsigned> h_;
+ unsigned sum_;
mutable unsigned sum_minus_, sum_plus_;
mutable bool valid_;
- mutable unsigned i_; // the median_h index
- mutable argument t_; // the median_h value
+
+ /// the median index
+ mutable unsigned i_;
+ /// the median argument
+ mutable value::intsub<n> t_;
+
+ value::interval<value::intsub<n> > inter_;
// Auxiliary methods
- void update_() const;
void go_minus_() const;
void go_plus_() const;
+ void update_() const;
};
+ } // end of mln::accu::stat
+
+
# ifndef MLN_INCLUDE_ONLY
- template <typename V>
- inline
- median_h<V>::median_h()
- : h_(),
- s_(h_.vset())
+ namespace stat
+ {
+
+ template <unsigned n>
+ median_interval<n>::median_interval(const value::interval<value::intsub<n> >& inter)
+ : inter_(inter)
{
init();
}
- template <typename V>
- inline
- median_h<V>&
- median_h<V>::operator=(const median_h<V>& rhs)
+ template <unsigned n>
+ median_interval<n>::median_interval(const value::intsub<n>& first, const value::intsub<n>& last)
+ : inter_(first, last)
{
- h_ = rhs.h_;
- sum_minus_ = rhs.sum_minus_;
- sum_plus_ = rhs.sum_plus_;
- valid_ = rhs.valid_;
- i_ = rhs.i_;
- t_ = rhs.t_;
-
- return *this;
+ init();
}
- template <typename V>
- inline
+ template <unsigned n>
void
- median_h<V>::take(const argument& t)
+ median_interval<n>::take(const argument& t)
{
- h_.take(t);
+ mln_precondition(inter_.has(t));
+
+ unsigned index = inter_.index_of(t);
- if (t < t_)
+ // update h_
+ ++h_[index];
+ ++sum_;
+
+ if (index < i_)
++sum_minus_;
- else if (t > t_)
+ else if (index > i_)
++sum_plus_;
if (valid_)
valid_ = false;
}
- template <typename V>
+ template <unsigned n>
inline
void
- median_h<V>::take(const median_h<V>& other)
+ median_interval<n>::take(const median_interval<n>& other)
{
- // h_
- h_.take(other.h_);
+ for (unsigned i = 0; i < h_.size(); ++i)
+ h_[i] += other.h_[i];
// sum_minus_
for (unsigned i = 0; i < i_; ++i)
sum_minus_ += other.h_[i];
// sum_plus_
- for (unsigned i = i_ + 1; i < h_.nvalues(); ++i)
+ for (unsigned i = i_ + 1; i < h_.nelements(); ++i)
sum_plus_ += other.h_[i];
if (valid_)
valid_ = false;
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::untake(const argument& t)
+ median_interval<n>::untake(const argument& t)
{
- mln_precondition(h_(t) != 0);
- h_.untake(t);
+ mln_precondition(inter_.has(t));
+ mln_precondition(h_[inter_.index_of(t)] != 0);
+
+ unsigned index = inter_.index_of(t);
+
+ // update h_
+ --h_[index];
+ --sum_;
- if (t < t_)
+ if (index < i_)
--sum_minus_;
- else if (t > t_)
+ else if (index > i_)
--sum_plus_;
if (valid_)
valid_ = false;
}
- template <typename V>
+ template <unsigned n>
+ void
+ median_interval<n>::init()
+ {
+ h_.resize(inter_.nvalues(), 0);
+ sum_minus_ = 0;
+ sum_plus_ = 0;
+ i_ = inter_.nvalues() / 2;
+ t_ = inter_.ith_element(i_);
+ }
+
+ template <unsigned n>
+ const value::intsub<n>&
+ median_interval<n>::to_result() const
+ {
+ if (! valid_)
+ update_();
+ return t_;
+ }
+
+ template <unsigned n>
+ bool
+ median_interval<n>::is_valid() const
+ {
+ return true;
+ }
+
+ template <unsigned n>
inline
void
- median_h<V>::update_() const
+ median_interval<n>::update_() const
{
valid_ = true;
- if (h_.sum() == 0)
+ if (sum_ == 0)
return;
- if (2 * sum_minus_ > h_.sum())
+ if (2 * sum_minus_ > sum_)
go_minus_();
else
- if (2 * sum_plus_ > h_.sum())
+ if (2 * sum_plus_ > sum_)
go_plus_();
else
if (h_[i_] == 0)
@@ -227,10 +237,10 @@ namespace mln
}
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::go_minus_() const
+ median_interval<n>::go_minus_() const
{
do
{
@@ -240,14 +250,14 @@ namespace mln
while (h_[i_] == 0);
sum_minus_ -= h_[i_];
}
- while (2 * sum_minus_ > h_.sum());
- t_ = s_[i_];
+ while (2 * sum_minus_ > sum_);
+ t_ = inter_.ith_element(i_);
}
- template <typename V>
- inline
+
+ template <unsigned n>
void
- median_h<V>::go_plus_() const
+ median_interval<n>::go_plus_() const
{
do
{
@@ -257,56 +267,23 @@ namespace mln
while (h_[i_] == 0);
sum_plus_ -= h_[i_];
}
- while (2 * sum_plus_ > h_.sum());
- t_ = s_[i_];
+ while (2 * sum_plus_ > sum_);
+ t_ = inter_.ith_element(i_);
}
- template <typename V>
- inline
- void
- median_h<V>::init()
+ template <unsigned n>
+ std::ostream& operator<<(std::ostream& ostr, const median_interval<n>& m)
{
- h_.init();
- sum_minus_ = 0;
- sum_plus_ = 0;
- i_ = (s_.index_of(mln_max(argument))
- - s_.index_of(mln_min(argument))) / 2;
- t_ = s_[i_];
- valid_ = true;
+ return ostr << m.to_result();
}
- template <typename V>
- inline
- const typename median_h<V>::argument&
- median_h<V>::to_result() const
- {
- if (! valid_)
- update_();
- return t_;
- }
-
- template <typename V>
- inline
- const accu::histo<V>&
- median_h<V>::histo() const
- {
- return h_;
- }
-
- template <typename V>
- inline
- bool
- median_h<V>::is_valid() const
- {
- return true;
- }
+ } // end of namespace mln::accu::stat
# 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_HH
+
+#endif // ! MLN_ACCU_STAT_MEDIAN_INTERVAL_HH
diff --git a/milena/tests/accu/stat/Makefile.am b/milena/tests/accu/stat/Makefile.am
index 47197c0..77bcf65 100644
--- a/milena/tests/accu/stat/Makefile.am
+++ b/milena/tests/accu/stat/Makefile.am
@@ -1,5 +1,5 @@
-# Copyright (C) 2009, 2010 EPITA Research and Development Laboratory
-# (LRDE).
+# Copyright (C) 2009, 2010, 2012 EPITA Research and Development
+# Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -26,6 +26,7 @@ check_PROGRAMS = \
max \
max_h \
median_h \
+ median_interval \
mean \
rank
@@ -33,6 +34,7 @@ deviation_SOURCES = deviation.cc
var_SOURCES = var.cc
mean_SOURCES = mean.cc
median_h_SOURCES = median_h.cc
+median_interval_SOURCES = median_interval.cc
min_SOURCES = min.cc
min_h_SOURCES = min_h.cc
max_SOURCES = max.cc
diff --git a/milena/tests/world/k1/is_primary_face.cc b/milena/tests/accu/stat/median_interval.cc
similarity index 78%
copy from milena/tests/world/k1/is_primary_face.cc
copy to milena/tests/accu/stat/median_interval.cc
index 32eb871..a0c05a9 100644
--- a/milena/tests/world/k1/is_primary_face.cc
+++ b/milena/tests/accu/stat/median_interval.cc
@@ -23,17 +23,28 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-/// \file
+#include <mln/accu/stat/median_interval.hh>
-#include <mln/core/alias/point2d.hh>
-#include <mln/world/k1/is_primary_face.hh>
int main()
{
using namespace mln;
- mln_assertion(!world::k1::is_primary_face(point2d(-1, -1)));
- mln_assertion(!world::k1::is_primary_face(point2d(-1, 0)));
- mln_assertion(!world::k1::is_primary_face(point2d(0, -1)));
- mln_assertion(world::k1::is_primary_face(point2d(0, 0)));
+ {
+ accu::stat::median_interval<2> med(2, 5);
+
+ med.take(2);
+ med.take(2);
+ med.take(2.5);
+ med.take(2.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(4.5);
+ med.take(5);
+ med.take(5);
+ med.take(5);
+
+ mln_assertion(med.to_result() == 4.5);
+ }
}
--
1.7.2.5
1
0

olena-2.0-98-ge0efc44 Rename interval::nelements() to interval::nvalues().
by Guillaume Lazzara 04 Oct '12
by Guillaume Lazzara 04 Oct '12
04 Oct '12
* mln/value/interval.hh,
* tests/value/interval.cc: Rename nelements() to nvalues().
---
milena/ChangeLog | 7 +++++++
milena/mln/value/interval.hh | 14 ++++++++------
milena/tests/value/interval.cc | 4 ++--
3 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 9392818..0e6b384 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,12 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Rename interval::nelements() to interval::nvalues().
+
+ * mln/value/interval.hh,
+ * tests/value/interval.cc: Rename nelements() to nvalues().
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Replace range class with interval and improve it.
* mln/value/range.hh,
diff --git a/milena/mln/value/interval.hh b/milena/mln/value/interval.hh
index a4cdf8c..13c7947 100644
--- a/milena/mln/value/interval.hh
+++ b/milena/mln/value/interval.hh
@@ -67,7 +67,7 @@ namespace mln
unsigned index_of(const T& v) const;
/// Return the number of values in this interval.
- unsigned nelements() const;
+ unsigned nvalues() const;
/// Return True if this interval contains only one value.
bool is_degenerated() const;
@@ -80,7 +80,7 @@ namespace mln
private:
T first_;
T last_;
- unsigned nelements_;
+ unsigned nvalues_;
};
// comparison
@@ -213,9 +213,9 @@ namespace mln
first_ = first;
last_ = last;
- nelements_ = 0;
+ nvalues_ = 0;
for (T v = first_; v <= last_; value::inc(v))
- ++nelements_;
+ ++nvalues_;
}
template <typename T>
@@ -245,6 +245,7 @@ namespace mln
T
interval<T>::ith_element(unsigned i) const
{
+ mln_precondition(i < nvalues());
return first_ + i * iota<T>::value();
}
@@ -252,14 +253,15 @@ namespace mln
unsigned
interval<T>::index_of(const T& v) const
{
+ mln_precondition(has(v));
return (v - first_) / iota<T>::value();
}
template <typename T>
unsigned
- interval<T>::nelements() const
+ interval<T>::nvalues() const
{
- return nelements_;
+ return nvalues_;
}
template <typename T>
diff --git a/milena/tests/value/interval.cc b/milena/tests/value/interval.cc
index 86b9a55..0fd8e6d 100644
--- a/milena/tests/value/interval.cc
+++ b/milena/tests/value/interval.cc
@@ -47,7 +47,7 @@ int main()
R r(0, 0);
assert(r.is_degenerated());
assert(r.length() == 0);
- assert(r.nelements() == 1);
+ assert(r.nvalues() == 1);
}
{
@@ -64,7 +64,7 @@ int main()
R r(1, 5);
assert(!r.is_degenerated());
assert(r.length() == 4);
- assert(r.nelements() == 9);
+ assert(r.nvalues() == 9);
int ref_i = 2;
for (intsub<2> v = r.first(); v <= r.last(); inc(v))
--
1.7.2.5
1
0

olena-2.0-39-gb52230f Rename interval::nelements() to interval::nvalues().
by Guillaume Lazzara 04 Oct '12
by Guillaume Lazzara 04 Oct '12
04 Oct '12
* mln/value/interval.hh,
* tests/value/interval.cc: Rename nelements() to nvalues().
---
milena/ChangeLog | 7 +++++++
milena/mln/value/interval.hh | 14 ++++++++------
milena/tests/value/interval.cc | 4 ++--
3 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 5db80bd..4216a2c 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,12 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Rename interval::nelements() to interval::nvalues().
+
+ * mln/value/interval.hh,
+ * tests/value/interval.cc: Rename nelements() to nvalues().
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Replace range class with interval and improve it.
* mln/value/range.hh,
diff --git a/milena/mln/value/interval.hh b/milena/mln/value/interval.hh
index a4cdf8c..13c7947 100644
--- a/milena/mln/value/interval.hh
+++ b/milena/mln/value/interval.hh
@@ -67,7 +67,7 @@ namespace mln
unsigned index_of(const T& v) const;
/// Return the number of values in this interval.
- unsigned nelements() const;
+ unsigned nvalues() const;
/// Return True if this interval contains only one value.
bool is_degenerated() const;
@@ -80,7 +80,7 @@ namespace mln
private:
T first_;
T last_;
- unsigned nelements_;
+ unsigned nvalues_;
};
// comparison
@@ -213,9 +213,9 @@ namespace mln
first_ = first;
last_ = last;
- nelements_ = 0;
+ nvalues_ = 0;
for (T v = first_; v <= last_; value::inc(v))
- ++nelements_;
+ ++nvalues_;
}
template <typename T>
@@ -245,6 +245,7 @@ namespace mln
T
interval<T>::ith_element(unsigned i) const
{
+ mln_precondition(i < nvalues());
return first_ + i * iota<T>::value();
}
@@ -252,14 +253,15 @@ namespace mln
unsigned
interval<T>::index_of(const T& v) const
{
+ mln_precondition(has(v));
return (v - first_) / iota<T>::value();
}
template <typename T>
unsigned
- interval<T>::nelements() const
+ interval<T>::nvalues() const
{
- return nelements_;
+ return nvalues_;
}
template <typename T>
diff --git a/milena/tests/value/interval.cc b/milena/tests/value/interval.cc
index 86b9a55..0fd8e6d 100644
--- a/milena/tests/value/interval.cc
+++ b/milena/tests/value/interval.cc
@@ -47,7 +47,7 @@ int main()
R r(0, 0);
assert(r.is_degenerated());
assert(r.length() == 0);
- assert(r.nelements() == 1);
+ assert(r.nvalues() == 1);
}
{
@@ -64,7 +64,7 @@ int main()
R r(1, 5);
assert(!r.is_degenerated());
assert(r.length() == 4);
- assert(r.nelements() == 9);
+ assert(r.nvalues() == 9);
int ref_i = 2;
for (intsub<2> v = r.first(); v <= r.last(); inc(v))
--
1.7.2.5
1
0
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/harris has been created
at f82caaa8d12381d09e2d803ba1c2b286713832df (commit)
- Log -----------------------------------------------------------------
f82caaa Add test for Harris corner detection.
1bc3078 Add Harris corner detection.
-----------------------------------------------------------------------
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

04 Oct '12
* tests/detection/corner/Makefile.am (check_PROGRAMS): Add harris.
(harris_SOURCES): add harris.
(MOSTLYCLEANFILES): add harris-result
* tests/detection/corner/harris.cc: New.
---
milena/ChangeLog | 9 +++++++++
milena/tests/detection/corner/Makefile.am | 10 ++++++++--
.../detection/corner/{moravec.cc => harris.cc} | 16 +++++++++++-----
3 files changed, 28 insertions(+), 7 deletions(-)
copy milena/tests/detection/corner/{moravec.cc => harris.cc} (80%)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 808624f..b88c960 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2012-10-04 Jonathan Fabrizio <jonathan(a)lrde.epita.fr>
+ Add test for Harris corner detection.
+
+ * tests/detection/corner/Makefile.am (check_PROGRAMS): Add harris.
+ (harris_SOURCES): add harris.
+ (MOSTLYCLEANFILES): add harris-result
+ * tests/detection/corner/harris.cc: New.
+
+2012-10-04 Jonathan Fabrizio <jonathan(a)lrde.epita.fr>
+
Add Harris corner detection.
* mln/detection/corner/harris.hh: New.
diff --git a/milena/tests/detection/corner/Makefile.am b/milena/tests/detection/corner/Makefile.am
index 1a185a6..eb70108 100644
--- a/milena/tests/detection/corner/Makefile.am
+++ b/milena/tests/detection/corner/Makefile.am
@@ -16,9 +16,15 @@
include $(top_srcdir)/milena/tests/tests.mk
-check_PROGRAMS = moravec
+check_PROGRAMS = \
+moravec \
+harris
+
moravec_SOURCES = moravec.cc
+harris_SOURCES = harris.cc
TESTS = $(check_PROGRAMS)
-MOSTLYCLEANFILES = moravec-result.ppm
+MOSTLYCLEANFILES = \
+moravec-result.ppm \
+harris-result.ppm
diff --git a/milena/tests/detection/corner/moravec.cc b/milena/tests/detection/corner/harris.cc
similarity index 80%
copy from milena/tests/detection/corner/moravec.cc
copy to milena/tests/detection/corner/harris.cc
index 850d2a0..343168c 100644
--- a/milena/tests/detection/corner/moravec.cc
+++ b/milena/tests/detection/corner/harris.cc
@@ -23,7 +23,7 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#include <mln/detection/corner/moravec.hh>
+#include <mln/detection/corner/harris.hh>
#include <mln/value/rgb8.hh>
#include <mln/value/int_u8.hh>
#include <mln/io/essential.hh>
@@ -44,12 +44,18 @@ int main()
p_array<point2d> corners;
io::pgm::load(input, MLN_TESTS_IMG_DIR "/test_corner_detection.pgm");
- corners = mln::detection::corner::moravec(input);
+ corners = mln::detection::corner::harris(input);
output = mln::data::convert(value::rgb8(), input);
- mln_assertion(corners.nsites() == 1);
- mln_assertion(corners[0] == point2d(39,64));
data::fill( (output | corners).rw(), literal::red);
- io::ppm::save(output, "moravec-result.ppm");
+ io::ppm::save(output, "harris-result.ppm");
+
+ {
+ bool points_ok = false;
+ mln_assertion(corners.nsites() == 2);
+ if (corners[0] == point2d(39,64) && corners[1] == point2d(41,66)) points_ok = true;
+ else if (corners[1] == point2d(39,64) && corners[0] == point2d(41,66)) points_ok = true;
+ mln_assertion(points_ok);
+ }
}
--
1.7.2.5
1
0
* mln/detection/corner/harris.hh: New.
* mln/detection/corner/harris_criterion.hh: New.
---
milena/ChangeLog | 7 +
.../mln/detection/corner/{moravec.hh => harris.hh} | 91 +++++++++------
milena/mln/detection/corner/harris_criterion.hh | 123 ++++++++++++++++++++
3 files changed, 187 insertions(+), 34 deletions(-)
copy milena/mln/detection/corner/{moravec.hh => harris.hh} (52%)
create mode 100644 milena/mln/detection/corner/harris_criterion.hh
diff --git a/milena/ChangeLog b/milena/ChangeLog
index fab764c..808624f 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,10 @@
+2012-10-04 Jonathan Fabrizio <jonathan(a)lrde.epita.fr>
+
+ Add Harris corner detection.
+
+ * mln/detection/corner/harris.hh: New.
+ * mln/detection/corner/harris_criterion.hh: New.
+
2012-10-03 Jonathan Fabrizio <jonathan(a)lrde.epita.fr>
Add test for Moravec corner detection.
diff --git a/milena/mln/detection/corner/moravec.hh b/milena/mln/detection/corner/harris.hh
similarity index 52%
copy from milena/mln/detection/corner/moravec.hh
copy to milena/mln/detection/corner/harris.hh
index b9af479..0acce69 100644
--- a/milena/mln/detection/corner/moravec.hh
+++ b/milena/mln/detection/corner/harris.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2010 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -23,20 +23,24 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef MLN_DETECTION_CORNER_MORAVEC_HH
-# define MLN_DETECTION_CORNER_MORAVEC_HH
+#ifndef MLN_DETECTION_CORNER_HARRIS_HH
+# define MLN_DETECTION_CORNER_HARRIS_HH
#include <mln/core/site_set/p_array.hh>
-#include <mln/extension/adjust_duplicate.hh>
-#include <mln/metal/is.hh>
-#include <mln/win/rectangle2d.hh>
+//#include <mln/win/rectangle2d.hh>
#include <mln/core/alias/neighb2d.hh>
-#include <mln/core/alias/window2d.hh>
-#include <mln/detection/corner/moravec_criterion.hh>
+#include <mln/linear/ch_convolve.hh>
+#include <mln/linear/convolve.hh>
+#include <mln/linear/gaussian.hh>
+#include <mln/arith/times.hh>
+#include <mln/core/alias/w_window2d_int.hh>
+
+//#include <mln/core/alias/window2d.hh>
+#include <mln/detection/corner/harris_criterion.hh>
/// \file
///
-/// \brief Implementation of Moravec corner detection.
+/// \brief Implementation of Harris corner detection.
namespace mln
@@ -46,32 +50,47 @@ namespace mln
namespace corner
{
/**
- Computes Moravec corner detection on \p in_image
+ Computes Harris corner detection on \p in_image
\param image_in_ The input image
- \param win The window of moravec algorithm
- \param nbh All possible positions of the window
+ \param k the k parameter in Harris algorithm
+ \param sigma the standard deviation of the gaussian used in
+ Harris algorithm
\return The list of points detected as corner
\author J. Fabrizio
*/
- template<typename I, typename W, typename N>
+ template<typename I>
p_array<mln_site(I)>
- moravec(const Image<I>& in_image_, const Window<W>& win, const Neighborhood<N>& nbh);
+ harris(const Image<I>& in_image_, float k, float sigma);
/**
- Computes Moravec corner detection on \p in_image
- with a default 3x3 window and a defaut 3x3 neighborhood.
+ Computes Harris corner detection on \p in_image with the
+ standard deviation of the guassian sets to 0.34
\param image_in_ The input image
+ \param k the k parameter in Harris algorithm
\return The list of points detected as corner
\author J. Fabrizio
*/
template<typename I>
p_array<mln_site(I)>
- moravec(const Image<I>& in_image_);
+ harris(const Image<I>& in_image_, float k);
+
+ /**
+ Computes Harris corner detection on \p in_image with the k
+ parameter sets to 0.04 and the standard deviation of the
+ guassian sets to 0.34.
+ \param image_in_ The input image
+ \return The list of points detected as corner
+
+ \author J. Fabrizio
+ */
+ template<typename I>
+ p_array<mln_site(I)>
+ harris(const Image<I>& in_image_);
# ifndef MLN_INCLUDE_ONLY
@@ -80,19 +99,18 @@ namespace mln
namespace internal
{
/**
- \iternal Computes local min to find corner in an image
+ \iternal Computes local max to find corner in an image
- \param image_in_ The result of moravec_criterion
+ \param image_in_ The result of harris_criterion
\return The list of local min
\author J. Fabrizio
*/
template<typename I>
p_array<mln_site(I)>
- moravec_local_min(const Image<I>& in_image_)
+ harris_local_max(const Image<I>& in_image_)
{
- trace::entering("detection::corner::moravec_local_min");
-
+ trace::exiting("detection::corner::harris_local_max");
const I& in_image = exact(in_image_);
p_array<mln_site(I)> result;
mln_piter(I) p(in_image.domain());
@@ -101,7 +119,7 @@ namespace mln
bool max = true;
mln_niter(neighb2d) n(c8(), p);
for_all(n) {
- if (in_image(p)<=in_image(n))
+ if (in_image(p)<=in_image(n))
{
max = false;
break;
@@ -111,28 +129,33 @@ namespace mln
result.append(p);
}
}
- trace::exiting("detection::corner::moravec_local_min");
+ trace::exiting("detection::corner::harris_local_max");
return result;
}
} // end of namespace mln::detection::corner::internal
- template<typename I, typename W, typename N>
+ template<typename I>
p_array<mln_site(I)>
- moravec(const Image<I>& in_image_, const Window<W>& win, const Neighborhood<N>& nbh) {
- trace::entering("detection::corner::moravec");
- mln_ch_value(I, unsigned short) criterion_image;
- criterion_image = moravec_criterion(in_image_, win, nbh);
- trace::exiting("detection::corner::moravec");
- return internal::moravec_local_min(criterion_image);
+ harris(const Image<I>& in_image_, float k, float sigma) {
+ trace::entering("detection::corner::harris");
+ mln_ch_convolve(I, w_window2d_int) criterion_image;
+ criterion_image = harris_criterion(in_image_, k, sigma);
+ trace::exiting("detection::corner::harris");
+ return internal::harris_local_max(criterion_image);
}
template<typename I>
p_array<mln_site(I)>
- moravec(const Image<I>& in_image_) {
- return moravec(in_image_, win_c8p(), c8());
+ harris(const Image<I>& in_image_, float k) {
+ return harris(in_image_, k, 0.34);
}
+ template<typename I>
+ p_array<mln_site(I)>
+ harris(const Image<I>& in_image_) {
+ return harris(in_image_, 0.04, 0.34);
+ }
@@ -144,4 +167,4 @@ namespace mln
} // end of namespace mln
-#endif // ! MLN_DETECTION_CORNER_MORAVEC_HH
+#endif // ! MLN_DETECTION_CORNER_HARRIS_HH
diff --git a/milena/mln/detection/corner/harris_criterion.hh b/milena/mln/detection/corner/harris_criterion.hh
new file mode 100644
index 0000000..0b125c6
--- /dev/null
+++ b/milena/mln/detection/corner/harris_criterion.hh
@@ -0,0 +1,123 @@
+// 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_DETECTION_CORNER_HARRIS_CRITERION_HH
+# define MLN_DETECTION_CORNER_HARRIS_CRITERION_HH
+
+
+//#include <mln/io/essential.hh>
+//#include <mln/data/stretch.hh>
+//#include <mln/data/convert.hh>
+//#include <mln/value/graylevel.hh>
+# include <mln/core/alias/w_window2d_int.hh>
+
+/// \file
+///
+/// \brief Implementation of Harris corner detection.
+
+
+namespace mln
+{
+ namespace detection
+ {
+ namespace corner
+ {
+ /**
+ Computes Harris corner detection criterion on \p in_image.
+
+ \param image_in_ The input image.
+ \param k The k parameter in harris algorithm (use 0.04 if you
+ do not know what to do).
+ \param sigma The standard deviation of the gaussian used harris algorithm.
+
+ \return Harris criterion computed for evey pixel.
+
+ \author J. Fabrizio
+ */
+ template<typename I>
+ mln_ch_convolve(I, w_window2d_int)
+ harris_criterion(const Image<I>& in_image_, float k, float sigma);
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ template<typename I>
+ mln_ch_convolve(I, w_window2d_int)
+ harris_criterion(const Image<I>& in_image_, float k, float sigma)
+ {
+ trace::entering("detection::corner::haris_criterion");
+
+ const I& in_image = exact(in_image_);
+ p_array<mln_site(I)> result;
+ typedef mln_ch_convolve(I, w_window2d_int) O;
+ O dx_image;
+ O dy_image;
+ O dxx_image;
+ O dxy_image;
+ O dyy_image;
+ O harris_criterion(in_image.domain());
+
+ typedef dpoint2d D;
+ w_window2d_int dx_grad;
+ dx_grad
+ .insert(-1, D(0, -1))
+ .insert(+1, D(0, +1));
+ w_window2d_int dy_grad;
+ dy_grad
+ .insert(-1, D(-1, 0))
+ .insert(+1, D(+1, 0));
+
+ dx_image=linear::convolve(in_image, dx_grad);
+ dy_image=linear::convolve(in_image, dy_grad);
+
+ dxx_image=linear::gaussian(dx_image*dx_image, sigma);
+ dxy_image=linear::gaussian(dx_image*dy_image, sigma);
+ dyy_image=linear::gaussian(dy_image*dy_image, sigma);
+
+ typedef mln_value(O) V;
+ mln_piter(I) p(in_image.domain());
+ for_all(p) {
+ V a = dxx_image(p);
+ V b = dyy_image(p);
+ V c = dxy_image(p);
+ harris_criterion(p)=(a*b-c*c)-k*(a+b)*(a+b);
+ }
+
+ // I output = data::stretch(mln_value(I)(), harris_criterion);
+ // io::pgm::save(output, "harris-criterion-result.pgm");
+
+ trace::exiting("detection::corner::harris_criterion");
+ return harris_criterion;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::detection::corner
+
+ } // end of namespace mln::detection
+
+} // end of namespace mln
+
+#endif // ! MLN_DETECTION_CORNER_HARRIS_CRITERION_HH
--
1.7.2.5
1
0
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/khalimsky has been updated
via 378bb80be1f173841b2358c47b15be1ce87add88 (commit)
via c709c0740a7690c450763f5fe2e13bde69795f31 (commit)
via 0c9847ecc8e97564ab24fc23dd2aee7ace9aa072 (commit)
via 841c962c69fee0d982dbdae5b155c479bdd73c99 (commit)
via d2cc34cb2d84e990fce7f03ecc130cb3cbe86e2b (commit)
via 3ce4ce1dc14779f0ce244fef70a6fa984f494d59 (commit)
via e5977cbc87ffe43c37e74e83f36eee278f15ce13 (commit)
from 25a6947e13ca488b5f1b0601f2333d113c85d2d7 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
378bb80 Replace range class with interval and improve it.
c709c07 Improve value::intsub class.
0c9847e mln/value/builtin/ops.hh: Handle all the comparison operators.
841c962 Add mathematical tools.
d2cc34c tests/world/k1/Makefile.am: Fix target names.
3ce4ce1 Replace unsignedh type by intsub.
e5977cb New routines to browse values into a value set.
-----------------------------------------------------------------------
Summary of changes:
milena/ChangeLog | 72 ++++
milena/mln/accu/label_used.hh | 2 +-
milena/mln/core/internal/labeled_image_base.hh | 2 +-
milena/mln/fun/vv2v/mean.hh | 77 ++++
milena/mln/fun/vvvv2v/mean.hh | 76 ++++
milena/mln/labeling/colorize.hh | 2 +-
milena/mln/labeling/compute.hh | 22 +-
milena/mln/labeling/superpose.hh | 2 +-
milena/mln/make/relabelfun.hh | 4 +-
milena/mln/math/ceil.hh | 74 ++++
milena/mln/math/floor.hh | 74 ++++
milena/mln/math/max.hh | 23 +-
milena/mln/math/mean.hh | 128 ++++++
milena/mln/math/min.hh | 23 +-
milena/mln/set/compute_with_weights.hh | 2 +-
milena/mln/value/builtin/ops.hh | 14 +-
milena/mln/value/dec.hh | 121 ++++++
milena/mln/value/inc.hh | 121 ++++++
milena/mln/value/interval.hh | 371 ++++++++++++++++--
milena/mln/value/intsub.hh | 500 ++++++++++++++++++++++++
milena/mln/value/iota.hh | 80 ++++
milena/mln/value/label.hh | 8 +-
milena/mln/value/next.hh | 141 -------
milena/mln/value/prev.hh | 125 ++++++
milena/mln/value/range.hh | 425 --------------------
milena/mln/value/succ.hh | 126 ++++++
milena/mln/value/unsignedh.hh | 415 --------------------
milena/tests/value/Makefile.am | 10 +-
milena/tests/value/interval.cc | 104 +++++
milena/tests/value/intsub.cc | 109 +++++
milena/tests/value/range.cc | 71 ----
milena/tests/value/unsignedh.cc | 44 --
milena/tests/world/k1/Makefile.am | 2 +-
33 files changed, 2193 insertions(+), 1177 deletions(-)
create mode 100644 milena/mln/fun/vv2v/mean.hh
create mode 100644 milena/mln/fun/vvvv2v/mean.hh
create mode 100644 milena/mln/math/ceil.hh
create mode 100644 milena/mln/math/floor.hh
create mode 100644 milena/mln/math/mean.hh
create mode 100644 milena/mln/value/dec.hh
create mode 100644 milena/mln/value/inc.hh
create mode 100644 milena/mln/value/intsub.hh
create mode 100644 milena/mln/value/iota.hh
delete mode 100644 milena/mln/value/next.hh
create mode 100644 milena/mln/value/prev.hh
delete mode 100644 milena/mln/value/range.hh
create mode 100644 milena/mln/value/succ.hh
delete mode 100644 milena/mln/value/unsignedh.hh
create mode 100644 milena/tests/value/interval.cc
create mode 100644 milena/tests/value/intsub.cc
delete mode 100644 milena/tests/value/range.cc
delete mode 100644 milena/tests/value/unsignedh.cc
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

olena-2.0-97-ged21680 Replace range class with interval and improve it.
by Guillaume Lazzara 04 Oct '12
by Guillaume Lazzara 04 Oct '12
04 Oct '12
* mln/value/range.hh,
* tests/value/range.cc: Rename as...
* mln/value/interval.hh,
* tests/value/interval.cc: ... this and improve it.
* tests/value/Makefile.am: Update target name.
---
milena/ChangeLog | 11 +
milena/mln/value/interval.hh | 371 ++++++++++++++++++++---
milena/mln/value/range.hh | 425 --------------------------
milena/tests/value/Makefile.am | 6 +-
milena/tests/value/{range.cc => interval.cc} | 47 +++-
5 files changed, 386 insertions(+), 474 deletions(-)
delete mode 100644 milena/mln/value/range.hh
rename milena/tests/value/{range.cc => interval.cc} (60%)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 3d191ab..9392818 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,16 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Replace range class with interval and improve it.
+
+ * mln/value/range.hh,
+ * tests/value/range.cc: Rename as...
+ * mln/value/interval.hh,
+ * tests/value/interval.cc: ... this and improve it.
+
+ * tests/value/Makefile.am: Update target name.
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Improve value::intsub class.
* mln/value/intsub.hh: Improve class.
diff --git a/milena/mln/value/interval.hh b/milena/mln/value/interval.hh
index 92ccfad..a4cdf8c 100644
--- a/milena/mln/value/interval.hh
+++ b/milena/mln/value/interval.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -26,15 +26,14 @@
#ifndef MLN_VALUE_INTERVAL_HH
# define MLN_VALUE_INTERVAL_HH
-/*! \file
- *
- * \brief Define an interval between two values.
- *
- * \todo Likewise, code value::not_equal(t), less_than, etc.
- */
-
-# include <mln/core/concept/object.hh>
+/// \file
+///
+/// Define an interval.
+# include <cstdlib>
+# include <iostream>
+# include <mln/value/inc.hh>
+# include <mln/value/concept/interval.hh>
namespace mln
{
@@ -42,61 +41,355 @@ namespace mln
namespace value
{
- /// FIXME: Doc!
-
+ /// \brief Interval of values.
template <typename T>
- struct interval_ : public Object< interval_<T> >
+ class interval : public value::Interval<interval<T> >
{
- interval_(const T& from, const T& to);
- T from, to;
+ public:
+ typedef T enc;
+ typedef T equiv;
+
+ interval();
+ interval(T first, T last);
+
+ interval& operator=(const interval& rhs);
+
+ /// Return True if a value is within this interval.
+ bool has(const T& v) const;
+
+ /// Return the distance between the first and the last value.
+ T length() const;
+
+ /// Return the ith value in this interval.
+ T ith_element(unsigned i) const;
+
+ /// Return the index of value \p v in this interval.
+ unsigned index_of(const T& v) const;
+
+ /// Return the number of values in this interval.
+ unsigned nelements() const;
+
+ /// Return True if this interval contains only one value.
+ bool is_degenerated() const;
- template <typename U>
- operator interval_<U>() const;
+ /// The first value included in this interval.
+ const T& first() const;
+ /// The last value included in this interval.
+ const T& last() const;
+
+ private:
+ T first_;
+ T last_;
+ unsigned nelements_;
};
-
+
+ // comparison
+
+ template <typename T>
+ bool
+ operator==(const interval<T>& lhs, const interval<T>& rhs);
+
+ template <typename T>
+ bool
+ operator!=(const interval<T>& lhs, const interval<T>& rhs);
+
+ // deactivation of ordering related operators
+
+ template <typename T>
+ void operator<(const interval<T>&, const interval<T>&);
template <typename T>
- interval_<T>
- interval(const T& from, const T& to);
+ void operator<=(const interval<T>&, const interval<T>&);
+
+ template <typename T>
+ void operator>(const interval<T>&, const interval<T>&);
+
+ template <typename T>
+ void operator>=(const interval<T>&, const interval<T>&);
+
+ // set ops
+
+ /*! \p r1 and \p r2 intersection is empty and the number of
+ elements in the span is equal to the sum of the number of
+ elements in \p r1 and \p r2.
+
+ \verbatim
+ span(r1,r2)
+ <-------------------->
+ r1 r2
+ [x--x--x] [x--x--x--x]
+ <------->-<---------->
+ ^ ^ ^
+ | | |
+ | iota |
+ | |
+ length(r1) length(r2)
+ \endverbatim
+
+ */
+ template <typename T>
+ bool
+ are_adjacent(const interval<T>& r1, const interval<T>& r2);
+
+ /* \brief Return true if \p r1 and \p r2 intersect.
+ */
+ template <typename T>
+ bool
+ do_intersect(const interval<T>& r1, const interval<T>& r2);
+
+ /* \brief Perform the intersection of \p r1 and \p r2.
+ */
+ template <typename T>
+ interval<T>
+ inter(const interval<T>& r1, const interval<T>& r2);
+
+ // min / max
+
+ /*! \brief Re-implementation of the min function.
+ \sa math::min
+ */
+ template <typename T>
+ interval<T>
+ min_(const interval<T>& r1, const interval<T>& r2);
+
+ /*! \brief Re-implementation of the max function.
+ \sa math::max
+ */
+ template <typename T>
+ interval<T>
+ max_(const interval<T>& r1, const interval<T>& r2);
+
+ /// \brief Compute the span of \p r1 and \p r2.
+ template <typename T>
+ interval<T>
+ span(const interval<T>& r1, const interval<T>& r2);
+
+ // op<<
+
+ template <typename T>
+ std::ostream&
+ operator<<(std::ostream& ostr, const interval<T>& i);
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+// for sorting purpose
+
+namespace std
+{
+
+ template <typename T>
+ struct less< mln::value::interval<T> >
+ {
+ bool operator()(const mln::value::interval<T>& l,
+ const mln::value::interval<T>& r) const;
+ };
+
+} // std
+
# ifndef MLN_INCLUDE_ONLY
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
template <typename T>
- inline
- interval_<T>::interval_(const T& from, const T& to)
- : from(from),
- to(to)
+ interval<T>::interval()
{
- mln_precondition(from <= to);
}
template <typename T>
- template <typename U>
- inline
- interval_<T>::operator interval_<U>() const
+ interval<T>::interval(T first, T last)
{
- mln_invariant(from <= to);
- interval_<U> tmp(from, to);
- mln_postcondition(tmp.from <= tmp.to);
- return tmp;
+ mln_precondition(last >= first);
+ first_ = first;
+ last_ = last;
+
+ nelements_ = 0;
+ for (T v = first_; v <= last_; value::inc(v))
+ ++nelements_;
}
template <typename T>
- inline
- interval_<T>
- interval(const T& from, const T& to)
+ interval<T>&
+ interval<T>::operator=(const interval& rhs)
{
- mln_precondition(from <= to);
- interval_<T> tmp(from, to);
- return tmp;
+ first_ = rhs.first_;
+ last_ = rhs.last_;
+ return *this;
+ }
+
+ template <typename T>
+ bool
+ interval<T>::has(const T& v) const
+ {
+ return first_ <= v && v <= last_;
+ }
+
+ template <typename T>
+ T
+ interval<T>::length() const
+ {
+ return last_ - first_;
+ }
+
+ template <typename T>
+ T
+ interval<T>::ith_element(unsigned i) const
+ {
+ return first_ + i * iota<T>::value();
+ }
+
+ template <typename T>
+ unsigned
+ interval<T>::index_of(const T& v) const
+ {
+ return (v - first_) / iota<T>::value();
+ }
+
+ template <typename T>
+ unsigned
+ interval<T>::nelements() const
+ {
+ return nelements_;
+ }
+
+ template <typename T>
+ bool
+ interval<T>::is_degenerated() const
+ {
+ return last_ == first_;
+ }
+
+ template <typename T>
+ const T&
+ interval<T>::first() const
+ {
+ return first_;
+ }
+
+ template <typename T>
+ const T&
+ interval<T>::last() const
+ {
+ return last_;
+ }
+
+
+ // comparison
+
+ template <typename T>
+ bool
+ operator==(const interval<T>& lhs, const interval<T>& rhs)
+ {
+ return lhs.first() == rhs.first() && lhs.last() == rhs.last();
+ }
+
+ template <typename T>
+ bool
+ operator!=(const interval<T>& lhs, const interval<T>& rhs)
+ {
+ return ! (lhs == rhs);
+ }
+
+
+ // set ops
+
+ template <typename T>
+ bool
+ are_adjacent(const interval<T>& r1, const interval<T>& r2)
+ {
+ return span(r1, r2).length() == r1.length() + r2.length()
+ + value::iota<T>::value();
+ }
+
+ template <typename T>
+ bool
+ do_intersect(const interval<T>& r1, const interval<T>& r2)
+ {
+ return span(r1, r2).length() <= r1.length() + r2.length();
+ }
+
+ template <typename T>
+ interval<T>
+ inter(const interval<T>& r1, const interval<T>& r2)
+ {
+ mln_precondition(do_intersect(r1, r2));
+ return interval<T>(std::max(r1.first(), r2.first()),
+ std::min(r1.last(), r2.last()));
+ }
+
+
+ template <typename T>
+ interval<T>
+ min_(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::min(r1.first(), r2.first()),
+ std::min(r1.last(), r2.last()));
+ }
+
+ template <typename T>
+ interval<T>
+ max_(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::max(r1.first(), r2.first()),
+ std::max(r1.last(), r2.last()));
+ }
+
+
+ // span
+
+ template <typename T>
+ interval<T>
+ span(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::min(r1.first(), r2.first()),
+ std::max(r1.last(), r2.last()));
+ }
+
+
+
+ // op<<
+
+ template <typename T>
+ std::ostream&
+ operator<<(std::ostream& ostr, const interval<T>& i)
+ {
+ if (i.is_degenerated())
+ return ostr << '{' << i.first() << '}';
+ else
+ return ostr << '[' << i.first() << ',' << i.last() << ']';
}
-# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::value
} // end of namespace mln
-#endif // ! MLN_VALUE_INTERVAL_HH
+namespace std
+{
+
+ template <typename T>
+ bool less< mln::value::interval<T> >::operator()(
+ const mln::value::interval<T>& l,
+ const mln::value::interval<T>& r) const
+ {
+ mln_precondition(l.is_degenerated() && r.is_degenerated());
+ return l.first() < r.first();
+ }
+
+} // std
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+#endif // ndef MLN_VALUE_INTERVAL_HH
diff --git a/milena/mln/value/range.hh b/milena/mln/value/range.hh
deleted file mode 100644
index 5c90de7..0000000
--- a/milena/mln/value/range.hh
+++ /dev/null
@@ -1,425 +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_VALUE_RANGE_HH
-# define MLN_VALUE_RANGE_HH
-
-/// \file
-///
-/// Define a range value.
-
-# include <cstdlib>
-# include <iostream>
-# include <mln/value/next.hh>
-
-namespace mln
-{
-
- namespace value
- {
-
- template <typename T>
- class range
- {
- public:
- range();
-
- template <typename T_>
- range(T_ value);
-
- range(T lower, T upper);
-
- range& operator=(const range& rhs);
-
- template <typename T_>
- range& operator=(T_ value);
-
- bool has(const T& v) const;
-
- T length() const;
-
- unsigned nelements() const;
-
- bool is_degenerated() const;
-
- const T& lower() const;
- const T& upper() const;
-
- const T& first() const;
- const T& last() const;
-
- operator T() const;
-
- private:
- T lower_;
- T upper_;
- };
-
-// comparison
-
- template <typename T>
- bool
- operator==(const range<T>& lhs, const range<T>& rhs);
-
- template <typename T>
- bool
- operator!=(const range<T>& lhs, const range<T>& rhs);
-
-// deactivation of ordering related operators
-
- template <typename T>
- void operator<(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator<=(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>=(const range<T>&, const range<T>&);
-
-// set ops
-
- template <typename T>
- bool
- are_adjacent(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- bool
- do_intersect(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- range<T>
- inter(const range<T>& r1, const range<T>& r2);
-
-// min / max
-
- template <typename T>
- range<T>
- min(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- range<T>
- max(const range<T>& r1, const range<T>& r2);
-
-// mean
-
- template <typename T>
- range<T>
- mean(const range<T>& r1, const range<T>& r2);
-
-// span
-
- template <typename T>
- range<T>
- span(const range<T>& r1, const range<T>& r2);
-
-// op<<
-
- template <typename T>
- std::ostream&
- operator<<(std::ostream& ostr, const range<T>& i);
-
- } // end of namespace mln::value
-
-} // end of namespace mln
-
-
-// for sorting purpose
-
-namespace std
-{
-
- template <typename T>
- struct less< mln::value::range<T> >
- {
- bool operator()(const mln::value::range<T>& l,
- const mln::value::range<T>& r) const;
- };
-
-} // std
-
-
-
-# ifndef MLN_INCLUDE_ONLY
-
-
-namespace mln
-{
-
- namespace value
- {
-
-
- template <typename T>
- range<T>::range()
- {
- }
-
- template <typename T>
- template <typename T_>
- range<T>::range(T_ value)
- {
- lower_ = upper_ = value;
- }
-
- template <typename T>
- range<T>::range(T lower, T upper)
- {
- if (upper < lower)
- std::abort();
- lower_ = lower;
- upper_ = upper;
- }
-
- template <typename T>
- range<T>&
- range<T>::operator=(const range& rhs)
- {
- lower_ = rhs.lower_;
- upper_ = rhs.upper_;
- return *this;
- }
-
- template <typename T>
- template <typename T_>
- range<T>&
- range<T>::operator=(T_ value)
- {
- lower_ = upper_ = value;
- return *this;
- }
-
- template <typename T>
- bool
- range<T>::has(const T& v) const
- {
- return lower_ <= v && v <= upper_;
- }
-
- template <typename T>
- T
- range<T>::length() const
- {
- return upper_ - lower_;
- }
-
- template <typename T>
- unsigned
- range<T>::nelements() const
- {
- unsigned n = 1;
- T v = lower_;
- for (; v != upper_; v = value::succ(v))
- n += 1;
-
- return n;
- }
-
- template <typename T>
- bool
- range<T>::is_degenerated() const
- {
- return upper_ == lower_;
- }
-
- template <typename T>
- const T&
- range<T>::lower() const
- {
- return lower_;
- }
-
- template <typename T>
- const T&
- range<T>::upper() const
- {
- return upper_;
- }
-
- template <typename T>
- const T&
- range<T>::first() const
- {
- return lower_;
- }
-
- template <typename T>
- const T&
- range<T>::last() const
- {
- return upper_;
- }
-
- template <typename T>
- range<T>::operator T() const
- {
- if (! is_degenerated())
- std::abort();
- return upper_;
- }
-
-
-// comparison
-
- template <typename T>
- bool
- operator==(const range<T>& lhs, const range<T>& rhs)
- {
- return lhs.lower() == rhs.lower() && lhs.upper() == rhs.upper();
- }
-
- template <typename T>
- bool
- operator!=(const range<T>& lhs, const range<T>& rhs)
- {
- return ! (lhs == rhs);
- }
-
-
-// deactivation of ordering related operators
-
- template <typename T>
- void operator<(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator<=(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>=(const range<T>&, const range<T>&);
-
-
-
-// set ops
-
- template <typename T>
- bool
- are_adjacent(const range<T>& r1, const range<T>& r2)
- {
- return span(r1, r2).length() == r1.length() + r2.length()
- + (value::succ(r2.lower()) - r2.lower());
- }
-
- template <typename T>
- bool
- do_intersect(const range<T>& r1, const range<T>& r2)
- {
- return span(r1, r2).length() <= r1.length() + r2.length();
- }
-
- template <typename T>
- range<T>
- inter(const range<T>& r1, const range<T>& r2)
- {
- if (! do_intersect(r1, r2))
- std::abort();
- return range<T>(std::max(r1.lower(), r2.lower()),
- std::min(r1.upper(), r2.upper()));
- }
-
-
-
-// min / max
-
- template <typename T>
- range<T>
- min(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::min(r1.lower(), r2.lower()),
- std::min(r1.upper(), r2.upper()));
- }
-
- template <typename T>
- range<T>
- max(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::max(r1.lower(), r2.lower()),
- std::max(r1.upper(), r2.upper()));
- }
-
-
-// mean
-
- template <typename T>
- range<T>
- mean(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(mean(r1.lower(), r2.lower()),
- mean(r1.upper(), r2.upper()));
- }
-
-
-// span
-
- template <typename T>
- range<T>
- span(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::min(r1.lower(), r2.lower()),
- std::max(r1.upper(), r2.upper()));
- }
-
-
-
-// op<<
-
- template <typename T>
- std::ostream&
- operator<<(std::ostream& ostr, const range<T>& i)
- {
- if (i.is_degenerated())
- return ostr << i.lower();
- else
- return ostr << '[' << i.lower() << ',' << i.upper() << ']';
- }
-
-
- } // end of namespace mln::value
-
-} // end of namespace mln
-
-
-namespace std
-{
-
- template <typename T>
- bool less< mln::value::range<T> >::operator()(const mln::value::range<T>& l,
- const mln::value::range<T>& r) const
- {
- if (! l.is_degenerated() || ! r.is_degenerated())
- std::abort();
- return l.lower() < r.lower();
- }
-
-} // std
-
-
-# endif // ! MLN_INCLUDE_ONLY
-
-#endif // ndef MLN_VALUE_RANGE_HH
diff --git a/milena/tests/value/Makefile.am b/milena/tests/value/Makefile.am
index 8d6718f..537eb76 100644
--- a/milena/tests/value/Makefile.am
+++ b/milena/tests/value/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, 2008, 2009 EPITA Research and Development
+# Copyright (C) 2007, 2008, 2009, 2012 EPITA Research and Development
# Laboratory (LRDE).
#
# This file is part of Olena.
@@ -31,7 +31,7 @@ check_PROGRAMS = \
interop \
label \
proxy \
- range \
+ interval \
rgb8 \
scalar \
set \
@@ -56,7 +56,7 @@ int_u8_SOURCES = int_u8.cc
interop_SOURCES = interop.cc
label_SOURCES = label.cc
proxy_SOURCES = proxy.cc
-range_SOURCES = range.cc
+interval_SOURCES = interval.cc
rgb8_SOURCES = rgb8.cc
scalar_SOURCES = scalar.cc
set_SOURCES = set.cc
diff --git a/milena/tests/value/range.cc b/milena/tests/value/interval.cc
similarity index 60%
rename from milena/tests/value/range.cc
rename to milena/tests/value/interval.cc
index 22421ed..86b9a55 100644
--- a/milena/tests/value/range.cc
+++ b/milena/tests/value/interval.cc
@@ -29,16 +29,19 @@
#include <vector>
#include <algorithm>
-#include <mln/value/unsignedh.hh>
-#include <mln/value/range.hh>
+#include <mln/value/intsub.hh>
+#include <mln/value/interval.hh>
+#include <mln/value/inc.hh>
-static const char *ref[] = { "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5" };
+# include <mln/math/min.hh>
+# include <mln/math/max.hh>
int main()
{
using namespace mln::value;
+ using namespace mln;
- typedef range<unsignedh> R;
+ typedef interval<intsub<2> > R;
{
R r(0, 0);
@@ -63,9 +66,39 @@ int main()
assert(r.length() == 4);
assert(r.nelements() == 9);
- int ref_i = 0;
- for (unsignedh v = r.first(); v != r.last(); v.goto_succ())
- mln_assertion(static_cast<std::string>(v) == ref[ref_i++]);
+ int ref_i = 2;
+ for (intsub<2> v = r.first(); v <= r.last(); inc(v))
+ mln_assertion(v.to_enc() == ref_i++);
+ }
+
+ {
+ // are_adjacent / span / do_intersect
+ R r1(3, 4);
+ R r2(4.5, 6);
+ mln_assertion(r1 != r2);
+ mln_assertion(are_adjacent(r1, r2));
+ mln_assertion(span(r1, r2) == R(3,6));
+ mln_assertion(!do_intersect(r1, r2));
+
+ // Interset / Inter
+ R r3(1, 3.5);
+ mln_assertion(do_intersect(r1, r3));
+ mln_assertion(inter(r1, r3) == R(3, 3.5));
+
+ // Min / Max
+ mln_assertion(math::min(r1, r3) == R(1, 3.5));
+ mln_assertion(math::max(r1, r3) == R(3, 4));
+ }
+
+ // Access from/to indexes.
+ {
+ R r1(7.5, 11.5);
+ mln_assertion(r1.index_of(7.5) == 0);
+ mln_assertion(r1.index_of(9.5) == 4);
+ mln_assertion(r1.index_of(11.5) == 8);
+ mln_assertion(r1.ith_element(0) == 7.5);
+ mln_assertion(r1.ith_element(4) == 9.5);
+ mln_assertion(r1.ith_element(8) == 11.5);
}
}
--
1.7.2.5
1
0

olena-2.0-38-g378bb80 Replace range class with interval and improve it.
by Guillaume Lazzara 04 Oct '12
by Guillaume Lazzara 04 Oct '12
04 Oct '12
* mln/value/range.hh,
* tests/value/range.cc: Rename as...
* mln/value/interval.hh,
* tests/value/interval.cc: ... this and improve it.
* tests/value/Makefile.am: Update target name.
---
milena/ChangeLog | 11 +
milena/mln/value/interval.hh | 371 ++++++++++++++++++++---
milena/mln/value/range.hh | 425 --------------------------
milena/tests/value/Makefile.am | 6 +-
milena/tests/value/{range.cc => interval.cc} | 47 +++-
5 files changed, 386 insertions(+), 474 deletions(-)
delete mode 100644 milena/mln/value/range.hh
rename milena/tests/value/{range.cc => interval.cc} (60%)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index c9a02a4..5db80bd 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,16 @@
2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Replace range class with interval and improve it.
+
+ * mln/value/range.hh,
+ * tests/value/range.cc: Rename as...
+ * mln/value/interval.hh,
+ * tests/value/interval.cc: ... this and improve it.
+
+ * tests/value/Makefile.am: Update target name.
+
+2012-10-04 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Improve value::intsub class.
* mln/value/intsub.hh: Improve class.
diff --git a/milena/mln/value/interval.hh b/milena/mln/value/interval.hh
index 92ccfad..a4cdf8c 100644
--- a/milena/mln/value/interval.hh
+++ b/milena/mln/value/interval.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2012 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -26,15 +26,14 @@
#ifndef MLN_VALUE_INTERVAL_HH
# define MLN_VALUE_INTERVAL_HH
-/*! \file
- *
- * \brief Define an interval between two values.
- *
- * \todo Likewise, code value::not_equal(t), less_than, etc.
- */
-
-# include <mln/core/concept/object.hh>
+/// \file
+///
+/// Define an interval.
+# include <cstdlib>
+# include <iostream>
+# include <mln/value/inc.hh>
+# include <mln/value/concept/interval.hh>
namespace mln
{
@@ -42,61 +41,355 @@ namespace mln
namespace value
{
- /// FIXME: Doc!
-
+ /// \brief Interval of values.
template <typename T>
- struct interval_ : public Object< interval_<T> >
+ class interval : public value::Interval<interval<T> >
{
- interval_(const T& from, const T& to);
- T from, to;
+ public:
+ typedef T enc;
+ typedef T equiv;
+
+ interval();
+ interval(T first, T last);
+
+ interval& operator=(const interval& rhs);
+
+ /// Return True if a value is within this interval.
+ bool has(const T& v) const;
+
+ /// Return the distance between the first and the last value.
+ T length() const;
+
+ /// Return the ith value in this interval.
+ T ith_element(unsigned i) const;
+
+ /// Return the index of value \p v in this interval.
+ unsigned index_of(const T& v) const;
+
+ /// Return the number of values in this interval.
+ unsigned nelements() const;
+
+ /// Return True if this interval contains only one value.
+ bool is_degenerated() const;
- template <typename U>
- operator interval_<U>() const;
+ /// The first value included in this interval.
+ const T& first() const;
+ /// The last value included in this interval.
+ const T& last() const;
+
+ private:
+ T first_;
+ T last_;
+ unsigned nelements_;
};
-
+
+ // comparison
+
+ template <typename T>
+ bool
+ operator==(const interval<T>& lhs, const interval<T>& rhs);
+
+ template <typename T>
+ bool
+ operator!=(const interval<T>& lhs, const interval<T>& rhs);
+
+ // deactivation of ordering related operators
+
+ template <typename T>
+ void operator<(const interval<T>&, const interval<T>&);
template <typename T>
- interval_<T>
- interval(const T& from, const T& to);
+ void operator<=(const interval<T>&, const interval<T>&);
+
+ template <typename T>
+ void operator>(const interval<T>&, const interval<T>&);
+
+ template <typename T>
+ void operator>=(const interval<T>&, const interval<T>&);
+
+ // set ops
+
+ /*! \p r1 and \p r2 intersection is empty and the number of
+ elements in the span is equal to the sum of the number of
+ elements in \p r1 and \p r2.
+
+ \verbatim
+ span(r1,r2)
+ <-------------------->
+ r1 r2
+ [x--x--x] [x--x--x--x]
+ <------->-<---------->
+ ^ ^ ^
+ | | |
+ | iota |
+ | |
+ length(r1) length(r2)
+ \endverbatim
+
+ */
+ template <typename T>
+ bool
+ are_adjacent(const interval<T>& r1, const interval<T>& r2);
+
+ /* \brief Return true if \p r1 and \p r2 intersect.
+ */
+ template <typename T>
+ bool
+ do_intersect(const interval<T>& r1, const interval<T>& r2);
+
+ /* \brief Perform the intersection of \p r1 and \p r2.
+ */
+ template <typename T>
+ interval<T>
+ inter(const interval<T>& r1, const interval<T>& r2);
+
+ // min / max
+
+ /*! \brief Re-implementation of the min function.
+ \sa math::min
+ */
+ template <typename T>
+ interval<T>
+ min_(const interval<T>& r1, const interval<T>& r2);
+
+ /*! \brief Re-implementation of the max function.
+ \sa math::max
+ */
+ template <typename T>
+ interval<T>
+ max_(const interval<T>& r1, const interval<T>& r2);
+
+ /// \brief Compute the span of \p r1 and \p r2.
+ template <typename T>
+ interval<T>
+ span(const interval<T>& r1, const interval<T>& r2);
+
+ // op<<
+
+ template <typename T>
+ std::ostream&
+ operator<<(std::ostream& ostr, const interval<T>& i);
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+// for sorting purpose
+
+namespace std
+{
+
+ template <typename T>
+ struct less< mln::value::interval<T> >
+ {
+ bool operator()(const mln::value::interval<T>& l,
+ const mln::value::interval<T>& r) const;
+ };
+
+} // std
+
# ifndef MLN_INCLUDE_ONLY
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
template <typename T>
- inline
- interval_<T>::interval_(const T& from, const T& to)
- : from(from),
- to(to)
+ interval<T>::interval()
{
- mln_precondition(from <= to);
}
template <typename T>
- template <typename U>
- inline
- interval_<T>::operator interval_<U>() const
+ interval<T>::interval(T first, T last)
{
- mln_invariant(from <= to);
- interval_<U> tmp(from, to);
- mln_postcondition(tmp.from <= tmp.to);
- return tmp;
+ mln_precondition(last >= first);
+ first_ = first;
+ last_ = last;
+
+ nelements_ = 0;
+ for (T v = first_; v <= last_; value::inc(v))
+ ++nelements_;
}
template <typename T>
- inline
- interval_<T>
- interval(const T& from, const T& to)
+ interval<T>&
+ interval<T>::operator=(const interval& rhs)
{
- mln_precondition(from <= to);
- interval_<T> tmp(from, to);
- return tmp;
+ first_ = rhs.first_;
+ last_ = rhs.last_;
+ return *this;
+ }
+
+ template <typename T>
+ bool
+ interval<T>::has(const T& v) const
+ {
+ return first_ <= v && v <= last_;
+ }
+
+ template <typename T>
+ T
+ interval<T>::length() const
+ {
+ return last_ - first_;
+ }
+
+ template <typename T>
+ T
+ interval<T>::ith_element(unsigned i) const
+ {
+ return first_ + i * iota<T>::value();
+ }
+
+ template <typename T>
+ unsigned
+ interval<T>::index_of(const T& v) const
+ {
+ return (v - first_) / iota<T>::value();
+ }
+
+ template <typename T>
+ unsigned
+ interval<T>::nelements() const
+ {
+ return nelements_;
+ }
+
+ template <typename T>
+ bool
+ interval<T>::is_degenerated() const
+ {
+ return last_ == first_;
+ }
+
+ template <typename T>
+ const T&
+ interval<T>::first() const
+ {
+ return first_;
+ }
+
+ template <typename T>
+ const T&
+ interval<T>::last() const
+ {
+ return last_;
+ }
+
+
+ // comparison
+
+ template <typename T>
+ bool
+ operator==(const interval<T>& lhs, const interval<T>& rhs)
+ {
+ return lhs.first() == rhs.first() && lhs.last() == rhs.last();
+ }
+
+ template <typename T>
+ bool
+ operator!=(const interval<T>& lhs, const interval<T>& rhs)
+ {
+ return ! (lhs == rhs);
+ }
+
+
+ // set ops
+
+ template <typename T>
+ bool
+ are_adjacent(const interval<T>& r1, const interval<T>& r2)
+ {
+ return span(r1, r2).length() == r1.length() + r2.length()
+ + value::iota<T>::value();
+ }
+
+ template <typename T>
+ bool
+ do_intersect(const interval<T>& r1, const interval<T>& r2)
+ {
+ return span(r1, r2).length() <= r1.length() + r2.length();
+ }
+
+ template <typename T>
+ interval<T>
+ inter(const interval<T>& r1, const interval<T>& r2)
+ {
+ mln_precondition(do_intersect(r1, r2));
+ return interval<T>(std::max(r1.first(), r2.first()),
+ std::min(r1.last(), r2.last()));
+ }
+
+
+ template <typename T>
+ interval<T>
+ min_(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::min(r1.first(), r2.first()),
+ std::min(r1.last(), r2.last()));
+ }
+
+ template <typename T>
+ interval<T>
+ max_(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::max(r1.first(), r2.first()),
+ std::max(r1.last(), r2.last()));
+ }
+
+
+ // span
+
+ template <typename T>
+ interval<T>
+ span(const interval<T>& r1, const interval<T>& r2)
+ {
+ return interval<T>(std::min(r1.first(), r2.first()),
+ std::max(r1.last(), r2.last()));
+ }
+
+
+
+ // op<<
+
+ template <typename T>
+ std::ostream&
+ operator<<(std::ostream& ostr, const interval<T>& i)
+ {
+ if (i.is_degenerated())
+ return ostr << '{' << i.first() << '}';
+ else
+ return ostr << '[' << i.first() << ',' << i.last() << ']';
}
-# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::value
} // end of namespace mln
-#endif // ! MLN_VALUE_INTERVAL_HH
+namespace std
+{
+
+ template <typename T>
+ bool less< mln::value::interval<T> >::operator()(
+ const mln::value::interval<T>& l,
+ const mln::value::interval<T>& r) const
+ {
+ mln_precondition(l.is_degenerated() && r.is_degenerated());
+ return l.first() < r.first();
+ }
+
+} // std
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+#endif // ndef MLN_VALUE_INTERVAL_HH
diff --git a/milena/mln/value/range.hh b/milena/mln/value/range.hh
deleted file mode 100644
index 5c90de7..0000000
--- a/milena/mln/value/range.hh
+++ /dev/null
@@ -1,425 +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_VALUE_RANGE_HH
-# define MLN_VALUE_RANGE_HH
-
-/// \file
-///
-/// Define a range value.
-
-# include <cstdlib>
-# include <iostream>
-# include <mln/value/next.hh>
-
-namespace mln
-{
-
- namespace value
- {
-
- template <typename T>
- class range
- {
- public:
- range();
-
- template <typename T_>
- range(T_ value);
-
- range(T lower, T upper);
-
- range& operator=(const range& rhs);
-
- template <typename T_>
- range& operator=(T_ value);
-
- bool has(const T& v) const;
-
- T length() const;
-
- unsigned nelements() const;
-
- bool is_degenerated() const;
-
- const T& lower() const;
- const T& upper() const;
-
- const T& first() const;
- const T& last() const;
-
- operator T() const;
-
- private:
- T lower_;
- T upper_;
- };
-
-// comparison
-
- template <typename T>
- bool
- operator==(const range<T>& lhs, const range<T>& rhs);
-
- template <typename T>
- bool
- operator!=(const range<T>& lhs, const range<T>& rhs);
-
-// deactivation of ordering related operators
-
- template <typename T>
- void operator<(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator<=(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>=(const range<T>&, const range<T>&);
-
-// set ops
-
- template <typename T>
- bool
- are_adjacent(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- bool
- do_intersect(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- range<T>
- inter(const range<T>& r1, const range<T>& r2);
-
-// min / max
-
- template <typename T>
- range<T>
- min(const range<T>& r1, const range<T>& r2);
-
- template <typename T>
- range<T>
- max(const range<T>& r1, const range<T>& r2);
-
-// mean
-
- template <typename T>
- range<T>
- mean(const range<T>& r1, const range<T>& r2);
-
-// span
-
- template <typename T>
- range<T>
- span(const range<T>& r1, const range<T>& r2);
-
-// op<<
-
- template <typename T>
- std::ostream&
- operator<<(std::ostream& ostr, const range<T>& i);
-
- } // end of namespace mln::value
-
-} // end of namespace mln
-
-
-// for sorting purpose
-
-namespace std
-{
-
- template <typename T>
- struct less< mln::value::range<T> >
- {
- bool operator()(const mln::value::range<T>& l,
- const mln::value::range<T>& r) const;
- };
-
-} // std
-
-
-
-# ifndef MLN_INCLUDE_ONLY
-
-
-namespace mln
-{
-
- namespace value
- {
-
-
- template <typename T>
- range<T>::range()
- {
- }
-
- template <typename T>
- template <typename T_>
- range<T>::range(T_ value)
- {
- lower_ = upper_ = value;
- }
-
- template <typename T>
- range<T>::range(T lower, T upper)
- {
- if (upper < lower)
- std::abort();
- lower_ = lower;
- upper_ = upper;
- }
-
- template <typename T>
- range<T>&
- range<T>::operator=(const range& rhs)
- {
- lower_ = rhs.lower_;
- upper_ = rhs.upper_;
- return *this;
- }
-
- template <typename T>
- template <typename T_>
- range<T>&
- range<T>::operator=(T_ value)
- {
- lower_ = upper_ = value;
- return *this;
- }
-
- template <typename T>
- bool
- range<T>::has(const T& v) const
- {
- return lower_ <= v && v <= upper_;
- }
-
- template <typename T>
- T
- range<T>::length() const
- {
- return upper_ - lower_;
- }
-
- template <typename T>
- unsigned
- range<T>::nelements() const
- {
- unsigned n = 1;
- T v = lower_;
- for (; v != upper_; v = value::succ(v))
- n += 1;
-
- return n;
- }
-
- template <typename T>
- bool
- range<T>::is_degenerated() const
- {
- return upper_ == lower_;
- }
-
- template <typename T>
- const T&
- range<T>::lower() const
- {
- return lower_;
- }
-
- template <typename T>
- const T&
- range<T>::upper() const
- {
- return upper_;
- }
-
- template <typename T>
- const T&
- range<T>::first() const
- {
- return lower_;
- }
-
- template <typename T>
- const T&
- range<T>::last() const
- {
- return upper_;
- }
-
- template <typename T>
- range<T>::operator T() const
- {
- if (! is_degenerated())
- std::abort();
- return upper_;
- }
-
-
-// comparison
-
- template <typename T>
- bool
- operator==(const range<T>& lhs, const range<T>& rhs)
- {
- return lhs.lower() == rhs.lower() && lhs.upper() == rhs.upper();
- }
-
- template <typename T>
- bool
- operator!=(const range<T>& lhs, const range<T>& rhs)
- {
- return ! (lhs == rhs);
- }
-
-
-// deactivation of ordering related operators
-
- template <typename T>
- void operator<(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator<=(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>(const range<T>&, const range<T>&);
-
- template <typename T>
- void operator>=(const range<T>&, const range<T>&);
-
-
-
-// set ops
-
- template <typename T>
- bool
- are_adjacent(const range<T>& r1, const range<T>& r2)
- {
- return span(r1, r2).length() == r1.length() + r2.length()
- + (value::succ(r2.lower()) - r2.lower());
- }
-
- template <typename T>
- bool
- do_intersect(const range<T>& r1, const range<T>& r2)
- {
- return span(r1, r2).length() <= r1.length() + r2.length();
- }
-
- template <typename T>
- range<T>
- inter(const range<T>& r1, const range<T>& r2)
- {
- if (! do_intersect(r1, r2))
- std::abort();
- return range<T>(std::max(r1.lower(), r2.lower()),
- std::min(r1.upper(), r2.upper()));
- }
-
-
-
-// min / max
-
- template <typename T>
- range<T>
- min(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::min(r1.lower(), r2.lower()),
- std::min(r1.upper(), r2.upper()));
- }
-
- template <typename T>
- range<T>
- max(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::max(r1.lower(), r2.lower()),
- std::max(r1.upper(), r2.upper()));
- }
-
-
-// mean
-
- template <typename T>
- range<T>
- mean(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(mean(r1.lower(), r2.lower()),
- mean(r1.upper(), r2.upper()));
- }
-
-
-// span
-
- template <typename T>
- range<T>
- span(const range<T>& r1, const range<T>& r2)
- {
- return range<T>(std::min(r1.lower(), r2.lower()),
- std::max(r1.upper(), r2.upper()));
- }
-
-
-
-// op<<
-
- template <typename T>
- std::ostream&
- operator<<(std::ostream& ostr, const range<T>& i)
- {
- if (i.is_degenerated())
- return ostr << i.lower();
- else
- return ostr << '[' << i.lower() << ',' << i.upper() << ']';
- }
-
-
- } // end of namespace mln::value
-
-} // end of namespace mln
-
-
-namespace std
-{
-
- template <typename T>
- bool less< mln::value::range<T> >::operator()(const mln::value::range<T>& l,
- const mln::value::range<T>& r) const
- {
- if (! l.is_degenerated() || ! r.is_degenerated())
- std::abort();
- return l.lower() < r.lower();
- }
-
-} // std
-
-
-# endif // ! MLN_INCLUDE_ONLY
-
-#endif // ndef MLN_VALUE_RANGE_HH
diff --git a/milena/tests/value/Makefile.am b/milena/tests/value/Makefile.am
index 8d6718f..537eb76 100644
--- a/milena/tests/value/Makefile.am
+++ b/milena/tests/value/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, 2008, 2009 EPITA Research and Development
+# Copyright (C) 2007, 2008, 2009, 2012 EPITA Research and Development
# Laboratory (LRDE).
#
# This file is part of Olena.
@@ -31,7 +31,7 @@ check_PROGRAMS = \
interop \
label \
proxy \
- range \
+ interval \
rgb8 \
scalar \
set \
@@ -56,7 +56,7 @@ int_u8_SOURCES = int_u8.cc
interop_SOURCES = interop.cc
label_SOURCES = label.cc
proxy_SOURCES = proxy.cc
-range_SOURCES = range.cc
+interval_SOURCES = interval.cc
rgb8_SOURCES = rgb8.cc
scalar_SOURCES = scalar.cc
set_SOURCES = set.cc
diff --git a/milena/tests/value/range.cc b/milena/tests/value/interval.cc
similarity index 60%
rename from milena/tests/value/range.cc
rename to milena/tests/value/interval.cc
index 22421ed..86b9a55 100644
--- a/milena/tests/value/range.cc
+++ b/milena/tests/value/interval.cc
@@ -29,16 +29,19 @@
#include <vector>
#include <algorithm>
-#include <mln/value/unsignedh.hh>
-#include <mln/value/range.hh>
+#include <mln/value/intsub.hh>
+#include <mln/value/interval.hh>
+#include <mln/value/inc.hh>
-static const char *ref[] = { "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5" };
+# include <mln/math/min.hh>
+# include <mln/math/max.hh>
int main()
{
using namespace mln::value;
+ using namespace mln;
- typedef range<unsignedh> R;
+ typedef interval<intsub<2> > R;
{
R r(0, 0);
@@ -63,9 +66,39 @@ int main()
assert(r.length() == 4);
assert(r.nelements() == 9);
- int ref_i = 0;
- for (unsignedh v = r.first(); v != r.last(); v.goto_succ())
- mln_assertion(static_cast<std::string>(v) == ref[ref_i++]);
+ int ref_i = 2;
+ for (intsub<2> v = r.first(); v <= r.last(); inc(v))
+ mln_assertion(v.to_enc() == ref_i++);
+ }
+
+ {
+ // are_adjacent / span / do_intersect
+ R r1(3, 4);
+ R r2(4.5, 6);
+ mln_assertion(r1 != r2);
+ mln_assertion(are_adjacent(r1, r2));
+ mln_assertion(span(r1, r2) == R(3,6));
+ mln_assertion(!do_intersect(r1, r2));
+
+ // Interset / Inter
+ R r3(1, 3.5);
+ mln_assertion(do_intersect(r1, r3));
+ mln_assertion(inter(r1, r3) == R(3, 3.5));
+
+ // Min / Max
+ mln_assertion(math::min(r1, r3) == R(1, 3.5));
+ mln_assertion(math::max(r1, r3) == R(3, 4));
+ }
+
+ // Access from/to indexes.
+ {
+ R r1(7.5, 11.5);
+ mln_assertion(r1.index_of(7.5) == 0);
+ mln_assertion(r1.index_of(9.5) == 4);
+ mln_assertion(r1.index_of(11.5) == 8);
+ mln_assertion(r1.ith_element(0) == 7.5);
+ mln_assertion(r1.ith_element(4) == 9.5);
+ mln_assertion(r1.ith_element(8) == 11.5);
}
}
--
1.7.2.5
1
0