17 #ifndef VCSN_ALGORITHMS_DOMAIN_HXX
18 # define VCSN_ALGORITHMS_DOMAIN_HXX
30 template <
typename src_t,
typename dst_t>
32 do_fmp_domain(
const src_t& input, dst_t& dst,
bool weighted)
34 BENCH_TASK_SCOPED(
"fmp_domain");
35 AUTOMATON_TYPES_(src_t, trans_);
36 AUTOMATON_TYPES(dst_t);
40 typedef typename trans_series_set_elt_t::support_t trans_support_t;
41 std::map<trans_hstate_t, hstate_t> stmap;
43 const series_set_t& series = dst.structure().series();
44 const monoid_t& monoid = dst.structure().series().monoid();
45 const trans_monoid_t& trans_monoid = src.structure().series().monoid();
46 const semiring_elt_t& unit = src.structure().series().semiring().wone_;
48 for_all_const_states(fmp_s, src)
50 hstate_t s = dst.add_state();
53 if (src.is_initial(*fmp_s))
55 const trans_series_set_elt_t trans_series_elt =
56 src.get_initial(*fmp_s);
57 trans_support_t trans_supp = trans_series_elt.supp();
58 const trans_monoid_elt_t trans_monoid_elt(trans_monoid,
59 *(trans_supp.begin()));
61 const monoid_elt_value_t word(trans_monoid_elt.value().first);
63 series_set_elt_t series_elt(series);
65 series_elt.assoc(monoid_elt_t(monoid, word),
67 trans_series_elt.get(trans_monoid_elt) : unit);
68 dst.set_initial(s, series_elt);
70 if (src.is_final(*fmp_s))
72 const trans_series_set_elt_t trans_series_elt =
73 src.get_final(*fmp_s);
74 trans_support_t trans_supp = trans_series_elt.supp();
75 const trans_monoid_elt_t trans_monoid_elt(trans_monoid,
76 *(trans_supp.begin()));
78 const monoid_elt_value_t word(trans_monoid_elt.value().first);
80 series_set_elt_t series_elt(series);
82 series_elt.assoc(monoid_elt_t(monoid, word),
84 trans_series_elt.get(trans_monoid_elt) : unit);
86 dst.set_final(s, series_elt);
90 for_all_const_transitions_(trans_, fmp_e, src)
92 const trans_series_set_elt_t trans_series_elt = src.series_of(*fmp_e);
93 trans_support_t trans_supp = trans_series_elt.supp();
94 for_all_const_(trans_support_t, trans_value, trans_supp)
96 const trans_monoid_elt_t trans_monoid_elt(trans_monoid,
98 const monoid_elt_value_t word(trans_monoid_elt.value().first);
100 series_set_elt_t series_elt(series);
102 series_elt.assoc(monoid_elt_t(monoid, word),
103 weighted ? trans_series_elt.get(trans_monoid_elt)
106 dst.add_series_transition(stmap[src.src_of(*fmp_e)],
107 stmap[src.dst_of(*fmp_e)], series_elt);
117 template <
typename src_t,
typename dst_t>
119 do_rw_domain(
const src_t& src, dst_t& dst)
121 BENCH_TASK_SCOPED(
"rw_domain");
122 std::map<typename src_t::hstate_t, typename dst_t::hstate_t> m;
123 AUTOMATON_TYPES(src_t);
125 for_all_const_states(p, src)
127 m[*p] = dst.add_state();
130 for_all_const_initial_states(p, src)
131 dst.set_initial(m[*p]);
133 for_all_const_final_states(p, src)
134 dst.set_final(m[*p]);
136 for_all_const_transitions(e, src)
138 dst.add_series_transition(m[src.src_of(*e)],
151 template <
typename S,
typename S2,
typename T,
typename T2>
153 domain_dispatch(
const AutomataBase<S>&,
const Element<S,T>& src, Element<S2, T2>& dst,
bool weighted)
155 do_fmp_domain(src, dst, weighted);
158 template <
typename S,
typename S2,
typename T,
typename T2>
160 domain_dispatch(
const TransducerBase<S>&,
const Element<S,T>& src, Element<S2, T2>& dst,
bool)
162 do_rw_domain(src, dst);
165 template <
typename S,
typename S2,
typename T,
typename T2>
167 domain(
const Element<S,T>& src, Element<S2, T2>& dst,
bool weighted)
169 domain_dispatch(src.structure(), src, dst, weighted);
174 #endif // ! VCSN_ALGORITHMS_DOMAIN_HXX