Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
prefix.hh
Go to the documentation of this file.
1 #ifndef VCSN_ALGOS_PREFIX_HH
2 # define VCSN_ALGOS_PREFIX_HH
3 
4 # include <vcsn/algos/accessible.hh>
5 # include <vcsn/dyn/automaton.hh> // dyn::make_automaton
6 # include <vcsn/dyn/fwd.hh>
7 
8 namespace vcsn
9 {
10  /*---------.
11  | suffix. |
12  `---------*/
13 
15  template <typename Aut>
16  Aut&
17  suffix_here(Aut& aut)
18  {
19  for (auto s : accessible_states(aut))
20  if (s != aut->pre()
21  && s != aut->post()
22  && !aut->is_initial(s))
23  aut->set_initial(s);
24  return aut;
25  }
26 
27  template <typename Aut>
28  auto
29  suffix(const Aut& aut)
30  ->decltype(::vcsn::copy(aut))
31  {
32  auto res = ::vcsn::copy(aut);
33  suffix_here(res);
34  return res;
35  }
36 
37  namespace dyn
38  {
39  namespace detail
40  {
42  template <typename Aut>
43  automaton
44  suffix(const automaton& aut)
45  {
46  const auto& a = aut->as<Aut>();
47  return make_automaton(::vcsn::suffix(a));
48  }
49 
51  (const automaton& aut) -> automaton);
52  }
53  }
54 
55 
56  /*---------.
57  | prefix. |
58  `---------*/
59 
61  template <typename Aut>
62  Aut&
63  prefix_here(Aut& aut)
64  {
65  auto t = transpose(aut);
66  suffix_here(t);
67  return aut;
68  }
69 
70  template <typename Aut>
71  auto
72  prefix(const Aut& aut)
73  ->decltype(::vcsn::copy(aut))
74  {
75  auto res = ::vcsn::copy(aut);
76  prefix_here(res);
77  return res;
78  }
79 
80  namespace dyn
81  {
82  namespace detail
83  {
85  template <typename Aut>
86  automaton
87  prefix(const automaton& aut)
88  {
89  const auto& a = aut->as<Aut>();
90  return make_automaton(::vcsn::prefix(a));
91  }
92 
94  (const automaton& aut) -> automaton);
95  }
96  }
97 
98  /*---------.
99  | factor. |
100  `---------*/
101 
103  template <typename Aut>
104  Aut&
105  factor_here(Aut& aut)
106  {
107  for (auto s : useful_states(aut))
108  if (s != aut->pre() && s != aut->post())
109  {
110  if (!aut->is_initial(s))
111  aut->set_initial(s);
112  if (!aut->is_final(s))
113  aut->set_final(s);
114  }
115  return aut;
116  }
117 
118  template <typename Aut>
119  auto
120  factor(const Aut& aut)
121  ->decltype(::vcsn::copy(aut))
122  {
123  auto res = ::vcsn::copy(aut);
124  factor_here(res);
125  return res;
126  }
127 
128  namespace dyn
129  {
130  namespace detail
131  {
132  // Bridge.
133  template <typename Aut>
134  automaton
135  factor(const automaton& aut)
136  {
137  const auto& a = aut->as<Aut>();
138  return make_automaton(::vcsn::factor(a));
139  }
140 
142  (const automaton& aut) -> automaton);
143  }
144  }
145 
146  /*----------.
147  | subword. |
148  `----------*/
149 
152  template <typename Aut>
153  Aut&
154  subword_here(Aut& aut)
155  {
156  const auto one = aut->labelset()->one();
157 
158  std::vector<transition_t_of<Aut>> ts;
159  for (auto s : aut->states())
160  {
161  ts.clear();
162  for (auto t : aut->out(s))
163  if (!aut->labelset()->is_one(aut->label_of(t)))
164  ts.emplace_back(t);
165  for (auto t : ts)
166  aut->add_transition(s, aut->dst_of(t), one, aut->weight_of(t));
167  }
168 
169  return aut;
170  }
171 
173  template <typename Aut>
174  auto
175  subword(const Aut& aut)
176  ->decltype(::vcsn::copy(aut))
177  {
178  auto res = ::vcsn::copy(aut);
179  subword_here(res);
180  return res;
181  }
182 
183  namespace dyn
184  {
185  namespace detail
186  {
188  template <typename Aut>
189  automaton
190  subword(const automaton& aut)
191  {
192  const auto& a = aut->as<Aut>();
193  return make_automaton(::vcsn::subword(a));
194  }
195 
197  (const automaton& aut) -> automaton);
198  }
199  }
200 } // namespace vcsn
201 
202 #endif // !VCSN_ALGOS_PREFIX_HH
automaton prefix(const automaton &aut)
Bridge.
Definition: prefix.hh:87
automaton suffix(const automaton &aut)
Bridge.
Definition: prefix.hh:44
REGISTER_DECLARE(accessible,(const automaton &) -> automaton)
std::shared_ptr< detail::automaton_base > automaton
Definition: automaton.hh:71
states_t< Aut > useful_states(const Aut &a)
Definition: accessible.hh:69
auto subword(const Aut &aut) -> decltype(::vcsn::copy(aut))
Apply subword_here() to a copy of aut.
Definition: prefix.hh:175
automaton make_automaton(const Aut &aut)
Build a dyn::automaton.
Definition: automaton.hh:77
AutOut copy(const AutIn &input, Pred keep_state)
A copy of input keeping only its states that are accepted by keep_state.
Definition: copy.hh:171
auto factor(const Aut &aut) -> decltype(::vcsn::copy(aut))
Definition: prefix.hh:120
Aut & prefix_here(Aut &aut)
Make all coaccessible states final.
Definition: prefix.hh:63
states_t< Aut > accessible_states(const Aut &aptr)
Definition: accessible.hh:27
Aut & subword_here(Aut &aut)
Add spontaneous transitions for each non spontaneous transition, with same source, destination and weight.
Definition: prefix.hh:154
Aut transpose(const transpose_automaton< Aut > &aut)
Definition: transpose.hh:230
Aut & suffix_here(Aut &aut)
Make all accessible states initial.
Definition: prefix.hh:17
automaton subword(const automaton &aut)
Bridge.
Definition: prefix.hh:190
Aut & factor_here(Aut &aut)
Make each useful state both initial and final.
Definition: prefix.hh:105
automaton factor(const automaton &aut)
Definition: prefix.hh:135
auto suffix(const Aut &aut) -> decltype(::vcsn::copy(aut))
Definition: prefix.hh:29
auto prefix(const Aut &aut) -> decltype(::vcsn::copy(aut))
Definition: prefix.hh:72