00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include <vaucanson/algorithms/evaluation.hh>
00025 #include <vaucanson/algorithms/minimization_hopcroft.hh>
00026 #include <vaucanson/algorithms/trim.hh>
00027 #include <vaucanson/algorithms/aut_to_exp.hh>
00028 #include <vaucanson/algorithms/realtime.hh>
00029
00030 namespace vcsn
00031 {
00032
00033 namespace VCSN_CONTEXT_NAMESPACE
00034 {
00035
00036
00037
00038
00039
00040 template <class InputIterator>
00041 automaton_t
00042 make_automaton(InputIterator input_alphabet_begin,
00043 InputIterator input_alphabet_end,
00044 InputIterator output_alphabet_begin,
00045 InputIterator output_alphabet_end)
00046 {
00047 alphabet_t input_alpha;
00048 alphabet_t output_alpha;
00049
00050 for (InputIterator e = input_alphabet_begin;
00051 e != input_alphabet_end; ++e)
00052 input_alpha.insert(*e);
00053
00054 for (InputIterator e = output_alphabet_begin;
00055 e != output_alphabet_end; ++e)
00056 output_alpha.insert(*e);
00057
00058 monoid_t output_freemonoid (output_alpha);
00059 typename output_series_set_t::semiring_t semiring;
00060 output_series_set_t output_series (semiring, output_freemonoid);
00061 monoid_t freemonoid (input_alpha);
00062 series_set_t series (output_series, freemonoid);
00063 automata_set_t automata_set (series);
00064
00065 return automaton_t (automata_set);
00066 }
00067
00068
00069 template <class T>
00070 automaton_t make_automaton(const T& input_alphabet,
00071 const T& output_alphabet)
00072 {
00073 return make_automaton(input_alphabet.begin(),
00074 input_alphabet.end(),
00075 output_alphabet.begin(),
00076 output_alphabet.end());
00077 }
00078
00079
00080 template <typename TransStruct,
00081 typename TransImpl,
00082 typename MonoidStruct,
00083 typename MonoidImpl>
00084 output_series_set_elt_t
00085 do_evaluation(const vcsn::TransducerBase<TransStruct>&,
00086 const TransImpl&,
00087 const vcsn::algebra::FreeMonoidBase<MonoidStruct>&,
00088 const MonoidImpl& input,
00089 const Element<TransStruct, TransImpl>& t,
00090 const Element<MonoidStruct, MonoidImpl>&)
00091 {
00092 return eval(t, input);
00093 }
00094
00095
00096 template <typename TransStruct,
00097 typename TransImpl,
00098 typename SeriesStruct,
00099 typename SeriesImpl,
00100 typename S,
00101 typename T>
00102 output_series_set_elt_t
00103 do_evaluation(const vcsn::TransducerBase<TransStruct>&,
00104 const TransImpl&,
00105 const SeriesStruct&,
00106 const vcsn::rat::exp<S, T>& input,
00107 const Element<TransStruct, TransImpl>& t,
00108 const Element<SeriesStruct, SeriesImpl>&)
00109 {
00110 AUTOMATON_CONTEXT::automaton_t w = AUTOMATON_CONTEXT::
00111 make_automaton(t.structure().series().monoid().alphabet());
00112 AUTOMATON_CONTEXT::gen_automaton_t result (w.structure());
00113 standard_of(w, input);
00114 evaluation(quotient(w), t, result);
00115 return aut_to_exp(quotient(realtime(trim(result))), DMChooser());
00116 }
00117
00118
00119 template <typename TransStruct,
00120 typename TransImpl,
00121 typename ArgStruct,
00122 typename ArgImpl>
00123 output_series_set_elt_t
00124 evaluation(const Element<TransStruct, TransImpl>& t,
00125 const Element<ArgStruct, ArgImpl>& input)
00126 {
00127 return do_evaluation(t.structure(), t.value(),
00128 input.structure(), input.value(),
00129 t, input);
00130 }
00131
00132 }
00133
00134 }
00135