17 #ifndef VCSN_ALGORITHMS_EXTENSION_HXX
18 # define VCSN_ALGORITHMS_EXTENSION_HXX
21 # include <vaucanson/misc/usual_macros.hh>
25 template <
typename S,
typename K,
typename T,
typename Auto_t>
26 typename identity_transducer_helper<S, K, T>::ret
27 do_extension(
const AutomataBase<S>& s,
30 AUTOMATON_TYPES(Auto_t);
32 typedef typename identity_transducer_helper<S, K, T>::ret ret_t;
34 AUTOMATON_TYPES_(ret_t, t_);
35 typedef typename ret_t::set_t set_t;
36 typedef typename set_t::series_set_t o_series_set_t;
37 typedef typename ret_t::series_set_elt_t output_series_set_elt_t;
38 typedef typename series_set_elt_t::support_t support_t;
41 ts(o_series_set_t (a.structure().series(),
42 a.structure().series().monoid()));
45 monoid_elt_t neutre = a.series().monoid().VCSN_EMPTY_;
46 monoid_elt_t t_neutre = t_ret.series().monoid().
49 std::vector<hstate_t> conv(a.states().size());
51 for_all_const_states (s, a)
52 conv[t_ret.add_state()] = *s;
54 for_all_const_transitions (e, a)
56 series_set_elt_t t = a.series_of(*e);
57 series_set_elt_t s(t);
58 output_series_set_elt_t os(t_ret.structure().series());
59 support_t supp = s.supp();
60 for_all_const_(support_t, m, supp)
62 series_set_elt_t tmp(a.structure().series());
65 tmp.assoc(neutre, s.get(*m));
68 htransition_t f = t_ret.add_series_transition(conv[a.src_of(*e)],
74 for (initial_iterator next = a.initial().begin();
75 next != a.initial().end();)
84 series_set_elt_t a_series = a.get_initial(*i);
86 s.set(t_neutre, a_series);
87 t_ret.set_initial(conv[*i], s);
91 for (final_iterator next = a.final().begin();
92 next != a.final().end();)
100 series_set_elt_t a_series = a.get_final(*f);
101 t_series_set_elt_t s;
102 s.value_set(t_neutre, a_series);
103 t_ret.set_final(conv[*f], s);
109 template<
typename S,
typename K,
typename T>
110 typename identity_transducer_helper<S, K, T>::ret
113 BENCH_TASK_SCOPED(
"extension/1");
123 template<
typename SA,
typename ST,
typename Auto_t,
typename Trans_t>
124 Trans_t do_extension(
const AutomataBase<SA>&,
125 const TransducerBase<ST>&,
129 AUTOMATON_TYPES_(Trans_t, t_);
130 AUTOMATON_TYPES_(Auto_t, a_);
131 typedef typename Auto_t::hstate_t hstate_t;
132 typedef typename Trans_t::series_set_elt_t t_output_series_set_elt_t;
133 typedef typename Auto_t::series_set_elt_t::support_t a_support_t;
134 typedef typename Trans_t::semiring_elt_t t_weight_t;
136 Trans_t tt(t.structure());
137 std::map<hstate_t, hstate_t> conv;
139 a_monoid_elt_t a_neutre =
140 a.series().monoid().identity(
SELECT(
typename a_monoid_elt_t::value_t));
141 t_monoid_elt_t t_neutre =
142 t.series().monoid().identity(
SELECT(
typename t_monoid_elt_t::value_t));
144 for(a_state_iterator p = a.states().begin(); p != a.states().end(); ++p)
145 conv[*p] = tt.add_state();
148 for(a_transition_iterator e = a.transitions().begin();
149 e != a.transitions().end(); ++e)
151 a_series_set_elt_t s_ = a.series_of(*e);
152 a_series_set_elt_t s(s_);
154 t_output_series_set_elt_t os(t.structure().series());
156 a_support_t supp = s.supp();
157 for(
typename a_support_t::const_iterator m = supp.begin();
158 m != supp.end(); ++m)
160 t_weight_t tmp(t.structure().series().semiring());
161 tmp.assoc(a_neutre, s.get(*m));
162 os.assoc(a_monoid_elt_t (a.structure().series().monoid(), *m), tmp);
165 tt.add_series_transition(conv[a.src_of(*e)], conv[a.dst_of(*e)], os);
168 a_initial_iterator i;
169 for (a_initial_iterator next = a.initial().begin();
170 next != a.initial().end();)
178 a_series_set_elt_t a_series = a.get_initial(*i);
179 t_series_set_elt_t s (t.structure().series());
180 s.assoc(t_neutre, a_series);
181 tt.set_initial(conv[*i], s);
185 for (a_final_iterator next = a.final().begin();
186 next != a.final().end();)
194 a_series_set_elt_t a_series = a.get_final(*f);
195 t_series_set_elt_t s (t.structure().series());
196 s.assoc(t_neutre, a_series);
197 tt.set_final(conv[*f], s);
203 template<
typename SA,
typename TA,
typename ST,
typename TT>
207 BENCH_TASK_SCOPED(
"extension/2");
213 #endif // ! VCSN_ALGORITHMS_EXTENSION_HXX