https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Rewrite the ostream op for grid points and dpoints.
* mln/core/concept/gpoint.hh,
* mln/core/concept/gdpoint.hh (operator<<): Rewrite.
It does not rely on to_vec anymore. Important note: the discrete
coordinates on a grid do not follow those of algebra vectors.
For example, we have:
point3d = (sli,row,col)
and
vec3d = (x, y, z)
where
x = row, y = col, and z = sli.
Now vectors are printed with a white space after every comma,
whereas there is no white space for discrete grid points and
dpoints. That is intuive since grid coordinates are integers
and vector coordinates are floating values (usually with a '.'
in them).
gdpoint.hh | 12 +++++++++---
gpoint.hh | 11 ++++++++---
2 files changed, 17 insertions(+), 6 deletions(-)
Index: mln/core/concept/gpoint.hh
--- mln/core/concept/gpoint.hh (revision 3491)
+++ mln/core/concept/gpoint.hh (working copy)
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2007, 2008, 2009 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
@@ -39,6 +39,7 @@
# include <mln/value/concept/scalar.hh>
# include <mln/algebra/vec.hh>
# include <mln/util/ord.hh>
+# include <mln/debug/format.hh>
namespace mln
@@ -383,7 +384,11 @@
inline
std::ostream& operator<<(std::ostream& ostr, const Gpoint<P>& p)
{
- return ostr << exact(p).to_vec();
+ enum { n = P::dim };
+ ostr << '(';
+ for (unsigned i = 0; i < n; ++i)
+ ostr << debug::format(exact(p)[i]) << (i == n - 1 ? ')' : ',');
+ return ostr;
}
template <typename P, typename D>
Index: mln/core/concept/gdpoint.hh
--- mln/core/concept/gdpoint.hh (revision 3491)
+++ mln/core/concept/gdpoint.hh (working copy)
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2007, 2008, 2009 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
@@ -37,6 +37,8 @@
# include <mln/core/grids.hh>
# include <mln/trait/all.hh>
# include <mln/value/scalar.hh>
+# include <mln/debug/format.hh>
+
namespace mln
{
@@ -175,7 +177,11 @@
inline
std::ostream& operator<<(std::ostream& ostr, const Gdpoint<D>& dp)
{
- return ostr << exact(dp).to_vec();
+ enum { n = D::dim };
+ ostr << '(';
+ for (unsigned i = 0; i < n; ++i)
+ ostr << debug::format(exact(dp)[i]) << (i == n - 1 ? ')' : ',');
+ return ostr;
}
* doc/Doxyfile.in: update example_path and image_path.
* doc/Makefile.am: Add new targets white-paper and ref-guide.
* doc/doc.mk: update paths.
* doc/tutorial/samples/accu-right-instanciation.cc,
* doc/tutorial/samples/accu-wrong-instanciation.cc.raw,
* doc/tutorial/samples/borderthickness.cc,
* doc/tutorial/samples/box2d-bbox.cc,
* doc/tutorial/samples/domain-display.cc,
* doc/tutorial/samples/dpoint-1.cc,
* doc/tutorial/samples/estim-sites.cc,
* doc/tutorial/samples/extend.cc,
* doc/tutorial/samples/extension-ignore.cc,
* doc/tutorial/samples/fill-call-1.cc,
* doc/tutorial/samples/fill-part-image.cc,
* doc/tutorial/samples/fill-proto.cc.raw,
* doc/tutorial/samples/fill-subdomain-shorter.cc,
* doc/tutorial/samples/fill-subdomain.cc,
* doc/tutorial/samples/fill-subimage-cfun.cc,
* doc/tutorial/samples/fill.cc,
* doc/tutorial/samples/forall-piter.cc,
* doc/tutorial/samples/fun-p2v-1.cc,
* doc/tutorial/samples/graph-data.cc,
* doc/tutorial/samples/graph-iter.cc,
* doc/tutorial/samples/ima-has.cc,
* doc/tutorial/samples/ima-load.cc,
* doc/tutorial/samples/ima-save.cc,
* doc/tutorial/samples/ima-size.cc,
* doc/tutorial/samples/ima2d-1.cc,
* doc/tutorial/samples/ima2d-2.cc,
* doc/tutorial/samples/ima2d-3.cc,
* doc/tutorial/samples/ima2d-4.cc,
* doc/tutorial/samples/ima2d-5.cc,
* doc/tutorial/samples/ima2d-6-clone.cc,
* doc/tutorial/samples/ima2d-7.cc,
* doc/tutorial/samples/ima2d-restricted-1.cc.raw,
* doc/tutorial/samples/ima2d-restricted-2.cc.raw,
* doc/tutorial/samples/ima2d-restricted-3.cc.raw,
* doc/tutorial/samples/ima2d-rot.cc,
* doc/tutorial/samples/labeling-compute.cc,
* doc/tutorial/samples/logical-not.cc,
* doc/tutorial/samples/mln_var.cc,
* doc/tutorial/samples/parray-append.cc,
* doc/tutorial/samples/parray-bbox.cc,
* doc/tutorial/samples/paste-call-1.cc,
* doc/tutorial/samples/paste.cc,
* doc/tutorial/samples/point-1.cc,
* doc/tutorial/samples/predicate-1.cc,
* doc/tutorial/examples/accu.cc,
* doc/tutorial/samples/samples.mk,
* doc/tutorial/examples/box.cc,
* doc/tutorial/examples/cpp_issue.cc,
* doc/examples/erosion.cc,
* doc/tutorial/examples/for_Z.cc,
* doc/examples/graph.cc,
* doc/tutorial/examples/image2d.cc,
* doc/tutorial/examples/image_flat.cc,
* doc/tutorial/examples/image_if.cc,
* doc/tutorial/examples/image_plain.cc,
* doc/tutorial/examples/image_safe.cc,
* doc/examples/labeling_algo.cc,
* doc/examples/mk_graph.cc,
* doc/tutorial/examples/p_array.2.cc,
* doc/tutorial/examples/p_array.cc,
* doc/tutorial/examples/p_image.cc,
* doc/tutorial/examples/p_key.2.cc,
* doc/tutorial/examples/p_key.cc,
* doc/tutorial/examples/p_line2d.cc,
* doc/tutorial/examples/p_mutable_array_of.cc,
* doc/tutorial/examples/p_queue.cc,
* doc/tutorial/examples/p_run.cc,
* doc/tutorial/examples/p_vaccess.cc,
* doc/tutorial/examples/proxy.cc,
* doc/tutorial/examples/sub_image.cc,
* doc/tutorial/examples/sub_image_if.cc,
* doc/examples/tuto_bis.cc,
* doc/examples/tuto_one.cc,
* doc/tutorial/examples/vec.cc,
* doc/tutorial/examples/win_multiple.cc,
* doc/tutorial/examples/window.cc,
* doc/tutorial/samples/tuto2_first_image.cc,
* doc/tutorial/samples/tuto3_rw_image.cc,
* doc/tutorial/samples/tuto4_genericity_and_algorithms.cc,
* doc/tutorial/samples/win-create-1.cc,
* doc/tutorial/samples/win-create-2.cc,
* doc/tutorial/figures/extend-1.ppm,
* doc/tutorial/figures/extend-2.ppm,
* doc/tutorial/figures/extend-3.ppm,
* doc/tutorial/figures/extend-4.ppm,
* doc/tutorial/figures/extend-5.ppm,
* doc/tutorial/figures/figures.mk,
* doc/tutorial/figures/fill-subdomain-1.pbm,
* doc/tutorial/figures/fill-subdomain-2.ppm,
* doc/tutorial/figures/fill-subdomain-3.ppm,
* doc/tutorial/figures/fill-subdomain-4.ppm,
* doc/tutorial/figures/fill-subimage-cfun-1.ppm,
* doc/tutorial/figures/ima2d-rot-1.ppm,
* doc/tutorial/figures/ima2d-rot-2.ppm,
* doc/tutorial/figures/ima_save.pbm,
* doc/tutorial/figures/labeling-compute-1.pbm,
* doc/tutorial/figures/labeling-compute-2.ppm,
* doc/tutorial/figures/logical-not-1.pbm,
* doc/tutorial/figures/logical-not-2.pbm,
* doc/tutorial/figures/logical-not-3.pbm,
* doc/tutorial/figures/tuto2_first_image-1.pbm,
* doc/tutorial/figures/tuto3_rw_image-1.ppm,
* doc/tutorial/figures/tuto3_rw_image-2.ppm,
* doc/tutorial/figures/tuto3_rw_image-3.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm,
* doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm,
* doc/tutorial/generate_dist_files.sh,
* doc/groups.hh,
* doc/tutorial/img/small-enlarged.png,
* doc/tutorial/img/small.png,
* doc/tutorial/outputs/accu-right-instanciation.txt,
* doc/tutorial/outputs/borderthickness.txt,
* doc/tutorial/outputs/box2d-bbox.txt,
* doc/tutorial/outputs/domain-display.txt,
* doc/tutorial/outputs/dpoint-1.txt,
* doc/tutorial/outputs/estim-sites.txt,
* doc/tutorial/outputs/extend.txt,
* doc/tutorial/outputs/extension-ignore.txt,
* doc/tutorial/outputs/fill-call-1.txt,
* doc/tutorial/outputs/fill-part-image.txt,
* doc/tutorial/outputs/fill-subdomain-shorter.txt,
* doc/tutorial/outputs/fill-subdomain.txt,
* doc/tutorial/outputs/fill-subimage-cfun.txt,
* doc/tutorial/outputs/fill.txt,
* doc/tutorial/outputs/forall-piter.txt,
* doc/tutorial/outputs/fun-p2v-1.txt,
* doc/tutorial/outputs/graph-data.txt,
* doc/tutorial/outputs/graph-iter.txt,
* doc/tutorial/outputs/graph-output-1.txt,
* doc/tutorial/outputs/ima-has.txt,
* doc/tutorial/outputs/ima-save.txt,
* doc/tutorial/outputs/ima-size.txt,
* doc/tutorial/outputs/ima2d-1.txt,
* doc/tutorial/outputs/ima2d-2.txt,
* doc/tutorial/outputs/ima2d-3.txt,
* doc/tutorial/outputs/ima2d-4.txt,
* doc/tutorial/outputs/ima2d-5.txt,
* doc/tutorial/outputs/ima2d-6-clone.txt,
* doc/tutorial/outputs/ima2d-7.txt,
* doc/tutorial/outputs/ima2d-decl-2.txt,
* doc/tutorial/outputs/ima2d-display-1.txt,
* doc/tutorial/outputs/ima2d-display-2.txt,
* doc/tutorial/outputs/ima2d-display-output-1.txt,
* doc/tutorial/outputs/ima2d-display-output-2.txt,
* doc/tutorial/outputs/ima2d-rot.txt,
* doc/tutorial/outputs/labeling-compute.txt,
* doc/tutorial/outputs/logical-not.txt,
* doc/tutorial/outputs/mln_var.txt,
* doc/tutorial/outputs/outputs.mk,
* doc/tutorial/outputs/parray-append.txt,
* doc/tutorial/outputs/parray-bbox.txt,
* doc/tutorial/outputs/parray-display-1.txt,
* doc/tutorial/outputs/paste-call-1.txt,
* doc/tutorial/outputs/paste.txt,
* doc/tutorial/outputs/point-1.txt,
* doc/tutorial/outputs/predicate-1.txt,
* doc/tutorial/outputs/tuto2_first_image.txt,
* doc/tutorial/outputs/tuto3_rw_image.txt,
* doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt,
* doc/tutorial/outputs/win-create-1-display.txt,
* doc/tutorial/outputs/win-create-1.txt,
* doc/tutorial/outputs/win-create-2.txt,
* doc/tutorial/tools/sample_utils.hh,
* doc/tutorial/tools/split_sample.sh,
* doc/tutorial/tools/todoxygen.sh,
* doc/tutorial/examples/examples.mk,
* doc/tutorial/samples/Makefile.am: Move to...
* doc/examples/Makefile.am,
* doc/examples/accu-right-instanciation.cc,
* doc/examples/accu-wrong-instanciation.cc.raw,
* doc/examples/borderthickness.cc,
* doc/examples/box2d-bbox.cc,
* doc/examples/domain-display.cc,
* doc/examples/dpoint-1.cc,
* doc/examples/estim-sites.cc,
* doc/examples/examples.mk,
* doc/examples/extend.cc,
* doc/examples/extension-ignore.cc,
* doc/examples/fill-call-1.cc,
* doc/examples/fill-part-image.cc,
* doc/examples/fill-proto.cc.raw,
* doc/examples/fill-subdomain-shorter.cc,
* doc/examples/fill-subdomain.cc,
* doc/examples/fill-subimage-cfun.cc,
* doc/examples/fill.cc,
* doc/examples/forall-piter.cc,
* doc/examples/fun-p2v-1.cc,
* doc/examples/graph-data.cc,
* doc/examples/graph-iter.cc,
* doc/examples/ima-has.cc,
* doc/examples/ima-load.cc,
* doc/examples/ima-save.cc,
* doc/examples/ima-size.cc,
* doc/examples/ima2d-1.cc,
* doc/examples/ima2d-2.cc,
* doc/examples/ima2d-3.cc,
* doc/examples/ima2d-4.cc,
* doc/examples/ima2d-5.cc,
* doc/examples/ima2d-6-clone.cc,
* doc/examples/ima2d-7.cc,
* doc/examples/ima2d-restricted-1.cc.raw,
* doc/examples/ima2d-restricted-2.cc.raw,
* doc/examples/ima2d-restricted-3.cc.raw,
* doc/examples/ima2d-rot.cc,
* doc/examples/labeling-compute.cc,
* doc/examples/logical-not.cc,
* doc/examples/mln_var.cc,
* doc/examples/parray-append.cc,
* doc/examples/parray-bbox.cc,
* doc/examples/paste-call-1.cc,
* doc/examples/paste.cc,
* doc/examples/point-1.cc,
* doc/examples/predicate-1.cc,
* doc/examples/samples.mk,
* doc/examples/trash/accu.cc,
* doc/examples/trash/erosion.cc,
* doc/examples/trash/for_Z.cc,
* doc/examples/trash/graph.cc,
* doc/examples/trash/image2d.cc,
* doc/examples/trash/image_flat.cc,
* doc/examples/trash/image_if.cc,
* doc/examples/trash/image_plain.cc,
* doc/examples/trash/box.cc,
* doc/examples/trash/cpp_issue.cc,
* doc/examples/trash/image_safe.cc,
* doc/examples/trash/labeling_algo.cc,
* doc/examples/trash/mk_graph.cc,
* doc/examples/trash/p_array.2.cc,
* doc/examples/trash/p_array.cc,
* doc/examples/trash/p_image.cc,
* doc/examples/trash/p_key.2.cc,
* doc/examples/trash/p_key.cc,
* doc/examples/trash/p_line2d.cc,
* doc/examples/trash/p_mutable_array_of.cc,
* doc/examples/trash/p_queue.cc,
* doc/examples/trash/p_run.cc,
* doc/examples/trash/p_vaccess.cc,
* doc/examples/trash/proxy.cc,
* doc/examples/trash/sub_image.cc,
* doc/examples/trash/sub_image_if.cc,
* doc/examples/trash/tuto_bis.cc,
* doc/examples/trash/tuto_one.cc,
* doc/examples/trash/vec.cc,
* doc/examples/trash/win_multiple.cc,
* doc/examples/tuto2_first_image.cc,
* doc/examples/tuto3_rw_image.cc,
* doc/examples/tuto4_genericity_and_algorithms.cc,
* doc/examples/win-create-1.cc,
* doc/examples/win-create-2.cc,
* doc/figures/extend-1.ppm,
* doc/figures/extend-2.ppm,
* doc/figures/extend-3.ppm,
* doc/figures/extend-4.ppm,
* doc/figures/extend-5.ppm,
* doc/figures/fill-subdomain-1.pbm,
* doc/figures/fill-subdomain-2.ppm,
* doc/figures/fill-subdomain-3.ppm,
* doc/figures/fill-subdomain-4.ppm,
* doc/figures/figures.mk,
* doc/figures/fill-subimage-cfun-1.ppm,
* doc/figures/ima2d-rot-1.ppm,
* doc/figures/ima2d-rot-2.ppm,
* doc/figures/ima_save.pbm,
* doc/figures/labeling-compute-1.pbm,
* doc/figures/labeling-compute-2.ppm,
* doc/figures/logical-not-1.pbm,
* doc/figures/logical-not-2.pbm,
* doc/figures/logical-not-3.pbm,
* doc/figures/tuto2_first_image-1.pbm,
* doc/figures/tuto3_rw_image-1.ppm,
* doc/figures/tuto3_rw_image-2.ppm,
* doc/figures/tuto3_rw_image-3.ppm,
* doc/figures/tuto4_genericity_and_algorithms-1.,
* doc/figures/tuto4_genericity_and_algorithms-2.,
* doc/figures/tuto4_genericity_and_algorithms-3.,
* doc/figures/tuto4_genericity_and_algorithms-4.,
* doc/figures/tuto4_genericity_and_algorithms-5.,
* doc/figures/tuto4_genericity_and_algorithms-6.,
* doc/figures/tuto4_genericity_and_algorithms-7.,
* doc/figures/tuto4_genericity_and_algorithms-7.,
* doc/figures/tuto4_genericity_and_algorithms-8.,
* doc/figures/tuto4_genericity_and_algorithms-8.,
* doc/figures/tuto4_genericity_and_algorithms-9.,
* doc/figures/tuto4_genericity_and_algorithms-9.,
* doc/generate_dist_files.sh,
* doc/img/small-enlarged.png,
* doc/img/small.png,
* doc/outputs/accu-right-instanciation.txt,
* doc/outputs/borderthickness.txt,
* doc/outputs/box2d-bbox.txt,
* doc/outputs/domain-display.txt,
* doc/outputs/dpoint-1.txt,
* doc/outputs/estim-sites.txt,
* doc/outputs/extend.txt,
* doc/outputs/extension-ignore.txt,
* doc/outputs/fill-call-1.txt,
* doc/outputs/fill-part-image.txt,
* doc/outputs/fill-subdomain-shorter.txt,
* doc/outputs/fill-subdomain.txt,
* doc/outputs/fill-subimage-cfun.txt,
* doc/outputs/fill.txt,
* doc/outputs/forall-piter.txt,
* doc/outputs/fun-p2v-1.txt,
* doc/outputs/graph-data.txt,
* doc/outputs/graph-iter.txt,
* doc/outputs/graph-output-1.txt,
* doc/outputs/ima-has.txt,
* doc/outputs/ima-save.txt,
* doc/outputs/ima-size.txt,
* doc/outputs/ima2d-1.txt,
* doc/outputs/ima2d-2.txt,
* doc/outputs/ima2d-3.txt,
* doc/outputs/ima2d-4.txt,
* doc/outputs/ima2d-5.txt,
* doc/outputs/ima2d-6-clone.txt,
* doc/outputs/ima2d-7.txt,
* doc/outputs/ima2d-decl-2.txt,
* doc/outputs/ima2d-display-1.txt,
* doc/outputs/ima2d-display-2.txt,
* doc/outputs/ima2d-display-output-1.txt,
* doc/outputs/ima2d-display-output-2.txt,
* doc/outputs/ima2d-rot.txt,
* doc/outputs/labeling-compute.txt,
* doc/outputs/logical-not.txt,
* doc/outputs/mln_var.txt,
* doc/outputs/outputs.mk,
* doc/outputs/parray-append.txt,
* doc/outputs/parray-bbox.txt,
* doc/outputs/parray-display-1.txt,
* doc/outputs/paste-call-1.txt,
* doc/outputs/paste.txt,
* doc/outputs/point-1.txt,
* doc/outputs/predicate-1.txt,
* doc/outputs/tuto2_first_image.txt,
* doc/outputs/tuto3_rw_image.txt,
* doc/outputs/tuto4_genericity_and_algorithms.txt,
* doc/outputs/win-create-1-display.txt,
* doc/outputs/win-create-1.txt,
* doc/outputs/win-create-2.txt,
* doc/tools/sample_utils.hh,
* doc/tools/split_sample.sh,
* doc/tools/todoxygen.sh: ... here.
* doc/tutorial/tutorial.tex: split into tutorial.tex and...
* doc/ref_guide/ref_guide.tex: ... this file.
* doc/ref_guide/Makefile.am: add new rules.
* doc/tutorial/Makefile.am: update rules.
* doc/white_paper/Makefile.am,
* doc/white_paper/figures/house.png,
* doc/white_paper/figures/house_rag.png,
* doc/white_paper/figures/house_wshed.png,
* doc/white_paper/figures/house_wshed_mean_colors.png,
* doc/white_paper/white_paper.tex: introduce a new white paper.
* mln/core/concept/image.hh,
* mln/core/concept/object.hh,
* mln/core/image/cast_image.hh,
* mln/core/image/image1d.hh,
* mln/core/image/image2d.hh,
* mln/core/image/image2d_h.hh,
* mln/core/image/image3d.hh,
* mln/core/image/image_if.hh: test documentation group with doxygen.
* mln/opt/all.hh: add doc for mln::opt namespace.
* tests/util/soft_heap.cc: fix \file command.
---
milena/ChangeLog | 391 ++++
milena/doc/Doxyfile.in | 18 +-
milena/doc/Makefile.am | 69 +-
milena/doc/doc.mk | 20 +-
.../doc/{tutorial/samples => examples}/Makefile.am | 10 +-
.../accu-right-instanciation.cc | 0
.../accu-wrong-instanciation.cc.raw | 0
.../samples => examples}/borderthickness.cc | 0
.../{tutorial/samples => examples}/box2d-bbox.cc | 0
.../samples => examples}/domain-display.cc | 0
.../doc/{tutorial/samples => examples}/dpoint-1.cc | 0
.../{tutorial/samples => examples}/estim-sites.cc | 0
milena/doc/examples/examples.mk | 88 +
.../doc/{tutorial/samples => examples}/extend.cc | 2 +-
.../samples => examples}/extension-ignore.cc | 0
.../{tutorial/samples => examples}/fill-call-1.cc | 0
.../samples => examples}/fill-part-image.cc | 0
.../samples => examples}/fill-proto.cc.raw | 0
.../samples => examples}/fill-subdomain-shorter.cc | 0
.../samples => examples}/fill-subdomain.cc | 2 +-
.../samples => examples}/fill-subimage-cfun.cc | 2 +-
milena/doc/{tutorial/samples => examples}/fill.cc | 0
.../{tutorial/samples => examples}/forall-piter.cc | 0
.../{tutorial/samples => examples}/fun-p2v-1.cc | 0
.../{tutorial/samples => examples}/graph-data.cc | 0
.../{tutorial/samples => examples}/graph-iter.cc | 2 +-
.../doc/{tutorial/samples => examples}/ima-has.cc | 0
.../doc/{tutorial/samples => examples}/ima-load.cc | 0
.../doc/{tutorial/samples => examples}/ima-save.cc | 0
.../doc/{tutorial/samples => examples}/ima-size.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-1.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-2.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-3.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-4.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-5.cc | 0
.../samples => examples}/ima2d-6-clone.cc | 0
.../doc/{tutorial/samples => examples}/ima2d-7.cc | 0
.../samples => examples}/ima2d-restricted-1.cc.raw | 0
.../samples => examples}/ima2d-restricted-2.cc.raw | 0
.../samples => examples}/ima2d-restricted-3.cc.raw | 0
.../{tutorial/samples => examples}/ima2d-rot.cc | 2 +-
.../samples => examples}/labeling-compute.cc | 2 +-
.../{tutorial/samples => examples}/logical-not.cc | 2 +-
.../doc/{tutorial/samples => examples}/mln_var.cc | 0
.../samples => examples}/parray-append.cc | 0
.../{tutorial/samples => examples}/parray-bbox.cc | 0
.../{tutorial/samples => examples}/paste-call-1.cc | 0
milena/doc/{tutorial/samples => examples}/paste.cc | 0
.../doc/{tutorial/samples => examples}/point-1.cc | 0
.../{tutorial/samples => examples}/predicate-1.cc | 0
.../doc/{tutorial/samples => examples}/samples.mk | 0
.../{tutorial/examples => examples/trash}/accu.cc | 0
.../{tutorial/examples => examples/trash}/box.cc | 0
.../examples => examples/trash}/cpp_issue.cc | 0
milena/doc/examples/{ => trash}/erosion.cc | 0
.../{tutorial/examples => examples/trash}/for_Z.cc | 0
milena/doc/examples/{ => trash}/graph.cc | 0
.../examples => examples/trash}/image2d.cc | 0
.../examples => examples/trash}/image_flat.cc | 0
.../examples => examples/trash}/image_if.cc | 0
.../examples => examples/trash}/image_plain.cc | 0
.../examples => examples/trash}/image_safe.cc | 0
milena/doc/examples/{ => trash}/labeling_algo.cc | 0
milena/doc/examples/{ => trash}/mk_graph.cc | 0
.../examples => examples/trash}/p_array.2.cc | 0
.../examples => examples/trash}/p_array.cc | 0
.../examples => examples/trash}/p_image.cc | 0
.../examples => examples/trash}/p_key.2.cc | 0
.../{tutorial/examples => examples/trash}/p_key.cc | 0
.../examples => examples/trash}/p_line2d.cc | 0
.../trash}/p_mutable_array_of.cc | 0
.../examples => examples/trash}/p_queue.cc | 0
.../{tutorial/examples => examples/trash}/p_run.cc | 0
.../examples => examples/trash}/p_vaccess.cc | 0
.../{tutorial/examples => examples/trash}/proxy.cc | 0
.../examples => examples/trash}/sub_image.cc | 0
.../examples => examples/trash}/sub_image_if.cc | 0
milena/doc/examples/{ => trash}/tuto_bis.cc | 0
milena/doc/examples/{ => trash}/tuto_one.cc | 0
.../{tutorial/examples => examples/trash}/vec.cc | 0
.../examples => examples/trash}/win_multiple.cc | 0
.../examples => examples/trash}/window.cc | 0
.../samples => examples}/tuto2_first_image.cc | 2 +-
.../samples => examples}/tuto3_rw_image.cc | 2 +-
.../tuto4_genericity_and_algorithms.cc | 2 +-
.../{tutorial/samples => examples}/win-create-1.cc | 0
.../{tutorial/samples => examples}/win-create-2.cc | 0
milena/doc/{tutorial => }/figures/extend-1.ppm | Bin 12406 -> 12406 bytes
milena/doc/{tutorial => }/figures/extend-2.ppm | Bin 16546 -> 16546 bytes
milena/doc/{tutorial => }/figures/extend-3.ppm | Bin 16546 -> 16546 bytes
milena/doc/{tutorial => }/figures/extend-4.ppm | 0
milena/doc/{tutorial => }/figures/extend-5.ppm | Bin 12406 -> 12406 bytes
milena/doc/{tutorial => }/figures/figures.mk | 0
.../{tutorial => }/figures/fill-subdomain-1.pbm | 0
.../{tutorial => }/figures/fill-subdomain-2.ppm | Bin 206 -> 206 bytes
.../{tutorial => }/figures/fill-subdomain-3.ppm | Bin 206 -> 206 bytes
.../{tutorial => }/figures/fill-subdomain-4.ppm | Bin 206 -> 206 bytes
.../figures/fill-subimage-cfun-1.ppm | Bin 206 -> 206 bytes
milena/doc/{tutorial => }/figures/ima2d-rot-1.ppm | Bin 235320 -> 235320 bytes
milena/doc/{tutorial => }/figures/ima2d-rot-2.ppm | Bin 235320 -> 235320 bytes
milena/doc/{tutorial => }/figures/ima_save.pbm | 0
.../{tutorial => }/figures/labeling-compute-1.pbm | 0
.../{tutorial => }/figures/labeling-compute-2.ppm | Bin 206 -> 206 bytes
.../doc/{tutorial => }/figures/logical-not-1.pbm | 0
.../doc/{tutorial => }/figures/logical-not-2.pbm | 0
.../doc/{tutorial => }/figures/logical-not-3.pbm | 0
.../{tutorial => }/figures/tuto2_first_image-1.pbm | 0
.../{tutorial => }/figures/tuto3_rw_image-1.ppm | Bin 4918 -> 4918 bytes
.../{tutorial => }/figures/tuto3_rw_image-2.ppm | 0
.../{tutorial => }/figures/tuto3_rw_image-3.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-1.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-2.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-3.pbm | 0
.../figures/tuto4_genericity_and_algorithms-4.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-5.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-6.ppm | Bin 12406 -> 12406 bytes
.../figures/tuto4_genericity_and_algorithms-7.pgm | 0
.../figures/tuto4_genericity_and_algorithms-7.ppm | Bin 24696 -> 24696 bytes
.../figures/tuto4_genericity_and_algorithms-8.pgm | 0
.../figures/tuto4_genericity_and_algorithms-8.ppm | 0
.../figures/tuto4_genericity_and_algorithms-9.pgm | 0
.../figures/tuto4_genericity_and_algorithms-9.ppm | 0
milena/doc/{tutorial => }/generate_dist_files.sh | 2 +-
milena/doc/groups.hh | 28 +
milena/doc/{tutorial => }/img/small-enlarged.png | Bin 91556 -> 91556 bytes
milena/doc/{tutorial => }/img/small.png | Bin 22653 -> 22653 bytes
.../outputs/accu-right-instanciation.txt | 0
.../doc/{tutorial => }/outputs/borderthickness.txt | 0
milena/doc/{tutorial => }/outputs/box2d-bbox.txt | 0
.../doc/{tutorial => }/outputs/domain-display.txt | 0
milena/doc/{tutorial => }/outputs/dpoint-1.txt | 0
milena/doc/{tutorial => }/outputs/estim-sites.txt | 0
milena/doc/{tutorial => }/outputs/extend.txt | 0
.../{tutorial => }/outputs/extension-ignore.txt | 0
milena/doc/{tutorial => }/outputs/fill-call-1.txt | 0
.../doc/{tutorial => }/outputs/fill-part-image.txt | 0
.../outputs/fill-subdomain-shorter.txt | 0
.../doc/{tutorial => }/outputs/fill-subdomain.txt | 0
.../{tutorial => }/outputs/fill-subimage-cfun.txt | 0
milena/doc/{tutorial => }/outputs/fill.txt | 0
milena/doc/{tutorial => }/outputs/forall-piter.txt | 0
milena/doc/{tutorial => }/outputs/fun-p2v-1.txt | 0
milena/doc/{tutorial => }/outputs/graph-data.txt | 0
milena/doc/{tutorial => }/outputs/graph-iter.txt | 0
.../doc/{tutorial => }/outputs/graph-output-1.txt | 0
milena/doc/{tutorial => }/outputs/ima-has.txt | 0
milena/doc/{tutorial => }/outputs/ima-save.txt | 0
milena/doc/{tutorial => }/outputs/ima-size.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-1.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-2.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-3.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-4.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-5.txt | 0
.../doc/{tutorial => }/outputs/ima2d-6-clone.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-7.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-decl-2.txt | 0
.../doc/{tutorial => }/outputs/ima2d-display-1.txt | 0
.../doc/{tutorial => }/outputs/ima2d-display-2.txt | 0
.../outputs/ima2d-display-output-1.txt | 0
.../outputs/ima2d-display-output-2.txt | 0
milena/doc/{tutorial => }/outputs/ima2d-rot.txt | 0
.../{tutorial => }/outputs/labeling-compute.txt | 0
milena/doc/{tutorial => }/outputs/logical-not.txt | 0
milena/doc/{tutorial => }/outputs/mln_var.txt | 0
milena/doc/{tutorial => }/outputs/outputs.mk | 0
.../doc/{tutorial => }/outputs/parray-append.txt | 0
milena/doc/{tutorial => }/outputs/parray-bbox.txt | 0
.../{tutorial => }/outputs/parray-display-1.txt | 0
milena/doc/{tutorial => }/outputs/paste-call-1.txt | 0
milena/doc/{tutorial => }/outputs/paste.txt | 0
milena/doc/{tutorial => }/outputs/point-1.txt | 0
milena/doc/{tutorial => }/outputs/predicate-1.txt | 0
.../{tutorial => }/outputs/tuto2_first_image.txt | 0
.../doc/{tutorial => }/outputs/tuto3_rw_image.txt | 0
.../outputs/tuto4_genericity_and_algorithms.txt | 0
.../outputs/win-create-1-display.txt | 0
milena/doc/{tutorial => }/outputs/win-create-1.txt | 0
milena/doc/{tutorial => }/outputs/win-create-2.txt | 0
milena/doc/ref_guide/Makefile.am | 24 +
.../tutorial.tex => ref_guide/ref_guide.tex} | 443 +-----
milena/doc/{tutorial => }/tools/sample_utils.hh | 0
milena/doc/{tutorial => }/tools/split_sample.sh | 0
milena/doc/{tutorial => }/tools/todoxygen.sh | 0
milena/doc/tutorial/Makefile.am | 61 +-
milena/doc/tutorial/examples/examples.mk | 29 -
milena/doc/tutorial/tutorial.tex | 1960 +-------------------
milena/doc/white_paper/Makefile.am | 8 +
milena/doc/white_paper/figures/house.png | Bin 0 -> 26653 bytes
milena/doc/white_paper/figures/house_rag.png | Bin 0 -> 9454 bytes
milena/doc/white_paper/figures/house_wshed.png | Bin 0 -> 27668 bytes
.../figures/house_wshed_mean_colors.png | Bin 0 -> 6618 bytes
milena/doc/white_paper/white_paper.tex | 384 ++++
milena/mln/core/concept/image.hh | 14 +-
milena/mln/core/concept/object.hh | 3 +-
milena/mln/core/image/cast_image.hh | 24 +-
milena/mln/core/image/image1d.hh | 15 +-
milena/mln/core/image/image2d.hh | 5 +-
milena/mln/core/image/image2d_h.hh | 4 +
milena/mln/core/image/image3d.hh | 13 +-
milena/mln/core/image/image_if.hh | 24 +-
milena/mln/opt/all.hh | 14 +
milena/tests/util/soft_heap.cc | 2 +-
202 files changed, 1132 insertions(+), 2541 deletions(-)
rename milena/doc/{tutorial/samples => examples}/Makefile.am (95%)
rename milena/doc/{tutorial/samples => examples}/accu-right-instanciation.cc (100%)
rename milena/doc/{tutorial/samples => examples}/accu-wrong-instanciation.cc.raw (100%)
rename milena/doc/{tutorial/samples => examples}/borderthickness.cc (100%)
rename milena/doc/{tutorial/samples => examples}/box2d-bbox.cc (100%)
rename milena/doc/{tutorial/samples => examples}/domain-display.cc (100%)
rename milena/doc/{tutorial/samples => examples}/dpoint-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/estim-sites.cc (100%)
create mode 100644 milena/doc/examples/examples.mk
rename milena/doc/{tutorial/samples => examples}/extend.cc (97%)
rename milena/doc/{tutorial/samples => examples}/extension-ignore.cc (100%)
rename milena/doc/{tutorial/samples => examples}/fill-call-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/fill-part-image.cc (100%)
rename milena/doc/{tutorial/samples => examples}/fill-proto.cc.raw (100%)
rename milena/doc/{tutorial/samples => examples}/fill-subdomain-shorter.cc (100%)
rename milena/doc/{tutorial/samples => examples}/fill-subdomain.cc (96%)
rename milena/doc/{tutorial/samples => examples}/fill-subimage-cfun.cc (93%)
rename milena/doc/{tutorial/samples => examples}/fill.cc (100%)
rename milena/doc/{tutorial/samples => examples}/forall-piter.cc (100%)
rename milena/doc/{tutorial/samples => examples}/fun-p2v-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/graph-data.cc (100%)
rename milena/doc/{tutorial/samples => examples}/graph-iter.cc (98%)
rename milena/doc/{tutorial/samples => examples}/ima-has.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima-load.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima-save.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima-size.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-2.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-3.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-4.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-5.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-6-clone.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-7.cc (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-1.cc.raw (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-2.cc.raw (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-3.cc.raw (100%)
rename milena/doc/{tutorial/samples => examples}/ima2d-rot.cc (96%)
rename milena/doc/{tutorial/samples => examples}/labeling-compute.cc (94%)
rename milena/doc/{tutorial/samples => examples}/logical-not.cc (91%)
rename milena/doc/{tutorial/samples => examples}/mln_var.cc (100%)
rename milena/doc/{tutorial/samples => examples}/parray-append.cc (100%)
rename milena/doc/{tutorial/samples => examples}/parray-bbox.cc (100%)
rename milena/doc/{tutorial/samples => examples}/paste-call-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/paste.cc (100%)
rename milena/doc/{tutorial/samples => examples}/point-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/predicate-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/samples.mk (100%)
rename milena/doc/{tutorial/examples => examples/trash}/accu.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/box.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/cpp_issue.cc (100%)
rename milena/doc/examples/{ => trash}/erosion.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/for_Z.cc (100%)
rename milena/doc/examples/{ => trash}/graph.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/image2d.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/image_flat.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/image_if.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/image_plain.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/image_safe.cc (100%)
rename milena/doc/examples/{ => trash}/labeling_algo.cc (100%)
rename milena/doc/examples/{ => trash}/mk_graph.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_array.2.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_array.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_image.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_key.2.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_key.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_line2d.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_mutable_array_of.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_queue.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_run.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/p_vaccess.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/proxy.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/sub_image.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/sub_image_if.cc (100%)
rename milena/doc/examples/{ => trash}/tuto_bis.cc (100%)
rename milena/doc/examples/{ => trash}/tuto_one.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/vec.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/win_multiple.cc (100%)
rename milena/doc/{tutorial/examples => examples/trash}/window.cc (100%)
rename milena/doc/{tutorial/samples => examples}/tuto2_first_image.cc (96%)
rename milena/doc/{tutorial/samples => examples}/tuto3_rw_image.cc (94%)
rename milena/doc/{tutorial/samples => examples}/tuto4_genericity_and_algorithms.cc (98%)
rename milena/doc/{tutorial/samples => examples}/win-create-1.cc (100%)
rename milena/doc/{tutorial/samples => examples}/win-create-2.cc (100%)
rename milena/doc/{tutorial => }/figures/extend-1.ppm (100%)
rename milena/doc/{tutorial => }/figures/extend-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/extend-3.ppm (100%)
rename milena/doc/{tutorial => }/figures/extend-4.ppm (100%)
rename milena/doc/{tutorial => }/figures/extend-5.ppm (100%)
rename milena/doc/{tutorial => }/figures/figures.mk (100%)
rename milena/doc/{tutorial => }/figures/fill-subdomain-1.pbm (100%)
rename milena/doc/{tutorial => }/figures/fill-subdomain-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/fill-subdomain-3.ppm (100%)
rename milena/doc/{tutorial => }/figures/fill-subdomain-4.ppm (100%)
rename milena/doc/{tutorial => }/figures/fill-subimage-cfun-1.ppm (100%)
rename milena/doc/{tutorial => }/figures/ima2d-rot-1.ppm (100%)
rename milena/doc/{tutorial => }/figures/ima2d-rot-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/ima_save.pbm (100%)
rename milena/doc/{tutorial => }/figures/labeling-compute-1.pbm (100%)
rename milena/doc/{tutorial => }/figures/labeling-compute-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/logical-not-1.pbm (100%)
rename milena/doc/{tutorial => }/figures/logical-not-2.pbm (100%)
rename milena/doc/{tutorial => }/figures/logical-not-3.pbm (100%)
rename milena/doc/{tutorial => }/figures/tuto2_first_image-1.pbm (100%)
rename milena/doc/{tutorial => }/figures/tuto3_rw_image-1.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto3_rw_image-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto3_rw_image-3.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-1.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-2.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-3.pbm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-4.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-5.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-6.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-7.pgm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-7.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-8.pgm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-8.ppm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-9.pgm (100%)
rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-9.ppm (100%)
rename milena/doc/{tutorial => }/generate_dist_files.sh (92%)
create mode 100644 milena/doc/groups.hh
rename milena/doc/{tutorial => }/img/small-enlarged.png (100%)
rename milena/doc/{tutorial => }/img/small.png (100%)
rename milena/doc/{tutorial => }/outputs/accu-right-instanciation.txt (100%)
rename milena/doc/{tutorial => }/outputs/borderthickness.txt (100%)
rename milena/doc/{tutorial => }/outputs/box2d-bbox.txt (100%)
rename milena/doc/{tutorial => }/outputs/domain-display.txt (100%)
rename milena/doc/{tutorial => }/outputs/dpoint-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/estim-sites.txt (100%)
rename milena/doc/{tutorial => }/outputs/extend.txt (100%)
rename milena/doc/{tutorial => }/outputs/extension-ignore.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill-call-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill-part-image.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill-subdomain-shorter.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill-subdomain.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill-subimage-cfun.txt (100%)
rename milena/doc/{tutorial => }/outputs/fill.txt (100%)
rename milena/doc/{tutorial => }/outputs/forall-piter.txt (100%)
rename milena/doc/{tutorial => }/outputs/fun-p2v-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/graph-data.txt (100%)
rename milena/doc/{tutorial => }/outputs/graph-iter.txt (100%)
rename milena/doc/{tutorial => }/outputs/graph-output-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima-has.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima-save.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima-size.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-2.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-3.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-4.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-5.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-6-clone.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-7.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-decl-2.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-display-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-display-2.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-display-output-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-display-output-2.txt (100%)
rename milena/doc/{tutorial => }/outputs/ima2d-rot.txt (100%)
rename milena/doc/{tutorial => }/outputs/labeling-compute.txt (100%)
rename milena/doc/{tutorial => }/outputs/logical-not.txt (100%)
rename milena/doc/{tutorial => }/outputs/mln_var.txt (100%)
rename milena/doc/{tutorial => }/outputs/outputs.mk (100%)
rename milena/doc/{tutorial => }/outputs/parray-append.txt (100%)
rename milena/doc/{tutorial => }/outputs/parray-bbox.txt (100%)
rename milena/doc/{tutorial => }/outputs/parray-display-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/paste-call-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/paste.txt (100%)
rename milena/doc/{tutorial => }/outputs/point-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/predicate-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/tuto2_first_image.txt (100%)
rename milena/doc/{tutorial => }/outputs/tuto3_rw_image.txt (100%)
rename milena/doc/{tutorial => }/outputs/tuto4_genericity_and_algorithms.txt (100%)
rename milena/doc/{tutorial => }/outputs/win-create-1-display.txt (100%)
rename milena/doc/{tutorial => }/outputs/win-create-1.txt (100%)
rename milena/doc/{tutorial => }/outputs/win-create-2.txt (100%)
create mode 100644 milena/doc/ref_guide/Makefile.am
copy milena/doc/{tutorial/tutorial.tex => ref_guide/ref_guide.tex} (81%)
rename milena/doc/{tutorial => }/tools/sample_utils.hh (100%)
rename milena/doc/{tutorial => }/tools/split_sample.sh (100%)
rename milena/doc/{tutorial => }/tools/todoxygen.sh (100%)
delete mode 100644 milena/doc/tutorial/examples/examples.mk
create mode 100644 milena/doc/white_paper/Makefile.am
create mode 100644 milena/doc/white_paper/figures/house.png
create mode 100644 milena/doc/white_paper/figures/house_rag.png
create mode 100644 milena/doc/white_paper/figures/house_wshed.png
create mode 100644 milena/doc/white_paper/figures/house_wshed_mean_colors.png
create mode 100644 milena/doc/white_paper/white_paper.tex
diff --git a/milena/ChangeLog b/milena/ChangeLog
index c514008..f5ca370 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,394 @@
+2009-03-05 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ Update documentation.
+
+ * doc/Doxyfile.in: update example_path and image_path.
+
+ * doc/Makefile.am: Add new targets white-paper and ref-guide.
+
+ * doc/doc.mk: update paths.
+
+ * doc/tutorial/samples/accu-right-instanciation.cc,
+ * doc/tutorial/samples/accu-wrong-instanciation.cc.raw,
+ * doc/tutorial/samples/borderthickness.cc,
+ * doc/tutorial/samples/box2d-bbox.cc,
+ * doc/tutorial/samples/domain-display.cc,
+ * doc/tutorial/samples/dpoint-1.cc,
+ * doc/tutorial/samples/estim-sites.cc,
+ * doc/tutorial/samples/extend.cc,
+ * doc/tutorial/samples/extension-ignore.cc,
+ * doc/tutorial/samples/fill-call-1.cc,
+ * doc/tutorial/samples/fill-part-image.cc,
+ * doc/tutorial/samples/fill-proto.cc.raw,
+ * doc/tutorial/samples/fill-subdomain-shorter.cc,
+ * doc/tutorial/samples/fill-subdomain.cc,
+ * doc/tutorial/samples/fill-subimage-cfun.cc,
+ * doc/tutorial/samples/fill.cc,
+ * doc/tutorial/samples/forall-piter.cc,
+ * doc/tutorial/samples/fun-p2v-1.cc,
+ * doc/tutorial/samples/graph-data.cc,
+ * doc/tutorial/samples/graph-iter.cc,
+ * doc/tutorial/samples/ima-has.cc,
+ * doc/tutorial/samples/ima-load.cc,
+ * doc/tutorial/samples/ima-save.cc,
+ * doc/tutorial/samples/ima-size.cc,
+ * doc/tutorial/samples/ima2d-1.cc,
+ * doc/tutorial/samples/ima2d-2.cc,
+ * doc/tutorial/samples/ima2d-3.cc,
+ * doc/tutorial/samples/ima2d-4.cc,
+ * doc/tutorial/samples/ima2d-5.cc,
+ * doc/tutorial/samples/ima2d-6-clone.cc,
+ * doc/tutorial/samples/ima2d-7.cc,
+ * doc/tutorial/samples/ima2d-restricted-1.cc.raw,
+ * doc/tutorial/samples/ima2d-restricted-2.cc.raw,
+ * doc/tutorial/samples/ima2d-restricted-3.cc.raw,
+ * doc/tutorial/samples/ima2d-rot.cc,
+ * doc/tutorial/samples/labeling-compute.cc,
+ * doc/tutorial/samples/logical-not.cc,
+ * doc/tutorial/samples/mln_var.cc,
+ * doc/tutorial/samples/parray-append.cc,
+ * doc/tutorial/samples/parray-bbox.cc,
+ * doc/tutorial/samples/paste-call-1.cc,
+ * doc/tutorial/samples/paste.cc,
+ * doc/tutorial/samples/point-1.cc,
+ * doc/tutorial/samples/predicate-1.cc,
+ * doc/tutorial/examples/accu.cc,
+ * doc/tutorial/samples/samples.mk,
+ * doc/tutorial/examples/box.cc,
+ * doc/tutorial/examples/cpp_issue.cc,
+ * doc/examples/erosion.cc,
+ * doc/tutorial/examples/for_Z.cc,
+ * doc/examples/graph.cc,
+ * doc/tutorial/examples/image2d.cc,
+ * doc/tutorial/examples/image_flat.cc,
+ * doc/tutorial/examples/image_if.cc,
+ * doc/tutorial/examples/image_plain.cc,
+ * doc/tutorial/examples/image_safe.cc,
+ * doc/examples/labeling_algo.cc,
+ * doc/examples/mk_graph.cc,
+ * doc/tutorial/examples/p_array.2.cc,
+ * doc/tutorial/examples/p_array.cc,
+ * doc/tutorial/examples/p_image.cc,
+ * doc/tutorial/examples/p_key.2.cc,
+ * doc/tutorial/examples/p_key.cc,
+ * doc/tutorial/examples/p_line2d.cc,
+ * doc/tutorial/examples/p_mutable_array_of.cc,
+ * doc/tutorial/examples/p_queue.cc,
+ * doc/tutorial/examples/p_run.cc,
+ * doc/tutorial/examples/p_vaccess.cc,
+ * doc/tutorial/examples/proxy.cc,
+ * doc/tutorial/examples/sub_image.cc,
+ * doc/tutorial/examples/sub_image_if.cc,
+ * doc/examples/tuto_bis.cc,
+ * doc/examples/tuto_one.cc,
+ * doc/tutorial/examples/vec.cc,
+ * doc/tutorial/examples/win_multiple.cc,
+ * doc/tutorial/examples/window.cc,
+ * doc/tutorial/samples/tuto2_first_image.cc,
+ * doc/tutorial/samples/tuto3_rw_image.cc,
+ * doc/tutorial/samples/tuto4_genericity_and_algorithms.cc,
+ * doc/tutorial/samples/win-create-1.cc,
+ * doc/tutorial/samples/win-create-2.cc,
+ * doc/tutorial/figures/extend-1.ppm,
+ * doc/tutorial/figures/extend-2.ppm,
+ * doc/tutorial/figures/extend-3.ppm,
+ * doc/tutorial/figures/extend-4.ppm,
+ * doc/tutorial/figures/extend-5.ppm,
+ * doc/tutorial/figures/figures.mk,
+ * doc/tutorial/figures/fill-subdomain-1.pbm,
+ * doc/tutorial/figures/fill-subdomain-2.ppm,
+ * doc/tutorial/figures/fill-subdomain-3.ppm,
+ * doc/tutorial/figures/fill-subdomain-4.ppm,
+ * doc/tutorial/figures/fill-subimage-cfun-1.ppm,
+ * doc/tutorial/figures/ima2d-rot-1.ppm,
+ * doc/tutorial/figures/ima2d-rot-2.ppm,
+ * doc/tutorial/figures/ima_save.pbm,
+ * doc/tutorial/figures/labeling-compute-1.pbm,
+ * doc/tutorial/figures/labeling-compute-2.ppm,
+ * doc/tutorial/figures/logical-not-1.pbm,
+ * doc/tutorial/figures/logical-not-2.pbm,
+ * doc/tutorial/figures/logical-not-3.pbm,
+ * doc/tutorial/figures/tuto2_first_image-1.pbm,
+ * doc/tutorial/figures/tuto3_rw_image-1.ppm,
+ * doc/tutorial/figures/tuto3_rw_image-2.ppm,
+ * doc/tutorial/figures/tuto3_rw_image-3.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm,
+ * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm,
+ * doc/tutorial/generate_dist_files.sh,
+ * doc/groups.hh,
+ * doc/tutorial/img/small-enlarged.png,
+ * doc/tutorial/img/small.png,
+ * doc/tutorial/outputs/accu-right-instanciation.txt,
+ * doc/tutorial/outputs/borderthickness.txt,
+ * doc/tutorial/outputs/box2d-bbox.txt,
+ * doc/tutorial/outputs/domain-display.txt,
+ * doc/tutorial/outputs/dpoint-1.txt,
+ * doc/tutorial/outputs/estim-sites.txt,
+ * doc/tutorial/outputs/extend.txt,
+ * doc/tutorial/outputs/extension-ignore.txt,
+ * doc/tutorial/outputs/fill-call-1.txt,
+ * doc/tutorial/outputs/fill-part-image.txt,
+ * doc/tutorial/outputs/fill-subdomain-shorter.txt,
+ * doc/tutorial/outputs/fill-subdomain.txt,
+ * doc/tutorial/outputs/fill-subimage-cfun.txt,
+ * doc/tutorial/outputs/fill.txt,
+ * doc/tutorial/outputs/forall-piter.txt,
+ * doc/tutorial/outputs/fun-p2v-1.txt,
+ * doc/tutorial/outputs/graph-data.txt,
+ * doc/tutorial/outputs/graph-iter.txt,
+ * doc/tutorial/outputs/graph-output-1.txt,
+ * doc/tutorial/outputs/ima-has.txt,
+ * doc/tutorial/outputs/ima-save.txt,
+ * doc/tutorial/outputs/ima-size.txt,
+ * doc/tutorial/outputs/ima2d-1.txt,
+ * doc/tutorial/outputs/ima2d-2.txt,
+ * doc/tutorial/outputs/ima2d-3.txt,
+ * doc/tutorial/outputs/ima2d-4.txt,
+ * doc/tutorial/outputs/ima2d-5.txt,
+ * doc/tutorial/outputs/ima2d-6-clone.txt,
+ * doc/tutorial/outputs/ima2d-7.txt,
+ * doc/tutorial/outputs/ima2d-decl-2.txt,
+ * doc/tutorial/outputs/ima2d-display-1.txt,
+ * doc/tutorial/outputs/ima2d-display-2.txt,
+ * doc/tutorial/outputs/ima2d-display-output-1.txt,
+ * doc/tutorial/outputs/ima2d-display-output-2.txt,
+ * doc/tutorial/outputs/ima2d-rot.txt,
+ * doc/tutorial/outputs/labeling-compute.txt,
+ * doc/tutorial/outputs/logical-not.txt,
+ * doc/tutorial/outputs/mln_var.txt,
+ * doc/tutorial/outputs/outputs.mk,
+ * doc/tutorial/outputs/parray-append.txt,
+ * doc/tutorial/outputs/parray-bbox.txt,
+ * doc/tutorial/outputs/parray-display-1.txt,
+ * doc/tutorial/outputs/paste-call-1.txt,
+ * doc/tutorial/outputs/paste.txt,
+ * doc/tutorial/outputs/point-1.txt,
+ * doc/tutorial/outputs/predicate-1.txt,
+ * doc/tutorial/outputs/tuto2_first_image.txt,
+ * doc/tutorial/outputs/tuto3_rw_image.txt,
+ * doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt,
+ * doc/tutorial/outputs/win-create-1-display.txt,
+ * doc/tutorial/outputs/win-create-1.txt,
+ * doc/tutorial/outputs/win-create-2.txt,
+ * doc/tutorial/tools/sample_utils.hh,
+ * doc/tutorial/tools/split_sample.sh,
+ * doc/tutorial/tools/todoxygen.sh,
+ * doc/tutorial/examples/examples.mk,
+ * doc/tutorial/samples/Makefile.am: Move to...
+
+
+ * doc/examples/Makefile.am,
+ * doc/examples/accu-right-instanciation.cc,
+ * doc/examples/accu-wrong-instanciation.cc.raw,
+ * doc/examples/borderthickness.cc,
+ * doc/examples/box2d-bbox.cc,
+ * doc/examples/domain-display.cc,
+ * doc/examples/dpoint-1.cc,
+ * doc/examples/estim-sites.cc,
+ * doc/examples/examples.mk,
+ * doc/examples/extend.cc,
+ * doc/examples/extension-ignore.cc,
+ * doc/examples/fill-call-1.cc,
+ * doc/examples/fill-part-image.cc,
+ * doc/examples/fill-proto.cc.raw,
+ * doc/examples/fill-subdomain-shorter.cc,
+ * doc/examples/fill-subdomain.cc,
+ * doc/examples/fill-subimage-cfun.cc,
+ * doc/examples/fill.cc,
+ * doc/examples/forall-piter.cc,
+ * doc/examples/fun-p2v-1.cc,
+ * doc/examples/graph-data.cc,
+ * doc/examples/graph-iter.cc,
+ * doc/examples/ima-has.cc,
+ * doc/examples/ima-load.cc,
+ * doc/examples/ima-save.cc,
+ * doc/examples/ima-size.cc,
+ * doc/examples/ima2d-1.cc,
+ * doc/examples/ima2d-2.cc,
+ * doc/examples/ima2d-3.cc,
+ * doc/examples/ima2d-4.cc,
+ * doc/examples/ima2d-5.cc,
+ * doc/examples/ima2d-6-clone.cc,
+ * doc/examples/ima2d-7.cc,
+ * doc/examples/ima2d-restricted-1.cc.raw,
+ * doc/examples/ima2d-restricted-2.cc.raw,
+ * doc/examples/ima2d-restricted-3.cc.raw,
+ * doc/examples/ima2d-rot.cc,
+ * doc/examples/labeling-compute.cc,
+ * doc/examples/logical-not.cc,
+ * doc/examples/mln_var.cc,
+ * doc/examples/parray-append.cc,
+ * doc/examples/parray-bbox.cc,
+ * doc/examples/paste-call-1.cc,
+ * doc/examples/paste.cc,
+ * doc/examples/point-1.cc,
+ * doc/examples/predicate-1.cc,
+ * doc/examples/samples.mk,
+ * doc/examples/trash/accu.cc,
+ * doc/examples/trash/erosion.cc,
+ * doc/examples/trash/for_Z.cc,
+ * doc/examples/trash/graph.cc,
+ * doc/examples/trash/image2d.cc,
+ * doc/examples/trash/image_flat.cc,
+ * doc/examples/trash/image_if.cc,
+ * doc/examples/trash/image_plain.cc,
+ * doc/examples/trash/box.cc,
+ * doc/examples/trash/cpp_issue.cc,
+ * doc/examples/trash/image_safe.cc,
+ * doc/examples/trash/labeling_algo.cc,
+ * doc/examples/trash/mk_graph.cc,
+ * doc/examples/trash/p_array.2.cc,
+ * doc/examples/trash/p_array.cc,
+ * doc/examples/trash/p_image.cc,
+ * doc/examples/trash/p_key.2.cc,
+ * doc/examples/trash/p_key.cc,
+ * doc/examples/trash/p_line2d.cc,
+ * doc/examples/trash/p_mutable_array_of.cc,
+ * doc/examples/trash/p_queue.cc,
+ * doc/examples/trash/p_run.cc,
+ * doc/examples/trash/p_vaccess.cc,
+ * doc/examples/trash/proxy.cc,
+ * doc/examples/trash/sub_image.cc,
+ * doc/examples/trash/sub_image_if.cc,
+ * doc/examples/trash/tuto_bis.cc,
+ * doc/examples/trash/tuto_one.cc,
+ * doc/examples/trash/vec.cc,
+ * doc/examples/trash/win_multiple.cc,
+ * doc/examples/tuto2_first_image.cc,
+ * doc/examples/tuto3_rw_image.cc,
+ * doc/examples/tuto4_genericity_and_algorithms.cc,
+ * doc/examples/win-create-1.cc,
+ * doc/examples/win-create-2.cc,
+ * doc/figures/extend-1.ppm,
+ * doc/figures/extend-2.ppm,
+ * doc/figures/extend-3.ppm,
+ * doc/figures/extend-4.ppm,
+ * doc/figures/extend-5.ppm,
+ * doc/figures/fill-subdomain-1.pbm,
+ * doc/figures/fill-subdomain-2.ppm,
+ * doc/figures/fill-subdomain-3.ppm,
+ * doc/figures/fill-subdomain-4.ppm,
+ * doc/figures/figures.mk,
+ * doc/figures/fill-subimage-cfun-1.ppm,
+ * doc/figures/ima2d-rot-1.ppm,
+ * doc/figures/ima2d-rot-2.ppm,
+ * doc/figures/ima_save.pbm,
+ * doc/figures/labeling-compute-1.pbm,
+ * doc/figures/labeling-compute-2.ppm,
+ * doc/figures/logical-not-1.pbm,
+ * doc/figures/logical-not-2.pbm,
+ * doc/figures/logical-not-3.pbm,
+ * doc/figures/tuto2_first_image-1.pbm,
+ * doc/figures/tuto3_rw_image-1.ppm,
+ * doc/figures/tuto3_rw_image-2.ppm,
+ * doc/figures/tuto3_rw_image-3.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-1.,
+ * doc/figures/tuto4_genericity_and_algorithms-2.,
+ * doc/figures/tuto4_genericity_and_algorithms-3.,
+ * doc/figures/tuto4_genericity_and_algorithms-4.,
+ * doc/figures/tuto4_genericity_and_algorithms-5.,
+ * doc/figures/tuto4_genericity_and_algorithms-6.,
+ * doc/figures/tuto4_genericity_and_algorithms-7.,
+ * doc/figures/tuto4_genericity_and_algorithms-7.,
+ * doc/figures/tuto4_genericity_and_algorithms-8.,
+ * doc/figures/tuto4_genericity_and_algorithms-8.,
+ * doc/figures/tuto4_genericity_and_algorithms-9.,
+ * doc/figures/tuto4_genericity_and_algorithms-9.,
+ * doc/generate_dist_files.sh,
+ * doc/img/small-enlarged.png,
+ * doc/img/small.png,
+ * doc/outputs/accu-right-instanciation.txt,
+ * doc/outputs/borderthickness.txt,
+ * doc/outputs/box2d-bbox.txt,
+ * doc/outputs/domain-display.txt,
+ * doc/outputs/dpoint-1.txt,
+ * doc/outputs/estim-sites.txt,
+ * doc/outputs/extend.txt,
+ * doc/outputs/extension-ignore.txt,
+ * doc/outputs/fill-call-1.txt,
+ * doc/outputs/fill-part-image.txt,
+ * doc/outputs/fill-subdomain-shorter.txt,
+ * doc/outputs/fill-subdomain.txt,
+ * doc/outputs/fill-subimage-cfun.txt,
+ * doc/outputs/fill.txt,
+ * doc/outputs/forall-piter.txt,
+ * doc/outputs/fun-p2v-1.txt,
+ * doc/outputs/graph-data.txt,
+ * doc/outputs/graph-iter.txt,
+ * doc/outputs/graph-output-1.txt,
+ * doc/outputs/ima-has.txt,
+ * doc/outputs/ima-save.txt,
+ * doc/outputs/ima-size.txt,
+ * doc/outputs/ima2d-1.txt,
+ * doc/outputs/ima2d-2.txt,
+ * doc/outputs/ima2d-3.txt,
+ * doc/outputs/ima2d-4.txt,
+ * doc/outputs/ima2d-5.txt,
+ * doc/outputs/ima2d-6-clone.txt,
+ * doc/outputs/ima2d-7.txt,
+ * doc/outputs/ima2d-decl-2.txt,
+ * doc/outputs/ima2d-display-1.txt,
+ * doc/outputs/ima2d-display-2.txt,
+ * doc/outputs/ima2d-display-output-1.txt,
+ * doc/outputs/ima2d-display-output-2.txt,
+ * doc/outputs/ima2d-rot.txt,
+ * doc/outputs/labeling-compute.txt,
+ * doc/outputs/logical-not.txt,
+ * doc/outputs/mln_var.txt,
+ * doc/outputs/outputs.mk,
+ * doc/outputs/parray-append.txt,
+ * doc/outputs/parray-bbox.txt,
+ * doc/outputs/parray-display-1.txt,
+ * doc/outputs/paste-call-1.txt,
+ * doc/outputs/paste.txt,
+ * doc/outputs/point-1.txt,
+ * doc/outputs/predicate-1.txt,
+ * doc/outputs/tuto2_first_image.txt,
+ * doc/outputs/tuto3_rw_image.txt,
+ * doc/outputs/tuto4_genericity_and_algorithms.txt,
+ * doc/outputs/win-create-1-display.txt,
+ * doc/outputs/win-create-1.txt,
+ * doc/outputs/win-create-2.txt,
+ * doc/tools/sample_utils.hh,
+ * doc/tools/split_sample.sh,
+ * doc/tools/todoxygen.sh: ... here.
+
+ * doc/tutorial/tutorial.tex: split into tutorial.tex and...
+ * doc/ref_guide/ref_guide.tex: ... this file.
+ * doc/ref_guide/Makefile.am: add new rules.
+
+ * doc/tutorial/Makefile.am: update rules.
+
+ * doc/white_paper/Makefile.am,
+ * doc/white_paper/figures/house.png,
+ * doc/white_paper/figures/house_rag.png,
+ * doc/white_paper/figures/house_wshed.png,
+ * doc/white_paper/figures/house_wshed_mean_colors.png,
+ * doc/white_paper/white_paper.tex: introduce a new white paper.
+
+ * mln/core/concept/image.hh,
+ * mln/core/concept/object.hh,
+ * mln/core/image/cast_image.hh,
+ * mln/core/image/image1d.hh,
+ * mln/core/image/image2d.hh,
+ * mln/core/image/image2d_h.hh,
+ * mln/core/image/image3d.hh,
+ * mln/core/image/image_if.hh: test documentation group with doxygen.
+
+ * mln/opt/all.hh: add doc for mln::opt namespace.
+
+ * tests/util/soft_heap.cc: fix \file command.
+
2009-03-05 Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix level::stretch and value::lut_vec.
diff --git a/milena/doc/Doxyfile.in b/milena/doc/Doxyfile.in
index 5d657a4..053cbe7 100644
--- a/milena/doc/Doxyfile.in
+++ b/milena/doc/Doxyfile.in
@@ -85,20 +85,20 @@ RECURSIVE = YES
EXCLUDE = @top_srcdir@/milena/sandbox \
@top_srcdir@/milena/mln/core/concept/proxy.hxx \
@top_srcdir@/milena/trash \
- @top_srcdir@/milena/doc/tutorial/samples
+ @top_srcdir@/milena/doc/examples/trash
EXCLUDE_SYMLINKS = YES
EXCLUDE_PATTERNS = *spe.hh
EXCLUDE_SYMBOLS =
-EXAMPLE_PATH = @top_srcdir@/milena/doc/tutorial/samples \
- @top_builddir@/milena/doc/tutorial/samples \
- @top_builddir@/milena/doc/tutorial/outputs \
- @top_builddir@/milena/doc/tutorial/outputs/splitted \
- @top_srcdir@/milena/doc/tutorial/outputs
+EXAMPLE_PATH = @top_srcdir@/milena/doc/examples \
+ @top_builddir@/milena/doc/examples \
+ @top_builddir@/milena/doc/outputs \
+ @top_builddir@/milena/doc/outputs/splitted \
+ @top_srcdir@/milena/doc/outputs
EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
-IMAGE_PATH = @top_srcdir@/milena/doc/tutorial/img \
- @top_srcdir@/milena/doc/tutorial/figures \
- @top_builddir@/milena/doc/tutorial/figures
+IMAGE_PATH = @top_srcdir@/milena/doc/img \
+ @top_srcdir@/milena/doc/figures \
+ @top_builddir@/milena/doc/figures
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
diff --git a/milena/doc/Makefile.am b/milena/doc/Makefile.am
index aa1b30c..ad25545 100644
--- a/milena/doc/Makefile.am
+++ b/milena/doc/Makefile.am
@@ -2,32 +2,55 @@
include $(top_srcdir)/milena/doc/doc.mk
-SUBDIRS = tutorial
+SUBDIRS = tutorial white_paper
DOXYGEN = doxygen
-.PHONY: doc user-doc complete-doc html_complete html_user tutorial
+.PHONY: doc user-doc complete-doc html-complete html-user tutorial white-paper regen-dist
doc: user-doc
-complete-doc: html_complete
+complete-doc: html-complete
-user-doc: html_user
+user-doc: html-user
-html_complete: Doxyfile tuto_html
+html-complete: Doxyfile tuto-html ref-guide-html
$(DOXYGEN) Doxyfile_complete
-html_user: Doxyfile tuto_html
+html-user: Doxyfile tuto-html ref-guide-html
$(DOXYGEN) Doxyfile_user
-tuto_html:
- $(MAKE) -C tutorial tuto_html
+tuto-html: data fig-convert
+ $(MAKE) -C tutorial tuto-html
-tutorial: all
+tutorial: data fig-convert
$(MAKE) -C tutorial tutorial
+white-paper:
+ $(MAKE) -C white_paper white-paper
+
+ref-guide:
+ $(MAKE) -C ref_guide ref-guide
+
+ref-guide-html:
+ $(MAKE) -C ref_guide ref-guide-html
+
+
+data:
+ make -C examples data
+
fix-refdata:
- $(MAKE) -C tutorial fix-refdata
+ make -C examples fix-refdata
+
+fig-convert:
+ @failcom='exit 1'; \
+ list="$(FIGURES_BUILDDIR)/*.p*m"; for img in $$list; do \
+ echo "Converting $$img to png"; \
+ name=`basename $$img` \
+ ext=`echo $$name | cut -d '.' -f 2`; \
+ convert -scale 250 $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png\
+ || eval $$failcom; \
+ done;
edit = sed -e "s|@ID@|$$Id|" \
-e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
@@ -54,10 +77,32 @@ edit_user = sed -e 's,OUTPUT_DIRECTORY = ./complete/,OUTPUT_DIRECTORY
-e 's,EXCLUDE_SYMBOLS =,EXCLUDE_SYMBOLS = *::internal* *_ mln::trait::*,g'
+regen-dist: $(srcdir)/headers.stamp
+
+$(srcdir)/examples/examples.mk: $(srcdir)/headers.stamp
+$(srcdir)/figures/figures.mk: $(srcdir)/headers.stamp
+$(srcdir)/outputs/outputs.mk: $(srcdir)/headers.stamp
+
+
+EXTRA_DIST = $(srcdir)/headers.stamp
+$(srcdir)/headers.stamp: $(srcdir)/generate_dist_files.sh
+ @rm -f $@.tmp
+ @touch $@.tmp
+ cd $(srcdir) && ./generate_dist_files.sh
+ @mv -f $@.tmp $@
+
+
+include $(srcdir)/examples/examples.mk
+include $(srcdir)/figures/figures.mk
+include $(srcdir)/outputs/outputs.mk
+
-EXTRA_DIST = \
+EXTRA_DIST += \
Doxyfile.in \
-$(top_builddir)/milena/doc/user
+user \
+tools/sample_utils.hh \
+tools/split_sample.sh \
+tools/todoxygen.sh
CLEANFILES = \
Doxyfile_complete \
diff --git a/milena/doc/doc.mk b/milena/doc/doc.mk
index 938c4c3..8f2bd33 100644
--- a/milena/doc/doc.mk
+++ b/milena/doc/doc.mk
@@ -5,14 +5,14 @@ include $(top_srcdir)/milena/tests/tests.mk
AM_CPPFLAGS += -I$(top_srcdir)/milena/doc/tutorial/tools
-TUTORIAL_SRCDIR = $(top_srcdir)/milena/doc/tutorial
-OUTPUTS_SRCDIR = $(TUTORIAL_SRCDIR)/outputs
-FIGURES_SRCDIR = $(TUTORIAL_SRCDIR)/figures
-SAMPLES_SRCDIR = $(TUTORIAL_SRCDIR)/samples
-IMG_SRCDIR = $(TUTORIAL_SRCDIR)/img
+DOC_SRCDIR = $(top_srcdir)/milena/doc/
+OUTPUTS_SRCDIR = $(DOC_SRCDIR)/outputs
+FIGURES_SRCDIR = $(DOC_SRCDIR)/figures
+EXAMPLES_SRCDIR = $(DOC_SRCDIR)/examples
+IMG_SRCDIR = $(DOC_SRCDIR)/img
-TUTORIAL_BUILDDIR = $(top_builddir)/milena/doc/tutorial
-OUTPUTS_BUILDDIR = $(TUTORIAL_BUILDDIR)/outputs
-SPLITTED_OUTPUTS_BUILDDIR = $(TUTORIAL_BUILDDIR)/outputs/splitted
-FIGURES_BUILDDIR = $(TUTORIAL_BUILDDIR)/figures
-SAMPLES_BUILDDIR = $(TUTORIAL_BUILDDIR)/samples
+DOC_BUILDDIR = $(top_builddir)/milena/doc/
+OUTPUTS_BUILDDIR = $(DOC_BUILDDIR)/outputs
+SPLITTED_OUTPUTS_BUILDDIR = $(DOC_BUILDDIR)/outputs/splitted
+FIGURES_BUILDDIR = $(DOC_BUILDDIR)/figures
+EXAMPLES_BUILDDIR = $(DOC_BUILDDIR)/examples
diff --git a/milena/doc/tutorial/samples/Makefile.am b/milena/doc/examples/Makefile.am
similarity index 95%
rename from milena/doc/tutorial/samples/Makefile.am
rename to milena/doc/examples/Makefile.am
index 899f8a8..74f68f1 100644
--- a/milena/doc/tutorial/samples/Makefile.am
+++ b/milena/doc/examples/Makefile.am
@@ -169,10 +169,10 @@ fix-refdata:
split-samples:
- mkdir -p $(SAMPLES_BUILDDIR)
+ mkdir -p $(EXAMPLES_BUILDDIR)
@failcom='exit 1'; \
- list='$(SAMPLES_SRCDIR)/*.cc'; for file in $$list; do \
- $(TUTORIAL_SRCDIR)/tools/split_sample.sh $$file cc $(SAMPLES_BUILDDIR)\
+ list='$(EXAMPLES_SRCDIR)/*.cc'; for file in $$list; do \
+ $(DOC_SRCDIR)/tools/split_sample.sh $$file cc $(EXAMPLES_BUILDDIR)\
|| eval $$failcom; \
done
@@ -180,14 +180,14 @@ split-outputs:
mkdir -p $(SPLITTED_OUTPUTS_BUILDDIR)
@failcom='exit 1'; \
list='$(OUTPUTS_BUILDDIR)/*.txt'; for file in $$list; do \
- $(TUTORIAL_SRCDIR)/tools/split_sample.sh $$file txt $(SPLITTED_OUTPUTS_BUILDDIR)\
+ $(DOC_SRCDIR)/tools/split_sample.sh $$file txt $(SPLITTED_OUTPUTS_BUILDDIR)\
|| eval $$failcom; \
done
clean-local: clean-figures
rm -Rf $(OUTPUTS_BUILDDIR)
- rm -f $(SAMPLES_BUILDDIR)/*.cc
+ rm -f $(EXAMPLES_BUILDDIR)/*.cc
clean-figures:
rm -Rf $(FIGURES_BUILDDIR)
diff --git a/milena/doc/tutorial/samples/accu-right-instanciation.cc b/milena/doc/examples/accu-right-instanciation.cc
similarity index 100%
rename from milena/doc/tutorial/samples/accu-right-instanciation.cc
rename to milena/doc/examples/accu-right-instanciation.cc
diff --git a/milena/doc/tutorial/samples/accu-wrong-instanciation.cc.raw b/milena/doc/examples/accu-wrong-instanciation.cc.raw
similarity index 100%
rename from milena/doc/tutorial/samples/accu-wrong-instanciation.cc.raw
rename to milena/doc/examples/accu-wrong-instanciation.cc.raw
diff --git a/milena/doc/tutorial/samples/borderthickness.cc b/milena/doc/examples/borderthickness.cc
similarity index 100%
rename from milena/doc/tutorial/samples/borderthickness.cc
rename to milena/doc/examples/borderthickness.cc
diff --git a/milena/doc/tutorial/samples/box2d-bbox.cc b/milena/doc/examples/box2d-bbox.cc
similarity index 100%
rename from milena/doc/tutorial/samples/box2d-bbox.cc
rename to milena/doc/examples/box2d-bbox.cc
diff --git a/milena/doc/tutorial/samples/domain-display.cc b/milena/doc/examples/domain-display.cc
similarity index 100%
rename from milena/doc/tutorial/samples/domain-display.cc
rename to milena/doc/examples/domain-display.cc
diff --git a/milena/doc/tutorial/samples/dpoint-1.cc b/milena/doc/examples/dpoint-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/dpoint-1.cc
rename to milena/doc/examples/dpoint-1.cc
diff --git a/milena/doc/tutorial/samples/estim-sites.cc b/milena/doc/examples/estim-sites.cc
similarity index 100%
rename from milena/doc/tutorial/samples/estim-sites.cc
rename to milena/doc/examples/estim-sites.cc
diff --git a/milena/doc/examples/examples.mk b/milena/doc/examples/examples.mk
new file mode 100644
index 0000000..65b0a3f
--- /dev/null
+++ b/milena/doc/examples/examples.mk
@@ -0,0 +1,88 @@
+## Generated by ../generate_dist_files, do not modify.
+
+EXTRA_DIST += \
+examples/paste-call-1.cc \
+examples/dpoint-1.cc \
+examples/parray-append.cc \
+examples/trash \
+examples/trash/cpp_issue.cc \
+examples/trash/sub_image.cc \
+examples/trash/sub_image_if.cc \
+examples/trash/graph.cc \
+examples/trash/p_vaccess.cc \
+examples/trash/tuto_one.cc \
+examples/trash/win_multiple.cc \
+examples/trash/image2d.cc \
+examples/trash/image_plain.cc \
+examples/trash/p_run.cc \
+examples/trash/proxy.cc \
+examples/trash/p_array.2.cc \
+examples/trash/labeling_algo.cc \
+examples/trash/for_Z.cc \
+examples/trash/image_if.cc \
+examples/trash/p_key.cc \
+examples/trash/p_mutable_array_of.cc \
+examples/trash/p_queue.cc \
+examples/trash/image_flat.cc \
+examples/trash/p_image.cc \
+examples/trash/mk_graph.cc \
+examples/trash/box.cc \
+examples/trash/p_line2d.cc \
+examples/trash/p_array.cc \
+examples/trash/accu.cc \
+examples/trash/p_key.2.cc \
+examples/trash/window.cc \
+examples/trash/tuto_bis.cc \
+examples/trash/image_safe.cc \
+examples/trash/erosion.cc \
+examples/trash/vec.cc \
+examples/fill-proto.cc.raw \
+examples/ima2d-restricted-1.cc.raw \
+examples/graph-iter.cc \
+examples/labeling-compute.cc \
+examples/ima2d-7.cc \
+examples/ima2d-restricted-2.cc.raw \
+examples/fill-subimage-cfun.cc \
+examples/ima-save.cc \
+examples/point-1.cc \
+examples/box2d-bbox.cc \
+examples/forall-piter.cc \
+examples/ima-size.cc \
+examples/examples.mk \
+examples/borderthickness.cc \
+examples/Makefile.in \
+examples/ima-load.cc \
+examples/ima-has.cc \
+examples/win-create-1.cc \
+examples/samples.mk \
+examples/accu-wrong-instanciation.cc.raw \
+examples/accu-right-instanciation.cc \
+examples/ima2d-5.cc \
+examples/fill-subdomain.cc \
+examples/fill-subdomain-shorter.cc \
+examples/tuto3_rw_image.cc \
+examples/ima2d-2.cc \
+examples/extension-ignore.cc \
+examples/extend.cc \
+examples/Makefile.am \
+examples/parray-bbox.cc \
+examples/graph-data.cc \
+examples/mln_var.cc \
+examples/ima2d-4.cc \
+examples/predicate-1.cc \
+examples/ima2d-3.cc \
+examples/tuto2_first_image.cc \
+examples/ima2d-1.cc \
+examples/estim-sites.cc \
+examples/ima2d-6-clone.cc \
+examples/ima2d-restricted-3.cc.raw \
+examples/logical-not.cc \
+examples/fun-p2v-1.cc \
+examples/ima2d-rot.cc \
+examples/fill-part-image.cc \
+examples/domain-display.cc \
+examples/tuto4_genericity_and_algorithms.cc \
+examples/paste.cc \
+examples/fill.cc \
+examples/fill-call-1.cc \
+examples/win-create-2.cc
diff --git a/milena/doc/tutorial/samples/extend.cc b/milena/doc/examples/extend.cc
similarity index 97%
rename from milena/doc/tutorial/samples/extend.cc
rename to milena/doc/examples/extend.cc
index 2f9ae0d..3448ddc 100644
--- a/milena/doc/tutorial/samples/extend.cc
+++ b/milena/doc/examples/extend.cc
@@ -1,7 +1,7 @@
#include <mln/essential/2d.hh>
#include <mln/fun/p2b/big_chess.hh>
#include <tests/data.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
namespace mln
{
diff --git a/milena/doc/tutorial/samples/extension-ignore.cc b/milena/doc/examples/extension-ignore.cc
similarity index 100%
rename from milena/doc/tutorial/samples/extension-ignore.cc
rename to milena/doc/examples/extension-ignore.cc
diff --git a/milena/doc/tutorial/samples/fill-call-1.cc b/milena/doc/examples/fill-call-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/fill-call-1.cc
rename to milena/doc/examples/fill-call-1.cc
diff --git a/milena/doc/tutorial/samples/fill-part-image.cc b/milena/doc/examples/fill-part-image.cc
similarity index 100%
rename from milena/doc/tutorial/samples/fill-part-image.cc
rename to milena/doc/examples/fill-part-image.cc
diff --git a/milena/doc/tutorial/samples/fill-proto.cc.raw b/milena/doc/examples/fill-proto.cc.raw
similarity index 100%
rename from milena/doc/tutorial/samples/fill-proto.cc.raw
rename to milena/doc/examples/fill-proto.cc.raw
diff --git a/milena/doc/tutorial/samples/fill-subdomain-shorter.cc b/milena/doc/examples/fill-subdomain-shorter.cc
similarity index 100%
rename from milena/doc/tutorial/samples/fill-subdomain-shorter.cc
rename to milena/doc/examples/fill-subdomain-shorter.cc
diff --git a/milena/doc/tutorial/samples/fill-subdomain.cc b/milena/doc/examples/fill-subdomain.cc
similarity index 96%
rename from milena/doc/tutorial/samples/fill-subdomain.cc
rename to milena/doc/examples/fill-subdomain.cc
index a5ec65e..a44d070 100644
--- a/milena/doc/tutorial/samples/fill-subdomain.cc
+++ b/milena/doc/examples/fill-subdomain.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/fill-subimage-cfun.cc b/milena/doc/examples/fill-subimage-cfun.cc
similarity index 93%
rename from milena/doc/tutorial/samples/fill-subimage-cfun.cc
rename to milena/doc/examples/fill-subimage-cfun.cc
index 2ff6c6c..06d2e0d 100644
--- a/milena/doc/tutorial/samples/fill-subimage-cfun.cc
+++ b/milena/doc/examples/fill-subimage-cfun.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
// \{
bool row_oddity(mln::point2d p)
{
diff --git a/milena/doc/tutorial/samples/fill.cc b/milena/doc/examples/fill.cc
similarity index 100%
rename from milena/doc/tutorial/samples/fill.cc
rename to milena/doc/examples/fill.cc
diff --git a/milena/doc/tutorial/samples/forall-piter.cc b/milena/doc/examples/forall-piter.cc
similarity index 100%
rename from milena/doc/tutorial/samples/forall-piter.cc
rename to milena/doc/examples/forall-piter.cc
diff --git a/milena/doc/tutorial/samples/fun-p2v-1.cc b/milena/doc/examples/fun-p2v-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/fun-p2v-1.cc
rename to milena/doc/examples/fun-p2v-1.cc
diff --git a/milena/doc/tutorial/samples/graph-data.cc b/milena/doc/examples/graph-data.cc
similarity index 100%
rename from milena/doc/tutorial/samples/graph-data.cc
rename to milena/doc/examples/graph-data.cc
diff --git a/milena/doc/tutorial/samples/graph-iter.cc b/milena/doc/examples/graph-iter.cc
similarity index 98%
rename from milena/doc/tutorial/samples/graph-iter.cc
rename to milena/doc/examples/graph-iter.cc
index 2e52d7d..613283a 100644
--- a/milena/doc/tutorial/samples/graph-iter.cc
+++ b/milena/doc/examples/graph-iter.cc
@@ -1,6 +1,6 @@
#include <mln/essential/2d.hh>
#include <mln/util/graph.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
struct viota_t : public mln::Function_p2v< viota_t >
{
diff --git a/milena/doc/tutorial/samples/ima-has.cc b/milena/doc/examples/ima-has.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima-has.cc
rename to milena/doc/examples/ima-has.cc
diff --git a/milena/doc/tutorial/samples/ima-load.cc b/milena/doc/examples/ima-load.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima-load.cc
rename to milena/doc/examples/ima-load.cc
diff --git a/milena/doc/tutorial/samples/ima-save.cc b/milena/doc/examples/ima-save.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima-save.cc
rename to milena/doc/examples/ima-save.cc
diff --git a/milena/doc/tutorial/samples/ima-size.cc b/milena/doc/examples/ima-size.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima-size.cc
rename to milena/doc/examples/ima-size.cc
diff --git a/milena/doc/tutorial/samples/ima2d-1.cc b/milena/doc/examples/ima2d-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-1.cc
rename to milena/doc/examples/ima2d-1.cc
diff --git a/milena/doc/tutorial/samples/ima2d-2.cc b/milena/doc/examples/ima2d-2.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-2.cc
rename to milena/doc/examples/ima2d-2.cc
diff --git a/milena/doc/tutorial/samples/ima2d-3.cc b/milena/doc/examples/ima2d-3.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-3.cc
rename to milena/doc/examples/ima2d-3.cc
diff --git a/milena/doc/tutorial/samples/ima2d-4.cc b/milena/doc/examples/ima2d-4.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-4.cc
rename to milena/doc/examples/ima2d-4.cc
diff --git a/milena/doc/tutorial/samples/ima2d-5.cc b/milena/doc/examples/ima2d-5.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-5.cc
rename to milena/doc/examples/ima2d-5.cc
diff --git a/milena/doc/tutorial/samples/ima2d-6-clone.cc b/milena/doc/examples/ima2d-6-clone.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-6-clone.cc
rename to milena/doc/examples/ima2d-6-clone.cc
diff --git a/milena/doc/tutorial/samples/ima2d-7.cc b/milena/doc/examples/ima2d-7.cc
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-7.cc
rename to milena/doc/examples/ima2d-7.cc
diff --git a/milena/doc/tutorial/samples/ima2d-restricted-1.cc.raw b/milena/doc/examples/ima2d-restricted-1.cc.raw
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-restricted-1.cc.raw
rename to milena/doc/examples/ima2d-restricted-1.cc.raw
diff --git a/milena/doc/tutorial/samples/ima2d-restricted-2.cc.raw b/milena/doc/examples/ima2d-restricted-2.cc.raw
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-restricted-2.cc.raw
rename to milena/doc/examples/ima2d-restricted-2.cc.raw
diff --git a/milena/doc/tutorial/samples/ima2d-restricted-3.cc.raw b/milena/doc/examples/ima2d-restricted-3.cc.raw
similarity index 100%
rename from milena/doc/tutorial/samples/ima2d-restricted-3.cc.raw
rename to milena/doc/examples/ima2d-restricted-3.cc.raw
diff --git a/milena/doc/tutorial/samples/ima2d-rot.cc b/milena/doc/examples/ima2d-rot.cc
similarity index 96%
rename from milena/doc/tutorial/samples/ima2d-rot.cc
rename to milena/doc/examples/ima2d-rot.cc
index 05e12ad..515f325 100644
--- a/milena/doc/tutorial/samples/ima2d-rot.cc
+++ b/milena/doc/examples/ima2d-rot.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/labeling-compute.cc b/milena/doc/examples/labeling-compute.cc
similarity index 94%
rename from milena/doc/tutorial/samples/labeling-compute.cc
rename to milena/doc/examples/labeling-compute.cc
index c91fc05..a22b471 100644
--- a/milena/doc/tutorial/samples/labeling-compute.cc
+++ b/milena/doc/examples/labeling-compute.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/logical-not.cc b/milena/doc/examples/logical-not.cc
similarity index 91%
rename from milena/doc/tutorial/samples/logical-not.cc
rename to milena/doc/examples/logical-not.cc
index 18651b0..ac718b8 100644
--- a/milena/doc/tutorial/samples/logical-not.cc
+++ b/milena/doc/examples/logical-not.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/mln_var.cc b/milena/doc/examples/mln_var.cc
similarity index 100%
rename from milena/doc/tutorial/samples/mln_var.cc
rename to milena/doc/examples/mln_var.cc
diff --git a/milena/doc/tutorial/samples/parray-append.cc b/milena/doc/examples/parray-append.cc
similarity index 100%
rename from milena/doc/tutorial/samples/parray-append.cc
rename to milena/doc/examples/parray-append.cc
diff --git a/milena/doc/tutorial/samples/parray-bbox.cc b/milena/doc/examples/parray-bbox.cc
similarity index 100%
rename from milena/doc/tutorial/samples/parray-bbox.cc
rename to milena/doc/examples/parray-bbox.cc
diff --git a/milena/doc/tutorial/samples/paste-call-1.cc b/milena/doc/examples/paste-call-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/paste-call-1.cc
rename to milena/doc/examples/paste-call-1.cc
diff --git a/milena/doc/tutorial/samples/paste.cc b/milena/doc/examples/paste.cc
similarity index 100%
rename from milena/doc/tutorial/samples/paste.cc
rename to milena/doc/examples/paste.cc
diff --git a/milena/doc/tutorial/samples/point-1.cc b/milena/doc/examples/point-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/point-1.cc
rename to milena/doc/examples/point-1.cc
diff --git a/milena/doc/tutorial/samples/predicate-1.cc b/milena/doc/examples/predicate-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/predicate-1.cc
rename to milena/doc/examples/predicate-1.cc
diff --git a/milena/doc/tutorial/samples/samples.mk b/milena/doc/examples/samples.mk
similarity index 100%
rename from milena/doc/tutorial/samples/samples.mk
rename to milena/doc/examples/samples.mk
diff --git a/milena/doc/tutorial/examples/accu.cc b/milena/doc/examples/trash/accu.cc
similarity index 100%
rename from milena/doc/tutorial/examples/accu.cc
rename to milena/doc/examples/trash/accu.cc
diff --git a/milena/doc/tutorial/examples/box.cc b/milena/doc/examples/trash/box.cc
similarity index 100%
rename from milena/doc/tutorial/examples/box.cc
rename to milena/doc/examples/trash/box.cc
diff --git a/milena/doc/tutorial/examples/cpp_issue.cc b/milena/doc/examples/trash/cpp_issue.cc
similarity index 100%
rename from milena/doc/tutorial/examples/cpp_issue.cc
rename to milena/doc/examples/trash/cpp_issue.cc
diff --git a/milena/doc/examples/erosion.cc b/milena/doc/examples/trash/erosion.cc
similarity index 100%
rename from milena/doc/examples/erosion.cc
rename to milena/doc/examples/trash/erosion.cc
diff --git a/milena/doc/tutorial/examples/for_Z.cc b/milena/doc/examples/trash/for_Z.cc
similarity index 100%
rename from milena/doc/tutorial/examples/for_Z.cc
rename to milena/doc/examples/trash/for_Z.cc
diff --git a/milena/doc/examples/graph.cc b/milena/doc/examples/trash/graph.cc
similarity index 100%
rename from milena/doc/examples/graph.cc
rename to milena/doc/examples/trash/graph.cc
diff --git a/milena/doc/tutorial/examples/image2d.cc b/milena/doc/examples/trash/image2d.cc
similarity index 100%
rename from milena/doc/tutorial/examples/image2d.cc
rename to milena/doc/examples/trash/image2d.cc
diff --git a/milena/doc/tutorial/examples/image_flat.cc b/milena/doc/examples/trash/image_flat.cc
similarity index 100%
rename from milena/doc/tutorial/examples/image_flat.cc
rename to milena/doc/examples/trash/image_flat.cc
diff --git a/milena/doc/tutorial/examples/image_if.cc b/milena/doc/examples/trash/image_if.cc
similarity index 100%
rename from milena/doc/tutorial/examples/image_if.cc
rename to milena/doc/examples/trash/image_if.cc
diff --git a/milena/doc/tutorial/examples/image_plain.cc b/milena/doc/examples/trash/image_plain.cc
similarity index 100%
rename from milena/doc/tutorial/examples/image_plain.cc
rename to milena/doc/examples/trash/image_plain.cc
diff --git a/milena/doc/tutorial/examples/image_safe.cc b/milena/doc/examples/trash/image_safe.cc
similarity index 100%
rename from milena/doc/tutorial/examples/image_safe.cc
rename to milena/doc/examples/trash/image_safe.cc
diff --git a/milena/doc/examples/labeling_algo.cc b/milena/doc/examples/trash/labeling_algo.cc
similarity index 100%
rename from milena/doc/examples/labeling_algo.cc
rename to milena/doc/examples/trash/labeling_algo.cc
diff --git a/milena/doc/examples/mk_graph.cc b/milena/doc/examples/trash/mk_graph.cc
similarity index 100%
rename from milena/doc/examples/mk_graph.cc
rename to milena/doc/examples/trash/mk_graph.cc
diff --git a/milena/doc/tutorial/examples/p_array.2.cc b/milena/doc/examples/trash/p_array.2.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_array.2.cc
rename to milena/doc/examples/trash/p_array.2.cc
diff --git a/milena/doc/tutorial/examples/p_array.cc b/milena/doc/examples/trash/p_array.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_array.cc
rename to milena/doc/examples/trash/p_array.cc
diff --git a/milena/doc/tutorial/examples/p_image.cc b/milena/doc/examples/trash/p_image.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_image.cc
rename to milena/doc/examples/trash/p_image.cc
diff --git a/milena/doc/tutorial/examples/p_key.2.cc b/milena/doc/examples/trash/p_key.2.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_key.2.cc
rename to milena/doc/examples/trash/p_key.2.cc
diff --git a/milena/doc/tutorial/examples/p_key.cc b/milena/doc/examples/trash/p_key.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_key.cc
rename to milena/doc/examples/trash/p_key.cc
diff --git a/milena/doc/tutorial/examples/p_line2d.cc b/milena/doc/examples/trash/p_line2d.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_line2d.cc
rename to milena/doc/examples/trash/p_line2d.cc
diff --git a/milena/doc/tutorial/examples/p_mutable_array_of.cc b/milena/doc/examples/trash/p_mutable_array_of.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_mutable_array_of.cc
rename to milena/doc/examples/trash/p_mutable_array_of.cc
diff --git a/milena/doc/tutorial/examples/p_queue.cc b/milena/doc/examples/trash/p_queue.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_queue.cc
rename to milena/doc/examples/trash/p_queue.cc
diff --git a/milena/doc/tutorial/examples/p_run.cc b/milena/doc/examples/trash/p_run.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_run.cc
rename to milena/doc/examples/trash/p_run.cc
diff --git a/milena/doc/tutorial/examples/p_vaccess.cc b/milena/doc/examples/trash/p_vaccess.cc
similarity index 100%
rename from milena/doc/tutorial/examples/p_vaccess.cc
rename to milena/doc/examples/trash/p_vaccess.cc
diff --git a/milena/doc/tutorial/examples/proxy.cc b/milena/doc/examples/trash/proxy.cc
similarity index 100%
rename from milena/doc/tutorial/examples/proxy.cc
rename to milena/doc/examples/trash/proxy.cc
diff --git a/milena/doc/tutorial/examples/sub_image.cc b/milena/doc/examples/trash/sub_image.cc
similarity index 100%
rename from milena/doc/tutorial/examples/sub_image.cc
rename to milena/doc/examples/trash/sub_image.cc
diff --git a/milena/doc/tutorial/examples/sub_image_if.cc b/milena/doc/examples/trash/sub_image_if.cc
similarity index 100%
rename from milena/doc/tutorial/examples/sub_image_if.cc
rename to milena/doc/examples/trash/sub_image_if.cc
diff --git a/milena/doc/examples/tuto_bis.cc b/milena/doc/examples/trash/tuto_bis.cc
similarity index 100%
rename from milena/doc/examples/tuto_bis.cc
rename to milena/doc/examples/trash/tuto_bis.cc
diff --git a/milena/doc/examples/tuto_one.cc b/milena/doc/examples/trash/tuto_one.cc
similarity index 100%
rename from milena/doc/examples/tuto_one.cc
rename to milena/doc/examples/trash/tuto_one.cc
diff --git a/milena/doc/tutorial/examples/vec.cc b/milena/doc/examples/trash/vec.cc
similarity index 100%
rename from milena/doc/tutorial/examples/vec.cc
rename to milena/doc/examples/trash/vec.cc
diff --git a/milena/doc/tutorial/examples/win_multiple.cc b/milena/doc/examples/trash/win_multiple.cc
similarity index 100%
rename from milena/doc/tutorial/examples/win_multiple.cc
rename to milena/doc/examples/trash/win_multiple.cc
diff --git a/milena/doc/tutorial/examples/window.cc b/milena/doc/examples/trash/window.cc
similarity index 100%
rename from milena/doc/tutorial/examples/window.cc
rename to milena/doc/examples/trash/window.cc
diff --git a/milena/doc/tutorial/samples/tuto2_first_image.cc b/milena/doc/examples/tuto2_first_image.cc
similarity index 96%
rename from milena/doc/tutorial/samples/tuto2_first_image.cc
rename to milena/doc/examples/tuto2_first_image.cc
index c9ef0fd..0e3a6a6 100644
--- a/milena/doc/tutorial/samples/tuto2_first_image.cc
+++ b/milena/doc/examples/tuto2_first_image.cc
@@ -1,5 +1,5 @@
#include <mln/essential/2d.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/tuto3_rw_image.cc b/milena/doc/examples/tuto3_rw_image.cc
similarity index 94%
rename from milena/doc/tutorial/samples/tuto3_rw_image.cc
rename to milena/doc/examples/tuto3_rw_image.cc
index aedbefd..a130da8 100644
--- a/milena/doc/tutorial/samples/tuto3_rw_image.cc
+++ b/milena/doc/examples/tuto3_rw_image.cc
@@ -1,6 +1,6 @@
#include <mln/essential/2d.hh>
#include <tests/data.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
int main()
{
using namespace mln;
diff --git a/milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc b/milena/doc/examples/tuto4_genericity_and_algorithms.cc
similarity index 98%
rename from milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc
rename to milena/doc/examples/tuto4_genericity_and_algorithms.cc
index 1dac310..296638e 100644
--- a/milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc
+++ b/milena/doc/examples/tuto4_genericity_and_algorithms.cc
@@ -2,7 +2,7 @@
#include <mln/binarization/threshold.hh>
#include <mln/debug/colorize.hh>
#include <tests/data.hh>
-#include <doc/tutorial/tools/sample_utils.hh>
+#include <doc/tools/sample_utils.hh>
struct keep_specific_colors : public mln::Function_v2b<keep_specific_colors>
{
diff --git a/milena/doc/tutorial/samples/win-create-1.cc b/milena/doc/examples/win-create-1.cc
similarity index 100%
rename from milena/doc/tutorial/samples/win-create-1.cc
rename to milena/doc/examples/win-create-1.cc
diff --git a/milena/doc/tutorial/samples/win-create-2.cc b/milena/doc/examples/win-create-2.cc
similarity index 100%
rename from milena/doc/tutorial/samples/win-create-2.cc
rename to milena/doc/examples/win-create-2.cc
diff --git a/milena/doc/tutorial/figures/extend-1.ppm b/milena/doc/figures/extend-1.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/extend-1.ppm
rename to milena/doc/figures/extend-1.ppm
diff --git a/milena/doc/tutorial/figures/extend-2.ppm b/milena/doc/figures/extend-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/extend-2.ppm
rename to milena/doc/figures/extend-2.ppm
diff --git a/milena/doc/tutorial/figures/extend-3.ppm b/milena/doc/figures/extend-3.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/extend-3.ppm
rename to milena/doc/figures/extend-3.ppm
diff --git a/milena/doc/tutorial/figures/extend-4.ppm b/milena/doc/figures/extend-4.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/extend-4.ppm
rename to milena/doc/figures/extend-4.ppm
diff --git a/milena/doc/tutorial/figures/extend-5.ppm b/milena/doc/figures/extend-5.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/extend-5.ppm
rename to milena/doc/figures/extend-5.ppm
diff --git a/milena/doc/tutorial/figures/figures.mk b/milena/doc/figures/figures.mk
similarity index 100%
rename from milena/doc/tutorial/figures/figures.mk
rename to milena/doc/figures/figures.mk
diff --git a/milena/doc/tutorial/figures/fill-subdomain-1.pbm b/milena/doc/figures/fill-subdomain-1.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/fill-subdomain-1.pbm
rename to milena/doc/figures/fill-subdomain-1.pbm
diff --git a/milena/doc/tutorial/figures/fill-subdomain-2.ppm b/milena/doc/figures/fill-subdomain-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/fill-subdomain-2.ppm
rename to milena/doc/figures/fill-subdomain-2.ppm
diff --git a/milena/doc/tutorial/figures/fill-subdomain-3.ppm b/milena/doc/figures/fill-subdomain-3.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/fill-subdomain-3.ppm
rename to milena/doc/figures/fill-subdomain-3.ppm
diff --git a/milena/doc/tutorial/figures/fill-subdomain-4.ppm b/milena/doc/figures/fill-subdomain-4.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/fill-subdomain-4.ppm
rename to milena/doc/figures/fill-subdomain-4.ppm
diff --git a/milena/doc/tutorial/figures/fill-subimage-cfun-1.ppm b/milena/doc/figures/fill-subimage-cfun-1.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/fill-subimage-cfun-1.ppm
rename to milena/doc/figures/fill-subimage-cfun-1.ppm
diff --git a/milena/doc/tutorial/figures/ima2d-rot-1.ppm b/milena/doc/figures/ima2d-rot-1.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/ima2d-rot-1.ppm
rename to milena/doc/figures/ima2d-rot-1.ppm
diff --git a/milena/doc/tutorial/figures/ima2d-rot-2.ppm b/milena/doc/figures/ima2d-rot-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/ima2d-rot-2.ppm
rename to milena/doc/figures/ima2d-rot-2.ppm
diff --git a/milena/doc/tutorial/figures/ima_save.pbm b/milena/doc/figures/ima_save.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/ima_save.pbm
rename to milena/doc/figures/ima_save.pbm
diff --git a/milena/doc/tutorial/figures/labeling-compute-1.pbm b/milena/doc/figures/labeling-compute-1.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/labeling-compute-1.pbm
rename to milena/doc/figures/labeling-compute-1.pbm
diff --git a/milena/doc/tutorial/figures/labeling-compute-2.ppm b/milena/doc/figures/labeling-compute-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/labeling-compute-2.ppm
rename to milena/doc/figures/labeling-compute-2.ppm
diff --git a/milena/doc/tutorial/figures/logical-not-1.pbm b/milena/doc/figures/logical-not-1.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/logical-not-1.pbm
rename to milena/doc/figures/logical-not-1.pbm
diff --git a/milena/doc/tutorial/figures/logical-not-2.pbm b/milena/doc/figures/logical-not-2.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/logical-not-2.pbm
rename to milena/doc/figures/logical-not-2.pbm
diff --git a/milena/doc/tutorial/figures/logical-not-3.pbm b/milena/doc/figures/logical-not-3.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/logical-not-3.pbm
rename to milena/doc/figures/logical-not-3.pbm
diff --git a/milena/doc/tutorial/figures/tuto2_first_image-1.pbm b/milena/doc/figures/tuto2_first_image-1.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto2_first_image-1.pbm
rename to milena/doc/figures/tuto2_first_image-1.pbm
diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-1.ppm b/milena/doc/figures/tuto3_rw_image-1.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto3_rw_image-1.ppm
rename to milena/doc/figures/tuto3_rw_image-1.ppm
diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-2.ppm b/milena/doc/figures/tuto3_rw_image-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto3_rw_image-2.ppm
rename to milena/doc/figures/tuto3_rw_image-2.ppm
diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-3.ppm b/milena/doc/figures/tuto3_rw_image-3.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto3_rw_image-3.ppm
rename to milena/doc/figures/tuto3_rw_image-3.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-1.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-1.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-2.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-2.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm b/milena/doc/figures/tuto4_genericity_and_algorithms-3.pbm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-3.pbm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-4.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-4.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-5.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-5.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-6.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-6.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-7.pgm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-7.pgm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-7.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-7.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-8.pgm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-8.pgm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-8.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-8.ppm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-9.pgm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-9.pgm
diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-9.ppm
similarity index 100%
rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm
rename to milena/doc/figures/tuto4_genericity_and_algorithms-9.ppm
diff --git a/milena/doc/tutorial/generate_dist_files.sh b/milena/doc/generate_dist_files.sh
similarity index 92%
rename from milena/doc/tutorial/generate_dist_files.sh
rename to milena/doc/generate_dist_files.sh
index 2df4c22..df2daad 100755
--- a/milena/doc/tutorial/generate_dist_files.sh
+++ b/milena/doc/generate_dist_files.sh
@@ -8,7 +8,7 @@
## would be to only emit lines ended with newlines.
ECHO_N=printf
-for dir in samples figures outputs examples; do
+for dir in figures outputs examples; do
OUT="$dir/$dir.mk"
echo "## Generated by ../generate_dist_files, do not modify." > $OUT
echo >>$OUT
diff --git a/milena/doc/groups.hh b/milena/doc/groups.hh
new file mode 100644
index 0000000..30d9b6f
--- /dev/null
+++ b/milena/doc/groups.hh
@@ -0,0 +1,28 @@
+/*! \defgroup modimage Image types.
+ *
+ * All the generic image types provided in Olena.
+ *
+ */
+
+/*! \defgroup modimageconcrete Basic types.
+ *
+ * Concrete images.
+ *
+ * \ingroup modimage
+ */
+
+/*! \defgroup modimagevaluemorpher Morpher on values.
+ *
+ * Morpher on image values.
+ *
+ * \ingroup modimage
+ */
+
+/*! \defgroup modimagedomainmorpher Morpher on domain.
+ *
+ * Morpher on image domain.
+ *
+ * \ingroup modimage
+ */
+
+
diff --git a/milena/doc/tutorial/img/small-enlarged.png b/milena/doc/img/small-enlarged.png
similarity index 100%
rename from milena/doc/tutorial/img/small-enlarged.png
rename to milena/doc/img/small-enlarged.png
diff --git a/milena/doc/tutorial/img/small.png b/milena/doc/img/small.png
similarity index 100%
rename from milena/doc/tutorial/img/small.png
rename to milena/doc/img/small.png
diff --git a/milena/doc/tutorial/outputs/accu-right-instanciation.txt b/milena/doc/outputs/accu-right-instanciation.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/accu-right-instanciation.txt
rename to milena/doc/outputs/accu-right-instanciation.txt
diff --git a/milena/doc/tutorial/outputs/borderthickness.txt b/milena/doc/outputs/borderthickness.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/borderthickness.txt
rename to milena/doc/outputs/borderthickness.txt
diff --git a/milena/doc/tutorial/outputs/box2d-bbox.txt b/milena/doc/outputs/box2d-bbox.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/box2d-bbox.txt
rename to milena/doc/outputs/box2d-bbox.txt
diff --git a/milena/doc/tutorial/outputs/domain-display.txt b/milena/doc/outputs/domain-display.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/domain-display.txt
rename to milena/doc/outputs/domain-display.txt
diff --git a/milena/doc/tutorial/outputs/dpoint-1.txt b/milena/doc/outputs/dpoint-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/dpoint-1.txt
rename to milena/doc/outputs/dpoint-1.txt
diff --git a/milena/doc/tutorial/outputs/estim-sites.txt b/milena/doc/outputs/estim-sites.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/estim-sites.txt
rename to milena/doc/outputs/estim-sites.txt
diff --git a/milena/doc/tutorial/outputs/extend.txt b/milena/doc/outputs/extend.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/extend.txt
rename to milena/doc/outputs/extend.txt
diff --git a/milena/doc/tutorial/outputs/extension-ignore.txt b/milena/doc/outputs/extension-ignore.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/extension-ignore.txt
rename to milena/doc/outputs/extension-ignore.txt
diff --git a/milena/doc/tutorial/outputs/fill-call-1.txt b/milena/doc/outputs/fill-call-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill-call-1.txt
rename to milena/doc/outputs/fill-call-1.txt
diff --git a/milena/doc/tutorial/outputs/fill-part-image.txt b/milena/doc/outputs/fill-part-image.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill-part-image.txt
rename to milena/doc/outputs/fill-part-image.txt
diff --git a/milena/doc/tutorial/outputs/fill-subdomain-shorter.txt b/milena/doc/outputs/fill-subdomain-shorter.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill-subdomain-shorter.txt
rename to milena/doc/outputs/fill-subdomain-shorter.txt
diff --git a/milena/doc/tutorial/outputs/fill-subdomain.txt b/milena/doc/outputs/fill-subdomain.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill-subdomain.txt
rename to milena/doc/outputs/fill-subdomain.txt
diff --git a/milena/doc/tutorial/outputs/fill-subimage-cfun.txt b/milena/doc/outputs/fill-subimage-cfun.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill-subimage-cfun.txt
rename to milena/doc/outputs/fill-subimage-cfun.txt
diff --git a/milena/doc/tutorial/outputs/fill.txt b/milena/doc/outputs/fill.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fill.txt
rename to milena/doc/outputs/fill.txt
diff --git a/milena/doc/tutorial/outputs/forall-piter.txt b/milena/doc/outputs/forall-piter.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/forall-piter.txt
rename to milena/doc/outputs/forall-piter.txt
diff --git a/milena/doc/tutorial/outputs/fun-p2v-1.txt b/milena/doc/outputs/fun-p2v-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/fun-p2v-1.txt
rename to milena/doc/outputs/fun-p2v-1.txt
diff --git a/milena/doc/tutorial/outputs/graph-data.txt b/milena/doc/outputs/graph-data.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/graph-data.txt
rename to milena/doc/outputs/graph-data.txt
diff --git a/milena/doc/tutorial/outputs/graph-iter.txt b/milena/doc/outputs/graph-iter.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/graph-iter.txt
rename to milena/doc/outputs/graph-iter.txt
diff --git a/milena/doc/tutorial/outputs/graph-output-1.txt b/milena/doc/outputs/graph-output-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/graph-output-1.txt
rename to milena/doc/outputs/graph-output-1.txt
diff --git a/milena/doc/tutorial/outputs/ima-has.txt b/milena/doc/outputs/ima-has.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima-has.txt
rename to milena/doc/outputs/ima-has.txt
diff --git a/milena/doc/tutorial/outputs/ima-save.txt b/milena/doc/outputs/ima-save.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima-save.txt
rename to milena/doc/outputs/ima-save.txt
diff --git a/milena/doc/tutorial/outputs/ima-size.txt b/milena/doc/outputs/ima-size.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima-size.txt
rename to milena/doc/outputs/ima-size.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-1.txt b/milena/doc/outputs/ima2d-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-1.txt
rename to milena/doc/outputs/ima2d-1.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-2.txt b/milena/doc/outputs/ima2d-2.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-2.txt
rename to milena/doc/outputs/ima2d-2.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-3.txt b/milena/doc/outputs/ima2d-3.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-3.txt
rename to milena/doc/outputs/ima2d-3.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-4.txt b/milena/doc/outputs/ima2d-4.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-4.txt
rename to milena/doc/outputs/ima2d-4.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-5.txt b/milena/doc/outputs/ima2d-5.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-5.txt
rename to milena/doc/outputs/ima2d-5.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-6-clone.txt b/milena/doc/outputs/ima2d-6-clone.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-6-clone.txt
rename to milena/doc/outputs/ima2d-6-clone.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-7.txt b/milena/doc/outputs/ima2d-7.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-7.txt
rename to milena/doc/outputs/ima2d-7.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-decl-2.txt b/milena/doc/outputs/ima2d-decl-2.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-decl-2.txt
rename to milena/doc/outputs/ima2d-decl-2.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-display-1.txt b/milena/doc/outputs/ima2d-display-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-display-1.txt
rename to milena/doc/outputs/ima2d-display-1.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-display-2.txt b/milena/doc/outputs/ima2d-display-2.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-display-2.txt
rename to milena/doc/outputs/ima2d-display-2.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-display-output-1.txt b/milena/doc/outputs/ima2d-display-output-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-display-output-1.txt
rename to milena/doc/outputs/ima2d-display-output-1.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-display-output-2.txt b/milena/doc/outputs/ima2d-display-output-2.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-display-output-2.txt
rename to milena/doc/outputs/ima2d-display-output-2.txt
diff --git a/milena/doc/tutorial/outputs/ima2d-rot.txt b/milena/doc/outputs/ima2d-rot.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/ima2d-rot.txt
rename to milena/doc/outputs/ima2d-rot.txt
diff --git a/milena/doc/tutorial/outputs/labeling-compute.txt b/milena/doc/outputs/labeling-compute.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/labeling-compute.txt
rename to milena/doc/outputs/labeling-compute.txt
diff --git a/milena/doc/tutorial/outputs/logical-not.txt b/milena/doc/outputs/logical-not.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/logical-not.txt
rename to milena/doc/outputs/logical-not.txt
diff --git a/milena/doc/tutorial/outputs/mln_var.txt b/milena/doc/outputs/mln_var.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/mln_var.txt
rename to milena/doc/outputs/mln_var.txt
diff --git a/milena/doc/tutorial/outputs/outputs.mk b/milena/doc/outputs/outputs.mk
similarity index 100%
rename from milena/doc/tutorial/outputs/outputs.mk
rename to milena/doc/outputs/outputs.mk
diff --git a/milena/doc/tutorial/outputs/parray-append.txt b/milena/doc/outputs/parray-append.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/parray-append.txt
rename to milena/doc/outputs/parray-append.txt
diff --git a/milena/doc/tutorial/outputs/parray-bbox.txt b/milena/doc/outputs/parray-bbox.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/parray-bbox.txt
rename to milena/doc/outputs/parray-bbox.txt
diff --git a/milena/doc/tutorial/outputs/parray-display-1.txt b/milena/doc/outputs/parray-display-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/parray-display-1.txt
rename to milena/doc/outputs/parray-display-1.txt
diff --git a/milena/doc/tutorial/outputs/paste-call-1.txt b/milena/doc/outputs/paste-call-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/paste-call-1.txt
rename to milena/doc/outputs/paste-call-1.txt
diff --git a/milena/doc/tutorial/outputs/paste.txt b/milena/doc/outputs/paste.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/paste.txt
rename to milena/doc/outputs/paste.txt
diff --git a/milena/doc/tutorial/outputs/point-1.txt b/milena/doc/outputs/point-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/point-1.txt
rename to milena/doc/outputs/point-1.txt
diff --git a/milena/doc/tutorial/outputs/predicate-1.txt b/milena/doc/outputs/predicate-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/predicate-1.txt
rename to milena/doc/outputs/predicate-1.txt
diff --git a/milena/doc/tutorial/outputs/tuto2_first_image.txt b/milena/doc/outputs/tuto2_first_image.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/tuto2_first_image.txt
rename to milena/doc/outputs/tuto2_first_image.txt
diff --git a/milena/doc/tutorial/outputs/tuto3_rw_image.txt b/milena/doc/outputs/tuto3_rw_image.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/tuto3_rw_image.txt
rename to milena/doc/outputs/tuto3_rw_image.txt
diff --git a/milena/doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt b/milena/doc/outputs/tuto4_genericity_and_algorithms.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt
rename to milena/doc/outputs/tuto4_genericity_and_algorithms.txt
diff --git a/milena/doc/tutorial/outputs/win-create-1-display.txt b/milena/doc/outputs/win-create-1-display.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/win-create-1-display.txt
rename to milena/doc/outputs/win-create-1-display.txt
diff --git a/milena/doc/tutorial/outputs/win-create-1.txt b/milena/doc/outputs/win-create-1.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/win-create-1.txt
rename to milena/doc/outputs/win-create-1.txt
diff --git a/milena/doc/tutorial/outputs/win-create-2.txt b/milena/doc/outputs/win-create-2.txt
similarity index 100%
rename from milena/doc/tutorial/outputs/win-create-2.txt
rename to milena/doc/outputs/win-create-2.txt
diff --git a/milena/doc/ref_guide/Makefile.am b/milena/doc/ref_guide/Makefile.am
new file mode 100644
index 0000000..40cab40
--- /dev/null
+++ b/milena/doc/ref_guide/Makefile.am
@@ -0,0 +1,24 @@
+.PHONY: ref-guide ref-guide-html
+
+include $(top_srcdir)/milena/doc/doc.mk
+TEXINPUTS = $(DOC_SRCDIR):$(DOC_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR):
+
+ref-guide:
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex
+
+ref-guide-html:
+ chmod u+x $(DOC_SRCDIR)/tools/todoxygen.sh
+ $(DOC_SRCDIR)/tools/todoxygen.sh $(srcdir)/ref_guide.tex $(DOC_BUILDDIR)/ref_guide
+
+clean-local:
+ rm -f ref_guide.aux ref_guide.toc ref_guide.log ref_guide.bbl ref_guide.out
+ rm -f *~ *blg *.lot
+ rm -f ref_guide.pdf
+ rm -f *.haux *.hh *.html *.htoc
+
+EXTRA_DIST = \
+ref_guide.tex \
+ref_guide.pdf
+
diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/ref_guide/ref_guide.tex
similarity index 81%
copy from milena/doc/tutorial/tutorial.tex
copy to milena/doc/ref_guide/ref_guide.tex
index c4ccd5d..4df8efa 100644
--- a/milena/doc/tutorial/tutorial.tex
+++ b/milena/doc/ref_guide/ref_guide.tex
@@ -115,7 +115,7 @@
\backslash htmlonly %
}
-\newcommand{\doxyimg}[1]{
+\newcommand{\doxyimg}[2]{
\backslash endhtmlonly%
\backslash image html #1.png%
\backslash htmlonly %
@@ -158,8 +158,8 @@ $$
\renewcommand{\doxysection}[2]{\section{#2}\label{#1}}
\renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}}
\renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}}
-\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}}
-\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}}
+\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{examples/#2-#1.cc}}
+\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{examples/#1.cc.raw}}
\renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}}
\renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}}
\renewcommand{\doxyfigure}[3][1]{%
@@ -167,7 +167,7 @@ $$
\label{#1}%
}
\renewcommand{\doxyimg}[2]{%
-\pgfimage[width=#2]{../../img/#1.png}%
+\pgfimage[width=#2]{#1.png}%
\label{#1}%
}
\renewcommand{\doxyref}[1]{\ref{#1}}
@@ -312,16 +312,6 @@ $$
\begin{htmlonly}
\backslash endhtmlonly
-\backslash page tutorial Tutorial
-- \backslash subpage tuto0
-- \backslash subpage tuto1
-- \backslash subpage tuto2
-- \backslash subpage tuto3
-- \backslash subpage tuto4
-- \backslash subpage tuto5
-- \backslash subpage tuto6
-- \backslash subpage tuto7
-
\backslash page quickref Quick Reference Guide
- \backslash subpage installation
- \backslash subpage foreword
@@ -347,7 +337,7 @@ $$
\maketitle
\section*{Copying this document}
-Copyright \copyright{} 2006 LRDE.
+Copyright \copyright{} 2008, 2009 LRDE.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.2 or any later
@@ -360,391 +350,6 @@ A copy of the license is provided in the file COPYING.DOC.
\tableofcontents
\end{latexonly}
-\begin{htmlonly}
-%====================================
-\doxychapter{tuto0}{Step 0: Foreword}
-
-- image2d
-- typical use case
-
-\begin{center}%
- \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow%
-\end{center}%
-
-
-
-%====================================
-\doxychapter{tuto1}{Step 1: Load and save images}
-
-After this step you shoud know how to:
-\begin{itemize}
-\item load an image,
-\item save an image.
-\end{itemize}
-
-\vspace{2cm}
-Currently, Olena supports the following input image formats:
-\begin{itemize}
- \item PBM
- \item PFM
- \item PGM
- \item PNM
- \item PPM
-\end{itemize}
-
-This support is provided through two headers for each type, \header{save.hh} and
-\header{load.hh}.
-They are located in \hpath{mln/io/$<$image-format$>$/}.
-
-Once the right header is included, the image can be loaded:
-
-\doxycode{ima-load}
-
-If you wan to save an image, simply call the save routine in the proper namespace:
-\doxycode{ima-save}
-
-According to the image value type, the proper file format must be chosen.
-The supported file formats and their associated image value types are listed
-in section \doxyref{imaio}.
-
-\vspace{2cm}
-\tutotoc{tuto0}{tuto2}
-
-
-
-%====================================
-\doxychapter{tuto2}{Step 2: Create your first image}
-
-After this step you should know how to:
- \begin{itemize}
- \item create an image,
- \item display an image in console mode.
- \end{itemize}
-
-\doxysee{tuto2_first_image.cc}
-
-
-\vspace{2cm}
-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]{tuto2_first_image}
-
-From that grid, simply call make::image to get an image initialized with that
-data.
-\doxycode[2]{tuto2_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]{tuto2_first_image}
-Output:
-\doxyoutput{tuto2_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]{tuto2_first_image}
-
-The output image looks like the following:
-\doxyfigure{tuto2_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}.
-
-\vspace{2cm}
-\begin{center}
- \tutotoc{tuto1}{tuto3}
-\end{center}
-
-
-%====================================
-\doxychapter{tuto3}{Step 3: Read and write images}
-
-After this step you should know how to:
- \begin{itemize}
- \item modify/initialize image values,
- \item copy and paste data to an image.
- \end{itemize}
-
-
-\doxysee{tuto3_rw_image.cc}
-
-\vspace{2cm}
-First create an empty color image with a \var{box2d} of 40x40 as domain.
-\doxycode[1]{tuto3_rw_image}
-
-If you want to initialize the image with the color red, simply call data::fill as follows:
-\doxycode[2]{tuto3_rw_image}
-
-Updating a site value is also possible using \code{operator()} or the
-\code{opt::at()} routine. Here we create a blue square of 10x10 pixels from site
-(20, 20) to (30, 30).
-\doxycode[3]{tuto3_rw_image}
-\doxycode[4]{tuto3_rw_image}
-
-The corresponding image:
-\doxyfigure[1]{tuto3_rw_image}
-
-An image can also be initialized/modified thanks to another image.
-Let's load a new image.
-\doxycode[5]{tuto3_rw_image}
-\var{lena} looks like:
-\doxyimg{small-enlarged}
-
-If we want to initialize \var{ima} with \var{lena}, we can use \code{data::fill}:
-\doxycode[6]{tuto3_rw_image}
-Output:
-\doxyfigure[2]{tuto3_rw_image}
-Note that to fill an image with some data, the image domain \must be smaller
-or equal to the data.
-
-Likewise, it is possible to paste data from an image to another:
-\doxycode[7]{tuto3_rw_image}
-Output:
-\doxyfigure[3]{tuto3_rw_image}
-
-More details can be found in sections \doxyref{imaaccessmodval}, \doxyref{fillop} and \doxyref{pasteop} in
-the reference guide.
-
-\vspace{2cm}
-\begin{center}
- \tutotoc{tuto2}{tuto4}
-\end{center}
-
-
-%====================================
-\doxychapter{tuto4}{Step 4: Regions of interest}
-
-After this step you should know how to:
- \begin{itemize}
- \item take benefit of Olena's genericity,
- \item work only on a region of interest in an image.
- \end{itemize}
-
-\doxysee{tuto4_genericity_and_algorithms.cc}
-\vspace{2cm}
-
-In the previous step, we used the routine \code{data::fill} in order to change
-the values of an image. It was convenient since we did not need to write any
-loop by hand. The problem was that we could not specificy which region to fill
-with data. This point leads us to talk about the genericity in Olena.
-All along this example we will use the routine \code{data::fill} to illustrate
-the possibilities in Olena but note that every image types passed to the
-routine in this example could be passed to any algorithm in the library
-expecting an image.
-
-One main feature of Olena is to be able to easily work on regions of interest in
-images. According to the way a region of interest is defined, a specific image
-type is associated. Therefore, each algorithm knows exactly what it is working
-on and can behave differently in order to be the most efficient as possible.
-
-
-All along this step, we will use the following image \var{lena} declared as
-follow:
-
-\doxycode[1]{tuto4_genericity_and_algorithms}
-\doxyimg{small-enlarged}
-
-\code{data::fill} has the following prototype:
-\doxyrawcode{fill-proto}
-So keep in mind that the first argument we will try to construct in each
-example is an image. Note that this image \must be writable, e.g. non-const.
-
-
-%**************************
-\doxysection{tuto4imadomainsiteset}{Image domain restricted by a site set}
-
-Here, we would like to fill a small square with green in \var{lena}. We want
-this square to be of size 20x20 and to be located at (20,20).
-First, we just need to declare this square which is actually a site set, a
-\type{box2d}.
-\doxycode[2]{tuto4_genericity_and_algorithms}
-
-Then, we just need to tell \code{data::fill} that we would like to fill the
-image \var{lena} but only in this restricted part of the image domain.
-\doxycode[3]{tuto4_genericity_and_algorithms}
-Operator '|' can be read 'restricted to'. So below, we wrote 'image \var{lena}
-restricted to the region of interest \var{roi}'. Actually this is not directly
-\var{lena} which is restricted but its domain.
-
-Note the use of \code{rw()} which is mandatory due to C++ limitations. In C++,
-the image created by \code{lena | roi} is \code{const}, e.g. read-only, though
-\code{data::fill} expect a \code{non-const} image, e.g. read-write. \code{rw()}
-is a workaround to make it read-write.
-
-\begin{center}
- \begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{3}{c}{Fill with green a region of interest defined by a
- \type{box2d}.} \\
- \end{tabular}
-\end{center}
-
-
-%**************************
-\doxysection{tuto4imadomainfun}{Image domain restricted by a function}
-
-Sometimes it may not be easy to construct a site set to restrict an image. For
-instance, if we would like to fill with green one point out of two in the whole
-image, we \textbf{do not want} to write anyloop or construct any site set by hand:
-\doxycode[4]{tuto4_genericity_and_algorithms}
-\doxycode[5]{tuto4_genericity_and_algorithms}
-
-A shorter way to get exactly the same result, is to define that behavior by a
-function. In Milena, a function \code{fun::p2v::chess} is available and does
-exactly what we want. Like if it was a site set, simply restrict the image with
-the function.
-
-\doxycode[6]{tuto4_genericity_and_algorithms}
-\begin{center}
- \begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{3}{c}{Fill with green a region of interest defined by a
- \type{Function}.} \\
- \end{tabular}
-\end{center}
-
-Note that the functions provided by default in Olena are actually functors.
-Thus, they must be constructed like any object which why it is written
-\code{lena | fun::p2v::chess()} and not \code{lena | fun::p2v::chess}.
-
-
-FIXME: Talk about C functions once it is possible in Milena.
-
-
-%**************************
-\doxysection{tuto4imadomainmask}{Image domain restricted by a mask}
-
-Sometimes instead of having a site site or a function defining the regions of
-interest we want to work on, we may have a binary image, e.g. a mask. When a
-site has its value set to true, it means it will be considered as part of the
-masked image domain. Otherwise, it will not.
-
-We construct a mask, \var{mask}. It is initialized with the same geometry properties as
-\var{lena}
-(domain, extension...).
-\doxycode[7]{tuto4_genericity_and_algorithms}
-
-Then, we cannot restrict directly \var{lena} with \var{mask}. These two images
-have the same domain, so \code{lena | mask.domain()} would not do anything.
-\var{mask} is a classical image, there is not specific type for mask images.
-Therefore, we need to express that we want that binary image to be considered as
-a mask.
-\doxycode[8]{tuto4_genericity_and_algorithms}
-\code{pw::value(mask)} makes explicit the fact that \var{mask} is actually a
-mask. It means, that for each site of \var{mask}, if its value is set to
-\val{true}, then the value associated to this site in \var{lena} must be set
-to green.
-In this example, we use two images for two different use case: \var{lena} store
-the result and the modifications make by the algorithm and \var{mask} allows the
-algorithm to know whether it must treat a site or not.
-
-\begin{center}
- \begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
- \doxyfigure[3]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
- \doxyfigure[4]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{4}{c}{Fill with green a region of interest defined by a mask
- image.} \\
- \end{tabular}
-\end{center}
-
-
-%**************************
-\doxysection{tuto4imadomainpredicate}{Image domain restricted by a predicate}
-
-Restricting by a predicate is exactly like restricting with a function. We want
-to talk about that separately in order to present the small routines available.
-They enable the user to write quick and efficient predicate/function.
-
-The two routines are :
-\begin{itemize}
- \item pw::value(Image), as seen in a previous section, it is a way to express
- 'for each site value in Image'.
- \item pw::cst(Value), it is a way to specify a value to which a site value can
- be compared.
-\end{itemize}
-
-Let's see a common use case.
-First, we binarize lena according to specific criterions, only site values with
-specific colors are set to true in \var{lena_bw}. Others are set to false. This
-image will be used in order to label the components.
-Let's consider a labeled image \var{label}. Each component of \var{lena} is labeled with a unique index.
-Now, we consider that that our region of interest is a component with id 16.
-Then we want to express 'for each site \var{fill} its value in \var{lena} if its
-value in \var{label} is equal to 16'.
-\doxycode[9]{tuto4_genericity_and_algorithms}
-
-
-\doxycode[10]{tuto4_genericity_and_algorithms}
-
-\begin{center}
- \begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
- \doxyfigure[5]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
- \doxyfigure[6]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{4}{c}{Fill with green a region of interest defined by its
- label.} \\
- \end{tabular}
-\end{center}
-
-
-%**************************
-\doxysection{tuto4component}{Image component restricted to a domain}
-
-\doxycode[11]{tuto4_genericity_and_algorithms}
-
-\begin{center}
- \begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
-% \doxyfigure[7]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
- \doxyfigure[8]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{4}{c}{Fill with green a region of interest defined by its
- label.} \\
- \end{tabular}
-\end{center}
-
-
-
-\doxycode[12]{tuto4_genericity_and_algorithms}
-
-\begin{center}
- \begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
- ~\huge{\rightarrow}~ &
- \doxyfigure[9]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{4}{c}{Fill with green a region of interest defined by its
- label.} \\
- \end{tabular}
-\end{center}
-
-
-\vspace{2cm}
-\begin{center}
- \tutotoc{tuto3}{tuto5}
-\end{center}
-
-%====================================%
-%Ugly workaround to avoid missing chapter references in doxygen.
-\doxychapter{1}{}
-\doxychapter{tuto5}{Step 5: Conversion between image values}
-
-
-%====================================
-\doxychapter{tuto6}{Step 6: Using structural elements with algorithms}
-
-
-%====================================
-\doxychapter{tuto7}{Step 7: Handle graphes with an image}
-
-\end{htmlonly}
-
%====================================
\doxychapter{installation}{Installation}
@@ -1147,42 +752,6 @@ types is actually ``type\_name.hh". For instance, for \type{rgb8} the header wil
-%----------------
-\doxysubsection{imavalues}{About value, rvalue and lvalue}
-
-//FIXME: to be rewritten or removed.
-
-Since the values are of a specific type, it exists a set of all the possible
-site values. This set is called "destination" set. It may be iterable and
-printable if it is finite and not too huge.
-
-Image types provide a method to access values, namely "\code{operator() const}".
-Yet, its signature is NOT "\code{value operator()(const site\& p) const}"
-but "\code{rvalue operator()(const psite\& p) const}".
-
-For instance, with \type{I} being \type{image2d$<$int\_u8$>$}, we have :
-
-\begin{center}
- \type{I::value} == i\type{nt\_u8} but \type{I::rvalue} ==\type{const
- int\_u8\&}
-\end{center}
-
-So copying the value when the call "\code{f(p)}" returns is avoided.
-In that case, it is a low-level implementation issue that makes rvalue
-be different from value. In some other cases, the difference can be
-more fundamental. For instance, a proxy is returned so that some extra
-code is performed if this value is eventually read.
-
-Likewise, lvalue is also used as return type for methods such as
-"\code{operator()}".
-The difference is that lvalue allows the data to be modified.
-
-With \type{I} being \type{image2d$<$int\_u8$>$}, we have :
-
-\begin{center}
- \type{I::value} == \type{int\_u8} but \type{I::lvalue} == \type{int\_u8\&}
-\end{center}
-
%**************************
\doxysection{imadomain}{Domain}
The site set contains the sites which compose the image. Sites are based on a
@@ -1304,7 +873,7 @@ example, \var{ima\_roi} holds several small rectangles from the original image.
\begin{center}
\begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{extend}{3cm} \\
+ \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[1]{extend}{3cm} \\
\var{lena} & & \var{ima\_roi} (black color means the sites are not included in the domain) \\
\end{tabular}
\end{center}
diff --git a/milena/doc/tutorial/tools/sample_utils.hh b/milena/doc/tools/sample_utils.hh
similarity index 100%
rename from milena/doc/tutorial/tools/sample_utils.hh
rename to milena/doc/tools/sample_utils.hh
diff --git a/milena/doc/tutorial/tools/split_sample.sh b/milena/doc/tools/split_sample.sh
similarity index 100%
rename from milena/doc/tutorial/tools/split_sample.sh
rename to milena/doc/tools/split_sample.sh
diff --git a/milena/doc/tutorial/tools/todoxygen.sh b/milena/doc/tools/todoxygen.sh
similarity index 100%
rename from milena/doc/tutorial/tools/todoxygen.sh
rename to milena/doc/tools/todoxygen.sh
diff --git a/milena/doc/tutorial/Makefile.am b/milena/doc/tutorial/Makefile.am
index 53c9521..885e8ae 100644
--- a/milena/doc/tutorial/Makefile.am
+++ b/milena/doc/tutorial/Makefile.am
@@ -1,34 +1,16 @@
-SUBDIRS = samples
-
-.PHONY: tutorial tuto_html
+.PHONY: tutorial tuto-html
include $(top_srcdir)/milena/doc/doc.mk
-TEXINPUTS = $(TUTORIAL_SRCDIR):$(TUTORIAL_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR):
-
-tutorial: data fig-convert
- TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex
- TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex
- TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex
-
-tuto_html: data fig-convert
- chmod u+x $(TUTORIAL_SRCDIR)/tools/todoxygen.sh
- $(TUTORIAL_SRCDIR)/tools/todoxygen.sh $(TUTORIAL_SRCDIR)/tutorial.tex $(TUTORIAL_BUILDDIR)
+TEXINPUTS = $(DOC_SRCDIR):$(DOC_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR):
-data:
- make -C samples data
+tutorial:
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex
-fix-refdata:
- make -C samples fix-refdata
-
-fig-convert:
- @failcom='exit 1'; \
- list="$(FIGURES_BUILDDIR)/*.p*m"; for img in $$list; do \
- echo "Converting $$img to png"; \
- name=`basename $$img` \
- ext=`echo $$name | cut -d '.' -f 2`; \
- convert -scale 250 $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png\
- || eval $$failcom; \
- done;
+tuto-html:
+ chmod u+x $(DOC_SRCDIR)/tools/todoxygen.sh
+ $(DOC_SRCDIR)/tools/todoxygen.sh $(srcdir)/tutorial.tex $(DOC_BUILDDIR)/tutorial
clean-local:
rm -f tutorial.aux tutorial.toc tutorial.log tutorial.bbl tutorial.out
@@ -40,28 +22,3 @@ EXTRA_DIST = \
tutorial.tex \
tutorial.pdf
-.PHONY: regen-dist
-regen-dist: $(srcdir)/headers.stamp
-
-$(srcdir)/examples/examples.mk: $(srcdir)/headers.stamp
-$(srcdir)/figures/figures.mk: $(srcdir)/headers.stamp
-$(srcdir)/outputs/outputs.mk: $(srcdir)/headers.stamp
-$(srcdir)/samples/samples.mk: $(srcdir)/headers.stamp
-
-EXTRA_DIST += $(srcdir)/headers.stamp
-$(srcdir)/headers.stamp: $(srcdir)/generate_dist_files.sh
- @rm -f $@.tmp
- @touch $@.tmp
- cd $(srcdir) && ./generate_dist_files.sh
- @mv -f $@.tmp $@
-
-include $(srcdir)/examples/examples.mk
-include $(srcdir)/figures/figures.mk
-include $(srcdir)/outputs/outputs.mk
-include $(srcdir)/samples/samples.mk
-
-EXTRA_DIST += \
-tools/sample_utils.hh \
-tools/split_sample.sh \
-tools/todoxygen.sh
-
diff --git a/milena/doc/tutorial/examples/examples.mk b/milena/doc/tutorial/examples/examples.mk
deleted file mode 100644
index 1ff49cc..0000000
--- a/milena/doc/tutorial/examples/examples.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-## Generated by ../generate_dist_files, do not modify.
-
-EXTRA_DIST += \
-examples/cpp_issue.cc \
-examples/sub_image.cc \
-examples/sub_image_if.cc \
-examples/p_vaccess.cc \
-examples/win_multiple.cc \
-examples/image2d.cc \
-examples/image_plain.cc \
-examples/p_run.cc \
-examples/proxy.cc \
-examples/p_array.2.cc \
-examples/examples.mk \
-examples/for_Z.cc \
-examples/image_if.cc \
-examples/p_key.cc \
-examples/p_mutable_array_of.cc \
-examples/p_queue.cc \
-examples/image_flat.cc \
-examples/p_image.cc \
-examples/box.cc \
-examples/p_line2d.cc \
-examples/p_array.cc \
-examples/accu.cc \
-examples/p_key.2.cc \
-examples/window.cc \
-examples/image_safe.cc \
-examples/vec.cc
diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/tutorial/tutorial.tex
index c4ccd5d..87949d9 100644
--- a/milena/doc/tutorial/tutorial.tex
+++ b/milena/doc/tutorial/tutorial.tex
@@ -20,7 +20,7 @@
\end{figure}
}
-\title{Olena -- Quick Reference Guide}
+\title{Olena -- Tutorial}
\author{LRDE}
\date{}
\makeindex
@@ -115,7 +115,7 @@
\backslash htmlonly %
}
-\newcommand{\doxyimg}[1]{
+\newcommand{\doxyimg}[2]{
\backslash endhtmlonly%
\backslash image html #1.png%
\backslash htmlonly %
@@ -158,8 +158,8 @@ $$
\renewcommand{\doxysection}[2]{\section{#2}\label{#1}}
\renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}}
\renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}}
-\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}}
-\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}}
+\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{examples/#2-#1.cc}}
+\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{examples/#1.cc.raw}}
\renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}}
\renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}}
\renewcommand{\doxyfigure}[3][1]{%
@@ -167,7 +167,7 @@ $$
\label{#1}%
}
\renewcommand{\doxyimg}[2]{%
-\pgfimage[width=#2]{../../img/#1.png}%
+\pgfimage[width=#2]{#1.png}%
\label{#1}%
}
\renewcommand{\doxyref}[1]{\ref{#1}}
@@ -322,24 +322,6 @@ $$
- \backslash subpage tuto6
- \backslash subpage tuto7
-\backslash page quickref Quick Reference Guide
-- \backslash subpage installation
-- \backslash subpage foreword
-- \backslash subpage site
-- \backslash subpage siteset
-- \backslash subpage image
-- \backslash subpage winneigh
-- \backslash subpage sitesandco
-- \backslash subpage iterators
-- \backslash subpage imamemmgmt
-- \backslash subpage basicops
-- \backslash subpage graphandima
-- \backslash subpage funs
-- \backslash subpage arithmops
-- \backslash subpage mathtools
-- \backslash subpage debugtools
-- \backslash subpage globalvars
-- \backslash subpage macros
\backslash htmlonly
\end{htmlonly}
@@ -347,7 +329,7 @@ $$
\maketitle
\section*{Copying this document}
-Copyright \copyright{} 2006 LRDE.
+Copyright \copyright{} 2008, 2009 LRDE.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.2 or any later
@@ -360,16 +342,18 @@ A copy of the license is provided in the file COPYING.DOC.
\tableofcontents
\end{latexonly}
-\begin{htmlonly}
+%\begin{htmlonly}
%====================================
\doxychapter{tuto0}{Step 0: Foreword}
- image2d
- typical use case
-\begin{center}%
- \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow%
-\end{center}%
+\begin{htmlonly}
+ \begin{center}%
+ \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow%
+ \end{center}%
+\end{htmlonly}
@@ -486,25 +470,25 @@ Updating a site value is also possible using \code{operator()} or the
\doxycode[4]{tuto3_rw_image}
The corresponding image:
-\doxyfigure[1]{tuto3_rw_image}
+\doxyfigure[1]{tuto3_rw_image}{3cm}
An image can also be initialized/modified thanks to another image.
Let's load a new image.
\doxycode[5]{tuto3_rw_image}
\var{lena} looks like:
-\doxyimg{small-enlarged}
+\doxyimg{small-enlarged}{3cm}
If we want to initialize \var{ima} with \var{lena}, we can use \code{data::fill}:
\doxycode[6]{tuto3_rw_image}
Output:
-\doxyfigure[2]{tuto3_rw_image}
+\doxyfigure[2]{tuto3_rw_image}{3cm}
Note that to fill an image with some data, the image domain \must be smaller
or equal to the data.
Likewise, it is possible to paste data from an image to another:
\doxycode[7]{tuto3_rw_image}
Output:
-\doxyfigure[3]{tuto3_rw_image}
+\doxyfigure[3]{tuto3_rw_image}{3cm}
More details can be found in sections \doxyref{imaaccessmodval}, \doxyref{fillop} and \doxyref{pasteop} in
the reference guide.
@@ -546,7 +530,7 @@ All along this step, we will use the following image \var{lena} declared as
follow:
\doxycode[1]{tuto4_genericity_and_algorithms}
-\doxyimg{small-enlarged}
+\doxyimg{small-enlarged}{3cm}
\code{data::fill} has the following prototype:
\doxyrawcode{fill-proto}
@@ -577,8 +561,8 @@ is a workaround to make it read-write.
\begin{center}
\begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\
- \multicolumn{3}{c}{Fill with green a region of interest defined by a
+ \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\
+ \multicolumn{3}{c}{Fill with blue a region of interest defined by a
\type{box2d}.} \\
\end{tabular}
\end{center}
@@ -601,7 +585,7 @@ the function.
\doxycode[6]{tuto4_genericity_and_algorithms}
\begin{center}
\begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\
+ \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\
\multicolumn{3}{c}{Fill with green a region of interest defined by a
\type{Function}.} \\
\end{tabular}
@@ -644,9 +628,9 @@ algorithm to know whether it must treat a site or not.
\begin{center}
\begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
+ \doxyimg{small-enlarged}{3cm} &
\doxyfigure[3]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
+ ~\huge{$\rightarrow$}~ &
\doxyfigure[4]{tuto4_genericity_and_algorithms}{3cm} \\
\multicolumn{4}{c}{Fill with green a region of interest defined by a mask
image.} \\
@@ -684,9 +668,9 @@ value in \var{label} is equal to 16'.
\begin{center}
\begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
+ \doxyimg{small-enlarged}{3cm} &
\doxyfigure[5]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
+ ~\huge{$\rightarrow$}~ &
\doxyfigure[6]{tuto4_genericity_and_algorithms}{3cm} \\
\multicolumn{4}{c}{Fill with green a region of interest defined by its
label.} \\
@@ -701,9 +685,9 @@ value in \var{label} is equal to 16'.
\begin{center}
\begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
+ \doxyimg{small-enlarged}{3cm} &
% \doxyfigure[7]{tuto4_genericity_and_algorithms}{3cm} &
- ~\huge{\rightarrow}~ &
+ ~\huge{$\rightarrow$}~ &
\doxyfigure[8]{tuto4_genericity_and_algorithms}{3cm} \\
\multicolumn{4}{c}{Fill with green a region of interest defined by its
label.} \\
@@ -716,8 +700,8 @@ value in \var{label} is equal to 16'.
\begin{center}
\begin{tabular}{c c c c}
- \doxyimg{small-enlarged} &
- ~\huge{\rightarrow}~ &
+ \doxyimg{small-enlarged}{3cm} &
+ ~\huge{$\rightarrow$}~ &
\doxyfigure[9]{tuto4_genericity_and_algorithms}{3cm} \\
\multicolumn{4}{c}{Fill with green a region of interest defined by its
label.} \\
@@ -731,9 +715,11 @@ value in \var{label} is equal to 16'.
\end{center}
%====================================%
-%Ugly workaround to avoid missing chapter references in doxygen.
-\doxychapter{1}{}
-\doxychapter{tuto5}{Step 5: Conversion between image values}
+%%Ugly workaround to avoid missing chapter references in doxygen.
+%\begin{htmlonly}
+% \doxychapter{1}{}
+% \doxychapter{tuto5}{Step 5: Conversion between image values}
+%\end{htmlonly}
%====================================
@@ -743,1885 +729,7 @@ value in \var{label} is equal to 16'.
%====================================
\doxychapter{tuto7}{Step 7: Handle graphes with an image}
-\end{htmlonly}
-
-
-%====================================
-\doxychapter{installation}{Installation}
-
-%**************************
-\doxysection{requirements}{Requirements}
-
-
-%----------------
-\doxysubsection{compexample}{To compile the user examples}
-
-\begin{itemize}
- \item a POSIX shell, like Bash
- \item a decent C++ compiler, like GNU C++
- \item a `make' utility, like GNU or BSD `make'
-\end{itemize}
-
-
-
-%----------------
-\doxysubsection{compdoc}{To compile the documentation (Optional)}
-
-\begin{itemize}
- \item a LaTeX distribution
- \item the `listings' TeX package
- \item the utility `convert' from ImageMagick
- \item GNU Autogen
- \item `hevea', a TeX to HTML conversion tool
- \item the `texinfo' utilities from GNU
-\end{itemize}
-
-%----------------
-\doxysubsection{devolena}{To develop in Olena}
-\begin{itemize}
- \item GNU Autotools (Autoconf 2.54, Automake 1.10)
-\end{itemize}
-
-%**************************
-\doxysection{getolena}{Getting Olena}
-
-The latest version of Olena is available at the following addresses:
-
-\begin{itemize}
- \item http://www.lrde.epita.fr/dload/olena/olena.tar.gz
- \item http://www.lrde.epita.fr/dload/olena/olena.tar.bz2
-\end{itemize}
-
-
-%**************************
-\doxysection{buildingolena}{Building Olena}
-
-First uncompress the archive. According to the downloaded archive, the options
-are different.
-\begin{verbatim}
-$tar zxvf olena.tar.gz
-\end{verbatim}
-Or
-\begin{verbatim}
-$tar jxvf olena.tar.bz2
-\end{verbatim}
-
-Then follow these steps:
-\begin{verbatim}
-$mkdir olena-build
-$cd olena-build
-$../olena-1.0/configure && make
-$sudo make install
-\end{verbatim}
-
-
-
-%====================================
-\doxychapter{foreword}{Foreword}
-
-%**************************
-\doxysection{generality}{Generality}
-The following tutorial explains the basic concepts behind Olena and how to use
-the most common objects and routines.
-This tutorial includes many code examples and figures. In order to make this
-tutorial easier to understand, we will mainly talk about 2D images. This is
-not so restrictive since 1D, 3D, $n$D images behave the same way.
-
-
-Since examples are based on 2D images pixels are actually "points" however we
-will call them "sites" which is the most generic name.\newline
-
-Here is also a list of common variable name conventions:
-\begin{figure}[ht!]
- \begin{tabular}{|l|l|}
- \hline
- \textbf{Object} & \textbf{Variable name} \\ \hline
- Site & p \\ \hline
- Value & v \\ \hline
- Neighboor & n \\ \hline
- A site close to another site p & q \\ \hline
- \end{tabular}
-\end{figure}
-
-Olena is organized in a namespace hierarchy. Everything is declared by Olena
-within the 'oln::' namespace, and possibly a sub-namespace such as
-'\namespace{oln::arith::}' (arithmetic operations on images), '\namespace{oln::morpho::}' (morphological
-operations), etc. Usually, the namespace hierarchy is mapped to the mln
-directory tree. For the sake of simplicity, we will neglect the '\namespace{oln::}'
-prefix in all the code examples.
-
-Methods provided by objects in the library are in constant time. If you need
-a specific method but you cannot find it, you may find an algorithm which can
-compute the information you need.
-
-%**************************
-\doxysection{dirtree}{Directory hierarchy}
-Olena's tarball is structured as follow:
-
-\begin{itemize}
- \item milena
- \begin{itemize}
-% \item apps :
- \item doc
- \begin{itemize}
- \item benchmark: set of benchmark.
- \item examples: more examples.
- \item oldies: partialy not updated documentation. Not recommended for new users.
- \item technical: technical doc.
- \item tutorial: code sample and tutorial.
- \end{itemize}
- \item img: a set of sample images.
- \item mesh: a full example which uses Olena.
- \item mln: the library. Contains only headers.
- \item tests: test suite.
-% \item tools :
- \end{itemize}
- \item swilena: Python bindings for Olena.
-\end{itemize}
-
-\doxysection{compilehint}{Writing and compiling a program with Olena}
-
-Before writing your first program, please be ware of these hints:
-
-\begin{itemize}
- \item By default, Olena enables a lot of internal pre and post conditions.
- Usually, this is a useful feature and it \should be enabled. It can heavily
- slow down a program though and these tests can be disabled by compiling
- using \code{-DNDEBUG}.
- \begin{verbatim}
-g++ -DNDEBUG -Ipath/to/mln my_program.cc
- \end{verbatim}
-
- \item If you decide to use optimization flags to compile for debugging,
- prefer using \code{-O1}. It is much faster to compile and it gives good
- performance results.
-
-\end{itemize}
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{site}{Site}
-
-Usually, when talking about images, we think about common images composed of a
-set of pixels.
-Since Olena is generic, we want to support many kind of images, even images
-which are not composed of a set of pixels, such as images having images as sites.
-
-In order to express this genericity, we have the ``site'' concept.
-This concept allows us to divide a pixel into two information:
-\begin{itemize}
- \item The pixel location, e.g. its coordinates (the site itself).
- \item The value.
-\end{itemize}
-
-Let's say we have a 2D grid like this:
-
-//FIXME
-[dessin de grille 2d, colonnes/lignes numerotees + repere x/y]
-Intersection == point 2d == milieu d'un pixel \\
-
-%FIXME: Find a way to get that figure in HTML output.
-\begin{latexonly}
-\begin{tikzpicture}[scale=1]
-
-\draw[blue!20, thick] (-2, -2) grid [right=0.5cm,above=0.5cm,step=1cm] (3, 3);
-\draw[line width=1mm] (-1, -1) grid [step=1cm] (3, 3);
-\draw[black,line width=2mm,<-] (0, -2) node {y} -- (0, 4);
-\draw[black,line width=2mm,->] (-2, 3) node {x} -- (4, 3);
-
-\foreach \x in {-0.5, 0.5, 1.5, 2.5}
- \foreach \y in {-0.5, 0.5, 1.5, 2.5}
- \node at (\x, \y) [fill=blue!30] {};
-
-\draw[black] (2.5, 1.5) -- (4, 2) node {Point2d(2, 2)};
-\end{tikzpicture}
-\end{latexonly}
-
-On such a regular grid, in 2D, we usually use a 2D point as a site which
-means we have the following equivalence:
-
-\begin{center}
- Intersection $\equiv$ point2d (2D site) $\equiv$ center of a pixel
-\end{center}
-
-The site does not store any value but refer to an area where we will be able
-to read its value.
-
-Sites may have a different types, depending on the image type:
-
-\begin{tabular}{l|l}
-Name & Description \\
-\hline
-\type{point2d} & 2D point on a regular grid \\
-\type{point} & Generic point ($n-D$) on a regular grid \\
-\type{util::vec} & Algebraic vector \\
-\type{util::vertex} & Graph vertex \\
-\type{util::edge} & Graph edge \\
-\end{tabular}
-
-[Illustration : grille + intersection + pmin() + pmax() + distance entre 2
-points en x et en y = 1]\\
-
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{siteset}{Site set}
-
-Site sets are used:
-\begin{enumerate}
- \item To define an image definition domain.
- \item As Site container.
-\end{enumerate}
-
-They do not actually store any image value. They only store site information.
-
-Here is a list of all the site set concepts which can be found in
-core/site\_set:
-
-\begin{tabular}{|l|p{8cm}|}
-\hline
-Site set & Description \\
-\hline
-
-p\_array & site array. \\
-\hline
-p\_box & compact domain defined on a regular grid (in 2D, a rectangle). \\
-\hline
-p\_if & site set verifying a predicate. \\
-\hline
-p\_queue & site queue. \\
-\hline
-p\_run & site range. \\
-\hline
-p\_runs & site range set. \\
-\hline
-p\_set & mathematical site set. \\
-\hline
-p\_vaccess & site set ordered by value. \\
-\hline
-p\_edges & set of graph edges associated to sites. \\
-\hline
-p\_vertices & set of graph vertices associated to sites.\\
-\hline
-\end{tabular}
-
-All site sets are iterable. More detailed explanations are available in section \doxyref{iterators}.
-
-%**************************
-\doxysection{sitesetinterface}{Basic interface}
-Common basic interface:\\
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Return Type & Name & Arguments & Const & Comments \\ \hline
-
-bool & is\_valid & - & X & Returns true if it has been initialized. The
-default constructor does not initialize it. \\ \hline
-
-bool & has & const P\& p & X & \\ \hline
-\end{tabular} \\
-
-
-%**************************
-\doxysection{sitesetopinterface}{Optional interface}
-Site sets may have other methods depending on their type: \\
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Return Type & Name & Arguments & Const & Comments \\ \hline
-
-size\_t & nsites & - & - & Return the number of sites. \\ \hline
-const Box\& & bbox & - & X & Bounding box. Available only on grid site sets.
-\\ \hline
-\end{tabular} \\
-
-The previous methods are available depending on the site set. A box
-will have the bbox() method since it can be retrived in constant time: a box
-is it's own bounding box.
-
-\doxycode{box2d-bbox}
-Output:
-\doxyoutput{box2d-bbox}
-
-A \type{p\_array} does not have the bbox
-method since its sites do not have to be adjacent. Maintaining such information, in
-order to keep getting the bbox in constant time, would be time and memory
-consuming. Instead of providing a method directly in \type{p\_array}, an algorithm is
-available if this information is needed.
-\type{p\_array} and \type{box} both have a nsites method since the internal structure allows a
-constant time retrieval.
-
-\doxycode{parray-bbox}
-Output:
-\doxyoutput{parray-bbox}
-
-
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{image}{Image}
-
-
-%**************************
-\doxysection{definition}{Definition}
-An image is composed both of:
-\begin{itemize}
-\item A function
-\begin{doxymath}
-ima : \left\{
- \begin{array}{lll}
- Site &\rightarrow & Value \\
- p & \mapsto & ima(p)
- \end{array}
-\right.
-\end{doxymath}
-\item A site set, also called the "domain".
-\end{itemize}
-
-%**************************
-\doxysection{imatypes}{Possible image types}
-
-Here is a short list of the main/usual image types you may want to use with
-Olena: \\
-\bigskip
-
-\begin{tabular}{l|l}
-Name & Description \\
-\hline
-\type{image1d} & 1D image \\
-\type{image2d} & 2D image \\
-\type{image3d} & 3D image \\
-\type{flat\_image} & Constant value image \\
-\type{image\_if} & Image defined by a function \\
-FIXME & FIXME \\
-\end{tabular}
-
-%**************************
-\doxysection{imapossvalues}{Possible value types}
-
-Every image type \must take its type of value as parameter.
-The value type can be one of the builtins one:
-\begin{itemize}
- \item \type{bool}
- \item \type{char}
- \item \type{unsigned}
- \item \type{int}
- \item \type{short}
- \item \type{long}
- \item \type{float}
- \item \type{double}
-\end{itemize}
-
-Other data types are also available:
-
-\begin{tabular}{l|l}
-Value type & underlying data type \\
-\hline
-\type{float01\_8} & \type{unsigned long} \\
-\type{float01\_16} & \type{unsigned long} \\
-\type{float01\_f} & \type{float} \\
-\type{gl8} & \type{unsigned char} \\
-\type{gl16} & \type{unsigned short} \\
-\type{glf} & \type{float} \\
-\type{hsi\_d} & \type{double} \\
-\type{hsi\_f} & \type{float} \\
-\type{int\_s8} & \type{char} \\
-\type{int\_s16} & \type{short} \\
-\type{int\_s32} & \type{int} \\
-\type{int\_u8} & \type{unsigned char} \\
-\type{int\_u16} & \type{unsigned short} \\
-\type{int\_u32} & \type{unsigned int} \\
-\type{rgb16} & \type{mln::util::vec$<$unsigned short$>$} \\
-\type{rgb8} & \type{mln::util::vec$<$unsigned char$>$} \\
-\end{tabular} \\
-
-
-All these types are available in mln/value and accessible in the
-\namespace{mln::value} namespace.
-Most of the time, the name of the header which \must be included to use one of these data
-types is actually ``type\_name.hh". For instance, for \type{rgb8} the header will be
-\header{rgb8.hh}.
-
-
-
-%----------------
-\doxysubsection{imavalues}{About value, rvalue and lvalue}
-
-//FIXME: to be rewritten or removed.
-
-Since the values are of a specific type, it exists a set of all the possible
-site values. This set is called "destination" set. It may be iterable and
-printable if it is finite and not too huge.
-
-Image types provide a method to access values, namely "\code{operator() const}".
-Yet, its signature is NOT "\code{value operator()(const site\& p) const}"
-but "\code{rvalue operator()(const psite\& p) const}".
-
-For instance, with \type{I} being \type{image2d$<$int\_u8$>$}, we have :
-
-\begin{center}
- \type{I::value} == i\type{nt\_u8} but \type{I::rvalue} ==\type{const
- int\_u8\&}
-\end{center}
-
-So copying the value when the call "\code{f(p)}" returns is avoided.
-In that case, it is a low-level implementation issue that makes rvalue
-be different from value. In some other cases, the difference can be
-more fundamental. For instance, a proxy is returned so that some extra
-code is performed if this value is eventually read.
-
-Likewise, lvalue is also used as return type for methods such as
-"\code{operator()}".
-The difference is that lvalue allows the data to be modified.
-
-With \type{I} being \type{image2d$<$int\_u8$>$}, we have :
-
-\begin{center}
- \type{I::value} == \type{int\_u8} but \type{I::lvalue} == \type{int\_u8\&}
-\end{center}
-
-%**************************
-\doxysection{imadomain}{Domain}
-The site set contains the sites which compose the image. Sites are based on a
-grid so the image depends on that grid as well.
-It means that a 2D images can only be defined by sites based on a 2D grid.
-Likewise, an \type{image2d} will always have its bouding box defined by a \type{box2d}.
-
-Being defined on a grid means that the image can be defined anywhere.
-For instance, defining a 2D image with a \type{box2d} starting from point (-20, -20)
- to (-3, 5) is completely valid.
-
-The following example shows that the definition domain and the site set are
-exactly equivalent.
-
-\doxycode{ima2d-1}
-Output:
-\doxyoutput{ima2d-1}
-
-
-To know if a site belongs to an image domain or not, a method ``\code{has()}'' is
-available.
-\doxycode{point-1}
-Output:
-\doxyoutput{point-1}
-
-Since the notion of site is independent from the image it applies on, we can
-form expressions where a site passed to several images:
-\doxycode{ima2d-4}
-Output:
-\doxyoutput{ima2d-4}
-
-
-%================================================
-\doxysection{imaborder}{Border and extension}
-Olena provides extension mechanisms for the
-image domain. In the library, both the concept of border and of extension can be encountered.
-These concepts are useful in many algorithms and can avoid costly tests while
-working with sites located on image edges.
-
-\doxysubsection{imabordersection}{Image border}
-
-A border is a finite extension provided to a basic image type, such as
-\type{image2d}. By default, every image is created with a border. The default width is
-defined through the global variable \var{border::thickness} defined in
-\header{mln/border/thickness.hh}. Since this is a variable, it can be changed
-as shown in the following example.
-
-\doxycode{borderthickness}
-
-Output:
-
-\doxyoutput{borderthickness}
-
-It is important to note that to display the border in the ouput, we use a
-special debug function, \code{debug::println\_with\_border}. Indeed, the border and the
-extension are considered as part of an image only in the algorithms. They are
-ignored while saving or printing an image.
-
-Some operations can be performed on the border. The functions are located in
-\hpath{mln/border}.\\
-
-%
-\bigskip
-%
-\begin{tabular}{l|p{8cm}}
-Routine & Description \\
-\hline
-adjust & Increase the border thickness if it is inferior to a minimum. \\
-duplicate & Assign the border with the duplicate of the edges of this image.\\
-equalize & Equalize the border of two images so that their size is equal and is
-at least a minimum size.\\
-fill & Fill the border with a given value.\\
-find & Find the border thickness of an image.\\
-get & Get the border thickness of an image.\\
-mirror & Fills border using nearer pixels with a mirroring effect.\\
-resize & Set image border to a specific size.\\
-\end{tabular} \\
-
-
-\doxysubsection{imextgeneral}{Generality on image extension}
-
-On morphed images, described 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.
-Thanks to \header{mln/core/routine/extend.hh}, an extension can be defined through a
-function. This means that the extension can be infinite.
-Another point is that an image can be used as extension. For instance, in the
-case of a sub-image, you may be interested in extending the sub-image with the
-image itself.
-
-The extension supports the following operations. These functions are located in
-\hpath{mln/extension}.\\
-
-%
-\bigskip
-%
-\begin{tabular}{l|p{10cm}}
-Routine & Description \\
-\hline
-adjust & Adjust the extension given a structural element.\\
-adjust\_duplicate & Adjust the size of the extension given a structural element and duplicate the image inner boundary.\\
-adjust\_fill & Adjust the size of the extension given a structural element and fill it with a value.\\
-duplicate & Duplicate the values of the image inner boundary in the extension.\\
-fill & Fill the extension with a given value.\\
-\end{tabular} \\
-
-
-In order to extend an image, a routine \code{extend} is available in
-\hpath{mln/core/routine/extend.hh}. The routine \code{extended\_to} may
-also help during debug. It allows to extend the image domain to a larger
-one. The values associated to the new sites comes from the extension.
-
-\doxysubsection{extexample}{Different extensions}
-
-Let's say we have want to extract a sub domain from an image. In the following
-example, \var{ima\_roi} holds several small rectangles from the original image.
-\doxycode[2]{extend}
-
-\begin{center}
- \begin{tabular}{c c c}
- \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{extend}{3cm} \\
- \var{lena} & & \var{ima\_roi} (black color means the sites are not included in the domain) \\
- \end{tabular}
-\end{center}
-
-
-Then, we may extend this sub image with one of the three following extension type.
-
-\doxysubsubsection{extval}{Extension with a value}
-
-Let's extend with the value \code{literal::blue}.
-\doxycode[3]{extend}
-\doxyfigure[2]{extend}{3cm}
-
-Note the use of the \code{extended\_to()} routine. We used a larger bbox to
-extend the image domain. That is the reason why the image is surrounded by the
-extension value, blue.
-
-\doxysubsubsection{extfun}{Extension with a function}
-
-Let's use the following function:
-\doxycode[1]{extend}
-\doxycode[4]{extend}
-\doxyfigure[3]{extend}{3cm}
-
-\doxysubsubsection{extima}{Extension with an image}
-
-Let's extend with the original image, \var{lena}.
-\doxycode[5]{extend}
-
-\begin{center}
- \begin{tabular}{c c}
- \doxyfigure[4]{extend}{3cm} & \doxyfigure[5]{extend}{3cm} \\
- \var{ext\_with\_ima}, the extended image. & The actual data in the domain (light) with its extension (dark) \\
- \end{tabular}
-\end{center}
-
-
-%----------------
-\subsection*{IMPORTANT NOTE}
-Many times, you may want to check if a site is part of the image before applying
-a treatment. All images provide a method ``\code{has(Site)}'' which can return this
-information.
-\textbf{Be careful though, calling \code{has()} on the image returns ``true'' if
- the given site is part of the domain OR the the extension/border}. All
- algorithms in Olena call that method which means that all the algorithms take
- in consideration the extension/border if it exists. The default border
- thickness is set to 3 as shown by the following example.
-
-\doxycode{ima-has}
-
-Output:
-
-\doxyoutput{ima-has}
-
-Most of the time, this is the good behavior. For instance, if a rotation
-is applied to an image, sites which were not previously in the domain
-will be part of it. Thanks to the extension/border, these sites will be
-associated to the value of the extension/border.
-
-In the following example, the extension is set to a constant color \var{yellow}.
-It means that whatever the new sites computed through the rotation, it will be
-part of the image and a value will be available. Site which were previously in
-the extension/border, will be associated to \var{yellow} in the output image.
-
-\doxycode{ima2d-rot}
-
-Output:
-
-\bigskip
-
-\begin{tabular}{c c}
-\doxyfigure[1]{ima2d-rot}{3cm} & \doxyfigure[2]{ima2d-rot}{3cm} \\
-\multicolumn{2}{c}{\var{ima1} and its border before rotation (left) and \var{ima2}
- and its border after rotation (right).} \\
-\end{tabular}
-
-\bigskip
-
-[Image+bord rotation 20degres, avant, apres]
-
-
-Sometimes taking the domain in consideration may not be the expected behavior.
-If you do not want to use the extension/border for a specific routine, simply
-restrict the image to its domain.
-
-
-\doxycode{extension-ignore}
-
-Note that:
-\begin{center}
-\code{ima.domain().has()} $\equiv$ \code{(ima | ima.domain()).has()}
-\end{center}
-
-
-%================================================
-\doxysection{imamorphed}{Morphed images}
-//FIXME: Write it!
-// Pas concrete, light, how to concrete
-%
-
-
-%================================================
-\doxysection{imainterface}{Interface}
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Return Type & Name & Arguments & Const & Comments \\ \hline
-
-I::pvset & domain & - & X - & \\ \hline
-const Value\& & operator() & const point\& p & X & Used for reading. \\ \hline
-Value\& & operator() & const point\& p & - & Used for writing. \\ \hline
-bool & has & const Point\& p & X & \\ \hline
-bool & has\_data & - & X & Returns true if the domain is defined. \\ \hline
-site\_id & id & - & X & Return the Id of the underlying shared data. \\ \hline
-I::vset & destination & - & X & Value set of all the possible site values in this
-Image. \\ \hline
-site\_set & bbox & - & - & Returns the bounding box of the domain. \\ \hline
-site\_set & bbox\_large & - & - & Returns the bouding box of the domain and the
-extended domain. \\ \hline
-
-\end{tabular}
-
-
-%================================================
-\doxysection{imaio}{Load and save images}
-
-Currently, Olena supports the following input image formats:
-\begin{itemize}
- \item PBM
- \item PFM
- \item PGM
- \item PNM
- \item PPM
-\end{itemize}
-
-This support is provided through two headers for each type, \header{save.hh} and
-\header{load.hh}.
-They are located in \hpath{mln/io/$<$image-format$>$/}.
-
-Once the right header is included, the image can be loaded:
-
-\doxycode{ima-load}
-
-Note that each format is associated to specific image value types:
-\begin{tabular}{|l|l|}
-\\hline
-Format & Value type \\ \hline
-PBM & bool \\
-PFM & float, double, float01\_* \\
-PGM & unsigned, long, int, int\_u*, gl* \\
-PNM & See PGM, PBM and PPM \\
-PPM & rgb* \\
-\end{tabular}
-
-\doxycode{ima-save}
-%
-
-%================================================
-\doxysection{imacreate}{Create an image}
-
-Loading an image is not mandatory, an image can be created from scratch. There
-are two possibilites to do so:
-
-\doxycode{ima2d-2}
-
-Img1a has no data and its definition domain is still unset. We do
-not know yet the number of sites it contains. However, it is really useful to
-have such an "empty image" because it is a placeholder for the result of some
-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{data::fill} can be called in order to
- do so (See also \doxyref{fillop}).
-
-
-%================================================
-\doxysection{imaaccessmodval}{Access and modify values}
-
-There are several ways to access/modify an image ``\var{ima}'':
-\begin{itemize}
-\item \code{opt::at(ima, x, y, \dots)}
-\item \code{ima(Site)}
-\end{itemize}
-
-Most of the time, images can be modified and these two methods can be used both
-to read a value and modify it. Both methods are equivalent.
-\doxycode{ima2d-3}
-Output:
-\doxyoutput{ima2d-3}
-
-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 \doxyref{iterators}.
-
-
-
-%================================================
-\doxysection{imasize}{Image size}
-Most typical image types owns special methods to retrieve the image size.
-
-\begin{tabular}{l|l}
-Image type & Methods \\
-\hline
-image1d & length()\\
-image2d & ncols(), nrows()\\
-image3d & ncols(), nrows(), nslis() \\
-\end{tabular}
-
-If you need a more generic way to get the size, you can use the routines
-provided in \hpath{mln/geom} in the following files:
-\begin{itemize}
- \item \header{ncols.hh}
- \item \header{nrows.hh}
- \item \header{nslis.hh}
-\end{itemize}
-
-\doxycode{ima-size}
-Output:
-\doxyoutput{ima-size}
-
-
-%================================================
-\doxysection{imaconvvals}{Conversion of image values}
-
-parler de level::compute/level::apply.
-parler de i2v et v2v.
-Voir les vset => attendre que ca soit ameliore?
-
-%====================================
-\clearpage
-\newpage
-%Ugly workaround to avoid missing chapter references in doxygen.
-\begin{htmlonly}
-\doxychapter{1}{}
-\end{htmlonly}
-\doxychapter{winneigh}{Structural elements: Window and neighborhood}
-
-In Olena, there are both the window and neighborhood concept. A window can be
-defined on any sites around a central site which may also be included.
-A neighborhood is more restrictive and \must not include the central site.
-Therefore these two concepts are really similar and are detailed together in
-this section.
-
-By default, structural elements are centered. The central site is located at the
-origin of the grid: ``\var{literal::origin}''. With \type{image2d}, the central site is
-(0,0). Centered structural elements \must have an odd size.
-
-
-
-\doxysection{sedef}{Define an element}
-
-\doxysubsection{winwin}{Window}
-
-\subsubsection*{Generic Predefined windows}
-
-\begin{tabular}{l|l|l}
-Name & Description & Representation \\
-\hline
-win\_c4p & 4-connectivity & \wincfour \\
-win\_c8p & 8-connectivity & \winceight \\
-\end{tabular}
-%
-\bigskip
-%
-
-\subsubsection*{1D Predefined windows}
-
-\begin{tabular}{l|l|l}
-Name & Description & Representation \\
-\hline
-segment1d & 1D segment & - \\
-\end{tabular}
-%
-\bigskip
-%
-
-\subsubsection*{2D Predefined windows}
-
-\begin{tabular}{l|l|l}
-Name & Description & Representation \\
-\hline
-backdiag2d & Back diagonal & - \\
-diag2d & 2D diagonal & - \\
-disk2d & 2D disk & - \\
-hline2d & 2D horizontal line & - \\
-octagon2d & 2D octogon & - \\
-rectangle2d & 2D rectangle & - \\
-vline2d & 2D vertical line & - \\
-\end{tabular}
-%
-\bigskip
-%
-
-\subsubsection*{3D Predefined windows}
-
-\begin{tabular}{l|l|l}
-Name & Description & Representation \\
-\hline
-cube3d & 3D Cube & - \\
-cuboid3d & Cuboid & - \\
-\end{tabular}
-
-These predefined windows can be passed directly to a function. The headers are
-located in \header{mln/core/alias/window*.hh}.
-
-\doxysubsection{wwindow}{Weighted window}
-FIXME
-
-\doxysubsection{neighborhood}{Neighborhood}
-
-Predefined neighborhood:\\
-
-\begin{tabular}{l|l|l}
-Name & Description & Representation \\
-\hline
-c4 & 4-connectivity & \neighcfour \\
-c8 & 8-connectivity & \neighceight \\
-\end{tabular}
-
-These predefined neighborhood can be passed directly to a function. The headers are
-located in \header{mln/core/alias/neigh*.hh}.
-
-Use case example:
-\doxycode[2]{labeling-compute}
-
-\doxysubsection{customse}{Custom structural elements}
-
-\subsubsection{Windows}
-
-There are several ways to define a new window.
-The first and the most common way is to declare a window variable and insert
-dpoints:
-\doxycode{win-create-1}
-This code creates the following window where ``X'' is the central point from
-which the window is computed:
-\doxyoutput{win-create-1-display}
-
-Another way to define the same window is to provide a bool array:
-\doxycode{win-create-2}
-
-\textbf{Note that despite the different ways of defining these windows,
- ``var{win}'' == ``\var{win2}''}.
-The boolean array \must always have an odd size.
-While creating a windows thanks to a bool array/matrix, the window's center is the
-central site of the array/matrix.
-
-\textbf{This way of defining a window is very powerful since it enables the possibility
-of having non-square windows such as:}
-
-
-
-\subsubsection{Neighborhood}
-
-
-\doxysubsection{sitedepse}{Site dependent structural elements}
-
-\doxysubsection{convneighwin}{Conversion between Neighborhoods and Windows}
-
-Windows are not convertible to a Neighborhood.
-Neighborhood are convertible to a window though.
-
-A neighborhood has a method ``\code{win()}'' which returns the definition window.
-Be ware that this window is not centered, thus does not include the central
-point.
-
-
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{sitesandco}{Sites, psites and dpoints}
-
-
-%**************************
-\doxysection{sitessite}{Need for site}
-
-As we have seen before, an image is defined on a grid. It has associated
-data and a site set which defines the domain of the image on that grid.
-Usually, we need to access a value by its coordinates. With default images it
-can be done easily, at no cost.
-
-Example with an \type{image2d}:
-\doxyoutput{ima2d-display-1}
-
-The site \var{x} is the point (0, 1). The image values are stored in a
-multi-dimensional array. The point coordinates can be used directly. The site
-(0, 1) \textbf{is} the point (0, 1) and the data is stored at row 0 and column
-1.
-
-Here we have:
-
- \type{I::site} == \type{I::psite} == \type{point2d}
-
-where, roughly, \type{point2d} = \{ row, column \}.
-
-%**************************
-\doxysection{sitespsite}{Need for psite}
-
-Sometimes, accessing a value in constant-time complexity, O(1), is not
-possible with a site object.
-
-Let's have a small example. Define a function returning a value for a given
-point:
-\clearpage
-\doxycode{fun-p2v-1}
-
-So, for each point having (0, x) as coordinate, this function will return 8,
-otherwise it will be 9.
-
-Then, define a \type{p\_array} with few \type{point2d}:
-\doxycode{parray-append}
-
-Now, create a point-wise image from this function and this \type{p\_array}:
-\doxycode[1]{mln_var}
-
-Ima is actually that image:
-\doxyoutput{ima2d-display-2}
-
-However, in memory, since it is based on a \type{p\_array}, sites are stored in a
-vector.
-
-The site x is the point (3, 7) which corresponds to the cell 1 in the
-\type{p\_array}.
-\doxyoutput{parray-display-1}
-
-Obviously, we cannot check in constant time whether the site \var{x},
- \type{point2d} here,
-is part of that image or not: knowing the point coordinates is not enough.
-That's why we need a different mechanism in order to access this information:
-the psites.
-
-Here we have:
-
- \type{I::site} $==$ \type{point2d} but \type{I::psite} $==$
- \type{pseudo\_site$<$point2d$>$}
-
-where, roughly, \type{pseudo\_site$<$point2d$>$} $=$ \{ i\_in\_p\_array, p\_array\_ptr
-\}.
-
-Psites contains all the needed information to access the values in
-constant-time.
-
-%**************************
-\doxysection{sitespsitensite}{From psite to site}
-
-In the last example there was an image of type \type{I} such as \type{I::site}
-!= \type{I::psite}.
-In that case, an object of type \type{I::psite} is actually convertible towards an
-object of type \type{I::site}. Furthermore, a \type{psite} shall behave as if it was a
-\type{site}.
-
-Design note: it seems impossible to offer through the interface of
-some \type{psite} what is expected from its corresponding \type{site}. For instance, when a
-site has a given feature, say a method "\code{m}", then this
-method has to appear in the \type{psite} interface. However, thanks to
-inheritance, we fetch an interface and an implementation that delegates
-to the site.
-
-For instance, in the last example, \type{I::psite} has a method \code{row(}) because
-\type{I::site}, \type{point2d}, provides such a method.
-
-How it works: a \type{psite} inherits from \type{internal::site\_impl$<$site$>$} which is
-specialized for every site type; for instance,
- \type{internal::site\_impl$<$point2d$>$}
-owns the method ``\code{coord row() const}'' which is defined as
-``\code{return exact(this)-$>$to\_site().row()}''.
-
-%**************************
-\doxysection{sitesdpoint}{Dpoint}
-Dpoints are relative sites. They are usually used in window and neighborhood
-definitions. Since the central site is not constant, windows and neighborhoods
-\must be recomputed and dpoints help in doing that.
-
-\doxycode{dpoint-1}
-Output:
-\doxyoutput{dpoint-1}
-
-
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{iterators}{Iterators}
-
-Each container object in Olena like site sets or images have iterators.
-The iteration mechanism for images is directly derived from the mechanism
-for site sets.
-
-There are usually three kinds:
-\begin{itemize}
-\item \textbf{fwd\_iter}, depends on the container,
-\item \textbf{bkd\_iter}, iterates like forward but to the opposite way,
-\item \textbf{iter}, usually the same as fwd\_iter. It is guaranteed to
-iterate all over the elements.
-\end{itemize}
-Every iterable object have these three kinds of iterator. There are all
-bidirectional containers.
-Whatever the iterator used, the basic iterator has the only property of
-browsing every site once.
-
-The iterator type name depends on the data pointed by it: \\
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Data type & Iterator Names \\ \hline
-Site & fwd\_piter, bkd\_piter, piter \\ \hline
-Value & fwd\_viter, bkd\_viter, viter \\ \hline
-Neighboors & fwd\_niter, bkd\_niter, niter \\ \hline
-\end{tabular} \\
-
-As you may have noticed, according to the data type, the word ``iter'' is prefixed
-by the usual name variable used for that data type. Sites variables are usually
-called ``p'' so the proper iterator is ``type{piter}''. (See the foreword)\\
-
-
-An iterator has the following interface: \\
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Return Type & Name & Arguments & Const & Comments \\ \hline
-
-void & start & - & - & \\ \hline
-void & next & - & - & \\ \hline
-bool & is\_valid & - & - & Return false if created with the default
-constructor and not associated to a proper container.\\ \hline
-\end{tabular} \\
-
-
-Example of different forward iterations:
-\begin{itemize}
- \item box2d: from top to bottom then from left to right.
- \item p\_array$<$point2d$>$: from left to right.
-\end{itemize}
-
-A \code{for\_all()} macro is available to iterate over all the sites: \\
-
-\doxycode{forall-piter}
-Output:
-\doxyoutput{forall-piter}
-
-Note that when you declare an iterator, prefer using the ``\code{mln\_*iter}'' macros.
-They resolve the iterator type automatically from the given container type
-passed as parameter. These macros can be used with any container like images or
-site sets.
-
-Here follow an example with the implemantions of the most basic routines which
-use the \code{for\_all} loop: \code{data::fill()} and \code{data::paste()}.
-
-\doxycode{fill}
-
-\doxycode{paste}
-
-Important note: macros for iterators exist in two versions:
-``\code{mln\_*iter}'' and ``\code{mln\_*iter\_}''. The difference is that the
-first version \must be used in templated function whereas the second one \must be
-used in non templated functions.
-
-If you want a list of all the macros available in Olena, please refert to
-section \doxyref{macros}.
-
-
-%================================================
-\clearpage
-\doxychapter{imamemmgmt}{Memory management}
-
-In the Olena library, all image types behave like image2d:
-\begin{itemize}
-\item An "empty" image is actually a mathematical variable.
-
- $\rightarrow$ just think in a mathemetical way when dealing with images;
-
-\item No dynamic memory allocation/deallocation is required.
- the user never has to use "new / delete" (the C++ equivalent for the C
- "malloc / free") so she does not have to manipulate pointers or to directly
- access memory.
-
- $\rightarrow$ Olena prevents the user from making mistakes;
-
-\item Image data/values can be shared between several variables and the memory
- used for image data is handled by the library.
-
- $\rightarrow$ Memory management is automatic.
-\end{itemize}
-
-%----------------
-\subsection*{Exemple with image2d}
-
-Images do not actually store the data in the class. Images store a pointer
-to an allocated space which can be shared with other objects. Once an image is
-assigned to another one, the two images share the same data so they have the
-same ID and point to the same memory space.
-Therefore, assigning an image to another one is NOT a costly operation. The new
-variable behaves like some mathematical variable. Put differently it is just a
-name to designate an image:
-\doxycode{ima2d-5}
-
-If a deep copy of the image is needed, a clone() routine is available:
-\doxycode{ima2d-6-clone}
-Output:
-\doxyoutput{ima2d-6-clone}
-
-
-
-%====================================
-\clearpage
-\newpage
-\doxychapter{basicops}{Basic routines}
-//FIXME : illustrer
-
-\begin{tabular}{l|p{8cm}}
-\hline
-Routine name & Description \\ \hline
-level::clone() & creates a deep copy of an object. Any shared data is
-duplicated. \\
-
-data::fill() & fill an object with a value. \\
-
-data::paste() & paste object data to another object. \\
-
-labeling::blobs() & find and label the different components of an image. \\
-
-logical::not\_()
-logical::not\_inplace() & Point-wise "logical not" \\
-
-*::compute() & compute an accumulator on specific elements. \\
-\hline
-\end{tabular} \\
-
-%**************************
-\doxysection{fillop}{Fill}
-First, create an image:
-\doxycode[1]{fill-call-1}
-
-Memory has been allocated so data can be stored but site values
-have not been initialized yet. So we fill \var{imga} with the value 'a':
-
-\doxycode[2]{fill-call-1}
-
-The ``\code{fill}'' algorithm is located in the sub-namespace "\namespace{mln::data}" since this
-algorithm deals with the site values.
-
-Note that the term "level" refers to the fact that an image can be considered as
-a landscape where the elevation at a particular location/site is given by
-the corresponding site value.
-
-The full name of this routine is ``\namespace{mln::data::fill}''.
-To access to a particular algorithm, the proper file shall be included.
-The file names of algorithms strictly map their C++ name; so
-\namespace{mln::data::fill} is defined in the file \header{mln/data/fill.hh}.
-
-%----------------
-\subsection*{Note}
-Most algorithms in Olena are constructed following the classical scheme: "output
-algo(input)", where the input image is only read. However some few algorithms
-take an input image in order to modify it. To enforce this particular feature,
-the user shall explicitly state that the image is provided so that its data is
-modified "read/write". The algorithm call shall be ``\code{data::fill(ima.rw(),
-val)}''. When forgetting the ``\code{rw()}'' call it does not compile.
-
-\doxycode[3]{fill-call-1}
-
-%**************************
-\doxysection{pasteop}{Paste}
-We then define below a second image to play with. As you can see this image has
-data for the sites (5, 5) to (14, 14) (so it has 100 sites).
-
-\doxycode{paste-call-1}
-Output:
-\doxyoutput{paste-call-1}
-
-Before pasting, the couple of images looked like:
-
-//FIXME : ajouter des zolies zimages.
-
-so after pasting we get:
-
-//FIXME : ajouter des zolies zimages again.
-
-%----------------
-\subsection*{Note}
-With this simple example we can see that images defined on different domains (or
-set of sites) can interoperate. The set of sites of an image is defined and
-can be accessed and printed. The following code:
-
-\doxycode{domain-display}
-
-Gives:
-\doxycode{domain-display}
-
-The notion of site sets plays an important role in Olena. Many tests are
-performed at run-time to ensure that the program is correct.
-
-For instance, the algorithm data::paste tests that the set of sites of imgb
-(whose values are to be pasted) is a subset of the destination image.
-
-
-
-%====================================
-\doxysection{blobs}{Blobs}
-
-\code{Labeling::blobs()} is used to label an image. It returns a new image with the
-component id as value for each site. The background has 0 as id therefore the
-component ids start from 1.
-
-Consider the following image:
-\doxycode[1]{labeling-compute}
-
-Output: \\
-\begin{center}
-\doxyfigure[1]{labeling-compute}{3cm}
-\end{center}
-
-Then label this image thanks to \code{labeling::blobs()}:
-\doxycode[2]{labeling-compute}
-
-Output: \\
-
-\begin{center}
-\doxyfigure[2]{labeling-compute}{3cm}
-\end{center}
-
-Note that this routine returns the number of components in its third parameter.
-This parameter \must be of the same type as the returned image value.
-
-
-%**************************
-\doxysection{logicalnot}{Logical not}
-\begin{center}
- \begin{tabular}{|l|l|}
- \hline
- \textbf{Header} & mln/logical/not.hh \\
-
- \textbf{Full namespace} & mln::logical \\
-
- \textbf{Routine(s)} & not\_(),
- not\_inplace() \\
- \hline
- \end{tabular}
-\end{center}
-
-\bigskip
-
-This small routine only works on binary images. It performs a point-wise
-"logical not" and therefore "negates" the image. There are two versions of that
-algorithm a version which returns a new image and another which works in place.
-Example:
-
-Make a binary image:
-\doxycode[1]{logical-not}
-\begin{center}
-\doxyfigure[1]{logical-not}{3cm}
-\end{center}
-
-Return the result in a new image:
-\doxycode[2]{logical-not}
-\begin{center}
-\begin{tabular}{c c}
-\doxyfigure[1]{logical-not}{3cm} & \doxyfigure[2]{logical-not}{3cm} \\
-\multicolumn{2}{c}{\var{ima} (left) and \var{ima_neg} (right) after having
- called logical::not\_().} \\
-\end{tabular}
-\end{center}
-
-Or, work in place:
-\doxycode[3]{logical-not}
-Then, \var{ima} looks like:
-\begin{center}
-\doxyfigure[3]{logical-not}{3cm}
-\end{center}
-
-
-%**************************
-\doxysection{compute}{Compute}
-
-There are several flavour of the compute routine, depending on what the kind of
-elements it computes.
-
-\begin{tabular}{l|p{8cm}}
-\hline
-labeling::compute() & compute an accumulator for each component in a labeled
-image. \\
-
-level::compute() & compute an accumulator on the values of an image. \\
-\end{tabular}
-
-\doxysubsection{accu}{Accumulators}
-An accumulator is a special object accumulating data while iterating all over
-the image values or sites. Hereby follows a list of accumulators available in
-Olena.
-
-%----------------
-\subsubsection*{Accumulators on sites}
-\begin{tabular}{l|p{8cm}}
-Name & Description \\
-\hline
-bbox & Bounding boxes\\
-count\_adjacent\_vertices & Count adjacent vertices\\
-count & Count the number of sites\\
-height & \\
-volume & \\
-\end{tabular}
-
-%----------------
-\subsubsection*{Accumulators on values}
-\begin{tabular}{l|p{8cm}}
-Name & Description \\
-\hline
-histo & Histogram \\
-max & Max value \\
-max\_h & Max value (Hexa)\\
-mean & Mean value\\
-median\_alt & Median\\
-median\_h & Median (Hexa)\\
-min & Min value\\
-min\_h & Min value (Hexa)\\
-min\_max & Min and Max value\\
-rank\_bool & \\
-rank & \\
-rank\_high\_quant & \\
-sum & Sum the values\\
-\end{tabular}
-
-%----------------
-\subsubsection*{Special accumulators}
-\begin{tabular}{l|p{8cm}}
-Name & Description \\
-\hline
-pair & Pair of accumulators\\
-tuple & $n$-uplets of accumulators\\
-\end{tabular}
-
-Each accumulator can be used in \code{*::compute()}.
-It exists two versions of each accumulator.
-\begin{itemize}
- \item \namespace{mln::accu::*}, this version require the site or value type as parameter.
- For instance, for the bbox accumulator, the type would be
- \type{accu::bbox<mln\_psite(I)>}, where \type{I} is the type of the image on which it will be
- computed.
- \item \namespace{mln::accu::meta::*}, this is usually the easiest version to use. The type
- of site or value do not need to be specified and will be deduced at compile
- time. For the bbox accumulator, the accumulator type would be
- \type{accu::meta::bbox}.
-\end{itemize}
-
-Note that when an accumulator is passed to \code{*::compute()}, it \must be instanciated.You cannot write:
-\doxyrawcode{accu-wrong-instanciation}
-Instead, you \must write:
-\doxycode{accu-right-instanciation}
-
-\doxysubsection{exlblcompute}{Example with labeling::compute()}
-
-In this example we will try to retrieve the bounding box of each component in an
-image.
-
-Consider the following image:
-\doxycode[1]{labeling-compute}
-
-Then label this image thanks to \code{labeling::blobs()}:
-\doxycode[2]{labeling-compute}
-Output:
-\doxyfigure[2]{labeling-compute}{3cm}
-
-Then, use \code{labeling::compute()} with the bbox accumulator:
-\doxycode[3]{labeling-compute}
-
-\code{Labeling::compute()} hold an accumulator for each component, which means it
-returns an array of accumulator results.
-In this case, it returns an array of \type{box2d}.
-
-\textbf{Important note:} since \code{labeling::blobs()} labels the component from 1 and
-set the background to 0, we will want to iterate from 1 to nlabels included.
-\doxycode[4]{labeling-compute}
-Output:
-\doxyoutput{labeling-compute}
-
-
-\subsection{Routines based on accumulators and *::compute()}
-In order to make the code cleaner, small routines are available for the
-most used accumulators.
-
-Currently there are the following routines:\\
-
-\begin{tabular}{l|p{8cm}}
-Name & Description \\
-\hline
-nsites & Return the number of sites of an image or a site set.\\
-mean & Return the mean of the values of an image.\\
-min\_max & Return the min and max values of the values of an image.\\
-sum & Return the sum of the values of an image.
-\end{tabular}
-
-These routines can be found in \hpath{mln/geom} and in \hpath{mln/estim}.
-For example, with \code{geom::nsites()} simply write:
-\doxycode{estim-sites}
-
-%====================================
-\doxysection{partima}{Working with parts of an image}
-
-Sometime it may be interesting to work only on some parts of the image or to
-extract only a sub set of that image. Olena enables that thoughout out the
-operator '$|$'.
-
-Three kinds of that operator exist:\\
-
-\begin{tabular}{|l|l|l|l|p{4cm}|}
-\hline
-Prototype & Comments \\ \hline
-
-Image $|$ Sub Domain & Create a new image.\\ \hline
-Image $|$ Function\_p2b & Do not create a new image but create a morpher.\\
-\hline
-Function\_p2v $|$ Sub Domain & Do not create a new image but create a morpher.\\
-\hline
-\end{tabular} \\
-
-A Sub Domain can be a site set, an image or any value returned by this
-operator.
-For a given site, \type{Function\_p2v} returns a value and \type{Function\_p2b} returns a
-boolean. These functions. are actually a sort of predicate. A common
-\type{Function\_p2v} is \code{pw::value(Image)}. It returns the
-point to value function used in the given image. C functions can also be used as
-predicate by passing the function pointer.
-
-You can easily get a \type{Function\_p2b} by comparing the value returned
-by a \type{Function\_p2v} to another Value.
-The following sample codes illustrate this feature.
-
-In order to use C functions as predicate, they \must have one of the following
-prototype if you work on 2D images:
-\doxycode{predicate-1}
-Of course, you just need to change the point type if you use another image
-type. For instance, you would use \type{point3d} with 3D images.
-The returned value type \type{V} for \type{Function\_p2v} depends on the image value type.
-With \type{image2d$<$int$>$}, \type{V} would be \type{int}.
-
-In this section, all along the examples, the image "\var{ima}" will refer to the
-following declaration:
-\doxycode[1]{fill-part-image}
-Output:
-\begin{center}
-\doxyfigure[1]{fill-subdomain}{3cm}
-\end{center}
-
-\doxysubsection{restrictsiteset}{Restrict an image with a site set}
-A simple example is to fill only a part of an image with a specific value:
-\doxycode[2]{fill-part-image}
-
-Output:
-\doxyoutput{fill-part-image}
-
-\doxysubsection{restrictpred}{Restrict an image with a predicate}
-In the following example, we aim at extracting a component from an image and
-create a new image with it.
-
-First, find and label the components.
-\doxycode[2]{fill-subdomain}
-Output:
-\begin{center}
-\doxyfigure[2]{fill-subdomain}{3cm}
-\end{center}
-
-Then, restrict the image to the sites being part of component 2.
-\doxycode[3]{fill-subdomain}
-
-\var{lbl\_2} is a new image. \var{lbl\_2} looks like:
-\begin{center}
-\doxyfigure[3]{fill-subdomain}{3cm}
-\end{center}
-
-Finally, create a new color image, fill it with black and fill the sites part of
-component 2 with red.
-\doxycode[4]{fill-subdomain}
-Output:
-\begin{center}
-\doxyfigure[4]{fill-subdomain}{3cm}
-\end{center}
-
-The previous example can be written more quickly:
-\doxycode[2]{fill-subdomain-shorter}
-
-\doxysubsection{restrictcfun}{Restrict an image with a C function}
-In this example, the image is restricted to its odd lines. A new image is
-created in which odd lines are in red and others in black.
-
-Here is the simple C function used as predicate:
-\doxycode[1]{fill-subimage-cfun}
-
-Restrict the image with it:
-\doxycode[3]{fill-subimage-cfun}
-
-Output:
-\begin{center}
-\doxyfigure[1]{fill-subimage-cfun}{3cm}
-\end{center}
-%
-\medskip
-%
-%
-%----------------
-\subsection*{Important note}
-When writing:
-
-\doxyrawcode{ima2d-restricted-1}
-
-\var{sub\_D} \must be included in \code{ima.domain()}.
-
-Let's have an image, \var{imab}, like this:
-\doxyoutput{ima2d-display-output-1}
-
-Extract a sub image from \var{imab} with sites having their value set to 1.
-\doxycode[2]{mln_var}
-Then, \var{imab1} looks like:
-\doxyoutput{ima2d-display-output-2}
-
-Now, if we want to extract a sub image it may fail, depending on the site set
-used:
-\doxyrawcode{ima2d-restricted-2}
-
-If you do not want this constraint, you may want to use an alternative
-operator:
-\doxyrawcode{ima2d-restricted-3}
-
-In that case there is no restriction on the domain at all and the following example will work.
-\doxycode[3]{mln_var}
-Output:
-\doxyoutput{mln_var}
-
-With this operator, an intersection is applied on the image domain and the
-site set.
-
-
-
-%====================================
-\newpage
-\clearpage
-%Ugly workaround to avoid missing chapter references in doxygen.
-\begin{htmlonly}
-\doxychapter{2}{}
-\end{htmlonly}
-\doxychapter{graphandima}{Graphes and images}
-
-FIXME: REWRITE
-
-%**************************
-\doxysection{graphdesc}{Description}
-Olena enables the possibility of using graphes with images.
-Graphes can help you to handle directly parts of an image and represent their
-relationship.
-Specific data can be associated to each vertex and/or edges.
-
-//FIXME: Add more explanations?
-
-%**************************
-\doxysection{graphexample}{Example}
-
-First, create a graph which looks like the following:
-
-\doxyoutput{graph-output-1}
-
-First we need to add vertices:
-
-\doxycode[2]{graph-data}
-
-Finally, populate the graph with edges:
-\doxycode[3]{graph-data}
-
-Now there is a graph topology and we want to associate elements of this graph
-to a site in the image.
-The idea is to use specific site sets such as \type{p\_vertices} and
-\type{p\_edges}.
-Let's associate the vertices with sites. To do so we need a function which maps
-a vertex id to a site, e.g. a \type{point2d} here.
-\doxycode[4]{graph-data}
-
-Then declare a \type{p\_vertices}:
-\doxycode[5]{graph-data}
-
-Thanks to the \type{p\_vertices} there is now a mapping between vertices and sites.
-We may like to map data to it. The idea is to provide a function which returns
-the associated data according to the site given as parameter. Combining this
-function and the \type{p\_vertices}, we get an image which can be used with
-algorithms and \code{for\_all} loops.
-
-\doxycode[1]{graph-data}
-\doxycode[6]{graph-data}
-
-Output:
-\doxyoutput{graph-data}
-
-Note that like any image in Olena, graph images share their data. Therefore,
-while constructing a graph image from a graph and a function, the graph is not
-copied and this is NOT a costly operation.
-
-Of course, creating a graph image is not necessary and you can work directly
-with the graph and container/function mapping sites and data.
-
-\doxycode{graph-iter}
-Output:
-\doxymoutput[1]{graph-iter}
-
-Graphs have iterators like any other site sets and also provide
-specific iterators in order to iterate over graphes in a more intuitive way.
-
-Iteration over the adjacent edges of all the vertices:
-\doxycode[2]{graph-iter}
-Output:
-\doxymoutput[2]{graph-iter}
-
-Iteration over the adjacent edges of all the edges:
-\doxycode[3]{graph-iter}
-Output:
-\doxymoutput[3]{graph-iter}
-
-
-Iteration over the adjacent vertices of all the vertices:
-\doxycode[4]{graph-iter}
-Output:
-\doxymoutput[4]{graph-iter}
-
-//FIXME talk about p\_vertices and p\_edges.
-
-%====================================
-\newpage
-\clearpage
-\doxychapter{funs}{Functions}
-
-FIXME write it
-
-%====================================
-\newpage
-\clearpage
-\doxychapter{arithmops}{Arithmetical operators}
-
-FIXME write it
-
-%====================================
-\newpage
-\clearpage
-\doxychapter{mathtools}{Mathematical tools}
-
-FIXME write it
-
-%====================================
-\newpage
-\clearpage
-\doxychapter{globalvars}{Useful global variables}
-
-\begin{tabular}{l|p{8cm}|l}
-\hline
-Name & Description & Possible values \\
-\hline
-literal::zero & Generic zero value. Can be used with various types such as
-util::vec, dpoint\dots & n.a.\\
-& & \\
-literal::one & Generic one value. Can be used with various types such as
-util::vec, dpoint\dots & n.a.\\
-& & \\
-literal::origin & Generic value for the origin point on a grid.& n.a.\\
-& & \\
-border::thickness & Set the default border thickness of images & $[0-UINT_MAX]$\\
-& & \\
-trace::quiet & Enable trace printing & true/false \\
-\end{tabular}
-
-%====================================
-\newpage
-\clearpage
-\doxychapter{macros}{Useful macros}
-\renewcommand{\arraystretch}{2}
-
-\doxysection{vardeclmacros}{Variable declaration macros}
-\begin{tabular}{l|p{4cm}|p{6cm}}
-Name & Arguments & Description \\
-\hline
-mln\_VAR(N, V) & N : name of the variable. & \\
- & V : value to assign to N. & Declare a variable N of type N\_t and
- assign the value V. \\
-
-mln\_const\_VAR(N, V) & N : name of the variable. & \\
- & V : value to assign to N. & Declare a const variable N of type N\_t
- and assign the value V. \\
-\end{tabular}
-
-
-\doxysection{macrositerators}{Iterator type macros}
-
-\doxysubsection{macrosdefit}{Default iterator types}
-\begin{tabular}{l|p{4cm}|p{6cm}}
-Name & Arguments & Description \\
-\hline
-mln\_eiter(T) & T : iterable container type & Type of the element
- iterator of T \\
-
-mln\_niter(T) & T : iterable container/Image type & Type of the neighborhood
- iterator of T \\
-
-mln\_piter(T) & T : iterable container/image type & Type of the site
- iterator \\
-
-mln\_qiter(T) & T : iterable container/image type & Type of the window
- neighbors iterator of T \\
-
-mln\_viter(T) & T : iterable value container type & Type of the value
- iterator of T \\
-
-mln\_pixter(I) & I : image & Type of the pixel
- iterator of I \\
-
-mln\_qixter(I, W) & I : image type, & \\
- & W : window Type & Type of the pixel iterator of a
- window on an image of type I. \\
-
-mln\_nixter(I, N) & I : image type, & \\
- & N : neighborhood type & Type of the pixel iterator of a
- neighborhood on an image of type I. \\
-\end{tabular}
-
-
-
-\doxysubsection{macrosfwdit}{Forward iterator types}
-\begin{tabular}{l|p{4cm}|p{6cm}}
-Name & Arguments & Description \\
-\hline
-mln\_fwd\_eiter(T) & T : iterable container type & Type of the
- element forward iterator of T \\
-
-mln\_fwd\_niter(T) & T : iterable container/Image type & Type of the
- neighborhood forward iterator of T \\
-
-mln\_fwd\_piter(T) & T : iterable container/image type & Type of the site
- forward iterator \\
-
-mln\_fwd\_qiter(T) & T : iterable container/image type & Type of the window
- neighbors forward iterator of T \\
-
-mln\_fwd\_viter(T) & T : iterable value container type & Type of the value
- forward iterator of T \\
-
-mln\_fwd\_pixter(I) & I : image & Type of the pixel
- forward iterator of I \\
-
-mln\_fwd\_qixter(I, W) & I : image type, & \\
- & W : window Type & Type of the pixel
- forward iterator of a window on an image of type I. \\
-
-mln\_fwd\_nixter(I, N) & I : image type, & \\
- & N : neighborhood type & Type of the pixel
- forward iterator of a neighborhood on an image of type I. \\
-\end{tabular}
-
-
-\doxysubsection{macrosbkdit}{Backward iterators}
-\begin{tabular}{l|p{4cm}|p{6cm}}
-Name & Arguments & Description \\
-\hline
-mln\_bkd\_eiter(T) & T : iterable container type & Type of the
- element backward iterator of T \\
-
-mln\_bkd\_niter(T) & T : iterable container/Image type & Type of the
- neighborhood backward iterator of T \\
-
-mln\_bkd\_piter(T) & T : iterable container/image type & Type of the site
- backward iterator \\
-
-mln\_bkd\_qiter(T) & T : iterable container/image type & Type of the window
- neighbors backward iterator of T \\
-
-mln\_bkd\_viter(T) & T : iterable value container type & Type of the value
- backward iterator of T \\
-
-mln\_bkd\_pixter(I) & I : image & Type of the pixel
- backward iterator of I \\
-
-mln\_bkd\_qixter(I, W) & I : image type, & \\
- & W : window Type & Type of the pixel
- backward iterator of a window on an image of type I. \\
-
-mln\_bkd\_nixter(I, N) & I : image type, & \\
- & N : neighborhood type & Type of the pixel
- backward iterator of a neighborhood on an image of type I. \\
-\end{tabular}
-
-
-\doxysubsection{macrosgraphit}{Graph iterators}
-\begin{tabular}{l|p{4cm}|p{6cm}}
-Name & Arguments & Description \\
-\hline
-mln\_vertex\_iter(G) & G : graph type & Iterator on vertices. \\
-mln\_edge\_iter(G) & G : graph type & Iterator on edges. \\
-mln\_vertex\_nbh\_edge\_iter(G) & G : graph type & Iterator on the edges adjacent to a vertex. \\
-mln\_vertex\_nbh\_vertex\_iter(G) & G : graph type & Iterator on the vertices adjacent to a vertex. \\
-mln\_edge\_nbh\_edge\_iter(G) & G : graph type & Iterator on the edges adjacent to an edge. \\
-\end{tabular}
-
-
-%====================================
-\newpage
-\clearpage
-%Ugly workaround to avoid missing chapter references in doxygen.
-\begin{htmlonly}
-\doxychapter{2}{}
-\end{htmlonly}
-\doxychapter{debugtools}{Debugging tools}
+%\end{htmlonly}
-FIXME write it
\end{document}
diff --git a/milena/doc/white_paper/Makefile.am b/milena/doc/white_paper/Makefile.am
new file mode 100644
index 0000000..a332b17
--- /dev/null
+++ b/milena/doc/white_paper/Makefile.am
@@ -0,0 +1,8 @@
+include $(top_srcdir)/milena/doc/doc.mk
+TEXINPUTS = $(top_srcdir)/milena/doc/white_paper/figures:
+
+white-paper:
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex
+ TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex
+
diff --git a/milena/doc/white_paper/figures/house.png b/milena/doc/white_paper/figures/house.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a3ceaf2fd2fa35f917a7698c09322e93f8e6dd8
GIT binary patch
literal 26653
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
literal 0
HcmV?d00001
diff --git a/milena/doc/white_paper/figures/house_rag.png b/milena/doc/white_paper/figures/house_rag.png
new file mode 100644
index 0000000000000000000000000000000000000000..4085ba8c9ad186591a3dfccf73909ea05e042f61
GIT binary patch
literal 9454
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�Kf`_CWeTC!K_`K
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
M&$X1wpP7gLAG+1F$N&HU
literal 0
HcmV?d00001
diff --git a/milena/doc/white_paper/figures/house_wshed.png b/milena/doc/white_paper/figures/house_wshed.png
new file mode 100644
index 0000000000000000000000000000000000000000..88c0618f26f260e35635ee6bc27c4e173d153ef2
GIT binary patch
literal 27668
zcmX6^1ytQ!vkmU<F2$i}ad&qwZpGaTAMQ}x-Q8Q<9f}ugao6JRFa6(IT(VZ+CYf_)
z_Uzd+iBwUNMnNP*1ONa<Rz^Y%JO=#xz(az+74+}2!2^PmjIJwql=<IBYRp#X-$@TA
zQA_X`@V^i17F#9&*mB8Ah-!E(r@Z?6;@sx2#0qb4xK2%E^SVw^ZKYve;_0l_p4HaW
zn%dULq}gc3z}6WjHi<yW^sX~X)O4A;rv!9p2FXCqCjt(lA8aJsqipSAs%pB9J*t9!
z+F)bJxJ+emSbmwx$hbd<Tgv98on1TM;YTACpmE(lIJrOPUSaSp58&OTb3}UOXo)1-
z?)h_Q&L<54C9)LTG4}2>mZn_QO|(}3^uzgFTv(D;;{0N-OrwW%&9dwP<L!MF_rWrz
zqw?vs$g^~3hxBq!I?l%uusgAp?w^B!34{XJm^zK0nuDc>iL1kwCXQAN$pG}%T_?Kg
zE8E+#6;#rK4=d|T!lT-UpF`;ZVp!;@{){<KQh^E6dU*vC#8#AE42_7`ZF(f;+Ksy>
z0Fw4AStxxhwvYkLK`x?k-_UKxx`4v7LL-EevOB)U>^^lsg<B9xX>u!;ncK&;5Fdsl
zJHyIO-e`#47o;zLzh2j$R?YJBCl)31q$4^6SD<=gJ1wi4`M$w$!1GjEg=<3~u^?_3
zL3s9Jm+~N^lRQLe3{!djoC&W3zso9We^3CyO6?2V@A%u>3Rn%y7l{x-SVqg!Sl5^}
z<Z*qP5{IIwmkY=*FGK+-|Ej^y9PY0|nZ~NSpqt4>G6tg5@^vaeK>sHyy2(==Gv2!e
z=)gO#Xlst`m!Rk0pi+n&L9^myLq(MVn?P3<W-fLR&T6wfh2kaVe7gN}CE?C0R1U;h
zz#ASmt&_%>mcYVY!|CJ)B$mnzkBbNr)?SMGnZ6u2H2$E<i}-zXfK56epH9J<QtJvQ
z)C{!HgH)jNdZsrh`b7LDfY%rrDV#qdWh@W89JCVrf3pzz&|Hw=Y3S?4(8-a}X}$6h
zR)}mfb0o0RE-FF&*hA_%$f&>neK{4AG3L;T+(}Fc6I)uPN|jWV?Op?t`CfxH#pk$|
z8;zyYm=7ZJ0-|360oBva$h~zZAaEr%pFx3ww8T?t^S5#A?geJDO5%l6IDIE{I6orV
zBY!7rAy?4A1OYs;lit=Imak;K_!i?xKJ*=U!xj<&v2%?6l9y1NEp^-vTcLsC!t{aP
zFwuD^6#B%}s68Sf3U>lRxnoj#$h>Zv{w+v&orntYm~*RH@W*W4|CX}CJxK|{Ei>MN
znM>)_GV9FT0_Z}J9j1GXhnu<Mz$eO2^r|3Na7j0pri}K{)YrrXaEM35B!X5#s1hYH
zDtk4)`qK{gYCtQwafkCuyv<^qRSY(PPU#QcPl6fMlbE!zF`qm+ECPa>DV_I2@|(yY
zt{l3l)yfGJ_&7#9u3x<*RL}=N=f<1L?mpd2KtB_Uc)6&lqHD=SlYtadIW)l08iq*l
zK$eSi^!d*i+%95Rr{~$FSnzVeyFQ#};-yqEPjWH@-P^1@s|b<;Bus%m$6#RL>g(4H
zx1LsoSW6=s>Crm_3_Q`H3LNi21YmS+m0Z2H)v%TXbz(B)$FU8H?asC^Zo+4yp9FqC
zy$#f3$%yTZ43M=%M8%g=>BUiw#D{D6$&0}o&duj#z5-r+BD;XqVoUP2xb{P~riePO
zVu27^w#)#O(@P^zA+}JHrcif?X5<XbiMbJ*j~T{*8A+--6trU%8XM1}2ASnk38}P6
z-dR~#<An$v`Y8$XHxuk&uYA4y#Fl1IV1?YD3zNi}fT}{l+$lK`gs3v~Z(=G8G9MYo
z?d#B(vU%4k*t5k@$)Ur1Me|fE8|5sO;<|aw7tR9?55bkus9Hr7De@2eemw)MnQToQ
zVFaOw>UydECvzScEYq4`ts#W3i;aT}y3d!C0o4Y`2>uO$#*4xyn?W!vOk>hSmd7zP
zC^;#M9`Po~QSdM_3{0s^#27H<FOu3$ouo~oK9qB%L*XK(vS;Fy(rpe-Qp`dZJh?+J
zTr!4S9op`tu{b6|l?Du`lkhA!ii`a5zHs_M#sK@Pg`>=o-%G-zoJ&pI>=UI_DNn!v
z`sGM}MgeDYfJACOQ#L_R{>kG#CTD>pgs3VHZn9zv`-Vo}(<X-4Fg__miiK*E8-peZ
z0x^K}Ws1DR7=)d0ib36lW-#34BIh(i{@TOEm9sgd5j)XA#Kj~WRzbk+l_f_Gt3vWi
zPy`PYpjS#*fUehKs79vyh$*wk5fF|}`y<IT;=$seZ(sq|Z%DoupIE~Y70T<OYCsiM
zx4f1j1o9i}vfskZPkSiKzKNr_ZVw3)B^;*_!XkXL6oyUkN#I!sS~M}B|KK56{<`Pi
zEZ=PPT{)hnvI0P?{^o32%2r1~hv@t<9E-B(Wz5)o2LjQzY@0zc?gJ{hPF4MZ(I+$T
z=Ee-IJMfiija5DU5LF)CVl{dnJt%i}<y|t$jsHc9<)ZM@@<SE;Cw?>(jqjr%o@{&_
zyU7WMC7z||>Z+gkWOiosmShKK5p&A19!+fd_~L2l!0#0@;qdjasE$NcLK1<&K{RxB
zTsxEoC2n3P#h>tVNqK7O0t*X|v0P+QJ1tTL;kMc8vP}thY&T>X>#-)(+M}9A|0M|~
z35ISc;&(eZme$rc?z(r`EtOtbZ}u@%6zE@qni6vGRbhl(m1-mh@CZ%<)kR4?n9Ak*
z&*B9~iCZ|UTKT$)<ALJ85h;iQ`JIS2M9rDuP(h!Ep!X<v@>caC@1MpePIf%LP$>vU
z4b2B+=4Eg=qvO{Omqv>ax=ckid9YDgH6ijacfp`**xY^!_eu3XDD2U5a()fU-~dlv
zu56IWbd>gEv!+0E_j!U2Z!q0+AOX;?_!hX(_^7IgA=3SabCiOTcriz*EznLB-Tg@e
z3XupZFv58R9fBZJQyN><+3UeS^c^z%6GR4pse<tu(RT@9D2csLtcp?U<ZJmqyaH40
zeu9jIz|(Sq%`Idv0x@PRhFq_`CM1hV=EIoPSo7-#?f(v%rL{josiYAd*=9|<kpNlw
zOs!^GH@gS#54f#0<TnABoWFSb3`#goA}NqX2|l<EC-7E~VSY8&k6#dhJl$r?Z1ddE
zQzG19iiMZm3f;5Bk?N8#U=Pa0gp-S<)Kb~In8`l;`qp(<Rmw4iF>E8ZfQB-FhBJl~
z^ZaG`Fhqu0!%e)HBJvpkq<jx69kbtG$Tr%Ki4LSae>?jSv0Nz3zC`er{j@QNH%Ayo
zTE#p5c#Fh$uy~urCD2)X*8h(66lsJ>X!cU%%pj+NjT+9sbBhazQjBmuts`c!zf8wH
zAa+W5KC`!0w$5CV6iR;0tF*GhS*?l-!KH<H8D_|flKpHUuOSpkkBU^__#mzlXLS3`
z|8T|6M}1uUzwyry_0UA<CH#D320oK0i37H_5<0SgxR_G1uAPg5TWei?x=nFolcL}~
zRCz#{n9Ja1H-{8++J+4nB2*pSgil6dnpQL^Jtc(OCNG#~$=UstAFEhB9ycnV7!+oZ
zuvUjD^BK5wzlGVL$9bDw$Q>5S329Ze8aR^TB28~R<g5TUO_Sm2(5y_m!V_O3cSIG5
zlQg!%dsf$4s&V{;>XSsIWC$;=fgp?;i|JJVw<#3yx$T_)I%H5{3KT`1eWfva_`aZS
zf-oDeUmGS=0oR{_`FmkD&DjV~Dl23Af`Pv=>J8UWW257|W}k5yZ7q`(J;a&sgYOu-
zFJh75v!>--#yb{Vh*e#C04oL?VW=>kmXE>$p|TsGa??;}@27rW8=f{z+v=|<CpsR@
z4v5PHQU9Jqb9Z!fz?t_QJ_s9y<gXxd83?N-X=zz|QQ;0KTkP5OJ^6c?xK(9dG*DGY
zXi<2ycCS_8@yn|MvfFq+1~fiaK_MokP|jGo`v8B&A3+a8StEjz(&LhmnKoYNX&HmU
z7n5f;^h0?;n)1H=CY?fs$opo(sBnygB6b1Mhf7Im80|jKE^qu^BAB|<;}ge~R@=;h
zcbi1=O4EsWXidyS_^ZuQ1ads?aI<nYHH9S@&W-wlD%)8_TH^1Hy0%6qYfE+Q{R!D@
z1%jfH$Q|&Dh+c=6k`M?NAb@4o36Pn6GYh4cc!qwZtB+y0rYRn3$W?^SW0L^Tzkw+u
z#8fnN>!m;XSiGZLPJoXX$x_L&=lCy}4Cx9fL;E#UQbwz=#jPa^88B@mZj+UN-#v-Y
zd5={_<8M!Xh^?a|j;#}^Zgo-r9#{?!lqysc;9j{`N;bj=#7o30L$Yr3spGRa0fDCw
z7i;;<xv=Ow;y~qO$f#)~vb1R|42PvghuEz1)0>U*H*?QWKYG6@5=0F*!FR(#ss1!>
z(ZF+wzH~N%_N(WA=bklh>G*%``mKZL{L@(tN8-h7VzMDDlaj%l$rJp$gb;;LW$=~7
z4G7NWAn($grTNby_>YCPN1|#~aY?sDjbheU<ZQ(mv@3kvs{yg@k`_xJS4O~a^Ws{R
zRO}a^GVtq$){YdzdN2p4Cy(;VLaiM2Jj78?vfgB~8d(vsP!f~Ay||ex(%HcPI@JcR
z_^$`Ag%uq!6)Wj~rx72@cc(Gce_gWbiMXBfn<X%5P$o1e)IR=H8KyqQ4#mDsyVSU~
zH&F_MLPnHsYQ;&M33Uy-T)*32^#A+X1B{|qj(J1dCQ1S!=4#p4R}gIB`3hI+&MFgK
z8f~uSl2!i^i$1zI*&{b4+N$k&@fo`fjPBFR-?<3T_7fLKt1xnhh(nCn1cZ2CGi(Qn
z^-G+aRjYw3C}Vb`!&}(|5<oC$%2;I{C97)5I(WOW<oKSh<tc{4x$VOq&)p*hOz{=>
zo|pIGJQ_<{X!#02-zv2#&5us%NBe>RD{{>wzc<j(dFZ4fW~2Xu)=9-9qJRGV1WHat
zNy4=(Gpb7Q4Zbw_wpduUMKVks8v(T^x_>w@xDkz$hFFip?P>s9{RT^rGOES$r^k0n
zhMmcoP&`d&TyM7oRh(HFlliJqX@&y24L;vreIHb}jbQTp`(kP(xl5wD^Rr>B>C``|
zOB$$LTZkslrleC_W2|}y!aXX;pPzyML*SfaSG@k8V`P}2Y^)z|jKXF_0iTz&P9)RN
z%z-6?H|%Wajdg;iIR0l=*I}<uFWg!x@ENR>6)|(nCK4>$+PIXF5qg#TNbGbt7$65J
zCLAc}QD6LpaYGWT$3n+Zoljm*pKj=^SJ|vOWs^-II$0L=mD!=xjwB#HB>oeVaGfoH
z-s*f-kG6fJkO_salEkGwKXJJ@oOkz^*MFt&L-J^hRfdod)|iE8<h&#NnK;y@$Cz<3
z+6Q8$Y+ck>NJKj)B4dzy(A5{&c_cTKw`yy?jXdz!nnP<pBVx#mi(bJq$>}P|xNXGy
zqme>X3dFJ-oeO;0Om_TyX<GSEiWyJOYXTV(3Ik!?2W>ofYeJppI+0v+62>(A$BM=>
z0$B#qxZPo2L9tfd_7zJ!H=fbs&Y{irlHshfsBZ@2p7_j<6!QxL(wEpKLofLMV2A_1
z0jkE~`EjGI(7mTKg3Q+ts(W6%SP13$#8(XJe61v~PcWg7f47taN&Zx;%2ZO)R;gf8
zhKZF0V4KkU2C_TJPNcj($Tca)UqXvhTEeNeEwoO=<OA@E`66)WyQ*mll(EPP{;XJ4
z9KN9i&=1}pNxvhq4;JsWEuy=v@tkX5^zIJw20tLRu=TM*ymn8a2p^?G1pIE}!<Dj-
z$N0-oD&N*0ekW@X(ucr<7>PP73eXNGW6}!c%NOeLTJ)4<W|4sb$<Ex*p~at&Mx@3^
zPldU!Nrxbbj_?{UUAdWFo=|xBrBxkOF)6W}a^QGgBHgD5l11~!T)#Bn;yf3SOP|@@
z&lEx59}fTEU8NI5XBkzBvD9@V3vYJ@?fCjulM<JWwwaJ3{BCz+MH2SAOd4Ra*T4Fm
zdzs>iLl(87AtpA2m28EGM4yg$7UE6xTaG}GfyY#X&<yLGZ&frVR0!^M@bvg01WGEe
z2docr!hZ@$H?_pDEi#CrnUg!^Gv&!@%bQSE`~<!=&p=~hm;61$T++A_G7~>V4aa2Z
zknb*xYDNj$jJdEB7S=?s7D0+45Y2!_?wb}@u*n?~gmDIB4&t61KI38@yuUt@q4}|Y
zy^#nBONo1_|Lz@0u``vG28^}>z2+u!u?-Ji*Aa-Q4(c%!4C+7R|5l8oGG|9F-PiW~
zZO;qQ3<WF1!PsvuK@l-)Dn(!AO1LN!RTU}_fjGtKEk@H}M5No7{>IRtO5@~D%=w?$
zs;bl>le6g$UiyF7V82J!N~ROUap7dUiBy)u1*AZ~bmq$uyo*Ee4N|@MQj}Z=6?tn>
zq)ZGe$+s0b=rSy2b8StJY_xprzDoF>_r9Y?(si)WR6hAdJZZP*%aqD62Fg&6ttycY
zgPGnciazp7=LDJON5k9RRD#*8zXD!fMjO#fMgr#*;%g%Jpgf|`sM#APH{`|yTS-=;
zUo9>w%b+OEtJS9wpYtDE$!_+cu@^!cjF~9mX}ATj7Xw4WlvS{RUlld-Z46GMsGVW=
z(LzDvZv4yP-M%;I8?zB7nN)gbtU&2WXRmIM_ml=3zA-|o`Rc?Thmik?ur!%)>-&JR
z5a#a8Hbb(UG~D-O86A&n_Jo|7J;Jm4-bojCDUz_Dd5JlKZB%&zEJ<@HZXkY#`mCNQ
zM3JA%z<G*OciOIV%U|*F4rWq2m#orCi{2JFGN-~K6hlg!@dkUR*~octI9sJzblm-m
zToV@Q9?-3?+UuojCP~rj0$<K#Gki6lc8$3Jdy9V+7uu2wB58N?<EEvGj5N17@MYNk
z==4uVC8v|cxGQ7Yqj%{E9O~QB4&41*pfH+mdPHd3nn?#Mk3RXQAKa5!l?p#E6ScDi
zC{hR}vDrMv#b(x2fhL>Gaka&}hxztZ%OY8m{`U1etvrG+>5)_;i!w<Qk<b{_6^Fiw
zb_=Woczv~%+4YRFEsfy{2lX}KundoZm4|9W8841O4MyvguhZqsDV?l9m=n!!Y4oJb
z!=MsEF1OpJ^|g6de}5l&@uj=)EQjj3x%RMLXNXU3_U~U_sSOwJOY7fxeBpaXg7ZSE
z$$z&cY|C^@ShZg7Q$vh9a~U9qG3XzEf#D@-)de`E3>NQzV$HD%Vb@7PVaWO)&a#NQ
zqDoN4m2bVNw`k1oV>v|URr$M{CLdTiwu{lJbLDV4G<J!{82RAY#bG!ZWaEfy<+hNK
z#C33p;SnpJp(^D(8Gvs*`P;94vTJbzqVAkHM*&sc&TpWP1TiE`STD~*<@-x^?6rxK
z4#K%E-T!Uv`nbgxL^*A+aeZ<1*kZqW`%M<_k?U9~YAKu0=V}P*9g5Je@r8MVfOL{w
zT<UWQU~bP+Bd1@Bksz4B0Yvo81oLxwewxJdI_@LMI`8yGQ0MW~`JB?&EG>O?1`nV$
z#hw1?JexXOKx@WehhIdhT;*<T9i4(fPen$MiwKSwrf1UHqm?EWc}qp_i&eWV5Wv7r
zW=u89$R0=l(a>h#=ah~f&ng~CWeENVS>P$gjVu}VwxpsP$TwT67bf<eQ=8UbR9XZV
z$Q9;O0FgA90dysP&7gkAbU|Cyxu!DZ-2E7AfC|z*DnZEJ<!R>m{O#=2^K9h-;CBz=
z@{SOBk0hCiJwmq7Z_^^JkiCTSv@`7RYNI;=__ERjTFqSBN7E~zyqre%V~4W<s=ei6
zeIlNbG%jY{SK}3f=w-glef8O4ur7VuTUP|7feYzy;P{J51ve<UMh8YQRM@aF;cjth
z>S{xO=Cwf*rKmx70mh2xsD6R<LSjNxL}veN5JdvqC!t|IW}0HwRj|&-@=>$D2W8si
zxo@Nasq1TC5fym>8fsH$`{;7x2hzo-<^AyIwT@ce+YW{Ox%aI^1bx<=f|w63++KFm
zUx1w(*C_`5mnK(;m-7Xr6pTpzn2Pp;N>kQkXVEmbPm^#eMe~?lNfQ)BsiQra`lPE3
zkF}Ea^teRMwu(M<p>`16EXp&wrQaQw(uN$1aRTHVN39YFf-ox)D~DJvWe7qT%J}fL
zNfJvwP$>^<m;6`4{*ZV@PHh+bvD5gg(aOtKkiXsr3&Nq3;M^=FHFEDns|YMBG$%{m
zCso2JFjyRUJaGf+{149E6-k(Q9*fR%@Fy(TnU#l(-Uj4BmpeOrXkhj2*M>6DpxPva
zY-LJNz1fVNJV~t^<zWthYxeN`v_9W<5Gg~6aRY7zo4JH^Bl<6R$kda+E0SU7R>Plm
zFL(^DEPOR?Ms!wxcUL;iOr`tw{tn<t@E82K?mx<-8TfWwKHIvP+>hO>ghT`Rx>ZW#
zc(MXx>~k$3I;kgP!|o=zzAjJ)a`BN<`$$uLZ6@;loNBo|y&wzmiuxhEyqK2*JTk~l
zkIfE0OfeztZ1=?y0M*w?DkMyTDK)nmis$C7!<K&<roMS+k-wePpu>xI(_&}U)s{f`
zSDV=q=sK<HpP*qkYlo`%?yJGnp$Bb?DR;zieDSCLJhPAwM<C4uvh)}dhLae#6)G%y
zs#S)b;3Antf$}v$g(|Sj*W_3GI$PgzIevY+ZIn+X!=IfL)_$?Q#%>s}8l9Tf3{U#0
zAw1k0b#ea$nDBf||0D8`yyk82oP))$A}pGw5w$*CKt_tVkP|~{`QA8H<L9rQMm~!c
zi5PRl5wdK26t<~=`5GobL&);Frz<v)F*im2(SR;RD!j(=b<*2l+RnDeV{3V6+_e)r
z^{estQwMHSLV#Qc&7aZ&F)eqXy?V9nvfJI$;{!hXM?F_p-4!!LxJ^sfLe**eq$yhM
z)%Y!>q(S2dX1Hk!Vm5jO@>yxx_!OLqn@hE5bQK(wp)`4`;on@E)NE$H`=h_Nxv0O4
zWE6B0tuEfnvwJ<IHmTj>$g?_RDz0_hc~ncq)7u<(a>m6^Sskx0%zDlFIFeQ6<R6j-
z_p@hUs`N=rT|=0&JA{O7yga2?`};`UEbo2-T0x=YJ@1a}-E~PgL1$WYuNfhLUSH!F
z1c=_{SUtA>^b_}+u%G0{yn*4LXVBwQ#J?qKmGC#)`8qu+OS#6p6?aIM;%z~R{20(6
z5xDPNJhR|txn8ADe34X3Cm*|m(pv<%+B?E!J?~}}qS-Jt9pxljEL1ahi&`Jr(Cb0%
z`H`amP@)yT*6SRJcDQ^xc@6FY6uAax9=D!CRQrfRBvd|$D5Fhn;#l&P0I=C16i{v8
zyEhl?mSnTWYKI34hp7GEi7(*!(Pl11c7kNjMUmMxTZuef%hpUB2(ZhBl1bqogrDhV
zwKh0cKL6aw0F(6z@sZdK)j(-<R1{`9umt|e7LSG2lPXyf5iZ_YV)#)T`#Fgxs<X0=
z>6nQ2zG_Yu8@^~K0TcBv>uZ&FYW$)Y@eGZ;Rs;5LQscuY>S9jeDr~AUYjx#;w(mNP
z%tJ0g<+cvp$!eyOONlwXQBW7x-Ran}l(#)To6FyspR>RJC{9wLbjD5!{<`x+{JiIc
z|3%N=m2{NYrIoxaaw4OWsIlYg4lGdY1I4Y!?M(^8k$z$k6pzqq59`3SgWZwmbKJKl
z%w_;5Ae}jYJ~P|ly>^9D#qH1v)(+c|#4HI@<nl2StiX+mftJEj0z*8B-c($p5=}6D
z>X?Oh;cMmhss{9-lJWI6_0y)Lq{fS&qv8;Hq`Ju3J=c%6w{=#Iheuy4-C@*uvN2c>
zht2D>dJj^q14~vFhM`r=<{<^fZcJCdV{=cXsOc-Ue`ed_g~=LJ{fri=!EQPipg_ZM
zQZ1ih)p?U<?f*FLQ<mp?2hsrrHeeG>K9Glh`CE`rumiCF##GfBbn3^4j@;QD+8HJ$
z%oSx6QjilJ2p9)uk!V@YkLo8Ikj;foT!M**?|!w#<MN7Fo{bvxF$dE+Y$PDwcYK*t
zUHxB_-3kGo>zyG;NyQK34f7FIh-WHtsUa*r3Uq0S7$xf5%GW6e(waD66&d0|r=x+Z
zGRUWDp;Us<6;{%LyEgx$LORKOJT0SEFNWLh@YpshZ_>}CZ6LMS`V!wuiEv6MW?-6@
zz;WYgkR|oqZN>2(P{9<Sj>H;V7Qs<V95vw$MV|~Rm#(Yf-SjZVcfkxw6J`U~V4C;f
z@5p)Q!Ohs*VF<m{*QkWIf!TZ1uJ<!DAFk^PcZG%T%_H_4wmyMGt4-xKMV=hf4`D!R
zRGCf;y}m+O@xvx<@CZjNBW0ErHCqlPy6cLsvF*J<w6;4J%WR75PVcDw_0+d}!PXbr
zn=)%O@1ZdeVQS%wdr8NZb2VV~@x#kCvJ7<*8iv@#7eeLCt`am{RW*af`i}qg2HEZ&
z$Df@bZhkOg{{i{Y$1a0e>sQ9*+hn3a10WR*QxsHQ<OnT6mUPq7LPdiNHIvRcri5Hk
zj|4-(d;knukT3&tNZXBgjEJ~PVu7_IF1behqJ0QJ>r0k4{9>M;yYZd6qe3*ccuppr
zOvy&q>(uhp^&x``BuI{M7$?v<AY$~{@D9MN>n;Uk+suElXEBEOm)uyozl^0?a)YGf
zQ5m3RJaHlsk<_HBbe+Zm3knz^x20`Ov@;$55j5Powd=Ws$#-tX6(-kK+v&5CZ}RvD
zW>K){doPtg=jbmL^U3g>zbQp9QL6P^v!pwpoB5pU^4<U0c>THZYRka^FQP*I69O=9
z&o$4kR&L~{pm9eLU4)#O`R;mNxhP=CEj-_~{fiNzJQ74tGszb0v>nL`{Cl-TD?HHX
zPhT*IxjWm>Q!`v&Ivwd}h=EbQ5`iG95P={lvd*Z6r$=z-{qFDh3;UVhmfLna1nZkR
zKrL~)JOiE_D`c77z+68SS~tSCWon-~15jA_U>n6B<J$$ItNz-HKmFN1OU?P&LP3Yn
z_;0uI)%?-m-rm=^8t0Q%lUAi78foMkv8Pf=l1p`3yztA}&(sstuKShf={FB-gMjqv
zW}yl^D3N}5CZk0OJP}bX%r;-~X(e_kh)?e4$LX$6Kv{2;GmDlRgpPjnI0Y(T&R(+a
zX{i5jI^4_c9%n&}7Eltf0wEZb4GUlpPGx%xi|kvC;e?%vjeSf&dQIB%d~}FRt|2c&
zX#AmE&_(w(ft`lkb3Res@C!5`DMa^EvDV%4I<dMssR26mDrb7M)&h|>O)S~0TMtv@
z64qBzEAb(pkbvTFyu@{oSwk4hkd6=0>unAVS^OV&sA!i3*o9CaWo&XK-CI{bQP5cD
z39u_BA~l*my7ap%ltBZ2hRW2OQ-(U<t6krda-Q?36jh?eOIowd$rZ{Yp#%OI<8A#R
z*~9=-A(BXnDN%+~-RpClqUP=oV$#m-Y+KMKSb!TZUV?H+M6?U8xjHT8Gg}U#&eZfi
zWu)+N%>U9i$vwCMn)GSBxlMxH+6dI~-d~prxe)E#ZX6aZV4C!`X-bTvf6hl}OB9ic
zK$;@nJzTj-aC(_NLwS%AMikGaV+&MaLt`>xOLfhU%3J1o9?jEB6=*ztea$crzM3~8
zItKovx#<}MXN+rm4>jk@NnEkGty}v)AS8dj$j%?-+oAavgn-W1A$NM&AJR;KjXm8H
z|GjYAP1FgPVs0P}Fbm%yB$S}GtQU3D5+&ru8{Ry77zY3Alu#M~*$Kp<lrf^+4;5^w
zA(d(t8>C>|y+fF>|DF(-epHW+oY@)nt2vWd&$-Kdln$yIj(~GO4=Xau&=37RKJckL
zHl?rt>~6oi{HB!%JG29p>0^6P)n~n_`=~fxro@IA^m_Zmv1I5fZcH0mOp&^dMBGBo
zdvVRww|M|HvasDC!Hm|+kP1LImpLzPtY5vx!hMtt<}m$o+Uxv11F~Wd)bs`Ke$8dz
zd(zU%(NiBhDpVe=zEh2rtLbZDRvy8$j{t{>0D1j(DPDZvvhVs|FtiwcnqrDAe*9OI
zr}<w;&Cx0&>7%JeJlhh6wx0iP#Ate%9&wUBDB_IOHyh-?7ijRfbP>)nLsTZfQfHFF
zfHz8~8a)De$_F28;8EZ6#n@T;{0o`27=qUn9*y$~6)AhdgeVSOs}Z|eZ2m8yg*PZ2
zCuhM+h(E#&3e5eYB{SUudIOOSDAT9^MER7K>c@+uIHf#+(-W*7Sdrw6{QV<+4qI;f
z<Js+okP}vemZ*}TYHT&xAiuAT1!ar`%j9_t_)97H`f(v@pTE)STY_M7c947QcSa9X
z5L%qpHCMOZ{LDTmqhh0uY$%jh8@&mF$D-@73!{WEt|b3y`Z?BFxagpBTsh;v{U02N
zC77>JtV1%4M-S)geh0Br(%h%NZ`N0Odd$X$7l^p4{dd<vOd-}nM6)~P$|)G-u9bBL
zvOMgb#;!Wl>JbLb71zA46ZyH<E!$DkY~3u>NWy+q4w9rc32qQb>Es&L`Z>KgEhFkm
zbUm*}eR7)LQ8^Q+!PE_`N#>EOf4g?ywvzq`@i0=wV#M=&rRj4A;!9MJ?SJ;yMD5K;
zQQ1x;A4xxOiY)Uu=~wAc)_L7$rhM$`-~?HU*yp)98~>9a-IL}SEYH>T<}UAbGZsOV
z?-DlTT5ifZOb3rPlm#@Ha$=g8mH9aG6*J?JB`84YpkoH_K?S#AjNv+_x>%x1)D|r@
zB&SmsA19l8)a5}S8pO-nAzs{j<9i0JhrikIM(68tkK?J&ep8E)H<&{~R$68WeU)rh
zinYHi7OF6#&9f&Veg!9C9y~uNClXZRrfZ^SR0ZwbEf8HTN5N<`+pL0v#CJFH>e<5b
z?sb9X^7?*xJT3|6blm*vp^UwL<mgBd{k_6R8<a*wwdgQgcJ8<wGCvD^!I3vF<8nVQ
z{1WtbhYL6f0;TFUM{8Z4nv50D9BGcn>o{wjW>Y901^G0X8Tj0COjtWXBoZ|0n_1?$
zrBoQbp#H<1$IU+-oLy$^cb0)>7&$Q~Rw2O&6!-os61Dhw5fY9HdrOa-O7tA;yk62?
z0h{FM1H+DNp?8+^9_OhgX6TFWQ_U=}kR}?%<a7Z|BrS-k@Vyd=tP*PSQD}vH6j+!(
z$e+GPsinz%s;kylec9tf0M5I;Hn)71-vlm9_~;jj%3kX);R4l1`TvgLp~a)f{Yihr
zIo)i7KYOh~8ePxp=nh9LfUqiDnQ3|ro#H<Yoc?I!usr|WQ`2^rScNVNj|V1M0g3Kl
zHnZLHW7l@Om+E%?yhJ}eD`4K7=#QSF3y^z4h~&Z<GJD<iya`rzMWBPszT12G&wHcy
zw=5V}A+pAo^p6qE=<|v?E04-?Hx3-%J>>XOXaxZJP^fa0PFu&!`^EDOzW4KKxC^j5
z{_wD4#Qk394ps#|#<tugMf4h$WAwm4#sogJuSJ@LJCwaUnv+fiq1lMxhQH_Y75r0l
zX6-F|=^;7N-EK4-sY821n6qd~IW4(@IIcWZ0v*kAeSxiytF4-9?fD-d;1^UeJ~>Sm
z*X>OUa{v=Wz8mC1Q_{xFOjB2ndmy#-AUB|;|FtAb3x;22fiA}<m)xTDPFpY4(3u3C
zu#U)ZZOQ4Z`UmNUPdDAyrcJ@1L^H*EU<ZKD@a?*yqJlFCQ#~{iQhqp{(|YJv6&$<t
z$+tPaWjwqbte`9H2Ixa*05YrH^k^aOecR}oQ|nhn1&TnC$1l&ftwxY&p@u?QKhJKT
zVEbHw@|1rh)Ubm|Xhpe1SE9yx$wmEY3e_}OY&Z9i%JH{3zu#XK|LQ2z2k$VYvCmKV
zc)WMOf$EBFwr&g*c|V+pzf`{6;WBDIXx0!90$r;iMM}&ul?)|`PS@|<i68w+K~y`~
znk9EZrHX>{ntwcQZ-Yn#KtN|??qYW-kj1s0U>MpfWVC-i&DHxdg(1<EJelotXI<st
z2ywx3@9?y7&-4L?hAy&~ezg2DdzJ|w$gPv7we^47-bWLDEVs(zIk3fh>+~tB;JXmE
z_`@P3tfjqcbTONdXYc*hVC27s<<E?LNrljx%@*=9HW+D#M-O}2Q!p3HD|Ire8G7g4
zE!bwhX&yR{lUw9=|3MPNAZpg5zHAAfSsVEszIrNWRGVM>bwSu`G$e}!1eqM_J?FOl
zP0n!36Jw}oL;W*~yQ8o~z}q_{Fz4P%ao8tzB3Co_cltZ@Yp=6so$j9>M;P0rq6zLO
zU#5`%?yj!qc2#{2{p1!9UmU3fV!^%ZiYy}l!yfMv4>7ovLJsx&ZbcAW8nrazuchhO
z+NbMk!+#pXTrDlkVSAnIH&CcPz&S(8qb`+musfe0Ogs9W+&k(%JgoQ&pODpc>q`j-
zByKCIOy@bNF==_e#VxKqJ+QoS`q>O~^{{>?i`y+u|M>F1a$bAjzZ@br!CV;DD9;w*
zoNeYf`ow;WSY`HM6vpx|K@9i!#H(6nJa4mGKB-fJAm37tacegB?|QQpwtErX%m&C)
z3f_N~!TI~`bf!ZXZl)UjdVmMMag2jRj6y8wgvs?cW>TOTRD>JnDw8<^6HF_xU*lce
z(?!ixP(Smd!V*MzlQZOeu_CA{JoT|O@{U2eoM#_gzYYv$mkXJD$ov_}m4zkGo~QX=
zjI~(1f1B})x-IsJMX@0_+Aa38-#qWt`+1Qbn$uX4y=I}EKE0ih!5Tuvdxot)UC+MN
zEWK{Gm8}pRKtwPitoWVJ#l=6!Kwm6gzam5cF=KNn>ZQdvui=bYWa~e4Rbk`M@L*ia
zt)O}v28+j<27Y-J7&)ZY*({;@|M9jWM|KS&A>yg*7y+``b*EGR)+xU%qY?Q7B2wQR
zy+DVs=JC|3fdHiVU{S}Xp~yukiaAwoCT__Oet1nV>?1sx|ALRwujW`a8{rf(ZO<Om
z(C89Nk^I;d_xDr>#r#m2!rH2^YSFrO4>tDMyP<f<OyURtp<qpgxsGaH1Sh1GxLiyh
z1L9xUPz>Za4{wIksv-NWI|@181)>>t-c^qSBHsp>_jf4OcN|II?!n&he(8HrEbo8s
zox2x#usv)?g~F((s4x$I$6LA{*aKoq9}&RG+D)&}zI&`-X}=!_k<C?g+{qj0a;1l~
z*GHCbP8Qc6x>mHfSdeYSN0fg@d>$BH%>HHmyY^rMDeTRC@1v~{=}U;%Dd^|)hd)DV
z1v}~lPuNv)lN88baij1mhrj)uf{c?8wlDUP-9B&anj|Cq<`slpM>B>()IQ4E<g2^%
ztuv3Bb7qOlD0&2167~_RTOk62c3}p=UfYO_d$6{9ZFZ;m-hRRfCm<nr#^tmLsb{Uc
z&0Bq&s&Ul39kjW191wUmdVjkpogCVMsyc7$*;>`*Ro?LnTX6y8HK;f43?FYcxoHfb
zds(+-;jO80v;NA<Dc-v(H*rtOtI#G6AYDYqZoIClgLnLQAo<2Et4ga;@?pXg8#Y)o
zJ)a%sJ9cv%#DmvGQjjs$4JTDpESWZ@fscneXUh4L3iOo#g*<j+gF@0-l2cBY;tE0|
zLEaL6MHbmHvrXl0EBsvlnueIO@$GhXk%$}TY?A<hj+ykTIufVMItiiZHUNpsX8jld
zV-TD_s(9i9YIL}X1csY`1P*N>1Uju<<>oUAAV*;)S~i%IX{znIn~N?>TmJ^IQP<`h
zpO6;m-*Axq?E%Xa!>94@Xdbl$d{-wR=(U5Z(0yV%x))fyxfjIR`E{~lqlTLYRK<3K
zULx&Hu<LxE<}J!5K#dG>(HcyQY3XV<j+t-|CUH8qqZxDrBEpiAt_qE>{j)oDFL2BV
z1@E_!Mz)UGWe~WCDw~Xy0L^v83wP(G*ivDZnq(HDxVxkj54S1UR1ix>*?lcgO=JMm
zKIGEe+%b}EDyN%0Bx|;ejE58!gvfRE|Ma`1Q-g&}7a{CVe}3%J{OU?X&i(HD=ZBac
zo$3$z8<Z@cDY}3W|I0d&FRZS=S(GlM<bb!6R&BM904;m)n5n_kclQxdxh8$tWCdXI
zVAAi1Wm*W-ICx;7U#s=x#Lz8fRm@gV4ZZKlHRIU+z=3?2&^aJF9@Y2an6u1}yXH#Q
z(jXITp~RqvB;r9zWgM68>3maVl&DOBMEf*m+&4jh$fMYfSXJFB_}Tot^McIw>=C1_
z!zk~e>8{k<tt~91l&bko@Slt&sjG0phS>R!j^EWN?{1rd!%E=xbGbeWSc0-Em?&N6
ziirb;GgLImzQ|^3GNJtEX6kd@2{!hw7X=_iRLn71+A*U;6ylpk@n03<{>z6Yqe^7z
z%LIwTN87zpYwz03B+gkJWt^$kWo&@=ZN0<sbtz%sEd1QxnaW5Ykp*^{-g#2zWs?OA
z?8YQiXw`RR4vz;8VP>E95jR=%B-3l}@8_#t8}oI_tv$A8VD|Q6aEPQ&t={pNc|Qx>
zzy3m-(W^mGGf4Fz)jWtU8vE~uK1os9ja&DoWX#<kgvwQy#hcU=UTvF$o0sSisQA=F
zg@3Y5B#(z~x9V~0-|r`SYK@+Yz!s!TA8b(fQFgsbJx)uN<9(B*L29a*EDii;)ih{2
zyMd}_P?2tS{O_OnpcjBtk9vGvWcc9XI+X=aO%^Nxh~rafUg^s*Pt$c*CiW)vNgE~3
ze$#fkDX7E_o;diG``C}vh!xWKJq?1xa$S!FXJ9Vnl%?s)@$3fT>4w1(tP_yG>w1r8
zieR|HR23f=8b<_CR02*5MkH`fcP%sukL$X+(-Y|flG^OlO4d`=>X63xWk(ei_n!8?
zk7z8aW0K(dfV`OvkgsAhhk_3#mZhP}xR`*e`;^E14C**^+aG^YZUyJt7gJ;6SW|PA
zeo{60ITaj^u&s$D{%`)A{o>BwPS?|O_w3E;(j7r&Bquwc>X+1COTAnNAxDqTfnXCv
zF1RoQnN+wn&j#apMK7dS;i#q!4F6gin3?XT@WHN4`G^tt#fxi#JaKceUo!&Z45=Qq
z27i7%%WO0*vc$$cNu84Dan+u-YNqQz8Q%)t3%^DC-ySRP!o}7YG=8}}ex9al)!0#<
zMPjs0*M*lO>>X2|0#wv)MV@7_yHUv<@Vm1xEO!3RDLvo6mHE#*uW`J4Ty!0*&uGwJ
zC<1|w`(ARD@(}0?Nqui_Aom4R!~6E@mZi||HL$*3_k24_-I&Ta&bWY(3<^h{d7g?k
z$CiY+c=I%}15G@Kg9DTJWd_<ExMn^v3z1jY7vPkS>Py?N+c9j0dJ?Z^;WJQVLzCW!
z&UfVNbEYk$2oWN%PYtS&Q&5Ns!(bFQLbQvMK!KS8!zZiFceC~N^rMe<Q(^*EX0eE|
zkCgrrPjDXIuT0#ykF7fipc8;J`+=FvU20L-<(woZ4)b5n3&Uo<V<oNb^rb9og^al|
zQi15ty1+Tu#R6Lj7{4-U#@bC)^^_D)0R<VtCeHS9N(cNQ1*v2dAj|*tE&BP6CHud}
zrj4wzQ}R?UH`y6#3hJXUjUx)fKb;p(NS1l{6AMZzgi|>d^b)K>>WM&l;*VYPbAA?P
zuzbNuGpuNfN`wa;Vj>%>MBbXLmxHYH3iP5~Z*mGk5$C-}@Vy#TdzH`TA}%VX_cw1(
z>m~0%zLKJE0{uMEMYaw}@y@8M)Dh@3xnSE&Jw+!MPF9+=B;Xf0AjMk+1wi?&Up0Uw
zWTSnx=@>)m4=*OC)qm^IK9Jdpx5xygWR(jevICxEy$bgA_ZcUdb};fhU&|fv|NRi0
z_y3vl_1poLYh$D1<NHC}U<gBH`d_7)Iq$wSGKcod=I;6jr8<TVlQ2r8Fh&Akn|7h^
zt{{qTyAD~P{&o)}>ay&@7m8lUi0YWcFtFAWy~)W`Pu@M<Qegwy`VX(5vZe#dgkExy
zI5qY?Yo6m1yzRScrL0<RIW80yAgv2#uu9%4(bivjo&qa@mu_m>=Z&=w@fG5=y<n@j
zFjD5z{e990vRoQH0G3@^8I(@4%5u8Ok3JKfIf>Qg5YsN_RgMD33p{{afSs4S5!h4Z
z6D0Xf8jqm(8*;<hM^Ajo<L3?L0v77iiXQmW-SZ_WS1Z&l-Qv@CE?})3&iK&<9Ki%h
z!-lfL!(*<I!P_LGP9thBSoe4u8stpV05S=a6Ka{3YhW|YMQ9=hi8cm6Gmm|<vxuhh
z7Yr#ml{PNfVv-Z%jKS9wX1C&<o^~}C&_eld&5Scl^y=#X5sL~<?V()q+q~cx=Wq0~
zKQ*MYvYV2S3BM;gtbrOv*Tu@W)NEv5*R2+!P&Rcb4AkY~o85-KBFp-Lmet=Emz%WI
z+CY8zY3h&5CH=Rm_ST!3;Wt~QSLO;lK%>K2&KE?~ayTh01JRV5AC(Ca_t(jO2*h}M
ztwowl8CthhVS=XEPv?$~qVcoaY?I%~QM&H#7(sc$sPpM<ZXt6yvS~26>DCfJ*VJ)_
z0=#MqEG_+gkOak4u1kwFH{NgPOF~G?{);NpI@f7bm!rqPaxFQl5byB6e#$#kM$Ez8
zF{EdP(s4dY0fp81^rq7m9}v=dK&`^21~*L*b)3FlO`k@!R6Zz6E802kjrO##&6`ro
z#FrXcu?x<XXII(K*81}ssKp?asEOA9n;6pTAmcu!RnDUzx>c9WN*bc4ku<=hoE82_
z5D-)yxV1AG>cf~BMUu9kYEk(jwBp7#58^J{zw`co}jA38RHTn)`wliW5a-`kA0
zckDEBJ2!T>KfdP*d1sch>OBVq=wSUuF<5Egp0+()UY}_)5V9_$S)xv1EAc0&LIpH1
z0&tYk$-w?Q?dQ~FLcoSnHOA+%5ZV~rq8``TjRhNAz+UZFViNG{Cp2sgb{Z&a4uomn
zyMJ2$0cx#$_rlhAi1e}=SO}=m+jW4Pv+mULARNHAzk2b|_o^V9swSs@*Dn-cHSf9m
z3Qohi>0>rWsFmLQ7_$Z{=*!Z1MU`^_^sK*dS|xV=;O+wOvL86J3Bt~y*#PxdUv=K~
zdY{RkrDxJsd6b9}=NP7$Up>NlnwimUXtIVNblpo#@M@{&6<}1#Xd#ew8z|G7Z{Kcq
z`ji9y4kF;8nXeKW<aT^D@b`(X_1ao%C;PL~u<XgO+jKHHaL<$jVSG8DjER~b6(d&v
zmB|8<+O7NMMtq~A`?{p;A0)h*1&bRZ_ePXJMBuFPBw@?$u9s(4s&>w*+I-`br<eVk
z{%<YvimRcv*%#tVs2X-bX)aJKFa%$70gJJiitQ!@;q0G2$bd;tf*6pW2d^=B0q(wb
zbM~XmIoBpO5Qr1knzAc2cU!8swv_As=SNSTn_QQ3Bjv_wL&5|F@bxFE51W2nfu)cC
z2_!{Lf{#K%wp`bz0P-Sd8XXTVTcpb3KOXuyzyTJJbZko^$rN2}B2GlgX%;|y70+}O
zm3^Rr+=kk#_xx=8rW7&O2M&;|&OO@#dJfOw=qSC@TFp!#c#jx<4RUDRxoci|uj#0>
zf3yFuL(6bkCTzxfPK>vd%4_Ocom0-^271_mce-Z>E}G1Te&Qv0+ok%DPx505I=x`H
zi!u~o%EF(PR#^B3mP@uh$G%Zg3V0Le`fgu1AEj?=rr*xA8MFNBUo$NGNBD>lKjdKj
z&IQ1!@DmQQn}1^L{rkn@aknLiThL7sNA4VH;py`dBB>s$>mIJkI)e?MI;hVWAtaev
zZ7Mtd8HmbcDEIyrH>Sp_TP_U*{FG(aB1!rV?&(U?A<c(cYbU4?MIcm`6C9J-QnWd?
z&Zp!76uzX=g4Uk|(K)o8Mv)0N=1BYmyL|7w*e?rIqS+x}Ho3+2sMCEMt%|Ge{DC3D
zN0VgLh!lzssK;!tY%$7mCgvJ+SdK@@*TwWH7MHp>Cey38aern$M4B!}ii9HdxrL$6
zTvQscE+2g1NI3s`eer@c6+`Ouy8URK`tCjb-N(o0D?f|>Rhum+*1`eU!};!K8=xdu
zmA?<Qf;Ip0G(4>7a|Uq%_K|Wl`Q%tbPpn<QYMNpgpdu*K7nr*RdG@~vl+a{a5#+4}
zf?rNj(z4qzMa-%vn*L6KY(Nkbf*c9K=X;^%``j8=a6~%Gn<d5`TfSYD?DrqAG{Fi?
zL2C0@m`d|&zKZf8Tj{vdb_Jm!E1yF&<%J?QZxFLqeYg6%_t=Lz2eA46jhU8sQ=aHv
zs^d<e?dq2lXI~EF&N^L^%^@v=*`%nF>~`3z@~^%h>?WW-?>5m!aRY@N`>&A-i9JPf
zMwfeBUmqDMR-kO3v3@(jwfSeY;pOnz5F80Ow(Xzx+FcODMxAT5p#DZ4M~?+zJlQ1-
z6$>@P^I=Rx5>1OuSxH1KA=s;WtH9xye5LElUT3W|@YnD=yTc#naZ~_{P5YOU(lT=u
zjMLbLzK8#kRMWnWqzdnV_1jPc&tq<hD=40q4v`F+ISEEz_TDM5Vdcnn<Fh~`Y{11|
zyrwg+zu(AP`$6~8Sz0a*h9rk!LvlOdD7KbSZIgLSv=z9%TZcdeReWw{Jry$nkqLw}
zbXj~rDUcpPi7rxRoxYx@cq;8~^)h&9m1xrY&5Xrf*W0=%akGF7y*3YrXZ9k>$pgs~
zyHusS`)pSpd~f1m?7;929F-eks;!8Gj(h_<9;+seFK*(XE_@B<zDCT%Tx#ohYSDyS
z4K=K_a;mEG3T)G80yQwxw^}4AvpP<Gz-~smzVZ`FQjLc31KS*iKF>J3_)`^?`HBy^
z2Swmy8_lTc`n`?h-6+dF_+CiM-uSKt6c9s>rkDtktRE;bLs#5LZ1%O`5GOdf9ID)8
z)l|S~uh+THmC!Oi%xy1w>Qz|{G1r*yr_`{ls~U1#XL}i#-sFO?ZmJ})ayE;h0Nn#<
zdVr6Bu1Ap?L+k9jid8RxI<CG(4+yEVjh5g5kk8&+=#mkSPo+8N+$~_-&go7~Kf(yt
z3sTVIZA+>+kI0rqe8@Wy{WY<Ngpi}BzqGkPAUlq_%{KmN4KlB#B3$jx?OMQ6!jRAs
z1<f7GtKfRdd(Fh`2Ar4x$RN^-R~kgj+8@9L!^;yqO|e`&R4<j<u#?TCX(uEvjz2&i
zihn_XXo@t34%$N?3{sWhyzu+o{7<Z{1)RsOR>>Vt<d7SS*?4P0e|;f$z1cIeJ6`QU
z6&cAUVrO#@`Ri-F0mk9ftIuJ!LJXs>s3Ji~WhRf%H1<4ny2e1)ETN%%e)wPtbXhP3
zq}4KEO^WmrdFmLi6ho${Vb_`d+E`lc<6e*8?eIMSjxd~NRVHbe<I@wm!v`GDK*|i7
zmMJm&URb8%-e|Co?juzcXK-XK-h+Ov=AzF)0TOm)l>tPAVFGSNq~C2GdqKI<sMUtq
zP0=U@Xm>5lo8=wdmg1XVgP4X*lTy4eL@HN_)D>Q9s;CxMAG*L28y#cUL=1OcAgZKS
z36WM4r5HjA(Smk-PvJ{ZJn8z6$L3t>T@R{wW-65NX*gXynV-I`lzN$tdY+(UV@kQ$
z=C2N}1DMtkHYeyKtuTG>T?-T&x*MDqa%uVZS4El;ATr;y)nO~(FeM5IGPkPR=V!J8
z5-1fkqy)7-dV05;s^`6L`jZU*Dckk_WVsNKhjv12z{0hKN%fR4cF>lqV2dzf4S%vm
zD*6Y_>S)bSDp&%Mcg*WTx3s5gs7ii9uf+l!uFK9CTnu6=007yT1`!EIkr4u5H;JZQ
zoGYN5P*Y}moXC?`0$V~=9QY@3gN+H*<mhgq`J-5x_MlYcRtpHzNqpL=T_*fyu$=Nd
z+h_s}7$zv=cB?rtnq@AxF<$ZE*P64gx~o2MbUa$^`ES(~G!6)vp(V{UPm_!vD6n*;
z{;-!HgnaB-9VQfz?{;&2|CX#44xxZ<TVpB<#gx3lh{^Yj0M~ph-UUdneHJfr9nUFa
z>MJLoy0S1J3J$X>ih>i1;XwfK!&JHWAS7<N*mxhnQI|6Z;b%|Bp6j&xjr5lNez4Vx
zuql%Gvj<53@`ac@eFC#~+8kCS3JJ||*;j8P5quLU0<3(*5}i|3Y&b>mLXMFXkundg
z<<{0UYYvp_CO<EB`|yKf$Y-ZIAIojlr)lV{Ap%OuuL(p{)pt^J4ys-K?_0UO4}F&8
z=?=&_jx<8fSgGmhz;`%i(q&-s+YC*&e^eYSavFKRO?P-I&D`4*R5Izx920s?DKKCi
z(gg10ec}m$F3Qxe>{Vos{Q)b2wMKpd5x^w5PGCMZu?#A@c8<AajBKKN2up1C(`qFV
zQ0Y%Y^Ml@V%JRxGiXYp=axwuYHN{3Ne&D4*H51PCv2j?CgKR4Ni5=BygfZ+aoMpZ&
zWCz_~yo@r_Btn+)M9V1U0^9Rg_A0W-kIQ}$I_R&Vx3V@^yTpfWDw@*6bE+SB)UJS3
zu10+!2&GRXp5l-;${7In^d!g_76LFpcX)4Uf=uXv($X~vKvqXYOwn$LgvBg{`TqFx
z8k}xQeqQ^Yqyek@Yn!dIyyUBYB?_v(vdSRXt}#ii)Q4AG0T&nhrJ&uF;r~iH>v+7s
z_m97Io1U7^>F(}s!{^rBOpP&Snwf65o@Nsh)5dhi7}I8$HqH0={r>at$L(=A=Q`(l
zy`HbjT>~j|7UPaw8vodSIqFdF4AOjdO2+j&<I!}p+a^L?y~x<U@s5GOlVk1>zS7)B
zZ*i%`my!0Xqu!I-Hb%!*TC82tXEc2%P}<X^FPm=ye%3LX#<~%x9lreyIlvW`V6HOZ
zb)0|8uB=1p_(Uk;-q@M!IA^cScy%%jX5Bg#lIHzvaa(DBhR*BMJ!UkR&y7ywu_e#*
z>r+9j%?vX-Mh|u<IQ6t>czuRud>$3)#d{$2cbd8ewLNA{A?Ce4BHE!XCpd~omFwJ4
z#4Ka5moX4AKUR2Re%V!Q&m`mSV=!m};^gAQwA>#A?);^E1Zk~G4+%c!JyrEPc6xQe
z?V3aXbD<j)`aF-eP`aQ!_pzJNz2NIHg<z#8*T7Q4G)MnUI>k>vz4EKjv$oSmMsIu!
zs9jaXlQRqFYs}Obb=>ir99qiEt7}9MNG|@w>aEk&_2NjIQh1h#qR_cHJZHkoBhr<R
z`eI@ap;*9m?wu+69**cB3AZ<tjKJcvKlEDk=0yY6^OHAUP|^1%3Mb!RSD@q$TQ(ap
zF_X6v3WMyLO)=3C$_u!bS1U9E1{eIZhm(B?7El;W<%M%|U_deImZ+`0?oCp+f7AHP
zmLH7XA3ux~=;#;{NNbbM=&4lP7X14TTp1*V3RPycndjrY=#VgDtS1xOJ<Y>tt@+iM
z6pSSCJ8(dbP9=ipfu%Q1ETf_p{NI@lk_<8HxZHaUAlH03GyM2O!OlSeekn<#dQeL9
zf~Q*1Es~K@XLUwTlX;$^^lx)JPM6B(tSVcSPvPHeOz~EqP#d+snrm$Y`f*rRIr#(j
z79}c#oZ01ByT8-{^p0<_yDV(88W>fH5jdt=ORvW@E|#$JlTto#%T$m`m%Cu;+~B{j
z`+2^-mgZb55T?Vt7t71iNh-{Vk|v<CjZ0{71tK1;-ebDK4*EIzgqYOxML+Bl8VPFT
zaGq{PIp$zE;?xyKb1sioSVh5>0<HIo9=o?s9iNYX3ys~xgR>h?t5N=*jBa|m0&WNh
z1*WxtG%=T}lcjSBeN^c<^Oq=?PH(Gd@@Znsc#bypl&`zbS=?pHV`=hu>U|SxY2t=3
zB8Xb>xJcIf+VV!XKLo)W?W%v)9sa@{AP7~L8y`dR`-T5QFjQT~2kFJwF`px;k*<2I
zfU1TC01r(9N0YJ-TKpV0lD>S*3scL`FP5?_6kmnkW6$fbi48vT4Dt4P@+~enAzQ<5
zH=J^e54bC{`j)1?W}9@4RJo>NxwHPZ<@q%)7<_OITuF)m-!an_xk0GXh=9m=L;ZzS
zfQd%4=KI7fU5Y&uZ@u65%%wB^PNif4CV$=CTdEJ!AsQyu?-<5Y;=@+rpOP)x3!k5J
zIOl>>nS*P=J6$ZDj5viRwHMd`NC$wDHB&JXG`y-R@$&<TKbG`IO#_fh3^1ipYWi%k
z#Nl@(Km`UyvC$XBDJNLE6N1g@cL+J2?LG36<wNuF!*1(jXJL@rZ_(@d#Y;U}2~Woj
z0w{TEtEXz<0h2j(GO@xondrx4&lC_$CK`7>iot`dz=f%?ybRcqLCh%|2liA$N-c~>
zj;n7Gbj#q;5W<tGpJTwzW2}<0G0tBf&FjF?ZppjawcBTj*Lxn;kmivSTGJ#o1Jcg|
zpZJ(gh&sVFS<~lb$Rh<i+9R-%F-*dof7`MwkwQFRqgt4QKr^7Lj@v&=<(2*#9l9;s
zm~&7;s(4#GMk$k6d$@44TmJ#>=~#w3QpGV8v%R&Z>PTNuRx*EJ%<H_o4Ya!Y$m)oi
z#|@ufjJz<4JJkAi@3kQN{}GP!2u962nuDp3^2yUBj0|?tm|6wbnhhJx%lJ@PJ@Rt7
zh}TdP&J{hR2rD)57^-l0hch!+604o4$ljjSmhRqT>Ia!IUD1fiBIs~?Ov{Ta)+xWR
zN*sM`vZ_>|j!rkiLAQ^4;`UBC%S*Ewvy;k|c5@LDi%nIHj(YQ;?6=Y-|CctfrJ+)^
z{uD|m@oueImmcU5-brR`-R?iE{(5on=UA(|8n7OC<$`qv+NVcb;A<QTw`T(|;$3w{
z)cJyD!#Ur2-yc+T#S)NKV@-31eec`Z*dntp{a0*EAH@;xzI5EAEw}9x72%etmG`D`
zl#lI5qoxiC>vnE6x~ztzM(RzoDOFZ#At$g#2$nb&fRYL}6HOk1R8fXsLp|4Bwps^8
z&@Sj*!PeqG+gGnVj)3Qq+ZX$=YGD|wY6(Kcv(00|(CZ&`f2e;@32D6Nn`YHXOC-qr
zGl*(z&d?1ix`@c2z$7F7%uM?pIOp`lx(SqQRjLYu#4fdA&)K5*yYGM%y5iMoz;2wR
zcxo*$IZKRX#XCUngcP4(QvSe^Ht>_~ij{%Me5JnNxI&?R&ehTN_D@}QdZWOdP2uWQ
z6({`J--EA*$6|*I4c3GZtzY1(5qB2r8<QN`fj=<>xU=pC>>tubaj)pJkUn^f;ok<z
z81hes>;CL4YzL=jHPGW!Zuv0~2rNn+A%@hp^CnK3)UQCL0BeQH^ir{dr$!dkX`Mfi
z1y!=~=#CX*qbEY%{aTvN`qRoNe)66`_F{eJuC6OE)^kPpMv_2gMf~r+`R%oT(hZ6Z
z11=3C<qs865k3BDtLT|jxNniRe7mQ~N}XZMYDBd2n~1FzFR^(Juq)S{(?<Tnnm`uI
z^{)!n(`D9mukqZMt-ROg$sX5(^dQZ&^h?-%r@s4NzrUYb+XqE$WcKg-y>GLt_4`wm
zIuT|i5YV1*Wr!4kkq+_rV;$6kSPY@7zy06-mrx#A=x*%r59Q0nd?U7Hq8H=L^t>Q7
zx6ark64cESL-iFd;Zibt2|UHdGdIMeo-Es%t;Bu0iYJspSa@Wz<+D79#)W7K?I<#H
zb)@t1^COXV$HMsXpJ|2(`B^tnX)!e7j5}Oto>&M+v_ffI*8Ej@qyv<$i{9ja4^3yU
z$%_A*U!lezgJNrq3DhuT{#_!A{AWGGbK!-{Dn+Vo)055|_oJvHKrp0hlvj+El=bC6
zzj8m9d!k$ZU4wH>^t3cQJ)`)D*{37<j>^D)YHnVzv$H*1^v$69zH@dk_yel+6V?zC
zzYFW7g{;C4YZqo#T0@?PhgK=j#(X?5<*G7PoJoI%3=MmMMks$^^A58@9%iLNKJ7D{
z{$IdrMgKHmn!p4<yYqQ`p$WUIx@}_<@sEQ(J|&;fI7pvWNp=Es7#JU!UppR$SAauR
z<#~@uz}qS&N*nH2;jwKqm?0iCLq@jNQuP<dngC~%V3{y9hvZ!WprS=D#Jio@A%8!H
z4LWRvi2zI7Cr|g^&n=cjQ|f;$<7Q;rYoL*%O`VZXS4@ymKau^xh~H73f!x#B#cqD!
z?(Vp=z*;PD{XA*en{L`iZOWUGskpHrkwyal<F@G&qCAV7or4=^!Nji#aO`HP<@buD
z+Mi#5WBhltT80Wh)XNR!rNIg}u0fqke(p*NRVvhl&+&*{WhC_`e~FiRf*J%Yo`(H}
zlS8rVqUmpEHY#LSmK#q<%<FBY<2CeD&DHh7r&A}%i*Tjq{?&a+AEu1#T_{7Pq0V^)
zXuez_E)^CX5@jQBe~xvSlBGxZ*f8ev@&+umrcW-hlT*s0u@cGjL@GCnAG}{Za5^Sk
zHIdv&rsG9Run~{?K7<m<2$4hhM^K3T6{s`PgMP=o<_B*qM|nBi5V-4o)#m@*|4WOg
z`Sj(5va?X_A?I*Y(l(H#0ntZ(-_-7J#>t7u49rhK*WKG!M}`4!VLWlx%z-fxn9gpu
zX5f%X{8d!ZtDtrOqBM9+A!IjiEkv*|!-h~`H5wEpg9#7=4e$I$-8a~W?c2#WikfHx
zyv2H%1dyCGlQIfBnzY}m-}PFczt-qMr$MyHi3Hcw5=)f_N0Y~z`OtDb>9#qyHDC%s
z^CHg|th_(*Q%HaILAf_m8z)U@s4L8xZMco#2Rt9p{KZlz3W8q#hzKyQ^$1W~bjrDA
zU4VtpEJgoK0$XM@*`23mrUty{Wj_59{=4=fZ<w+YSxE(XIcS;q?DwzuSx_db-Cbaf
z_D>AF;&=4kedv6(JK+XBY9QC;gidj-lw5#vzX55w2s(Sp`SI<HT$}z3A_ZYw?X_<R
z{De887nnz1|Lw=4qSaN`J}bX8w=U2^i+&<6ht_44@3@ngtBD&Rd|6=>WASWONITDw
z#XhzKoSw;yIdnPxynYEDN|X|e>o8^AmRW})**%XsC1c%5-YR)K6ypMX;Td)k9PJ-R
zOZPd<2m>Sunvk^Wi6KnF{#Zbbx1;IzRW*N96{z5Z&g)|qG!?>LbtxN+D*_8;Br+md
zJyaT17)vg=j#<9qS+?-l)-L;qOOU$z`~H*w&#}Q4{=Q3Q9?l&Kf~o*6uNtS>Fc^QE
z|E|f5HwcVsVSE?8WhqG3B+j6v{&IR`FQCT<sJDPmpO0O~`GzCr=B_4eS?eA~#g|^{
z7LuGCIM>R(vKN0@$J9a;;Uy8KI71(%OmIg2<S*koDxWi!3R04Ks3uaCm7_4~5EEvW
zi^)+qH>YA^GmWXLZQ?0|1|~$y=pXjMLU&Z2`6hTVI7gJ&&-?b(`02yU<f~-K@a{EZ
zv1iR9EOBI3@b?TkcqxclU@twjz_SfvNKdngv-v>bCSJnLf@ibLrn&22zSL-s^#~5V
zS^Ts3<H_pm%Dxsb#s;Z=dS!;4EHQphs90Wgz*$3Q#03NM25dhg&7X8@)aUP!;|aUb
zrpmw7OV-Y8_`VsU97uRpPL;BnZMfkzUtL7&*=B^9Q$av8pZ&8j2&4;5k9%wgGmEWs
zmFWiT=?tDgg|MfP3i6fumo_?wfr*!p^guuQx-Kk=VH{)x0V0xO8#W1M`v8dhWK4qM
zF=K19xtv%G!-@~tN^0}{CgR2-0?{vQL=co(nshibG5>@U?k%1Yg#ehN6_#9)e6VxN
z8nSYK-zCquuyAn!!TqiL`YDEv#=D#!d{svy1*pTXLX4OqU*e@~YTX$8R^t0wl=uwf
zMPyVnY_MV&cf}haiBxrAT=5S(_*Nq)TgndFqH$?<@%jott&B6zd5%tWMLS(q>nbS_
zitx&Ev@Qa!LBv`|`lL)zC*Bdtz=ppgsK;}9O|G2I(vPwrU<p>6pcL^S5_*3c9O&FP
zo7%X4Xfng}+(-1}&A&_gn7qx#wFbGguhzpgVsAcWkgbwQ6~sWAn>2&vS^PpyPKlo%
z%l}P_#v|F(Ui!7&(QM}K8gQ?8M4u}Ud9P2OE<Yq0On2!FFyCFb2eG-goj43``m-MX
z?6P+cI=(7))MKCvCJ=7$j_Z-Wvm(wN`D@e<^VqrqLlh}%&>)9+wdsE4--$+C#XTRL
zOyA)`mWW*=nUJ!767JD%T$iL>SrW>xna13F_A-J#f;eyNu8Vn>U3d4%>8Oa;aT}!}
zCH(OEgkq>}RV^)Jrnxd&+N3e&id>BHIm|uB@Bt?*`780k*N-ek84_8EK2TpAHH$I0
zor-rZA>}0s=E0))KAR3(CBN4j;(W0+)x<`AQbKz`N}8Va`&B=F`0N?kz$<1NDwLzh
zrlz;^yP9jK>nt&XT*$5WgRaAAOOwYNx@+_cl02Jl5`8cO-Un=^qjd(@!OnU28gyKd
zjb-pnler6y`4R&d&Mc}BRB@d^Yvz!fq|6sN+U1-0(F?CgJ5l+*_M_m6AqJDuMg)W>
z3EY`98}V^tx^(7q!XGLoOex#sJLF}a=b+YgIA<-bx@jllzTmtXAybvEP}2fI-S??+
z@Y!F&T)L^q2ksAd>`An}ExKbunb#=a^fClkSMv}CZs113iSy#ATKHJZb@U~44|K^Q
zoIlw2@>=cZBLH)Ac{W^|;ojjkqc!Rbx6(jNpg5PSrr-*K#pP<=kc}0Fo3g#j8N!-F
z7`PNSI72b0i(yRS(AZim2mX%0B#sVUKV}^P;(%vcGBbp}l}eXfAd4+yDLkOdfA`JX
zMJ5%9p-=l&5n??#a5cQ6e+{l|qqtrBOQd4kL|0Uuik?Qc!Io~@GN{%>`0RJsk-EmW
z^SPIw5pOmW43IS=A5hqh@9zKfxjBgt6a04=WM^H?BT=r7IMMh!uy9XD53wsrX(b?-
zA|!S6^x$yOp`I%aHbT6AIdG_i2_u!XtS?|corZaDJv1<vDV{V$AM0smiH;KQ9=Ms`
z@1MRNzq8vv>@a&ci<Nt)BsD@0o8zNLD<DwZKjW$7fpmtQzL6A%f%~^OXzvVYFau#v
zBFAf;6n=DIX~_HBOPIUODVz9y<CmFRkNdBnTrYFol|&8VT}VodH(q5CLe17x(Po@#
zVDBby6A@VZjSwj6MDCgE>D$Az3<DqC_X^X~%tOM&a}$8Kw@=3<5b^<^=is(m*}1?)
zK9tO5_AlGK^JJob_>p3K#eC0JiI{gB_@|}m->-V_gF91-EepI5ud04lT+Ho>4<zOn
z^&G=Lv$tCuwQPK*idFtBW|#*bApIQ%gz6PgcITE~UmQhu!?rzeh0{ciH@&#V?|)qY
z;jN{%{cdQpRc}Fm<>faIQ{nGIT@1RNAc<lae--ETy}!EdD@br|ie?#q-A68fWi!?z
zzoSrPUPqdmg0>As&=MGjdZt5gPhwbaTl@_6o&+z*ZMBNc*XVnODqa|)vmGLv6X*_h
zrLsP201}K^N<7Z%4o8wzpL16;;hUGZgaSR|H*iMj+UD0&|8++0*os{QUVvD|hi%k4
zC-O^dC1<WHid)~KUMbf_muz!o%;6|%>y#V+qaJDm%AgGesFm(h)}ql+^2c0Vzo8ZJ
zwm;OZ*F7lq0B2uWXbczrGx#)p$>V%WOVTgcdc%c<N4O*<39=}@!g*nSzv-2J_wNF&
z<FvZ-wb0dIWaq<K`-Mv%i8S1!A%Y(v%dm>>p%Unve}bW6q@;tJ`M^CeNg&#cZod;R
zxdD};1%>5>6kY&;%fx0VQ<_T^^kW%^TqlDZR#8J5$nzTAutfT0<}mq0w(u_|U38#_
zSLa*Mo8zTn{1*9*9!MO3SECr#OIC2Mt)M3m7cx8Tk4)<?SACsTKfeH41$sN=yrG*=
z7G2VYaZOff_^bXt@wG%`Y`jpQ)u)8PtV}}aWNk_x8xz=|=@b<9dkGqh6TG-rcUp$+
z<A7ZKwob=&U7GuG`cs!uK+{#Y*26`TfOn`qhf~E<SH=ftFr_G_yIkD6d*m7@oO_iW
z=kLI%v`$w&E&iV(*umHSDLA8G($ee>HmAdZN}V_*Tb5Cdhjkj4vnRj!j7A8jlat;B
zJ%1K^HY>;}IP5HRydG73%}vjZi&`gh-k@r@|G1e+nIG0$PPKVzSZ(i0S2{Z1TLk^A
zdpHN&ZOK$V+ss0y^{<Hu4?Fab-GMLb<c>NTGv(JrP;k)kMeKJp%(7wQheR=7y2~FA
z6IVoR$G>XdY_LHVtcBZ`XHtB~qsIkDZM`*}9v}?bCJd0upr1DbIM7a=^l%=+W$^Z1
zD?7BLTB-CQYbC>bvOKx*-tQ^mqrWE}v^2WTCW}AIX|$Q8P#Jh}x7}y)lM1s<9!}Ip
zs*I65I|(EqKxIy_OQgt27e7A{$EKTH$_m@d-<MS){z_z-rj<oH%R-PW;JSOIaM2le
zl#?Nh0=?q+5tZ4PTqs}cY9D{)kKW51vBU+rfN)T7t(o#l$*$fMf>)}FrssrUC(AQF
zj#50Fr)_Jy!)u?4doYIlSAns44|<cAnh3ZX#+Ll6-4?XZan=>g(^0Z?i-r-QX`I4m
zP%ve{9msm~{WapB`k3`}Pjl*Q@P2c8ECtH=lcLLscEV@(_|T}l*O$xt;{9u=BGtI5
zA(3j#E6oNr{|V$~ZsxeVfkb66FKYms(TCK_xnpRvNb+gp*0jCc)edWbvgEw`3wd`=
z%{gTk1I@FzzNWjaYD=s`?~>(Wp={#~9ZO*ix~HuyEF3~E)x0*@wHaUAJCL|ApIg?_
zqg434aZ$e00c+|e!jHKGwdNiKe6%DlD#Po!#zkGug8YyNY+@kEfS_;e(*mYR?B7jj
zunM1>g6RlgY2i%ulOl!B$(}zVx93mC#_0JQgMJbkU_gX8T*0#XCF=d7Hb;MM4(q`a
zKRR7<Or-$FM1u3#mO&B%kyOw{8U+OjXR8+~UnwU2Z2pJ2r2-yx@0<vp@Lm~5Sb#si
zT#7xP!n<qf=o<%G#(5+V$4%z7nj9ILFoiJdc(VqBVA(VXve`oX`U5txWKuOzM8T!R
z^KKauSP&81H^Bg+`MVmmLH4c(V0nnE+2`qa3J;z;J`nQg3rUH~(QCEmtDNpuBFplp
z+VHE@)M3rcOadFIrHc{eAAtB^AXd0Eexxr>$_}I@mRK{+Pc~9LN^m|idW`rk!TW;&
z;rh~67SWtITpHMDfS1ySMvCXm`seX|D+YTyodYVd8U>k$lePf;>ZGR%Y(?D6i6R5J
zz7o@{e;j8=78#;gj5MrQ9c<VNcKN>UuvOKBfpH-t_^7!uyC>tJ$5lr&6kKM(Yc5b`
zoEo({mCBh&FzKuJb}$6)IN@k?oz%x)I^esDa{(+?!+4X$wv8ynIMC8n;uGpXNri*B
z8+_4KRnIvKOB~GMR+Y<@H!hwHcZd{S44O}mGh*7Xvq_V1$~6pr>Cf8xoVFf}OU(0;
zye^9W55b%NSBe~Y*F+ck?c`)g=WS$q&+HNO9HqEX+kNkbQGtAiX~V)aA@!ARbXuA0
z0xg7d&z@as^He9CFXU0`lp06Ow~+(%4!Mo7C6O_m8@Ie5WiLNTQM7&Hobk$!%iF!Y
z$v<K5lywO+mAsx6(S!6RW*XKo5?Io6oFgO)(i2c5l)FkC`T2c|0O!u1j0zP{hHU2t
zgfnMZr2a<GL$O>hSCYEq)<*2c_f|@xn^5}J(cp=3<fb%zo9I#@n2W{x9YridU+PM#
z^U^9*2nAB(9%k1ernddDcg8>3O(&TF(rR<`S0jS&tp*V@swOt&(kzycS<wFDTq}L(
z75TQjoCvEMkMh^VkX9QXdmM74=0WtTL_{u)-CXhQ-jIllTfQc;ypZmBSf{~j!MlGm
zhe;mFyqpzDxLno!jxz5-nkU*R8rhrRar?cz3$H(iMSrzo;B=5Afw=VOLSpKEcpR{=
za0ujxu?-@}<WEP{rx0=S+Lt48q>#6>%RCgKtOOjIGW%R2jZ5DLQPgo7^yUsCLeXjF
zp7IJ*gCdQdw%>G@VB1H?FW&6FUw$IAY}BiG-au}AjBms$HeeHuX$`pJtS^!>43DxD
zXg!NWK?8#w4JeXzFen^M*pO2zUnkc4Z|{?91%ZOt?pedOaavx}?S#>;yJ`Ml%F&g!
zu;WW@Qie>s?US>VTB4Q0=UY0CDw?t(<R8AFR5#O>gz<;n`#s^$5yLu)-b7g9^@?Xn
zhZr&w(&aueWqN>B=LP&$AXm(_3C$oXB9Z)vxrCeXT)GN@d+_S(huk}X(th2D>p=|K
zfuB?0ZG_h4W%cFsZ9E2s0>QL^AVny>za~dA%6N5dQq9#Be8RNi>pBtTZH|K=rilJ`
zs%A&jW1|!Sm&F;4E=HMeSl=M=Jajpt0P-!2Ws)9V(O7Ifi4i|heqM*e3d7A4{&|b$
z)s?v>!mjwAKbyJsWcp8RcmFb7k=SrNUEJv05B}Fl?r>SafF<99Ji5n~gM*xePv1O^
zs~65scp|<7&J!qd2f-H#b!RGH9OBJu`}yMSS(QZ*hkD6{b=nP+?OL?WO77IZER9sh
zLN9-@gxKfpA|?!`yfQ>TnV3x?@&iLNpw3qZTL86g(hf<^7Tzk(TD%NPX71Aq1X&xX
z?K=C8uyh8s@z2M!+Vf{QA3jqI(n%a>>t-(@zU-Ebob$xEp2U=Fh*1$QH~L8S177ou
zy}xJz@6VdDXu;zjZDL}YkU%md%&2B#|G+uheY?whnb%+WCiE>bwDi)t7Ze1IVLBdj
zMLVv}8%!BKh7sOeC)-iky3l|BpQZgL^tc_R3A5CrV^ws9Z}`!by{t>ZDB=DNLISln
z{?t)gqUQ|-Zxe}z6`U#ZmzGRU1)|A5^Km^5oyTT1d3FH=gTps&V~^e07}~;Gfv)3(
zr;}kd>=?MB2*O(~7}D${^1NX^9t^%TOafEytq2OS%nyJIbu(9?f(*tKAZrL#GpKO`
z>rR{T^2!SCc$|Tf;mi7*rH)ifOE9#G7z(49X3ezqQ!k1*d}&zI*<MoqT1*3hVcSAf
zjR>_UN{Hi`oaoV(RND+VUrCGj6Me<XUJizUS1$eas=y@i`UosFvb=*O`bakaw>UMX
zuJqU`N_A9)r*Nntc9n4McA)Q!G6@nJ70%8CrF3Pvh}O-XyF*b0FRjnm&pZh>5ZXBf
z@A|_am&3|K%9c*&4S^S<cP=}pMc)@bk4s+Fez<Sg-?p{a6nmG}hH>2Rz{ATI)jtTM
zt?Z;><Nu;ZXv(WaZ6?{->4T8#e)SU0mu7)6UqCDS$O=3kVct;^&d-!}%2f=cDI>U}
zhvy^e6|`;s1x5{snw0701Qb+RMe`%Ph5IU3Fl0(AVpUH#88pgFEvjW9jmiMhEMUc-
zhrtUiw2Tk~%LGKn^-@VgQW#JTa}<ZK{2u_;?*97NR)($6>71yQ&oiWirtjs6N?&i@
z2a@`Qhuh8b)!5`8g$5U;E@J=PQidl=ZwZ{VJS?4SK@JQS2lYBoM8%{DvU}&h!*_=V
z)VI^6vo&1Z>4tB?)X})8A;ldW;Py$h1xkjr(vaauaxoA0h^DZd8FEr0`pm2jXYc8R
zkk2g9y>P<VVG7shjq#mGXagX5u>g|8@8fqjDzHuQ73G@}na=^PXsxq7?n1I;Of;B<
zn#s2nLMF@(OIqIk!pcQXMbkg@2b*`*Z(<4MsPnYF1^&I!%qsplfj^uVh=_+tUsUA2
z0@?`(9(a%^OHDwE$nveV^ziEwDIW7Pk=Y{WLc$cWH>Jc9<nPor@Km-#NctdXCN;m$
zIxVkM87A3HAPrX~vBju)3Z)eb_~^K!Xn(QqX{BErO4NA<am|kstG)eeP%D+}@vH#T
zKTUS-nsfs1Qa6dzs4zpmLL6@oq)3#l#LxTT0Du48MItZ3`T8@gxzL%xRh_LyE!05r
zBg2f*WIKpDni2q_`iV3M@K`(2bH3K>W>TEYC3G@-7^Z%B$0}?2EhmEfPrVRsIBqc_
z#L8$%YPmL;X`i=tY6<1!(p#3*I}f`D2U~;!BWeW7*9o+te>pv~NgBf_XH!h^F7RWC
z-|LxNlehHmG8_LeV@ZFu;R$(8n?r!-TN~bsWdm{r4*r$gcz=hpuq%zGy4d?0UtzP`
z`q$)d4?i=jGvuU0d-Pm?`N16|-M^GzChn!2-h$$IH$!oQP8MnyrkC!?S6&xYx-bc1
z5ORlv=@L+h{twO#B9~=r4`RZ%V0ME|=GI2>0GN^TA!6;K<Ma$9J=t0b3eduHtV*R;
z&Lh9IOzlwL@zrWO?>U!Xl#<I7GL1R(s5D2b++KEc9_(M2Qm<TCOMPg}eF)<w;@R67
z{|$o4wo%%zGXIFelwv{ii_Km}I=Z>oBq<|9J1_w&EqMKcpZznK!`v`&3dDS10){i1
z1o%-IwUbKEaRTjM7zs@x(Ft9^B<VfPm{$np)vO_p`_)!n2xukPbAtRq$b;YvW1asB
zPrA7xj(FUkjQ%fL8cS3FCb7RPTexWWu~I%afu!dG8-nO_w*537dwf2LHwhm3NN`S!
zG&WWY;=@JenRT>U;*I*L{ZeNk=u+i-442xX`<%Hf;i<j){YS%ulcV^I;3zw1c>yE*
z_w+-hk)O(lhIHDZ(wflsf-!R#Ny8P)jq3M-r$Re4*lb1=K=HyzNz8`)J-%v#-W-B=
z0?7tV<#xG{>`pTK$H^#UcA1$L-SpnI20e;PCeM&0ZR*#598D<4*2z;WM-89}Vbjr3
zd&&>`-u!&nxGP8fSRiaEj2p)<n<p3$`Tfbk!&nm+$6$AN`kU_^B6nXOL#CZ@&(D}B
zP*dzeQYA5ij>6nOBgD24hT@$65RY_@Kj<LR5U`^dW86#+>xclmO^-Bw9S78@LTrQz
zL>Xzue=VTZ{B!DoORAv}cZA<9Bq}8zU5s+2?jRPeqS}C<T<HllT>j$V`<-E;(qttv
zZvRKR$*REx1IL)7&c&uuKK76m<6L<7kKsNj4vr!$qXz5?nKW~XoNkk;{6bHpt7rFR
z-;&g0qxGk1p$8`SH;JNT8$~8e{_x&{cLYIcz8rQr8*>6!RHpT(!<5|CCqhL*RGNbc
z_jy;MA>1Dg$Ha8k?2PKl!A0u0HQ;oEY^{fme=#wYOXP4Gsi-7UX-S#t%>!L>%9G8g
zqIQie2AD9i1jDOUMGe<NzC_ggH5XKdCPMSt58Gb#?i;rfPcs$}rRRof96fJM>Sv$E
zih2S@05Dd+SN=V*rLHn{+iWyxKp5@7p%Ckwm0jxDDl*Q1LYUrO$ku1erH#^!>muN+
znW;N~J(pLm3PAd-t0&36R4~GJn6~Ipb*r?v@2jH<uFim#qR#{iVC2H@wXIX;9nsM!
z!Dxo^<rX81K$8ya&$^SE=^(sR9FwC=HCC3d>XV4dq|C|_>nWqax<Sj4D9e;IzS!45
zKCd^Zy$yK`<J>f8s~Yg<Z3@WHnx&l3IY_s=^+6eCG#)A{W%3m&5#saSgNsK~)6cxz
zv<X@KC1czYZBcMM;dTnFzcX7X9k%4NqDZ+^DQo)KLnS5n|Ag|fjeq39erl?sJmY`x
zNjrIfO6*^wJDfdFP=){}SC?~!2{q(DpTYwAcPw1n_UfPQ2%6h1wy}AY%ZQ`7CxNMo
ztIUnoU?pN;lXg=t>k(UUWga5CM_Skx@6^?XJ`q-3<|!#U;Jq9r2C<-L9QX3}?Tmc-
zXp+`H(8QbN1<wmLw(0Bo@YJ*&9l0Yj$va690z+~%&^}kihV2rKQ06nt5Nw98xD{``
zu?k@n^MuC}n@-m!YWtvnd`e`hf_IKnd(Z-ka~DHUm*u3*yl{da<Dj;+Fy|2jVZKvP
z-p88Nc99eR+b$Q3hu(poFXJ<5q5t8)UY%P&cB;Pf#z6m_LJFysthymNHN7Jwt*+Z?
zoiKic_#0(RBe|lHg;*VDVNzjhfz3J#aCS*?N`-lUuJr{pO;Nn<Uh$rfA%GTFc0?vv
zQ<V|Hp+<H}YQs)h5@M-i57C7Qs;cMaFr~<QH6gIy`fh+|N~T$Y_nz{ix+<e1QyC`)
zzhDy}nE7d+f|Y&4QFuXzG&772=QFV}4lsoM<F_l}w%!za$fSzKU`a>Pae~`z8=|jF
zJUhU%3Z0s);wqx#o>>1}#u<gF+w8b~nTfwfn2A-vz<@)bdPXRu0h}wlZ)He>-l}i^
zPCk^x%};&32^SdN(Teq~hxscHASo=_uv(>{n^|Uj>8kfl94XcQ<j|)Jo6E2z<vDpZ
zNRXP6MK|0Zb70}}jcP;`MU0Z|kLu^bN**@O*Zg~Fy>&L<If?dVyU!3!MAPF63GdM@
z6DLOUJ&g$YImr-~EqnYlGmmohc5re-T>}ujB4TU!C-v{8-gy4ha-}b(0RKwM-CM!P
z+uGgL)z-}$qEWJSvwdmlZEHhg<xivG=wj<;NyEd*O+(}0?d>7T#pV9^9Zr{*HnyC$
z9**9YoOUlUX%w_o^krytZM|$QUs^lRSi0HJ$lLnby108hekhH)rIkDQO!t@mG%V`6
Y@(Qe&KT8Wt!H<Si6g1^)WGzDf2ljA43jhEB
literal 0
HcmV?d00001
diff --git a/milena/doc/white_paper/figures/house_wshed_mean_colors.png b/milena/doc/white_paper/figures/house_wshed_mean_colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..33a005ae59519bbc43d9409d5777a89f23d6ed84
GIT binary patch
literal 6618
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
YQba{53frflT>t<807*qoM6N<$f~zRgrvLx|
literal 0
HcmV?d00001
diff --git a/milena/doc/white_paper/white_paper.tex b/milena/doc/white_paper/white_paper.tex
new file mode 100644
index 0000000..9b2f03e
--- /dev/null
+++ b/milena/doc/white_paper/white_paper.tex
@@ -0,0 +1,384 @@
+\documentclass{article}
+
+%\usepackage{hevea}
+
+\usepackage{hyperref}
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{makeidx}
+\usepackage{xcolor}
+\usepackage{color}
+\usepackage{html}
+\usepackage{tikz}
+\usepackage{pgf}
+
+\newcommand{\img}[4]{
+\begin{figure}[ht!]
+ \begin{center}
+ \includegraphics[width=#2]{figures/#1}
+ \caption{#4\label{fig:#1}}
+ \end{center}
+ \end{figure}
+}
+
+\title{Milena\\
+ \large{Generic image processing library} }
+\author{LRDE}
+\date{}
+\makeindex
+
+\definecolor{ccomment}{rgb}{0.5,0,0}
+\definecolor{cstring}{rgb}{0,0.32,0.5}
+\definecolor{cidentifier}{rgb}{0,0.5,0}
+\definecolor{cbg}{rgb}{0.95,0.95,0.95}
+
+%%%LISTINGS SETTINGS
+%\begin{latexonly}
+\lstset{frameround=fttt}
+\lstloadlanguages{[ISO]C++}
+\lstset{language=[ISO]C++,
+ captionpos=b,
+ basicstyle={\small\sffamily}, % normal small footnotesize scriptsize tiny
+ commentstyle=\itshape,
+ showstringspaces=false,
+ numberstyle=\tiny,
+ morekeywords={where, auto, concept, concept_map, axiom, late_check, final, abstract},
+ morecomment=[s]{/*}{*/},
+ backgroundcolor=\color{cbg},
+ identifierstyle=\color{black},
+ stringstyle=\color{cstring}
+}
+%\end{latexonly}
+
+% #1 : sub page name
+% #2 : sub page title
+\newcommand{\doxychapter}[2]{%
+\label{#1}
+\backslash endhtmlonly%
+\backslash page #1 #2%
+\backslash htmlonly %
+}
+
+% #1 : section name
+% #2 : section title
+\newcommand{\doxysection}[2]{%
+\vspace{1cm}
+\label{#1}
+\backslash endhtmlonly%
+\backslash section #1 #2%
+\backslash htmlonly %
+}
+\newcommand{\doxysubsection}[2]{%
+\label{#1}
+\backslash endhtmlonly%
+\backslash subsection #1 #2%
+\backslash htmlonly %
+}
+
+\newcommand{\doxysubsubsection}[2]{%
+\label{#1}
+\backslash endhtmlonly%
+\backslash subsubsection #1 #2%
+\backslash htmlonly %
+}
+
+% #1 - part number (Optional)
+% #2 - file name
+\newcommand{\doxycode}[2][1]{
+\backslash endhtmlonly%
+\backslash include #2-#1.cc%
+\backslash htmlonly %
+}
+
+\newcommand{\doxyrawcode}[1]{
+\backslash endhtmlonly%
+\backslash include #1.cc.raw%
+\backslash htmlonly %
+}
+
+\newcommand{\doxyoutput}[1]{
+\backslash endhtmlonly%
+\backslash include #1.txt%
+\backslash htmlonly %
+}
+
+% Include file '#1' from a split output.
+% #1 - part number (Optional)
+% #2 - file name
+\newcommand{\doxymoutput}[2][1]{
+\backslash endhtmlonly%
+\backslash include #2-#1.txt%
+\backslash htmlonly %
+}
+
+\newcommand{\doxyfigure}[3][1]{
+\backslash endhtmlonly%
+\backslash image html #2-#1.png%
+\backslash htmlonly %
+}
+
+\newcommand{\doxyimg}[2]{
+\backslash endhtmlonly%
+\backslash image html #1.png%
+\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]{%
+\begin{center}%
+ \longleftarrow ~Go to \doxyref{#1} \hspace{1cm} | \hspace{1cm} Go to \doxyref{#2}~ \longrightarrow%
+\end{center}%
+}
+
+\newenvironment{doxymath}
+{
+%\backslash endhtmlonly%
+%\backslash f\$
+%\begin{rawtext}
+$$
+}
+{
+$$
+%\end{rawtext}
+%\backslash f\$
+%\backslash htmlonly%
+}
+
+%\begin{latexonly}
+\renewcommand{\doxychapter}[2]{\chapter{#2}\label{#1}}
+\renewcommand{\doxysection}[2]{\section{#2}\label{#1}}
+\renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}}
+\renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}}
+\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}}
+\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}}
+\renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}}
+\renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}}
+\renewcommand{\doxyfigure}[3][1]{%
+\pgfimage[width=#3]{figures/#2-#1}%
+\label{#1}%
+}
+\renewcommand{\doxyimg}[2]{%
+\pgfimage[width=#2]{#1}%
+\label{#1}%
+}
+\renewcommand{\doxyref}[1]{\ref{#1}}
+\renewcommand{\doxysee}[1]{\ref{#1}}
+\renewcommand{\tutotoc}[2]{}
+\renewenvironment{doxymath}
+{
+ $$
+}
+{
+ $$
+}
+
+%\end{latexonly}
+
+
+\newcommand{\code}[1]{%
+\textit{#1}%
+}
+\newcommand{\var}[1]{%
+\textit{$#1$}%
+}
+\newcommand{\val}[1]{%
+\textit{#1}%
+}
+\newcommand{\type}[1]{%
+\textit{#1}%
+}
+\newcommand{\namespace}[1]{%
+\textit{#1}%
+}
+\newcommand{\header}[1]{%
+\textit{#1}%
+}
+\newcommand{\hpath}[1]{%
+\textit{#1}%
+}
+
+\newcommand{\must}{%
+\textbf{must}
+}
+\newcommand{\should}{%
+\textbf{should}
+}
+
+
+
+\begin{document}
+
+\maketitle
+
+%#################################################################
+\section{Introduction}
+Milena is a programming framework for discrete mathematical morphology written
+in C++. It is part of the Olena project which aims at building a scientific
+computation platform oriented towards image processing, image recognition and
+artificial vision.
+
+Milena is designed with two major goals in mind:
+\begin{itemize}
+ \item Be as simple as calling C routines for end users.
+ \item Be modular enough to be extended with respect to algorithms and data
+ structures.
+\end{itemize}
+
+
+%#################################################################
+\section{Targeted audience}
+This library targets several audiences:
+\begin{itemize}
+
+ \item \textit{End users} of morphological tools who want to apply and assemble
+ algorithms to solve image processing, pattern recognition or computer vision
+ problems.
+ \item \textit{Designers} of morphological operators who build new algorithms
+ by using constructs from their software framework (language, livraries,
+ toolboxes, programs, etc.).
+ \item \textit{Providers} of data structures who are interested in extending
+ their framework with new data types (images, values, structuring elements,
+ etc.).
+
+\end{itemize}
+
+%#################################################################
+\section{Key features}
+Olena is:
+\begin{itemize}
+ \item \textbf{Generic}. If a morphological operator admis a general
+ definition whatever the context (topology of the image, structuring
+ element, etc.), then this algorithm should have a corresponding single
+ implementation.
+
+ \item \textbf{Close to theory}. Reading (and writing) algorithms should
+ eventually become natural to scientists used to mathematical morphology
+ notations.
+
+ \item \textbf{Efficient} (with respect to run time speed and memory
+ usage), when it is possible. Dedicated and efficient implementations of
+ morphological algorithms for certain cases are known and should be
+ selected whenever possible.
+
+ \item \textbf{User-friendly}. Users should not have to address
+ memory-related issues or deal with a program silently failing because of
+ an arithmetic overflow. The tool should handle these situations, and
+ help the user diagnose any problem.
+
+ \item \textbf{Reliable}. Programming by contract helps debbuging user's
+ programs. By default, a debug mode is enabled and check the data and
+ access validity at runtime. Since Olena tends to be as static as
+ possible, many static checks are also done at compile time.
+
+ \item \textbf{Free}. Milena is \textit{free} and \textit{open-source}. It is
+ released under GNU GPL V2.
+\end{itemize}
+
+
+%#################################################################
+\section{Library content}
+
+%=================================================================
+\subsection{Generic basic image types}
+
+Common basic image types are provided: 1-D, 2-D, 3-D images.
+A $N$-D image class is also available.
+These class are provided with a border in order to make them fast in algorithms
+using structural elements.
+
+%=================================================================
+\subsection{Morphers}
+
+Morphers are generic, composable and lightweight objects built on one or several
+images, that can be used as
+\begin{itemize}
+ \item \textbf{mixins}: a morpher can add extra data (e.g. a neighborhood) or
+ operations (e.g., an ordering on the values) to an image;
+ \item \textbf{adapters}: e.g., a slice morpher can be used to view a slice of
+ a 3-D image (spacemap) as a 2-D image (bitmap);
+ \item \textbf{modifiers}: a morpher can add a mask to an image, to restrict its
+ (iterable) domain;
+ \item \textbf{lazy function applications}: a morpher can present an image seen
+ through a function, either bijective or not;
+ \item etc.
+\end{itemize}
+
+\begin{center}
+ \doxyimg{house}{2.5cm}
+ \doxyimg{house_wshed}{2.5cm}
+ \doxyimg{house_wshed_mean_colors}{2.5cm}
+ \doxyimg{house_rag}{2.5cm}
+\end{center}
+
+%=================================================================
+\subsection{Generic image processing algorithms}
+
+\begin{itemize}
+ \item Morphological algorithms: dilation, erosion, watershed, leveling, etc;
+ \item Influence zone;
+ \item Labeling;
+ \item etc.
+\end{itemize}
+
+%=================================================================
+\subsection{Auxiliary tools}
+
+Since Olena is intended to \textit{designer} of algorithms and \textit{provider}
+of new data structures, various generic auxiliary tools are available in the
+library.
+
+\begin{itemize}
+ \item Topologies (grid, graph, etc.);
+ \item Points and delta-points;
+ \item neighborhoods and windows;
+ \item accumulators;
+ \item etc.
+\end{itemize}
+
+
+
+%#################################################################
+\section{Learn more}
+
+Olena's \textbf{official website}: \url{http://olena.lrde.epita.fr}
+
+Olena's \textbf{Trac}: \url{http://trac.lrde.org/olena}
+
+Milena's \textbf{documentation}:
+\url{http://www.lrde.epita.fr/dload/doc/milena-1.0}
+
+%
+\medskip
+%
+
+\textbf{Mailing lists}:
+\begin{itemize}
+ \item olena(a)lrde.epita.fr - Question and comments;
+ \item olena-bug(a)lrde.epita.fr - Bug reports;
+ \item olena-patches(a)lrde.epita.fr - Patches.
+\end {itemize}
+
+%
+\bigskip
+%
+
+\textbf{Contacts}:
+\begin{itemize}
+ \item Thierry Geraud - thierry.geraud(a)lrde.epita.fr
+ \item Roland Levillain - roland.levillain(a)lrde.epita.fr
+\end{itemize}
+
+%Demo + tuto + doc
+
+\end{document}
diff --git a/milena/mln/core/concept/image.hh b/milena/mln/core/concept/image.hh
index 6bd26a6..e2bc4f8 100644
--- a/milena/mln/core/concept/image.hh
+++ b/milena/mln/core/concept/image.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory
// (LRDE)
//
// This file is part of the Olena Library. This library is free
@@ -49,12 +49,11 @@
# include <mln/tag/init.hh>
-
namespace mln
{
- // Fwd decl.
+ // Forward declaration.
template <typename E> struct Image;
// Image category flag type.
@@ -65,11 +64,10 @@ namespace mln
};
- /*! \brief Base class for implementation of image classes.
- *
- * \see mln::doc::Image for a complete documentation of this class
- * contents.
- */
+ /// Base class for implementation of image classes.
+ ///
+ /// \see mln::doc::Image for a complete documentation of this class
+ /// contents.
template <typename E>
struct Image : public Object<E>
{
diff --git a/milena/mln/core/concept/object.hh b/milena/mln/core/concept/object.hh
index 4a482cb..27ef2a4 100644
--- a/milena/mln/core/concept/object.hh
+++ b/milena/mln/core/concept/object.hh
@@ -84,7 +84,6 @@
* <LI> \ref mln::extension
* <LI> \ref mln::fun
* <LI> \ref mln::geom
- * <LI> \ref mln::graph
* <LI> \ref mln::histo
* <LI> \ref mln::io
* <LI> \ref mln::labeling
@@ -112,7 +111,7 @@
* <LI> \ref mln::win
*
* \section copyright Copyright and License.
- * Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+ * Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory
*
* This file is part of the Olena Library. This library is free
* software; you can redistribute it and/or modify it under the terms
diff --git a/milena/mln/core/image/cast_image.hh b/milena/mln/core/image/cast_image.hh
index 91e5339..422327d 100644
--- a/milena/mln/core/image/cast_image.hh
+++ b/milena/mln/core/image/cast_image.hh
@@ -1,4 +1,5 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2009 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,13 +29,12 @@
#ifndef MLN_CORE_IMAGE_CAST_IMAGE_HH
# define MLN_CORE_IMAGE_CAST_IMAGE_HH
-/*! \file mln/core/image/cast_image.hh
- *
- * \brief Definition of an image morpher that make the user see the
- * same image but with another data type.
- *
- * \todo Rename as cast_image (without '_')!
- */
+/// \file mln/core/image/cast_image.hh
+///
+/// Definition of an image morpher that make the user see the
+/// same image but with another data type.
+///
+/// \todo Rename as cast_image (without '_')!
# include <mln/core/internal/image_value_morpher.hh>
# include <mln/value/set.hh>
@@ -112,10 +112,10 @@ namespace mln
- /*! \brief Class of image morpher which takes an image to change its
- * data type.
- *
- */
+ /// \brief Class of image morpher which takes an image to change its
+ /// data type.
+ ///
+ /// \ingroup modimagevaluemorpher
template <typename T, typename I>
struct cast_image_ :
public internal::image_value_morpher< I, T, cast_image_<T,I> >
diff --git a/milena/mln/core/image/image1d.hh b/milena/mln/core/image/image1d.hh
index 87fe01d..b67feb0 100644
--- a/milena/mln/core/image/image1d.hh
+++ b/milena/mln/core/image/image1d.hh
@@ -51,7 +51,7 @@
namespace mln
{
- // Fwd decl.
+ // Forward declaration.
template <typename T> struct image1d;
@@ -139,12 +139,13 @@ namespace mln
- /*! \brief Basic 1D image class.
- *
- * The parameter \c T is the type of pixel values. This image class
- * stores data in memory and has a virtual border with constant
- * thickness before and after data.
- */
+ /// \brief Basic 1D image class.
+ ///
+ /// The parameter \c T is the type of pixel values. This image class
+ /// stores data in memory and has a virtual border with constant
+ /// thickness before and after data.
+ ///
+ /// \ingroup modimageconcrete
template <typename T>
struct image1d :
public internal::image_primary< T, box1d, image1d<T> >
diff --git a/milena/mln/core/image/image2d.hh b/milena/mln/core/image/image2d.hh
index 937b451..40a9eb0 100644
--- a/milena/mln/core/image/image2d.hh
+++ b/milena/mln/core/image/image2d.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory
// (LRDE)
//
// This file is part of the Olena Library. This library is free
@@ -126,12 +126,13 @@ namespace mln
- /// Basic 2D image class.
+ /// \brief Basic 2D image class.
///
/// The parameter \c T is the type of pixel values. This image class
/// stores data in memory and has a virtual border with constant
/// thickness around data.
///
+ /// \ingroup modimageconcrete
template <typename T>
class image2d : public internal::image_primary< T, mln::box2d, image2d<T> >
{
diff --git a/milena/mln/core/image/image2d_h.hh b/milena/mln/core/image/image2d_h.hh
index f2ba145..c76b32b 100644
--- a/milena/mln/core/image/image2d_h.hh
+++ b/milena/mln/core/image/image2d_h.hh
@@ -44,6 +44,10 @@
namespace mln
{
+
+ /// \brief 2d image based on an hexagonal mesh.
+ ///
+ /// \ingroup modimageconcrete
template <typename V>
struct image2d_h
: public hexa< image2d<V> >
diff --git a/milena/mln/core/image/image3d.hh b/milena/mln/core/image/image3d.hh
index dcf266f..a0bdb5d 100644
--- a/milena/mln/core/image/image3d.hh
+++ b/milena/mln/core/image/image3d.hh
@@ -120,12 +120,13 @@ namespace mln
- /*! \brief Basic 3D image class.
- *
- * The parameter \c T is the type of pixel values. This image class
- * stores data in memory and has a virtual border with constant
- * thickness around data.
- */
+ /// \brief Basic 3D image class.
+ ///
+ /// The parameter \c T is the type of pixel values. This image class
+ /// stores data in memory and has a virtual border with constant
+ /// thickness around data.
+ ///
+ /// \ingroup modimageconcrete
template <typename T>
struct image3d : public internal::image_primary< T, box3d, image3d<T> >
{
diff --git a/milena/mln/core/image/image_if.hh b/milena/mln/core/image/image_if.hh
index 0102e7c..893de51 100644
--- a/milena/mln/core/image/image_if.hh
+++ b/milena/mln/core/image/image_if.hh
@@ -1,4 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008, 2009 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,13 +29,12 @@
#ifndef MLN_CORE_IMAGE_IMAGE_IF_HH
# define MLN_CORE_IMAGE_IMAGE_IF_HH
-/*! \file mln/core/image/image_if.hh
- *
- * \brief Definition of a image which domain is restricted by a
- * function.
- *
- * \todo Relax Function_p2b into Function_v2b.
- */
+/// \file mln/core/image/image_if.hh
+///
+/// Definition of a image which domain is restricted by a
+/// function.
+///
+/// \todo Relax Function_p2b into Function_v2b.
# include <mln/core/internal/image_domain_morpher.hh>
# include <mln/core/site_set/p_if.hh>
@@ -45,7 +45,7 @@
namespace mln
{
- // Fwd decl.
+ // Forward declaration.
template <typename I, typename F> struct image_if;
@@ -89,9 +89,9 @@ namespace mln
- /*! \brief Image which domain is restricted by a function.
- *
- */
+ /// \brief Image which domain is restricted by a function.
+ ///
+ /// \ingroup modimagedomainmorpher
template <typename I, typename F>
struct image_if : public internal::image_domain_morpher< I,
p_if<mln_pset(I), F>,
diff --git a/milena/mln/opt/all.hh b/milena/mln/opt/all.hh
index ac80cd4..7d4d40a 100644
--- a/milena/mln/opt/all.hh
+++ b/milena/mln/opt/all.hh
@@ -32,6 +32,20 @@
///
/// File that includes the most useful optional routines.
+namespace mln
+{
+
+ /// Namespace of optional routines.
+ namespace opt
+ {
+
+ /// Implementation namespace of opt namespace.
+ namespace impl {}
+
+ } // end of namespace mln::opt
+
+} // end of name
+
# include <mln/opt/at.hh>
# include <mln/opt/element.hh>
# include <mln/opt/value.hh>
diff --git a/milena/tests/util/soft_heap.cc b/milena/tests/util/soft_heap.cc
index 9ab1d8b..86ce8eb 100644
--- a/milena/tests/util/soft_heap.cc
+++ b/milena/tests/util/soft_heap.cc
@@ -25,7 +25,7 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-/// \file mln/core/site_set/p_soft_heap.hh
+/// \file mln/util/soft_heap.cc
///
/// Test for the soft heap (approximate priority queue).
--
1.5.6.5
https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add Matlab code from Anne.
* theo/igr/melimage/irm_perf: New directory.
* theo/igr/melimage/irm_perf/dynaparam7.m: New.
* theo/exec/dump_12bit_to_pgm.cc: New.
exec/dump_12bit_to_pgm.cc | 35 ++++
igr/melimage/irm_perf/dynaparam7.m | 299 +++++++++++++++++++++++++++++++++++++
2 files changed, 334 insertions(+)
Index: theo/igr/melimage/irm_perf/dynaparam7.m
--- theo/igr/melimage/irm_perf/dynaparam7.m (revision 0)
+++ theo/igr/melimage/irm_perf/dynaparam7.m (revision 0)
@@ -0,0 +1,299 @@
+function [reh,tmax]=DYNAPARAM7(image,roi1,roi2)
+% Cr�ation d'images param�triques du rehaussement et du temps ou le maximum
+% du rehaussement est atteint, pour DCE-MRI
+%alw le 15 octobre 2007 avec interaction fructueuse G Begin
+%tracer pr�alablement la ROI1 (bruit) pour SEUILLAGE
+%et FACULTATIF la ROI2 pour r�gion de travail
+
+%PARAM7 version 24 fevrier 2009 (le protocole est enfin fig�)
+
+%DONNER pour le graphique temps echantillonnage entre deux images =acqui
+%calcul sur les dim3 images
+%Choix du seuil f; quatre est une bonne valeur
+%donner aussi ini le nombre d images qui sont la ligne de base
+
+%NORMALISATION
+%AUC est l int�grale de l augmentation de signal
+%AUCnorm : division AUC voxel � voxel par "imaini"=int�grale de (REH-1) sur la s�rie
+
+acqui=3 % dur�e acqui et temps interimages; en secondes
+fseuil=4 % ratio entre signaux trop faibles, �limin�s, et bruit de fond mesur� sur l image
+ini=9 %nombre images ligne de base
+ini2=20 % a la fin de la mont�e vasculaire, � la dixieme image post injection: lissage des images par trois
+
+%calcul signal initialmoyen : 8 images de 2 � 9 moyenn�es=ligne de base
+imageini=0.125*(image(:,:,2)+image(:,:,3)+image(:,:,4)+image(:,:,5)+image(:,:,6)+image(:,:,7)+image(:,:,8)+image(:,:,9));
+
+figure(1)
+imagesc(abs(imageini(:,:)));
+title('image base');
+
+dim1=size(image,1);
+dim2=size(image,2);
+dim3=size(image,3);
+
+ %calcul auc aire sous la courbe
+ for k=1:dim3
+ imasoustraite(:,:,k)=image(:,:,k)-imageini;
+ end;
+
+%Mesure bruit de fond pour seuiller
+%calcul� sur la premi�re image
+nbrpix1=sum(sum(roi1));
+ datasli=image(:,:,1);
+ prodsignal1=datasli.*roi1;
+%moyenne
+moysignal1=sum(sum(abs(prodsignal1)))/nbrpix1;
+%ecart type
+ som1=0;
+kk=0;
+for l=1:size(prodsignal1,1)
+ for k=1:size(prodsignal1,2)
+ if(roi1(l,k)~=0)
+ som1=som1+(abs(datasli(l,k))-moysignal1)^2;
+ end;
+ end;
+end;
+ectys=sqrt(som1/(nbrpix1-1));
+seuil=fseuil*ectys;
+
+%on calcule le masque
+for i=1:dim1
+ for j=1:dim2
+ if(abs(image(i,j,1))>seuil)
+ masque(i,j)=1.0;
+ else
+ masque(i,j)=0.0;
+ end;
+ end;
+end;
+% si on a choisi une r�gion avec roi2
+if (nargin>2)
+ masque=masque.*roi2;
+end;
+
+%on applique le masque sur image et imasoustraite
+
+for k=2:dim3
+ for i=1:dim1
+ for j=1:dim2
+ if(masque(i,j)==0)
+ image(i,j,k)=0;
+ imasoustraite(i,j,k)=0;
+ end;
+ end;
+ end;
+end;
+
+%on regarde si le seuillage et le masquage sont OK
+figure(2)
+imagesc(abs(image(:,:,2)));
+title('image seuill�e');
+
+% on cherche les maxi (intensit� c et temps T) des courbes signal(temps)
+%on masque toute la s�rie d'images
+
+%Essai de lissage � parir de fin de mont�e vaculaire ini2 pour ameliorer
+%les seuillages a 10 50 90 NON EVALUE RIGOUREUSEMENT
+for k=ini2:dim3-1
+image(:,:,k) = 0.5*image(:,:,k)+0.25*image(:,:,k-1)+0.25*image(:,:,k+1);
+end;
+
+kk=0;
+for i=1:dim1
+ for j=1:dim2
+ if(masque(i,j)==0)
+ image(i,j,:)=0;
+ c(i,j)=0;
+ T(i,j)=0;
+ kk=kk+1;
+ end;
+ end;
+end;
+ [c,T]=max(image,[ ],3);
+
+% ou c est la valeur du max et T son index, le long de la dimension 3
+%kk est le nombre de points masques
+kk
+
+ %calcul AUC � partir de imagesoustraite
+ AUC=zeros(dim1,dim2);
+ for i=1:dim1
+ for j=1:dim2
+ for k=1:dim3
+ AUC(i,j)=AUC(i,j)+imasoustraite(i,j,k);
+ end;
+ end;
+ end;
+
+% Conversion du temps du pic en secondes � partir fin p�riode de base
+tmax=acqui*(T-ini);
+
+%calcul des temps 10 et 90 et de la pente correspondante
+for i=1:dim1
+ for j=1:dim2
+ [C10(i,j),idx_10(i,j)]=max(image(i,j,:)>=0.1*c(i,j));
+ [C90(i,j),idx_90(i,j)]=max(image(i,j,:)>=0.9*c(i,j));
+ [C50(i,j),idx_50(i,j)]=max(image(i,j,:)>=0.5*c(i,j));
+ if(idx_90(i,j)-idx_10(i,j)==0)
+ masque2(i,j)=0;
+ else
+ masque2(i,j)=1;
+ end;
+ end;
+end;
+
+ %calcul MTT
+
+ %QUAND le signal redescent significativement apr�s le maximum
+ %elimination des voxels o� le signal est encore 90% du maximum en fin
+ %d'acquisition
+ kk2=0;
+for i=1:dim1
+ for j=1:dim2
+
+ if (image(i,j,dim3)>=0.9*c(i,j))
+
+ masque3(i,j)=0;
+ kk2=kk2+1;
+ else
+ masque3(i,j)=1;
+ end;
+ end;
+ end;
+
+ %pour les voxels non masqu�s on inverse t et on cherche le max 50% a partir de la fin
+ for i=1:dim1
+ for j=1:dim2
+ for k=1:dim3
+ imageinv(i,j,k)=masque3(i,j)*image(i,j,dim3+1-k);
+ end;
+ end;
+ end;
+
+ for i=1:dim1
+ for j=1:dim2
+ if (masque3(i,j)==0)
+ idx_51(i,j)=0;
+ C51(i,j)=0;
+ else
+ [C51(i,j),idx_51(i,j)]=max(imageinv(i,j,:)>=0.8*c(i,j));
+ end;
+ end;
+end;
+
+ kk2
+
+ %Calcul MTT defini comme largeur a mi hauteur de la courbe signal(temps)
+ %soit t50 montant et t50 descendant
+ for i=1:dim1
+ for j=1:dim2
+ if(masque(i,j)*masque2(i,j)*masque3(i,j)==0)
+ MTT(i,j)=0;
+ else
+ MTT(i,j)=acqui*(dim3-idx_51(i,j)-idx_50(i,j));
+ end;
+ end;
+end;
+ %calcul de la pente 10/90 (avec delta signal=80%du maximum c(i,j) et
+ %delta temps =t90 -t10
+ for i=1:dim1
+ for j=1:dim2
+ if(masque(i,j)*masque2(i,j)==0)
+ pente(i,j)=0;
+ else
+ pente(i,j)=(0.8*c(i,j))/(acqui*(idx_90(i,j)-idx_10(i,j)));
+ end;
+ end;
+end;
+
+ %calcul pente normalis�e rehaussement normalis� et AUC normalis�e
+ for i=1:dim1
+ for j=1:dim2
+ if(masque(i,j)==0)
+ pentenorm(i,j)=0;
+ reh(i,j)=0;
+ AUCnorm(i,j)=0;
+ else
+ pentenorm(i,j)=pente(i,j)/imageini(i,j);
+ reh(i,j)=c(i,j)/imageini(i,j);
+ AUCnorm(i,j)=AUC(i,j)/imageini(i,j);
+ end;
+ end;
+end;
+
+
+figure (3)
+imagesc(AUCnorm);
+title('image aire normalis�e sous la courbe');
+% l'aire sous la courbe est n�gative l� o� il y a eu du boug� (bord tube)
+
+
+figure (4)
+imagesc(pentenorm);
+title('pente normalis�e10-90');
+
+figure(5)
+imagesc(reh);
+title('image rehaussement relatif');
+caxis([0 5]);
+%au dela de 5 il faut r�viser la dose d'agent de contraste car surdosage
+
+figure(6)
+imagesc(MTT);
+title('image MTT');
+
+figure(9)
+imagesc(idx_51);
+title('idx_51');
+
+figure(10)
+imagesc(C51);
+
+figure(7)
+imagesc(tmax);
+title('image Tmaximum');
+
+figure(8)
+subplot(2,2,1);
+imagesc(pentenorm);
+title('pente normalis�e10-90');
+subplot(2,2,2)
+imagesc(reh);
+title('image rehaussement relatif');
+caxis([0 3]);
+subplot(2,2,3)
+imagesc(tmax);
+title('image Tmaximum');
+
+% COURBE S(t)sur pixel choisi graphiquement
+%Permet de voir la courbe de rehaussement d'un voxel point�
+%SI LE VOXEL EST AU BORD DU TUBE T�MOIN: UN D�TECTEUR DE MOUVEMENTS
+% coordonx=1:size(image,3);
+x=size(image,1)/2;
+y=size(image,2)/2;
+while((x<size(image,1))&&(y<size(image,2)))
+% la saisie du point de coordonn�es x,y se fait sur la figure ouverte en
+% dernier
+% pour sortir: cliquer dans le gris...
+% pour affichage interactif coordonn�es pixel, mais en fait pas utile
+h=figure(8)
+pixval;
+%saisie coordonn�es du pixel pour lequel on veut afficher la courbe de
+%d�croissance et le fit
+[x,y]=ginput(1);
+% on ajuste a l'entier sup�rieur pour trouver les "vraies" coordonn�es
+% en plus il faut inverser entre xy et ij...
+coordx=ceil(y);
+coordy=ceil(x);
+% test sortie du programme
+if((coordx>size(image,1)) | (coordy>size(image,2)))
+ break;
+end;
+fprintf(1,'\n%d\t%d\t%f\t%f\n',coordx,coordy,reh(coordx,coordy),image(coordx,coordy,1) );
+titi=(abs(image(coordx,coordy,:)));
+tata=squeeze(titi);
+subplot(2,2,4)
+plot(tata);
+end;
+
Index: theo/exec/dump_12bit_to_pgm.cc
--- theo/exec/dump_12bit_to_pgm.cc (revision 0)
+++ theo/exec/dump_12bit_to_pgm.cc (revision 0)
@@ -0,0 +1,35 @@
+#include "filetype.hh"
+
+#include <mln/value/int_u12.hh>
+#include <mln/level/stretch.hh>
+
+
+
+void usage(char* argv[])
+{
+ std::cerr << "usage: " << argv[0] << " input.dump output.dump" << std::endl;
+ std::cerr << " The input dump file contains 12 bit unsigned 3D data." << std::endl;
+ std::cerr << " The output dump file reduces the dynamics to 8 bit." << std::endl;
+ abort();
+}
+
+
+
+int main(int argc, char* argv[])
+{
+ using namespace mln;
+
+ if (argc != 3)
+ usage(argv);
+
+ trace::entering("main");
+
+ image3d<value::int_u12> vol;
+ io::dump::load(vol, argv[1]);
+
+ using value::int_u8;
+ image3d<int_u8> out = level::stretch(int_u8(), vol);
+ io::dump::save(out, argv[2]);
+
+ trace::exiting("main");
+}