spot 2.16
taatgba.hh
1// -*- coding: utf-8 -*-
2// Copyright (C) by the Spot authors, see the AUTHORS file for details.
3//
4// This file is part of Spot, a model checking library.
5//
6// Spot is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by
8// the Free Software Foundation; either version 3 of the License, or
9// (at your option) any later version.
10//
11// Spot is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14// License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19#pragma once
20
21#include <set>
22#include <iosfwd>
23#include <vector>
24#include <string>
25#include <spot/misc/hash.hh>
26#include <spot/tl/formula.hh>
27#include <spot/twa/bdddict.hh>
28#include <spot/twa/twa.hh>
29
30namespace spot
31{
35 class SPOT_API taa_tgba: public twa
36 {
37 public:
39 taa_tgba(const bdd_dict_ptr& dict);
40
41 struct transition;
43 typedef std::list<transition*> state;
45 typedef std::set<state*> state_set;
46
49 {
52 const state_set* dst;
53 };
54
57
59 virtual ~taa_tgba();
60 virtual spot::state* get_init_state() const override final;
61 virtual twa_succ_iterator* succ_iter(const spot::state* state)
62 const override final;
63
64 protected:
66 typedef std::vector<taa_tgba::state_set*> ss_vec;
67
69 ss_vec state_set_vec_;
70
72 std::map<formula, acc_cond::mark_t> acc_map_;
73
74 private:
75 // Disallow copy.
76 taa_tgba(const taa_tgba& other) = delete;
77 taa_tgba& operator=(const taa_tgba& other) = delete;
78 };
79
82 class SPOT_API set_state final: public spot::state
83 {
84 public:
89 set_state(const taa_tgba::state_set* s, bool delete_me = false)
90 : s_(s), delete_me_(delete_me)
91 {
92 }
93
94 virtual int compare(const spot::state*) const override;
95 virtual size_t hash() const override;
96 virtual set_state* clone() const override;
97
98 virtual ~set_state()
99 {
100 if (delete_me_)
101 delete s_;
102 }
103
106 private:
107 const taa_tgba::state_set* s_;
108 bool delete_me_;
109 };
110
114 class SPOT_API taa_succ_iterator final: public twa_succ_iterator
115 {
116 public:
119 virtual ~taa_succ_iterator();
120
121 virtual bool first() override;
122 virtual bool next() override;
123 virtual bool done() const override;
124
125 virtual set_state* dst() const override;
126 virtual bdd cond() const override;
127 virtual acc_cond::mark_t acc() const override;
128
129 private:
132 typedef taa_tgba::state::const_iterator iterator;
133 typedef std::pair<iterator, iterator> iterator_pair;
134 typedef std::vector<iterator_pair> bounds_t;
135 typedef std::unordered_map<const spot::set_state*,
136 std::vector<taa_tgba::transition*>,
138
139 struct distance_sort
140 {
141 bool
142 operator()(const iterator_pair& lhs, const iterator_pair& rhs) const
143 {
144 return std::distance(lhs.first, lhs.second) <
145 std::distance(rhs.first, rhs.second);
146 }
147 };
148
149 std::vector<taa_tgba::transition*>::const_iterator i_;
150 std::vector<taa_tgba::transition*> succ_;
151 seen_map seen_;
152 const acc_cond& acc_;
153 };
154
157 template<typename label>
158 class SPOT_API taa_tgba_labelled: public taa_tgba
159 {
160 public:
162 taa_tgba_labelled(const bdd_dict_ptr& dict) : taa_tgba(dict) {};
163
165 {
166 for (auto i: name_state_map_)
167 {
168 for (auto i2: *i.second)
169 delete i2;
170 delete i.second;
171 }
172 }
173
175 void set_init_state(const label& s)
176 {
177 std::vector<label> v(1);
178 v[0] = s;
179 set_init_state(v);
180 }
182 void set_init_state(const std::vector<label>& s)
183 {
184 init_ = add_state_set(s);
185 }
186
189 create_transition(const label& s,
190 const std::vector<label>& d)
191 {
192 state* src = add_state(s);
193 state_set* dst = add_state_set(d);
194 transition* t = new transition;
195 t->dst = dst;
196 t->condition = bddtrue;
197 t->acceptance_conditions = {};
198 src->emplace_back(t);
199 return t;
200 }
201
204 create_transition(const label& s, const label& d)
205 {
206 std::vector<std::string> vec;
207 vec.emplace_back(d);
208 return create_transition(s, vec);
209 }
210
213 {
214 auto p = acc_map_.emplace(f, acc_cond::mark_t({}));
215 if (p.second)
216 p.first->second = acc_cond::mark_t({acc().add_set()});
217 t->acceptance_conditions |= p.first->second;
218 }
219
228 virtual std::string format_state(const spot::state* s) const override
229 {
230 const spot::set_state* se = down_cast<const spot::set_state*>(s);
231 const state_set* ss = se->get_state();
232 return format_state_set(ss);
233 }
234
236 void output(std::ostream& os) const
237 {
238 typename ns_map::const_iterator i;
239 for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
240 {
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)
244 {
245 os << ' ' << format_state_set((*i2)->dst)
246 << ", C:" << (*i2)->condition
247 << ", A:" << (*i2)->acceptance_conditions << std::endl;
248 }
249 }
250 }
251
252 protected:
254 typedef label label_t;
255
257 typedef std::unordered_map<label, taa_tgba::state*> ns_map;
259 typedef std::unordered_map<const taa_tgba::state*, label,
261
264
266 virtual std::string label_to_string(const label_t& lbl) const = 0;
267
268 private:
271 taa_tgba::state* add_state(const label& name)
272 {
273 typename ns_map::iterator i = name_state_map_.find(name);
274 if (i == name_state_map_.end())
275 {
277 name_state_map_[name] = s;
278 state_name_map_[s] = name;
279 return s;
280 }
281 return i->second;
282 }
283
285 taa_tgba::state_set* add_state_set(const std::vector<label>& names)
286 {
287 state_set* ss = new state_set;
288 for (unsigned i = 0; i < names.size(); ++i)
289 ss->insert(add_state(names[i]));
290 state_set_vec_.emplace_back(ss);
291 return ss;
292 }
293
294 std::string format_state_set(const taa_tgba::state_set* ss) const
295 {
296 state_set::const_iterator i1 = ss->begin();
297 typename sn_map::const_iterator i2;
298 if (ss->empty())
299 return std::string("{}");
300 if (ss->size() == 1)
301 {
302 i2 = state_name_map_.find(*i1);
303 SPOT_ASSERT(i2 != state_name_map_.end());
304 return "{" + label_to_string(i2->second) + "}";
305 }
306 else
307 {
308 std::string res("{");
309 while (i1 != ss->end())
310 {
311 i2 = state_name_map_.find(*i1++);
312 SPOT_ASSERT(i2 != state_name_map_.end());
313 res += label_to_string(i2->second);
314 res += ",";
315 }
316 res[res.size() - 1] = '}';
317 return res;
318 }
319 }
320 };
321
324 class SPOT_API taa_tgba_string final:
325#ifndef SWIG
326 public taa_tgba_labelled<std::string>
327#else
328 public taa_tgba
329#endif
330 {
331 public:
334 taa_tgba_labelled<std::string>(dict) {}
336 {}
337 protected:
338 virtual std::string label_to_string(const std::string& label)
339 const override;
340 };
341
344 typedef std::shared_ptr<taa_tgba_string> taa_tgba_string_ptr;
347 typedef std::shared_ptr<const taa_tgba_string> const_taa_tgba_string_ptr;
348
352 {
353 return SPOT_make_shared_enabled__(taa_tgba_string, dict);
354 }
355
358 class SPOT_API taa_tgba_formula final:
359#ifndef SWIG
360 public taa_tgba_labelled<formula>
361#else
362 public taa_tgba
363#endif
364 {
365 public:
368 taa_tgba_labelled<formula>(dict) {}
370 {}
371 protected:
372 virtual std::string label_to_string(const label_t& label)
373 const override;
374 };
375
378 typedef std::shared_ptr<taa_tgba_formula> taa_tgba_formula_ptr;
381 typedef std::shared_ptr<const taa_tgba_formula> const_taa_tgba_formula_ptr;
382
386 {
387 return SPOT_make_shared_enabled__(taa_tgba_formula, dict);
388 }
389}
An acceptance condition.
Definition: acc.hh:54
Main class for temporal logic formula.
Definition: formula.hh:847
Definition: taatgba.hh:83
set_state(const taa_tgba::state_set *s, bool delete_me=false)
Construct a set_state wrapping state set s.
Definition: taatgba.hh:89
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).
const taa_tgba::state_set * get_state() const
Return the underlying TAA state set.
Abstract class for states.
Definition: twa.hh:49
Successor iterator for alternating automata with tree-and-automata (TAA) transitions.
Definition: taatgba.hh:115
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.
taa_succ_iterator(const taa_tgba::state_set *s, const acc_cond &acc)
Construct an iterator over the successors of state s.
virtual bool done() const override
Check whether the iteration is finished.
virtual bool first() override
Position the iterator on the first successor (if any).
A TAA-TGBA automaton where states are labelled with formulas.
Definition: taatgba.hh:364
taa_tgba_formula(const bdd_dict_ptr &dict)
Construct a formula-labelled TAA automaton.
Definition: taatgba.hh:367
virtual std::string label_to_string(const label_t &label) const override
Return a label as a string.
Definition: taatgba.hh:159
virtual std::string format_state(const spot::state *s) const override
Format the state as a string for printing.
Definition: taatgba.hh:228
void set_init_state(const label &s)
Set the initial state to the singleton s.
Definition: taatgba.hh:175
transition * create_transition(const label &s, const std::vector< label > &d)
Create a transition from s to the conjunction of d.
Definition: taatgba.hh:189
std::unordered_map< label, taa_tgba::state * > ns_map
Map from label to taa_tgba::state*.
Definition: taatgba.hh:257
sn_map state_name_map_
Map from state pointer to label.
Definition: taatgba.hh:263
label label_t
The label type for this automaton.
Definition: taatgba.hh:254
transition * create_transition(const label &s, const label &d)
Create a transition from s to singleton destination d.
Definition: taatgba.hh:204
void set_init_state(const std::vector< label > &s)
Set the initial state to the conjunction of states in s.
Definition: taatgba.hh:182
ns_map name_state_map_
Map from label to state pointer.
Definition: taatgba.hh:262
taa_tgba_labelled(const bdd_dict_ptr &dict)
Construct a labelled TAA using the given dictionary.
Definition: taatgba.hh:162
std::unordered_map< const taa_tgba::state *, label, ptr_hash< taa_tgba::state > > sn_map
Map from taa_tgba::state* to label.
Definition: taatgba.hh:260
void add_acceptance_condition(transition *t, formula f)
Add acceptance condition f to transition t.
Definition: taatgba.hh:212
void output(std::ostream &os) const
Output a TAA in a stream.
Definition: taatgba.hh:236
virtual std::string label_to_string(const label_t &lbl) const =0
Return a label as a string.
A TAA-TGBA automaton where states are labelled with strings.
Definition: taatgba.hh:330
taa_tgba_string(const bdd_dict_ptr &dict)
Construct a string-labelled TAA automaton.
Definition: taatgba.hh:333
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:36
void add_condition(transition *t, formula f)
Add a Boolean condition f to transition t.
virtual spot::state * get_init_state() const override final
Get the initial state of the automaton.
std::set< state * > state_set
Type of a set of TAA states.
Definition: taatgba.hh:45
taa_tgba(const bdd_dict_ptr &dict)
Construct a TAA automaton using the given dictionary.
std::vector< taa_tgba::state_set * > ss_vec
Type of a vector of state sets (used internally).
Definition: taatgba.hh:66
virtual ~taa_tgba()
TGBA interface.
std::list< transition * > state
Type of a TAA state: a list of outgoing transitions.
Definition: taatgba.hh:43
Class for representing a transition.
Definition: twacube.hh:53
Iterate over the successors of a state.
Definition: twa.hh:425
A Transition-based ω-Automaton.
Definition: twa.hh:648
LTL/PSL formula interface.
std::shared_ptr< bdd_dict > bdd_dict_ptr
Shared pointer to a bdd_dict.
Definition: bdddict.hh:304
std::shared_ptr< taa_tgba_string > taa_tgba_string_ptr
Shared pointer to a taa_tgba_string automaton.
Definition: taatgba.hh:344
std::shared_ptr< const taa_tgba_string > const_taa_tgba_string_ptr
Shared pointer to a const taa_tgba_string automaton.
Definition: taatgba.hh:347
std::shared_ptr< const taa_tgba_formula > const_taa_tgba_formula_ptr
Shared pointer to a const taa_tgba_formula automaton.
Definition: taatgba.hh:381
taa_tgba_formula_ptr make_taa_tgba_formula(const bdd_dict_ptr &dict)
Construct a taa_tgba_formula automaton.
Definition: taatgba.hh:385
std::shared_ptr< taa_tgba_formula > taa_tgba_formula_ptr
Shared pointer to a taa_tgba_formula automaton.
Definition: taatgba.hh:378
taa_tgba_string_ptr make_taa_tgba_string(const bdd_dict_ptr &dict)
Construct a taa_tgba_string automaton.
Definition: taatgba.hh:351
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:197
An acceptance mark.
Definition: acc.hh:76
A hash function for pointers.
Definition: hash.hh:36
An Equivalence Relation for state pointers.
Definition: twa.hh:154
Hash Function for state pointers.
Definition: twa.hh:181
An explicit TAA transition.
Definition: taatgba.hh:49
bdd condition
Boolean label of the edge.
Definition: taatgba.hh:50
const state_set * dst
Destination state set.
Definition: taatgba.hh:52
acc_cond::mark_t acceptance_conditions
Acceptance marks.
Definition: taatgba.hh:51

Please direct any question, comment, or bug report to the Spot mailing list at spot@lrde.epita.fr.
Generated on Fri Feb 27 2015 10:00:07 for spot by doxygen 1.9.4