expansions: store as vector of pairs
This commit is contained in:
parent
0a89377400
commit
9faef36529
2 changed files with 31 additions and 27 deletions
|
|
@ -153,7 +153,7 @@ namespace spot
|
||||||
return var_num;
|
return var_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdd_finalizer(std::multimap<bdd, formula, bdd_less_than>& exp, bdd_dict_ptr d, bool opt_sigma_star, bool opt_bdd_encode)
|
bdd_finalizer(expansion_t& exp, bdd_dict_ptr d, bool opt_sigma_star, bool opt_bdd_encode)
|
||||||
: anon_set_(bddtrue)
|
: anon_set_(bddtrue)
|
||||||
, d_(d)
|
, d_(d)
|
||||||
, opt_sigma_star_(opt_sigma_star)
|
, opt_sigma_star_(opt_sigma_star)
|
||||||
|
|
@ -278,9 +278,13 @@ namespace spot
|
||||||
bdd dest_bdd = bdd_restrict(exp_, letter);
|
bdd dest_bdd = bdd_restrict(exp_, letter);
|
||||||
formula dest = bdd_to_sere(dest_bdd);
|
formula dest = bdd_to_sere(dest_bdd);
|
||||||
|
|
||||||
auto it = res.insert({letter, dest});
|
#ifndef NDEBUG
|
||||||
assert(it.second);
|
// make sure it didn't exist before
|
||||||
(void) it;
|
auto it = std::find(res.begin(), res.end(), {letter, dest});
|
||||||
|
SPOT_ASSERT(it == res.end());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
res.push_back({letter, dest});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // BddIsop
|
else // BddIsop
|
||||||
|
|
@ -293,7 +297,7 @@ namespace spot
|
||||||
bdd suffix = bdd_existcomp(cube, anon_set_);
|
bdd suffix = bdd_existcomp(cube, anon_set_);
|
||||||
formula dest = conj_bdd_to_sere(suffix);
|
formula dest = conj_bdd_to_sere(suffix);
|
||||||
|
|
||||||
res.insert({letter, dest});
|
res.push_back({letter, dest});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -326,7 +330,7 @@ namespace spot
|
||||||
exp.clear();
|
exp.clear();
|
||||||
for (const auto [suffix, prefix] : unique_map)
|
for (const auto [suffix, prefix] : unique_map)
|
||||||
{
|
{
|
||||||
exp.insert({prefix, suffix});
|
exp.push_back({prefix, suffix});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -366,14 +370,14 @@ namespace spot
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& sub_f : single)
|
for (const auto& sub_f : single)
|
||||||
exp.insert({prefix, sub_f});
|
exp.push_back({prefix, sub_f});
|
||||||
|
|
||||||
if (!merge.empty())
|
if (!merge.empty())
|
||||||
exp.insert({prefix, formula::OrRat(merge)});
|
exp.push_back({prefix, formula::OrRat(merge)});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
exp.insert({prefix, suffix});
|
exp.push_back({prefix, suffix});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -394,13 +398,13 @@ namespace spot
|
||||||
exp.clear();
|
exp.clear();
|
||||||
for (const auto [suffix, prefix] : unique_map)
|
for (const auto [suffix, prefix] : unique_map)
|
||||||
{
|
{
|
||||||
exp.insert({prefix, suffix});
|
exp.push_back({prefix, suffix});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts & exp_opts::expand_opt::Determinize)
|
if (opts & exp_opts::expand_opt::Determinize)
|
||||||
{
|
{
|
||||||
std::multimap<bdd, formula, bdd_less_than> exp_new;
|
expansion_t exp_new;
|
||||||
|
|
||||||
bdd props = bddtrue;
|
bdd props = bddtrue;
|
||||||
for (const auto& [prefix, _] : exp)
|
for (const auto& [prefix, _] : exp)
|
||||||
|
|
@ -415,7 +419,7 @@ namespace spot
|
||||||
dests.push_back(suffix);
|
dests.push_back(suffix);
|
||||||
}
|
}
|
||||||
formula or_dests = formula::OrRat(dests);
|
formula or_dests = formula::OrRat(dests);
|
||||||
exp_new.insert({letter, or_dests});
|
exp_new.push_back({letter, or_dests});
|
||||||
dests.clear();
|
dests.clear();
|
||||||
}
|
}
|
||||||
exp = exp_new;
|
exp = exp_new;
|
||||||
|
|
@ -449,7 +453,7 @@ namespace spot
|
||||||
expansion_t
|
expansion_t
|
||||||
expansion(formula f, const bdd_dict_ptr& d, void *owner, exp_opts::expand_opt opts, std::unordered_set<formula>* seen)
|
expansion(formula f, const bdd_dict_ptr& d, void *owner, exp_opts::expand_opt opts, std::unordered_set<formula>* seen)
|
||||||
{
|
{
|
||||||
using exp_t = std::multimap<bdd, formula, bdd_less_than>;
|
using exp_t = expansion_t;
|
||||||
|
|
||||||
if (f.is_boolean())
|
if (f.is_boolean())
|
||||||
{
|
{
|
||||||
|
|
@ -484,7 +488,7 @@ namespace spot
|
||||||
exp_t res;
|
exp_t res;
|
||||||
for (const auto& [bdd_l, form] : exps)
|
for (const auto& [bdd_l, form] : exps)
|
||||||
{
|
{
|
||||||
res.insert({bdd_l, formula::Concat({form, f.all_but(0)})});
|
res.push_back({bdd_l, formula::Concat({form, f.all_but(0)})});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f[0].accepts_eword())
|
if (f[0].accepts_eword())
|
||||||
|
|
@ -492,7 +496,7 @@ namespace spot
|
||||||
auto exps_rest = rec(f.all_but(0));
|
auto exps_rest = rec(f.all_but(0));
|
||||||
for (const auto& [bdd_l, form] : exps_rest)
|
for (const auto& [bdd_l, form] : exps_rest)
|
||||||
{
|
{
|
||||||
res.insert({bdd_l, form});
|
res.push_back({bdd_l, form});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -518,7 +522,7 @@ namespace spot
|
||||||
exp_t res;
|
exp_t res;
|
||||||
for (const auto& [li, ei] : exp)
|
for (const auto& [li, ei] : exp)
|
||||||
{
|
{
|
||||||
res.insert({li, formula::Fusion({ei, E_i_j_minus})});
|
res.push_back({li, formula::Fusion({ei, E_i_j_minus})});
|
||||||
|
|
||||||
if (ei.accepts_eword() && f.min() != 0)
|
if (ei.accepts_eword() && f.min() != 0)
|
||||||
{
|
{
|
||||||
|
|
@ -526,12 +530,12 @@ namespace spot
|
||||||
{
|
{
|
||||||
// FIXME: build bdd once
|
// FIXME: build bdd once
|
||||||
if ((li & ki) != bddfalse)
|
if ((li & ki) != bddfalse)
|
||||||
res.insert({li & ki, fi});
|
res.push_back({li & ki, fi});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (f.min() == 0)
|
if (f.min() == 0)
|
||||||
res.insert({bddtrue, formula::eword()});
|
res.push_back({bddtrue, formula::eword()});
|
||||||
|
|
||||||
finalize(res, opts, d, seen);
|
finalize(res, opts, d, seen);
|
||||||
return res;
|
return res;
|
||||||
|
|
@ -549,7 +553,7 @@ namespace spot
|
||||||
exp_t res;
|
exp_t res;
|
||||||
for (const auto& [bdd_l, form] : exps)
|
for (const auto& [bdd_l, form] : exps)
|
||||||
{
|
{
|
||||||
res.insert({bdd_l, formula::Concat({form, formula::Star(f[0], min, max)})});
|
res.push_back({bdd_l, formula::Concat({form, formula::Star(f[0], min, max)})});
|
||||||
}
|
}
|
||||||
|
|
||||||
finalize(res, opts, d, seen);
|
finalize(res, opts, d, seen);
|
||||||
|
|
@ -571,7 +575,7 @@ namespace spot
|
||||||
exp_t res;
|
exp_t res;
|
||||||
for (const auto& [bdd_l, form] : exps)
|
for (const auto& [bdd_l, form] : exps)
|
||||||
{
|
{
|
||||||
res.insert({bdd_l, form});
|
res.push_back({bdd_l, form});
|
||||||
}
|
}
|
||||||
|
|
||||||
// determinize
|
// determinize
|
||||||
|
|
@ -604,7 +608,7 @@ namespace spot
|
||||||
dests.push_back(ndet_dest);
|
dests.push_back(ndet_dest);
|
||||||
}
|
}
|
||||||
formula or_dests = formula::OrRat(dests);
|
formula or_dests = formula::OrRat(dests);
|
||||||
res_det.insert({l, or_dests});
|
res_det.push_back({l, or_dests});
|
||||||
dests.clear();
|
dests.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -630,9 +634,9 @@ namespace spot
|
||||||
{
|
{
|
||||||
for (const auto& [kj, fj] : Fj)
|
for (const auto& [kj, fj] : Fj)
|
||||||
if ((li & kj) != bddfalse)
|
if ((li & kj) != bddfalse)
|
||||||
res.insert({li & kj, fj});
|
res.push_back({li & kj, fj});
|
||||||
}
|
}
|
||||||
res.insert({li, formula::Fusion({ei, F})});
|
res.push_back({li, formula::Fusion({ei, F})});
|
||||||
}
|
}
|
||||||
|
|
||||||
finalize(res, opts, d, seen);
|
finalize(res, opts, d, seen);
|
||||||
|
|
@ -669,7 +673,7 @@ namespace spot
|
||||||
{
|
{
|
||||||
if ((l_key & r_key) != bddfalse)
|
if ((l_key & r_key) != bddfalse)
|
||||||
{
|
{
|
||||||
new_res.insert({l_key & r_key, formula::multop(f.kind(), {l_val, r_val})});
|
new_res.push_back({l_key & r_key, formula::multop(f.kind(), {l_val, r_val})});
|
||||||
inserted = true;
|
inserted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -705,7 +709,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& [label, dest] : exps)
|
for (const auto& [label, dest] : exps)
|
||||||
res.insert({label, dest});
|
res.push_back({label, dest});
|
||||||
}
|
}
|
||||||
|
|
||||||
finalize(res, opts, d, seen);
|
finalize(res, opts, d, seen);
|
||||||
|
|
@ -732,7 +736,7 @@ namespace spot
|
||||||
struct signature_hash
|
struct signature_hash
|
||||||
{
|
{
|
||||||
std::size_t
|
std::size_t
|
||||||
operator() (const std::pair<bool, std::multimap<bdd, formula, bdd_less_than>>& sig) const
|
operator() (const std::pair<bool, expansion_t>& sig) const
|
||||||
{
|
{
|
||||||
size_t hash = std::hash<bool>()(sig.first);
|
size_t hash = std::hash<bool>()(sig.first);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
using expansion_t = std::multimap<bdd, formula, bdd_less_than>;
|
using expansion_t = std::vector<std::pair<bdd, formula>>;
|
||||||
|
|
||||||
struct exp_opts
|
struct exp_opts
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue