Vcsn  2.8
Be Rational
de-bruijn.hh
Go to the documentation of this file.
1 #pragma once
2 
4 #include <vcsn/dyn/automaton.hh>
5 #include <vcsn/dyn/context.hh>
6 #include <vcsn/misc/algorithm.hh> // vcsn::front
7 #include <vcsn/misc/raise.hh>
8 
9 namespace vcsn
10 {
12  template <typename Context>
13  mutable_automaton<Context>
14  de_bruijn(const Context& ctx, unsigned n)
15  {
16  const auto& ls = *ctx.labelset();
17  const auto& gens = ls.generators();
18 
19  require(2 <= boost::distance(gens),
20  "de_bruijn: ", ctx, ": the alphabet needs at least 2 letters");
21 
22  auto res = make_mutable_automaton(ctx);
23 
24  auto new_universal_transition =
25  [&res, &gens, &ls](const auto src, const auto dst)
26  {
27  for (auto l: gens)
28  res->new_transition(src, dst, ls.value(l));
29  return dst;
30  };
31 
32  const auto init = res->new_state();
33  res->set_initial(init);
34  new_universal_transition(init, init);
35 
36  auto last = res->new_state();
37  res->new_transition(init, last, ls.value(detail::front(gens)));
38 
39  while (n--)
40  last = new_universal_transition(last, res->new_state());
41 
42  res->set_final(last);
43  return res;
44  }
45 
46  /*-----------------.
47  | dyn::de_bruijn. |
48  `-----------------*/
49 
50  namespace dyn
51  {
52  namespace detail
53  {
55  template <typename Ctx, typename Unsigned>
56  automaton
57  de_bruijn(const dyn::context& ctx, unsigned n)
58  {
59  const auto& c = ctx->as<Ctx>();
61  }
62  }
63  }
64 }
mutable_automaton< Context > de_bruijn(const Context &ctx, unsigned n)
Build a automaton for (a+b)*a(a+b){n}.
Definition: de-bruijn.hh:14
Template-less root for contexts.
Definition: context.hh:16
Definition: a-star.hh:8
auto & as()
Downcast to the exact type.
Definition: context.hh:36
Container::value_type front(const Container &container)
The first member of this Container.
Definition: algorithm.hh:72
automaton de_bruijn(const dyn::context &ctx, unsigned n)
Bridge.
Definition: de-bruijn.hh:57
mutable_automaton< Context > make_mutable_automaton(const Context &ctx)
void require(Bool b, Args &&... args)
If b is not verified, raise an error with args as message.
Definition: raise.hh:87
return res
Definition: multiply.hh:399