Commit 59a2763f authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

* src/tgbaalgos/degen.cc (outgoing_acc): Fill both caches at once.

parent 5dbee4fa
...@@ -97,50 +97,48 @@ namespace spot ...@@ -97,50 +97,48 @@ namespace spot
class outgoing_acc class outgoing_acc
{ {
const tgba* a_; const tgba* a_;
typedef Sgi::hash_map<const state*, bdd, typedef std::pair<bdd, bdd> cache_entry;
state_ptr_hash, state_ptr_equal> accmap_t; typedef Sgi::hash_map<const state*, cache_entry,
mutable accmap_t accmap_; state_ptr_hash, state_ptr_equal> cache_t;
mutable accmap_t accmapu_; cache_t cache_;
public: public:
outgoing_acc(const tgba* a): a_(a) outgoing_acc(const tgba* a): a_(a)
{ {
} }
bdd common_acc(const state* s) cache_t::const_iterator fill_cache(const state* s)
{ {
// Lookup cache
accmap_t::const_iterator i = accmap_.find(s);
if (i != accmap_.end())
return i->second;
bdd common = a_->all_acceptance_conditions(); bdd common = a_->all_acceptance_conditions();
bdd union_ = bddfalse;
tgba_succ_iterator* it = a_->succ_iter(s); tgba_succ_iterator* it = a_->succ_iter(s);
for (it->first(); !it->done() && common != bddfalse; it->next()) for (it->first(); !it->done(); it->next())
common &= it->current_acceptance_conditions(); {
bdd set = it->current_acceptance_conditions();
common &= set;
union_ |= set;
}
delete it; delete it;
cache_entry e(common, union_);
return cache_.insert(std::make_pair(s, e)).first;
}
// Populate cache // Intersection of all outgoing acceptance sets
accmap_[s->clone()] = common; bdd common_acc(const state* s)
return common; {
cache_t::const_iterator i = cache_.find(s);
if (i == cache_.end())
i = fill_cache(s);
return i->second.first;
} }
// Union of all outgoing acceptance sets
bdd union_acc(const state* s) bdd union_acc(const state* s)
{ {
// Lookup cache cache_t::const_iterator i = cache_.find(s);
accmap_t::const_iterator i = accmapu_.find(s); if (i == cache_.end())
if (i != accmapu_.end()) i = fill_cache(s);
return i->second; return i->second.second;
bdd common = bddfalse;
tgba_succ_iterator* it = a_->succ_iter(s);
for (it->first(); !it->done(); it->next())
common |= it->current_acceptance_conditions();
delete it;
// Populate cache
accmapu_[s->clone()] = common;
return common;
} }
}; };
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment