Commit 59a2eecd authored by Jerome Galtier's avatar Jerome Galtier
Browse files

=== Update Documentation ===

	* doc/HACKING.txt: Add guidelines.
	* doc/README.txt: Update requirements.

=== Sanitize VCSN_GRAPH_IMPL uses ===

As suggested by the documentation, the VCSN_GRAPH_IMPL macro has
been removed from sensitive locations. As a side effect, it fixes
vaucanson compilation with ICC. The two blockers were the
generalized traits, and the need by some rational expression
functions to construct an automaton type from scratch (hence the
new standard_of_traits).

	* include/Makefile.am: Remove files from the distribution.
	* lib/generate_libvcsn.rb: Update filters, and remove GenAutomaton
	  restrictions.
	* include/generate_headers.sh: New facility to declare common
	  traits.
	* include/vaucanson/algebra/implementation/series/krat.hxx: Improve
	  code indentation and use the new standard_of_traits.
	* include/vaucanson/automata/concept/automata_base.hh: Add two new
	  traits makers.
	* include/vaucanson/automata/concept/automata_base.hxx: Move
	  generalized() here.
	* src/tests/test-suites/algebra_series_krat_bool_string.defs,
	* src/tests/test-suites/algebra_series_krat_double_string.defs,
	* src/tests/test-suites/algebra_series_krat_int_string.defs: Add code
	  to include standard_of_traits, as ratexp do not have context headers.
	* include/vaucanson/automata/implementation/bmig_graph_impl.hh,
	* include/vaucanson/automata/implementation/listg_graph_impl.hh: Use
	  updated generalized traits.

Remove obsolete headers.

	* include/vaucanson/automata/implementation/generalized.hh: Remove.
	* include/vaucanson/automata/implementation/generalized.hxx: Remove.
	* vaucanswig/meta/vaucanswig_algo_common.i,
	* vaucanswig/meta/vaucanswig_automaton.i,
	* vaucanswig/meta/vaucanswig_context.i,
	* src/tests/include/tests/automata/algos/freemonoid_labeled_graphs/generalized_test.hh,
	* src/tests/include/tests/automata/algos/label_aware_graphs/concat_test.hh,
	* src/tests/include/tests/automata/algos/label_aware_graphs/cut_up_test.hh,
	* src/tests/include/tests/automata/algos/label_aware_graphs/in_concat_test.hh,
	* src/tests/include/tests/automata/algos/label_aware_graphs/sum_test.hh,
	* src/tests/include/tests/automata/algos/labeled_graphs/elimination_dmheuristic_test.hh,
	* src/tests/include/tests/automata/algos/labeled_graphs/elimination_heuristic_test.hh,
	* src/tests/include/tests/automata/algos/labeled_graphs/elimination_random_test.hh,
	* src/tests/include/tests/automata/algos/labeled_graphs/elimination_test.hh,
	* src/tests/include/tests/automata/algos/letter_combination_labeled_graphs/product_test.hh,
	* include/vaucanson/contexts/automaton.thh,
	* include/vaucanson/contexts/automaton_functions.thh,
	* include/vaucanson/contexts/automaton_maker.thxx: Here.

=== Update INTERFACE for some algorithms ===

Remove known not to be implemented interfaces.

	* include/vaucanson/algorithms/accessible.hh,
	* include/vaucanson/algorithms/complete.hh,
	* include/vaucanson/algorithms/concatenate.hh,
	* include/vaucanson/algorithms/cut_up.hh,
	* include/vaucanson/algorithms/eps_removal.hh,
	* include/vaucanson/algorithms/eps_removal_sp.hh,
	* include/vaucanson/algorithms/eval.hh,
	* include/vaucanson/algorithms/has_succ_comp.hh,
	* include/vaucanson/algorithms/is_empty.hh,
	* include/vaucanson/algorithms/isomorph.hh,
	* include/vaucanson/algorithms/product.hh,
	* include/vaucanson/algorithms/sub_automaton.hh,
	* include/vaucanson/algorithms/sum.hh,
	* include/vaucanson/algorithms/transpose.hh,
	* include/vaucanson/algorithms/trim.hh: Here.

	* include/vaucanson/algorithms/aut_to_exp.hh,
	* include/vaucanson/algorithms/internal/has_neighbour.hh,
	* include/vaucanson/algorithms/krat_exp_expand.hh,
	* include/vaucanson/algorithms/normalized.hh,
	* include/vaucanson/algorithms/realtime.hh,
	* include/vaucanson/algorithms/realtime_decl.hh,
	* include/vaucanson/algorithms/thompson.hh: Update interface and
	  remove comment on VCSN_USE_LIB.

=== Miscellaneous ===

	* include/vaucanson/algorithms/aut_to_exp.hxx: Improve code
	  indentation.
	* include/vaucanson/algorithms/krat_exp_expand.hxx: Move do_expand
	  and expand to the vcsn namespace.
parent 77ca9e24
2008-09-01 Jerome Galtier <jerome.galtier@lrde.epita.fr>
=== Update Documentation ===
* doc/HACKING.txt: Add guidelines.
* doc/README.txt: Update requirements.
=== Sanitize VCSN_GRAPH_IMPL uses ===
As suggested by the documentation, the VCSN_GRAPH_IMPL macro has
been removed from sensitive locations. As a side effect, it fixes
vaucanson compilation with ICC. The two blockers were the
generalized traits, and the need by some rational expression
functions to construct an automaton type from scratch (hence the
new standard_of_traits).
* include/Makefile.am: Remove files from the distribution.
* lib/generate_libvcsn.rb: Update filters, and remove GenAutomaton
restrictions.
* include/generate_headers.sh: New facility to declare common
traits.
* include/vaucanson/algebra/implementation/series/krat.hxx: Improve
code indentation and use the new standard_of_traits.
* include/vaucanson/automata/concept/automata_base.hh: Add two new
traits makers.
* include/vaucanson/automata/concept/automata_base.hxx: Move
generalized() here.
* src/tests/test-suites/algebra_series_krat_bool_string.defs,
* src/tests/test-suites/algebra_series_krat_double_string.defs,
* src/tests/test-suites/algebra_series_krat_int_string.defs: Add code
to include standard_of_traits, as ratexp do not have context headers.
* include/vaucanson/automata/implementation/bmig_graph_impl.hh,
* include/vaucanson/automata/implementation/listg_graph_impl.hh: Use
updated generalized traits.
Remove obsolete headers.
* include/vaucanson/automata/implementation/generalized.hh: Remove.
* include/vaucanson/automata/implementation/generalized.hxx: Remove.
* vaucanswig/meta/vaucanswig_algo_common.i,
* vaucanswig/meta/vaucanswig_automaton.i,
* vaucanswig/meta/vaucanswig_context.i,
* src/tests/include/tests/automata/algos/freemonoid_labeled_graphs/generalized_test.hh,
* src/tests/include/tests/automata/algos/label_aware_graphs/concat_test.hh,
* src/tests/include/tests/automata/algos/label_aware_graphs/cut_up_test.hh,
* src/tests/include/tests/automata/algos/label_aware_graphs/in_concat_test.hh,
* src/tests/include/tests/automata/algos/label_aware_graphs/sum_test.hh,
* src/tests/include/tests/automata/algos/labeled_graphs/elimination_dmheuristic_test.hh,
* src/tests/include/tests/automata/algos/labeled_graphs/elimination_heuristic_test.hh,
* src/tests/include/tests/automata/algos/labeled_graphs/elimination_random_test.hh,
* src/tests/include/tests/automata/algos/labeled_graphs/elimination_test.hh,
* src/tests/include/tests/automata/algos/letter_combination_labeled_graphs/product_test.hh,
* include/vaucanson/contexts/automaton.thh,
* include/vaucanson/contexts/automaton_functions.thh,
* include/vaucanson/contexts/automaton_maker.thxx: Here.
=== Update INTERFACE for some algorithms ===
Remove known not to be implemented interfaces.
* include/vaucanson/algorithms/accessible.hh,
* include/vaucanson/algorithms/complete.hh,
* include/vaucanson/algorithms/concatenate.hh,
* include/vaucanson/algorithms/cut_up.hh,
* include/vaucanson/algorithms/eps_removal.hh,
* include/vaucanson/algorithms/eps_removal_sp.hh,
* include/vaucanson/algorithms/eval.hh,
* include/vaucanson/algorithms/has_succ_comp.hh,
* include/vaucanson/algorithms/is_empty.hh,
* include/vaucanson/algorithms/isomorph.hh,
* include/vaucanson/algorithms/product.hh,
* include/vaucanson/algorithms/sub_automaton.hh,
* include/vaucanson/algorithms/sum.hh,
* include/vaucanson/algorithms/transpose.hh,
* include/vaucanson/algorithms/trim.hh: Here.
* include/vaucanson/algorithms/aut_to_exp.hh,
* include/vaucanson/algorithms/internal/has_neighbour.hh,
* include/vaucanson/algorithms/krat_exp_expand.hh,
* include/vaucanson/algorithms/normalized.hh,
* include/vaucanson/algorithms/realtime.hh,
* include/vaucanson/algorithms/realtime_decl.hh,
* include/vaucanson/algorithms/thompson.hh: Update interface and
remove comment on VCSN_USE_LIB.
=== Miscellaneous ===
* include/vaucanson/algorithms/aut_to_exp.hxx: Improve code
indentation.
* include/vaucanson/algorithms/krat_exp_expand.hxx: Move do_expand
and expand to the vcsn namespace.
2008-08-27 Jerome Galtier <jerome.galtier@lrde.epita.fr>
=== New letter traits ===
......
......@@ -63,3 +63,15 @@ argument of an algorithm::
Element<A, AI1>
algorithm(const Element<A, AI1>& a1, const Element<A, AI2>& a2>);
Macros to handle with care
==========================
The VCSN_GRAPH_IMPL macro must only appear in three locations:
- include/vaucanson/context
- include/vaucanson/automata/generic_contexts
- include/vaucanson/misc/usual_macros.hh (be careful when
defining new macros using it)
Any other use is irrelevant and may be very harmful. Moreover this
macro must never be used in a file with guards.
......@@ -160,12 +160,12 @@ vaucanswig
Requirements
============
Vaucanson was tested with the `GNU C++ Compiler (GCC)`_ version 4.1.x
and 4.2.x, and should work with ICC_ 9. The code is fully compliant
Vaucanson was tested with the `GNU Compiler Collection (GCC)`_ version 4.1.x
and 4.2.x, and with ICC_ version 9 and 10.1. The code is fully compliant
with the ISO C++ standard (ISO-IEC 14882) to permit a higher
portability in the future.
.. _GNU C++ Compiler (GCC): http://gcc.gnu.org/
.. _GNU Compiler Collection (GCC): http://gcc.gnu.org/
.. _ICC: http://www.intel.com/software/products/compilers/
High verbose mode of the testing suites uses the AT&T dot format to
......
## Vaucanson, a generic library for finite state machines.
## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The Vaucanson Group.
## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The Vaucanson
## Group.
##
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
......@@ -497,8 +498,6 @@ vaucanson/automata/implementation/bmig_graph_impl.hh \
vaucanson/automata/implementation/bmig_graph_impl.hxx \
vaucanson/automata/implementation/bmig_graph_letters_spec.hh \
vaucanson/automata/implementation/bmig_graph_letters_spec.hxx \
vaucanson/automata/implementation/generalized.hh \
vaucanson/automata/implementation/generalized.hxx \
vaucanson/automata/implementation/geometry.hh \
vaucanson/automata/implementation/geometry.hxx \
vaucanson/automata/implementation/listg/iterator.hh \
......
......@@ -36,6 +36,19 @@ namespace vcsn
EOF
}
write_common_traits()
{
cat >> $1 <<-EOF
# if !defined(COMMON_TRAITS)
# define COMMON_TRAITS
namespace vcsn
{
VCSN_MAKE_STANDARD_OF_TRAITS(vcsn::VCSN_DEFAULT_GRAPH_IMPL::Graph);
}
# endif
EOF
}
insert_specific_alias()
{
if [ "$2" = "boolean_transducer" ]; then
......@@ -69,6 +82,7 @@ EOF
write_namespace_alias $fullname $context false
insert_specific_alias $fullname $context false
write_common_traits $fullname
cat >> $fullname <<-EOF
#endif // !$UpperName
......
......@@ -32,26 +32,19 @@
/** @} */
// INTERFACE: HList accessible_states(const Automaton& a) { return list_of_set(vcsn::accessible_states(*a)); }
// INTERFACE: HList accessible_states(const GenAutomaton& a) { return list_of_set(vcsn::accessible_states(*a)); }
// INTERFACE: Automaton accessible(const Automaton& a) { return vcsn::accessible(*a); }
// INTERFACE: GenAutomaton accessible(const GenAutomaton& a) { return vcsn::accessible(*a); }
// INTERFACE: void accessible_here(Automaton& a) { return vcsn::accessible_here(*a); }
// INTERFACE: void accessible_here(GenAutomaton& a) { return vcsn::accessible_here(*a); }
// INTERFACE: HList coaccessible_states(const Automaton& a) { return list_of_set(vcsn::coaccessible_states(*a)); }
// INTERFACE: HList coaccessible_states(const GenAutomaton& a) { return list_of_set(vcsn::coaccessible_states(*a)); }
// INTERFACE: Automaton coaccessible(const Automaton& a) { return vcsn::coaccessible(*a); }
// INTERFACE: GenAutomaton coaccessible(const GenAutomaton& a) { return vcsn::coaccessible(*a); }
// INTERFACE: void coaccessible_here(Automaton& a) { return vcsn::coaccessible_here(*a); }
// INTERFACE: void coaccessible_here(GenAutomaton& a) { return vcsn::coaccessible_here(*a); }
# include <vaucanson/design_pattern/design_pattern.hh>
# include <vaucanson/automata/concept/automata.hh>
//# include <vaucanson/automata/concept/handlers.hh>
# include <set>
......
......@@ -30,6 +30,7 @@
/** @} */
// INTERFACE: Exp aut_to_exp(const GenAutomaton& a) { return vcsn::aut_to_exp(*a); }
// INTERFACE: Exp aut_to_exp(const GenAutomaton& a, const vcsn::DMChooser& b) { return vcsn::aut_to_exp(*a, b); }
# include <vaucanson/design_pattern/design_pattern.hh>
# include <vaucanson/automata/concept/automata_base.hh>
......@@ -158,12 +159,7 @@ namespace vcsn {
} // vcsn
// FIXME: libvcsn and taf-kit undefined reference related bug
// this should be the correct one, should be fixed with:
// - the correct INTERFACE tag
// - a generation script that do not use INTERFACE tag
//# if !defined VCSN_USE_INTERFACE_ONLY && !defined VCSN_USE_LIB
# if !defined VCSN_USE_INTERFACE_ONLY
# if !defined VCSN_USE_INTERFACE_ONLY && !defined VCSN_USE_LIB
# include <vaucanson/algorithms/aut_to_exp.hxx>
# endif // VCSN_USE_INTERFACE_ONLY
......
......@@ -36,9 +36,9 @@
namespace vcsn {
/*---------------.
| DefaultChooser |
`---------------*/
/*---------------.
| DefaultChooser |
`---------------*/
template <class Auto_>
typename Auto_::hstate_t
......@@ -54,7 +54,6 @@ namespace vcsn {
return *s;
}
/*--------------.
| RandomChooser |
`--------------*/
......@@ -97,156 +96,151 @@ namespace vcsn {
return *k;
}
/*----------------------------.
| Heuristic chooser: |
| Transition Number Heuristic |
`----------------------------*/
/*----------------------------.
| Heuristic chooser: |
| Transition Number Heuristic |
`----------------------------*/
template <class Auto_>
typename Auto_::hstate_t
HChooser::operator()(const Auto_& a) const
{
assertion(a.states().size() > 0);
template <class Auto_>
typename Auto_::hstate_t
HChooser::operator()(const Auto_& a) const
{
assertion(a.states().size() > 0);
std::list<typename Auto_::htransition_t> delta_in;
std::list<typename Auto_::htransition_t> delta_out;
std::list<typename Auto_::htransition_t> delta_in;
std::list<typename Auto_::htransition_t> delta_out;
typename Auto_::state_iterator s = a.states().begin();
unsigned int d_in = 0;
unsigned int d_out = 0;
unsigned int max = UINT_MAX;
bool has_loop = false;
bool has_loop_old = false;
typename Auto_::state_iterator s = a.states().begin();
unsigned int d_in = 0;
unsigned int d_out = 0;
unsigned int max = UINT_MAX;
bool has_loop = false;
bool has_loop_old = false;
for (typename Auto_::state_iterator i = a.states().begin();
i != a.states().end();
++i)
{
if (a.is_final(*i) || a.is_initial(*i))
continue;
has_loop = false;
a.deltac(delta_out, *i, delta_kind::transitions());
a.rdeltac(delta_in, *i, delta_kind::transitions());
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
has_loop = true;
//FIXME : If the state has several loops
if (has_loop)
d_in = delta_in.size() - 1;
else
d_in = delta_in.size();
d_out = delta_out.size();
//We prefer to delete a state that has no loop transition
if (d_in * d_out < max ||
(d_in * d_out == max &&
has_loop_old && not has_loop))
{
s = i;
max = d_in * d_out;
has_loop_old = has_loop;
}
delta_out.clear();
delta_in.clear();
}
return *s;
for (typename Auto_::state_iterator i = a.states().begin();
i != a.states().end();
++i)
{
if (a.is_final(*i) || a.is_initial(*i))
continue;
has_loop = false;
a.deltac(delta_out, *i, delta_kind::transitions());
a.rdeltac(delta_in, *i, delta_kind::transitions());
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
has_loop = true;
//FIXME : If the state has several loops
if (has_loop)
d_in = delta_in.size() - 1;
else
d_in = delta_in.size();
d_out = delta_out.size();
//We prefer to delete a state that has no loop transition
if (d_in * d_out < max ||
(d_in * d_out == max &&
has_loop_old && not has_loop))
{
s = i;
max = d_in * d_out;
has_loop_old = has_loop;
}
delta_out.clear();
delta_in.clear();
}
return *s;
}
/*-------------------------.
| Heuristic chooser: |
| from Delgado & Morais |
| (Proposed in CIAA 2004) |
`-------------------------*/
template <class Auto_>
typename Auto_::hstate_t
DMChooser::operator()(const Auto_& a) const
{
assertion(a.states().size() > 0);
| Heuristic chooser: |
| from Delgado & Morais |
| (Proposed in CIAA 2004) |
`-------------------------*/
template <class Auto_>
typename Auto_::hstate_t
DMChooser::operator()(const Auto_& a) const
{
assertion(a.states().size() > 0);
std::list<typename Auto_::htransition_t> delta_in;
std::list<typename Auto_::htransition_t> delta_out;
typename Auto_::state_iterator s = a.states().begin();
std::list<typename Auto_::htransition_t> delta_in;
std::list<typename Auto_::htransition_t> delta_out;
typename Auto_::state_iterator s = a.states().begin();
int weight_min = INT_MAX;
for (typename Auto_::state_iterator i = a.states().begin();
i != a.states().end();
++i)
int weight_min = INT_MAX;
for (typename Auto_::state_iterator i = a.states().begin();
i != a.states().end();
++i)
{
if (a.is_final(*i) || a.is_initial(*i))
continue;
unsigned int n_loops = 0;
unsigned int in = 0;
unsigned int out = 0;
int weight = 0;
delta_in.clear();
delta_out.clear();
a.deltac(delta_out, *i, delta_kind::transitions());
a.rdeltac(delta_in, *i, delta_kind::transitions());
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
++n_loops;
in = delta_in.size() - n_loops;
out = delta_out.size() - n_loops;
// Compute SUM(Win(k) * (Out - 1))
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_in.begin();
j != delta_in.end();
++j)
if (*i != a.dst_of(*j))
{
if (a.is_final(*i) || a.is_initial(*i))
continue;
unsigned int n_loops = 0;
unsigned int in = 0;
unsigned int out = 0;
int weight = 0;
delta_in.clear();
delta_out.clear();
a.deltac(delta_out, *i, delta_kind::transitions());
a.rdeltac(delta_in, *i, delta_kind::transitions());
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
++n_loops;
in = delta_in.size() - n_loops;
out = delta_out.size() - n_loops;
// Compute SUM(Win(k) * (Out - 1))
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_in.begin();
j != delta_in.end();
++j)
if (*i != a.dst_of(*j))
{
weight += a.series_value_of(*j).length() * (out - 1);
}
// Compute SUM(Wout(k) * (In - 1))
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i != a.dst_of(*j))
{
weight += a.series_value_of(*j).length() * (in - 1);
}
// Compute Wloop * (In * Out - 1)
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
{
weight += a.series_value_of(*j).length() * (in * out - 1);
}
if (weight < weight_min)
{
s = i;
weight_min = weight;
}
weight += a.series_value_of(*j).length() * (out - 1);
}
return *s;
}
// Compute SUM(Wout(k) * (In - 1))
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i != a.dst_of(*j))
{
weight += a.series_value_of(*j).length() * (in - 1);
}
// Compute Wloop * (In * Out - 1)
for (typename std::list<typename Auto_::htransition_t>::iterator j = delta_out.begin();
j != delta_out.end();
++j)
if (*i == a.dst_of(*j))
{
weight += a.series_value_of(*j).length() * (in * out - 1);
}
if (weight < weight_min)
{
s = i;
weight_min = weight;
}
}
return *s;
}
/*------------.
| ListChooser |
`------------*/
| ListChooser |
`------------*/
inline ListChooser::ListChooser(const std::list<unsigned int>& l) :
list_(l),
pos_(l.begin())
list_(l),
pos_(l.begin())
{
}
......@@ -258,11 +252,9 @@ namespace vcsn {
return a.get_state(*pos_++);
}
/*-----------.
| aut_to_exp |
`-----------*/
| aut_to_exp |
`-----------*/
template <class A, typename AI, typename Chooser>
typename Element<A, AI>::series_set_elt_t
......@@ -347,8 +339,8 @@ namespace vcsn {
}
/*-----------.
| aut_to_exp |
`-----------*/
| aut_to_exp |
`-----------*/
template<typename A, typename AI, typename Chooser>
typename Element<A, AI>::series_set_elt_t
......
......@@ -29,13 +29,10 @@
/** @} */
// INTERFACE: void complete_here(Automaton& a) { return vcsn::complete_here(*a); }
// INTERFACE: void complete_here(GenAutomaton& a) { return vcsn::complete_here(*a); }
// INTERFACE: Automaton complete(const Automaton& a) { return vcsn::complete(*a); }
// INTERFACE: GenAutomaton complete(const GenAutomaton& a) { return vcsn::complete(*a); }
// INTERFACE: bool is_complete(const Automaton& a) { return vcsn::is_complete(*a); }
// INTERFACE: bool is_complete(const GenAutomaton& a) { return vcsn::is_complete(*a); }
# include <vaucanson/design_pattern/design_pattern.hh>
......
......@@ -31,10 +31,8 @@
/** @} */
// INTERFACE: Automaton concatenate(const Automaton& a1, const Automaton& a2) { return vcsn::concatenate(*a1, *a2); }
// INTERFACE: GenAutomaton concatenate(const GenAutomaton& a1, const GenAutomaton& a2) { return vcsn::concatenate(*a1, *a2); }
// INTERFACE: void concatenate_here(Automaton& a1, const Automaton& a2) { return vcsn::concatenate_here(*a1, *a2); }
// INTERFACE: void concatenate_here(GenAutomaton& a1, const GenAutomaton& a2) { return vcsn::concatenate_here(*a1, *a2); }
# include <vaucanson/design_pattern/design_pattern.hh>
......
......@@ -26,11 +26,10 @@
*/
# include <vaucanson/automata/concept/copy.hh>
# include <vaucanson/automata/implementation/generalized.hh>
# include <vaucanson/algebra/implementation/series/rat/nodes.hh>
# include <vaucanson/algebra/implementation/series/generalized.hh>
# include <vaucanson/algorithms/standard_of.hh>
namespace vcsn
{
......
......@@ -31,22 +31,16 @@
// INTERFACE: void forward_eps_removal_here(Automaton& a) { return vcsn::forward_eps_removal_here(*a); }
// INTERFACE: void forward_eps_removal_here(GenAutomaton& a) { return vcsn::forward_eps_removal_here(*a); }
// INTERFACE: Automaton forward_eps_removal(const Automaton& a) { return vcsn::forward_eps_removal(*a); }
// INTERFACE: GenAutomaton forward_eps_removal(const GenAutomaton& a) { return vcsn::forward_eps_removal(*a); }
// INTERFACE: void backward_eps_removal_here(Automaton& a) { return vcsn::backward_eps_removal_here(*a); }
// INTERFACE: void backward_eps_removal_here(GenAutomaton& a) { return vcsn::backward_eps_removal_here(*a); }
// INTERFACE: Automaton backward_eps_removal(const Automaton& a) { return vcsn::backward_eps_removal(*a); }
// INTERFACE: GenAutomaton backward_eps_removal(const GenAutomaton& a) { return vcsn::backward_eps_removal(*a); }