Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- 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
December 2008
- 12 participants
- 201 discussions
* sandbox/scribo/demat.hh: use depth first search canvas.
* sandbox/scribo/photo.cc,
* sandbox/scribo/table.cc: Use a dedicated routine.
---
milena/sandbox/ChangeLog | 9 ++
milena/sandbox/scribo/demat.hh | 296 ++++++++++++++++++----------------------
milena/sandbox/scribo/photo.cc | 2 +-
milena/sandbox/scribo/table.cc | 2 +-
4 files changed, 143 insertions(+), 166 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index cc1d17d..020324f 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,3 +1,12 @@
+2008-12-10 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ [Scribo] Make use of depth first search canvas.
+
+ * sandbox/scribo/demat.hh: use depth first search canvas.
+
+ * sandbox/scribo/photo.cc,
+ * sandbox/scribo/table.cc: Use a dedicated routine.
+
2008-12-10 Matthieu Garrigues <garrigues(a)lrde.epita.fr>
[Markov] Speed up the algorithm.
diff --git a/milena/sandbox/scribo/demat.hh b/milena/sandbox/scribo/demat.hh
index ff059d2..609e4c8 100644
--- a/milena/sandbox/scribo/demat.hh
+++ b/milena/sandbox/scribo/demat.hh
@@ -51,7 +51,9 @@
# include <mln/util/graph.hh>
# include <mln/util/line_graph.hh>
-#include <tesseract/baseapi.h>
+# include <mln/canvas/browsing/depth_first_search.hh>
+
+# include <tesseract/baseapi.h>
namespace scribo
{
@@ -206,7 +208,7 @@ namespace scribo
{
image2d<bool> b(tboxes[i], 0);
level::fill(b, false);
- level::fill(b, in | (tboxes[i] | (pw::value(lbl) == pw::cst(i))));
+ level::fill((b | (pw::value(lbl) == pw::cst(i))).rw(), true);
char* s = TessBaseAPI::TesseractRect(
(unsigned char*) b.buffer(),
@@ -526,39 +528,6 @@ namespace scribo
//-***************************************
/// \{
- fun::l2l::relabel<label_16>
- make_relabel_fun(const util::graph& g)
- {
- fun::l2l::relabel<label_16> fun(g.v_nmax(), mln_max(label_16));
-
- // The first vertex (id 0) IS the background (component 0).
- unsigned ncomp = 0;
- mln_vertex_iter_(util::graph) v(g);
- for_all(v)
- if (fun(v.id()) == mln_max(label_16))
- {
- std::queue<unsigned> queue;
- queue.push(v.id());
- fun(v.id()) = ncomp;
- while (!queue.empty())
- {
- util::vertex<util::graph> current_v = g.vertex(queue.front());
- queue.pop();
- for (unsigned nv = 0; nv < current_v.nmax_nbh_vertices(); ++nv)
- if (fun(current_v.ith_nbh_vertex(nv)) == mln_max(label_16))
- {
- fun(current_v.ith_nbh_vertex(nv)) = ncomp;
- queue.push(current_v.ith_nbh_vertex(nv));
- }
- }
- ++ncomp;
- }
-
- return fun;
- }
-
-
-
template <typename R>
struct remove_small_comps
: Function_l2b< remove_small_comps<R> >
@@ -630,22 +599,88 @@ namespace scribo
}
}
+ struct make_relabel_fun_t
+ {
+ template <typename G>
+ void init(const Graph<G>& g)
+ {
+ l2l.resize(exact(g).v_nmax(), mln_max(label_16));
+ ncomp = 0;
+ }
+
+ void final()
+ {}
+
+ void next()
+ { ++ncomp; }
+
+ void update_treated(unsigned id)
+ { l2l(id) = ncomp; }
+
+ void update_queued(unsigned id)
+ { update_treated(id); }
+
+ bool to_be_treated(unsigned id)
+ { return l2l(id) == mln_max(label_16); }
+
+ bool to_be_queued(unsigned id)
+ { return to_be_treated(id); }
+
+ unsigned ncomp;
+ fun::l2l::relabel<label_16> l2l;
+ };
+
+ struct comp_size_t
+ {
+ template <typename G>
+ void init(const Graph<G>& g)
+ {
+ treated.resize(exact(g).v_nmax(), mln_max(label_16));
+ }
+
+ void final()
+ {}
+
+ void next()
+ {
+ unsigned compsize = comp_vertices.nelements();
+ for (unsigned i = 0; i < comp_vertices.nelements(); ++i)
+ treated[comp_vertices[i]] = compsize;
+ comp_vertices.clear();
+ }
+ void update_treated(unsigned id)
+ { comp_vertices.insert(id); }
+
+ void update_queued(unsigned id)
+ { update_treated(id); }
+
+ bool to_be_treated(unsigned id)
+ { return treated[id] == mln_max(label_16); }
+
+ bool to_be_queued(unsigned id)
+ { return comp_vertices.has(id); }
+
+ util::set<unsigned> comp_vertices;
+ util::array<unsigned> treated;
+ };
/// Merge bboxes according to their left box neighbor.
- util::array< box2d >
+ util::array<box2d>
group_bboxes(const util::graph& g, image2d<label_16>& lbl,
util::array<box2d>& cboxes, label_16& nlabels)
{
- fun::l2l::relabel<label_16> relabel_fun = make_relabel_fun(g);
+ // Build relabel function.
+ make_relabel_fun_t f;
+ canvas::browsing::depth_first_search(g, f);
util::array< accu::bbox<point2d> > tboxes;
tboxes.resize(nlabels.next());
for_all_ncomponents(i, nlabels)
- tboxes[relabel_fun(i)].take(cboxes[i]);
+ tboxes[f.l2l(i)].take(cboxes[i]);
//Update labels
- labeling::relabel_inplace(lbl, nlabels, relabel_fun);
+ labeling::relabel_inplace(lbl, nlabels, f.l2l);
#ifndef NOUT
save_lbl_image(lbl, nlabels, "lbl-grouped-boxes.pgm");
@@ -656,39 +691,18 @@ namespace scribo
if (tboxes[i].is_valid())
result.append(tboxes[i].to_result());
+ mln_assertion(result.nelements() == f.ncomp);
nlabels = result.nelements();
+
#ifndef NOUT
image2d<label_16> lbl2 = clone(lbl);
- util::array<unsigned> treated(g.v_nmax(), mln_max(unsigned));
- util::set<unsigned> comp_vertices;
- mln_vertex_iter_(util::graph) v(g);
- for_all(v)
- if (treated[v.id()] == mln_max(unsigned))
- {
- std::queue<unsigned> queue;
- queue.push(v.id());
- comp_vertices.insert(v.id());
- while (!queue.empty())
- {
- util::vertex<util::graph> current_v = g.vertex(queue.front());
- queue.pop();
- for (unsigned nv = 0; nv < current_v.nmax_nbh_vertices(); ++nv)
- if (!comp_vertices.has(current_v.ith_nbh_vertex(nv)))
- {
- comp_vertices.insert(current_v.ith_nbh_vertex(nv));
- queue.push(current_v.ith_nbh_vertex(nv));
- }
- }
- unsigned compsize = comp_vertices.nelements();
- for (unsigned i = 0; i < comp_vertices.nelements(); ++i)
- treated[comp_vertices[i]] = compsize;
- comp_vertices.clear();
- }
+ comp_size_t comp_size;
+ canvas::browsing::depth_first_search(g, comp_size);
for_all_ncomponents(i, nlabels)
if (tboxes[i].is_valid())
- if (treated[i] < 3)
+ if (comp_size.treated[i] < 3)
level::fill((lbl2 | (tboxes[i].to_result() | (pw::value(lbl2) == pw::cst(i)))).rw(), 0u);
save_lbl_image(lbl2, nlabels, "lbl-grouped-boxes-cleaned.ppm");
#endif
@@ -769,72 +783,8 @@ namespace scribo
return tboxes;
}
-
-
- struct gcolor_t : public mln::Function< gcolor_t >
- {
- typedef mln::value::rgb8 result;
-
- template <typename G>
- mln::value::rgb8
- operator()(const mln::util::vertex<G>&) const
- {
- return mln::literal::cyan;
- }
-
- template <typename G>
- mln::value::rgb8
- operator()(const mln::util::edge<G>&) const
- {
- return mln::literal::magenta;
- }
-
- };
-
- struct gcolorarr_t : public mln::Function< gcolorarr_t >
- {
- typedef mln::value::rgb8 result;
-
- gcolorarr_t(unsigned n, const mln::value::rgb8& val)
- : v_(n, val)
- {
- }
-
- template <typename G>
- const mln::value::rgb8&
- operator()(const mln::util::vertex<G>& v) const
- {
- return v_[v.id()];
- }
-
- template <typename G>
- const mln::value::rgb8&
- operator()(const mln::util::edge<G>& e) const
- {
- return v_[e.id()];
- }
-
- template <typename G>
- mln::value::rgb8&
- operator()(const mln::util::vertex<G>& v)
- {
- return v_[v.id()];
- }
-
- template <typename G>
- mln::value::rgb8&
- operator()(const mln::util::edge<G>& e)
- {
- return v_[e.id()];
- }
-
- std::vector<mln::value::rgb8> v_;
- };
-
-
-
template <typename P>
- struct lg_vertex_values : public mln::Function_p2v< lg_vertex_values<P> >
+ struct lg_vertex_values : public mln::Function_p2v< lg_vertex_values<P> >
{
typedef float result;
@@ -895,7 +845,7 @@ namespace scribo
typedef fun::i2v::array<point2d> fv2p_t;
fv2p_t fv2p(nlabels.next());
- for_all_elements(i, tboxes)
+ for_all_components(i, tboxes)
fv2p(i) = tboxes[i].center();
// util::array<point2d> centers = labeling::compute(accu::center<point2d>(), iz, nlabels);
// fv2p_t fv2p = convert::to<fv2p_t>(centers);
@@ -924,16 +874,16 @@ namespace scribo
mln_VAR(lg_ima, lgv2v | pvlg);
- gcolorarr_t ecolor(pvlg.nsites(), literal::olive);
+ fun::i2v::array<value::rgb8> ecolor(pvlg.nsites(), literal::olive);
mln_piter_(lg_ima_t) p(lg_ima.domain());
for_all (p)
if ((lg_ima(p) > settings.max_cos) || (lg_ima(p) < - settings.max_cos))
- ecolor(p.element()) = literal::cyan;
+ ecolor(p) = literal::cyan;
#ifndef NOUT
image2d<rgb8> output = level::convert(rgb8(), in);
internal::draw_component_boxes(output, tboxes);
- debug::draw_graph(output, pvlg, gcolor_t(), ecolor);
+ debug::draw_graph(output, pvlg, pw::cst(literal::cyan), ecolor);
io::ppm::save(output, internal::output_file("aligned-bboxes-merged.ppm"));
#endif
@@ -955,19 +905,13 @@ namespace scribo
// Facade
- void demat(char *argv[], bool treat_tables)
+ void demat_table(char *argv[])
{
using namespace mln;
using value::rgb8;
using value::label_16;
-
- //Useful debug variables
- border::thickness = 3;
- trace::quiet = true;
-
-
- internal::settings.treat_tables = treat_tables;
+ internal::settings.treat_tables = true;
internal::input_file = basename(argv[1]);
//Load image
@@ -981,40 +925,64 @@ namespace scribo
internal::settings.max_comp_size = in.ncols() * in.nrows() * 0.05;
- //Label and remove small components.
+ std::pair<util::array<box2d>,
+ util::array<box2d> > tblboxes = internal::extract_tables(in);
+ image2d<bool> table = internal::rebuild_table(in, tblboxes);
+
+ /// relabel since the table has been removed.
label_16 nlabels;
image2d<label_16> lbl = labeling::blobs(in, c8(), nlabels);
+ internal::cleanup_components(lbl, nlabels);
- /// Do we really want to cleanup before removing tables?
- if (!treat_tables)
- internal::cleanup_components(lbl, nlabels);
+#ifndef NOUT
+ internal::save_lbl_image(lbl, nlabels, "lbl-small-comps-removed.pgm");
+#endif
- std::pair<util::array<box2d>,
- util::array<box2d> > tblboxes;
+ util::array<box2d> tboxes = internal::extract_text(in, lbl, nlabels);
- image2d<bool> table;
- if (treat_tables)
- {
- tblboxes = internal::extract_tables(in);
- table = internal::rebuild_table(in, tblboxes);
+ internal::merge_aligned_text_boxes(in, tboxes, lbl, nlabels);
- /// relabel since the table has been removed.
- lbl = labeling::blobs(in, c8(), nlabels);
- /// Do we really want to cleanup again?
- internal::cleanup_components(lbl, nlabels);
+ internal::maptext_to_cells(in, table, tboxes);
#ifndef NOUT
- internal::save_lbl_image(lbl, nlabels, "lbl-small-comps-removed.pgm");
+ std::cout << "Saving output" << std::endl;
+ image2d<rgb8> output = level::convert(rgb8(), in_bak);
+ internal::draw_component_boxes(output, tboxes);
+ io::ppm::save(output, internal::output_file("out.ppm"));
#endif
- }
- util::array<box2d> tboxes =
- internal::extract_text(in, lbl, nlabels);
+ internal::text_recognition(in, lbl, tboxes);
+ }
- internal::merge_aligned_text_boxes(in, tboxes, lbl, nlabels);
- if (treat_tables)
- internal::maptext_to_cells(in, table, tboxes);
+ void demat_photo(char *argv[])
+ {
+ using namespace mln;
+ using value::rgb8;
+ using value::label_16;
+
+ internal::settings.treat_tables = false;
+ internal::input_file = basename(argv[1]);
+
+ //Load image
+ image2d<bool> in;
+ io::pbm::load(in, argv[1]);
+ logical::not_inplace(in);
+
+#ifndef NOUT
+ image2d<bool> in_bak = clone(in);
+#endif
+
+ internal::settings.max_comp_size = in.ncols() * in.nrows() * 0.05;
+
+ //Label and remove small components.
+ label_16 nlabels;
+ image2d<label_16> lbl = labeling::blobs(in, c8(), nlabels);
+
+ internal::cleanup_components(lbl, nlabels);
+
+ util::array<box2d> tboxes = internal::extract_text(in, lbl, nlabels);
+ internal::merge_aligned_text_boxes(in, tboxes, lbl, nlabels);
#ifndef NOUT
std::cout << "Saving output" << std::endl;
diff --git a/milena/sandbox/scribo/photo.cc b/milena/sandbox/scribo/photo.cc
index 4e358ab..a173750 100644
--- a/milena/sandbox/scribo/photo.cc
+++ b/milena/sandbox/scribo/photo.cc
@@ -58,7 +58,7 @@ int main(int argc, char*argv[])
return 1;
}
- scribo::demat(argv, false);
+ scribo::demat_photo(argv);
return 0;
}
diff --git a/milena/sandbox/scribo/table.cc b/milena/sandbox/scribo/table.cc
index 3c28540..3472599 100644
--- a/milena/sandbox/scribo/table.cc
+++ b/milena/sandbox/scribo/table.cc
@@ -60,7 +60,7 @@ int main(int argc, char*argv[])
return 1;
}
- scribo::demat(argv, true);
+ scribo::demat_table(argv);
return 0;
}
--
1.5.6.5
1
0
* mln/canvas/browsing/depth_first_search.hh: new canvas.
* mln/util/array.hh,
* mln/fun/internal/array_base.hh: add new resize() overload.
* mln/fun/x2x/rotation.hh: update doc.
* tests/fun/x2x/rotation.cc: fix wrong namespace.
* milena/tests/unit_test/Makefile.am,
* milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc:
add a new unit test.
* milena/headers.mk: update distributed headers.
---
milena/ChangeLog | 19 +++
milena/headers.mk | 2 +-
milena/mln/canvas/browsing/depth_first_search.hh | 134 ++++++++++++++++++++
milena/mln/fun/internal/array_base.hh | 9 ++
milena/mln/fun/x2x/rotation.hh | 14 +--
milena/mln/util/array.hh | 11 ++
milena/tests/fun/x2x/rotation.cc | 4 +-
milena/tests/unit_test/Makefile.am | 2 +
.../mln_canvas_browsing_depth_first_search.cc | 8 ++
9 files changed, 192 insertions(+), 11 deletions(-)
create mode 100644 milena/mln/canvas/browsing/depth_first_search.hh
create mode 100644 milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 2fd50e0..64c3fd7 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,22 @@
+2008-12-10 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add depth first search canvas for graphes.
+
+ * mln/canvas/browsing/depth_first_search.hh: new canvas.
+
+ * mln/util/array.hh,
+ * mln/fun/internal/array_base.hh: add new resize() overload.
+
+ * mln/fun/x2x/rotation.hh: update doc.
+
+ * tests/fun/x2x/rotation.cc: fix wrong namespace.
+
+ * milena/tests/unit_test/Makefile.am,
+ * milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc:
+ add a new unit test.
+
+ * milena/headers.mk: update distributed headers.
+
2008-12-10 Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix 'implies' test and doc tutorial examples.
diff --git a/milena/headers.mk b/milena/headers.mk
index f88845e..25f239c 100644
--- a/milena/headers.mk
+++ b/milena/headers.mk
@@ -237,7 +237,6 @@ mln/convert/to_p_array.hh \
mln/convert/from_to.hxx \
mln/convert/to_rgb.hh \
mln/convert/essential.hh \
-mln/value/label.hh.bak \
mln/value/float01_f.hh \
mln/value/float01_16.hh \
mln/value/lut_vec.hh \
@@ -464,6 +463,7 @@ mln/canvas/browsing/all.hh \
mln/canvas/browsing/diagonal2d.hh \
mln/canvas/browsing/fwd.hh \
mln/canvas/browsing/dir_struct_elt_incr_update.hh \
+mln/canvas/browsing/depth_first_search.hh \
mln/canvas/browsing/directional.hh \
mln/canvas/browsing/essential.hh \
mln/canvas/chamfer.hh \
diff --git a/milena/mln/canvas/browsing/depth_first_search.hh b/milena/mln/canvas/browsing/depth_first_search.hh
new file mode 100644
index 0000000..716be86
--- /dev/null
+++ b/milena/mln/canvas/browsing/depth_first_search.hh
@@ -0,0 +1,134 @@
+// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_CANVAS_BROWSING_DEPTH_FIRST_SEARCH_HH
+# define MLN_CANVAS_BROWSING_DEPTH_FIRST_SEARCH_HH
+
+/// \file mln/canvas/browsing/depth_first_search.hh
+///
+/// Depth-limited search algorithm for graph.
+/// Browse over all vertices for each component.
+
+/*!
+** The functor should provide the following methods:
+**
+** - template <typename G> void init(const Graph<G>& g)
+** Will be called at the beginning.
+**
+** - void next()
+** Will be called after all vertices from a component have been treated.
+**
+** - void update_treated(unsigned id)
+** will be called for the first vertex encountered for each component.
+**
+** - void update_queued(unsigned id)
+** Will be called for every vertex encountered in each component, except
+** the first one.
+**
+** - bool to_be_treated(unsigned id)
+** Return whether this vertex has already been marked or if it may be a
+** a component representative.
+**
+** - bool to_be_queued(unsigned id)
+** Return whether this vertex has already been marked or if it can be added
+** to the current component.
+**
+** - void final()
+** Will be called at the end;
+**
+*/
+
+# include <mln/core/concept/graph.hh>
+
+namespace mln
+{
+
+ namespace canvas
+ {
+
+ namespace browsing
+ {
+
+ struct depth_first_search_t : public Browsing< depth_first_search_t >
+ {
+ template <typename G, typename F>
+ void operator()(const Graph<G>&, F& f) const;
+ };
+
+ extern const depth_first_search_t depth_first_search;
+
+# ifndef MLN_INCLUDE_ONLY
+
+ const depth_first_search_t depth_first_search;
+
+ template <typename G, typename F>
+ inline
+ void
+ depth_first_search_t::operator()(const Graph<G>& g_, F& f) const
+ {
+ trace::entering("canvas::browsing::depth_first_search");
+
+ const G& g = exact(g_);
+
+ f.init(g);
+
+ mln_vertex_iter(util::graph) v(g);
+ for_all(v)
+ if (f.to_be_treated(v.id()))
+ {
+ std::queue<unsigned> queue;
+ queue.push(v.id());
+ f.update_treated(v.id());
+ while (!queue.empty())
+ {
+ util::vertex<util::graph> current_v = g.vertex(queue.front());
+ queue.pop();
+ for (unsigned nv = 0; nv < current_v.nmax_nbh_vertices(); ++nv)
+ if (f.to_be_queued(current_v.ith_nbh_vertex(nv)))
+ {
+ f.update_queued(current_v.ith_nbh_vertex(nv));
+ queue.push(current_v.ith_nbh_vertex(nv));
+ }
+ }
+ f.next();
+ }
+
+ f.final();
+
+ trace::exiting("canvas::browsing::depth_first_search");
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::canvas::browsing
+
+ } // end of namespace mln::canvas
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CANVAS_BROWSING_DEPTH_FIRST_SEARCH_HH
diff --git a/milena/mln/fun/internal/array_base.hh b/milena/mln/fun/internal/array_base.hh
index 32abb8a..62486fb 100644
--- a/milena/mln/fun/internal/array_base.hh
+++ b/milena/mln/fun/internal/array_base.hh
@@ -55,6 +55,7 @@ namespace mln
typedef T result;
void resize(unsigned n);
+ void resize(unsigned n, const T& val);
unsigned size() const;
const T& operator()(unsigned i) const;
@@ -150,6 +151,14 @@ namespace mln
template <typename T>
inline
+ void
+ array_base<T>::resize(unsigned n, const T& val)
+ {
+ v_.resize(n, val);
+ }
+
+ template <typename T>
+ inline
unsigned
array_base<T>::size() const
{
diff --git a/milena/mln/fun/x2x/rotation.hh b/milena/mln/fun/x2x/rotation.hh
index 9364cda..6ebe9b2 100644
--- a/milena/mln/fun/x2x/rotation.hh
+++ b/milena/mln/fun/x2x/rotation.hh
@@ -1,4 +1,5 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -28,10 +29,9 @@
#ifndef MLN_FUN_X2X_ROTATION_HH
# define MLN_FUN_X2X_ROTATION_HH
-/*! \file mln/fun/x2x/rotation.hh
- *
- * \brief Define a rotation function.
- */
+/// \file mln/fun/x2x/rotation.hh
+///
+/// Define a rotation function.
# include <mln/core/concept/function.hh>
# include <mln/fun/internal/x2x_linear_impl.hh>
@@ -116,9 +116,7 @@ namespace mln
} // end of namespace internal
- /*! \brief Represent a rotation function.
- *
- */
+ /// Represent a rotation function.
template <unsigned n, typename C>
struct rotation
: fun::internal::x2x_linear_impl_< algebra::vec<n,C>, rotation<n,C> >
diff --git a/milena/mln/util/array.hh b/milena/mln/util/array.hh
index b5e2534..822a513 100644
--- a/milena/mln/util/array.hh
+++ b/milena/mln/util/array.hh
@@ -118,6 +118,9 @@ namespace mln
/// Resize this array to \p n elements.
void resize(unsigned n);
+ /// Resize this array to \p n elements with \p value as value.
+ void resize(unsigned n, const T& value);
+
/// Add the element \p elt at the end of this array.
array<T>& append(const T& elt);
@@ -329,6 +332,14 @@ namespace mln
template <typename T>
inline
+ void
+ array<T>::resize(unsigned n, const T& value)
+ {
+ v_.resize(n, value);
+ }
+
+ template <typename T>
+ inline
array<T>&
array<T>::append(const T& elt)
{
diff --git a/milena/tests/fun/x2x/rotation.cc b/milena/tests/fun/x2x/rotation.cc
index 85b9619..bce3137 100644
--- a/milena/tests/fun/x2x/rotation.cc
+++ b/milena/tests/fun/x2x/rotation.cc
@@ -31,7 +31,7 @@
///
#include <iostream>
-#include <mln/fun/x2x/rotation.hh>
+#include <mln/fun/x2v/rotation.hh>
#include <mln/core/image/image2d.hh>
#include <mln/value/int_u8.hh>
#include <mln/io/pgm/load.hh>
@@ -56,7 +56,7 @@ int main()
io::pgm::load(lena, MLN_IMG_DIR "/lena.pgm");
image2d<int_u8> out(lena.domain());
- interpolated<image2d<int_u8>, fun::x2x::bilinear> inter(lena);
+ interpolated<image2d<int_u8>, fun::x2v::bilinear> inter(lena);
fun::x2x::rotation<2,float> rot1(0.1, axis);
diff --git a/milena/tests/unit_test/Makefile.am b/milena/tests/unit_test/Makefile.am
index 893238e..953077f 100644
--- a/milena/tests/unit_test/Makefile.am
+++ b/milena/tests/unit_test/Makefile.am
@@ -459,6 +459,7 @@ mln_canvas_browsing_all \
mln_canvas_browsing_diagonal2d \
mln_canvas_browsing_fwd \
mln_canvas_browsing_dir_struct_elt_incr_update \
+mln_canvas_browsing_depth_first_search \
mln_canvas_browsing_directional \
mln_canvas_browsing_essential \
mln_canvas_chamfer \
@@ -1454,6 +1455,7 @@ mln_canvas_browsing_all_SOURCES = mln_canvas_browsing_all.cc
mln_canvas_browsing_diagonal2d_SOURCES = mln_canvas_browsing_diagonal2d.cc
mln_canvas_browsing_fwd_SOURCES = mln_canvas_browsing_fwd.cc
mln_canvas_browsing_dir_struct_elt_incr_update_SOURCES = mln_canvas_browsing_dir_struct_elt_incr_update.cc
+mln_canvas_browsing_depth_first_search_SOURCES = mln_canvas_browsing_depth_first_search.cc
mln_canvas_browsing_directional_SOURCES = mln_canvas_browsing_directional.cc
mln_canvas_browsing_essential_SOURCES = mln_canvas_browsing_essential.cc
mln_canvas_chamfer_SOURCES = mln_canvas_chamfer.cc
diff --git a/milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc b/milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc
new file mode 100644
index 0000000..5073125
--- /dev/null
+++ b/milena/tests/unit_test/mln_canvas_browsing_depth_first_search.cc
@@ -0,0 +1,8 @@
+// Unit test for mln/canvas/browsing/depth_first_search.hh.
+// Generated file, do not modify.
+#include <mln/canvas/browsing/depth_first_search.hh>
+
+int main()
+{
+ // Nothing.
+}
--
1.5.6.5
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix 'implies' test and doc tutorial examples.
* doc/tutorial/examples/image_if.cc,
* doc/tutorial/examples/image2d.cc,
* doc/tutorial/examples/sub_image_if.cc,
* doc/tutorial/examples/for_Z.cc,
* doc/tutorial/examples/p_run.cc,
* doc/tutorial/examples/p_mutable_array_of.cc:
Fix missing updates.
* mln/core/site_set/p_array.hh: Upgrade doc style.
(p_indexed_psite, change_index, dec_index, inc_index):
Use update_.
(subj_): Do not update_; instead, test that update is effective.
* mln/core/contract.hh (implies): Fix.
doc/tutorial/examples/for_Z.cc | 2 -
doc/tutorial/examples/image2d.cc | 4 +-
doc/tutorial/examples/image_if.cc | 4 +-
doc/tutorial/examples/p_mutable_array_of.cc | 2 -
doc/tutorial/examples/p_run.cc | 2 -
doc/tutorial/examples/sub_image_if.cc | 2 -
mln/core/contract.hh | 10 +++----
mln/core/site_set/p_array.hh | 40 ++++++++++++++--------------
8 files changed, 33 insertions(+), 33 deletions(-)
Index: doc/tutorial/examples/image_if.cc
--- doc/tutorial/examples/image_if.cc (revision 3022)
+++ doc/tutorial/examples/image_if.cc (working copy)
@@ -72,7 +72,7 @@
// FIXME: border::fill(ima, 0);
debug::iota(ima);
- mln_VAR(ima_, ima | fun::p2b::chess);
+ mln_VAR(ima_, ima | fun::p2b::chess());
debug::println(ima);
debug::println(ima_);
@@ -80,7 +80,7 @@
trait::image::print(ima_);
std::cout << std::endl;
- typedef p_if<box2d, fun::p2b::chess_t> S;
+ typedef p_if<box2d, fun::p2b::chess> S;
ch_target(mln_fwd_piter_(S)(), ima_.domain());
// mln_VAR(ima_e, extend(ima_, pw::value(ima)));
Index: doc/tutorial/examples/image2d.cc
--- doc/tutorial/examples/image2d.cc (revision 3022)
+++ doc/tutorial/examples/image2d.cc (working copy)
@@ -6,7 +6,7 @@
# include <mln/debug/println.hh>
# include <mln/core/alias/neighb2d.hh>
-# include <mln/estim/nsites.hh>
+# include <mln/geom/nsites.hh>
template <typename I, typename W, typename P>
@@ -45,7 +45,7 @@
debug::iota(ima);
debug::println(ima);
mln_assertion(ima.nsites() == 6);
- mln_assertion(estim::nsites(ima) == ima.nsites());
+ mln_assertion(geom::nsites(ima) == ima.nsites());
window2d win;
win
Index: doc/tutorial/examples/sub_image_if.cc
--- doc/tutorial/examples/sub_image_if.cc (revision 3022)
+++ doc/tutorial/examples/sub_image_if.cc (working copy)
@@ -68,7 +68,7 @@
{1, 0, 1, 1, 1},
{1, 0, 0, 0, 0}
};
- image2d<bool> ima = make::image2d(vals);
+ image2d<bool> ima = make::image(vals);
debug::println(ima);
int_u8 nlabels;
Index: doc/tutorial/examples/for_Z.cc
--- doc/tutorial/examples/for_Z.cc (revision 3022)
+++ doc/tutorial/examples/for_Z.cc (working copy)
@@ -135,7 +135,7 @@
{1, 0, 1, 1, 1},
{1, 0, 0, 0, 0}
};
- image2d<bool> ima = make::image2d(vals);
+ image2d<bool> ima = make::image(vals);
debug::println(ima);
int_u8 nlabels;
Index: doc/tutorial/examples/p_run.cc
--- doc/tutorial/examples/p_run.cc (revision 3022)
+++ doc/tutorial/examples/p_run.cc (working copy)
@@ -32,7 +32,7 @@
{0, 0, 1, 1, 1},
{1, 1, 1, 0, 0}
};
- image2d<bool> ima = make::image2d(vals);
+ image2d<bool> ima = make::image(vals);
debug::println(ima);
Runs rs;
Index: doc/tutorial/examples/p_mutable_array_of.cc
--- doc/tutorial/examples/p_mutable_array_of.cc (revision 3022)
+++ doc/tutorial/examples/p_mutable_array_of.cc (working copy)
@@ -35,7 +35,7 @@
{0, 0, 1, 1, 1},
{1, 1, 1, 0, 0}
};
- image2d<bool> ima = make::image2d(vals);
+ image2d<bool> ima = make::image(vals);
debug::println(ima);
typedef p_mutable_array_of< p_run<point2d> > Runs;
Index: mln/core/site_set/p_array.hh
--- mln/core/site_set/p_array.hh (revision 3022)
+++ mln/core/site_set/p_array.hh (working copy)
@@ -28,15 +28,14 @@
#ifndef MLN_CORE_SITE_SET_P_ARRAY_HH
# define MLN_CORE_SITE_SET_P_ARRAY_HH
-/*! \file mln/core/site_set/p_array.hh
- *
- * \brief Definition of a point set class based on std::vector.
- *
- * \todo Add a facade to index_of_in so that it dispatches when
- * calling it with Object<p_array_site>.
- *
- * \todo Use util::index (instead of int) as many times as possible.
- */
+/// \file mln/core/site_set/p_array.hh
+///
+/// Definition of a point set class based on std::vector.
+///
+/// \todo Add a facade to index_of_in so that it dispatches when
+/// calling it with Object<p_array_site>.
+///
+/// \todo Use util::index (instead of int) as many times as possible.
# include <vector>
@@ -74,10 +73,10 @@
- /*! \brief Site set class based on std::vector.
- *
- * This is a multi-set of sites.
- */
+ /// Site set class based on std::vector.
+ ///
+ /// This is a multi-set of sites.
+ ///
template <typename P>
class p_array : public internal::site_set_base_< P, p_array<P> >
{
@@ -172,8 +171,8 @@
- // p_indexed_psite<P>
-
+ /// Psite class for indexed site sets such as p_array<P>.
+ ///
template <typename S>
class p_indexed_psite : public internal::pseudo_site_base_< const mln_element(S)&,
p_indexed_psite<S> >
@@ -498,6 +497,7 @@
: s_(& s),
i_(i)
{
+ update_();
}
template <typename S>
@@ -514,6 +514,7 @@
p_indexed_psite<S>::change_index(int i)
{
i_ = i;
+ update_();
}
template <typename S>
@@ -522,6 +523,7 @@
p_indexed_psite<S>::dec_index()
{
--i_;
+ update_();
}
template <typename S>
@@ -530,6 +532,7 @@
p_indexed_psite<S>::inc_index()
{
++i_;
+ update_();
}
template <typename S>
@@ -562,7 +565,8 @@
const mln_element(S)&
p_indexed_psite<S>::subj_()
{
- update_(); // In case of...
+ if (is_valid())
+ mln_invariant(p_ == (*s_)[i_]);
return p_;
}
@@ -621,7 +625,6 @@
p_indexed_fwd_piter<S>::start_()
{
p_.change_index(0);
- p_.update_();
}
template <typename S>
@@ -630,7 +633,6 @@
p_indexed_fwd_piter<S>::next_()
{
p_.inc_index();
- p_.update_();
}
template <typename S>
@@ -680,7 +682,6 @@
p_indexed_bkd_piter<S>::start_()
{
p_.change_index(s_->nsites() - 1);
- p_.update_();
}
template <typename S>
@@ -689,7 +690,6 @@
p_indexed_bkd_piter<S>::next_()
{
p_.dec_index();
- p_.update_();
}
template <typename S>
Index: mln/core/contract.hh
--- mln/core/contract.hh (revision 3022)
+++ mln/core/contract.hh (working copy)
@@ -1,4 +1,5 @@
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -28,10 +29,9 @@
#ifndef MLN_CORE_CONTRACT_HH
# define MLN_CORE_CONTRACT_HH
-/*! \file mln/core/contract.hh
- *
- * \brief Definition of the set of contracts.
- */
+/// \file mln/core/contract.hh
+///
+/// Definition of the set of contracts.
# include <cassert>
@@ -70,7 +70,7 @@
inline
bool implies(bool lexpr, bool rexpr)
{
- return ! (rexpr) || (lexpr);
+ return (! lexpr) || rexpr;
}
# endif // ! MLN_INCLUDE_ONLY
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2008-12-10 Matthieu Garrigues <garrigues(a)lrde.epita.fr>
[Markov] Speed up the algorithm.
* markov/approx_exp.hh: New, exp using a lookup table.
* markov/markov.hh: compute delta u directly.
* markov/random.hh,
* markov/random.hxx: speed up random using a lookup table.
---
approx_exp.hh | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
markov.hh | 76 +++++++++++++++++++++++++--------------------------------
random.hh | 6 +++-
random.hxx | 22 ++++++++++++++--
4 files changed, 135 insertions(+), 46 deletions(-)
Index: trunk/milena/sandbox/markov/approx_exp.hh
===================================================================
--- trunk/milena/sandbox/markov/approx_exp.hh (revision 0)
+++ trunk/milena/sandbox/markov/approx_exp.hh (revision 3022)
@@ -0,0 +1,77 @@
+// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_APPROX_EXP_HH
+# define MLN_APPROX_EXP_HH
+
+class approx_exp
+{
+public:
+
+ approx_exp(float min, float max, unsigned nvalues)
+ : min_(min),
+ max_(max),
+ nvalues_(nvalues),
+ values_(nvalues),
+ step_((max - min) / float(nvalues))
+ {
+
+ for (unsigned i = 0; i < nvalues_; ++i)
+ values_[i] = exp(min_ + i * step_);
+ }
+
+ inline
+ float
+ get(float x)
+ {
+ if (x < min_)
+ return values_[0];
+ if (x > max_)
+ return values_[nvalues_ - 1];
+
+ return values_[unsigned(float(x - min_) / step_)];
+ }
+
+ inline
+ float
+ operator() (float x)
+ {
+ return get(x);
+ }
+
+private:
+ const float min_;
+ const float max_;
+ const unsigned nvalues_;
+ const float step_;
+
+ std::vector<float> values_;
+};
+
+#endif // ! MLN_APPROX_EXP_HH
Index: trunk/milena/sandbox/markov/random.hxx
===================================================================
--- trunk/milena/sandbox/markov/random.hxx (revision 3021)
+++ trunk/milena/sandbox/markov/random.hxx (revision 3022)
@@ -11,26 +11,42 @@
template <typename T>
Random<T>::Random (T inf, T sup)
- : inf_ (inf), sup_ (sup)
+ : inf_ (inf),
+ sup_ (sup),
+ i_ (0)
{
assert (sup >= inf);
srand (time (0));
+ for (int i = 0; i < size_; i++)
+ values_[i] = gen();
}
template <typename T>
+inline
T
-Random<T>::get () const
+Random<T>::gen () const
{
double res = (sup_ - inf_) * (((double) rand ()) / RAND_MAX) + inf_;
return res;
}
template <>
+inline
bool
-Random<bool>::get () const
+Random<bool>::gen () const
{
bool res = rand () > (RAND_MAX / 2);
+ return res;
+}
+
+template <typename T>
+inline
+T
+Random<T>::get ()
+{
+ T res = values_[i_ % size_];
+ ++i_;
return res;
}
Index: trunk/milena/sandbox/markov/markov.hh
===================================================================
--- trunk/milena/sandbox/markov/markov.hh (revision 3021)
+++ trunk/milena/sandbox/markov/markov.hh (revision 3022)
@@ -4,6 +4,7 @@
# include <cmath>
# include <iomanip>
# include <random.hh>
+# include <approx_exp.hh>
# include <T_gen.hh>
# include <mln/binarization/threshold.hh>
# include <mln/core/routine/clone.hh>
@@ -11,36 +12,36 @@
namespace mln
{
- template <typename I, typename O, typename N>
- double compute_energy(const I& ima, const O& out, const N& nbh, bool xi, const mln_site(I) &p)
+ template <typename I, typename N>
+ inline
+ float compute_du(const I& ima, const I& out, const mln_site(I)& p, const N& nbh)
{
+ // Compute du : energy of clique with the new value minus with the
+ // old value (p_out.val())
+
+ bool old_val = out(p);
// Compute u(x,y)
- double u;
- if (xi == ima(p))
- u = 0;
+ float du = 0;
+ if (old_val == ima(p))
+ du += 1;
else
- u = 1;
-
+ du -= 1;
// u(x) is cst so we don't care
- double diff_sum = 0;
- double coeff = 0;
+ // sum the differences between new_val and the neighboors.
+ int diff_sum = 0;
mln_niter(N) n(nbh, p);
for_all(n)
- if (ima.domain().has(n))
- {
- diff_sum += abs(xi - out(n));
- coeff ++;
- }
-
- diff_sum /= coeff;
+ if (old_val != out(n))
+ ++diff_sum;
-// std::cout << "energy : " << (u + diff_sum) << std::endl;
+ du -= float(5 * (2 * diff_sum - int(nbh.size()))) / nbh.size();
- return (u + diff_sum * 5);
+ return du;
}
+
template <typename I>
void dump(const Image<I>& ima)
{
@@ -58,50 +59,42 @@
const I &ima = exact(ima_);
const N &nbh = exact(nbh_);
- mln_ch_value(I, bool) bin = binarization::threshold(ima, 255 / 2); // FIXME : max
- mln_ch_value(I, bool) out(bin.domain());
-
- io::pbm::save(out, "threshold.pbm");
+ typedef mln_ch_value(I, bool) O;
+ O bin = binarization::threshold(ima, 255 / 2); // FIXME : max
+ O out(bin.domain());
temperature_generator gtemp(start_temp, 0.8);
- double temp = start_temp;
+ approx_exp my_exp(-1000, 5, 100000);
+ float temp = start_temp;
Random<bool> v_random(0, 1); // mettre max et min ?
- Random<double> p_random(0., 1.); // idem
+ Random<float> p_random(0., 1.); // idem
unsigned modifications = 42;
unsigned turn = 1;
bool gradient = false;
- int diffneg = 0;
+
while (!gradient || modifications)
{
// Trace.
// dump(out);
- mln_piter(I) p(bin.domain());
modifications = 0;
-
- for_all(p)
+ mln_piter(O) p_out(out.domain());
+ for_all(p_out) if (v_random.get())
{
- bool v = v_random.get();
+ float d_u = compute_du(bin, out, p_out, nbh);
- double u = compute_energy(bin, out, nbh, out(p), p);
- double up = compute_energy(bin, out, nbh, v, p);
-
- double d_u = up - u;
- double proba = exp(-d_u / temp);
-
- if ((d_u < 0 || !gradient && (p_random.get() < proba)) && out(p) != v)
+ if ((d_u < 0 || !gradient && (p_random.get() < my_exp(-d_u / temp))))
{
- if (d_u < 0)
- diffneg ++;
- out(p) = v;
- modifications ++;
+ out(p_out) = !out(p_out);
+ ++modifications;
}
}
temp = gtemp;
- std::cout << "Turn : " << turn << " Modifs : " << modifications << " DiffNeg : " << diffneg << " Temp : " << temp << std::endl;
+
+ std::cout << "Turn : " << turn << " Temp : " << temp << " Modifications : " << modifications << std::endl;
turn ++;
if (!gradient && !modifications)
{
@@ -109,7 +102,6 @@
modifications = 1;
gradient = true;
}
- diffneg = 0;
}
return out;
Index: trunk/milena/sandbox/markov/random.hh
===================================================================
--- trunk/milena/sandbox/markov/random.hh (revision 3021)
+++ trunk/milena/sandbox/markov/random.hh (revision 3022)
@@ -9,11 +9,15 @@
public:
Random (T inf, T sup);
- T get () const;
+ T get ();
+ T gen () const;
public:
+ static const unsigned size_ = 10000;
T inf_;
T sup_;
+ int i_;
+ T values_[size_];
};
1
0
* tests/unit_test/build_unit_test.sh: Fix non-compatible sed
expressions.
---
milena/ChangeLog | 7 +++++++
milena/tests/unit_test/build_unit_test.sh | 11 ++++++-----
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 29ad76c..d678bd8 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-10 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Fix unit test generation on mac.
+
+ * tests/unit_test/build_unit_test.sh: Fix non-compatible sed
+ expressions.
+
2008-12-09 Guillaume Lazzara <z(a)lrde.epita.fr>
Update tutorial.
diff --git a/milena/tests/unit_test/build_unit_test.sh b/milena/tests/unit_test/build_unit_test.sh
index 2d6ad0d..037a2cd 100755
--- a/milena/tests/unit_test/build_unit_test.sh
+++ b/milena/tests/unit_test/build_unit_test.sh
@@ -4,7 +4,7 @@ if [ $# -ne 1 ]; then
echo "Usage: $0 <mln_path>"
fi
-HEADERS=`find $1 -name "*.hh" | grep -vE "*.spe.hh" | grep -v "mln/core/doc" | sed -e 's/.*\/mln\/\(.*\)/mln\/\1/g' | sed s/"\.\.\/\.\.\/"//g`
+HEADERS=`find $1 -name "*.hh" | grep -vE "*.spe.hh" | grep -v "mln/core/doc" | sed -e 's/.*\/mln\/\(.*\)/mln\/\1/g' | sed 's/\.\.\/\.\.\///g'`
rm -f Makefile.am
rm -f *.hh *.cc
@@ -17,7 +17,7 @@ echo "" >> Makefile.am
echo -n "check_PROGRAMS = " >> Makefile.am
for i in $HEADERS; do
- FILE_CC=`echo $i | sed s/"\(\/\|\.\)"/_/g | sed s/_hh/\.cc/g`
+ FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'`
#Build .cc
echo "// Unit test for $i." >> $FILE_CC
echo "// Generated file, do not modify." >> $FILE_CC
@@ -29,16 +29,17 @@ for i in $HEADERS; do
echo "}" >> $FILE_CC
#build Makefile.am
+ TARGET=`echo "${FILE_CC}" | sed 's/\.cc//'`
echo " \\" >> Makefile.am
- echo -n "${FILE_CC}" | sed s/"\.cc"// >> Makefile.am
+ echo -n "${TARGET}" >> Makefile.am
done
#build Makefile.am
echo "" >> Makefile.am
echo "" >> Makefile.am
for i in $HEADERS; do
- FILE_CC=`echo $i | sed s/"\(\/\|\.\)"/_/g | sed s/_hh/\.cc/g`
- NAME=`echo $FILE_CC | sed s/"\.cc"//`
+ FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'`
+ NAME=`echo $FILE_CC | sed 's/\.cc//g'`
echo "${NAME}_SOURCES = $FILE_CC" >> Makefile.am
done
echo "" >> Makefile.am
--
1.5.6.5
1
0
#87: Add unit (sanity) tests to Milena
-----------------------+----------------------------------------------------
Reporter: levill_r | Owner: jardonnet
Type: task | Status: closed
Priority: major | Milestone: Olena 1.0
Component: Milena | Version: 1.0
Resolution: fixed | Keywords:
-----------------------+----------------------------------------------------
Changes (by jardonnet):
* status: assigned => closed
* resolution: => fixed
Comment:
Generated at bootstrap
--
Ticket URL: <https://trac.lrde.org/olena/ticket/87#comment:5>
Olena <http://olena.lrde.epita.fr>
Olena, a generic and efficient C++ image processing library.
1
0
Guillaume Lazzara wrote:
> * bootstrap: update here.
Thank you. Sorry should have do it myself.
I can close the corresponding ticket now ;)
1
0
* bootstrap: update here.
---
ChangeLog | 6 ++++++
bootstrap | 2 +-
2 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f78d6f4..64a4638 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2008-12-09 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Update call to build_unit_test.sh
+
+ * bootstrap: update here.
+
+2008-12-09 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Cleanup and fix bootstrap.
* bootstrap: cleanup and fix.
diff --git a/bootstrap b/bootstrap
index 52ffabf..f0ebe78 100755
--- a/bootstrap
+++ b/bootstrap
@@ -133,7 +133,7 @@ require autoconf 2.59
require automake 1.9.4
# Generate unit test files.
-run milena/tests/unit_test ./build_unit_test.sh
+run milena/tests/unit_test ./build_unit_test.sh $PWD/milena/mln
# Generate headers distribution config file.
dist_headers
--
1.5.6.5
1
0
* doc/tutorial/Makefile.am: resize converted images.
* doc/tutorial/figures/tuto1_first_image-1.pbm,
* doc/tutorial/outputs/tuto1_first_image.txt: new reference files.
* doc/tutorial/samples/Makefile.am,
* doc/tutorial/samples/tuto1_first_image.cc: add new sample.
* doc/tutorial/tools/todoxygen.sh: Improve output layout.
* doc/tutorial/tutorial.tex: add new chapters.
* tests/unit_test/Makefile.am,
* tests/unit_test/build_unit_test.sh: Avoid relative paths.
---
milena/ChangeLog | 19 +
milena/doc/tutorial/Makefile.am | 2 +-
.../doc/tutorial/figures/tuto1_first_image-1.pbm | 5 +
milena/doc/tutorial/outputs/tuto1_first_image.txt | 14 +
milena/doc/tutorial/samples/Makefile.am | 5 +
milena/doc/tutorial/samples/tuto1_first_image.cc | 35 +
milena/doc/tutorial/tools/todoxygen.sh | 10 +-
milena/doc/tutorial/tutorial.tex | 120 ++-
milena/tests/unit_test/Makefile.am | 1988 ++++++++++----------
milena/tests/unit_test/build_unit_test.sh | 8 +-
10 files changed, 1198 insertions(+), 1008 deletions(-)
create mode 100644 milena/doc/tutorial/figures/tuto1_first_image-1.pbm
create mode 100644 milena/doc/tutorial/outputs/tuto1_first_image.txt
create mode 100644 milena/doc/tutorial/samples/tuto1_first_image.cc
diff --git a/milena/ChangeLog b/milena/ChangeLog
index f319d62..29ad76c 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,22 @@
+2008-12-09 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Update tutorial.
+
+ * doc/tutorial/Makefile.am: resize converted images.
+
+ * doc/tutorial/figures/tuto1_first_image-1.pbm,
+ * doc/tutorial/outputs/tuto1_first_image.txt: new reference files.
+
+ * doc/tutorial/samples/Makefile.am,
+ * doc/tutorial/samples/tuto1_first_image.cc: add new sample.
+
+ * doc/tutorial/tools/todoxygen.sh: Improve output layout.
+
+ * doc/tutorial/tutorial.tex: add new chapters.
+
+ * tests/unit_test/Makefile.am,
+ * tests/unit_test/build_unit_test.sh: Avoid relative paths.
+
2008-12-09 Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix bug in p_array.
diff --git a/milena/doc/tutorial/Makefile.am b/milena/doc/tutorial/Makefile.am
index 2b93111..1ce13a1 100644
--- a/milena/doc/tutorial/Makefile.am
+++ b/milena/doc/tutorial/Makefile.am
@@ -26,7 +26,7 @@ fig-convert:
echo "Converting $$img to png"; \
name=`basename $$img` \
ext=`echo $$name | cut -d '.' -f 2`; \
- convert $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png \
+ convert -scale 250 $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png\
|| eval $$failcom; \
done;
diff --git a/milena/doc/tutorial/figures/tuto1_first_image-1.pbm b/milena/doc/tutorial/figures/tuto1_first_image-1.pbm
new file mode 100644
index 0000000..03baef0
--- /dev/null
+++ b/milena/doc/tutorial/figures/tuto1_first_image-1.pbm
@@ -0,0 +1,5 @@
+P4
+# Generated by Milena 1.0 http://olena.lrde.epita.fr
+# EPITA Research and Development Laboratory (LRDE)
+21 13
+ÿÿøš»Ø«»šˆ»š«»ššˆØÿÿøÂ›˜ª«šª›šŠ«šÂš˜ÿÿø
\ No newline at end of file
diff --git a/milena/doc/tutorial/outputs/tuto1_first_image.txt b/milena/doc/tutorial/outputs/tuto1_first_image.txt
new file mode 100644
index 0000000..42a59f9
--- /dev/null
+++ b/milena/doc/tutorial/outputs/tuto1_first_image.txt
@@ -0,0 +1,14 @@
+- - - - - - - - - - - - - - - - - - - - -
+- | - | - | | | - | - - - | - - - - | - -
+- | - | - | - - - | - - - | - - - | - | -
+- | | | - | | | - | - - - | - - - | - | -
+- | - | - | - - - | - - - | - - - | - | -
+- | - | - | | | - | | | - | | | - - | - -
+- - - - - - - - - - - - - - - - - - - - -
+- | - | - - | - - | | - - | - - - | | - -
+- | - | - | - | - | - | - | - - - | - | -
+- | - | - | - | - | | - - | - - - | - | -
+- | | | - | - | - | - | - | - - - | - | -
+- | - | - - | - - | - | - | | | - | | - -
+- - - - - - - - - - - - - - - - - - - - -
+
diff --git a/milena/doc/tutorial/samples/Makefile.am b/milena/doc/tutorial/samples/Makefile.am
index afa1cff..6e61992 100644
--- a/milena/doc/tutorial/samples/Makefile.am
+++ b/milena/doc/tutorial/samples/Makefile.am
@@ -44,6 +44,9 @@ bin_PROGRAMS = \
win-create-1 \
win-create-2
+bin_PROGRAMS += \
+tuto1_first_image
+
accu_right_instanciation_SOURCES = accu-right-instanciation.cc
borderthickness_SOURCES = borderthickness.cc
box2d_bbox_SOURCES = box2d-bbox.cc
@@ -84,6 +87,8 @@ predicate_1_SOURCES = predicate-1.cc
win_create_1_SOURCES = win-create-1.cc
win_create_2_SOURCES = win-create-2.cc
+tuto1_first_image_SOURCES = tuto1_first_image.cc
+
all: clean-figures
mkdir -p $(OUTPUTS_BUILDDIR)
mkdir -p $(FIGURES_BUILDDIR)
diff --git a/milena/doc/tutorial/samples/tuto1_first_image.cc b/milena/doc/tutorial/samples/tuto1_first_image.cc
new file mode 100644
index 0000000..ecc995f
--- /dev/null
+++ b/milena/doc/tutorial/samples/tuto1_first_image.cc
@@ -0,0 +1,35 @@
+#include <mln/essential/2d.hh>
+int main()
+{
+ using namespace mln;
+
+ // \{
+ bool vals[13][21] = {
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0},
+ {0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0},
+ {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0},
+ {0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+ };
+ // \}
+
+ // \{
+ image2d<bool> ima = make::image(vals);
+ // \}
+
+ // \{
+ debug::println(ima);
+ // \}
+
+ // \{
+ io::pbm::save(ima, "../figures/tuto1_first_image-1.pbm");
+ // \}
+}
diff --git a/milena/doc/tutorial/tools/todoxygen.sh b/milena/doc/tutorial/tools/todoxygen.sh
index 5442cc4..0d2aae5 100755
--- a/milena/doc/tutorial/tools/todoxygen.sh
+++ b/milena/doc/tutorial/tools/todoxygen.sh
@@ -29,7 +29,9 @@ sed -i -e 's/”/\&rdquo/g' $out
sed -i -e 's/≡/\&equiv/g' $out
#Doxygen wants us to preserve '\n' after commands.
-sed -i -e 's/\\endhtmlonly/\\endhtmlonly\n/g' $out
-sed -i -e 's/\\htmlonly/\n\\htmlonly\n/g' $out
-sed -i -e 's/\\endhtmlonly/\\endhtmlonly\n/g' $out
-sed -i -e 's/\\htmlonly/\n\\htmlonly\n/g' $out
+#\ref and \see do not need that extra new line.
+for keyword in include section page subpage subsection image; do
+ sed -i -e "s/\\\\endhtmlonly\\\\$keyword/\\\\endhtmlonly\n\n\\\\$keyword/g" $out
+ sed -i -e "s/\\\\$keyword \(.*\)\\\\htmlonly/\\\\$keyword \1\n\n\\\\htmlonly\n/g" $out
+done
+
diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/tutorial/tutorial.tex
index 8b69fcf..5e36f28 100644
--- a/milena/doc/tutorial/tutorial.tex
+++ b/milena/doc/tutorial/tutorial.tex
@@ -17,8 +17,7 @@
\end{figure}
}
-\title{Olena - Tutorial
-}
+\title{Olena - Quick Reference Guide}
\author{LRDE}
\date{}
@@ -100,6 +99,22 @@ showstringspaces=false,linewidth=14cm}
\backslash htmlonly%
}
+\newcommand{\doxyref}[1]{
+\backslash endhtmlonly%
+\backslash ref #1%
+\backslash htmlonly%
+}
+
+\newcommand{\doxysee}[1]{
+\backslash endhtmlonly%
+\backslash see #1%
+\backslash htmlonly%
+}
+
+\newcommand{\tutotoc}[2]{%
+\longleftarrow ~Go to \doxyref{#1} Go to \doxyref{#2}~ \longrightarrow%
+}
+
\newenvironment{doxymath}
{
%\backslash endhtmlonly%
@@ -126,6 +141,9 @@ $$
\pgfimage[width=#3]{figures/#2-#1}%
\label{#1}%
}
+\renewcommand{\doxyref}[1]{\ref{#1}}
+\renewcommand{\doxysee}[1]{\ref{#1}}
+\renewcommand{\tutotoc}[2]{}
\renewenvironment{doxymath}
{
$$
@@ -136,12 +154,16 @@ $$
%\end{latexonly}
+
\newcommand{\code}[1]{%
\textit{#1}%
}
\newcommand{\var}[1]{%
\textit{$#1$}%
}
+\newcommand{\val}[1]{%
+\textit{#1}%
+}
\newcommand{\type}[1]{%
\textit{#1}%
}
@@ -257,9 +279,20 @@ $$
\begin{document}
% Doxygen use only - Generate the left menu.
+%Write foreword below.
\begin{htmlonly}
\backslash endhtmlonly
+
\backslash page tutorial Tutorial
+- \backslash subpage tutoforeword
+- \backslash subpage tutofirstimage
+- \backslash subpage tutochangeimage
+- \backslash subpage tutoconvimage
+- \backslash subpage tutodataimage
+- \backslash subpage tutowinneighb
+- \backslash subpage tutograph
+
+\backslash page quickref Quick Reference Guide
- \backslash subpage installation
- \backslash subpage foreword
- \backslash subpage site
@@ -283,6 +316,72 @@ $$
\end{latexonly}
%====================================
+\doxychapter{tutoforeword}{Step 0: Foreword}
+
+- image2d
+- typical use case
+
+%====================================
+\doxychapter{tutofirstimage}{Step 1: Your first image}
+
+After this step you should know how to:
+\begin{itemize}
+\item create an image,
+\item display an image in console mode,
+\item save an image.
+\end{itemize}
+
+The full example can be found in \doxyref{tuto1_first_image.cc}.
+
+
+First, declare an array of bool which will represent the image grid. Each each
+cell in this grid is a site and each cell contains a value, \val{true} or
+\val{false}.
+\doxycode[1]{tuto1_first_image}
+
+From that grid, simply call make::image to get an image initialized with that
+data.
+\doxycode[2]{tuto1_first_image}
+This way of initializing an image is the most common one. However, there are
+several other ways described in section \doxyref{imacreate}.
+
+
+To be sure that the data is correctly initialized, it is possible to display the
+image in the standard output using debug::println.
+\doxycode[3]{tuto1_first_image}
+
+Finally, you may want to save the image. Since we use bool as image value, the
+PBM format is the best choice. Therefore, we use io::pbm::save.
+\doxycode[4]{tuto1_first_image}
+
+The output image looks like the following:
+\doxyfigure{tuto1_first_image}{3cm}
+
+In this first step we used a boolean image. Many other value types are available
+though. A more detailed description can be found in section
+\doxyref{imapossvalues}.
+Likewise, according to the value type, the proper file format must be chosen.
+The supported file formats are listed in section \doxyref{imaio}.
+
+\tutotoc{tutoforeword}{tutochangeimage}
+
+%====================================
+\doxychapter{tutochangeimage}{Step 2: Read and write images}
+
+%====================================
+\doxychapter{tutoconvimage}{Step 3: Conversion between image values}
+
+%====================================
+\doxychapter{tutodataimage}{Step 4: Fill and paste data}
+
+%====================================
+\doxychapter{tutowinneighb}{Step 5: Using structural elements with algorithms}
+
+%====================================
+\doxychapter{tutograph}{Step 6: Handle graphes with an image}
+
+
+%====================================
\doxychapter{installation}{Installation}
%**************************
@@ -487,7 +586,7 @@ p\_vertices & set of graph vertices associated to sites.\\
\hline
\end{tabular}
-All site sets are iterable. More detailed explanations are available in section \ref{iterators}.
+All site sets are iterable. More detailed explanations are available in section \doxyref{iterators}.
%**************************
\doxysection{sitesetinterface}{Basic interface}
@@ -742,7 +841,7 @@ resize & Set image border to a specific size.\\
\end{tabular} \\
-On morphed images, decribed in section \ref{imamorphed}, the border concept
+On morphed images, decribed in section \doxyref{imamorphed}, the border concept
does not exist and is generalized to the extension concept.
A simple example of a morphed image is a sub-image. A sub image does not have
border nor extension by default.
@@ -897,13 +996,20 @@ processing, or another image. Trying to access the site value from an empty
image leads to an error at run-time.
Img1b is defined on a domain but does not have data yet.\\
+An image can also be created and initialized at the same time:
+\doxycode[1]{labeling-compute}
+It constructs the following image: \\
+\begin{center}
+\doxyfigure[1]{labeling-compute}{3cm}
+\end{center}
+
Sometimes, you may want to initialize an image from another one:
\doxycode{ima2d-7}
\var{img2b} is declared without specifying a domain. Its border size is set to
the default one, e.g 0. By using \code{initialize} \var{img2b} is initialized
with the same domain and border/extension as \var{img2a}. The data is not
copied though. Other routines like \code{level::fill} can be called in order to
- do so (See also \ref{fillop}).
+ do so (See also \doxyref{fillop}).
%================================================
@@ -923,7 +1029,7 @@ Output:
Usually, you will want to use the functional way, ``\code{ima(Site)}'', more
particularly while iterating over all the sites through an iterator. This use
-case will be detailed further in section \ref{iterators}.
+case will be detailed further in section \doxyref{iterators}.
@@ -1288,7 +1394,7 @@ first version \must be used in templated function whereas the second one \must b
used in non templated functions.
If you want a list of all the macros available in Olena, please refert to
-section \ref{macros}.
+section \doxyref{macros}.
%================================================
diff --git a/milena/tests/unit_test/Makefile.am b/milena/tests/unit_test/Makefile.am
index d17cd67..893238e 100644
--- a/milena/tests/unit_test/Makefile.am
+++ b/milena/tests/unit_test/Makefile.am
@@ -2,1000 +2,1000 @@
include $(top_srcdir)/milena/tests/tests.mk
-check_PROGRAMS = \
-mln_histo_all\
-mln_histo_data\
-mln_histo_compute\
-mln_histo_essential\
-mln_geom_pmin_pmax\
-mln_geom_max_row\
-mln_geom_chamfer\
-mln_geom_min_row\
-mln_geom_seeds2tiling\
-mln_geom_size1d\
-mln_geom_all\
-mln_geom_size2d\
-mln_geom_max_ind\
-mln_geom_max_col\
-mln_geom_size3d\
-mln_geom_ninds\
-mln_geom_nslis\
-mln_geom_delta\
-mln_geom_resize\
-mln_geom_nsites\
-mln_geom_min_col\
-mln_geom_complex_geometry\
-mln_geom_ncols\
-mln_geom_nrows\
-mln_geom_min_ind\
-mln_geom_bbox\
-mln_geom_seeds2tiling_roundness\
-mln_geom_min_sli\
-mln_geom_essential\
-mln_geom_max_sli\
-mln_draw_box\
-mln_draw_all\
-mln_draw_plot\
-mln_draw_line\
-mln_draw_essential\
-mln_pw_image\
-mln_pw_all\
-mln_pw_value\
-mln_pw_cst\
-mln_pw_var\
-mln_pw_essential\
-mln_literal_zero\
-mln_literal_ops\
-mln_literal_origin\
-mln_literal_grays\
-mln_literal_all\
-mln_literal_colors\
-mln_literal_black\
-mln_literal_one\
-mln_literal_white\
-mln_literal_essential\
-mln_registration_get_rtransf\
-mln_registration_internal_rms\
-mln_registration_get_rot\
-mln_registration_all\
-mln_registration_multiscale\
-mln_registration_registration\
-mln_registration_essential\
-mln_registration_icp\
-mln_util_graph\
-mln_util_max\
-mln_util_lazy_set\
-mln_util_set\
-mln_util_tree_to_image\
-mln_util_lemmings\
-mln_util_greater_point\
-mln_util_internal_graph_iter_base\
-mln_util_internal_boost_graph_access\
-mln_util_internal_boost_graph_structure\
-mln_util_internal_graph_iter\
-mln_util_internal_graph_nbh_iter\
-mln_util_internal_vertex_impl\
-mln_util_internal_edge_impl\
-mln_util_internal_graph_base\
-mln_util_internal_boost_graph\
-mln_util_internal_graph_nbh_iter_base\
-mln_util_internal_boost_graph_property\
-mln_util_ord_pair\
-mln_util_edge\
-mln_util_all\
-mln_util_dindex\
-mln_util_tracked_ptr\
-mln_util_ignore\
-mln_util_greater_psite\
-mln_util_timer\
-mln_util_yes\
-mln_util_line_graph\
-mln_util_ord\
-mln_util_tree_fast_to_image\
-mln_util_tree\
-mln_util_index\
-mln_util_multi_site\
-mln_util_branch_iter\
-mln_util_branch_iter_ind\
-mln_util_tree_to_fast\
-mln_util_array\
-mln_util_vertex\
-mln_util_pix\
-mln_util_tree_fast\
-mln_util_site_pair\
-mln_util_nil\
-mln_util_eat\
-mln_util_essential\
-mln_tag_init\
-mln_tag_skeleton\
-mln_tag_all\
-mln_tag_essential\
-mln_trace_entering\
-mln_trace_all\
-mln_trace_warning\
-mln_trace_exiting\
-mln_trace_resume\
-mln_trace_quiet\
-mln_trace_stop\
-mln_trace_essential\
-mln_make_graph\
-mln_make_double_neighb2d\
-mln_make_dpoint2d_h\
-mln_make_w_window\
-mln_make_image\
-mln_make_vec\
-mln_make_all\
-mln_make_dual_neighb\
-mln_make_w_window3d\
-mln_make_mat\
-mln_make_win_chamfer\
-mln_make_w_window2d_int\
-mln_make_box1d\
-mln_make_voronoi\
-mln_make_box2d\
-mln_make_w_window2d\
-mln_make_box3d\
-mln_make_relabelfun\
-mln_make_pixel\
-mln_make_pix\
-mln_make_box2d_h\
-mln_make_w_window1d\
-mln_make_image2d\
-mln_make_w_window_directional\
-mln_make_w_window3d_int\
-mln_make_essential\
-mln_make_w_window1d_int\
-mln_make_point2d_h\
-mln_display_all\
-mln_display_essential\
-mln_extension_adjust\
-mln_extension_duplicate\
-mln_extension_adjust_duplicate\
-mln_extension_all\
-mln_extension_adjust_fill\
-mln_extension_fill\
-mln_extension_essential\
-mln_fun_p2b_chess\
-mln_fun_p2b_all\
-mln_fun_p2b_has\
-mln_fun_p2b_big_chess\
-mln_fun_p2b_essential\
-mln_fun_p2p_mirror\
-mln_fun_x2p_closest_point\
-mln_fun_x2p_all\
-mln_fun_x2p_essential\
-mln_fun_ops\
-mln_fun_c\
-mln_fun_vv2v_max\
-mln_fun_vv2v_lor\
-mln_fun_vv2v_land_not\
-mln_fun_vv2v_vec\
-mln_fun_vv2v_all\
-mln_fun_vv2v_macros\
-mln_fun_vv2v_lxor\
-mln_fun_vv2v_diff_abs\
-mln_fun_vv2v_land\
-mln_fun_vv2v_min\
-mln_fun_vv2v_essential\
-mln_fun_internal_array_base\
-mln_fun_internal_x2x_linear_impl\
-mln_fun_internal_selector\
-mln_fun_p2v_ternary\
-mln_fun_p2v_iota\
-mln_fun_p2v_elifs\
-mln_fun_p2v_all\
-mln_fun_p2v_essential\
-mln_fun_all\
-mln_fun_v2b_lnot\
-mln_fun_v2b_all\
-mln_fun_v2b_threshold\
-mln_fun_v2b_essential\
-mln_fun_v2v_norm\
-mln_fun_v2v_linear\
-mln_fun_v2v_id\
-mln_fun_v2v_saturate\
-mln_fun_v2v_inc\
-mln_fun_v2v_all\
-mln_fun_v2v_dec\
-mln_fun_v2v_abs\
-mln_fun_v2v_cast\
-mln_fun_v2v_rgb_to_hsi\
-mln_fun_v2v_enc\
-mln_fun_v2v_convert\
-mln_fun_v2v_essential\
-mln_fun_cast\
-mln_fun_i2v_all\
-mln_fun_i2v_array\
-mln_fun_i2v_all_to\
-mln_fun_i2v_essential\
-mln_fun_l2l_relabel\
-mln_fun_l2l_all\
-mln_fun_l2l_essential\
-mln_fun_x2x_composed\
-mln_fun_x2x_all\
-mln_fun_x2x_translation\
-mln_fun_x2x_rotation\
-mln_fun_x2x_essential\
-mln_fun_x2v_linear\
-mln_fun_x2v_bilinear\
-mln_fun_x2v_all\
-mln_fun_x2v_l1_norm\
-mln_fun_x2v_nneighbor\
-mln_fun_x2v_essential\
-mln_fun_essential\
-mln_all\
-mln_convert_to_p_set\
-mln_convert_to\
-mln_convert_to_upper_window\
-mln_convert_to_image\
-mln_convert_to_fun\
-mln_convert_all\
-mln_convert_to_window\
-mln_convert_from_to\
-mln_convert_impl_from_value_to_value\
-mln_convert_impl_all\
-mln_convert_impl_from_image_to_site_set\
-mln_convert_to_dpoint\
-mln_convert_to_p_array\
-mln_convert_to_rgb\
-mln_convert_essential\
-mln_value_float01_f\
-mln_value_float01_16\
-mln_value_lut_vec\
-mln_value_glf\
-mln_value_other\
-mln_value_graylevel_f\
-mln_value_aliases\
-mln_value_label_16\
-mln_value_ops\
-mln_value_set\
-mln_value_int_u_sat\
-mln_value_float01_8\
-mln_value_int_u8\
-mln_value_equiv\
-mln_value_internal_integer\
-mln_value_internal_gray_f\
-mln_value_internal_all\
-mln_value_internal_value_like\
-mln_value_internal_iterable_set\
-mln_value_internal_encoding\
-mln_value_internal_convert\
-mln_value_internal_gray_\
-mln_value_internal_essential\
-mln_value_proxy\
-mln_value_viter\
-mln_value_graylevel\
-mln_value_all\
-mln_value_super_value\
-mln_value_builtin_symbolics\
-mln_value_builtin_ops\
-mln_value_builtin_all\
-mln_value_builtin_promotions\
-mln_value_builtin_integers\
-mln_value_builtin_floatings\
-mln_value_builtin_essential\
-mln_value_sign\
-mln_value_hsi\
-mln_value_interval\
-mln_value_gl16\
-mln_value_scalar\
-mln_value_float01\
-mln_value_cast\
-mln_value_int_u\
-mln_value_int_s8\
-mln_value_int_s16\
-mln_value_int_u16\
-mln_value_label\
-mln_value_rgb\
-mln_value_stack\
-mln_value_concept_integer\
-mln_value_concept_structured\
-mln_value_concept_built_in\
-mln_value_concept_all\
-mln_value_concept_scalar\
-mln_value_concept_data\
-mln_value_concept_floating\
-mln_value_concept_symbolic\
-mln_value_concept_vectorial\
-mln_value_concept_essential\
-mln_value_int_s\
-mln_value_rgb8\
-mln_value_int_s32\
-mln_value_float01_\
-mln_value_rgb16\
-mln_value_int_u32\
-mln_value_gl8\
-mln_value_label_8\
-mln_value_essential\
-mln_accu_tuple\
-mln_accu_min_h\
-mln_accu_max\
-mln_accu_lor\
-mln_accu_rank\
-mln_accu_transform_stop\
-mln_accu_maj_h\
-mln_accu_min_max\
-mln_accu_internal_base\
-mln_accu_transform_snake\
-mln_accu_rank_high_quant\
-mln_accu_count\
-mln_accu_median_h\
-mln_accu_all\
-mln_accu_land_basic\
-mln_accu_p\
-mln_accu_transform\
-mln_accu_median_alt\
-mln_accu_volume\
-mln_accu_sum\
-mln_accu_height\
-mln_accu_land\
-mln_accu_take\
-mln_accu_histo\
-mln_accu_pair\
-mln_accu_count_adjacent_vertices\
-mln_accu_convolve\
-mln_accu_v\
-mln_accu_rank_bool\
-mln_accu_min\
-mln_accu_transform_directional\
-mln_accu_compute\
-mln_accu_mean\
-mln_accu_lor_basic\
-mln_accu_transform_diagonal\
-mln_accu_nil\
-mln_accu_bbox\
-mln_accu_center\
-mln_accu_line\
-mln_accu_essential\
-mln_accu_max_h\
-mln_level_compare\
-mln_level_memset_\
-mln_level_transform_inplace\
-mln_level_replace\
-mln_level_memcpy_\
-mln_level_apply\
-mln_level_approx_all\
-mln_level_approx_essential\
-mln_level_approx_median\
-mln_level_saturate\
-mln_level_all\
-mln_level_paste\
-mln_level_fast_median\
-mln_level_abs\
-mln_level_fill_with_image\
-mln_level_transform\
-mln_level_fill_with_value\
-mln_level_stretch\
-mln_level_was_median\
-mln_level_compute\
-mln_level_convert\
-mln_level_to_enc\
-mln_level_naive_all\
-mln_level_naive_essential\
-mln_level_naive_median\
-mln_level_sort_psites\
-mln_level_update\
-mln_level_fill\
-mln_level_essential\
-mln_level_assign\
-mln_level_median\
-mln_math_jacobi\
-mln_math_max\
-mln_math_sqr\
-mln_math_all\
-mln_math_sign\
-mln_math_abs\
-mln_math_diff_abs\
-mln_math_round\
-mln_math_min\
-mln_math_sqrt\
-mln_math_essential\
-mln_math_round_sat\
-mln_binarization_includes\
-mln_binarization_all\
-mln_binarization_binarization\
-mln_binarization_threshold\
-mln_binarization_essential\
-mln_trait_site_set_props\
-mln_trait_site_set_print\
-mln_trait_promote\
-mln_trait_solve_binary\
-mln_trait_value_\
-mln_trait_all\
-mln_trait_value_all\
-mln_trait_value_nature\
-mln_trait_value_quant\
-mln_trait_value_kind\
-mln_trait_value_print\
-mln_trait_value_essential\
-mln_trait_images\
-mln_trait_window_props\
-mln_trait_window_print\
-mln_trait_ch_value\
-mln_trait_solve\
-mln_trait_solve_unary\
-mln_trait_op_postdec\
-mln_trait_op_mod\
-mln_trait_op_lor\
-mln_trait_op_neq\
-mln_trait_op_plus\
-mln_trait_op_xor\
-mln_trait_op_all\
-mln_trait_op_geq\
-mln_trait_op_uminus\
-mln_trait_op_not\
-mln_trait_op_times\
-mln_trait_op_less\
-mln_trait_op_decl\
-mln_trait_op_ord\
-mln_trait_op_and\
-mln_trait_op_or\
-mln_trait_op_predec\
-mln_trait_op_minus\
-mln_trait_op_div\
-mln_trait_op_leq\
-mln_trait_op_preinc\
-mln_trait_op_greater\
-mln_trait_op_postinc\
-mln_trait_op_uplus\
-mln_trait_op_essential\
-mln_trait_op_eq\
-mln_trait_concrete\
-mln_trait_windows\
-mln_trait_site_sets\
-mln_trait_image_from_grid\
-mln_trait_undef\
-mln_trait_image_props\
-mln_trait_image_print\
-mln_trait_neighborhood\
-mln_trait_essential\
-mln_canvas_labeling\
-mln_canvas_browsing_hyper_directional\
-mln_canvas_browsing_snake_generic\
-mln_canvas_browsing_backdiagonal2d\
-mln_canvas_browsing_snake_vert\
-mln_canvas_browsing_snake_fwd\
-mln_canvas_browsing_all\
-mln_canvas_browsing_diagonal2d\
-mln_canvas_browsing_fwd\
-mln_canvas_browsing_dir_struct_elt_incr_update\
-mln_canvas_browsing_directional\
-mln_canvas_browsing_essential\
-mln_canvas_chamfer\
-mln_canvas_distance_geodesic\
-mln_canvas_all\
-mln_canvas_distance_front\
-mln_canvas_morpho_all\
-mln_canvas_morpho_algebraic_union_find\
-mln_canvas_morpho_essential\
-mln_canvas_essential\
-mln_metal_is_const\
-mln_metal_none\
-mln_metal_equal\
-mln_metal_unptr\
-mln_metal_not_equal\
-mln_metal_is_ref\
-mln_metal_ret\
-mln_metal_unqualif\
-mln_metal_is_not\
-mln_metal_vec\
-mln_metal_is\
-mln_metal_bool\
-mln_metal_all\
-mln_metal_math_pow\
-mln_metal_math_max\
-mln_metal_math_all\
-mln_metal_math_root\
-mln_metal_math_sqrt\
-mln_metal_mat\
-mln_metal_is_not_const\
-mln_metal_fix_return\
-mln_metal_ands\
-mln_metal_const\
-mln_metal_is_unqualif\
-mln_metal_unconst\
-mln_metal_bexpr\
-mln_metal_array2d\
-mln_metal_is_not_a\
-mln_metal_is_a\
-mln_metal_array1d\
-mln_metal_if\
-mln_metal_unref\
-mln_metal_array\
-mln_metal_ref\
-mln_metal_same_point\
-mln_metal_int\
-mln_metal_abort\
-mln_metal_same_coord\
-mln_metal_templated_by\
-mln_metal_has_neighborhood\
-mln_metal_goes_to\
-mln_metal_is_not_ref\
-mln_metal_converts_to\
-mln_metal_essential\
-mln_metal_array3d\
-mln_algebra_vec\
-mln_algebra_all\
-mln_algebra_h_vec\
-mln_algebra_mat\
-mln_algebra_h_mat\
-mln_algebra_quat\
-mln_algebra_essential\
-mln_linear_convolve_2x1d\
-mln_linear_all\
-mln_linear_ch_convolve\
-mln_linear_gaussian\
-mln_linear_convolve\
-mln_linear_sobel_2d\
-mln_linear_local_convolve\
-mln_linear_lap\
-mln_linear_convolve_directional\
-mln_linear_log\
-mln_linear_essential\
-mln_morpho_thinning\
-mln_morpho_meyer_wst\
-mln_morpho_opening\
-mln_morpho_includes\
-mln_morpho_elementary_opening\
-mln_morpho_elementary_gradient_internal\
-mln_morpho_elementary_dilation\
-mln_morpho_elementary_laplacian\
-mln_morpho_elementary_all\
-mln_morpho_elementary_gradient_external\
-mln_morpho_elementary_like_ero_fun\
-mln_morpho_elementary_gradient\
-mln_morpho_elementary_like_ero_set\
-mln_morpho_elementary_closing\
-mln_morpho_elementary_top_hat\
-mln_morpho_elementary_erosion\
-mln_morpho_elementary_essential\
-mln_morpho_thin_fit\
-mln_morpho_skeleton_constrained\
-mln_morpho_complementation\
-mln_morpho_line_gradient\
-mln_morpho_hit_or_miss\
-mln_morpho_closing_height\
-mln_morpho_plus\
-mln_morpho_general\
-mln_morpho_internal_elementary\
-mln_morpho_contrast\
-mln_morpho_opening_area\
-mln_morpho_opening_height\
-mln_morpho_thickening\
-mln_morpho_dilation\
-mln_morpho_laplacian\
-mln_morpho_all\
-mln_morpho_opening_attribute\
-mln_morpho_opening_volume\
-mln_morpho_closing_area_on_vertices\
-mln_morpho_closing_volume\
-mln_morpho_minus\
-mln_morpho_gradient\
-mln_morpho_tree_max\
-mln_morpho_tree_compute_parent\
-mln_morpho_tree_all\
-mln_morpho_tree_utils\
-mln_morpho_tree_data\
-mln_morpho_tree_compute_attribute_image\
-mln_morpho_opening_area_on_vertices\
-mln_morpho_min\
-mln_morpho_closing\
-mln_morpho_top_hat\
-mln_morpho_erosion\
-mln_morpho_Rd\
-mln_morpho_closing_area\
-mln_morpho_thick_miss\
-mln_morpho_closing_attribute\
-mln_morpho_rank_filter\
-mln_morpho_essential\
-mln_topo_n_face_iter\
-mln_topo_face_iter\
-mln_topo_is_simple_2d\
-mln_topo_centered_iter_adapter\
-mln_topo_internal_complex_set_iterator_base\
-mln_topo_internal_complex_iterator_base\
-mln_topo_internal_complex_relative_iterator_base\
-mln_topo_internal_complex_relative_iterator_sequence\
-mln_topo_algebraic_n_face\
-mln_topo_attic_faces_iter\
-mln_topo_adj_lower_dim_connected_n_face_iter\
-mln_topo_n_face\
-mln_topo_adj_lower_higher_face_iter\
-mln_topo_all\
-mln_topo_face_data\
-mln_topo_static_n_face_iter\
-mln_topo_face\
-mln_topo_adj_m_face_iter\
-mln_topo_complex\
-mln_topo_adj_higher_face_iter\
-mln_topo_adj_lower_face_iter\
-mln_topo_complex_iterators\
-mln_topo_center_only_iter\
-mln_topo_adj_higher_dim_connected_n_face_iter\
-mln_topo_algebraic_face\
-mln_topo_n_faces_set\
-mln_topo_essential\
-mln_essential_1d\
-mln_essential_routine\
-mln_essential_3d\
-mln_essential_2d\
-mln_win_inter\
-mln_win_backdiag2d\
-mln_win_segment1d\
-mln_win_cuboid3d\
-mln_win_vline2d\
-mln_win_octagon2d\
-mln_win_all\
-mln_win_multiple_size\
-mln_win_cube3d\
-mln_win_shift\
-mln_win_sym\
-mln_win_diff\
-mln_win_multiple\
-mln_win_diag2d\
-mln_win_disk2d\
-mln_win_rectangle2d\
-mln_win_hline2d\
-mln_win_line\
-mln_win_essential\
-mln_core_clock_neighb\
-mln_core_pixter2d\
-mln_core_def_low_quant_nbits\
-mln_core_def_all\
-mln_core_def_coordf\
-mln_core_def_coord\
-mln_core_def_essential\
-mln_core_site_set_box\
-mln_core_site_set_p_vertices\
-mln_core_site_set_p_vaccess\
-mln_core_site_set_p_if_piter\
-mln_core_site_set_p_run_piter\
-mln_core_site_set_p_key\
-mln_core_site_set_p_double\
-mln_core_site_set_p_complex_piter\
-mln_core_site_set_p_complex\
-mln_core_site_set_p_image\
-mln_core_site_set_attic_p_complex_faces_piter\
-mln_core_site_set_attic_p_faces_piter\
-mln_core_site_set_p_priority\
-mln_core_site_set_p_set_of\
-mln_core_site_set_all\
-mln_core_site_set_p_edges\
-mln_core_site_set_box_piter\
-mln_core_site_set_p_faces\
-mln_core_site_set_p_set\
-mln_core_site_set_p_queue\
-mln_core_site_set_p_if\
-mln_core_site_set_operators\
-mln_core_site_set_p_mutable_array_of\
-mln_core_site_set_p_edges_psite\
-mln_core_site_set_complex_psite\
-mln_core_site_set_p_run\
-mln_core_site_set_p_n_faces_piter\
-mln_core_site_set_p_centered\
-mln_core_site_set_p_bgraph\
-mln_core_site_set_p_bgraph_piter\
-mln_core_site_set_p_array\
-mln_core_site_set_p_vertices_psite\
-mln_core_site_set_p_line2d\
-mln_core_site_set_p_queue_fast\
-mln_core_site_set_p_graph_piter\
-mln_core_site_set_essential\
-mln_core_dpsites_piter\
-mln_core_w_window\
-mln_core_grids\
-mln_core_dpoints_pixter\
-mln_core_internal_graph_psite_base\
-mln_core_internal_run_image\
-mln_core_internal_pixel_impl\
-mln_core_internal_site_set_base\
-mln_core_internal_image_value_morpher\
-mln_core_internal_site_iterator_base\
-mln_core_internal_complex_neighborhood_base\
-mln_core_internal_site_relative_iterator_base\
-mln_core_internal_site_set_impl\
-mln_core_internal_exact\
-mln_core_internal_p_complex_piter_base\
-mln_core_internal_neighb_niter_impl\
-mln_core_internal_pixel_iterator_base\
-mln_core_internal_classical_window_base\
-mln_core_internal_data\
-mln_core_internal_force_exact\
-mln_core_internal_image_base\
-mln_core_internal_check_image_fastest\
-mln_core_internal_check_image_all\
-mln_core_internal_fixme\
-mln_core_internal_morpher_lvalue\
-mln_core_internal_image_domain_morpher\
-mln_core_internal_image_primary\
-mln_core_internal_set_of\
-mln_core_internal_complex_window_p_base\
-mln_core_internal_graph_window_base\
-mln_core_internal_piter_adaptor\
-mln_core_internal_weighted_window_base\
-mln_core_internal_neighborhood_base\
-mln_core_internal_image_morpher\
-mln_core_internal_coord_impl\
-mln_core_internal_geom_bbox\
-mln_core_internal_image_identity\
-mln_core_internal_pseudo_site_base\
-mln_core_internal_window_base\
-mln_core_internal_box_impl\
-mln_core_internal_site_set_iterator_base\
-mln_core_contract\
-mln_core_all\
-mln_core_point\
-mln_core_neighb\
-mln_core_routine_initialize\
-mln_core_routine_primary\
-mln_core_routine_init\
-mln_core_routine_ops\
-mln_core_routine_all\
-mln_core_routine_clone\
-mln_core_routine_exact\
-mln_core_routine_extend\
-mln_core_routine_essential\
-mln_core_trait_op_mult\
-mln_core_trait_all\
-mln_core_trait_pixter\
-mln_core_trait_qlf_value\
-mln_core_trait_essential\
-mln_core_pixter1d\
-mln_core_category\
-mln_core_macros\
-mln_core_box_runstart_piter\
-mln_core_tags\
-mln_core_dpoint\
-mln_core_alias_dpoint2d_h\
-mln_core_alias_p_run2d\
-mln_core_alias_point3d\
-mln_core_alias_neighb3d\
-mln_core_alias_window3d\
-mln_core_alias_neighb2d\
-mln_core_alias_complex_image\
-mln_core_alias_w_window1d_float\
-mln_core_alias_neighb1d\
-mln_core_alias_w_window2d_float\
-mln_core_alias_w_window2d_int\
-mln_core_alias_box1d\
-mln_core_alias_box2d\
-mln_core_alias_window1d\
-mln_core_alias_point1d\
-mln_core_alias_box3d\
-mln_core_alias_dpoint3d\
-mln_core_alias_complex_geometry\
-mln_core_alias_w_window3d_float\
-mln_core_alias_box2d_h\
-mln_core_alias_point2d\
-mln_core_alias_window2d\
-mln_core_alias_p_runs2d\
-mln_core_alias_point3df\
-mln_core_alias_dpoint1d\
-mln_core_alias_w_window3d_int\
-mln_core_alias_dpoint2d\
-mln_core_alias_w_window1d_int\
-mln_core_alias_point2d_h\
-mln_core_window\
-mln_core_concept_site_proxy\
-mln_core_concept_point_site\
-mln_core_concept_box\
-mln_core_concept_generalized_pixel\
-mln_core_concept_graph\
-mln_core_concept_iterator\
-mln_core_concept_doc_point_site\
-mln_core_concept_doc_box\
-mln_core_concept_doc_generalized_pixel\
-mln_core_concept_doc_iterator\
-mln_core_concept_doc_image_fastest\
-mln_core_concept_doc_image\
-mln_core_concept_doc_value_set\
-mln_core_concept_doc_weighted_window\
-mln_core_concept_doc_pixel_iterator\
-mln_core_concept_doc_value_iterator\
-mln_core_concept_doc_dpoint\
-mln_core_concept_doc_window\
-mln_core_concept_doc_accumulator\
-mln_core_concept_doc_site_set\
-mln_core_concept_doc_object\
-mln_core_concept_doc_neighborhood\
-mln_core_concept_doc_point_iterator\
-mln_core_concept_pseudo_site\
-mln_core_concept_image\
-mln_core_concept_value_set\
-mln_core_concept_proxy\
-mln_core_concept_site\
-mln_core_concept_weighted_window\
-mln_core_concept_all\
-mln_core_concept_gpoint\
-mln_core_concept_site_iterator\
-mln_core_concept_point\
-mln_core_concept_literal\
-mln_core_concept_pixel_iterator\
-mln_core_concept_value_iterator\
-mln_core_concept_meta_accumulator\
-mln_core_concept_gdpoint\
-mln_core_concept_regular_grid\
-mln_core_concept_mesh\
-mln_core_concept_dpoint\
-mln_core_concept_function\
-mln_core_concept_window\
-mln_core_concept_value\
-mln_core_concept_accumulator\
-mln_core_concept_site_set\
-mln_core_concept_object\
-mln_core_concept_delta_point_site\
-mln_core_concept_neighborhood\
-mln_core_concept_browsing\
-mln_core_pixel\
-mln_core_clock_neighb2d\
-mln_core_pixter3d\
-mln_core_image_obased_rle_encode\
-mln_core_image_plain\
-mln_core_image_graph_image\
-mln_core_image_image3d\
-mln_core_image_decorated_image\
-mln_core_image_extension_ima\
-mln_core_image_flat_image\
-mln_core_image_complex_neighborhood_piter\
-mln_core_image_tr_mesh\
-mln_core_image_graph_elt_window\
-mln_core_image_obased_rle_image\
-mln_core_image_mono_obased_rle_image\
-mln_core_image_interpolated\
-mln_core_image_lazy_image\
-mln_core_image_t_image\
-mln_core_image_hexa_piter\
-mln_core_image_value_enc_image\
-mln_core_image_sub_image_if\
-mln_core_image_all\
-mln_core_image_mono_rle_image\
-mln_core_image_complex_image\
-mln_core_image_cast_image\
-mln_core_image_rle_encode\
-mln_core_image_complex_window_piter\
-mln_core_image_tr_image\
-mln_core_image_sub_image\
-mln_core_image_rle_image\
-mln_core_image_line_graph_elt_window\
-mln_core_image_mono_rle_encode\
-mln_core_image_bgraph_psite\
-mln_core_image_sparse_image\
-mln_core_image_bgraph_image\
-mln_core_image_complex_neighborhoods\
-mln_core_image_graph_window_piter\
-mln_core_image_sparse_encode\
-mln_core_image_safe\
-mln_core_image_extension_fun\
-mln_core_image_image1d\
-mln_core_image_extension_val\
-mln_core_image_image_if\
-mln_core_image_hexa\
-mln_core_image_extended\
-mln_core_image_image2d_h\
-mln_core_image_image2d\
-mln_core_image_ch_piter\
-mln_core_image_complex_windows\
-mln_core_image_fi_adaptor\
-mln_core_image_mono_obased_rle_encode\
-mln_core_image_line_graph_image\
-mln_core_image_value_encode\
-mln_core_image_essential\
-mln_core_a_point_of\
-mln_core_var\
-mln_core_essential\
-mln_core_faces_psite\
-mln_labeling_blobs\
-mln_labeling_background\
-mln_labeling_relabel\
-mln_labeling_all\
-mln_labeling_level\
-mln_labeling_flat_zones\
-mln_labeling_foreground\
-mln_labeling_regional_maxima\
-mln_labeling_compute\
-mln_labeling_regional_minima\
-mln_labeling_essential\
-mln_test_predicate\
-mln_test_all\
-mln_test_positive\
-mln_test_essential\
-mln_transform_distance_geodesic\
-mln_transform_internal_all\
-mln_transform_internal_distance_functor\
-mln_transform_internal_influence_zone_functor\
-mln_transform_all\
-mln_transform_influence_zone_front\
-mln_transform_distance_front\
-mln_transform_influence_zone_geodesic\
-mln_transform_essential\
-mln_arith_includes\
-mln_arith_plus\
-mln_arith_all\
-mln_arith_times\
-mln_arith_diff_abs\
-mln_arith_minus\
-mln_arith_min\
-mln_arith_revert\
-mln_arith_essential\
-mln_io_pgm_load\
-mln_io_pgm_all\
-mln_io_pgm_save\
-mln_io_ppm_load\
-mln_io_ppm_all\
-mln_io_ppm_save\
-mln_io_pfm_load\
-mln_io_pfm_all\
-mln_io_pfm_save\
-mln_io_all\
-mln_io_pbm_load\
-mln_io_pbm_all\
-mln_io_pbm_save\
-mln_io_pnm_max_component\
-mln_io_pnm_load\
-mln_io_pnm_load_header\
-mln_io_pnm_all\
-mln_io_pnm_macros\
-mln_io_pnm_save\
-mln_io_pnm_save_header\
-mln_io_txt_all\
-mln_io_txt_save\
-mln_io_abort\
-mln_io_fits_load\
-mln_io_fits_all\
-mln_io_off_load\
-mln_io_off_all\
-mln_io_off_save\
-mln_io_essential\
-mln_logical_includes\
-mln_logical_and_not\
-mln_logical_xor\
-mln_logical_all\
-mln_logical_not\
-mln_logical_and\
-mln_logical_or\
-mln_logical_essential\
-mln_norm_all\
-mln_norm_l1\
-mln_norm_l2\
-mln_norm_linfty\
-mln_norm_essential\
-mln_debug_iota\
-mln_debug_all\
-mln_debug_println_with_border\
-mln_debug_colorize\
-mln_debug_draw_graph\
-mln_debug_put_word\
-mln_debug_format\
-mln_debug_println\
-mln_debug_essential\
-mln_estim_min_max\
-mln_estim_all\
-mln_estim_sum\
-mln_estim_mean\
-mln_estim_essential\
-mln_set_uni\
-mln_set_inter\
-mln_set_all\
-mln_set_get\
-mln_set_sym_diff\
-mln_set_has\
-mln_set_diff\
-mln_set_compute\
-mln_set_essential\
-mln_border_adjust\
-mln_border_duplicate\
-mln_border_find\
-mln_border_thickness\
-mln_border_all\
-mln_border_mirror\
-mln_border_get\
-mln_border_equalize\
-mln_border_resize\
-mln_border_fill\
-mln_border_essential\
-mln_subsampling_gaussian_subsampling\
-mln_subsampling_all\
-mln_subsampling_subsampling\
+check_PROGRAMS = \
+mln_histo_all \
+mln_histo_data \
+mln_histo_compute \
+mln_histo_essential \
+mln_geom_pmin_pmax \
+mln_geom_max_row \
+mln_geom_chamfer \
+mln_geom_min_row \
+mln_geom_seeds2tiling \
+mln_geom_size1d \
+mln_geom_all \
+mln_geom_size2d \
+mln_geom_max_ind \
+mln_geom_max_col \
+mln_geom_size3d \
+mln_geom_ninds \
+mln_geom_nslis \
+mln_geom_delta \
+mln_geom_resize \
+mln_geom_nsites \
+mln_geom_min_col \
+mln_geom_complex_geometry \
+mln_geom_ncols \
+mln_geom_nrows \
+mln_geom_min_ind \
+mln_geom_bbox \
+mln_geom_seeds2tiling_roundness \
+mln_geom_min_sli \
+mln_geom_essential \
+mln_geom_max_sli \
+mln_draw_box \
+mln_draw_all \
+mln_draw_plot \
+mln_draw_line \
+mln_draw_essential \
+mln_pw_image \
+mln_pw_all \
+mln_pw_value \
+mln_pw_cst \
+mln_pw_var \
+mln_pw_essential \
+mln_literal_zero \
+mln_literal_ops \
+mln_literal_origin \
+mln_literal_grays \
+mln_literal_all \
+mln_literal_colors \
+mln_literal_black \
+mln_literal_one \
+mln_literal_white \
+mln_literal_essential \
+mln_registration_get_rtransf \
+mln_registration_internal_rms \
+mln_registration_get_rot \
+mln_registration_all \
+mln_registration_multiscale \
+mln_registration_registration \
+mln_registration_essential \
+mln_registration_icp \
+mln_util_graph \
+mln_util_max \
+mln_util_lazy_set \
+mln_util_set \
+mln_util_tree_to_image \
+mln_util_lemmings \
+mln_util_greater_point \
+mln_util_internal_graph_iter_base \
+mln_util_internal_boost_graph_access \
+mln_util_internal_boost_graph_structure \
+mln_util_internal_graph_iter \
+mln_util_internal_graph_nbh_iter \
+mln_util_internal_vertex_impl \
+mln_util_internal_edge_impl \
+mln_util_internal_graph_base \
+mln_util_internal_boost_graph \
+mln_util_internal_graph_nbh_iter_base \
+mln_util_internal_boost_graph_property \
+mln_util_ord_pair \
+mln_util_edge \
+mln_util_all \
+mln_util_dindex \
+mln_util_tracked_ptr \
+mln_util_ignore \
+mln_util_greater_psite \
+mln_util_timer \
+mln_util_yes \
+mln_util_line_graph \
+mln_util_ord \
+mln_util_tree_fast_to_image \
+mln_util_tree \
+mln_util_index \
+mln_util_multi_site \
+mln_util_branch_iter \
+mln_util_branch_iter_ind \
+mln_util_tree_to_fast \
+mln_util_array \
+mln_util_vertex \
+mln_util_pix \
+mln_util_tree_fast \
+mln_util_site_pair \
+mln_util_nil \
+mln_util_eat \
+mln_util_essential \
+mln_tag_init \
+mln_tag_skeleton \
+mln_tag_all \
+mln_tag_essential \
+mln_trace_entering \
+mln_trace_all \
+mln_trace_warning \
+mln_trace_exiting \
+mln_trace_resume \
+mln_trace_quiet \
+mln_trace_stop \
+mln_trace_essential \
+mln_make_graph \
+mln_make_double_neighb2d \
+mln_make_dpoint2d_h \
+mln_make_w_window \
+mln_make_image \
+mln_make_vec \
+mln_make_all \
+mln_make_dual_neighb \
+mln_make_w_window3d \
+mln_make_mat \
+mln_make_win_chamfer \
+mln_make_w_window2d_int \
+mln_make_box1d \
+mln_make_voronoi \
+mln_make_box2d \
+mln_make_w_window2d \
+mln_make_box3d \
+mln_make_relabelfun \
+mln_make_pixel \
+mln_make_pix \
+mln_make_box2d_h \
+mln_make_w_window1d \
+mln_make_image2d \
+mln_make_w_window_directional \
+mln_make_w_window3d_int \
+mln_make_essential \
+mln_make_w_window1d_int \
+mln_make_point2d_h \
+mln_display_all \
+mln_display_essential \
+mln_extension_adjust \
+mln_extension_duplicate \
+mln_extension_adjust_duplicate \
+mln_extension_all \
+mln_extension_adjust_fill \
+mln_extension_fill \
+mln_extension_essential \
+mln_fun_p2b_chess \
+mln_fun_p2b_all \
+mln_fun_p2b_has \
+mln_fun_p2b_big_chess \
+mln_fun_p2b_essential \
+mln_fun_p2p_mirror \
+mln_fun_x2p_closest_point \
+mln_fun_x2p_all \
+mln_fun_x2p_essential \
+mln_fun_ops \
+mln_fun_c \
+mln_fun_vv2v_max \
+mln_fun_vv2v_lor \
+mln_fun_vv2v_land_not \
+mln_fun_vv2v_vec \
+mln_fun_vv2v_all \
+mln_fun_vv2v_macros \
+mln_fun_vv2v_lxor \
+mln_fun_vv2v_diff_abs \
+mln_fun_vv2v_land \
+mln_fun_vv2v_min \
+mln_fun_vv2v_essential \
+mln_fun_internal_array_base \
+mln_fun_internal_x2x_linear_impl \
+mln_fun_internal_selector \
+mln_fun_p2v_ternary \
+mln_fun_p2v_iota \
+mln_fun_p2v_elifs \
+mln_fun_p2v_all \
+mln_fun_p2v_essential \
+mln_fun_all \
+mln_fun_v2b_lnot \
+mln_fun_v2b_all \
+mln_fun_v2b_threshold \
+mln_fun_v2b_essential \
+mln_fun_v2v_norm \
+mln_fun_v2v_linear \
+mln_fun_v2v_id \
+mln_fun_v2v_saturate \
+mln_fun_v2v_inc \
+mln_fun_v2v_all \
+mln_fun_v2v_dec \
+mln_fun_v2v_abs \
+mln_fun_v2v_cast \
+mln_fun_v2v_rgb_to_hsi \
+mln_fun_v2v_enc \
+mln_fun_v2v_convert \
+mln_fun_v2v_essential \
+mln_fun_cast \
+mln_fun_i2v_all \
+mln_fun_i2v_array \
+mln_fun_i2v_all_to \
+mln_fun_i2v_essential \
+mln_fun_l2l_relabel \
+mln_fun_l2l_all \
+mln_fun_l2l_essential \
+mln_fun_x2x_composed \
+mln_fun_x2x_all \
+mln_fun_x2x_translation \
+mln_fun_x2x_rotation \
+mln_fun_x2x_essential \
+mln_fun_x2v_linear \
+mln_fun_x2v_bilinear \
+mln_fun_x2v_all \
+mln_fun_x2v_l1_norm \
+mln_fun_x2v_nneighbor \
+mln_fun_x2v_essential \
+mln_fun_essential \
+mln_all \
+mln_convert_to_p_set \
+mln_convert_to \
+mln_convert_to_upper_window \
+mln_convert_to_image \
+mln_convert_to_fun \
+mln_convert_all \
+mln_convert_to_window \
+mln_convert_from_to \
+mln_convert_impl_from_value_to_value \
+mln_convert_impl_all \
+mln_convert_impl_from_image_to_site_set \
+mln_convert_to_dpoint \
+mln_convert_to_p_array \
+mln_convert_to_rgb \
+mln_convert_essential \
+mln_value_float01_f \
+mln_value_float01_16 \
+mln_value_lut_vec \
+mln_value_glf \
+mln_value_other \
+mln_value_graylevel_f \
+mln_value_aliases \
+mln_value_label_16 \
+mln_value_ops \
+mln_value_set \
+mln_value_int_u_sat \
+mln_value_float01_8 \
+mln_value_int_u8 \
+mln_value_equiv \
+mln_value_internal_integer \
+mln_value_internal_gray_f \
+mln_value_internal_all \
+mln_value_internal_value_like \
+mln_value_internal_iterable_set \
+mln_value_internal_encoding \
+mln_value_internal_convert \
+mln_value_internal_gray_ \
+mln_value_internal_essential \
+mln_value_proxy \
+mln_value_viter \
+mln_value_graylevel \
+mln_value_all \
+mln_value_super_value \
+mln_value_builtin_symbolics \
+mln_value_builtin_ops \
+mln_value_builtin_all \
+mln_value_builtin_promotions \
+mln_value_builtin_integers \
+mln_value_builtin_floatings \
+mln_value_builtin_essential \
+mln_value_sign \
+mln_value_hsi \
+mln_value_interval \
+mln_value_gl16 \
+mln_value_scalar \
+mln_value_float01 \
+mln_value_cast \
+mln_value_int_u \
+mln_value_int_s8 \
+mln_value_int_s16 \
+mln_value_int_u16 \
+mln_value_label \
+mln_value_rgb \
+mln_value_stack \
+mln_value_concept_integer \
+mln_value_concept_structured \
+mln_value_concept_built_in \
+mln_value_concept_all \
+mln_value_concept_scalar \
+mln_value_concept_data \
+mln_value_concept_floating \
+mln_value_concept_symbolic \
+mln_value_concept_vectorial \
+mln_value_concept_essential \
+mln_value_int_s \
+mln_value_rgb8 \
+mln_value_int_s32 \
+mln_value_float01_ \
+mln_value_rgb16 \
+mln_value_int_u32 \
+mln_value_gl8 \
+mln_value_label_8 \
+mln_value_essential \
+mln_accu_tuple \
+mln_accu_min_h \
+mln_accu_max \
+mln_accu_lor \
+mln_accu_rank \
+mln_accu_transform_stop \
+mln_accu_maj_h \
+mln_accu_min_max \
+mln_accu_internal_base \
+mln_accu_transform_snake \
+mln_accu_rank_high_quant \
+mln_accu_count \
+mln_accu_median_h \
+mln_accu_all \
+mln_accu_land_basic \
+mln_accu_p \
+mln_accu_transform \
+mln_accu_median_alt \
+mln_accu_volume \
+mln_accu_sum \
+mln_accu_height \
+mln_accu_land \
+mln_accu_take \
+mln_accu_histo \
+mln_accu_pair \
+mln_accu_count_adjacent_vertices \
+mln_accu_convolve \
+mln_accu_v \
+mln_accu_rank_bool \
+mln_accu_min \
+mln_accu_transform_directional \
+mln_accu_compute \
+mln_accu_mean \
+mln_accu_lor_basic \
+mln_accu_transform_diagonal \
+mln_accu_nil \
+mln_accu_bbox \
+mln_accu_center \
+mln_accu_line \
+mln_accu_essential \
+mln_accu_max_h \
+mln_level_compare \
+mln_level_memset_ \
+mln_level_transform_inplace \
+mln_level_replace \
+mln_level_memcpy_ \
+mln_level_apply \
+mln_level_approx_all \
+mln_level_approx_essential \
+mln_level_approx_median \
+mln_level_saturate \
+mln_level_all \
+mln_level_paste \
+mln_level_fast_median \
+mln_level_abs \
+mln_level_fill_with_image \
+mln_level_transform \
+mln_level_fill_with_value \
+mln_level_stretch \
+mln_level_was_median \
+mln_level_compute \
+mln_level_convert \
+mln_level_to_enc \
+mln_level_naive_all \
+mln_level_naive_essential \
+mln_level_naive_median \
+mln_level_sort_psites \
+mln_level_update \
+mln_level_fill \
+mln_level_essential \
+mln_level_assign \
+mln_level_median \
+mln_math_jacobi \
+mln_math_max \
+mln_math_sqr \
+mln_math_all \
+mln_math_sign \
+mln_math_abs \
+mln_math_diff_abs \
+mln_math_round \
+mln_math_min \
+mln_math_sqrt \
+mln_math_essential \
+mln_math_round_sat \
+mln_binarization_includes \
+mln_binarization_all \
+mln_binarization_binarization \
+mln_binarization_threshold \
+mln_binarization_essential \
+mln_trait_site_set_props \
+mln_trait_site_set_print \
+mln_trait_promote \
+mln_trait_solve_binary \
+mln_trait_value_ \
+mln_trait_all \
+mln_trait_value_all \
+mln_trait_value_nature \
+mln_trait_value_quant \
+mln_trait_value_kind \
+mln_trait_value_print \
+mln_trait_value_essential \
+mln_trait_images \
+mln_trait_window_props \
+mln_trait_window_print \
+mln_trait_ch_value \
+mln_trait_solve \
+mln_trait_solve_unary \
+mln_trait_op_postdec \
+mln_trait_op_mod \
+mln_trait_op_lor \
+mln_trait_op_neq \
+mln_trait_op_plus \
+mln_trait_op_xor \
+mln_trait_op_all \
+mln_trait_op_geq \
+mln_trait_op_uminus \
+mln_trait_op_not \
+mln_trait_op_times \
+mln_trait_op_less \
+mln_trait_op_decl \
+mln_trait_op_ord \
+mln_trait_op_and \
+mln_trait_op_or \
+mln_trait_op_predec \
+mln_trait_op_minus \
+mln_trait_op_div \
+mln_trait_op_leq \
+mln_trait_op_preinc \
+mln_trait_op_greater \
+mln_trait_op_postinc \
+mln_trait_op_uplus \
+mln_trait_op_essential \
+mln_trait_op_eq \
+mln_trait_concrete \
+mln_trait_windows \
+mln_trait_site_sets \
+mln_trait_image_from_grid \
+mln_trait_undef \
+mln_trait_image_props \
+mln_trait_image_print \
+mln_trait_neighborhood \
+mln_trait_essential \
+mln_canvas_labeling \
+mln_canvas_browsing_hyper_directional \
+mln_canvas_browsing_snake_generic \
+mln_canvas_browsing_backdiagonal2d \
+mln_canvas_browsing_snake_vert \
+mln_canvas_browsing_snake_fwd \
+mln_canvas_browsing_all \
+mln_canvas_browsing_diagonal2d \
+mln_canvas_browsing_fwd \
+mln_canvas_browsing_dir_struct_elt_incr_update \
+mln_canvas_browsing_directional \
+mln_canvas_browsing_essential \
+mln_canvas_chamfer \
+mln_canvas_distance_geodesic \
+mln_canvas_all \
+mln_canvas_distance_front \
+mln_canvas_morpho_all \
+mln_canvas_morpho_algebraic_union_find \
+mln_canvas_morpho_essential \
+mln_canvas_essential \
+mln_metal_is_const \
+mln_metal_none \
+mln_metal_equal \
+mln_metal_unptr \
+mln_metal_not_equal \
+mln_metal_is_ref \
+mln_metal_ret \
+mln_metal_unqualif \
+mln_metal_is_not \
+mln_metal_vec \
+mln_metal_is \
+mln_metal_bool \
+mln_metal_all \
+mln_metal_math_pow \
+mln_metal_math_max \
+mln_metal_math_all \
+mln_metal_math_root \
+mln_metal_math_sqrt \
+mln_metal_mat \
+mln_metal_is_not_const \
+mln_metal_fix_return \
+mln_metal_ands \
+mln_metal_const \
+mln_metal_is_unqualif \
+mln_metal_unconst \
+mln_metal_bexpr \
+mln_metal_array2d \
+mln_metal_is_not_a \
+mln_metal_is_a \
+mln_metal_array1d \
+mln_metal_if \
+mln_metal_unref \
+mln_metal_array \
+mln_metal_ref \
+mln_metal_same_point \
+mln_metal_int \
+mln_metal_abort \
+mln_metal_same_coord \
+mln_metal_templated_by \
+mln_metal_has_neighborhood \
+mln_metal_goes_to \
+mln_metal_is_not_ref \
+mln_metal_converts_to \
+mln_metal_essential \
+mln_metal_array3d \
+mln_algebra_vec \
+mln_algebra_all \
+mln_algebra_h_vec \
+mln_algebra_mat \
+mln_algebra_h_mat \
+mln_algebra_quat \
+mln_algebra_essential \
+mln_linear_convolve_2x1d \
+mln_linear_all \
+mln_linear_ch_convolve \
+mln_linear_gaussian \
+mln_linear_convolve \
+mln_linear_sobel_2d \
+mln_linear_local_convolve \
+mln_linear_lap \
+mln_linear_convolve_directional \
+mln_linear_log \
+mln_linear_essential \
+mln_morpho_thinning \
+mln_morpho_meyer_wst \
+mln_morpho_opening \
+mln_morpho_includes \
+mln_morpho_elementary_opening \
+mln_morpho_elementary_gradient_internal \
+mln_morpho_elementary_dilation \
+mln_morpho_elementary_laplacian \
+mln_morpho_elementary_all \
+mln_morpho_elementary_gradient_external \
+mln_morpho_elementary_like_ero_fun \
+mln_morpho_elementary_gradient \
+mln_morpho_elementary_like_ero_set \
+mln_morpho_elementary_closing \
+mln_morpho_elementary_top_hat \
+mln_morpho_elementary_erosion \
+mln_morpho_elementary_essential \
+mln_morpho_thin_fit \
+mln_morpho_skeleton_constrained \
+mln_morpho_complementation \
+mln_morpho_line_gradient \
+mln_morpho_hit_or_miss \
+mln_morpho_closing_height \
+mln_morpho_plus \
+mln_morpho_general \
+mln_morpho_internal_elementary \
+mln_morpho_contrast \
+mln_morpho_opening_area \
+mln_morpho_opening_height \
+mln_morpho_thickening \
+mln_morpho_dilation \
+mln_morpho_laplacian \
+mln_morpho_all \
+mln_morpho_opening_attribute \
+mln_morpho_opening_volume \
+mln_morpho_closing_area_on_vertices \
+mln_morpho_closing_volume \
+mln_morpho_minus \
+mln_morpho_gradient \
+mln_morpho_tree_max \
+mln_morpho_tree_compute_parent \
+mln_morpho_tree_all \
+mln_morpho_tree_utils \
+mln_morpho_tree_data \
+mln_morpho_tree_compute_attribute_image \
+mln_morpho_opening_area_on_vertices \
+mln_morpho_min \
+mln_morpho_closing \
+mln_morpho_top_hat \
+mln_morpho_erosion \
+mln_morpho_Rd \
+mln_morpho_closing_area \
+mln_morpho_thick_miss \
+mln_morpho_closing_attribute \
+mln_morpho_rank_filter \
+mln_morpho_essential \
+mln_topo_n_face_iter \
+mln_topo_face_iter \
+mln_topo_is_simple_2d \
+mln_topo_centered_iter_adapter \
+mln_topo_internal_complex_set_iterator_base \
+mln_topo_internal_complex_iterator_base \
+mln_topo_internal_complex_relative_iterator_base \
+mln_topo_internal_complex_relative_iterator_sequence \
+mln_topo_algebraic_n_face \
+mln_topo_attic_faces_iter \
+mln_topo_adj_lower_dim_connected_n_face_iter \
+mln_topo_n_face \
+mln_topo_adj_lower_higher_face_iter \
+mln_topo_all \
+mln_topo_face_data \
+mln_topo_static_n_face_iter \
+mln_topo_face \
+mln_topo_adj_m_face_iter \
+mln_topo_complex \
+mln_topo_adj_higher_face_iter \
+mln_topo_adj_lower_face_iter \
+mln_topo_complex_iterators \
+mln_topo_center_only_iter \
+mln_topo_adj_higher_dim_connected_n_face_iter \
+mln_topo_algebraic_face \
+mln_topo_n_faces_set \
+mln_topo_essential \
+mln_essential_1d \
+mln_essential_routine \
+mln_essential_3d \
+mln_essential_2d \
+mln_win_inter \
+mln_win_backdiag2d \
+mln_win_segment1d \
+mln_win_cuboid3d \
+mln_win_vline2d \
+mln_win_octagon2d \
+mln_win_all \
+mln_win_multiple_size \
+mln_win_cube3d \
+mln_win_shift \
+mln_win_sym \
+mln_win_diff \
+mln_win_multiple \
+mln_win_diag2d \
+mln_win_disk2d \
+mln_win_rectangle2d \
+mln_win_hline2d \
+mln_win_line \
+mln_win_essential \
+mln_core_clock_neighb \
+mln_core_pixter2d \
+mln_core_def_low_quant_nbits \
+mln_core_def_all \
+mln_core_def_coordf \
+mln_core_def_coord \
+mln_core_def_essential \
+mln_core_site_set_box \
+mln_core_site_set_p_vertices \
+mln_core_site_set_p_vaccess \
+mln_core_site_set_p_if_piter \
+mln_core_site_set_p_run_piter \
+mln_core_site_set_p_key \
+mln_core_site_set_p_double \
+mln_core_site_set_p_complex_piter \
+mln_core_site_set_p_complex \
+mln_core_site_set_p_image \
+mln_core_site_set_attic_p_complex_faces_piter \
+mln_core_site_set_attic_p_faces_piter \
+mln_core_site_set_p_priority \
+mln_core_site_set_p_set_of \
+mln_core_site_set_all \
+mln_core_site_set_p_edges \
+mln_core_site_set_box_piter \
+mln_core_site_set_p_faces \
+mln_core_site_set_p_set \
+mln_core_site_set_p_queue \
+mln_core_site_set_p_if \
+mln_core_site_set_operators \
+mln_core_site_set_p_mutable_array_of \
+mln_core_site_set_p_edges_psite \
+mln_core_site_set_complex_psite \
+mln_core_site_set_p_run \
+mln_core_site_set_p_n_faces_piter \
+mln_core_site_set_p_centered \
+mln_core_site_set_p_bgraph \
+mln_core_site_set_p_bgraph_piter \
+mln_core_site_set_p_array \
+mln_core_site_set_p_vertices_psite \
+mln_core_site_set_p_line2d \
+mln_core_site_set_p_queue_fast \
+mln_core_site_set_p_graph_piter \
+mln_core_site_set_essential \
+mln_core_dpsites_piter \
+mln_core_w_window \
+mln_core_grids \
+mln_core_dpoints_pixter \
+mln_core_internal_graph_psite_base \
+mln_core_internal_run_image \
+mln_core_internal_pixel_impl \
+mln_core_internal_site_set_base \
+mln_core_internal_image_value_morpher \
+mln_core_internal_site_iterator_base \
+mln_core_internal_complex_neighborhood_base \
+mln_core_internal_site_relative_iterator_base \
+mln_core_internal_site_set_impl \
+mln_core_internal_exact \
+mln_core_internal_p_complex_piter_base \
+mln_core_internal_neighb_niter_impl \
+mln_core_internal_pixel_iterator_base \
+mln_core_internal_classical_window_base \
+mln_core_internal_data \
+mln_core_internal_force_exact \
+mln_core_internal_image_base \
+mln_core_internal_check_image_fastest \
+mln_core_internal_check_image_all \
+mln_core_internal_fixme \
+mln_core_internal_morpher_lvalue \
+mln_core_internal_image_domain_morpher \
+mln_core_internal_image_primary \
+mln_core_internal_set_of \
+mln_core_internal_complex_window_p_base \
+mln_core_internal_graph_window_base \
+mln_core_internal_piter_adaptor \
+mln_core_internal_weighted_window_base \
+mln_core_internal_neighborhood_base \
+mln_core_internal_image_morpher \
+mln_core_internal_coord_impl \
+mln_core_internal_geom_bbox \
+mln_core_internal_image_identity \
+mln_core_internal_pseudo_site_base \
+mln_core_internal_window_base \
+mln_core_internal_box_impl \
+mln_core_internal_site_set_iterator_base \
+mln_core_contract \
+mln_core_all \
+mln_core_point \
+mln_core_neighb \
+mln_core_routine_initialize \
+mln_core_routine_primary \
+mln_core_routine_init \
+mln_core_routine_ops \
+mln_core_routine_all \
+mln_core_routine_clone \
+mln_core_routine_exact \
+mln_core_routine_extend \
+mln_core_routine_essential \
+mln_core_trait_op_mult \
+mln_core_trait_all \
+mln_core_trait_pixter \
+mln_core_trait_qlf_value \
+mln_core_trait_essential \
+mln_core_pixter1d \
+mln_core_category \
+mln_core_macros \
+mln_core_box_runstart_piter \
+mln_core_tags \
+mln_core_dpoint \
+mln_core_alias_dpoint2d_h \
+mln_core_alias_p_run2d \
+mln_core_alias_point3d \
+mln_core_alias_neighb3d \
+mln_core_alias_window3d \
+mln_core_alias_neighb2d \
+mln_core_alias_complex_image \
+mln_core_alias_w_window1d_float \
+mln_core_alias_neighb1d \
+mln_core_alias_w_window2d_float \
+mln_core_alias_w_window2d_int \
+mln_core_alias_box1d \
+mln_core_alias_box2d \
+mln_core_alias_window1d \
+mln_core_alias_point1d \
+mln_core_alias_box3d \
+mln_core_alias_dpoint3d \
+mln_core_alias_complex_geometry \
+mln_core_alias_w_window3d_float \
+mln_core_alias_box2d_h \
+mln_core_alias_point2d \
+mln_core_alias_window2d \
+mln_core_alias_p_runs2d \
+mln_core_alias_point3df \
+mln_core_alias_dpoint1d \
+mln_core_alias_w_window3d_int \
+mln_core_alias_dpoint2d \
+mln_core_alias_w_window1d_int \
+mln_core_alias_point2d_h \
+mln_core_window \
+mln_core_concept_site_proxy \
+mln_core_concept_point_site \
+mln_core_concept_box \
+mln_core_concept_generalized_pixel \
+mln_core_concept_graph \
+mln_core_concept_iterator \
+mln_core_concept_doc_point_site \
+mln_core_concept_doc_box \
+mln_core_concept_doc_generalized_pixel \
+mln_core_concept_doc_iterator \
+mln_core_concept_doc_image_fastest \
+mln_core_concept_doc_image \
+mln_core_concept_doc_value_set \
+mln_core_concept_doc_weighted_window \
+mln_core_concept_doc_pixel_iterator \
+mln_core_concept_doc_value_iterator \
+mln_core_concept_doc_dpoint \
+mln_core_concept_doc_window \
+mln_core_concept_doc_accumulator \
+mln_core_concept_doc_site_set \
+mln_core_concept_doc_object \
+mln_core_concept_doc_neighborhood \
+mln_core_concept_doc_point_iterator \
+mln_core_concept_pseudo_site \
+mln_core_concept_image \
+mln_core_concept_value_set \
+mln_core_concept_proxy \
+mln_core_concept_site \
+mln_core_concept_weighted_window \
+mln_core_concept_all \
+mln_core_concept_gpoint \
+mln_core_concept_site_iterator \
+mln_core_concept_point \
+mln_core_concept_literal \
+mln_core_concept_pixel_iterator \
+mln_core_concept_value_iterator \
+mln_core_concept_meta_accumulator \
+mln_core_concept_gdpoint \
+mln_core_concept_regular_grid \
+mln_core_concept_mesh \
+mln_core_concept_dpoint \
+mln_core_concept_function \
+mln_core_concept_window \
+mln_core_concept_value \
+mln_core_concept_accumulator \
+mln_core_concept_site_set \
+mln_core_concept_object \
+mln_core_concept_delta_point_site \
+mln_core_concept_neighborhood \
+mln_core_concept_browsing \
+mln_core_pixel \
+mln_core_clock_neighb2d \
+mln_core_pixter3d \
+mln_core_image_obased_rle_encode \
+mln_core_image_plain \
+mln_core_image_graph_image \
+mln_core_image_image3d \
+mln_core_image_decorated_image \
+mln_core_image_extension_ima \
+mln_core_image_flat_image \
+mln_core_image_complex_neighborhood_piter \
+mln_core_image_tr_mesh \
+mln_core_image_graph_elt_window \
+mln_core_image_obased_rle_image \
+mln_core_image_mono_obased_rle_image \
+mln_core_image_interpolated \
+mln_core_image_lazy_image \
+mln_core_image_t_image \
+mln_core_image_hexa_piter \
+mln_core_image_value_enc_image \
+mln_core_image_sub_image_if \
+mln_core_image_all \
+mln_core_image_mono_rle_image \
+mln_core_image_complex_image \
+mln_core_image_cast_image \
+mln_core_image_rle_encode \
+mln_core_image_complex_window_piter \
+mln_core_image_tr_image \
+mln_core_image_sub_image \
+mln_core_image_rle_image \
+mln_core_image_line_graph_elt_window \
+mln_core_image_mono_rle_encode \
+mln_core_image_bgraph_psite \
+mln_core_image_sparse_image \
+mln_core_image_bgraph_image \
+mln_core_image_complex_neighborhoods \
+mln_core_image_graph_window_piter \
+mln_core_image_sparse_encode \
+mln_core_image_safe \
+mln_core_image_extension_fun \
+mln_core_image_image1d \
+mln_core_image_extension_val \
+mln_core_image_image_if \
+mln_core_image_hexa \
+mln_core_image_extended \
+mln_core_image_image2d_h \
+mln_core_image_image2d \
+mln_core_image_ch_piter \
+mln_core_image_complex_windows \
+mln_core_image_fi_adaptor \
+mln_core_image_mono_obased_rle_encode \
+mln_core_image_line_graph_image \
+mln_core_image_value_encode \
+mln_core_image_essential \
+mln_core_a_point_of \
+mln_core_var \
+mln_core_essential \
+mln_core_faces_psite \
+mln_labeling_blobs \
+mln_labeling_background \
+mln_labeling_relabel \
+mln_labeling_all \
+mln_labeling_level \
+mln_labeling_flat_zones \
+mln_labeling_foreground \
+mln_labeling_regional_maxima \
+mln_labeling_compute \
+mln_labeling_regional_minima \
+mln_labeling_essential \
+mln_test_predicate \
+mln_test_all \
+mln_test_positive \
+mln_test_essential \
+mln_transform_distance_geodesic \
+mln_transform_internal_all \
+mln_transform_internal_distance_functor \
+mln_transform_internal_influence_zone_functor \
+mln_transform_all \
+mln_transform_influence_zone_front \
+mln_transform_distance_front \
+mln_transform_influence_zone_geodesic \
+mln_transform_essential \
+mln_arith_includes \
+mln_arith_plus \
+mln_arith_all \
+mln_arith_times \
+mln_arith_diff_abs \
+mln_arith_minus \
+mln_arith_min \
+mln_arith_revert \
+mln_arith_essential \
+mln_io_pgm_load \
+mln_io_pgm_all \
+mln_io_pgm_save \
+mln_io_ppm_load \
+mln_io_ppm_all \
+mln_io_ppm_save \
+mln_io_pfm_load \
+mln_io_pfm_all \
+mln_io_pfm_save \
+mln_io_all \
+mln_io_pbm_load \
+mln_io_pbm_all \
+mln_io_pbm_save \
+mln_io_pnm_max_component \
+mln_io_pnm_load \
+mln_io_pnm_load_header \
+mln_io_pnm_all \
+mln_io_pnm_macros \
+mln_io_pnm_save \
+mln_io_pnm_save_header \
+mln_io_txt_all \
+mln_io_txt_save \
+mln_io_abort \
+mln_io_fits_load \
+mln_io_fits_all \
+mln_io_off_load \
+mln_io_off_all \
+mln_io_off_save \
+mln_io_essential \
+mln_logical_includes \
+mln_logical_and_not \
+mln_logical_xor \
+mln_logical_all \
+mln_logical_not \
+mln_logical_and \
+mln_logical_or \
+mln_logical_essential \
+mln_norm_all \
+mln_norm_l1 \
+mln_norm_l2 \
+mln_norm_linfty \
+mln_norm_essential \
+mln_debug_iota \
+mln_debug_all \
+mln_debug_println_with_border \
+mln_debug_colorize \
+mln_debug_draw_graph \
+mln_debug_put_word \
+mln_debug_format \
+mln_debug_println \
+mln_debug_essential \
+mln_estim_min_max \
+mln_estim_all \
+mln_estim_sum \
+mln_estim_mean \
+mln_estim_essential \
+mln_set_uni \
+mln_set_inter \
+mln_set_all \
+mln_set_get \
+mln_set_sym_diff \
+mln_set_has \
+mln_set_diff \
+mln_set_compute \
+mln_set_essential \
+mln_border_adjust \
+mln_border_duplicate \
+mln_border_find \
+mln_border_thickness \
+mln_border_all \
+mln_border_mirror \
+mln_border_get \
+mln_border_equalize \
+mln_border_resize \
+mln_border_fill \
+mln_border_essential \
+mln_subsampling_gaussian_subsampling \
+mln_subsampling_all \
+mln_subsampling_subsampling \
mln_subsampling_essential
mln_histo_all_SOURCES = mln_histo_all.cc
diff --git a/milena/tests/unit_test/build_unit_test.sh b/milena/tests/unit_test/build_unit_test.sh
index 495d332..2d6ad0d 100755
--- a/milena/tests/unit_test/build_unit_test.sh
+++ b/milena/tests/unit_test/build_unit_test.sh
@@ -1,6 +1,10 @@
#!/bin/sh
-HEADERS=`find ../../mln -name "*.hh" | grep -vE "*.spe.hh" | grep -v "mln/core/doc" | sed s/"\.\.\/\.\.\/"//g`
+if [ $# -ne 1 ]; then
+ echo "Usage: $0 <mln_path>"
+fi
+
+HEADERS=`find $1 -name "*.hh" | grep -vE "*.spe.hh" | grep -v "mln/core/doc" | sed -e 's/.*\/mln\/\(.*\)/mln\/\1/g' | sed s/"\.\.\/\.\.\/"//g`
rm -f Makefile.am
rm -f *.hh *.cc
@@ -25,7 +29,7 @@ for i in $HEADERS; do
echo "}" >> $FILE_CC
#build Makefile.am
- echo "\\" >> Makefile.am
+ echo " \\" >> Makefile.am
echo -n "${FILE_CC}" | sed s/"\.cc"// >> Makefile.am
done
--
1.5.6.5
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix bug in p_array.
This bug arises when we write:
for_all(p) // in a p_array
for_all(n) // around p
here n has a direct access to the p_array::psite::p_
which needs to be updated when p moves.
unfortunatly there was a (too) lazy update.
* mln/core/site_set/p_array.hh (update_): New.
(subj_, start_, next_): Use update_.
p_array.hh | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
Index: mln/core/site_set/p_array.hh
--- mln/core/site_set/p_array.hh (revision 3017)
+++ mln/core/site_set/p_array.hh (working copy)
@@ -208,6 +208,8 @@
operator util::index() const;
+ void update_() const;
+
private:
const S* s_;
@@ -560,10 +562,17 @@
const mln_element(S)&
p_indexed_psite<S>::subj_()
{
+ update_(); // In case of...
+ return p_;
+ }
+
+ template <typename S>
+ inline
+ void
+ p_indexed_psite<S>::update_() const
+ {
if (is_valid())
- // Lazy update.
p_ = (*s_)[i_];
- return p_;
}
template <typename S>
@@ -612,6 +621,7 @@
p_indexed_fwd_piter<S>::start_()
{
p_.change_index(0);
+ p_.update_();
}
template <typename S>
@@ -620,6 +630,7 @@
p_indexed_fwd_piter<S>::next_()
{
p_.inc_index();
+ p_.update_();
}
template <typename S>
@@ -669,6 +680,7 @@
p_indexed_bkd_piter<S>::start_()
{
p_.change_index(s_->nsites() - 1);
+ p_.update_();
}
template <typename S>
@@ -677,6 +689,7 @@
p_indexed_bkd_piter<S>::next_()
{
p_.dec_index();
+ p_.update_();
}
template <typename S>
1
0