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 <vaucanson/algorithms/projection.hh>
00021 
00022 # include <map>
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 
00084   template <typename S1, typename S2, typename M1, typename M2,
00085             typename auto_t, typename trans_t>
00086   void
00087   do_identity(const AutomataBase<S1>&,
00088               const algebra::FreeMonoidBase<M1>&,
00089               const AutomataBase<S2>&,
00090               const algebra::FreeMonoidProduct<M1,M2>&,
00091               const auto_t& aut, trans_t& res)
00092   {
00093     TIMER_SCOPED("identity");
00094     AUTOMATON_TYPES_(auto_t, aut_);
00095     AUTOMATON_TYPES(trans_t);
00096 
00097     std::map<hstate_t, aut_hstate_t>    stmap;
00098     typedef typename aut_series_set_elt_t::support_t    aut_support_t;
00099 
00100     const series_set_t&         series = res.structure().series();
00101     const monoid_t&             monoid = res.structure().series().monoid();
00102     const aut_monoid_t&         aut_monoid = aut.structure().series().monoid();
00103 
00104     set_states(aut, res, stmap);
00105 
00106     for_all_const_transitions_(aut_, aut_e, aut)
00107     {
00108       const aut_series_set_elt_t        aut_series_elt =
00109         aut.series_of(*aut_e);
00110       aut_support_t                     aut_supp = aut_series_elt.supp();
00111       const aut_monoid_elt_t    aut_monoid_elt
00112         (aut_monoid, *(aut_supp.begin()));
00113       const monoid_elt_value_t  word(aut_monoid_elt.value(),
00114                                      aut_monoid_elt.value());
00115 
00116       series_set_elt_t          series_elt(series);
00117 
00118       series_elt.assoc(monoid_elt_t(monoid, word),
00119                        aut_series_elt.get(aut_monoid_elt));
00120 
00121       res.add_series_transition(stmap[aut.src_of(*aut_e)],
00122                                 stmap[aut.dst_of(*aut_e)], series_elt);
00123     }
00124   }
00125 
00126   template <typename S, typename S2, typename T, typename T2>
00127   void
00128   identity(const Element<S,T>& aut, Element<S2, T2>& res)
00129   {
00130     do_identity(aut.structure(), aut.structure().series().monoid(),
00131                 res.structure(), res.structure().series().monoid(), aut, res);
00132   }
00133 
00134 }
00135 
00136 #endif // ! VCSN_ALGORITHMS_PROJECTION_HXX