translate: add a new relabel-overlap option

Fixes issue #536.  Also a part of issue #500.

* spot/twaalgos/translate.hh, spot/twaalgos/translate.cc: Implement
this new option.
* bin/spot-x.cc, NEWS: Mention it.
* tests/core/ltl2tgba2.test: Add the test case from issue #536.
This commit is contained in:
Alexandre Duret-Lutz 2023-08-28 22:45:44 +02:00
parent 18478e663f
commit 110b052b7d
5 changed files with 92 additions and 14 deletions

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*-
// Copyright (C) 2013-2018, 2020-2022 Laboratoire de Recherche et
// Copyright (C) 2013-2018, 2020-2023 Laboratoire de Recherche et
// Développement de l'Epita (LRDE).
//
// This file is part of Spot, a model checking library.
@ -38,6 +38,7 @@ namespace spot
{
comp_susp_ = early_susp_ = skel_wdba_ = skel_simul_ = 0;
relabel_bool_ = 4;
relabel_overlap_ = 8;
tls_impl_ = -1;
ltl_split_ = true;
exprop_ = -1;
@ -47,6 +48,7 @@ namespace spot
return;
relabel_bool_ = opt->get("relabel-bool", 4);
relabel_overlap_ = opt->get("relabel-overlap", 6);
comp_susp_ = opt->get("comp-susp", 0);
if (comp_susp_ == 1)
{
@ -480,15 +482,23 @@ namespace spot
// 2) has some Boolean subformula
// 3) relabel_bse() actually reduces the number of atomic
// propositions.
//
// If the formula still has more than relabel_overlap_ APs after
// the above, we try the more aggressive relabel_overlapping_bse()
// function. However after applying this function, we might have
// false edges.
relabeling_map m;
formula to_work_on = *f;
if (relabel_bool_ > 0)
if (relabel_bool_ > 0 || relabel_overlap_ > 0)
{
std::set<formula> aps;
atomic_prop_collect(to_work_on, &aps);
unsigned atomic_props = aps.size();
if (atomic_props >= (unsigned) relabel_bool_)
if ((relabel_bool_
&& atomic_props >= (unsigned) relabel_bool_)
|| (relabel_overlap_
&& atomic_props >= (unsigned) relabel_overlap_))
{
// Make a very quick simplification path before for
// Boolean subformulas, only only syntactic rules. This
@ -507,14 +517,15 @@ namespace spot
options.nenoform_stop_on_boolean = true;
options.boolean_to_isop = false;
tl_simplifier simpl(options, simpl_->get_dict());
to_work_on = simpl.simplify(to_work_on);
formula simplified = to_work_on = simpl.simplify(to_work_on);
// Do we have Boolean subformulas that are not atomic
// propositions?
bool has_boolean_sub = false;
to_work_on.traverse([&](const formula& f)
{
if (f.is_boolean())
if (f.is_boolean()
&& !f.is(op::ap, op::Not))
{
has_boolean_sub = true;
return true;
@ -524,11 +535,34 @@ namespace spot
if (has_boolean_sub)
{
formula relabeled = relabel_bse(to_work_on, Pnn, &m);
if (m.size() < atomic_props)
to_work_on = relabeled;
else
m.clear();
if (relabel_bool_
&& atomic_props >= (unsigned) relabel_bool_)
{
formula relabeled = relabel_bse(to_work_on, Pnn, &m);
if (m.size() < atomic_props)
{
atomic_props = m.size();
to_work_on = relabeled;
}
else
{
m.clear();
}
}
if (relabel_overlap_
&& atomic_props >= (unsigned) relabel_overlap_)
{
relabeling_map m2;
formula relabeled =
relabel_overlapping_bse(simplified, Pnn, &m2);
if (m2.size() < atomic_props)
{
atomic_props = m2.size();
to_work_on = relabeled;
std::swap(m, m2);
}
m2.clear();
}
}
}
}

View file

@ -1,6 +1,6 @@
// -*- coding: utf-8 -*-
// Copyright (C) 2013-2018, 2020, 2022 Laboratoire de Recherche et Développement
// de l'Epita (LRDE).
// Copyright (C) 2013-2018, 2020, 2022, 2023 Laboratoire de Recherche
// et Développement de l'Epita (LRDE).
//
// This file is part of Spot, a model checking library.
//
@ -150,6 +150,7 @@ namespace spot
int skel_wdba_;
int skel_simul_;
int relabel_bool_;
int relabel_overlap_;
int tls_impl_;
bool gf_guarantee_ = true;
bool gf_guarantee_set_ = false;