00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <vaucanson/algorithms/minimization_hopcroft.hh>
00025 #include <vaucanson/algorithms/evaluation_fmp.hh>
00026 #include <vaucanson/algorithms/aut_to_exp.hh>
00027 #include <vaucanson/algorithms/trim.hh>
00028 #include <vaucanson/algorithms/realtime.hh>
00029
00030 namespace vcsn
00031 {
00032 namespace VCSN_GRAPH_IMPL
00033 {
00034 VCSN_CONTEXT_NAMESPACE
00035 {
00036
00037 template <class FirstInputIterator, class SecondInputIterator>
00038 automata_set_t make_automata_set(const FirstInputIterator first_begin,
00039 const FirstInputIterator first_end,
00040 const SecondInputIterator second_begin,
00041 const SecondInputIterator second_end)
00042 {
00043 first_alphabet_t first_alpha;
00044
00045 for (FirstInputIterator e = first_begin; e != first_end; ++e)
00046 first_alpha.insert(*e);
00047
00048 second_alphabet_t second_alpha;
00049
00050 for (SecondInputIterator e = second_begin; e != second_end; ++e)
00051 second_alpha.insert(*e);
00052
00053 semiring_t semiring;
00054 first_monoid_t mA(first_alpha);
00055 second_monoid_t mB(second_alpha);
00056 monoid_t freemonoidproduct(mA, mB);
00057 series_set_t series(semiring, freemonoidproduct);
00058
00059 return automata_set_t(series);
00060 }
00061
00062 template <class FirstInputIterator, class SecondInputIterator>
00063 automata_set_t make_automata_set(const FirstInputIterator first_begin,
00064 const FirstInputIterator first_end,
00065 const SecondInputIterator second_begin,
00066 const SecondInputIterator second_end,
00067 const monoid_rep_t& mrep,
00068 const first_monoid_rep_t& mrep1,
00069 const second_monoid_rep_t& mrep2,
00070 const series_rep_t& srep)
00071 {
00072 first_alphabet_t first_alpha;
00073
00074 for (FirstInputIterator e = first_begin; e != first_end; ++e)
00075 first_alpha.insert(*e);
00076
00077 second_alphabet_t second_alpha;
00078
00079 for (SecondInputIterator e = second_begin; e != second_end; ++e)
00080 second_alpha.insert(*e);
00081
00082 semiring_t semiring;
00083 first_monoid_t mA(first_alpha, mrep1);
00084 second_monoid_t mB(second_alpha, mrep2);
00085 monoid_t freemonoidproduct(mA, mB, mrep);
00086 series_set_t series(semiring, freemonoidproduct, srep);
00087
00088 return automata_set_t(series);
00089 }
00090
00091 template <class FirstInputIterator, class SecondInputIterator>
00092 automaton_t make_automaton(const FirstInputIterator first_begin,
00093 const FirstInputIterator first_end,
00094 const SecondInputIterator second_begin,
00095 const SecondInputIterator second_end)
00096 {
00097 return automaton_t(make_automata_set(first_begin, first_end,
00098 second_begin, second_end));
00099 }
00100
00101 template <class FirstInputIterator, class SecondInputIterator>
00102 automaton_t make_automaton(const FirstInputIterator first_begin,
00103 const FirstInputIterator first_end,
00104 const SecondInputIterator second_begin,
00105 const SecondInputIterator second_end,
00106 const monoid_rep_t& mrep,
00107 const first_monoid_rep_t& mrep1,
00108 const second_monoid_rep_t& mrep2,
00109 const series_rep_t& srep)
00110 {
00111 return automaton_t(make_automata_set(first_begin, first_end,
00112 second_begin, second_end,
00113 mrep, mrep1, mrep2,
00114 srep));
00115 }
00116
00117 template <class T1, class T2>
00118 automaton_t make_automaton(const T1& first_alphabet,
00119 const T2& second_alphabet)
00120 {
00121 return make_automaton(first_alphabet.begin(), first_alphabet.end(),
00122 second_alphabet.begin(), second_alphabet.end());
00123 }
00124
00125 template <class T1, class T2>
00126 automaton_t make_automaton(const T1& first_alphabet,
00127 const T2& second_alphabet,
00128 const monoid_rep_t& mrep,
00129 const first_monoid_rep_t& mrep1,
00130 const second_monoid_rep_t& mrep2,
00131 const series_rep_t& srep)
00132 {
00133 return make_automaton(first_alphabet.begin(), first_alphabet.end(),
00134 second_alphabet.begin(), second_alphabet.end(),
00135 mrep, mrep1, mrep2, srep);
00136 }
00137
00138 template <class FirstIterator, class SecondIterator>
00139 monoid_elt_t make_couple(const FirstIterator first_begin,
00140 const FirstIterator first_end,
00141 const SecondIterator second_begin,
00142 const SecondIterator second_end,
00143 const first_monoid_elt_value_t& first_exp,
00144 const second_monoid_elt_value_t& second_exp)
00145 {
00146 first_alphabet_t first_alpha;
00147 for (FirstIterator e = first_begin; e != first_end; ++e)
00148 first_alpha.insert(*e);
00149
00150 second_alphabet_t second_alpha;
00151 for (SecondIterator e = second_begin; e != second_end; ++e)
00152 second_alpha.insert(*e);
00153
00154 monoid_t fmp (first_alpha, second_alpha);
00155 monoid_elt_value_t fmp_elt_value (first_exp, second_exp);
00156
00157 return Element<monoid_t, monoid_elt_value_t> (fmp, fmp_elt_value);
00158 }
00159
00160 template <class T1, class T2>
00161 monoid_elt_t make_couple(const T1& first_alphabet,
00162 const T2& second_alphabet,
00163 const first_monoid_elt_value_t& first_exp,
00164 const second_monoid_elt_value_t& second_exp)
00165 {
00166 return make_couple(first_alphabet.begin(), first_alphabet.end(),
00167 second_alphabet.begin(), second_alphabet.end(),
00168 first_exp, second_exp);
00169 }
00170
00171
00172 template <typename TransStruct,
00173 typename TransImpl,
00174 typename SeriesStruct,
00175 typename SeriesImpl,
00176 typename S,
00177 typename T>
00178 AUTOMATON_CONTEXT::rat_exp_t
00179 do_evaluation(const vcsn::AutomataBase<TransStruct>&,
00180 const TransImpl&,
00181 const SeriesStruct&,
00182 const vcsn::rat::exp<S, T>& input,
00183 const Element<TransStruct, TransImpl>& t,
00184 const Element<SeriesStruct, SeriesImpl>&)
00185 {
00186 AUTOMATON_CONTEXT::automaton_t w = AUTOMATON_CONTEXT::make_automaton(t.structure().series()
00187 .monoid().first_monoid().alphabet());
00188 AUTOMATON_CONTEXT::automaton_t result = AUTOMATON_CONTEXT::make_automaton(t.structure().series()
00189 .monoid().second_monoid().alphabet());
00190 standard_of(w, input);
00191 evaluation_fmp(t, quotient(w), result);
00192
00193 return aut_to_exp(generalized(quotient(realtime(trim(result)))),
00194 DMChooser());
00195 }
00196
00197
00198 template <typename TransStruct,
00199 typename TransImpl,
00200 typename ArgStruct,
00201 typename ArgImpl>
00202 AUTOMATON_CONTEXT::rat_exp_t
00203 evaluation(const Element<TransStruct, TransImpl>& t,
00204 const Element<ArgStruct, ArgImpl>& input)
00205 {
00206 return do_evaluation(t.structure(), t.value(),
00207 input.structure(), input.value(),
00208 t, input);
00209 }
00210
00211
00212 }
00213 }
00214 }