00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_SUPPORT_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_SUPPORT_HXX
00019
00020 # include <utility>
00021 # include <vaucanson/algebra/implementation/series/krat_exp_pattern.hh>
00022 # include <vaucanson/algebra/implementation/series/krat_exp_is_finite_app.hxx>
00023
00024 namespace vcsn {
00025
00026 template <class Series, class T, class Dispatch>
00027 class SupportMatcher : public algebra::KRatExpMatcher<
00028 SupportMatcher<Series, T, Dispatch>,
00029 T,
00030 int,
00031 Dispatch
00032 >
00033 {
00034 public:
00035 typedef IsFiniteAppMatcher<Series, T, Dispatch> self_t;
00036 typedef int return_type;
00037 typedef Series series_set_t;
00038 typedef Element<Series, T> series_set_elt_t;
00039 typedef typename series_set_elt_t::monoid_elt_t monoid_elt_t;
00040 typedef typename monoid_elt_t::value_t monoid_elt_value_t;
00041 typedef typename series_set_elt_t::semiring_elt_t semiring_elt_t;
00042 typedef typename semiring_elt_t::value_t semiring_elt_value_t;
00043 typedef std::list<monoid_elt_value_t> support_t;
00044 typedef std::list<std::pair<semiring_elt_value_t, monoid_elt_value_t> >
00045 ext_support_t;
00046 INHERIT_CONSTRUCTORS(self_t, T, return_type, Dispatch);
00047
00048 SupportMatcher(const series_set_t& s):
00049 series_(s)
00050 {}
00051
00052 MATCH__(Product, lhs, rhs)
00053 {
00054 ext_support_t old_supp_ = supp_;
00055 supp_.clear();
00056 this->match(lhs);
00057 ext_support_t lhs_s = supp_;
00058 supp_.clear();
00059 this->match(rhs);
00060 ext_support_t ret;
00061 for_all_const_(ext_support_t, c, lhs_s)
00062 for_all_const_(ext_support_t, d, supp_)
00063 {
00064 monoid_elt_t mc(series_.monoid(), c->second);
00065 monoid_elt_t md(series_.monoid(), d->second);
00066 semiring_elt_t wc(series_.semiring(), c->first);
00067 semiring_elt_t wd(series_.semiring(), d->first);
00068 ret.push_back(std::make_pair((wc * wd).value(),
00069 (mc * md).value()));
00070 }
00071 supp_ = ret;
00072 supp_.insert(supp_.begin(), old_supp_.begin(), old_supp_.end());
00073 return 0;
00074 }
00075 END
00076
00077 MATCH__(Sum, lhs, rhs)
00078 {
00079 this->match(lhs);
00080 this->match(rhs);
00081 return 0;
00082 }
00083 END
00084
00085 MATCH_(Star, node)
00086 {
00087 result_not_computable("undefined case (star) in krat_exp_support");
00088 return 0;
00089 }
00090 END
00091
00092 MATCH__(LeftWeight, w, node)
00093 {
00094 ext_support_t old_supp_ = supp_;
00095 supp_.clear();
00096 this->match(node);
00097 for_all_(ext_support_t, c, supp_)
00098 c->first = op_mul(series_.semiring(), w, c->first);
00099 supp_.insert(supp_.begin(), old_supp_.begin(), old_supp_.end());
00100 return 0;
00101 }
00102 END
00103
00104 MATCH__(RightWeight, node, w)
00105 {
00106 ext_support_t old_supp_ = supp_;
00107 supp_.clear();
00108 this->match(node);
00109 for_all_(ext_support_t, c, supp_)
00110 c->first = op_mul(series_.semiring(), c->first, w);
00111 supp_.insert(supp_.begin(), old_supp_.begin(), old_supp_.end());
00112 return 0;
00113 }
00114 END
00115
00116 MATCH_(Constant, m)
00117 {
00118 supp_.push_back(std::make_pair
00119 (identity_value(series_.semiring(),
00120 SELECT(semiring_elt_value_t)),
00121 m));
00122 return 0;
00123 }
00124 END
00125
00126 MATCH(Zero)
00127 {
00128 return 0;
00129 }
00130 END
00131
00132 MATCH(One)
00133 {
00134 supp_.push_back(std::make_pair
00135 (identity_value(series_.semiring(),
00136 SELECT(semiring_elt_value_t)),
00137 identity_value(series_.monoid(),
00138 SELECT(monoid_elt_value_t))));
00139 return 0;
00140 }
00141 END
00142
00143 support_t get()
00144 {
00145 support_t ret;
00146 ext_support_t s = ext_get();
00147 for_all_const_(ext_support_t, c, s)
00148 ret.push_back(c->second);
00149 return ret;
00150 }
00151
00152 ext_support_t& ext_get()
00153 {
00154
00155 typedef std::map<monoid_elt_value_t, semiring_elt_value_t> tmap_t;
00156 tmap_t v;
00157 typename tmap_t::iterator f;
00158 for_all_const_(ext_support_t, c, supp_)
00159 {
00160 if ((f = v.find(c->second)) == v.end())
00161 v[c->second] = c->first;
00162 else
00163 v[c->second] = op_add(series_.semiring(), v[c->second], c->first);
00164 }
00165 supp_.clear();
00166 for_all_const_(tmap_t, m, v)
00167 supp_.push_back(std::make_pair(m->second, m->first));
00168 return supp_;
00169 }
00170
00171 private:
00172 ext_support_t supp_;
00173 const series_set_t& series_;
00174 };
00175
00176 }
00177
00178 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_SUPPORT_HXX