https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Move tree computation out from sandbox to mln morpho tree.
* geraud/max_tree_nnodes.cc: Move out.
max_tree_nnodes.cc | 151 -----------------------------------------------------
1 file changed, 151 deletions(-)
Index: geraud/max_tree_nnodes.cc
--- geraud/max_tree_nnodes.cc (revision 2936)
+++ geraud/max_tree_nnodes.cc (working copy)
@@ -1,151 +0,0 @@
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/level/fill.hh>
-# include <mln/util/pix.hh>
-# include <mln/morpho/includes.hh>
-# include <mln/level/sort_psites.hh>
-
-# include <mln/core/image/image2d.hh>
-# include <mln/core/alias/neighb2d.hh>
-# include <mln/value/int_u8.hh>
-# include <mln/io/pgm/load.hh>
-
-
-
-namespace mln
-{
-
- template <typename I, typename N>
- struct max_tree_
- {
- typedef mln_site(I) point;
- typedef p_array<point> S;
-
- // in:
- const I& f;
- const N& nbh;
-
- // aux:
- S s;
- mln_ch_value(I, bool) deja_vu;
- mln_ch_value(I, point) parent;
- mln_ch_value(I, point) zpar;
-
- max_tree_(const I& f, const N& nbh)
- : f(f),
- nbh(nbh)
- {
- run();
- }
-
- void run()
- {
- // init
- {
- initialize(deja_vu, f);
- mln::level::fill(deja_vu, false);
- initialize(parent, f);
- initialize(zpar, f);
- s = level::sort_psites_decreasing(f);
- }
-
- // first pass
- {
- mln_fwd_piter(S) p(s);
- mln_niter(N) n(nbh, p);
- for_all(p)
- {
- make_set(p);
- for_all(n)
- if (f.has(n) && deja_vu(n))
- do_union(n, p);
- deja_vu(p) = true;
- }
- }
-
- // second pass: canonization
- {
- mln_bkd_piter(S) p(s);
- for_all(p)
- {
- point q = parent(p);
- if (f(parent(q)) == f(q))
- parent(p) = parent(q);
- }
- }
-
- } // end of run()
-
- void make_set(const point& p)
- {
- parent(p) = p;
- zpar(p) = p;
- }
-
- bool is_root(const point& p) const
- {
- return parent(p) == p;
- }
-
- bool is_node(const point& p) const
- {
- return is_root(p) || f(parent(p)) != f(p);
- }
-
- point find_root(const point& x)
- {
- if (zpar(x) == x)
- return x;
- else
- return zpar(x) = find_root(zpar(x));
- }
-
- void do_union(const point& n, const point& p)
- {
- point r = find_root(n);
- if (r != p)
- {
- parent(r) = p;
- zpar(r) = p;
- }
- }
-
- };
-
-
-
-
- template <typename I, typename N>
- unsigned max_tree(const I& f, const N& nbh)
- {
- max_tree_<I,N> run(f, nbh);
-
- mln_piter(I) p(f.domain());
- unsigned nnodes = 0;
- for_all(p)
- if (run.is_node(p))
- ++nnodes;
- return nnodes;
- }
-
-} // end of mln
-
-
-
-int main(int argc, char* argv[])
-{
- if (argc != 2)
- {
- std::cerr << "usage: " << argv[0] << "
filename" << std::endl;
- return 1;
- }
-
- using namespace mln;
- using value::int_u8;
-
- image2d<int_u8> f;
- io::pgm::load(f, argv[1]);
-
- std::cout << "n nodes = " << mln::max_tree(f, c8()) <<
std::endl;
-}