* src/tgbaalgos/Makefile.am (tgbaalgos_HEADERS): Add reachiters.hh.
(libtgbaalgos_la_SOURCES): Add reachiters.cc. * src/tgbaalgos/dotty.cc, src/tgbaalgos/save.cc: Rewrite using spot::tgba_reachable_iterator_breadth_first. * src/tgbatest/explicit.test, src/tgbatest/tgbaread.test, src/tgbatest/tripprod.test: Adjust expected output.
This commit is contained in:
parent
664e49e07e
commit
e24d3be8a7
9 changed files with 322 additions and 114 deletions
|
|
@ -1,63 +1,60 @@
|
|||
#include <set>
|
||||
#include "tgba/tgba.hh"
|
||||
#include "save.hh"
|
||||
#include "tgba/bddprint.hh"
|
||||
#include "ltlvisit/tostring.hh"
|
||||
#include "reachiter.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
typedef std::set<state*, state_ptr_less_than> seen_set;
|
||||
|
||||
/// Process successors.
|
||||
static void
|
||||
save_rec(std::ostream& os, const tgba* g, state* st, seen_set& m)
|
||||
class save_bfs : public tgba_reachable_iterator_breadth_first
|
||||
{
|
||||
m.insert(st);
|
||||
std::string cur = g->format_state(st);
|
||||
tgba_succ_iterator* si = g->succ_iter(st);
|
||||
for (si->first(); !si->done(); si->next())
|
||||
{
|
||||
state* s = si->current_state();
|
||||
os << "\"" << cur << "\", \"" << g->format_state(s) << "\", ";
|
||||
public:
|
||||
save_bfs(const tgba* a, std::ostream& os)
|
||||
: tgba_reachable_iterator_breadth_first(a), os_(os)
|
||||
{
|
||||
}
|
||||
|
||||
bdd_print_sat(os, g->get_dict(), si->current_condition()) << ",";
|
||||
bdd_print_acc(os, g->get_dict(), si->current_accepting_conditions())
|
||||
<< ";" << std::endl;
|
||||
void
|
||||
start()
|
||||
{
|
||||
const bdd_dict* d = automata_->get_dict();
|
||||
os_ << "acc =";
|
||||
for (bdd_dict::fv_map::const_iterator ai = d->acc_map.begin();
|
||||
ai != d->acc_map.end(); ++ai)
|
||||
{
|
||||
os_ << " \"";
|
||||
ltl::to_string(ai->first, os_) << "\"";
|
||||
}
|
||||
os_ << ";" << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
process_state(const state* s, int, tgba_succ_iterator* si)
|
||||
{
|
||||
const bdd_dict* d = automata_->get_dict();
|
||||
std::string cur = automata_->format_state(s);
|
||||
for (si->first(); !si->done(); si->next())
|
||||
{
|
||||
state* dest = si->current_state();
|
||||
os_ << "\"" << cur << "\", \""
|
||||
<< automata_->format_state(dest) << "\", ";
|
||||
bdd_print_sat(os_, d, si->current_condition()) << ",";
|
||||
bdd_print_acc(os_, d, si->current_accepting_conditions());
|
||||
os_ << ";" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::ostream& os_;
|
||||
};
|
||||
|
||||
// Destination already explored?
|
||||
seen_set::iterator i = m.find(s);
|
||||
if (i != m.end())
|
||||
{
|
||||
delete s;
|
||||
}
|
||||
else
|
||||
{
|
||||
save_rec(os, g, s, m);
|
||||
// Do not delete S, it is used as key in M.
|
||||
}
|
||||
}
|
||||
delete si;
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
tgba_save_reachable(std::ostream& os, const tgba* g)
|
||||
{
|
||||
const bdd_dict* d = g->get_dict();
|
||||
os << "acc =";
|
||||
for (bdd_dict::fv_map::const_iterator ai = d->acc_map.begin();
|
||||
ai != d->acc_map.end(); ++ai)
|
||||
{
|
||||
os << " \"";
|
||||
ltl::to_string(ai->first, os) << "\"";
|
||||
}
|
||||
os << ";" << std::endl;
|
||||
|
||||
seen_set m;
|
||||
state* state = g->get_init_state();
|
||||
save_rec(os, g, state, m);
|
||||
// Finally delete all states used as keys in m:
|
||||
for (seen_set::iterator i = m.begin(); i != m.end(); ++i)
|
||||
delete *i;
|
||||
save_bfs b(g, os);
|
||||
b.run();
|
||||
return os;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue