00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#ifndef SPOT_TGBA_TGBAEXPLICIT_HH
00023
# define SPOT_TGBA_TGBAEXPLICIT_HH
00024
00025
#include "misc/hash.hh"
00026
#include <list>
00027
#include "tgba.hh"
00028
#include "ltlast/formula.hh"
00029
00030
namespace spot
00031 {
00032
00033
class state_explicit;
00034
class tgba_explicit_succ_iterator;
00035
00037 class tgba_explicit:
public tgba
00038 {
00039
public:
00040
tgba_explicit(
bdd_dict* dict);
00041
00042
struct transition;
00043 typedef std::list<transition*>
state;
00044
00046 struct transition
00047 {
00048 bdd
condition;
00049 bdd
acceptance_conditions;
00050 state*
dest;
00051 };
00052
00053
void set_init_state(
const std::string& state);
00054
00055
transition*
00056
create_transition(
const std::string& source,
const std::string& dest);
00057
00058
void add_condition(
transition* t,
const ltl::formula* f);
00060
void add_conditions(
transition* t, bdd f);
00061
void declare_acceptance_condition(
const ltl::formula* f);
00062
bool has_acceptance_condition(
const ltl::formula* f)
const;
00063
void add_acceptance_condition(
transition* t,
const ltl::formula* f);
00065
void add_acceptance_conditions(
transition* t, bdd f);
00066
void complement_all_acceptance_conditions();
00067
void merge_transitions();
00068
00069
00070
virtual ~tgba_explicit();
00071
virtual spot::state*
get_init_state() const;
00072 virtual
tgba_succ_iterator*
00073 succ_iter(const spot::state* local_state,
00074 const spot::state* global_state = 0,
00075 const
tgba* global_automaton = 0) const;
00076 virtual
bdd_dict* get_dict() const;
00077 virtual std::string format_state(const spot::state* state) const;
00078
00079 virtual bdd all_acceptance_conditions() const;
00080 virtual bdd neg_acceptance_conditions() const;
00081
00082 protected:
00083 virtual bdd compute_support_conditions(const spot::state* state) const;
00084 virtual bdd compute_support_variables(const spot::state* state) const;
00085
00086 state* add_state(const std::string& name);
00087 bdd get_acceptance_condition(const ltl::formula* f);
00088
00089 typedef Sgi::hash_map<const std::string,
tgba_explicit::state*,
00090 string_hash> ns_map;
00091 typedef Sgi::hash_map<const
tgba_explicit::state*, std::string,
00092 ptr_hash<
tgba_explicit::state> > sn_map;
00093 ns_map name_state_map_;
00094 sn_map state_name_map_;
00095 bdd_dict* dict_;
00096 tgba_explicit::state* init_;
00097 mutable bdd all_acceptance_conditions_;
00098 bdd neg_acceptance_conditions_;
00099 mutable
bool all_acceptance_conditions_computed_;
00100
00101 private:
00102
00103
tgba_explicit(const
tgba_explicit& other);
00104
tgba_explicit&
tgba_explicit::operator=(const
tgba_explicit& other);
00105 };
00106
00107
00109 class
state_explicit : public spot::state
00110 {
00111
public:
00112 state_explicit(
const tgba_explicit::state* s)
00113 : state_(s)
00114 {
00115 }
00116
00117
virtual int compare(
const spot::state* other)
const;
00118
virtual size_t hash() const;
00119 virtual
state_explicit* clone() const;
00120
00121 virtual ~
state_explicit()
00122 {
00123 }
00124
00125
const tgba_explicit::state* get_state() const;
00126 private:
00127 const
tgba_explicit::state* state_;
00128 };
00129
00130
00132 class
tgba_explicit_succ_iterator: public
tgba_succ_iterator
00133 {
00134
public:
00135
tgba_explicit_succ_iterator(
const tgba_explicit::state* s, bdd all_acc);
00136
00137
virtual
00138 ~
tgba_explicit_succ_iterator()
00139 {
00140 }
00141
00142
virtual void first();
00143
virtual void next();
00144
virtual bool done() const;
00145
00146 virtual
state_explicit* current_state() const;
00147 virtual bdd current_condition() const;
00148 virtual bdd current_acceptance_conditions() const;
00149
00150 private:
00151 const
tgba_explicit::state* s_;
00152 tgba_explicit::state::const_iterator i_;
00153 bdd all_acceptance_conditions_;
00154 };
00155
00156 }
00157
00158 #endif