6
#include "CTL/DependencyGraph/BasicDependencyGraph.h"
7
#include "CTL/DependencyGraph/Configuration.h"
8
#include "CTL/DependencyGraph/Edge.h"
9
#include "PetriConfig.h"
10
#include "PetriParse/PNMLParser.h"
11
#include "PetriEngine/PQL/PQL.h"
12
#include "PetriEngine/Structures/ptrie_map.h"
13
#include "PetriEngine/Structures/AlignedEncoder.h"
14
#include "PetriEngine/Structures/linked_bucket.h"
15
#include "PetriEngine/ReducingSuccessorGenerator.h"
18
class OnTheFlyDG : public DependencyGraph::BasicDependencyGraph
21
using Condition = PetriEngine::PQL::Condition;
22
using Condition_ptr = PetriEngine::PQL::Condition_ptr;
23
using Marking = PetriEngine::Structures::State;
24
OnTheFlyDG(PetriEngine::PetriNet *t_net, bool partial_order);
26
virtual ~OnTheFlyDG();
28
//Dependency graph interface
29
virtual std::vector<DependencyGraph::Edge*> successors(DependencyGraph::Configuration *c) override;
30
virtual DependencyGraph::Configuration *initialConfiguration() override;
31
virtual void cleanUp() override;
32
void setQuery(const Condition_ptr& query);
34
virtual void release(DependencyGraph::Edge* e) override;
36
size_t owner(Marking& marking, Condition* cond);
37
size_t owner(Marking& marking, const Condition_ptr& cond)
39
return owner(marking, cond.get());
44
size_t configurationCount() const;
45
size_t markingCount() const;
47
Condition::Result initialEval();
51
//initialized from constructor
52
AlignedEncoder encoder;
53
PetriEngine::PetriNet *net = nullptr;
54
PetriConfig* initial_config;
55
Marking working_marking;
56
Marking query_marking;
57
uint32_t n_transitions = 0;
58
uint32_t n_places = 0;
59
size_t _markingCount = 0;
60
size_t _configurationCount = 0;
61
//used after query is set
62
Condition_ptr query = nullptr;
64
Condition::Result fastEval(Condition* query, Marking* unfolded);
65
Condition::Result fastEval(const Condition_ptr& query, Marking* unfolded)
67
return fastEval(query.get(), unfolded);
69
void nextStates(Marking& t_marking, Condition*,
70
std::function<void ()> pre,
71
std::function<bool (Marking&)> foreach,
72
std::function<void ()> post);
74
void dowork(T& gen, bool& first,
75
std::function<void ()>& pre,
76
std::function<bool (Marking&)>& foreach)
78
gen.prepare(&query_marking);
80
while(gen.next(working_marking)){
83
if(!foreach(working_marking))
90
PetriConfig *createConfiguration(size_t marking, size_t own, Condition* query);
91
PetriConfig *createConfiguration(size_t marking, size_t own, const Condition_ptr& query)
93
return createConfiguration(marking, own, query.get());
95
size_t createMarking(Marking &marking);
96
void markingStats(const uint32_t* marking, size_t& sum, bool& allsame, uint32_t& val, uint32_t& active, uint32_t& last);
98
DependencyGraph::Edge* newEdge(DependencyGraph::Configuration &t_source, uint32_t weight);
100
std::stack<DependencyGraph::Edge*> recycle;
101
ptrie::map<std::vector<PetriConfig*> > trie;
102
linked_bucket_t<DependencyGraph::Edge,1024*10>* edge_alloc = nullptr;
104
// Problem with linked bucket and complex constructor
105
linked_bucket_t<char[sizeof(PetriConfig)], 1024*1024>* conf_alloc = nullptr;
107
PetriEngine::ReducingSuccessorGenerator _redgen;
108
bool _partial_order = false;
114
#endif // ONTHEFLYDG_H