25 template <
typename A,
typename B>
34 state_t_of<A> initial = res->dst_of(res->initial_transitions().front());
35 for (
auto s: b->states())
36 m.emplace(s, b->is_initial(s) ? initial : res->new_state());
37 m.emplace(b->pre(), res->pre());
38 m.emplace(b->post(), res->post());
41 for (
auto t: b->all_transitions())
44 if (b->src_of(t) != b->pre())
46 if (b->dst_of(t) == b->post())
47 res->add_transition(m[b->src_of(t)], m[b->dst_of(t)],
49 res->weightset()->conv(*b->weightset(),
52 res->new_transition(m[b->src_of(t)], m[b->dst_of(t)],
54 res->weightset()->conv(*b->weightset(),
61 template <
typename A,
typename B>
64 sum(
const A& lhs,
const B& rhs)
69 res->set_initial(res->new_state());
80 template <
typename Lhs,
typename Rhs>
84 const auto& l = lhs->as<Lhs>();
85 const auto&
r = rhs->as<Rhs>();
97 template <
typename ValueSet>
99 typename ValueSet::value_t
101 const typename ValueSet::value_t& lhs,
102 const typename ValueSet::value_t& rhs)
104 return vs.add(lhs, rhs);
113 template <
typename PolynomialSetLhs,
typename PolynomialSetRhs>
117 const auto& l = lhs->as<PolynomialSetLhs>();
118 const auto&
r = rhs->as<PolynomialSetRhs>();
119 auto rs =
join(l.polynomialset(), r.polynomialset());
120 auto lr = rs.conv(l.polynomialset(), l.polynomial());
121 auto rr = rs.conv(r.polynomialset(), r.polynomial());
137 template <
typename ExpSetLhs,
typename ExpSetRhs>
141 const auto& l = lhs->as<ExpSetLhs>();
142 const auto&
r = rhs->as<ExpSetRhs>();
143 auto rs =
join(l.expressionset(), r.expressionset());
144 auto lr = rs.conv(l.expressionset(), l.expression());
145 auto rr = rs.conv(r.expressionset(), r.expression());
161 template <
typename WeightSetLhs,
typename WeightSetRhs>
165 const auto& l = lhs->as<WeightSetLhs>();
166 const auto&
r = rhs->as<WeightSetRhs>();
167 auto rs =
join(l.weightset(), r.weightset());
168 auto lr = rs.conv(l.weightset(), l.weight());
169 auto rr = rs.conv(r.weightset(), r.weight());
A & sum_here(A &res, const B &b)
Merge transitions of b into those of res.
automaton sum(const automaton &lhs, const automaton &rhs)
Bridge.
typename detail::state_t_of_impl< base_t< ValueSet >>::type state_t_of
automaton make_automaton(const Aut &aut)
Build a dyn::automaton.
expression sum_expression(const expression &lhs, const expression &rhs)
Bridge (sum).
std::shared_ptr< const detail::weight_base > weight
polynomial make_polynomial(const PolynomialSet &ps, const typename PolynomialSet::value_t &p)
bool is_standard(const Aut &a)
Whether a is standard.
Provide a variadic mul on top of a binary mul(), and one().
weight make_weight(const WeightSet &ws, const typename WeightSet::value_t &w)
std::shared_ptr< detail::automaton_base > automaton
void require(bool b, Args &&...args)
If b is not verified, raise an error with args as message.
std::shared_ptr< const detail::polynomial_base > polynomial
expression make_expression(const ExpSet &rs, const typename ExpSet::value_t &r)
polynomial sum_polynomial(const polynomial &lhs, const polynomial &rhs)
Bridge (sum).
auto sum(const A &lhs, const B &rhs) -> decltype(join_automata(lhs, rhs))
auto join_automata(Auts &&...auts) -> decltype(make_mutable_automaton(join(auts->context()...)))
An automaton whose type is the join between those of auts.
weight sum_weight(const weight &lhs, const weight &rhs)
Bridge (sum).
std::shared_ptr< detail::expression_base > expression
context join(const context &c1, const context &c2)
Bridge.