43 "derived-term algorithm",
47 {
"breaking_derivation",
"derivation,breaking"},
48 {
"breaking_expansion",
"expansion,breaking"},
50 {
"derivation,breaking", dta{
derivation,
true,
false}},
51 {
"derivation,deterministic",dta{
derivation,
false,
true}},
52 {
"derivation_breaking",
"derivation,breaking"},
53 {
"expansion", dta{
expansion,
false,
false}},
54 {
"expansion,breaking", dta{
expansion,
true,
false}},
55 {
"expansion,deterministic", dta{
expansion,
false,
true}},
56 {
"expansion_breaking",
"expansion,breaking"},
59 if (boost::starts_with(algo,
"lazy,"))
60 algo = algo.substr(5);
79 template <
typename ExpSet,
84 :
gens{rs.labelset()->generators()}
93 template <
typename ExpSet>
128 template <
typename ExpSet>
130 :
public automaton_decorator<expression_automaton<mutable_automaton<context_t_of<ExpSet>>>>
151 static auto res =
symbol{
"derived_term_automaton<"
159 o <<
"derived_term_automaton<";
160 return rs_.print_set(o, fmt) <<
'>';
165 :
super_t{make_shared_ptr<automaton_t>(
rs)}
181 catch (
const std::runtime_error& e)
183 raise(e,
" while computing derived-term of: ",
to_string(
rs_, exp));
191 while (!
aut_->todo_.empty())
193 auto p = std::move(
aut_->todo_.top());
204 while (!
aut_->todo_.empty())
206 auto p = std::move(
aut_->todo_.top());
221 for (
const auto& p:
split(
rs_, exp))
224 aut_->set_initial(exp,
ws_.one());
230 const auto& orig =
aut_->origins();
231 auto sn = orig.at(s);
246 typename = std::enable_if<labelset_t_of<ES>::is_free()>>
249 aut_->set_lazy(s,
false);
256 auto m =
ps_.determinize(p);
260 for (
const auto& m: p)
268 aut_->set_lazy(s,
false);
274 for (
const auto& p:
expansion.polynomials)
276 for (
const auto& m1: p.second)
282 auto m =
ps_.determinize(p.second);
286 for (
const auto& m: p.second)
312 template <
typename ExpSet>
314 = std::shared_ptr<detail::derived_term_automaton_impl<ExpSet>>;
316 template <
typename ExpSet>
323 return make_shared_ptr<res_t>(
rs, algo);
331 template <
typename ExpSet>
332 std::enable_if_t<labelset_t_of<ExpSet>::is_free(),
333 expression_automaton<mutable_automaton<typename ExpSet::context_t>>>
335 const typename ExpSet::value_t&
r,
336 const std::string& algo =
"auto")
340 return dt->operator()(
r);
348 template <
typename ExpSet>
349 std::enable_if_t<!labelset_t_of<ExpSet>::is_free(),
350 expression_automaton<mutable_automaton<typename ExpSet::context_t>>>
352 const typename ExpSet::value_t&
r,
353 const std::string& algo =
"auto")
357 "derived_term: cannot use derivation on non-free labelsets");
362 return dt->via_expansion(r);
370 template <
typename ExpSet,
typename String>
373 const auto& e = exp->as<ExpSet>();
374 const auto& rs = e.valueset();
375 const auto&
r = e.value();
376 if (boost::starts_with(algo,
"lazy,"))
380 "derived_term: laziness works only with expansions");
automaton_t via_derivation(const expression_t &exp)
Compute the derived-term automaton via derivation.
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
std::shared_ptr< detail::expression_automaton_impl< Aut >> expression_automaton
An expression automaton as a shared pointer.
automaton derived_term(const expression &exp, const std::string &algo)
Bridge.
void complete_via_derivation_(state_t s, const expression_t &src)
Compute the outgoing transitions of src.
Additional members when the labelset is free.
typename detail::labelset_t_of_impl< base_t< ValueSet >>::type labelset_t_of
derived_term_algo algo_
How derived terms are computed.
Aggregate an automaton, and forward calls to it.
typename detail::context_t_of_impl< base_t< ValueSet >>::type context_t_of
state_t_of< automaton_t > state_t
weightset_t_of< context_t > weightset_t
bool breaking
Whether to break sums.
typename labelset_t_of< ExpSet >::genset_t genset_t
The alphabet.
auto all_out(state_t s) const -> decltype(vcsn::detail::all_out(aut_, s))
All the outgoing transitions.
void require(Bool b, Args &&...args)
If b is not verified, raise an error with args as message.
bool determinize
Whether to determinize the expansions and produce a deterministic automaton, at the expense of possib...
derived_term_automaton_impl(const expressionset_t &rs, derived_term_algo algo)
expression_automaton< mutable_automaton< context_t >> automaton_t
The type of the (strict) automaton we build.
auto is_lazy(Args &&...args) const -> decltype(aut_-> is_lazy(std::forward< Args >(args)...))
automaton_t via_expansion(const expression_t &exp)
Compute the derived-term automaton via expansion.
Compute the derived-term automaton from an expression.
std::shared_ptr< detail::derived_term_automaton_impl< ExpSet >> derived_term_automaton
A derived-term automaton as a shared pointer.
auto weight_of(Args &&...args) const -> decltype(aut_-> weight_of(std::forward< Args >(args)...))
auto label_of(Args &&...args) const -> decltype(aut_-> label_of(std::forward< Args >(args)...))
void complete_(state_t s) const
Complete a state: find its outgoing transitions.
typename detail::state_t_of_impl< base_t< ValueSet >>::type state_t_of
rat::expression_polynomial_t< ExpSet > derivation(const ExpSet &rs, const typename ExpSet::value_t &e, label_t_of< ExpSet > a, bool breaking=false)
Derive an expression wrt to a letter.
derived_term_automaton_members(const ExpSet &rs)
void complete_via_expansion_(state_t s, const expression_t &src)
Compute the outgoing transitions of src.
expressionset_t rs_
The expression's set.
auto make_derived_term_automaton(const ExpSet &rs, const detail::derived_term_algo &algo) -> derived_term_automaton< ExpSet >
An input/output format for valuesets.
void init_(const expression_t &exp)
Initialize the computation: build the initial states.
auto map(const std::tuple< Ts... > &ts, Fun f) -> decltype(map_tuple_(f, ts, make_index_sequence< sizeof...(Ts)>()))
Map a function on a tuple, return tuple of the results.
value_impl< detail::expansion_tag > expansion
derived_term_algo(std::string algo)
From algo name to algo.
std::string to_string(direction d)
Conversion to string.
std::enable_if_t< labelset_t_of< ExpSet >::is_free(), expression_automaton< mutable_automaton< typename ExpSet::context_t > > > derived_term(const ExpSet &rs, const typename ExpSet::value_t &r, const std::string &algo="auto")
The derived-term automaton, for free labelsets.
rat::expression_polynomial_t< ExpSet > split(const ExpSet &rs, const typename ExpSet::value_t &e)
Split an expression.
typename expressionset_t::value_t expression_t
Our state names: expressions.
Specify a variety of derived-term construction.
to_expansion_t to_expansion_
algo_t algo
Core algorithm.
derived_term_algo(algo_t a, bool b, bool d)
derived_term_automaton_members< expressionset_t > members_
Possibly the generators.
weightset_t ws_
Its weightset.
typename detail::weightset_t_of_impl< base_t< ValueSet >>::type weightset_t_of
automaton_t aut_
The wrapped automaton, possibly const.
automaton_t operator()(const expression_t &exp)
Compute the derived-term automaton.
expression_polynomialset_t< ExpSet > make_expression_polynomialset(const ExpSet &rs)
From a ExpSet to its polynomialset.
derived_term_automaton_members(const ExpSet &)
A mapping from strings to Values.
Provide a variadic mul on top of a binary mul(), and one().
auto all_out(const Aut &aut, state_t_of< Aut > s)
Indexes of transitions leaving state s.
std::ostream & print_set(std::ostream &o, format fmt={}) const
value_t determinize(const value_t &v) const
Turn the polynomials into (normalized) monomials.
weight_t_of< ExpSet > constant_term(const ExpSet &rs, const typename ExpSet::value_t &e)
The constant term of e.
value_impl< detail::expression_tag > expression
context_t_of< expressionset_t > context_t
weightset_mixin< detail::r_impl > r