2
* To change this license header, choose License Headers in Project Properties.
3
* To change this template file, choose Tools | Templates
4
* and open the template in the editor.
11
* Created on January 2, 2018, 10:06 AM
24
#include "PetriEngine/PetriNet.h"
26
namespace PetriEngine {
27
namespace Reachability {
33
std::vector<size_t> to;
35
bool operator == (const AutomataEdge& other) const
37
return edge == other.edge;
40
bool operator != (const AutomataEdge& other) const
42
return !(*this == other);
46
bool operator < ( const AutomataEdge& other) const
48
return edge < other.edge;
51
AutomataEdge(size_t e)
54
AutomataEdge(const AutomataEdge& other) = default;
55
AutomataEdge(AutomataEdge&&) = default;
56
AutomataEdge& operator=(const AutomataEdge& other) = default;
57
AutomataEdge& operator=(AutomataEdge&& other) = default;
61
if(to.size() > 0 && to[0] == 0) return true;
62
auto lb = std::lower_bound(to.begin(), to.end(), i);
63
return lb != to.end() && *lb == i;
68
if(to.size() > 0 && to[0] == 0) return false;
69
if(i == 0) { to.clear(); to.push_back(0); return true; }
71
auto lb = std::lower_bound(to.begin(), to.end(), i);
72
if(lb != to.end() && *lb == i)
85
auto lb = std::lower_bound(to.begin(), to.end(), i);
86
if(lb == to.end() || *lb != i)
97
std::ostream& operator<<(std::ostream& os) const
99
os << edge << " ==> ";
100
for(size_t i : to) os << i << ", ";
108
std::vector<AutomataEdge> edges;
110
std::vector<size_t> simulates;
111
std::vector<size_t> simulators;
112
friend class TraceSet;
114
prvector_t interpolant;
115
AutomataState(prvector_t interpol) : interpolant(interpol) {};
116
inline bool is_accepting() const
121
inline void set_accepting(bool val = true)
126
inline bool has_edge(const size_t& e, size_t to)
128
AutomataEdge edge(e);
129
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
130
if(lb == edges.end() || *lb != edge)
134
return lb->has_to(to);
137
inline bool has_any_edge(size_t prod, const size_t& e)
139
AutomataEdge edge(e);
140
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
141
if(lb == edges.end() || *lb != edge)
145
return lb->to.size() > 0;
148
inline bool add_edge(const size_t& e, size_t to)
150
AutomataEdge edge(e);
151
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
155
if(lb == edges.end() || *lb != edge)
157
assert(lb == edges.end() || *lb != edge);
158
lb = edges.insert(lb, edge);
164
assert(is_sorted(edges.begin(), edges.end()));
165
bool res = lb->add(to);
166
assert(!isnew || res);
167
assert(lb->to.size() >= 0);
171
inline bool remove_edge(size_t e)
173
AutomataEdge edge(e);
174
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
175
if(lb == edges.end() || *lb != edge)
181
inline bool remove_edge(size_t e, size_t to)
183
AutomataEdge edge(e);
184
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
185
if(lb == edges.end() || *lb != edge)
187
assert(lb == edges.end() || *lb != edge);
188
assert(is_sorted(edges.begin(), edges.end()));
192
assert(is_sorted(edges.begin(), edges.end()));
193
bool removed = lb->remove(to);
194
if(removed && lb->to.size() == 0)
200
assert(lb->to.size() >= 0);
205
inline auto first_edge(size_t& e) const
207
AutomataEdge edge(e);
208
auto lb = std::lower_bound(edges.begin(), edges.end(), edge);
212
inline auto last_edge() const
217
inline auto& get_edges() const
222
std::ostream& print(std::ostream& os) const {
223
os << "\t PREDICATE\n";
224
interpolant.print(os);
227
for(auto s : simulates)
229
os << "]\n\tSIMED [";
230
for(auto s : simulators)
236
os << "\t\t<" << (e.edge ? std::to_string(e.edge-1) : "Q") << "> --> [";
251
size_t size = std::numeric_limits<size_t>::max();
253
std::set<size_t> interpolant;
255
bool operator == (const state_t& other)
257
// if((get_edge_cnt() == 0) != (other.get_edge_cnt() == 0)) return false;
258
if( interpolant.size() == other.interpolant.size() &&
259
std::equal( interpolant.begin(), interpolant.end(),
260
other.interpolant.begin(), other.interpolant.end()))
267
bool operator != (const state_t& other)
269
return !(*this == other);
272
bool operator <= (const state_t& other)
274
// if((get_edge_cnt() == 0) != (other.get_edge_cnt() == 0)) return false;
275
if( interpolant.size() <= other.interpolant.size() &&
276
std::includes(other.interpolant.begin(), other.interpolant.end(),
277
interpolant.begin(), interpolant.end()))
284
size_t get_edge_cnt()
289
return 1 + (((edgecnt-1) + offset) % size);
292
void set_edge(size_t edge)
298
bool next_edge(const PetriNet& net)
304
bool done(const PetriNet& net) const {
305
return edgecnt > net.numberOfTransitions();
308
bool reset_edges(const PetriNet& net)
310
size = net.numberOfTransitions();
312
offset = std::rand();// % (net.numberOfTransitions());
313
return edgecnt > net.numberOfTransitions();
316
inline void add_interpolant(size_t ninter)
318
interpolant.insert(ninter);
321
inline std::set<size_t>& get_interpolants()
326
inline void set_interpolants(const std::set<size_t>& interpolants)
328
interpolant = interpolants;
332
typedef std::vector<state_t> trace_t;
337
#endif /* TARAUTOMATA_H */