derive: option for some optimisations

This commit is contained in:
Antoine Martin 2022-11-10 07:18:29 +01:00
parent 2ef0ea00f4
commit b2b80831ca
2 changed files with 22 additions and 5 deletions

View file

@ -204,7 +204,7 @@ namespace spot
twa_graph_ptr twa_graph_ptr
derive_finite_automaton_with_first(formula f, bdd_dict_ptr bdd_dict, derive_finite_automaton_with_first(formula f, bdd_dict_ptr bdd_dict,
bool deterministic) bool deterministic, derive_opts options)
{ {
auto aut = make_twa_graph(bdd_dict); auto aut = make_twa_graph(bdd_dict);
@ -264,7 +264,7 @@ namespace spot
for (const bdd one : minterms_of(firsts, firsts_support)) for (const bdd one : minterms_of(firsts, firsts_support))
{ {
formula derivative = formula derivative =
partial_derivation(curr_f, one, bdd_dict, aut.get()); partial_derivation(curr_f, one, bdd_dict, aut.get(), options);
// no transition possible from this letter // no transition possible from this letter
if (derivative.is(op::ff)) if (derivative.is(op::ff))
@ -422,7 +422,7 @@ namespace spot
formula formula
partial_derivation(formula f, const bdd var, const bdd_dict_ptr& d, partial_derivation(formula f, const bdd var, const bdd_dict_ptr& d,
void* owner) void* owner, derive_opts options)
{ {
if (f.is_boolean()) if (f.is_boolean())
{ {
@ -472,6 +472,17 @@ namespace spot
formula d_E = partial_derivation(f[0], var, d, owner); formula d_E = partial_derivation(f[0], var, d, owner);
if (options.concat_star_distribute && !f[0].is_finite() && d_E.is(op::OrRat))
{
std::vector<formula> distributed;
for (auto g : d_E)
{
distributed.push_back(formula::Concat({g, formula::Star(f[0], min, max)}));
}
return formula::OrRat(distributed);
}
return formula::Concat({ d_E, formula::Star(f[0], min, max) }); return formula::Concat({ d_E, formula::Star(f[0], min, max) });
} }

View file

@ -29,11 +29,17 @@
namespace spot namespace spot
{ {
struct derive_opts
{
bool concat_star_distribute = true;
};
/// \ingroup tl_misc /// \ingroup tl_misc
/// \brief Produce a SERE formula's partial derivative /// \brief Produce a SERE formula's partial derivative
SPOT_API formula SPOT_API formula
partial_derivation(formula f, const bdd var, const bdd_dict_ptr& d, partial_derivation(formula f, const bdd var, const bdd_dict_ptr& d,
void* owner); void* owner, derive_opts options = {});
SPOT_API twa_graph_ptr SPOT_API twa_graph_ptr
derive_automaton(formula f, bool deterministic = true); derive_automaton(formula f, bool deterministic = true);
@ -47,7 +53,7 @@ namespace spot
SPOT_API twa_graph_ptr SPOT_API twa_graph_ptr
derive_finite_automaton_with_first(formula f, bdd_dict_ptr bdd_dict, derive_finite_automaton_with_first(formula f, bdd_dict_ptr bdd_dict,
bool deterministic = true); bool deterministic = true, derive_opts options = {});
SPOT_API formula SPOT_API formula
rewrite_and_nlm(formula f); rewrite_and_nlm(formula f);