Merge lp:~verifypn-cpn/verifypn/color-fixpoint into lp:~tapaal-ltl/verifypn/mcc2021

Proposed by Thomas Pedersen
Status: Merged
Merged at revision: 251
Proposed branch: lp:~verifypn-cpn/verifypn/color-fixpoint
Merge into: lp:~tapaal-ltl/verifypn/mcc2021
Diff against target: 166 lines (+34/-19)
5 files modified
include/PetriEngine/Colored/ColoredPetriNetBuilder.h (+1/-1)
include/PetriEngine/Colored/Intervals.h (+3/-4)
src/PetriEngine/Colored/BindingGenerator.cpp (+5/-6)
src/PetriEngine/Colored/ColoredPetriNetBuilder.cpp (+24/-7)
src/PetriEngine/Colored/GuardRestrictor.cpp (+1/-1)
To merge this branch: bzr merge lp:~verifypn-cpn/verifypn/color-fixpoint
Reviewer Review Type Date Requested Status
Jiri Srba Pending
Peter Gjøl Jensen Pending
Review via email: mp+400243@code.launchpad.net

This proposal supersedes a proposal from 2021-03-18.

Commit message

Merge color fixpoint into MCC2021

Description of the change

Colored net unfolding has been tested, but the LTL code still needs to be tested

We believe the previous errors have been corrected

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'include/PetriEngine/Colored/ColoredPetriNetBuilder.h'
2--- include/PetriEngine/Colored/ColoredPetriNetBuilder.h 2021-03-17 13:16:57 +0000
3+++ include/PetriEngine/Colored/ColoredPetriNetBuilder.h 2021-03-26 10:35:05 +0000
4@@ -182,7 +182,7 @@
5
6 void unfoldPlace(const Colored::Place* place, const PetriEngine::Colored::Color *color);
7 void unfoldTransition(Colored::Transition& transition);
8- void handleOrphanPlace(Colored::Place& place);
9+ void handleOrphanPlace(Colored::Place& place, std::unordered_map<std::string, uint32_t> unfoldedPlaceMap);
10
11 void unfoldArc(Colored::Arc& arc, Colored::ExpressionContext::BindingMap& binding, std::string& name, bool input);
12 };
13
14=== modified file 'include/PetriEngine/Colored/Intervals.h'
15--- include/PetriEngine/Colored/Intervals.h 2021-03-15 10:04:47 +0000
16+++ include/PetriEngine/Colored/Intervals.h 2021-03-26 10:35:05 +0000
17@@ -475,7 +475,6 @@
18
19 void applyModifier(int32_t modifier, std::vector<size_t> sizes){
20 std::vector<interval_t> collectedIntervals;
21-
22 for(auto& interval : _intervals){
23 std::vector<interval_t> newIntervals;
24 newIntervals.push_back(std::move(interval));
25@@ -494,15 +493,15 @@
26 newInterval[i]._upper = sizes[i]-1;
27 tempIntervals.push_back(std::move(newInterval));
28 }else {
29- interval[i]._lower = shiftedInterval.first;
30- interval[i]._upper = shiftedInterval.second;
31+ interval1[i]._lower = shiftedInterval.first;
32+ interval1[i]._upper = shiftedInterval.second;
33 }
34 }
35 newIntervals.insert(newIntervals.end(), tempIntervals.begin(), tempIntervals.end());
36 }
37 collectedIntervals.insert(collectedIntervals.end(), newIntervals.begin(), newIntervals.end());
38 }
39-
40+
41 _intervals = std::move(collectedIntervals);
42 }
43
44
45=== modified file 'src/PetriEngine/Colored/BindingGenerator.cpp'
46--- src/PetriEngine/Colored/BindingGenerator.cpp 2021-03-15 10:04:47 +0000
47+++ src/PetriEngine/Colored/BindingGenerator.cpp 2021-03-26 10:35:05 +0000
48@@ -105,18 +105,19 @@
49 while (!test) {
50 bool next = true;
51
52- for (auto& _binding : _bindings) {
53- auto varInterval = _transition.variableMaps[_nextIndex][_binding.first];
54+ for (auto& _binding : _bindings) {
55+ auto varInterval = _transition.variableMaps[_nextIndex][_binding.first];
56 std::vector<uint32_t> colorIds;
57 _binding.second->getTupleId(&colorIds);
58 auto nextIntervalBinding = varInterval.isRangeEnd(colorIds);
59
60- if (nextIntervalBinding.size() == 0){
61+ if (nextIntervalBinding.size() == 0){
62 _binding.second = &_binding.second->operator++();
63 next = false;
64 break;
65 } else {
66 _binding.second = _binding.second->getColorType()->getColor(nextIntervalBinding.getLowerIds());
67+
68 if(!nextIntervalBinding.equals(varInterval.getFirst())){
69 next = false;
70 break;
71@@ -132,10 +133,8 @@
72 for(auto& _binding : _bindings){
73 _binding.second = _binding.second->getColorType()->getColor(_transition.variableMaps[_nextIndex][_binding.first].getFirst().getLowerIds());
74 }
75- }
76-
77+ }
78 test = eval();
79-
80 }
81
82 return _bindings;
83
84=== modified file 'src/PetriEngine/Colored/ColoredPetriNetBuilder.cpp'
85--- src/PetriEngine/Colored/ColoredPetriNetBuilder.cpp 2021-03-17 13:16:57 +0000
86+++ src/PetriEngine/Colored/ColoredPetriNetBuilder.cpp 2021-03-26 10:35:05 +0000
87@@ -197,7 +197,7 @@
88
89 _fixPointCreationTime = (std::chrono::duration_cast<std::chrono::microseconds>(end - start).count())*0.000001;
90
91- // printPlaceTable();
92+ //printPlaceTable();
93 _placeColorFixpoints.clear();
94 }
95
96@@ -331,8 +331,9 @@
97 for (auto& transition : _transitions) {
98 unfoldTransition(transition);
99 }
100+ auto unfoldedPlaceMap = _ptBuilder.getPlaceNames();
101 for (auto& place : _places) {
102- handleOrphanPlace(place);
103+ handleOrphanPlace(place, unfoldedPlaceMap);
104 }
105 _unfolded = true;
106 auto end = std::chrono::high_resolution_clock::now();
107@@ -345,17 +346,33 @@
108 //However, in queries asking about orphan places it cannot find these, as they have not been unfolded
109 //so we make a placeholder place which just has tokens equal to the number of colored tokens
110 //Ideally, orphan places should just be translated to a constant in the query
111- void ColoredPetriNetBuilder::handleOrphanPlace(Colored::Place& place) {
112- if(_ptplacenames.count(place.name) <= 0){
113- std::string name = place.name + "_" + std::to_string(place.marking.size());
114+ void ColoredPetriNetBuilder::handleOrphanPlace(Colored::Place& place, std::unordered_map<std::string, uint32_t> unfoldedPlaceMap) {
115+ if(_ptplacenames.count(place.name) <= 0){
116+
117+ std::string name = place.name + "_orphan";
118 _ptBuilder.addPlace(name, place.marking.size(), 0.0, 0.0);
119 _ptplacenames[place.name][0] = std::move(name);
120+ } else {
121+ uint32_t usedTokens = 0;
122+
123+ for(std::pair<const uint32_t, std::string> unfoldedPlace : _ptplacenames[place.name]){
124+ auto unfoldedMarking = _ptBuilder.initMarking();
125+
126+ auto unfoldedPlaceId = unfoldedPlaceMap[unfoldedPlace.second];
127+ usedTokens += unfoldedMarking[unfoldedPlaceId];
128+ }
129+
130+ if(place.marking.size() > usedTokens){
131+ std::string name = place.name + "_orphan";
132+ _ptBuilder.addPlace(name, place.marking.size() - usedTokens, 0.0, 0.0);
133+ _ptplacenames[place.name][UINT32_MAX] = std::move(name);
134+ }
135 }
136
137 //++_nptplaces;
138 }
139
140- void ColoredPetriNetBuilder::unfoldPlace(const Colored::Place* place, const PetriEngine::Colored::Color *color) {
141+ void ColoredPetriNetBuilder::unfoldPlace(const Colored::Place* place, const PetriEngine::Colored::Color *color) {
142 std::string name = place->name + "_" + std::to_string(color->getId());
143 _ptBuilder.addPlace(name, place->marking[color], 0.0, 0.0);
144 _ptplacenames[place->name][color->getId()] = std::move(name);
145@@ -365,7 +382,7 @@
146 void ColoredPetriNetBuilder::unfoldTransition(Colored::Transition& transition) {
147 FixpointBindingGenerator gen(transition, _colors);
148 size_t i = 0;
149- for (auto b : gen) {
150+ for (auto b : gen) {
151 std::string name = transition.name + "_" + std::to_string(i++);
152 _ptBuilder.addTransition(name, 0.0, 0.0);
153 _pttransitionnames[transition.name].push_back(name);
154
155=== modified file 'src/PetriEngine/Colored/GuardRestrictor.cpp'
156--- src/PetriEngine/Colored/GuardRestrictor.cpp 2021-03-15 10:04:47 +0000
157+++ src/PetriEngine/Colored/GuardRestrictor.cpp 2021-03-26 10:35:05 +0000
158@@ -244,7 +244,7 @@
159 //comparing vars of same size
160 if(varPositionPair.second->colorType->productSize() == varPositionsR->operator[](index)->colorType->productSize()){
161 intervalTuple_t newIntervalTuple = getIntervalOverlap(&leftTupleIntervalVal._intervals, &rightTupleIntervalVal._intervals);
162-
163+
164 *leftTupleInterval = newIntervalTuple;
165 *rightTupleInterval = newIntervalTuple;
166 leftTupleInterval->applyModifier(leftVarModifier, varPositionPair.second->colorType->getConstituentsSizes());

Subscribers

People subscribed via source and target branches

to all changes: