// -*- coding: utf-8 -*- // Copyright (C) 2009, 2011, 2012, 2013, 2014, 2015 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 . #pragma once #include #include #include #include #include "misc/hash.hh" #include "ltlast/formula.hh" #include "bdddict.hh" #include "tgba.hh" #include "ltlvisit/tostring.hh" namespace spot { /// \brief A self-loop Transition-based Alternating Automaton (TAA) /// which is seen as a TGBA (abstract class, see below). class SPOT_API taa_tgba: public twa { public: taa_tgba(const bdd_dict_ptr& dict); struct transition; typedef std::list state; typedef std::set state_set; /// Explicit transitions. struct transition { bdd condition; acc_cond::mark_t acceptance_conditions; const state_set* dst; }; void add_condition(transition* t, const ltl::formula* f); /// TGBA interface. virtual ~taa_tgba(); virtual spot::state* get_init_state() const final; virtual tgba_succ_iterator* succ_iter(const spot::state* state) const final; virtual std::string format_state(const spot::state* state) const = 0; protected: virtual bdd compute_support_conditions(const spot::state* state) const final; typedef std::vector ss_vec; taa_tgba::state_set* init_; ss_vec state_set_vec_; std::map acc_map_; private: // Disallow copy. taa_tgba(const taa_tgba& other) SPOT_DELETED; taa_tgba& operator=(const taa_tgba& other) SPOT_DELETED; }; /// Set of states deriving from spot::state. class SPOT_API set_state final: public spot::state { public: set_state(const taa_tgba::state_set* s, bool delete_me = false) : s_(s), delete_me_(delete_me) { } virtual int compare(const spot::state*) const; virtual size_t hash() const; virtual set_state* clone() const; virtual ~set_state() { if (delete_me_) delete s_; } const taa_tgba::state_set* get_state() const; private: const taa_tgba::state_set* s_; bool delete_me_; }; class SPOT_API taa_succ_iterator final: public tgba_succ_iterator { public: taa_succ_iterator(const taa_tgba::state_set* s, const acc_cond& acc); virtual ~taa_succ_iterator(); virtual bool first(); virtual bool next(); virtual bool done() const; virtual set_state* current_state() const; virtual bdd current_condition() const; virtual acc_cond::mark_t current_acceptance_conditions() const; private: /// Those typedefs are used to generate all possible successors in /// the constructor using a cartesian product. typedef taa_tgba::state::const_iterator iterator; typedef std::pair iterator_pair; typedef std::vector bounds_t; typedef std::unordered_map, state_ptr_hash, state_ptr_equal> seen_map; struct distance_sort : public std::binary_function { bool operator()(const iterator_pair& lhs, const iterator_pair& rhs) const { return std::distance(lhs.first, lhs.second) < std::distance(rhs.first, rhs.second); } }; std::vector::const_iterator i_; std::vector succ_; seen_map seen_; const acc_cond& acc_; }; /// A taa_tgba instance with states labeled by a given type. /// Still an abstract class, see below. template class SPOT_API taa_tgba_labelled: public taa_tgba { public: taa_tgba_labelled(const bdd_dict_ptr& dict) : taa_tgba(dict) {}; ~taa_tgba_labelled() { auto i = acc_map_.begin(); while (i != acc_map_.end()) (i++)->first->destroy(); } void set_init_state(const label& s) { std::vector