00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_PROJECTIONS_FMP_HXX
00018 # define VCSN_ALGORITHMS_PROJECTIONS_FMP_HXX
00019
00020 # include <vaucanson/algorithms/projections_fmp.hh>
00021
00022 namespace vcsn
00023 {
00024 template <typename auto_t, typename trans_t>
00025 static void
00026 set_states(const trans_t& fmp_trans, auto_t& res,
00027 std::map<hstate_t, hstate_t>& stmap)
00028 {
00029 AUTOMATON_TYPES_(trans_t, trans_);
00030 AUTOMATON_TYPES(auto_t);
00031
00032 typedef typename trans_series_set_elt_t::support_t trans_support_t;
00033
00034 const series_set_t& series = res.structure().series();
00035 const monoid_t& monoid = res.structure().series().monoid();
00036
00037 for_each_state(fmp_s, fmp_trans)
00038 {
00039 hstate_t s = res.add_state();
00040 stmap[*fmp_s] = s;
00041
00042 if (fmp_trans.is_initial(*fmp_s))
00043 {
00044 trans_series_set_elt_t in = fmp_trans.get_initial(*fmp_s);
00045 trans_support_t supp = in.supp();
00046
00047 semiring_elt_t in_semi_elt = in.get(*(supp.begin()));
00048 series_set_elt_t series_elt(series);
00049
00050 series_elt.assoc(monoid_elt_t(monoid,
00051 algebra::identity_as<
00052 monoid_elt_value_t>::
00053 of(monoid).value()),
00054 in_semi_elt);
00055 res.set_initial(s, series_elt);
00056 }
00057
00058 if (fmp_trans.is_final(*fmp_s))
00059 {
00060 trans_series_set_elt_t out = fmp_trans.get_final(*fmp_s);
00061 trans_support_t supp = out.supp();
00062
00063 semiring_elt_t out_semi_elt =
00064 out.get(*(supp.begin()));
00065 series_set_elt_t series_elt(series);
00066
00067 series_elt.assoc(monoid_elt_t(monoid,
00068 algebra::identity_as<
00069 monoid_elt_value_t>::
00070 of(monoid).value()),
00071 out_semi_elt);
00072 res.set_final(s, series_elt);
00073 }
00074 }
00075 }
00076
00077 template <typename S1, typename S2, typename M1, typename M2, typename M3,
00078 typename auto_t, typename trans_t>
00079 void
00080 do_domain(const AutomataBase<S1>&, const algebra::FreeMonoidProduct<M1, M2>&,
00081 const AutomataBase<S2>&, const algebra::FreeMonoid<M3>&,
00082 const trans_t& fmp_trans, auto_t& res)
00083 {
00084 AUTOMATON_TYPES_(trans_t, trans_);
00085 AUTOMATON_TYPES(auto_t);
00086
00087 typedef typename trans_series_set_elt_t::support_t trans_support_t;
00088 std::map<hstate_t, hstate_t> stmap;
00089
00090 const series_set_t& series = res.structure().series();
00091 const monoid_t& monoid = res.structure().series().monoid();
00092 const trans_monoid_t& trans_monoid =
00093 fmp_trans.structure().series().monoid();
00094
00095 set_states(fmp_trans, res, stmap);
00096
00097 for_each_transition(fmp_e, fmp_trans)
00098 {
00099 const trans_series_set_elt_t trans_series_elt =
00100 fmp_trans.series_of(*fmp_e);
00101 trans_support_t trans_supp = trans_series_elt.supp();
00102 const trans_monoid_elt_t trans_monoid_elt
00103 (trans_monoid, *(trans_supp.begin()));
00104 const monoid_elt_value_t word(trans_monoid_elt.value().first);
00105
00106 series_set_elt_t series_elt(series);
00107
00108 series_elt.assoc(monoid_elt_t(monoid, word),
00109 trans_series_elt.get(trans_monoid_elt));
00110
00111 res.add_series_transition(stmap[fmp_trans.src_of(*fmp_e)],
00112 stmap[fmp_trans.dst_of(*fmp_e)], series_elt);
00113 }
00114 }
00115
00116 template <typename S1, typename S2, typename M1, typename M2,
00117 typename auto_t, typename trans_t>
00118 void
00119 do_image(const AutomataBase<S1>&, const algebra::FreeMonoidProduct<M1, M2>&,
00120 const AutomataBase<S2>&, const algebra::FreeMonoidBase<M2>&,
00121 const trans_t& fmp_trans, auto_t& res)
00122 {
00123 AUTOMATON_TYPES_(trans_t, trans_);
00124 AUTOMATON_TYPES(auto_t);
00125
00126 typedef typename trans_series_set_elt_t::support_t trans_support_t;
00127 std::map<hstate_t, hstate_t> stmap;
00128
00129 const series_set_t& series = res.structure().series();
00130 const monoid_t& monoid = res.structure().series().monoid();
00131 const trans_monoid_t& trans_monoid =
00132 fmp_trans.structure().series().monoid();
00133
00134 set_states(fmp_trans, res, stmap);
00135
00136 for_each_transition(fmp_e, fmp_trans)
00137 {
00138 const trans_series_set_elt_t trans_series_elt =
00139 fmp_trans.series_of(*fmp_e);
00140 trans_support_t trans_supp = trans_series_elt.supp();
00141 const trans_monoid_elt_t trans_monoid_elt
00142 (trans_monoid, *(trans_supp.begin()));
00143
00144 const monoid_elt_value_t word(trans_monoid_elt.value().second);
00145
00146 series_set_elt_t series_elt(series);
00147
00148 series_elt.assoc(monoid_elt_t(monoid, word),
00149 trans_series_elt.get(trans_monoid_elt));
00150
00151 res.add_series_transition(stmap[fmp_trans.src_of(*fmp_e)],
00152 stmap[fmp_trans.dst_of(*fmp_e)], series_elt);
00153 }
00154 }
00155
00156 template <typename S1, typename S2, typename M1, typename M2,
00157 typename auto_t, typename trans_t>
00158 void
00159 do_identity(const AutomataBase<S1>&,
00160 const algebra::FreeMonoidBase<M1>&,
00161 const AutomataBase<S2>&,
00162 const algebra::FreeMonoidProduct<M1,M2>&,
00163 const auto_t& aut, trans_t& res)
00164 {
00165 AUTOMATON_TYPES_(auto_t, aut_);
00166 AUTOMATON_TYPES(trans_t);
00167
00168 std::map<hstate_t, hstate_t> stmap;
00169 typedef typename aut_series_set_elt_t::support_t aut_support_t;
00170
00171 const series_set_t& series = res.structure().series();
00172 const monoid_t& monoid = res.structure().series().monoid();
00173 const aut_monoid_t& aut_monoid = aut.structure().series().monoid();
00174
00175 set_states(aut, res, stmap);
00176
00177 for_each_transition(aut_e, aut)
00178 {
00179 const aut_series_set_elt_t aut_series_elt =
00180 aut.series_of(*aut_e);
00181 aut_support_t aut_supp = aut_series_elt.supp();
00182 const aut_monoid_elt_t aut_monoid_elt
00183 (aut_monoid, *(aut_supp.begin()));
00184 const monoid_elt_value_t word(aut_monoid_elt.value(),
00185 aut_monoid_elt.value());
00186
00187 series_set_elt_t series_elt(series);
00188
00189 series_elt.assoc(monoid_elt_t(monoid, word),
00190 aut_series_elt.get(aut_monoid_elt));
00191
00192 res.add_series_transition(stmap[aut.src_of(*aut_e)],
00193 stmap[aut.dst_of(*aut_e)], series_elt);
00194 }
00195 }
00196
00197
00198
00199
00200
00201
00202 template <typename S, typename S2, typename T, typename T2>
00203 void
00204 domain(const Element<S,T>& trans, Element<S2, T2>& res)
00205 {
00206 do_domain(trans.structure(), trans.structure().series().monoid(),
00207 res.structure(), res.structure().series().monoid(), trans, res);
00208 }
00209
00210
00211 template <typename S, typename S2, typename T, typename T2>
00212 Element<S2, T2>
00213 domain(const Element<S,T>& trans)
00214 {
00215 typedef Element<S, T> trans_t;
00216
00217 typedef algebra::FreeMonoid<
00218 typename trans_t::series_set_t::monoid_t::first_monoid_t> monoid_t;
00219
00220 typedef algebra::Series<typename trans_t::series_set_t::semiring_t,
00221 monoid_t>
00222 series_set_t;
00223
00224 monoid_t monoid
00225 (trans.structure().series().monoid().first_monoid());
00226 series_set_t series
00227 (trans.structure().series().semiring(), monoid);
00228 Automata<series_set_t> aut_set(series);
00229 Element< Automata<series_set_t>, T> res(aut_set);
00230
00231 do_domain(trans.structure(), trans.structure().series().monoid(),
00232 res.structure(), res.structure().series().monoid(), trans, res);
00233 return res;
00234 }
00235
00236
00237
00238
00239
00240
00241 template <typename S, typename S2, typename T, typename T2>
00242 void
00243 image(const Element<S,T>& trans, Element<S2, T2>& res)
00244 {
00245 do_image(trans.structure(), trans.structure().series().monoid(),
00246 res.structure(), res.structure().series().monoid(), trans, res);
00247 }
00248
00249
00250 template <typename S, typename S2, typename T, typename T2>
00251 Element<S2, T2>
00252 image(const Element<S,T>& trans)
00253 {
00254 typedef Element<S, T> trans_t;
00255
00256 typedef algebra::FreeMonoid<
00257 typename trans_t::series_set_t::monoid_t::second_monoid_t> monoid_t;
00258
00259 typedef algebra::Series<typename trans_t::series_set_t::semiring_t,
00260 monoid_t>
00261 series_set_t;
00262
00263 monoid_t monoid
00264 (trans.structure().series().monoid().second_monoid());
00265 series_set_t series
00266 (trans.structure().series().semiring(), monoid);
00267 Automata<series_set_t> aut_set(series);
00268 Element< Automata<series_set_t>, T> res(aut_set);
00269
00270 do_image(trans.structure(), trans.structure().series().monoid(),
00271 res.structure(), res.structure().series().monoid(), trans, res);
00272 return res;
00273 }
00274
00275
00276
00277
00278
00279
00280 template <typename S, typename S2, typename T, typename T2>
00281 void
00282 identity(const Element<S,T>& aut, Element<S2, T2>& res)
00283 {
00284 do_identity(aut.structure(), aut.structure().series().monoid(),
00285 res.structure(), res.structure().series().monoid(), aut, res);
00286 }
00287
00288 template <typename S, typename S2, typename T, typename T2>
00289 Element<S2, T2>
00290 identity(const Element<S,T>& aut)
00291 {
00292 typedef Element<S, T> auto_t;
00293
00294 typedef algebra::FreeMonoidProduct<
00295 typename auto_t::series_set_t::monoid_t,
00296 typename auto_t::series_set_t::monoid_t> monoid_t;
00297
00298 typedef algebra::Series<typename auto_t::series_set_t::semiring_t,
00299 monoid_t>
00300 series_set_t;
00301
00302 monoid_t monoid (aut.structure().series().monoid(),
00303 aut.structure().series().monoid());
00304
00305 series_set_t series
00306 (aut.structure().series().semiring(), monoid);
00307 Automata<series_set_t> aut_set(series);
00308 Element< Automata<series_set_t>, T> res(aut_set);
00309
00310 do_identity(aut.structure(), aut.structure().series().monoid(),
00311 res.structure(), res.structure().series().monoid(), aut, res);
00312 return res;
00313 }
00314
00315
00316 }
00317
00318 #endif // ! VCSN_ALGORITHMS_PROJECTIONS_FMP_HXX