Using double borders for acceptance states in SBAs.

* src/tgbaalgos/dotty.hh (dotty_reachable): Take a new
assume_sba argument.
* src/tgbaalgos/dotty.cc (dotty_bfs): Take a new
mark_accepting_states arguments.
(dotty_bfs::process_state): Check if a state is accepting using
the state_is_accepting() method for tgba_sba_proxies, or by
looking at the first outgoing transition of the state.  Pass
the result to the dectorator.
(dotty_reachable): Adjust function.
* src/tgbaalgos/dottydec.hh, src/tgbaalgos/dottydec.cc,
src/tgbaalgos/rundotdec.hh, src/tgbaalgos/rundotdec.cc
(state_decl): Add an "accepting" argument, and use it to
decorate accepting states with a double border.
* src/tgbatest/ltl2tgba.cc: Keep track of whether the output
is an SBA or not, so that we can tell it to dotty().
* wrap/python/ajax/spot.in: Likewise.
* wrap/python/cgi-bin/ltl2tgba.in: Likewise.
This commit is contained in:
Alexandre Duret-Lutz 2011-03-04 21:06:02 +01:00
parent 2c5bae3d37
commit e1ef47d975
10 changed files with 151 additions and 47 deletions

View file

@ -1,3 +1,5 @@
// Copyright (C) 2011 Laboratoire de Recherche et Developpement de
// l'Epita (LRDE).
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
@ -25,6 +27,7 @@
#include "tgba/bddprint.hh"
#include "reachiter.hh"
#include "misc/escape.hh"
#include "tgba/tgbatba.hh"
namespace spot
{
@ -33,8 +36,11 @@ namespace spot
class dotty_bfs : public tgba_reachable_iterator_breadth_first
{
public:
dotty_bfs(std::ostream& os, const tgba* a, dotty_decorator* dd)
: tgba_reachable_iterator_breadth_first(a), os_(os), dd_(dd)
dotty_bfs(std::ostream& os, const tgba* a, bool mark_accepting_states,
dotty_decorator* dd)
: tgba_reachable_iterator_breadth_first(a), os_(os),
mark_accepting_states_(mark_accepting_states), dd_(dd),
sba_(dynamic_cast<const tgba_sba_proxy*>(a))
{
}
@ -55,9 +61,31 @@ namespace spot
void
process_state(const state* s, int n, tgba_succ_iterator* si)
{
bool accepting;
if (mark_accepting_states_)
{
if (sba_)
{
accepting = sba_->state_is_accepting(s);
}
else
{
si->first();
accepting = ((!si->done())
&& (si->current_acceptance_conditions() ==
automata_->all_acceptance_conditions()));
}
}
else
{
accepting = false;
}
os_ << " " << n << " "
<< dd_->state_decl(automata_, s, n, si,
escape_str(automata_->format_state(s)))
escape_str(automata_->format_state(s)),
accepting)
<< std::endl;
}
@ -80,14 +108,17 @@ namespace spot
private:
std::ostream& os_;
bool mark_accepting_states_;
dotty_decorator* dd_;
const tgba_sba_proxy* sba_;
};
}
std::ostream&
dotty_reachable(std::ostream& os, const tgba* g, dotty_decorator* dd)
dotty_reachable(std::ostream& os, const tgba* g,
bool assume_sba, dotty_decorator* dd)
{
dotty_bfs d(os, g, dd);
dotty_bfs d(os, g, assume_sba, dd);
d.run();
return os;
}

View file

@ -1,4 +1,4 @@
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// Copyright (C) 2003, 2004, 2011 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
//
@ -31,12 +31,17 @@ namespace spot
/// \brief Print reachable states in dot format.
/// \ingroup tgba_io
///
/// If assume_sba is set, this assumes that the automaton
/// is an SBA and use double elipse to mark accepting states.
///
/// The \a dd argument allows to customize the output in various
/// ways. See \ref tgba_dotty "this page" for a list of available
/// decorators.
std::ostream&
dotty_reachable(std::ostream& os,
const tgba* g,
bool assume_sba = false,
dotty_decorator* dd = dotty_decorator::instance());
}

View file

@ -1,3 +1,5 @@
// Copyright (C) 2011 Laboratoire de Recherche et Developpement de
// l'Epita (LRDE).
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
@ -34,9 +36,13 @@ namespace spot
std::string
dotty_decorator::state_decl(const tgba*, const state*, int,
tgba_succ_iterator*, const std::string& label)
tgba_succ_iterator*, const std::string& label,
bool accepting)
{
return "[label=\"" + label + "\"]";
if (accepting)
return "[label=\"" + label + "\", peripheries=2]";
else
return "[label=\"" + label + "\"]";
}
std::string

View file

@ -1,4 +1,4 @@
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// Copyright (C) 2004, 2011 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
//
@ -53,9 +53,12 @@ namespace spot
/// \param si an iterator over the successors of this state (owned by the
/// caller, but can be freely iterated)
/// \param label the computed name of this state
/// \param accepting whether the state is accepting (it makes sense only
/// for state-acceptance automata)
virtual std::string state_decl(const tgba* a, const state* s, int n,
tgba_succ_iterator* si,
const std::string& label);
const std::string& label,
bool accepting);
/// \brief Compute the style of a link.
///
@ -86,6 +89,7 @@ namespace spot
protected:
dotty_decorator();
};
}
#endif // SPOT_TGBAALGOS_DOTTYDEC_HH

View file

@ -1,4 +1,4 @@
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// Copyright (C) 2004, 2011 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
//
@ -45,11 +45,13 @@ namespace spot
std::string
tgba_run_dotty_decorator::state_decl(const tgba*, const state* s, int,
tgba_succ_iterator*,
const std::string& label)
const std::string& label,
bool accepting)
{
step_map::const_iterator i = map_.find(s);
std::string acc = accepting ? ", peripheries=2" : "";
if (i == map_.end())
return "[label=\"" + label + "\"]";
return "[label=\"" + label + acc + "\"]";
std::ostringstream os;
std::string sep = "(";
@ -74,7 +76,8 @@ namespace spot
assert(in_cycle || in_prefix);
os << ")\\n" << label;
std::string color = in_prefix ? (in_cycle ? "violet" : "blue") : "red";
return "[label=\"" + os.str() + "\", style=bold, color=" + color + "]";
return "[label=\"" + os.str() + "\", style=bold, color="
+ color + acc + "]";
}
std::string

View file

@ -1,3 +1,5 @@
// Copyright (C) 2011 Laboratoire de Recherche et Developpement de
// l'Epita (LRDE).
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
@ -42,7 +44,8 @@ namespace spot
virtual std::string state_decl(const tgba* a, const state* s, int n,
tgba_succ_iterator* si,
const std::string& label);
const std::string& label,
bool accepting);
virtual std::string link_decl(const tgba* a,
const state* in_s, int in,
const state* out_s, int out,

View file

@ -336,6 +336,7 @@ main(int argc, char** argv)
spot::bdd_dict* dict = new spot::bdd_dict();
spot::timer_map tm;
bool use_timer = false;
bool assume_sba = false;
for (;;)
{
@ -924,14 +925,20 @@ main(int argc, char** argv)
&& n_acc > 1
&& echeck_inst->max_acceptance_conditions() < n_acc)
degeneralize_opt = DegenTBA;
if (degeneralize_opt == DegenTBA)
a = degeneralized = new spot::tgba_tba_proxy(a);
{
a = degeneralized = new spot::tgba_tba_proxy(a);
}
else if (degeneralize_opt == DegenSBA)
a = degeneralized = new spot::tgba_sba_proxy(a);
{
a = degeneralized = new spot::tgba_sba_proxy(a);
assume_sba = true;
}
else if (labeling_opt == StateLabeled)
{
a = state_labeled = new spot::tgba_sgba_proxy(a);
}
{
a = state_labeled = new spot::tgba_sgba_proxy(a);
}
const spot::tgba* minimized = 0;
if (opt_minimize)
@ -957,6 +964,7 @@ main(int argc, char** argv)
else
{
a = minimized;
assume_sba = true;
}
}
@ -965,6 +973,9 @@ main(int argc, char** argv)
tm.start("Monitor minimization");
a = minimized = minimize_monitor(a);
tm.stop("Monitor minimization");
assume_sba = false; // All states are accepting, so double
// circles in the dot output are
// pointless.
}
spot::tgba_reduc* aut_red = 0;
@ -1045,6 +1056,8 @@ main(int argc, char** argv)
{
a = product = product_to_free = new spot::tgba_product(system, a);
assume_sba = false;
unsigned int n_acc = a->number_of_acceptance_conditions();
if (echeck_inst
&& degeneralize_opt == NoDegen
@ -1052,11 +1065,16 @@ main(int argc, char** argv)
&& echeck_inst->max_acceptance_conditions() < n_acc)
degeneralize_opt = DegenTBA;
if (degeneralize_opt == DegenTBA)
a = product = product_degeneralized =
new spot::tgba_tba_proxy(product);
{
a = product = product_degeneralized =
new spot::tgba_tba_proxy(product);
}
else if (degeneralize_opt == DegenSBA)
a = product = product_degeneralized =
new spot::tgba_sba_proxy(product);
{
a = product = product_degeneralized =
new spot::tgba_sba_proxy(product);
assume_sba = true;
}
}
if (echeck_inst
@ -1088,7 +1106,7 @@ main(int argc, char** argv)
switch (output)
{
case 0:
spot::dotty_reachable(std::cout, a);
spot::dotty_reachable(std::cout, a, assume_sba);
break;
case 1:
if (concrete)
@ -1296,7 +1314,8 @@ main(int argc, char** argv)
if (graph_run_opt)
{
spot::tgba_run_dotty_decorator deco(run);
spot::dotty_reachable(std::cout, a, &deco);
spot::dotty_reachable(std::cout, a,
assume_sba, &deco);
}
else if (graph_run_tgba_opt)
{