From 51fe5108fe611228c165dae402f8352d8ab02256 Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Mon, 6 Oct 2014 10:31:53 +0200 Subject: [PATCH] Remove support for state-based alternating automata. This was never actually used and we have a new implementation of alternating automata coming. * src/saba/, src/sabaalgos/, src/sabatest/: Remove. * src/Makefile.am, configure.ac, README: Adjust. * NEWS: Mention it. --- NEWS | 3 + README | 3 - configure.ac | 4 - src/Makefile.am | 8 +- src/saba/Makefile.am | 36 --- src/saba/explicitstateconjunction.cc | 89 ------ src/saba/explicitstateconjunction.hh | 78 ----- src/saba/saba.cc | 49 --- src/saba/saba.hh | 118 ------- src/saba/sabacomplementtgba.cc | 445 --------------------------- src/saba/sabacomplementtgba.hh | 85 ----- src/saba/sabastate.hh | 247 --------------- src/saba/sabasucciter.hh | 158 ---------- src/sabaalgos/Makefile.am | 28 -- src/sabaalgos/sabadotty.cc | 105 ------- src/sabaalgos/sabadotty.hh | 36 --- src/sabaalgos/sabareachiter.cc | 187 ----------- src/sabaalgos/sabareachiter.hh | 153 --------- src/sabatest/.gitignore | 2 - src/sabatest/Makefile.am | 37 --- src/sabatest/defs.in | 87 ------ src/sabatest/sabacomplementtgba.cc | 76 ----- 22 files changed, 6 insertions(+), 2028 deletions(-) delete mode 100644 src/saba/Makefile.am delete mode 100644 src/saba/explicitstateconjunction.cc delete mode 100644 src/saba/explicitstateconjunction.hh delete mode 100644 src/saba/saba.cc delete mode 100644 src/saba/saba.hh delete mode 100644 src/saba/sabacomplementtgba.cc delete mode 100644 src/saba/sabacomplementtgba.hh delete mode 100644 src/saba/sabastate.hh delete mode 100644 src/saba/sabasucciter.hh delete mode 100644 src/sabaalgos/Makefile.am delete mode 100644 src/sabaalgos/sabadotty.cc delete mode 100644 src/sabaalgos/sabadotty.hh delete mode 100644 src/sabaalgos/sabareachiter.cc delete mode 100644 src/sabaalgos/sabareachiter.hh delete mode 100644 src/sabatest/.gitignore delete mode 100644 src/sabatest/Makefile.am delete mode 100644 src/sabatest/defs.in delete mode 100644 src/sabatest/sabacomplementtgba.cc diff --git a/NEWS b/NEWS index 128f772f2..6fbf74d19 100644 --- a/NEWS +++ b/NEWS @@ -119,6 +119,9 @@ New in spot 1.99a (not yet released) has been removed too, because it was only used by the KV complementation. + - The unused implementation of state-based alternating Büchi automata + has been removed. + New in spot 1.2.5a (not yet released) * New features: diff --git a/README b/README index a14f3f698..e3abbbac7 100644 --- a/README +++ b/README @@ -166,9 +166,6 @@ src/ Sources for libspot. ta/ TA objects and cousins (TGTA). taalgos/ Algorithms on TA/TGTA. tgbatest/ Tests for tgba/, tgbaalgos/, tgbaparse/, ta/ and taalgos/. - saba/ SABA (State-labeled Alternating Büchi Automata) objects. - sabaalgos/ Algorithms on SABA. - sabatest/ Tests for saba/, sabaalgos/. sanity/ Sanity tests for the whole project. doc/ Documentation for libspot. org/ Source of userdoc/ as org-mode files. diff --git a/configure.ac b/configure.ac index 725428436..af3609d40 100644 --- a/configure.ac +++ b/configure.ac @@ -193,10 +193,6 @@ AC_CONFIG_FILES([ src/neverparse/Makefile src/priv/Makefile src/sanity/Makefile - src/saba/Makefile - src/sabaalgos/Makefile - src/sabatest/defs - src/sabatest/Makefile src/tgbaalgos/gtec/Makefile src/tgbaalgos/Makefile src/tgba/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 8b19c1a5d..25cc70fc9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,9 +26,9 @@ AUTOMAKE_OPTIONS = subdir-objects # end, after building '.' (since the current directory contains # libspot.la needed by the tests) SUBDIRS = misc priv ltlenv ltlast ltlvisit ltlparse graph tgba \ - tgbaalgos tgbaparse ta taalgos kripke saba sabaalgos \ - neverparse kripkeparse dstarparse . bin ltltest graphtest \ - tgbatest sabatest kripketest sanity + tgbaalgos tgbaparse ta taalgos kripke neverparse \ + kripkeparse dstarparse . bin ltltest graphtest tgbatest \ + kripketest sanity lib_LTLIBRARIES = libspot.la libspot_la_SOURCES = @@ -44,8 +44,6 @@ libspot_la_LIBADD = \ misc/libmisc.la \ neverparse/libneverparse.la \ priv/libpriv.la \ - sabaalgos/libsabaalgos.la \ - saba/libsaba.la \ taalgos/libtaalgos.la \ ta/libta.la \ tgbaalgos/libtgbaalgos.la \ diff --git a/src/saba/Makefile.am b/src/saba/Makefile.am deleted file mode 100644 index f5fd0c665..000000000 --- a/src/saba/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -## -*- coding: utf-8 -*- -## Copyright (C) 2009, 2011, 2013 Laboratoire de Recherche et Développement -## de l'Epita (LRDE). -## -## This file is part of Spot, a model checking library. -## -## Spot is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or -## (at your option) any later version. -## -## Spot is distributed in the hope that it will be useful, but WITHOUT -## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -## License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see . - -AM_CPPFLAGS = -I$(srcdir)/.. -I.. $(BUDDY_CPPFLAGS) -AM_CXXFLAGS = $(WARNING_CXXFLAGS) - -sabadir = $(pkgincludedir)/saba - -saba_HEADERS = \ - explicitstateconjunction.hh \ - saba.hh \ - sabastate.hh \ - sabasucciter.hh \ - sabacomplementtgba.hh - -noinst_LTLIBRARIES = libsaba.la -libsaba_la_SOURCES = \ - explicitstateconjunction.cc \ - saba.cc \ - sabacomplementtgba.cc diff --git a/src/saba/explicitstateconjunction.cc b/src/saba/explicitstateconjunction.cc deleted file mode 100644 index 191ec4196..000000000 --- a/src/saba/explicitstateconjunction.cc +++ /dev/null @@ -1,89 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2012 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include "explicitstateconjunction.hh" - -namespace spot -{ - - /// explicit_state_conjunction - //////////////////////////////////////// - - explicit_state_conjunction::explicit_state_conjunction() - { - } - - explicit_state_conjunction:: - explicit_state_conjunction(const explicit_state_conjunction* other) - : set_(other->set_) - { - } - - explicit_state_conjunction& - explicit_state_conjunction::operator=(const explicit_state_conjunction& o) - { - if (this != &o) - { - this->~explicit_state_conjunction(); - new (this) explicit_state_conjunction(&o); - } - return *this; - } - - explicit_state_conjunction::~explicit_state_conjunction() - { - } - - void - explicit_state_conjunction::first() - { - it_ = set_.begin(); - } - - void - explicit_state_conjunction::next() - { - ++it_; - } - - bool - explicit_state_conjunction::done() const - { - return it_ == set_.end(); - } - - explicit_state_conjunction* - explicit_state_conjunction::clone() const - { - return new explicit_state_conjunction(this); - } - - saba_state* - explicit_state_conjunction::current_state() const - { - return (*it_)->clone(); - } - - void - explicit_state_conjunction::add(saba_state* state) - { - set_.insert(shared_saba_state(state)); - } - -} // end namespace spot. diff --git a/src/saba/explicitstateconjunction.hh b/src/saba/explicitstateconjunction.hh deleted file mode 100644 index ed0c36e79..000000000 --- a/src/saba/explicitstateconjunction.hh +++ /dev/null @@ -1,78 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2012, 2013 Laboratoire de Recherche et -// Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABA_EXPLICITSTATECONJUNCTION_HH -# define SPOT_SABA_EXPLICITSTATECONJUNCTION_HH - -#include "misc/common.hh" -#include "misc/hash.hh" -#include "sabasucciter.hh" - -namespace spot -{ - /// \ingroup saba_essentials - /// \brief Basic implementation of saba_state_conjunction. - /// - /// This class provides a basic implementation to - /// iterate over a conjunction of states of a saba. - class SPOT_API explicit_state_conjunction : public saba_state_conjunction - { - public: - - explicit_state_conjunction(); - explicit_state_conjunction(const explicit_state_conjunction* other); - virtual ~explicit_state_conjunction(); - - explicit_state_conjunction& operator=(const explicit_state_conjunction& o); - - /// \name Iteration - //@{ - - virtual void first(); - virtual void next(); - virtual bool done() const; - - //@} - - /// \name Inspection - //@{ - - /// Duplicate a this conjunction. - explicit_state_conjunction* clone() const; - - /// Return the a new instance on the current state. - /// This is the caller responsibility to delete the returned state. - virtual saba_state* current_state() const; - - //@} - - /// Add a new state in the conjunction. - /// The class becomes owner of \a state. - void add(saba_state* state); - private: - typedef std::unordered_set saba_state_set_t; - saba_state_set_t set_; - saba_state_set_t::iterator it_; - }; -} // end namespace spot. - - -#endif // SPOT_SABA_EXPLICITSTATECONJUNCTION_HH diff --git a/src/saba/saba.cc b/src/saba/saba.cc deleted file mode 100644 index 2b9a67f65..000000000 --- a/src/saba/saba.cc +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2009 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include "saba.hh" - -namespace spot -{ - saba::saba() - : num_acc_(-1) - { - } - - saba::~saba() - { - } - - unsigned int - saba::number_of_acceptance_conditions() const - { - if (num_acc_ < 0) - { - bdd all = all_acceptance_conditions(); - unsigned int n = 0; - while (all != bddfalse) - { - ++n; - all -= bdd_satone(all); - } - num_acc_ = n; - } - return num_acc_; - } - -} // end namespace spot. diff --git a/src/saba/saba.hh b/src/saba/saba.hh deleted file mode 100644 index 7a9f235e8..000000000 --- a/src/saba/saba.hh +++ /dev/null @@ -1,118 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2010, 2013, 2014 Laboratoire de Recherche et -// Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABA_SABA_HH -# define SPOT_SABA_SABA_HH - -#include "sabastate.hh" -#include "sabasucciter.hh" -#include - -namespace spot -{ - /// \defgroup saba SABA (State-based Alternating Büchi Automata) - /// - /// Spot was centered around non-deterministic \ref tgba. - /// Alternating automata are an extension to non-deterministic - /// automata, and are presented with spot::saba. - /// This type and its cousins are listed \ref saba_essentials "here". - /// This is an abstract interface. - - /// \addtogroup saba_essentials Essential SABA types - /// \ingroup saba - - /// \ingroup saba_essentials - /// \brief A State-based Alternating (Generalized) Büchi Automaton. - /// - /// Browsing such automaton can be achieved using two functions: - /// \c get_init_state, and \c succ_iter. The former returns - /// the initial state while the latter lists the - /// successor states of any state. - /// - /// Note that although this is a transition-based automata, - /// we never represent transitions! Transition informations are - /// obtained by querying the iterator over the successors of - /// a state. - class SPOT_API saba - { - protected: - saba(); - - public: - virtual ~saba(); - - /// \brief Get the initial state of the automaton. - /// - /// The state has been allocated with \c new. It is the - /// responsability of the caller to \c delete it when no - /// longer needed. - virtual saba_state* get_init_state() const = 0; - - /// \brief Get an iterator over the successors of \a local_state. - /// - /// The iterator has been allocated with \c new. It is the - /// responsability of the caller to \c delete it when no - /// longer needed. - /// - /// \param local_state The state whose successors are to be explored. - /// This pointer is not adopted in any way by \c succ_iter, and - /// it is still the caller's responsability to delete it when - /// appropriate (this can be done during the lifetime of - /// the iterator). - virtual saba_succ_iterator* - succ_iter(const saba_state* local_state) const = 0; - - /// \brief Get the dictionary associated to the automaton. - /// - /// State are represented as BDDs. The dictionary allows - /// to map BDD variables back to formulae, and vice versa. - /// This is useful when dealing with several automata (which - /// may use the same BDD variable for different formula), - /// or simply when printing. - virtual bdd_dict_ptr get_dict() const = 0; - - /// \brief Format the state as a string for printing. - /// - /// This formating is the responsability of the automata - /// that owns the state. - virtual std::string format_state(const saba_state* state) const = 0; - - /// \brief Return the set of all acceptance conditions used - /// by this automaton. - /// - /// The goal of the emptiness check is to ensure that - /// a strongly connected component walks through each - /// of these acceptiong conditions. I.e., the union - /// of the acceptiong conditions of all transition in - /// the SCC should be equal to the result of this function. - virtual bdd all_acceptance_conditions() const = 0; - - /// The number of acceptance conditions. - virtual unsigned int number_of_acceptance_conditions() const; - private: - mutable int num_acc_; - }; - - typedef std::shared_ptr saba_ptr; - typedef std::shared_ptr const_saba_ptr; - -} // end namespace spot. - - -#endif // SPOT_SABA_SABA_HH diff --git a/src/saba/sabacomplementtgba.cc b/src/saba/sabacomplementtgba.cc deleted file mode 100644 index 46e513079..000000000 --- a/src/saba/sabacomplementtgba.cc +++ /dev/null @@ -1,445 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Laboratoire de -// Recherche et Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include -#include -#include -#include "bdd.h" -#include "tgba/bddprint.hh" -#include "tgba/tgba.hh" -#include "misc/hash.hh" -#include "misc/bddlt.hh" -#include "tgbaalgos/degen.hh" -#include "tgbaalgos/bfssteps.hh" -#include "misc/hashfunc.hh" -#include "ltlast/formula.hh" -#include "ltlast/constant.hh" -#include "priv/countstates.hh" - -#include "sabacomplementtgba.hh" -#include "explicitstateconjunction.hh" - -namespace spot -{ - namespace - { - - // typedefs. - typedef int rank_t; - - //////////////////////////////////////// - // saba_state_complement_tgba - - /// States used by spot::saba_complement_tgba. - /// A state gather a spot::state* and a rank. - /// \ingroup saba_representation - class saba_state_complement_tgba : public saba_state - { - public: - saba_state_complement_tgba(); - saba_state_complement_tgba(const saba_state_complement_tgba* state_taa); - saba_state_complement_tgba(shared_state state, rank_t rank, - bdd condition); - virtual ~saba_state_complement_tgba() {} - - virtual int compare(const saba_state* other) const; - virtual size_t hash() const; - virtual saba_state_complement_tgba* clone() const; - - virtual bdd acceptance_conditions() const; - const state* get_state() const; - rank_t get_rank() const; - private: - shared_state state_; - rank_t rank_; - bdd condition_; - }; - - saba_state_complement_tgba::saba_state_complement_tgba(shared_state state, - rank_t rank, - bdd condition) - : state_(state), rank_(rank), condition_(condition) - { - } - - saba_state_complement_tgba:: - saba_state_complement_tgba(const saba_state_complement_tgba* state_taa) - : state_(state_taa->state_), rank_(state_taa->rank_), - condition_(state_taa->condition_) - { - } - - int - saba_state_complement_tgba::compare(const saba_state* o) const - { - const saba_state_complement_tgba* other = - dynamic_cast(o); - - int compare_value = get_state()->compare(other->get_state()); - if (compare_value != 0) - return compare_value; - - if (get_rank() != other->get_rank()) - return get_rank() - other->get_rank(); - - return acceptance_conditions().id() - - other->acceptance_conditions().id(); - } - - size_t - saba_state_complement_tgba::hash() const - { - size_t hash = get_state()->hash() ^ wang32_hash(get_rank()); - hash ^= wang32_hash(acceptance_conditions().id()); - return hash; - } - - saba_state_complement_tgba* - saba_state_complement_tgba::clone() const - { - return new saba_state_complement_tgba(*this); - } - - bdd - saba_state_complement_tgba::acceptance_conditions() const - { - if ((get_rank() & 1) == 1) - return condition_; - else - return bddfalse; - } - - const state* - saba_state_complement_tgba::get_state() const - { - return state_.get(); - } - - rank_t - saba_state_complement_tgba::get_rank() const - { - return rank_; - } - - - /// Successor iterators used by spot::saba_complement_tgba. - /// \ingroup saba_representation - /// - /// Since the algorithm works on-the-fly, the key components of the - /// algorithm are implemented in this class. - /// - class saba_complement_tgba_succ_iterator: public saba_succ_iterator - { - public: - typedef std::list state_conjunction_list_t; - typedef std::map - bdd_list_t; - - saba_complement_tgba_succ_iterator(const const_tgba_digraph_ptr& - automaton, - bdd the_acceptance_cond, - const saba_state_complement_tgba* - origin); - virtual ~saba_complement_tgba_succ_iterator(); - - virtual void first(); - virtual void next(); - virtual bool done() const; - virtual saba_state_conjunction* current_conjunction() const; - virtual bdd current_condition() const; - private: - void get_atomics(std::set& list, bdd c); - void get_conj_list(); - void state_conjunction(); - void delete_condition_list(); - - const_tgba_digraph_ptr automaton_; - bdd the_acceptance_cond_; - const saba_state_complement_tgba* origin_; - bdd_list_t condition_list_; - bdd_list_t::const_iterator current_condition_; - state_conjunction_list_t::const_iterator current_conjunction_; - state_conjunction_list_t::const_iterator current_end_conjunction_; - }; - - saba_complement_tgba_succ_iterator:: - saba_complement_tgba_succ_iterator(const const_tgba_digraph_ptr& automaton, - bdd the_acceptance_cond, - const saba_state_complement_tgba* origin) - : automaton_(automaton), the_acceptance_cond_(the_acceptance_cond), - origin_(origin) - { - assert(automaton->is_sba()); - // If state not accepting or rank is even - if (((origin_->get_rank() & 1) == 0) || - !automaton_->state_is_accepting(origin_->get_state())) - { - get_conj_list(); - state_conjunction(); - } - } - - saba_complement_tgba_succ_iterator:: - ~saba_complement_tgba_succ_iterator() - { - delete_condition_list(); - } - - void - saba_complement_tgba_succ_iterator::state_conjunction() - { - int max_rank = origin_->get_rank(); - - for (bdd_list_t::iterator it = condition_list_.begin(); - it != condition_list_.end(); - ++it) - { - // Get successors states. - bdd condition = it->first; - std::vector state_list; - for (auto iterator: automaton_->succ(origin_->get_state())) - { - bdd c = iterator->current_condition(); - if ((c & condition) != bddfalse) - state_list.push_back(shared_state(iterator->current_state(), - shared_state_deleter)); - } - - // Make the conjunction with ranks. - std::vector current_ranks(state_list.size(), max_rank); - - if (state_list.empty()) - return; - - do - { - explicit_state_conjunction* conj = new explicit_state_conjunction(); - for (unsigned i = 0; i < state_list.size(); ++i) - { - conj->add(new saba_state_complement_tgba(state_list[i], - current_ranks[i], - the_acceptance_cond_)); - } - it->second.push_back(conj); - - if (current_ranks[0] <= 0) - break; - - unsigned order = state_list.size() - 1; - while (current_ranks[order] == 0) - { - current_ranks[order] = max_rank; - --order; - } - --current_ranks[order]; - } - while (1); - } - } - - /// Insert in \a list atomic properties of the formula \a c. - void - saba_complement_tgba_succ_iterator::get_atomics(std::set& list, bdd c) - { - bdd current = bdd_satone(c); - while (current != bddtrue && current != bddfalse) - { - list.insert(bdd_var(current)); - bdd high = bdd_high(current); - if (high == bddfalse) - current = bdd_low(current); - else - current = high; - } - } - - /// Free the conjunctions in the condition map. - void - saba_complement_tgba_succ_iterator::delete_condition_list() - { - for (bdd_list_t::iterator i = condition_list_.begin(); - i != condition_list_.end(); - ++i) - { - for (state_conjunction_list_t::iterator j = i->second.begin(); - j != i->second.end(); - ++j) - delete *j; - } - condition_list_.clear(); - } - - /// Create the conjunction of all the atomic properties from - /// the successors of the current state. - void - saba_complement_tgba_succ_iterator::get_conj_list() - { - std::set atomics; - delete_condition_list(); - - for (auto iterator: automaton_->succ(origin_->get_state())) - { - bdd c = iterator->current_condition(); - get_atomics(atomics, c); - } - - // Compute the conjunction of all those atomic properties. - unsigned atomics_size = atomics.size(); - - assert(atomics_size < 32); - for (unsigned i = 1; i <= static_cast(1 << atomics_size); ++i) - { - bdd result = bddtrue; - unsigned position = 1; - for (std::set::const_iterator a_it = atomics.begin(); - a_it != atomics.end(); - ++a_it, position <<= 1) - { - bdd this_atomic; - if (position & i) - this_atomic = bdd_ithvar(*a_it); - else - this_atomic = bdd_nithvar(*a_it); - result = bdd_apply(result, this_atomic, bddop_and); - } - condition_list_[result] = state_conjunction_list_t(); - } - } - - void - saba_complement_tgba_succ_iterator::first() - { - current_condition_ = condition_list_.begin(); - if (current_condition_ != condition_list_.end()) - { - current_conjunction_ = current_condition_->second.begin(); - current_end_conjunction_ = current_condition_->second.end(); - } - } - - void - saba_complement_tgba_succ_iterator::next() - { - if (++current_conjunction_ == current_end_conjunction_) - { - ++current_condition_; - if (current_condition_ != condition_list_.end()) - { - current_conjunction_ = current_condition_->second.begin(); - current_end_conjunction_ = current_condition_->second.end(); - } - } - } - - bool - saba_complement_tgba_succ_iterator::done() const - { - return (current_condition_ == condition_list_.end()); - } - - saba_state_conjunction* - saba_complement_tgba_succ_iterator::current_conjunction() const - { - return (*current_conjunction_)->clone(); - } - - bdd - saba_complement_tgba_succ_iterator::current_condition() const - { - return current_condition_->first; - } - - } // end namespace anonymous. - - saba_complement_tgba::saba_complement_tgba(const const_tgba_ptr& a) - : automaton_(degeneralize(a)) - { - get_dict()->register_all_variables_of(automaton_, this); - int v = get_dict() - ->register_acceptance_variable(ltl::constant::true_instance(), this); - the_acceptance_cond_ = bdd_ithvar(v); - nb_states_ = automaton_->num_states(); - } - - saba_complement_tgba::~saba_complement_tgba() - { - get_dict()->unregister_all_my_variables(this); - } - - saba_state* - saba_complement_tgba::get_init_state() const - { - state* original_init_state = automaton_->get_init_state(); - saba_state_complement_tgba* new_init; - if (automaton_->state_is_accepting(original_init_state)) - new_init = - new saba_state_complement_tgba(shared_state(original_init_state, - shared_state_deleter), - 2 * nb_states_, - the_acceptance_cond_); - else - new_init = - new saba_state_complement_tgba(shared_state(original_init_state, - shared_state_deleter), - 2 * nb_states_, - bddfalse); - - return new_init; - } - - saba_succ_iterator* - saba_complement_tgba::succ_iter(const saba_state* local_state) const - { - const saba_state_complement_tgba* state = - dynamic_cast(local_state); - assert(state); - - return new saba_complement_tgba_succ_iterator(automaton_, - the_acceptance_cond_, - state); - } - - bdd_dict_ptr - saba_complement_tgba::get_dict() const - { - return automaton_->get_dict(); - } - - std::string - saba_complement_tgba::format_state(const saba_state* state) const - { - const saba_state_complement_tgba* s = - dynamic_cast(state); - assert(s); - std::ostringstream ss; - ss << "{ original: " << automaton_->format_state(s->get_state()) - << "\n rank: " << s->get_rank() - << "\n acc: " << bdd_format_accset(get_dict(), - s->acceptance_conditions()) - << " }"; - return ss.str(); - } - - bdd - saba_complement_tgba::all_acceptance_conditions() const - { - return the_acceptance_cond_; - } - -} // end namespace spot. diff --git a/src/saba/sabacomplementtgba.hh b/src/saba/sabacomplementtgba.hh deleted file mode 100644 index 27c750cf4..000000000 --- a/src/saba/sabacomplementtgba.hh +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (C) 2009, 2010, 2013, 2014 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABA_SABACOMPLEMENTTGBA_HH -#define SPOT_SABA_SABACOMPLEMENTTGBA_HH - -#include "tgba/fwd.hh" -#include "saba.hh" - -namespace spot -{ - /// \ingroup saba - /// \brief Complement a TGBA and produce a SABA. - /// - /// The original TGBA is transformed into a States-based - /// Büchi Automaton. - /// - /// Several techniques are supposed to by applied on the resulting - /// automaton before its transformation into a TGBA. Those techniques - /// are expected to reduce the size of the automaton. - /// - /// This algorithm comes from: - /** \verbatim - @Article{ gurumurthy.03.lncs, - title = {On complementing nondeterministic {B\"uchi} automata}, - author = {Gurumurthy, S. and Kupferman, O. and Somenzi, F. and - Vardi, M.Y.}, - journal = {Lecture Notes in Computer Science}, - pages = {96--110}, - year = {2003}, - publisher = {Springer-Verlag} - } - \endverbatim */ - /// - /// The construction is done on-the-fly, by the - /// \c saba_complement_succ_iterator class. - /// \see saba_complement_succ_iterator - class SPOT_API saba_complement_tgba : public saba - { - public: - saba_complement_tgba(const const_tgba_ptr& a); - virtual ~saba_complement_tgba(); - - // tgba interface - virtual saba_state* get_init_state() const; - virtual saba_succ_iterator* - succ_iter(const saba_state* local_state) const; - - virtual bdd_dict_ptr get_dict() const; - virtual std::string format_state(const saba_state* state) const; - virtual bdd all_acceptance_conditions() const; - private: - const_tgba_digraph_ptr automaton_; - bdd the_acceptance_cond_; - unsigned nb_states_; - }; // end class tgba_saba_complement. - - typedef std::shared_ptr saba_complement_tgba_ptr; - typedef std::shared_ptr - const_saba_complement_tgba_ptr; - inline saba_complement_tgba_ptr make_saba_complement(const const_tgba_ptr& a) - { - return std::make_shared(a); - } - - -} // end namespace spot. - - -#endif // SPOT_SABA_SABACOMPLEMENTTGBA_HH diff --git a/src/saba/sabastate.hh b/src/saba/sabastate.hh deleted file mode 100644 index 83012bc6d..000000000 --- a/src/saba/sabastate.hh +++ /dev/null @@ -1,247 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2013 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABA_SABASTATE_HH -# define SPOT_SABA_SABASTATE_HH - -#include "misc/common.hh" -#include -#include -#include -#include - -namespace spot -{ - - /// \ingroup saba_essentials - /// \brief Abstract class for saba states. - class SPOT_API saba_state - { - public: - /// \brief Compares two states (that come from the same automaton). - /// - /// This method returns an integer less than, equal to, or greater - /// than zero if \a this is found, respectively, to be less than, equal - /// to, or greater than \a other according to some implicit total order. - /// - /// This method should not be called to compare states from - /// different automata. - /// - /// \sa spot::saba_state_ptr_less_than - virtual int compare(const saba_state* other) const = 0; - - /// \brief Hash a state. - /// - /// This method returns an integer that can be used as a - /// hash value for this state. - /// - /// Note that the hash value is guaranteed to be unique for all - /// equal states (in compare()'s sense) for only has long has one - /// of these states exists. So it's OK to use a spot::saba_state - /// as a key in an \c unordered_map because the mere use of the - /// state as a key in the hash will ensure the state continues to - /// exist. - /// - /// However if you create the state, get its hash key, delete the - /// state, recreate the same state, and get its hash key, you may - /// obtain two different hash keys if the same state were not - /// already used elsewhere. In practice this weird situation can - /// occur only when the state is BDD-encoded, because BDD numbers - /// (used to build the hash value) can be reused for other - /// formulas. That probably doesn't matter, since the hash value - /// is meant to be used in an \c unordered_map, but it had to be noted. - virtual size_t hash() const = 0; - - /// Duplicate a state. - virtual saba_state* clone() const = 0; - - /// \brief Get the acceptance condition. - /// - /// saba are state-labeled automata, then their acceptance conditions - /// are labeled on states. - virtual bdd acceptance_conditions() const = 0; - - virtual ~saba_state() - { - } - }; - - /// \ingroup saba_essentials - /// \brief Strict Weak Ordering for \c saba_state*. - /// - /// This is meant to be used as a comparison functor for - /// STL \c map whose key are of type \c saba_state*. - /// - /// For instance here is how one could declare - /// a map of \c saba_state*. - /// \code - /// // Remember how many times each state has been visited. - /// std::map seen; - /// \endcode - struct saba_state_ptr_less_than: - public std::binary_function - { - bool - operator()(const saba_state* left, const saba_state* right) const - { - assert(left); - return left->compare(right) < 0; - } - }; - - /// \ingroup saba_essentials - /// \brief An Equivalence Relation for \c saba_state*. - /// - /// This is meant to be used as a comparison functor for - /// \c unordered_map whose keys are of type \c saba_state*. - /// - /// For instance here is how one could declare - /// a map of \c saba_state*. - /// \code - /// // Remember how many times each state has been visited. - /// std::unordered_map seen; - /// \endcode - struct saba_state_ptr_equal: - public std::binary_function - { - bool - operator()(const saba_state* left, const saba_state* right) const - { - assert(left); - return 0 == left->compare(right); - } - }; - - /// \ingroup saba_essentials - /// \ingroup hash_funcs - /// \brief Hash Function for \c saba_state*. - /// - /// This is meant to be used as a hash functor for - /// an \c unordered_map whose keys are of type \c saba_state*. - /// - /// For instance here is how one could declare - /// a map of \c saba_state*. - /// \code - /// // Remember how many times each state has been visited. - /// std::unordered_map seen; - /// \endcode - struct saba_state_ptr_hash: - public std::unary_function - { - size_t - operator()(const saba_state* that) const - { - assert(that); - return that->hash(); - } - }; - - // Functions related to shared_ptr. - ////////////////////////////////////////////////// - - typedef std::shared_ptr shared_saba_state; - - /// \ingroup saba_essentials - /// \brief Strict Weak Ordering for \c shared_saba_state - /// (shared_ptr). - /// - /// This is meant to be used as a comparison functor for - /// STL \c map whose keys are of type \c shared_saba_state. - /// - /// For instance here is how one could declare - /// a map of \c shared_saba_state. - /// \code - /// // Remember how many times each state has been visited. - /// std::map - /// seen; - /// \endcode - struct saba_state_shared_ptr_less_than: - public std::binary_function - { - bool - operator()(shared_saba_state left, - shared_saba_state right) const - { - assert(left); - return left->compare(right.get()) < 0; - } - }; - - /// \ingroup saba_essentials - /// \brief An Equivalence Relation for \c shared_saba_state - /// (shared_ptr). - /// - /// This is meant to be used as a comparison functor for - /// an \c unordred_map whose keys are of type \c shared_saba_state. - /// - /// For instance here is how one could declare - /// a map of \c shared_saba_state - /// \code - /// // Remember how many times each state has been visited. - /// std::unordered_map seen; - /// \endcode - struct saba_state_shared_ptr_equal: - public std::binary_function - { - bool - operator()(shared_saba_state left, - shared_saba_state right) const - { - assert(left); - return 0 == left->compare(right.get()); - } - }; - - /// \ingroup saba_essentials - /// \ingroup hash_funcs - /// \brief Hash Function for \c shared_saba_state - /// (shared_ptr). - /// - /// This is meant to be used as a hash functor for - /// \c unordered_map whose key are of type - /// \c shared_saba_state. - /// - /// For instance here is how one could declare - /// a map of \c shared_saba_state. - /// \code - /// // Remember how many times each state has been visited. - /// std::unordered_map seen; - /// \endcode - struct saba_state_shared_ptr_hash: - public std::unary_function - { - size_t - operator()(shared_saba_state that) const - { - assert(that); - return that->hash(); - } - }; - -} - -#endif // SPOT_SABA_SABASTATE_HH diff --git a/src/saba/sabasucciter.hh b/src/saba/sabasucciter.hh deleted file mode 100644 index 9d18d2798..000000000 --- a/src/saba/sabasucciter.hh +++ /dev/null @@ -1,158 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2013 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABA_SABASUCCITER_HH -# define SPOT_SABA_SABASUCCITER_HH - -#include "sabastate.hh" - -namespace spot -{ - /// \ingroup saba_essentials - /// \brief Iterate over a conjunction of saba_state. - /// - /// This class provides the basic functionalities required to - /// iterate over a conjunction of states of a saba. - class SPOT_API saba_state_conjunction - { - public: - virtual - ~saba_state_conjunction() - { - } - - /// \name Iteration - //@{ - - /// \brief Position the iterator on the first successor of the conjunction - /// (if any). - /// - /// This method can be called several times to make multiple - /// passes over successors. - /// - /// \warning One should always call \c done() to - /// ensure there is a successor, even after \c first(). A - /// common trap is to assume that there is at least one - /// successor: this is wrong. - virtual void first() = 0; - - /// \brief Jump to the next successor (if any). - /// - /// \warning Again, one should always call \c done() to ensure - /// there is a successor. - virtual void next() = 0; - - /// \brief Check whether the iteration over a conjunction of states - /// is finished. - /// - /// This function should be called after any call to \c first() - /// or \c next() and before any enquiry about the current state. - virtual bool done() const = 0; - - //@} - - /// \name Inspection - //@{ - - /// \brief Get the state of the current successor. - /// - /// Note that the same state may occur at different points - /// in the iteration. These actually correspond to the same - /// destination. It just means there were several transitions, - /// with different conditions, leading to the same state. - /// - /// \warning the state is allocated with new, its deletion is - /// the responsibility of the caller. - virtual saba_state* current_state() const = 0; - - //@} - - /// Duplicate a saba_state conjunction. - virtual saba_state_conjunction* clone() const = 0; - }; - - - /// \ingroup saba_essentials - /// \brief Iterate over the successors of a saba_state. - /// - /// This class provides the basic functionalities required to - /// iterate over the successors of a state of a saba. Since - /// transitions of an alternating automaton are defined as a - /// boolean function with conjunctions (universal) and - /// disjunctions (non-deterministic), - class SPOT_API saba_succ_iterator - { - public: - virtual - ~saba_succ_iterator() - { - } - - /// \name Iteration - //@{ - - /// \brief Position the iterator on the first conjunction - /// of successors (if any). - /// - /// This method can be called several times to make multiple - /// passes over successors. - /// - /// \warning One should always call \c done() to - /// ensure there is a successor, even after \c first(). A - /// common trap is to assume that there is at least one - /// successor: this is wrong. - virtual void first() = 0; - - /// \brief Jump to the next conjunction of successors (if any). - /// - /// \warning Again, one should always call \c done() to ensure - /// there is a successor. - virtual void next() = 0; - - /// \brief Check whether the iteration is finished. - /// - /// This function should be called after any call to \c first() - /// or \c next() and before any enquiry about the current state. - /// - /// The usual way to do this is with a \c for loop. - /// \code - /// for (s->first(); !s->done(); s->next()) - /// ... - /// \endcode - virtual bool done() const = 0; - - //@} - - /// \name Inspection - //@{ - - /// \brief Get current conjunction of successor states. - virtual saba_state_conjunction* current_conjunction() const = 0; - - /// \brief Get the condition on the transition leading to this successor. - /// - /// This is a boolean function of atomic propositions. - virtual bdd current_condition() const = 0; - - //@} - }; -} - - -#endif // SPOT_TGBA_SUCCITER_HH diff --git a/src/sabaalgos/Makefile.am b/src/sabaalgos/Makefile.am deleted file mode 100644 index 44907efde..000000000 --- a/src/sabaalgos/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## -*- coding: utf-8 -*- -## Copyright (C) 2009, 2011, 2013 Laboratoire de Recherche et -## Développement de l'Epita (LRDE). -## -## This file is part of Spot, a model checking library. -## -## Spot is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or -## (at your option) any later version. -## -## Spot is distributed in the hope that it will be useful, but WITHOUT -## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -## License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see . - -AM_CPPFLAGS = -I$(srcdir)/.. -I.. $(BUDDY_CPPFLAGS) -AM_CXXFLAGS = $(WARNING_CXXFLAGS) - -sabaalgosdir = $(pkgincludedir)/sabaalgos - -sabaalgos_HEADERS = sabadotty.hh sabareachiter.hh - -noinst_LTLIBRARIES = libsabaalgos.la -libsabaalgos_la_SOURCES = sabadotty.cc sabareachiter.cc diff --git a/src/sabaalgos/sabadotty.cc b/src/sabaalgos/sabadotty.cc deleted file mode 100644 index 1222c1825..000000000 --- a/src/sabaalgos/sabadotty.cc +++ /dev/null @@ -1,105 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2014 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include -#include "sabadotty.hh" -#include "tgba/bddprint.hh" -#include "sabareachiter.hh" -#include "misc/escape.hh" - -namespace spot -{ - namespace - { - class saba_dotty_bfs : public saba_reachable_iterator_breadth_first - { - public: - saba_dotty_bfs(std::ostream& os, const const_saba_ptr& a) - : saba_reachable_iterator_breadth_first(a), os_(os) - { - } - - void - start() - { - os_ << "digraph G {" << std::endl; - os_ << " 0 [label=\"\", style=invis, height=0]" << std::endl; - os_ << " 0 -> 1;" << std::endl; - } - - void - end() - { - os_ << '}' << std::endl; - } - - void - process_state(const saba_state* s, int n) - { - std::string label = - escape_str(automata_->format_state(s)) - + "\\n" - + bdd_format_accset(automata_->get_dict(), - s->acceptance_conditions()); - os_ << " " << n << ' ' - << "[label=\"" << label << "\"];\n"; - } - - void - process_state_conjunction(const saba_state*, int in, - const saba_state_conjunction*, - int sc_id, - const saba_succ_iterator* si) - { - os_ << " s" << in << "sc" << sc_id - << " [label=\"\", style=invis, height=0];" << std::endl; - - std::string label = - bdd_format_formula(automata_->get_dict(), - si->current_condition()); - - os_ << " " << in << " -> s" << in << "sc" << sc_id - << " [label=\"" << label << "\", arrowhead=\"none\"];\n"; - } - - void - process_link(const saba_state*, int in, - const saba_state*, int out, - const saba_state_conjunction*, - int sc_id, - const saba_succ_iterator*) - { - os_ << " s" << in << "sc" << sc_id << " -> " << out - << " [label=\"\"];\n"; - } - - private: - std::ostream& os_; - }; - } - - std::ostream& - saba_dotty_reachable(std::ostream& os, const const_saba_ptr& g) - { - saba_dotty_bfs d(os, g); - d.run(); - return os; - } - -} diff --git a/src/sabaalgos/sabadotty.hh b/src/sabaalgos/sabadotty.hh deleted file mode 100644 index 55180d866..000000000 --- a/src/sabaalgos/sabadotty.hh +++ /dev/null @@ -1,36 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2013, 2014 Laboratoire de Recherche et -// Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABAALGOS_SABADOTTY_HH -# define SPOT_SABAALGOS_SABADOTTY_HH - -#include "misc/common.hh" -#include -#include "saba/saba.hh" - -namespace spot -{ - /// \ingroup saba_io - /// \brief Print reachable states in dot format. - SPOT_API std::ostream& - saba_dotty_reachable(std::ostream& os, - const const_saba_ptr& g); -} - -#endif // SPOT_SABAALGOS_SABADOTTY_HH diff --git a/src/sabaalgos/sabareachiter.cc b/src/sabaalgos/sabareachiter.cc deleted file mode 100644 index 4682ce1ab..000000000 --- a/src/sabaalgos/sabareachiter.cc +++ /dev/null @@ -1,187 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2014 Laboratoire de Recherche et Développement -// de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include -#include "sabareachiter.hh" - -namespace spot -{ - // saba_reachable_iterator - ////////////////////////////////////////////////////////////////////// - - saba_reachable_iterator::saba_reachable_iterator(const const_saba_ptr& a) - : automata_(a) - { - } - - saba_reachable_iterator::~saba_reachable_iterator() - { - seen_map::const_iterator s = seen.begin(); - while (s != seen.end()) - { - // Advance the iterator before deleting the "key" pointer. - const saba_state* ptr = s->first; - ++s; - delete ptr; - } - } - - void - saba_reachable_iterator::run() - { - int n = 0; - int conjn = 0; - - start(); - saba_state* i = automata_->get_init_state(); - if (want_state(i)) - add_state(i); - seen[i] = ++n; - const saba_state* t; - while ((t = next_state())) - { - assert(seen.find(t) != seen.end()); - int tn = seen[t]; - saba_succ_iterator* si = automata_->succ_iter(t); - process_state(t, tn); - for (si->first(); !si->done(); si->next()) - { - saba_state_conjunction* conj = si->current_conjunction(); - ++conjn; - process_state_conjunction(t, tn, conj, conjn, si); - - for (conj->first(); !conj->done(); conj->next()) - { - const saba_state* current = conj->current_state(); - seen_map::const_iterator s = seen.find(current); - bool ws = want_state(current); - - if (s == seen.end()) - { - seen[current] = ++n; - if (ws) - { - add_state(current); - process_link(t, tn, current, n, conj, conjn, si); - } - } - else - { - if (ws) - process_link(t, tn, s->first, s->second, conj, conjn, si); - delete current; - } - } - delete conj; - } - delete si; - } - end(); - } - - bool - saba_reachable_iterator::want_state(const saba_state*) const - { - return true; - } - - void - saba_reachable_iterator::start() - { - } - - void - saba_reachable_iterator::end() - { - } - - void - saba_reachable_iterator::process_state(const saba_state*, int) - { - } - - void - saba_reachable_iterator:: - process_state_conjunction(const saba_state*, int, - const saba_state_conjunction*, - int, - const saba_succ_iterator*) - { - } - - void - saba_reachable_iterator::process_link(const saba_state*, int, - const saba_state*, int, - const saba_state_conjunction*, - int, - const saba_succ_iterator*) - { - } - - // saba_reachable_iterator_depth_first - ////////////////////////////////////////////////////////////////////// - - saba_reachable_iterator_depth_first:: - saba_reachable_iterator_depth_first(const const_saba_ptr& a) - : saba_reachable_iterator(a) - { - } - - void - saba_reachable_iterator_depth_first::add_state(const saba_state* s) - { - todo.push(s); - } - - const saba_state* - saba_reachable_iterator_depth_first::next_state() - { - if (todo.empty()) - return 0; - const saba_state* s = todo.top(); - todo.pop(); - return s; - } - - // saba_reachable_iterator_breadth_first - ////////////////////////////////////////////////////////////////////// - - saba_reachable_iterator_breadth_first:: - saba_reachable_iterator_breadth_first(const const_saba_ptr& a) - : saba_reachable_iterator(a) - { - } - - void - saba_reachable_iterator_breadth_first::add_state(const saba_state* s) - { - todo.push_back(s); - } - - const saba_state* - saba_reachable_iterator_breadth_first::next_state() - { - if (todo.empty()) - return 0; - const saba_state* s = todo.front(); - todo.pop_front(); - return s; - } - -} diff --git a/src/sabaalgos/sabareachiter.hh b/src/sabaalgos/sabareachiter.hh deleted file mode 100644 index d80b79b93..000000000 --- a/src/sabaalgos/sabareachiter.hh +++ /dev/null @@ -1,153 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2010, 2013, 2014 Laboratoire de Recherche et -// Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef SPOT_SABAALGOS_SABAREACHITER_HH -# define SPOT_SABAALGOS_SABAREACHITER_HH - -#include "misc/hash.hh" -#include "saba/saba.hh" -#include -#include - -namespace spot -{ - /// \ingroup saba_generic - /// \brief Iterate over all reachable states of a spot::saba. - class SPOT_API saba_reachable_iterator - { - public: - saba_reachable_iterator(const const_saba_ptr& a); - virtual ~saba_reachable_iterator(); - - /// \brief Iterate over all reachable states of a spot::saba. - /// - /// This is a template method that will call add_state(), next_state(), - /// start(), end(), process_state(), process_state_conjunction() and - /// process_link(), while it iterates over states. - void run(); - - /// \name Todo list management. - /// - /// spot::saba_reachable_iterator_depth_first and - /// spot::saba_reachable_iterator_breadth_first offer two precanned - /// implementations for these functions. - /// \{ - /// \brief Called by run() to register newly discovered states. - virtual void add_state(const saba_state* s) = 0; - /// \brief Called by run() to obtain the next state to process. - virtual const saba_state* next_state() = 0; - /// \} - - /// Called by add_state or next_states implementations to filter - /// states. Default implementation always return true. - virtual bool want_state(const saba_state* s) const; - - /// Called by run() before starting its iteration. - virtual void start(); - /// Called by run() once all states have been explored. - virtual void end(); - - /// Called by run() to process a state. - /// - /// \param s The current state. - /// \param n A unique number assigned to \a s. - virtual void process_state(const saba_state* s, int n); - - /// Called by run() to process a conjunction of states. - /// - /// \param in_s The current state. - /// \param in An unique number assigned to \a in_s. - /// \param sc The spot::saba_state_conjunction positionned on the current - /// conjunction. - /// \param sc_id An unique number for the this transition assigned to \a sc. - /// \param si The spot::saba_succ_iterator positionned on the current - /// transition. - virtual void - process_state_conjunction(const saba_state* in_s, int in, - const saba_state_conjunction* sc, - int sc_id, - const saba_succ_iterator* si); - /// Called by run() to process a transition. - /// - /// \param in_s The source state - /// \param in The source state number. - /// \param out_s The destination state - /// \param out The destination state number. - /// \param sc The spot::saba_state_conjunction positionned on the current - /// conjunction. - /// \param sc_id An unique number for the this transition assigned to \a sc. - /// \param si The spot::saba_succ_iterator positionned on the current - /// transition. - /// - /// The in_s and out_s states are owned by the - /// spot::saba_reachable_iterator instance and destroyed when the - /// instance is destroyed. - virtual void - process_link(const saba_state* in_s, int in, - const saba_state* out_s, int out, - const saba_state_conjunction* sc, - int sc_id, - const saba_succ_iterator* si); - - protected: - const_saba_ptr automata_; ///< The spot::saba to explore. - - typedef - std::unordered_map seen_map; - seen_map seen; ///< States already seen. - }; - - /// \ingroup saba_generic - /// \brief An implementation of spot::saba_reachable_iterator that browses - /// states depth first. - class SPOT_API saba_reachable_iterator_depth_first: - public saba_reachable_iterator - { - public: - saba_reachable_iterator_depth_first(const const_saba_ptr& a); - - virtual void add_state(const saba_state* s); - virtual const saba_state* next_state(); - - protected: - std::stack todo; ///< A stack of states yet to explore. - }; - - /// \ingroup saba_generic - /// \brief An implementation of spot::saba_reachable_iterator that browses - /// states breadth first. - class SPOT_API saba_reachable_iterator_breadth_first: - public saba_reachable_iterator - { - public: - saba_reachable_iterator_breadth_first(const const_saba_ptr& a); - - virtual void add_state(const saba_state* s); - virtual const saba_state* next_state(); - - protected: - std::deque todo; ///< A queue of states yet to explore. - }; - - -} - - -#endif // SPOT_SABAALGOS_SABAREACHITER_HH diff --git a/src/sabatest/.gitignore b/src/sabatest/.gitignore deleted file mode 100644 index 411970693..000000000 --- a/src/sabatest/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -defs -sabacomplementtgba diff --git a/src/sabatest/Makefile.am b/src/sabatest/Makefile.am deleted file mode 100644 index c880dd040..000000000 --- a/src/sabatest/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -## Copyright (C) 2009, 2011 Laboratoire de Recherche et Développement -## de l'Epita (LRDE). -## -## This file is part of Spot, a model checking library. -## -## Spot is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or -## (at your option) any later version. -## -## Spot is distributed in the hope that it will be useful, but WITHOUT -## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -## License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see . - -AM_CPPFLAGS = -I$(srcdir)/.. -I.. $(BUDDY_CPPFLAGS) -AM_CXXFLAGS = $(WARNING_CXXFLAGS) -LDADD = ../libspot.la - -# These are the most used test programs, and they are also useful -# to run manually outside the test suite. Always build them. -# noinst_PROGRAMS = - -check_SCRIPTS = defs -# Keep this sorted alphabetically. -check_PROGRAMS = \ - sabacomplementtgba - -# Keep this sorted alphabetically. -sabacomplementtgba_SOURCES = sabacomplementtgba.cc - -# Keep this sorted by STRENGTH. Test basic things first, -# because such failures will be easier to diagnose and fix. -# TESTS = diff --git a/src/sabatest/defs.in b/src/sabatest/defs.in deleted file mode 100644 index dc39be955..000000000 --- a/src/sabatest/defs.in +++ /dev/null @@ -1,87 +0,0 @@ -# -*- shell-script -*- -# Copyright (C) 2009 Laboratoire de Recherche et Développement -# de l'Epita (LRDE). -# Copyright (C) 2003, 2004, 2006 Laboratoire d'Informatique de Paris 6 (LIP6), -# département Systèmes Répartis Coopératifs (SRC), Université Pierre -# et Marie Curie. -# -# This file is part of Spot, a model checking library. -# -# Spot is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# Spot is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Ensure we are running from the right directory. -test -f ./defs || { - echo "defs: not found in current directory" 1>&2 - exit 1 -} - -# If srcdir is not set, then we are not running from `make check'. -if test -z "$srcdir"; then - # compute $srcdir. - srcdir=`echo "$0" | sed -e 's,/[^\\/]*$,,'` - test $srcdir = $0 && srcdir=. -fi - -# Ensure $srcdir is set correctly. -test -f $srcdir/defs.in || { - echo "$srcdir/defs.in not found, check \$srcdir" 1>&2 - exit 1 -} - -echo "== Running test $0" - -me=`echo "$0" | sed -e 's,.*[\\/],,;s/\.test$//'` - -testSubDir=$me.dir -chmod -R a+rwx $testSubDir > /dev/null 2>&1 -rm -rf $testSubDir > /dev/null 2>&1 -mkdir $testSubDir -cd $testSubDir - -# Adjust srcdir now that we are in a subdirectory. We still want to -# source directory corresponding to the build directory that contains -# $testSubDir. -case $srcdir in - # I - [\\/$]* | ?:[\\/]* );; - *) srcdir=../$srcdir -esac - -DOT='@DOT@' -top_builddir='../@top_builddir@' -LBTT="@LBTT@" -LBTT_TRANSLATE="@LBTT_TRANSLATE@" -VALGRIND='@VALGRIND@' - -run() -{ - expected_exitcode=$1 - shift - exitcode=0 - if test -n "$VALGRIND"; then - exec 6>valgrind.err - GLIBCPP_FORCE_NEW=1 \ - ../../../libtool --mode=execute \ - $VALGRIND --tool=memcheck --leak-check=yes --log-fd=6 -q "$@" || - exitcode=$? - cat valgrind.err 1>&2 - test -z "`sed 1q valgrind.err`" || exit 50 - rm -f valgrind.err - else - "$@" || exitcode=$? - fi - test $exitcode = $expected_exitcode || exit 1 -} - -set -x diff --git a/src/sabatest/sabacomplementtgba.cc b/src/sabatest/sabacomplementtgba.cc deleted file mode 100644 index 423df8493..000000000 --- a/src/sabatest/sabacomplementtgba.cc +++ /dev/null @@ -1,76 +0,0 @@ -// -*- coding: utf-8 -*- -// Copyright (C) 2009, 2012, 2014 Laboratoire de Recherche et -// Développement de l'Epita (LRDE). -// -// This file is part of Spot, a model checking library. -// -// Spot is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// Spot is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -// License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -void usage(const std::string& argv0) -{ - std::cerr - << "usage " << argv0 << " [options]" << std::endl - << "options:" << std::endl - << "-f formula display the saba of !forumula" - << std::endl; -} - -int main(int argc, char* argv[]) -{ - std::string formula; - for (int i = 1; i < argc; ++i) - { - if (!strcmp(argv[i], "-f")) - { - if (i + 1 >= argc) - { - usage(argv[0]); - return 1; - } - formula = argv[++i]; - } - else - { - usage(argv[0]); - return 1; - } - } - - if (formula.empty()) - { - usage(argv[0]); - return 1; - } - - spot::ltl::parse_error_list p1; - const spot::ltl::formula* f1 = spot::ltl::parse(formula, p1); - if (spot::ltl::format_parse_errors(std::cerr, formula, p1)) - return 2; - - auto a = spot::ltl_to_tgba_fm(f1, spot::make_bdd_dict()); - auto complement = spot::make_saba_complement(a); - spot::saba_dotty_reachable(std::cout, complement); - f1->destroy(); -}