Have scc_map keep track of APs that are reachable from a SCC.
* src/tgbaalgos/scc.hh (scc_map::scc): Add a supp_rec member to hold reachable APs. * src/tgbaalgos/scc.cc (scc_map::update_supp_rec): New function, to update supp_rec. (scc_map::build_map): Call it. (scc_map::aprec_set_of): New function. (dump_scc_dot): Show the output of aprec_set_of().
This commit is contained in:
parent
b3486965a0
commit
fa8dd7f160
3 changed files with 63 additions and 5 deletions
12
ChangeLog
12
ChangeLog
|
|
@ -1,3 +1,15 @@
|
||||||
|
2009-09-17 Alexandre Duret-Lutz <adl@lrde.epita.fr>
|
||||||
|
|
||||||
|
Have scc_map keep track of APs that are reachable from a SCC.
|
||||||
|
|
||||||
|
* src/tgbaalgos/scc.hh (scc_map::scc): Add a supp_rec member to
|
||||||
|
hold reachable APs.
|
||||||
|
* src/tgbaalgos/scc.cc (scc_map::update_supp_rec): New function,
|
||||||
|
to update supp_rec.
|
||||||
|
(scc_map::build_map): Call it.
|
||||||
|
(scc_map::aprec_set_of): New function.
|
||||||
|
(dump_scc_dot): Show the output of aprec_set_of().
|
||||||
|
|
||||||
2009-09-17 Alexandre Duret-Lutz <adl@lrde.epita.fr>
|
2009-09-17 Alexandre Duret-Lutz <adl@lrde.epita.fr>
|
||||||
|
|
||||||
Have scc_map keep track of APs that are occurring in a SCC.
|
Have scc_map keep track of APs that are occurring in a SCC.
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,28 @@ namespace spot
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// recursively update supp rec
|
||||||
|
bdd
|
||||||
|
scc_map::update_supp_rec(unsigned state)
|
||||||
|
{
|
||||||
|
assert(scc_map_.size() > state);
|
||||||
|
|
||||||
|
bdd& res = scc_map_[state].supp_rec;
|
||||||
|
|
||||||
|
if (res == bddtrue)
|
||||||
|
{
|
||||||
|
const succ_type& s = succ(state);
|
||||||
|
succ_type::const_iterator it;
|
||||||
|
|
||||||
|
for (it = s.begin(); it != s.end(); ++it)
|
||||||
|
res &= update_supp_rec(it->first);
|
||||||
|
|
||||||
|
res &= scc_map_[state].supp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scc_map::build_map()
|
scc_map::build_map()
|
||||||
{
|
{
|
||||||
|
|
@ -266,6 +288,9 @@ namespace spot
|
||||||
root_.front().conds.insert(conds.begin(), conds.end());
|
root_.front().conds.insert(conds.begin(), conds.end());
|
||||||
root_.front().supp &= supp;
|
root_.front().supp &= supp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// recursively update supp_rec
|
||||||
|
(void) update_supp_rec(initial());
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned scc_map::scc_of_state(const state* s) const
|
unsigned scc_map::scc_of_state(const state* s) const
|
||||||
|
|
@ -288,6 +313,13 @@ namespace spot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bdd scc_map::aprec_set_of(unsigned n) const
|
||||||
|
{
|
||||||
|
assert(scc_map_.size() > n);
|
||||||
|
return scc_map_[n].supp_rec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bdd scc_map::acc_set_of(unsigned n) const
|
bdd scc_map::acc_set_of(unsigned n) const
|
||||||
{
|
{
|
||||||
assert(scc_map_.size() > n);
|
assert(scc_map_.size() > n);
|
||||||
|
|
@ -433,9 +465,12 @@ namespace spot
|
||||||
ostr << ", ";
|
ostr << ", ";
|
||||||
bdd_print_formula(ostr, m.get_aut()->get_dict(), *i);
|
bdd_print_formula(ostr, m.get_aut()->get_dict(), *i);
|
||||||
}
|
}
|
||||||
ostr << "]\\n APs=[";
|
ostr << "]\\n AP=[";
|
||||||
bdd_print_sat(ostr, m.get_aut()->get_dict(),
|
bdd_print_sat(ostr, m.get_aut()->get_dict(),
|
||||||
m.ap_set_of(state)) << "]";
|
m.ap_set_of(state));
|
||||||
|
ostr << "]\\n APrec=[";
|
||||||
|
bdd_print_sat(ostr, m.get_aut()->get_dict(),
|
||||||
|
m.aprec_set_of(state)) << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << " " << state << " [shape=box,"
|
std::cout << " " << state << " [shape=box,"
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,14 @@ namespace spot
|
||||||
/// \pre This should only be called once build_map() has run.
|
/// \pre This should only be called once build_map() has run.
|
||||||
bdd ap_set_of(unsigned n) const;
|
bdd ap_set_of(unsigned n) const;
|
||||||
|
|
||||||
|
/// \brief Return the set of atomic properties reachable from this SCC.
|
||||||
|
///
|
||||||
|
/// \return a BDD that is a conjuction of all atomic properties
|
||||||
|
/// occurring on the transitions reachable from this SCC n.
|
||||||
|
///
|
||||||
|
/// \pre This should only be called once build_map() has run.
|
||||||
|
bdd aprec_set_of(unsigned n) const;
|
||||||
|
|
||||||
/// \brief Return the set of acceptance conditions occurring in an SCC.
|
/// \brief Return the set of acceptance conditions occurring in an SCC.
|
||||||
///
|
///
|
||||||
/// \pre This should only be called once build_map() has run.
|
/// \pre This should only be called once build_map() has run.
|
||||||
|
|
@ -135,13 +143,14 @@ namespace spot
|
||||||
unsigned self_loops() const;
|
unsigned self_loops() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bdd update_supp_rec(unsigned state);
|
||||||
int relabel_component();
|
int relabel_component();
|
||||||
|
|
||||||
struct scc
|
struct scc
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
scc(int index) : index(index), acc(bddfalse), supp(bddtrue) {};
|
scc(int index) : index(index), acc(bddfalse),
|
||||||
|
supp(bddtrue), supp_rec(bddtrue) {};
|
||||||
/// Index of the SCC.
|
/// Index of the SCC.
|
||||||
int index;
|
int index;
|
||||||
/// The union of all acceptance conditions of transitions which
|
/// The union of all acceptance conditions of transitions which
|
||||||
|
|
@ -153,6 +162,8 @@ namespace spot
|
||||||
cond_set conds;
|
cond_set conds;
|
||||||
/// Conjunction of atomic propositions used in the SCC.
|
/// Conjunction of atomic propositions used in the SCC.
|
||||||
bdd supp;
|
bdd supp;
|
||||||
|
/// Conjunction of atomic propositions used in the SCC.
|
||||||
|
bdd supp_rec;
|
||||||
/// Successor SCC.
|
/// Successor SCC.
|
||||||
succ_type succ;
|
succ_type succ;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue