* tools/simple_point3d_lut_26_6.cc: New. * tools/test_simple_point3d_lut_26_6.cc: New. * tools/tools.mk (AM_CPPFLAGS): Add -I$(top_builddir)/milena. * tools/Makefile.am (noinst_LTLIBRARIES): New. Add libsimple_point3d_lut_26_6.la. (libsimple_point3d_lut_26_6_la_SOURCES): New. (EXTRA_PROGRAMS): Add test_simple_point3d_lut_26_6. (test_simple_point3d_lut_26_6_SOURCES) (test_simple_point3d_lut_26_6_LDADD): New. --- milena/ChangeLog | 15 ++ milena/tools/Makefile.am | 10 ++ .../simple_point3d_lut_26_6.cc} | 13 +-- milena/tools/test_simple_point3d_lut_26_6.cc | 136 ++++++++++++++++++++ milena/tools/tools.mk | 6 +- 5 files changed, 168 insertions(+), 12 deletions(-) copy milena/{tests/value/int_u32.cc => tools/simple_point3d_lut_26_6.cc} (84%) create mode 100644 milena/tools/test_simple_point3d_lut_26_6.cc diff --git a/milena/ChangeLog b/milena/ChangeLog index 1df7452..9c667b6 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,5 +1,20 @@ 2011-07-12 Roland Levillain <roland@lrde.epita.fr> + Check the consistency of tools/simple_point3d_lut_26_6.hh. + + * tools/simple_point3d_lut_26_6.cc: New. + * tools/test_simple_point3d_lut_26_6.cc: New. + * tools/tools.mk (AM_CPPFLAGS): Add -I$(top_builddir)/milena. + * tools/Makefile.am (noinst_LTLIBRARIES): New. + Add libsimple_point3d_lut_26_6.la. + (libsimple_point3d_lut_26_6_la_SOURCES): New. + (EXTRA_PROGRAMS): Add test_simple_point3d_lut_26_6. + (test_simple_point3d_lut_26_6_SOURCES) + (test_simple_point3d_lut_26_6_LDADD): + New. + +2011-07-12 Roland Levillain <roland@lrde.epita.fr> + Fix and improve the (fast) computation of 2D connectivity numbers. * mln/topo/is_simple_2d.hh (mln::connectivity_number_2d): Create diff --git a/milena/tools/Makefile.am b/milena/tools/Makefile.am index b93d92b..6caec62 100644 --- a/milena/tools/Makefile.am +++ b/milena/tools/Makefile.am @@ -73,3 +73,13 @@ simple_point3d_lut_26_6.hh: simple_point3d_lut_26_6.txt $(srcdir)/gen_cxx_lut rm -f $@.tmp $(srcdir)/gen_cxx_lut simple_point3d_lut_26_6 "(26, 6)" <$< >$@.tmp mv $@.tmp $@ + +# Very long (both to compile and execute) optional test, checking the +# consistency of the LUT in simple_point3d_lut_26_6.hh. Moreover, it +# should be turned into a parallel program. +noinst_LTLIBRARIES = libsimple_point3d_lut_26_6.la +libsimple_point3d_lut_26_6_la_SOURCES = \ + simple_point3d_lut_26_6.hh simple_point3d_lut_26_6.cc +EXTRA_PROGRAMS += test_simple_point3d_lut_26_6 +test_simple_point3d_lut_26_6_SOURCES = test_simple_point3d_lut_26_6.cc +test_simple_point3d_lut_26_6_LDADD = libsimple_point3d_lut_26_6.la diff --git a/milena/tests/value/int_u32.cc b/milena/tools/simple_point3d_lut_26_6.cc similarity index 84% copy from milena/tests/value/int_u32.cc copy to milena/tools/simple_point3d_lut_26_6.cc index 61eb6e5..8fb24c6 100644 --- a/milena/tests/value/int_u32.cc +++ b/milena/tools/simple_point3d_lut_26_6.cc @@ -24,14 +24,7 @@ // executable file might be covered by the GNU General Public License. /// \file -/// \brief Exercise mln::value::int_u32. +/// \brief A C++ source file to produce a compiled version of +/// tools/simple_point3d_lut_26_6.hh. -#include <iostream> -#include <mln/value/int_u32.hh> - -int main() -{ - // FIXME: This traits return `-1'. - std::cerr << mln::trait::value_<mln::value::int_u<32u> >::max() - << std::endl; -} +#include <tools/simple_point3d_lut_26_6.hh> diff --git a/milena/tools/test_simple_point3d_lut_26_6.cc b/milena/tools/test_simple_point3d_lut_26_6.cc new file mode 100644 index 0000000..c3afb23 --- /dev/null +++ b/milena/tools/test_simple_point3d_lut_26_6.cc @@ -0,0 +1,136 @@ +// Copyright (C) 2011 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +#include <mln/core/image/image3d.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/make/box3d.hh> + +#include "tools/connectivity_numbers_3d.hh" + +// To avoid heavy recompilation times due to the huge size of the +// look-up table, only fetch the table's declaration. Its +// implementation is compiled separately and linked to this program. +#define MLN_INCLUDE_ONLY +# include "tools/simple_point3d_lut_26_6.hh" +#undef MLN_INCLUDE_ONLY + + +int +main() +{ + using namespace mln; + + // FIXME: This part is very similar to + // milena/tests/topo/connectivity_numbers_2d.cc and + // milena/tools/connectivity_numbers_3d.hh. Factor. + + typedef image3d<bool> I; + // B must be a model of mln::Box. + typedef mln_domain_(I) B; + typedef mln_psite_(I) P; + + B b = make::box3d(-1,-1,-1, 1,1,1); + I fg_ima(b, 0); + I bg_ima(b, 0); + P p(0, 0, 0); + + const unsigned dim = 3; + const unsigned max_nneighbs = mlc_pow_int(3, dim) - 1; + const unsigned nconfigs = mlc_pow_int(2, max_nneighbs); + + typedef neighb3d N; + N nbh = c26(); + + int exit_status = EXIT_SUCCESS; + + for (config_3d_t i = 0; i < nconfigs; ++i) + { + /* Create the local i-th configuration around P. + + Note that the value corresponding to P is always `false', to + prevent the connection of two components through P. */ + data::fill(fg_ima, false); + data::fill(bg_ima, false); + config_3d_t tmp = i; + mln_fwd_niter_(N) n(nbh, p); + for_all(n) + { + if (tmp % 2) + fg_ima(n) = true; + else + bg_ima(n) = true; + tmp = tmp >> 1; + } + + // Compute the simple point criterion for (26, 6)-connectivity + conn_number_t conn_number_fg = connectivity_number_3d__26_6_one(fg_ima); + conn_number_t conn_number_bg = connectivity_number_3d__6_26_one(bg_ima); + bool conn_number_computed = conn_number_fg == 1 &&conn_number_bg == 1; + + + // Retrieve the simple point criterion for (26, 6)-connectivity + // number using the LUT. + conn_number_t conn_number_from_lut; + { + // ``Unpack'' the i-th value. + + // FIXME: Redundant with some code from + // mln/topo/is_simple_point3d.hh. + + size_t pos = i; + + /* `simple_point3d_lut_26_6' is a packed bit array. We must + first retrieve the cell ``containing'' the index `pos'. */ + size_t cell = pos / 8; + /* FIXME: We use hard-coded neighborhoods here instead of using + nbh_fg_ and nbh_bg_ (for this first test version). */ + unsigned char pack = mln::topo::simple_point3d_lut_26_6[cell]; + + /* Compute the position of the neighborhood configuration within + the packed set of valued and create a mask corresponding to + this position (offset). */ + size_t offset = pos % 8; + unsigned char mask = 1 << offset; + + /* If the pack contains a 1 at position `offset', then `pack & + mask' is a non-null value. Otherwise it is zero. We can + therefore use it to create a boolean return value. */ + bool result = pack & mask; + conn_number_from_lut = result; + } + + // Compare them. + if (conn_number_computed != conn_number_from_lut) + { + std::cout + << "Inconsistency for the " << i << "-th configuration: " + << conn_number_computed << " != " << conn_number_from_lut + << std::endl; + exit_status = EXIT_FAILURE; + } + } + + return exit_status; +} diff --git a/milena/tools/tools.mk b/milena/tools/tools.mk index 9d9a046..878c687 100644 --- a/milena/tools/tools.mk +++ b/milena/tools/tools.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE) +# Copyright (C) 2009, 2011 EPITA Research and Development Laboratory (LRDE) # # This file is part of Olena. # @@ -17,8 +17,10 @@ ## FIXME: Revamp (see Olena 0.11's test suite). -# Look for Milena header in srcdir. +# Look for Milena headers in srcdir. AM_CPPFLAGS = -I$(top_srcdir)/milena +# Look for Milena headers in builddir. +AM_CPPFLAGS += -I$(top_builddir)/milena # FIXME: Add # -- 1.7.2.5