6
#include <ptrie/ptrie_map.h>
8
#include "CTL/DependencyGraph/BasicDependencyGraph.h"
9
#include "CTL/DependencyGraph/Configuration.h"
10
#include "CTL/DependencyGraph/Edge.h"
11
#include "PetriConfig.h"
12
#include "PetriParse/PNMLParser.h"
13
#include "PetriEngine/PQL/PQL.h"
14
#include "PetriEngine/Structures/AlignedEncoder.h"
15
#include "PetriEngine/Structures/linked_bucket.h"
16
#include "PetriEngine/ReducingSuccessorGenerator.h"
19
class OnTheFlyDG : public DependencyGraph::BasicDependencyGraph
22
using Condition = PetriEngine::PQL::Condition;
23
using Condition_ptr = PetriEngine::PQL::Condition_ptr;
24
using Marking = PetriEngine::Structures::State;
25
OnTheFlyDG(PetriEngine::PetriNet *t_net, bool partial_order);
27
virtual ~OnTheFlyDG();
29
//Dependency graph interface
30
virtual std::vector<DependencyGraph::Edge*> successors(DependencyGraph::Configuration *c) override;
31
virtual DependencyGraph::Configuration *initialConfiguration() override;
32
virtual void cleanUp() override;
33
void setQuery(const Condition_ptr& query);
35
virtual void release(DependencyGraph::Edge* e) override;
37
size_t owner(Marking& marking, Condition* cond);
38
size_t owner(Marking& marking, const Condition_ptr& cond)
40
return owner(marking, cond.get());
45
size_t configurationCount() const;
46
size_t markingCount() const;
48
Condition::Result initialEval();
52
//initialized from constructor
53
AlignedEncoder encoder;
54
PetriEngine::PetriNet *net = nullptr;
55
PetriConfig* initial_config;
56
Marking working_marking;
57
Marking query_marking;
58
uint32_t n_transitions = 0;
59
uint32_t n_places = 0;
60
size_t _markingCount = 0;
61
size_t _configurationCount = 0;
62
//used after query is set
63
Condition_ptr query = nullptr;
65
Condition::Result fastEval(Condition* query, Marking* unfolded);
66
Condition::Result fastEval(const Condition_ptr& query, Marking* unfolded)
68
return fastEval(query.get(), unfolded);
70
void nextStates(Marking& t_marking, Condition*,
71
std::function<void ()> pre,
72
std::function<bool (Marking&)> foreach,
73
std::function<void ()> post);
75
void dowork(T& gen, bool& first,
76
std::function<void ()>& pre,
77
std::function<bool (Marking&)>& foreach)
79
gen.prepare(&query_marking);
81
while(gen.next(working_marking)){
84
if(!foreach(working_marking))
91
PetriConfig *createConfiguration(size_t marking, size_t own, Condition* query);
92
PetriConfig *createConfiguration(size_t marking, size_t own, const Condition_ptr& query)
94
return createConfiguration(marking, own, query.get());
96
size_t createMarking(Marking &marking);
97
void markingStats(const uint32_t* marking, size_t& sum, bool& allsame, uint32_t& val, uint32_t& active, uint32_t& last);
99
DependencyGraph::Edge* newEdge(DependencyGraph::Configuration &t_source, uint32_t weight);
101
std::stack<DependencyGraph::Edge*> recycle;
102
ptrie::map<ptrie::uchar, std::vector<PetriConfig*> > trie;
103
linked_bucket_t<DependencyGraph::Edge,1024*10>* edge_alloc = nullptr;
105
// Problem with linked bucket and complex constructor
106
linked_bucket_t<char[sizeof(PetriConfig)], 1024*1024>* conf_alloc = nullptr;
108
PetriEngine::ReducingSuccessorGenerator _redgen;
109
bool _partial_order = false;
115
#endif // ONTHEFLYDG_H