1
1
#include "ColoredNetStructures.h"
2
#include "EquivalenceClass.h"
2
#include "EquivalenceVec.h"
3
3
#include "IntervalGenerator.h"
5
5
namespace PetriEngine {
7
7
class PartitionBuilder {
9
PartitionBuilder(std::vector<Transition> *transitions,
10
std::vector<Place> *places,
11
std::unordered_map<uint32_t,std::vector<uint32_t>> *placePostTransitionMap,
12
std::unordered_map<uint32_t,std::vector<uint32_t>> *placePreTransitionMap);
11
PartitionBuilder(const std::vector<Transition> &transitions,
12
const std::vector<Place> &places,
13
const std::unordered_map<uint32_t,std::vector<uint32_t>> &placePostTransitionMap,
14
const std::unordered_map<uint32_t,std::vector<uint32_t>> &placePreTransitionMap);
14
PartitionBuilder(std::vector<Transition> *transitions,
15
std::vector<Place> *places,
16
std::unordered_map<uint32_t,std::vector<uint32_t>> *placePostTransitionMap,
17
std::unordered_map<uint32_t,std::vector<uint32_t>> *placePreTransitionMap,
18
std::vector<Colored::ColorFixpoint> *placeColorFixpoints);
16
PartitionBuilder(const std::vector<Transition> &transitions,
17
const std::vector<Place> &places,
18
const std::unordered_map<uint32_t,std::vector<uint32_t>> &placePostTransitionMap,
19
const std::unordered_map<uint32_t,std::vector<uint32_t>> &placePreTransitionMap,
20
const std::vector<Colored::ColorFixpoint> *placeColorFixpoints);
20
22
~PartitionBuilder() {}
22
24
//void initPartition();
24
void refinePartition();
26
void assignColorMap(std::unordered_map<uint32_t, EquivalenceVec> &partition);
25
bool partitionNet(int32_t timeout);
26
void printPartion() const;
27
void assignColorMap(std::unordered_map<uint32_t, EquivalenceVec> &partition) const;
28
std::unordered_map<uint32_t, EquivalenceVec> getPartition(){
29
std::unordered_map<uint32_t, EquivalenceVec> getPartition() const{
32
std::vector<Transition> *_transitions;
33
std::unordered_map<uint32_t,std::vector<uint32_t>> *_placePostTransitionMap;
34
std::unordered_map<uint32_t,std::vector<uint32_t>> *_placePreTransitionMap;
34
const std::vector<Transition> &_transitions;
35
const std::vector<Place> &_places;
36
const std::unordered_map<uint32_t,std::vector<uint32_t>> &_placePostTransitionMap;
37
const std::unordered_map<uint32_t,std::vector<uint32_t>> &_placePreTransitionMap;
35
38
std::unordered_map<uint32_t,bool> _inQueue;
36
std::vector<Place> *_places;
37
39
std::unordered_map<uint32_t, EquivalenceVec> _partition;
38
PetriEngine::IntervalGenerator intervalGenerator;
40
const PetriEngine::Colored::IntervalGenerator _interval_generator = IntervalGenerator();
39
41
std::vector<uint32_t> _placeQueue;
41
43
bool splitPartition(EquivalenceVec equivalenceVec, uint32_t placeId);
43
45
void handleTransition(uint32_t transitionId, uint32_t postPlaceId);
44
void handleTransition(Transition *transitionId, uint32_t postPlaceId, Arc *postArc);
46
void handleTransition(const Transition &transitionId, const uint32_t postPlaceId, const Arc *postArc);
46
48
void handleLeafTransitions();
48
50
void addToQueue(uint32_t placeId);
50
std::vector<std::unordered_map<const Variable *, intervalTuple_t>> prepareVariables(
51
std::unordered_map<const Variable *, std::vector<std::unordered_map<uint32_t, int32_t>>> varModifierMap,
52
EquivalenceClass *eqClass , Arc *postArc, uint32_t placeId);
54
bool findOverlap(EquivalenceVec equivalenceVec1, EquivalenceVec equivalenceVec2, uint32_t &overlap1, uint32_t &overlap2, EquivalenceClass &intersection);
56
uint32_t eqClassIdCounter = 0;
52
bool checkTupleDiagonal(uint32_t placeId);
53
bool checkDiagonal(uint32_t placeId);
55
void handleInArcs(const Transition &transition, std::set<const Colored::Variable*> &diagonalVars, const PositionVariableMap &varPositionMap, const std::vector<PetriEngine::Colored::VariableIntervalMap> &varMaps, uint32_t postPlaceId);
57
void applyNewIntervals(const Arc &inArc, const std::vector<PetriEngine::Colored::VariableIntervalMap> &varMaps);
59
void checkVarOnArc(const VariableModifierMap &varModifierMap, std::set<const Colored::Variable*> &diagonalVars, uint32_t placeId, bool inputArc);
61
void checkVarOnInputArcs(const std::unordered_map<uint32_t,PositionVariableMap> &placeVariableMap, const PositionVariableMap &preVarPositionMap, std::set<const Colored::Variable*> &diagonalVars, uint32_t placeId);
63
void markSharedVars(const PositionVariableMap &preVarPositionMap, const PositionVariableMap &varPositionMap, uint32_t postPlaceId, uint32_t prePlaceId);
64
void checkVarInGuard(const PositionVariableMap &preVarPositionMap, const std::set<const Colored::Variable*> &diagonalVars, uint32_t placeId);
66
std::vector<VariableIntervalMap> prepareVariables(
67
const VariableModifierMap &varModifierMap,
68
const EquivalenceClass& eqClass , const Arc *postArc, uint32_t placeId);
70
bool findOverlap(const EquivalenceVec &equivalenceVec1,const EquivalenceVec &equivalenceVec2, uint32_t &overlap1, uint32_t &overlap2, EquivalenceClass &intersection);
72
uint32_t _eq_id_counter = 0;
b'\\ No newline at end of file'