17 #ifndef VCSN_ALGORITHMS_INTERNAL_PARTIAL_RAT_EXP_HXX
18 # define VCSN_ALGORITHMS_INTERNAL_PARTIAL_RAT_EXP_HXX
28 template <
typename Series,
typename T>
29 PartialExp<Series, T>::PartialExp(
const exp_t &e):
34 semiring_elt_list_.push_back(rat_exp_->structure().semiring().identity(
35 SELECT(
typename semiring_elt_t::value_t)));
38 template <
typename Series,
typename T>
39 PartialExp<Series, T>::PartialExp(
const PartialExp &other):
40 rat_exp_(other.rat_exp_),
41 semiring_elt_list_(other.semiring_elt_list_),
42 node_list_(other.node_list_)
45 template <
typename Series,
typename T>
46 PartialExp<Series, T>::PartialExp(
const exp_t &e,
const semiring_elt_t& w):
51 semiring_elt_list_.push_back(w);
55 template <
typename Series,
typename T>
56 template <
typename M,
typename W>
57 PartialExp<Series, T>&
58 PartialExp<Series, T>::insert(
const rat::Node<M, W>* v)
61 if (node_list_.empty() && v->what() == rat::Node<M, W>::prod)
63 const rat::Product<M, W>* p =
64 dynamic_cast<const rat::Product<M, W>*
>(v);
70 node_list_.push_back(v);
71 semiring_elt_list_.push_back(
72 rat_exp_->structure().semiring().
77 template <
typename Series,
typename T>
78 typename PartialExp<Series, T>::semiring_elt_list_t&
79 PartialExp<Series, T>::weights()
81 return semiring_elt_list_;
84 template <
typename Series,
typename T>
85 const typename PartialExp<Series, T>::semiring_elt_list_t&
86 PartialExp<Series, T>::weights()
const
88 return semiring_elt_list_;
91 template <
typename Series,
typename T>
92 const typename PartialExp<Series, T>::node_list_t&
93 PartialExp<Series, T>::nodes()
const
98 template <
typename Series,
typename T>
99 typename PartialExp<Series, T>::node_list_t&
100 PartialExp<Series, T>::nodes()
105 template <
typename Series,
typename T>
106 PartialExp<Series, T>&
107 PartialExp<Series, T>::operator<<=(
const semiring_elt_t& w)
109 semiring_elt_list_.back() *= w;
113 template <
typename Series,
typename T>
114 PartialExp<Series, T>&
115 PartialExp<Series, T>::operator>>=(
const semiring_elt_t& w)
117 semiring_elt_list_.front() = w * semiring_elt_list_.front();
121 template <
typename Series,
typename T>
123 PartialExp<Series, T>::exp_structure()
const
125 return rat_exp_->structure();
128 template <
typename Series,
typename T>
130 PartialExp<Series, T>::exp_value()
const
132 return rat_exp_->value();
135 template <
typename Series,
typename T>
136 const typename PartialExp<Series, T>::exp_t&
137 PartialExp<Series, T>::exp()
const
146 template <
typename Series,
typename T>
147 template <
bool IsConst>
148 PartialExp<Series, T>::internal_iterator<IsConst>::internal_iterator(
149 const semiring_elts_iterator_t& sit,
const nodes_iterator_t& nit ):
150 semiring_elts_iterator_(sit),
151 nodes_iterator_(nit),
155 template <
typename Series,
typename T>
156 template <
bool IsConst>
157 PartialExp<Series, T>::internal_iterator<IsConst>&
158 PartialExp<Series, T>::internal_iterator<IsConst>::operator++()
163 ++semiring_elts_iterator_;
164 on_node_ = not on_node_;
168 template <
typename Series,
typename T>
169 template <
bool IsConst>
170 PartialExp<Series, T>::internal_iterator<IsConst>
171 PartialExp<Series, T>::internal_iterator<IsConst>::operator++(
int)
173 internal_iterator old = *
this;
178 ++semiring_elts_iterator_;
179 on_node_ = not on_node_;
183 template <
typename Series,
typename T>
184 template <
bool IsConst>
185 typename PartialExp<Series, T>::template internal_iterator<IsConst>::
187 PartialExp<Series, T>::internal_iterator<IsConst>::semiring_elt()
const
189 assertion(!on_node_);
190 return *semiring_elts_iterator_;
193 template <
typename Series,
typename T>
194 template <
bool IsConst>
195 typename PartialExp<Series, T>::template internal_iterator<IsConst>::
197 PartialExp<Series, T>::internal_iterator<IsConst>::node()
const
200 return *nodes_iterator_;
203 template <
typename Series,
typename T>
204 template <
bool IsConst>
206 PartialExp<Series, T>::internal_iterator<IsConst>::on_node()
const
211 template <
typename Series,
typename T>
212 template <
bool IsConst>
216 return nodes_iterator_ != other.nodes_iterator_ or
217 semiring_elts_iterator_ != other.semiring_elts_iterator_;
220 template <
typename Series,
typename T>
221 template <
bool IsConst>
223 PartialExp<Series, T>::internal_iterator<IsConst>::operator==(
const internal_iterator& other)
225 return nodes_iterator_ == other.nodes_iterator_ and
226 semiring_elts_iterator_ == other.semiring_elts_iterator_;
229 template <
typename Series,
typename T>
230 typename PartialExp<Series, T>::iterator
231 PartialExp<Series, T>::begin()
233 return iterator(semiring_elt_list_.begin(), node_list_.begin());
236 template <
typename Series,
typename T>
237 typename PartialExp<Series, T>::const_iterator
238 PartialExp<Series, T>::begin()
const
240 return const_iterator(semiring_elt_list_.begin(), node_list_.begin());
243 template <
typename Series,
typename T>
244 typename PartialExp<Series, T>::iterator
245 PartialExp<Series, T>::end()
247 return iterator(semiring_elt_list_.end(), node_list_.end());
250 template <
typename Series,
typename T>
251 typename PartialExp<Series, T>::const_iterator
252 PartialExp<Series, T>::end()
const
254 return const_iterator(semiring_elt_list_.end(), node_list_.end());
261 template <
typename S,
typename T>
262 std::ostream& operator<< (std::ostream& o, const PartialExp<S, T>& e)
264 typename PartialExp<S, T>::const_iterator i = e.begin();
266 o <<
'[' << i.semiring_elt();
268 for (i++; i != e.end(); ++i)
272 typename PartialExp<S, T>::series_set_elt_value_t v(i.node());
273 typename PartialExp<S, T>::exp_t val(e.exp().structure(), v);
278 o <<
'|' << i.semiring_elt();
284 template <
typename S,
typename T,
typename M,
typename W>
285 PartialExp<S, T> prat_exp_convert(
const Element<S, T>& exp,
286 const rat::Node<M, W>* node)
288 typedef typename PartialExp<S, T>::semiring_elt_t semiring_elt_t;
289 semiring_elt_t lw = exp.structure().semiring().identity(
290 SELECT(
typename semiring_elt_t::value_t));
291 semiring_elt_t rw = exp.structure().semiring().identity(
292 SELECT(
typename semiring_elt_t::value_t));
294 while (node->what() == rat::Node<M, W>::lweight or
295 node->what() == rat::Node<M, W>::rweight)
296 if (node->what() == rat::Node<M, W>::lweight)
298 const rat::LeftWeighted<M, W>* p =
299 dynamic_cast<const rat::LeftWeighted<M, W>*
>(node);
300 lw = p->weight_ * lw;
305 const rat::RightWeighted<M, W>* p =
306 dynamic_cast<const rat::RightWeighted<M, W>*
>(node);
310 PartialExp<S, T> res(exp);
317 template <
typename S,
typename T>
318 PartialExp<S, T> prat_exp_convert(
const Element<S, T>& exp)
320 return prat_exp_convert(exp, exp.value().base());
323 template <
typename S,
typename T>
324 std::list<PartialExp<S, T> > prat_exp_convert(
const std::list<Element<S, T> >& listexp)
326 std::list<PartialExp<S, T> > res;
327 for (
typename std::list<Element<S, T> >::const_iterator it =
328 listexp.begin(); it != listexp.end(); ++it)
329 res.push_back(prat_exp_convert(*it, it->value().base()));
333 template <
typename S,
typename T>
334 bool operator< (const PartialExp<S, T>& e1,
const PartialExp<S, T>& e2)
337 typename PartialExp<S, T>::series_set_elt_value_t series_set_elt_value_t;
338 typename PartialExp<S, T>::const_iterator i1 = e1.begin();
339 typename PartialExp<S, T>::const_iterator i2 = e2.begin();
341 if (i1.semiring_elt() != i2.semiring_elt())
342 return (i1.semiring_elt() < i2.semiring_elt());
344 for (i1++, i2++; i1 != e1.end() and i2 != e2.end(); )
346 if (series_set_elt_value_t(i1.node()) != series_set_elt_value_t(i2.node()))
350 if (i1.semiring_elt() != i2.semiring_elt())
355 if (i1 == e1.end() || i2 == e2.end())
356 return (i1 == e1.end() && i2 != e2.end());
357 else if (i1.on_node())
358 return series_set_elt_value_t(i1.node()) < series_set_elt_value_t(i2.node());
360 return i1.semiring_elt() < i2.semiring_elt();
363 template <
typename S,
typename T>
364 bool operator== (
const PartialExp<S, T>& e1,
const PartialExp<S, T>& e2)
367 typename PartialExp<S, T>::series_set_elt_value_t series_set_elt_value_t;
368 typename PartialExp<S, T>::const_iterator i1 = e1.begin();
369 typename PartialExp<S, T>::const_iterator i2 = e2.begin();
371 if (i1.semiring_elt() != i2.semiring_elt())
374 for (i1++, i2++; i1 != e1.end() and i2 != e2.end(); )
376 if (series_set_elt_value_t(i1.node()) != series_set_elt_value_t(i2.node()))
380 if (i1.semiring_elt() != i2.semiring_elt())
385 return (i1 == e1.end() && i2 == e2.end());
388 template <
typename S,
typename T>
389 bool unweighted_inf(
const PartialExp<S, T>& e1,
const PartialExp<S, T>& e2)
392 typename PartialExp<S, T>::series_set_elt_value_t series_set_elt_value_t;
393 typename PartialExp<S, T>::const_iterator i1 = e1.begin();
394 typename PartialExp<S, T>::const_iterator i2 = e2.begin();
396 for (i1++, i2++; i1 != e1.end() and i2 != e2.end(); )
398 if (series_set_elt_value_t(i1.node()) != series_set_elt_value_t(i2.node()))
402 if (i1.semiring_elt() != i2.semiring_elt())
407 if (i1 == e1.end() || i2 == e2.end())
408 return (i1 == e1.end() && i2 != e2.end());
409 else if (i1.on_node())
410 return series_set_elt_value_t(i1.node()) < series_set_elt_value_t(i2.node());
412 return i1.semiring_elt() < i2.semiring_elt();
415 template <
typename S,
typename T>
416 bool unweighted_eq(
const PartialExp<S, T>& e1,
const PartialExp<S, T>& e2)
419 typename PartialExp<S, T>::series_set_elt_value_t series_set_elt_value_t;
420 typename PartialExp<S, T>::const_iterator i1 = e1.begin();
421 typename PartialExp<S, T>::const_iterator i2 = e2.begin();
423 for (i1++, i2++; i1 != e1.end() and i2 != e2.end(); )
425 if (series_set_elt_value_t(i1.node()) != series_set_elt_value_t(i2.node()))
429 if (i1.semiring_elt() != i2.semiring_elt())
434 return (i1 == e1.end() && i2 == e2.end());
439 #endif // ! VCSN_ALGORITHMS_INTERNAL_PARTIAL_RAT_EXP_HXX