20 #ifndef SPOT_TGBA_TAATGBA_HH
21 # define SPOT_TGBA_TAATGBA_HH
26 #include "misc/hash.hh"
41 typedef std::list<transition*> state;
42 typedef std::set<state*> state_set;
48 bdd acceptance_conditions;
60 const tgba* global_automaton = 0)
const;
62 virtual std::string format_state(
const spot::state* state)
const = 0;
63 virtual bdd all_acceptance_conditions()
const;
64 virtual bdd neg_acceptance_conditions()
const;
67 virtual bdd compute_support_conditions(
const spot::state* state)
const;
68 virtual bdd compute_support_variables(
const spot::state* state)
const;
70 typedef std::vector<taa_tgba::state_set*> ss_vec;
73 mutable bdd all_acceptance_conditions_;
74 mutable bool all_acceptance_conditions_computed_;
75 bdd neg_acceptance_conditions_;
76 taa_tgba::state_set* init_;
77 ss_vec state_set_vec_;
89 set_state(
const taa_tgba::state_set* s,
bool delete_me =
false)
90 : s_(s), delete_me_(delete_me)
95 virtual size_t hash()
const;
104 const taa_tgba::state_set* get_state()
const;
106 const taa_tgba::state_set* s_;
116 virtual void first();
118 virtual bool done()
const;
120 virtual set_state* current_state()
const;
121 virtual bdd current_condition()
const;
122 virtual bdd current_acceptance_conditions()
const;
127 typedef taa_tgba::state::const_iterator iterator;
128 typedef std::pair<iterator, iterator> iterator_pair;
129 typedef std::vector<iterator_pair> bounds_t;
130 typedef Sgi::hash_map<
134 struct distance_sort :
135 public std::binary_function<const iterator_pair&,
136 const iterator_pair&, bool>
139 operator()(
const iterator_pair& lhs,
const iterator_pair& rhs)
const
141 return std::distance(lhs.first, lhs.second) <
142 std::distance(rhs.first, rhs.second);
146 std::vector<taa_tgba::transition*>::const_iterator i_;
147 std::vector<taa_tgba::transition*> succ_;
148 bdd all_acceptance_conditions_;
154 template<
typename label,
typename label_hash>
160 void set_init_state(
const label& s)
162 std::vector<label> v(1);
166 void set_init_state(
const std::vector<label>& s)
168 init_ = add_state_set(s);
172 create_transition(
const label& s,
173 const std::vector<label>& d)
175 state* src = add_state(s);
176 state_set* dst = add_state_set(d);
179 t->condition = bddtrue;
180 t->acceptance_conditions = bddfalse;
185 create_transition(
const label& s,
const label& d)
187 std::vector<std::string> vec;
189 return create_transition(s, vec);
194 if (dict_->acc_map.find(f) == dict_->acc_map.end())
196 int v = dict_->register_acceptance_variable(f,
this);
197 bdd neg = bdd_nithvar(v);
198 neg_acceptance_conditions_ &= neg;
201 typename ns_map::iterator i;
202 for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
204 taa_tgba::state::iterator i2;
205 for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
206 (*i2)->acceptance_conditions &= neg;
209 all_acceptance_conditions_computed_ =
false;
212 bdd_dict::fv_map::iterator i = dict_->acc_map.find(f);
213 assert(i != dict_->acc_map.end());
215 bdd v = bdd_ithvar(i->second);
216 t->acceptance_conditions |= v & bdd_exist(neg_acceptance_conditions_, v);
231 const state_set* ss = se->get_state();
232 return format_state_set(ss);
238 typename ns_map::const_iterator i;
239 for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
241 taa_tgba::state::const_iterator i2;
242 os <<
"State: " << label_to_string(i->first) << std::endl;
243 for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
245 os <<
" " << format_state_set((*i2)->dst)
246 <<
", C:" << (*i2)->condition
247 <<
", A:" << (*i2)->acceptance_conditions << std::endl;
253 typedef label label_t;
255 typedef Sgi::hash_map<
256 const label, taa_tgba::state*, label_hash
258 typedef Sgi::hash_map<
262 ns_map name_state_map_;
263 sn_map state_name_map_;
266 virtual std::string label_to_string(
const label_t& lbl)
const = 0;
270 virtual label_t clone_if(
const label_t& lbl)
const = 0;
275 taa_tgba::state* add_state(
const label& name)
277 typename ns_map::iterator i = name_state_map_.find(name);
278 if (i == name_state_map_.end())
280 const label& name_ = clone_if(name);
281 taa_tgba::state* s =
new taa_tgba::state;
282 name_state_map_[name_] = s;
283 state_name_map_[s] = name_;
290 taa_tgba::state_set* add_state_set(
const std::vector<label>& names)
292 state_set* ss =
new state_set;
293 for (
unsigned i = 0; i < names.size(); ++i)
294 ss->insert(add_state(names[i]));
295 state_set_vec_.push_back(ss);
299 std::string format_state_set(
const taa_tgba::state_set* ss)
const
301 state_set::const_iterator i1 = ss->begin();
302 typename sn_map::const_iterator i2;
304 return std::string(
"{}");
307 i2 = state_name_map_.find(*i1);
308 assert(i2 != state_name_map_.end());
309 return "{" + label_to_string(i2->second) +
"}";
313 std::string res(
"{");
314 while (i1 != ss->end())
316 i2 = state_name_map_.find(*i1++);
317 assert(i2 != state_name_map_.end());
318 res += label_to_string(i2->second);
321 res[res.size() - 1] =
'}';
335 virtual std::string label_to_string(
const std::string& label)
const;
336 virtual std::string clone_if(
const std::string& label)
const;
347 virtual std::string label_to_string(
const label_t& label)
const;
352 #endif // SPOT_TGBA_TAATGBA_HH