* src/tgba/tgba.hh, src/tgba/tgba.cc
(tgba::project_state): New method. * src/tgba/tgbaproduct.hh, src/tgba/tgbaproduct.cc (tgba_product::project_state): New method. * src/tgba/tgbabta.hh, src/tgba/tgbabta.cc (tgba_bta_proxy::project_state): New method. * src/tgbaalgos/magic.cc (magic_search::print_result): Take a restrict argument.
This commit is contained in:
parent
a66ad58b5d
commit
24099078d6
10 changed files with 106 additions and 18 deletions
11
ChangeLog
11
ChangeLog
|
|
@ -1,3 +1,14 @@
|
|||
2003-07-30 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
||||
|
||||
* src/tgba/tgba.hh, src/tgba/tgba.cc
|
||||
(tgba::project_state): New method.
|
||||
* src/tgba/tgbaproduct.hh, src/tgba/tgbaproduct.cc
|
||||
(tgba_product::project_state): New method.
|
||||
* src/tgba/tgbabta.hh, src/tgba/tgbabta.cc
|
||||
(tgba_bta_proxy::project_state): New method.
|
||||
* src/tgbaalgos/magic.cc (magic_search::print_result): Take
|
||||
a restrict argument.
|
||||
|
||||
2003-07-29 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
||||
|
||||
* src/ltlparse/ltlscan.ll: Allow /\, \/, and xor, used in LBTT.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ namespace spot
|
|||
last_support_variables_input_(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
tgba::~tgba()
|
||||
{
|
||||
if (last_support_conditions_input_)
|
||||
|
|
@ -15,14 +15,14 @@ namespace spot
|
|||
if (last_support_variables_input_)
|
||||
delete last_support_variables_input_;
|
||||
}
|
||||
|
||||
bdd
|
||||
|
||||
bdd
|
||||
tgba::support_conditions(const state* state) const
|
||||
{
|
||||
if (! last_support_conditions_input_
|
||||
|| last_support_conditions_input_->compare(state) != 0)
|
||||
{
|
||||
last_support_conditions_output_ =
|
||||
last_support_conditions_output_ =
|
||||
compute_support_conditions(state);
|
||||
if (last_support_conditions_input_)
|
||||
delete last_support_conditions_input_;
|
||||
|
|
@ -37,7 +37,7 @@ namespace spot
|
|||
if (! last_support_variables_input_
|
||||
|| last_support_variables_input_->compare(state) != 0)
|
||||
{
|
||||
last_support_variables_output_ =
|
||||
last_support_variables_output_ =
|
||||
compute_support_variables(state);
|
||||
if (last_support_variables_input_)
|
||||
delete last_support_variables_input_;
|
||||
|
|
@ -46,4 +46,12 @@ namespace spot
|
|||
return last_support_variables_output_;
|
||||
}
|
||||
|
||||
state*
|
||||
tgba::project_state(const state* s, const tgba* t) const
|
||||
{
|
||||
if (t == this)
|
||||
return s->clone();
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,6 +117,21 @@ namespace spot
|
|||
/// who owns the state.
|
||||
virtual std::string format_state(const state* state) const = 0;
|
||||
|
||||
/// \brief Project a state on an automata.
|
||||
///
|
||||
/// This converts \a s, into that corresponding spot::state for \a
|
||||
/// t. This is useful when you have the state of a product, and
|
||||
/// want restrict this state to a specific automata occuring in
|
||||
/// the product.
|
||||
///
|
||||
/// It goes without saying that \a s and \a t should be compatible
|
||||
/// (i.e., \a s is a state of \a t).
|
||||
///
|
||||
/// \return 0 if the projection fails (\a s is unrelated to \a t),
|
||||
/// or a new \c state* (the projected state) that must be
|
||||
/// deleted by the caller.
|
||||
virtual state* project_state(const state* s, const tgba* t) const;
|
||||
|
||||
/// \brief Return the set of all accepting conditions used
|
||||
/// by this automaton.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ namespace spot
|
|||
|
||||
virtual std::string format_state(const state* state) const;
|
||||
|
||||
bdd_dict* get_dict() const;
|
||||
virtual bdd_dict* get_dict() const;
|
||||
|
||||
/// \brief Get the core data associated to this automaton.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -234,6 +234,19 @@ namespace spot
|
|||
+ right_->format_state(s->right()));
|
||||
}
|
||||
|
||||
state*
|
||||
tgba_product::project_state(const state* s, const tgba* t) const
|
||||
{
|
||||
const state_bdd_product* s2 = dynamic_cast<const state_bdd_product*>(s);
|
||||
assert(s2);
|
||||
if (t == this)
|
||||
return s2->clone();
|
||||
state* res = left_->project_state(s2->left(), t);
|
||||
if (res)
|
||||
return res;
|
||||
return right_->project_state(s2->right(), t);
|
||||
}
|
||||
|
||||
bdd
|
||||
tgba_product::all_accepting_conditions() const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -109,6 +109,8 @@ namespace spot
|
|||
|
||||
virtual std::string format_state(const state* state) const;
|
||||
|
||||
virtual state* project_state(const state* s, const tgba* t) const;
|
||||
|
||||
virtual bdd all_accepting_conditions() const;
|
||||
virtual bdd neg_accepting_conditions() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -213,13 +213,23 @@ namespace spot
|
|||
std::string
|
||||
tgba_tba_proxy::format_state(const state* state) const
|
||||
{
|
||||
const state_tba_proxy* s =
|
||||
dynamic_cast<const state_tba_proxy*>(state);
|
||||
const state_tba_proxy* s = dynamic_cast<const state_tba_proxy*>(state);
|
||||
assert(s);
|
||||
return a_->format_state(s->real_state()) + "("
|
||||
+ bdd_format_set(get_dict(), s->accepting_cond()) + ")";
|
||||
}
|
||||
|
||||
state*
|
||||
tgba_tba_proxy::project_state(const state* s, const tgba* t) const
|
||||
{
|
||||
const state_tba_proxy* s2 = dynamic_cast<const state_tba_proxy*>(s);
|
||||
assert(s2);
|
||||
if (t == this)
|
||||
return s2->clone();
|
||||
return a_->project_state(s2->real_state(), t);
|
||||
}
|
||||
|
||||
|
||||
bdd
|
||||
tgba_tba_proxy::all_accepting_conditions() const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@ namespace spot
|
|||
|
||||
virtual std::string format_state(const state* state) const;
|
||||
|
||||
virtual state* project_state(const state* s, const tgba* t) const;
|
||||
|
||||
virtual bdd all_accepting_conditions() const;
|
||||
virtual bdd neg_accepting_conditions() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ namespace spot
|
|||
}
|
||||
|
||||
std::ostream&
|
||||
magic_search::print_result(std::ostream& os) const
|
||||
magic_search::print_result(std::ostream& os, const tgba* restrict) const
|
||||
{
|
||||
stack_type::const_reverse_iterator i;
|
||||
tstack_type::const_reverse_iterator ti;
|
||||
|
|
@ -133,10 +133,33 @@ namespace spot
|
|||
{
|
||||
if (i->first.s->compare(x) == 0)
|
||||
os <<"Cycle:" <<std::endl;
|
||||
os << " " << a->format_state(i->first.s) << std::endl;
|
||||
|
||||
const state* s = i->first.s;
|
||||
if (restrict)
|
||||
{
|
||||
s = a->project_state(s, restrict);
|
||||
assert(s);
|
||||
os << " " << restrict->format_state(s) << std::endl;
|
||||
delete s;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << " " << a->format_state(s) << std::endl;
|
||||
}
|
||||
os << " | " << bdd_format_set(d, *ti) << std::endl;
|
||||
}
|
||||
os << " " << a->format_state(x) << std::endl;
|
||||
|
||||
if (restrict)
|
||||
{
|
||||
const state* s = a->project_state(x, restrict);
|
||||
assert(s);
|
||||
os << " " << restrict->format_state(s) << std::endl;
|
||||
delete s;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << " " << a->format_state(x) << std::endl;
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
namespace spot
|
||||
{
|
||||
/// \brief Emptiness check on spot::tgba_tba_proxy automata using
|
||||
/// the Magic Search algorithm.
|
||||
/// the Magic Search algorithm.
|
||||
///
|
||||
/// This algorithm comes from
|
||||
/// \verbatim
|
||||
|
|
@ -38,7 +38,7 @@ namespace spot
|
|||
~magic_search();
|
||||
|
||||
/// \brief Perform a Magic Search.
|
||||
///
|
||||
///
|
||||
/// \return true iff the algorithm has found a new accepting
|
||||
/// path.
|
||||
///
|
||||
|
|
@ -46,8 +46,12 @@ namespace spot
|
|||
/// to enumerate all accepting paths.
|
||||
bool check();
|
||||
|
||||
/// Print the last accepting path found.
|
||||
std::ostream& print_result(std::ostream& os) const;
|
||||
/// \brief Print the last accepting path found.
|
||||
///
|
||||
/// Restrict printed states to \a the state space of restrict if
|
||||
/// supplied.
|
||||
std::ostream& print_result(std::ostream& os,
|
||||
const tgba* restrict = 0) const;
|
||||
|
||||
private:
|
||||
|
||||
|
|
@ -60,7 +64,7 @@ namespace spot
|
|||
bool seen_without : 1;
|
||||
bool seen_with : 1;
|
||||
};
|
||||
|
||||
|
||||
/// \brief A state for the spot::magic_search algorithm.
|
||||
struct magic_state
|
||||
{
|
||||
|
|
@ -73,7 +77,7 @@ namespace spot
|
|||
stack_type stack; ///< Stack of visited states on the path.
|
||||
|
||||
typedef std::list<bdd> tstack_type;
|
||||
/// \brief Stack of transitions.
|
||||
/// \brief Stack of transitions.
|
||||
///
|
||||
/// This is an addition to the data from the paper.
|
||||
tstack_type tstack;
|
||||
|
|
@ -89,7 +93,7 @@ namespace spot
|
|||
|
||||
const tgba_tba_proxy* a; ///< The automata to check.
|
||||
/// The state for which we are currently seeking an SCC.
|
||||
const state* x;
|
||||
const state* x;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue