00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_PROJECTION_HXX
00018 # define VCSN_ALGORITHMS_PROJECTION_HXX
00019
00020 # include <map>
00021
00022 # include <vaucanson/algorithms/projection.hh>
00023
00024 namespace vcsn
00025 {
00026 template <typename auto_t, typename trans_t>
00027 void
00028 set_states(const trans_t& fmp_trans, auto_t& res,
00029 std::map<typename trans_t::hstate_t, typename auto_t::hstate_t>&
00030 stmap)
00031 {
00032 AUTOMATON_TYPES_(trans_t, trans_);
00033 AUTOMATON_TYPES(auto_t);
00034
00035 typedef typename trans_series_set_elt_t::support_t trans_support_t;
00036
00037 const series_set_t& series = res.structure().series();
00038 const monoid_t& monoid = res.structure().series().monoid();
00039
00040 for_all_const_states(fmp_s, fmp_trans)
00041 {
00042 hstate_t s = res.add_state();
00043 stmap[*fmp_s] = s;
00044
00045 if (fmp_trans.is_initial(*fmp_s))
00046 {
00047 trans_series_set_elt_t in = fmp_trans.get_initial(*fmp_s);
00048 trans_support_t supp = in.supp();
00049
00050 semiring_elt_t in_semi_elt = in.get(*(supp.begin()));
00051 series_set_elt_t series_elt(series);
00052
00053 series_elt.assoc(monoid_elt_t(monoid,
00054 algebra::identity_as<
00055 monoid_elt_value_t>::
00056 of(monoid).value()),
00057 in_semi_elt);
00058 res.set_initial(s, series_elt);
00059 }
00060
00061 if (fmp_trans.is_final(*fmp_s))
00062 {
00063 trans_series_set_elt_t out = fmp_trans.get_final(*fmp_s);
00064 trans_support_t supp = out.supp();
00065
00066 semiring_elt_t out_semi_elt = out.get(*(supp.begin()));
00067 series_set_elt_t series_elt(series);
00068
00069 series_elt.assoc(monoid_elt_t(monoid,
00070 algebra::identity_as<
00071 monoid_elt_value_t>::
00072 of(monoid).value()),
00073 out_semi_elt);
00074 res.set_final(s, series_elt);
00075 }
00076 }
00077 }
00078
00079
00080
00081
00082
00083 template <typename S1, typename S2, typename M1, typename M2,
00084 typename auto_t, typename trans_t>
00085 void
00086 do_identity(const AutomataBase<S1>&,
00087 const algebra::FreeMonoidBase<M1>&,
00088 const AutomataBase<S2>&,
00089 const algebra::FreeMonoidProduct<M1,M2>&,
00090 const auto_t& aut, trans_t& res)
00091 {
00092 BENCH_TASK_SCOPED("identity");
00093 AUTOMATON_TYPES_(auto_t, aut_);
00094 AUTOMATON_TYPES(trans_t);
00095
00096 std::map<hstate_t, aut_hstate_t> stmap;
00097 typedef typename aut_series_set_elt_t::support_t aut_support_t;
00098
00099 const series_set_t& series = res.structure().series();
00100 const monoid_t& monoid = res.structure().series().monoid();
00101 const aut_monoid_t& aut_monoid = aut.structure().series().monoid();
00102
00103 set_states(aut, res, stmap);
00104
00105 for_all_const_transitions_(aut_, aut_e, aut)
00106 {
00107 const aut_series_set_elt_t aut_series_elt = aut.series_of(*aut_e);
00108
00109
00110
00111 aut_support_t aut_supp = aut_series_elt.supp();
00112 for_all_const_(aut_support_t, label, aut_supp)
00113 {
00114 const aut_monoid_elt_t aut_monoid_elt(aut_monoid, *label);
00115 const monoid_elt_value_t word(aut_monoid_elt.value(),
00116 aut_monoid_elt.value());
00117
00118 series_set_elt_t series_elt(series);
00119 series_elt.assoc(monoid_elt_t(monoid, word),
00120 aut_series_elt.get(aut_monoid_elt));
00121
00122 res.add_series_transition(stmap[aut.src_of(*aut_e)],
00123 stmap[aut.dst_of(*aut_e)], series_elt);
00124 }
00125 }
00126 }
00127
00128 template <typename S, typename S2, typename T, typename T2>
00129 void
00130 identity(const Element<S,T>& aut, Element<S2, T2>& res)
00131 {
00132 do_identity(aut.structure(), aut.structure().series().monoid(),
00133 res.structure(), res.structure().series().monoid(), aut, res);
00134 }
00135
00136 }
00137
00138 #endif // ! VCSN_ALGORITHMS_PROJECTION_HXX