00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_RW_COMPOSITION_HXX
00018 # define VCSN_ALGORITHMS_RW_COMPOSITION_HXX
00019
00020 # include <vaucanson/algorithms/rw_composition.hh>
00021
00022 # include <vaucanson/automata/concept/transducer.hh>
00023
00024 # include <queue>
00025
00026 namespace vcsn {
00027
00028
00029 template< typename S,
00030 typename Trans_t>
00031 void
00032 do_rw_composition(const TransducerBase<S>&,
00033 const Trans_t& lhs,
00034 const Trans_t& rhs,
00035 Trans_t& ret)
00036 {
00037 AUTOMATON_TYPES(Trans_t);
00038
00039 typedef series_set_elt_t exp_t;
00040 typedef typename series_set_elt_t::semiring_elt_t output_exp_t;
00041 typedef std::set<std::pair<hstate_t, output_exp_t> > state_exp_pair_set_t;
00042 typedef std::pair<hstate_t, hstate_t> state_pair_t;
00043 typedef std::map<state_pair_t, hstate_t> state_pair_map_t;
00044 typedef std::queue<state_pair_t> state_pair_queue_t;
00045 typedef std::set<htransition_t> set_of_transitions_t;
00046
00047 typedef typename Trans_t::value_t T;
00048 typedef typename output_projection_helper<S, T>::ret Auto_t;
00049 typedef typename Auto_t::set_t::series_set_t Auto_series_set_t;
00050 typedef typename Auto_t::set_t o_automata_set_t;
00051
00052 o_automata_set_t auto_structure
00053 (Auto_series_set_t (lhs.structure().series().semiring()));
00054
00055 AUTOMATON_TYPES_(Auto_t, a_);
00056
00057 state_exp_pair_set_t sep_set;
00058 state_pair_map_t sp_map;
00059
00060 state_pair_queue_t sp_queue;
00061
00062 exp_t null_exp = lhs.series().zero_;
00063 monoid_elt_t empty = lhs.series().monoid().VCSN_EMPTY_;
00064
00065 for_all_const_initial_states(p, lhs)
00066 {
00067 exp_t exp = lhs.get_initial(*p);
00068 sep_set.clear();
00069 partial_evaluation(exp, rhs, sep_set);
00070
00071 for_all_const_(state_exp_pair_set_t, mypair, sep_set)
00072 {
00073
00074 hstate_t new_state = ret.add_state();
00075
00076 state_pair_t sp;
00077 sp.first = *p;
00078 sp.second = (*mypair).first;
00079
00080 sp_queue.push(sp);
00081 sp_map[sp] = new_state;
00082 exp_t s(exp.structure());
00083 s.assoc(empty, (*mypair).second);
00084 ret.set_initial(new_state, s);
00085 }
00086
00087 }
00088 while (!sp_queue.empty())
00089 {
00090 state_pair_t sp = sp_queue.front();
00091 sp_queue.pop();
00092 hstate_t p = sp.first;
00093 hstate_t q = sp.second;
00094
00095 if (lhs.is_final(p))
00096 {
00097 exp_t exp = lhs.get_final(p);
00098
00099 Auto_t a(auto_structure);
00100 standard_of(a, exp.get(empty).value());
00101
00102 output_exp_t exp1 (a.series());
00103 partial_2(a, rhs, q, exp1);
00104
00105 output_exp_t null_series =
00106 a.series().zero(SELECT(typename a_series_set_elt_t::value_t));
00107
00108 if (exp1 != null_series)
00109 {
00110 exp_t s (lhs.series());
00111 s.assoc(empty, exp1);
00112 ret.set_final(sp_map[sp], s);
00113 }
00114 }
00115
00116 set_of_transitions_t transitions;
00117 lhs.deltac(transitions, p, delta_kind::transitions());
00118
00119 for_all_const_(set_of_transitions_t, e, transitions)
00120 {
00121 hstate_t p_ = lhs.dst_of(*e);
00122 exp_t exp = lhs.series_of(*e);
00123
00124 assertion(exp.supp().size() == 1);
00125 monoid_elt_t word (exp.structure().monoid(), *exp.supp().begin());
00126
00127
00128 Auto_t a(auto_structure);
00129 standard_of(a, exp.get(word).value());
00130 state_exp_pair_set_t sep_set1;
00131 partial_3(a, rhs, q, sep_set1);
00132
00133 for_all_const_(state_exp_pair_set_t, mypair, sep_set1)
00134 {
00135 state_pair_t sp1;
00136 sp1.first = p_;
00137 sp1.second = (*mypair).first;
00138 if (sp_map.find(sp1) == sp_map.end())
00139 {
00140 hstate_t new_state = ret.add_state();
00141 sp_map[sp1] = new_state;
00142 sp_queue.push(sp1);
00143 }
00144
00145 exp_t s (lhs.structure().series());
00146 s.assoc(word, (*mypair).second);
00147 ret.add_series_transition(sp_map[sp], sp_map[sp1], s);
00148 }
00149 }
00150 }
00151
00152 }
00153
00154 template< typename S, typename T>
00155 void
00156 rw_composition(const Element<S, T>& lhs,
00157 const Element<S, T>& rhs,
00158 Element<S, T>& ret)
00159 {
00160 typedef Element<S, T> auto_t;
00161 AUTOMATON_TYPES(auto_t);
00162 for_all_states (s, ret)
00163 ret.del_state (*s);
00164 do_rw_composition(lhs.structure(), lhs, rhs, ret);
00165 }
00166
00167
00168 template< typename S, typename T>
00169 Element<S, T>
00170 rw_composition(const Element<S, T>& lhs, const Element<S, T>& rhs)
00171 {
00172 Element<S, T> ret (lhs.structure());
00173 do_rw_composition(lhs.structure(), lhs, rhs, ret);
00174 return ret;
00175 }
00176 }
00177
00178 #endif // ! VCSN_ALGORITHMS_RW_COMPOSITION_HXX