25#include <spot/misc/hash.hh>
27#include <spot/twa/bdddict.hh>
28#include <spot/twa/twa.hh>
34 class SPOT_API taa_tgba:
public twa
37 taa_tgba(
const bdd_dict_ptr& dict);
40 typedef std::list<transition*> state;
41 typedef std::set<state*> state_set;
61 typedef std::vector<taa_tgba::state_set*> ss_vec;
63 taa_tgba::state_set* init_;
64 ss_vec state_set_vec_;
70 taa_tgba(const taa_tgba& other) = delete;
71 taa_tgba& operator=(const taa_tgba& other) = delete;
78 set_state(
const taa_tgba::state_set* s,
bool delete_me =
false)
79 : s_(s), delete_me_(delete_me)
84 virtual size_t hash()
const override;
85 virtual set_state*
clone()
const override;
93 const taa_tgba::state_set* get_state()
const;
95 const taa_tgba::state_set* s_;
102 taa_succ_iterator(
const taa_tgba::state_set* s,
const acc_cond&
acc);
103 virtual ~taa_succ_iterator();
107 virtual bool done()
const override;
110 virtual bdd
cond()
const override;
116 typedef taa_tgba::state::const_iterator iterator;
117 typedef std::pair<iterator, iterator> iterator_pair;
118 typedef std::vector<iterator_pair> bounds_t;
120 std::vector<taa_tgba::transition*>,
126 operator()(
const iterator_pair& lhs,
const iterator_pair& rhs)
const
128 return std::distance(lhs.first, lhs.second) <
129 std::distance(rhs.first, rhs.second);
133 std::vector<taa_tgba::transition*>::const_iterator i_;
134 std::vector<taa_tgba::transition*> succ_;
136 const acc_cond& acc_;
141 template<
typename label>
142 class SPOT_API taa_tgba_labelled:
public taa_tgba
145 taa_tgba_labelled(
const bdd_dict_ptr& dict) : taa_tgba(dict) {};
149 for (
auto i: name_state_map_)
151 for (
auto i2: *i.second)
157 void set_init_state(
const label& s)
159 std::vector<label> v(1);
163 void set_init_state(
const std::vector<label>& s)
165 init_ = add_state_set(s);
169 create_transition(
const label& s,
170 const std::vector<label>& d)
172 state* src = add_state(s);
173 state_set* dst = add_state_set(d);
176 t->condition = bddtrue;
177 t->acceptance_conditions = {};
178 src->emplace_back(t);
183 create_transition(
const label& s,
const label& d)
185 std::vector<std::string> vec;
187 return create_transition(s, vec);
195 t->acceptance_conditions |= p.first->second;
209 const state_set* ss = se->get_state();
210 return format_state_set(ss);
216 typename ns_map::const_iterator i;
217 for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
219 taa_tgba::state::const_iterator i2;
221 for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
223 os <<
' ' << format_state_set((*i2)->dst)
224 <<
", C:" << (*i2)->condition
225 <<
", A:" << (*i2)->acceptance_conditions << std::endl;
231 typedef label label_t;
233 typedef std::unordered_map<label, taa_tgba::state*> ns_map;
234 typedef std::unordered_map<
const taa_tgba::state*, label,
237 ns_map name_state_map_;
238 sn_map state_name_map_;
246 taa_tgba::state* add_state(
const label& name)
248 typename ns_map::iterator i = name_state_map_.find(name);
249 if (i == name_state_map_.end())
251 taa_tgba::state* s =
new taa_tgba::state;
252 name_state_map_[name] = s;
253 state_name_map_[s] = name;
260 taa_tgba::state_set* add_state_set(
const std::vector<label>& names)
263 for (
unsigned i = 0; i < names.size(); ++i)
264 ss->insert(add_state(names[i]));
265 state_set_vec_.emplace_back(ss);
269 std::string format_state_set(
const taa_tgba::state_set* ss)
const
271 state_set::const_iterator i1 = ss->begin();
272 typename sn_map::const_iterator i2;
274 return std::string(
"{}");
277 i2 = state_name_map_.find(*i1);
278 SPOT_ASSERT(i2 != state_name_map_.end());
279 return "{" + label_to_string(i2->second) +
"}";
283 std::string res(
"{");
284 while (i1 != ss->end())
286 i2 = state_name_map_.find(*i1++);
287 SPOT_ASSERT(i2 != state_name_map_.end());
288 res += label_to_string(i2->second);
291 res[res.size() - 1] =
'}';
297 class SPOT_API taa_tgba_string final:
299 public taa_tgba_labelled<std::string>
305 taa_tgba_string(
const bdd_dict_ptr& dict) :
306 taa_tgba_labelled<std::string>(dict) {}
314 typedef std::shared_ptr<taa_tgba_string> taa_tgba_string_ptr;
315 typedef std::shared_ptr<const taa_tgba_string> const_taa_tgba_string_ptr;
317 inline taa_tgba_string_ptr make_taa_tgba_string(
const bdd_dict_ptr& dict)
322 class SPOT_API taa_tgba_formula final:
324 public taa_tgba_labelled<formula>
330 taa_tgba_formula(
const bdd_dict_ptr& dict) :
331 taa_tgba_labelled<formula>(dict) {}
339 typedef std::shared_ptr<taa_tgba_formula> taa_tgba_formula_ptr;
340 typedef std::shared_ptr<const taa_tgba_formula> const_taa_tgba_formula_ptr;
342 inline taa_tgba_formula_ptr make_taa_tgba_formula(
const bdd_dict_ptr& dict)
An acceptance condition.
Definition acc.hh:61
Set of states deriving from spot::state.
Definition taatgba.hh:76
virtual size_t hash() const override
Hash a state.
virtual set_state * clone() const override
Duplicate a state.
virtual int compare(const spot::state *) const override
Compares two states (that come from the same automaton).
Abstract class for states.
Definition twa.hh:47
virtual bool next() override
Jump to the next successor (if any).
virtual set_state * dst() const override
Get the destination state of the current edge.
virtual bdd cond() const override
Get the condition on the edge leading to this successor.
virtual acc_cond::mark_t acc() const override
Get the acceptance mark of the edge leading to this successor.
virtual bool done() const override
Check whether the iteration is finished.
virtual bool first() override
Position the iterator on the first successor (if any).
virtual std::string format_state(const spot::state *s) const override
Format the state as a string for printing.
Definition taatgba.hh:206
void output(std::ostream &os) const
Output a TAA in a stream.
Definition taatgba.hh:214
virtual std::string label_to_string(const label_t &lbl) const =0
Return a label as a string.
Definition taatgba.hh:303
virtual std::string label_to_string(const std::string &label) const override
Return a label as a string.
A self-loop Transition-based Alternating Automaton (TAA) which is seen as a TGBA (abstract class,...
Definition taatgba.hh:35
virtual spot::state * get_init_state() const override final
Get the initial state of the automaton.
virtual twa_succ_iterator * succ_iter(const spot::state *state) const override final
Get an iterator over the successors of local_state.
virtual ~taa_tgba()
TGBA interface.
Iterate over the successors of a state.
Definition twa.hh:394
const acc_cond & acc() const
The acceptance condition of the automaton.
Definition twa.hh:812
Definition automata.hh:26
std::unordered_set< const state *, state_ptr_hash, state_ptr_equal > state_set
Unordered set of abstract states.
Definition twa.hh:186
An acceptance mark.
Definition acc.hh:84
A hash function for pointers.
Definition hash.hh:36
An Equivalence Relation for state*.
Definition twa.hh:147
Hash Function for state*.
Definition twa.hh:171
Explicit transitions.
Definition taatgba.hh:45