1
package dk.aau.cs.verification;
3
import java.util.HashSet;
5
import dk.aau.cs.model.tapn.SharedPlace;
6
import dk.aau.cs.model.tapn.TimedArcPetriNet;
7
import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
8
import dk.aau.cs.model.tapn.TimedInhibitorArc;
9
import dk.aau.cs.model.tapn.TimedInputArc;
10
import dk.aau.cs.model.tapn.TimedOutputArc;
11
import dk.aau.cs.model.tapn.LocalTimedPlace;
12
import dk.aau.cs.model.tapn.TimedPlace;
13
import dk.aau.cs.model.tapn.TimedToken;
14
import dk.aau.cs.model.tapn.TimedTransition;
15
import dk.aau.cs.model.tapn.TransportArc;
16
import dk.aau.cs.util.Tuple;
18
public class TAPNComposer {
19
private static final String PLACE_FORMAT = "P%1$d";
20
private static final String TRANSITION_FORMAT = "T%1$d";
22
private int nextPlaceIndex;
23
private int nextTransitionIndex;
25
private HashSet<String> processedSharedObjects;
27
public Tuple<TimedArcPetriNet, NameMapping> transformModel(TimedArcPetriNetNetwork model) {
29
nextTransitionIndex = -1;
30
processedSharedObjects = new HashSet<String>();
31
TimedArcPetriNet tapn = new TimedArcPetriNet("ComposedModel");
32
NameMapping mapping = new NameMapping();
34
createSharedPlaces(model, tapn, mapping);
35
createPlaces(model, tapn, mapping);
36
createTransitions(model, tapn, mapping);
37
createInputArcs(model, tapn, mapping);
38
createOutputArcs(model, tapn, mapping);
39
createTransportArcs(model, tapn, mapping);
40
createInhibitorArcs(model, tapn, mapping);
42
//dumpToConsole(tapn, mapping);
44
return new Tuple<TimedArcPetriNet, NameMapping>(tapn, mapping);
47
@SuppressWarnings("unused")
48
private void dumpToConsole(TimedArcPetriNet tapn, NameMapping mapping) {
49
System.out.println("Composed Model:");
50
System.out.println("PLACES:");
51
for(TimedPlace place : tapn.places()){
52
System.out.print("\t");
53
System.out.print(place.name());
54
System.out.print(", invariant: ");
55
System.out.print(place.invariant().toString());
56
System.out.print(" (Original: ");
57
System.out.print(mapping.map(place.name()));
58
System.out.println(")");
62
System.out.println("TRANSITIONS:");
63
for(TimedTransition transition : tapn.transitions()){
64
System.out.print("\t");
65
System.out.print(transition.name());
66
System.out.print(" (Original: ");
67
System.out.print(mapping.map(transition.name()).toString());
68
System.out.println(")");
72
System.out.println("INPUT ARCS:");
73
for(TimedInputArc arc : tapn.inputArcs()){
74
System.out.print("\tSource: ");
75
System.out.print(arc.source().name());
76
System.out.print(", Target: ");
77
System.out.print(arc.destination().name());
78
System.out.print(", Interval: ");
79
System.out.println(arc.interval().toString());
83
System.out.println("OUTPUT ARCS:");
84
for(TimedOutputArc arc : tapn.outputArcs()){
85
System.out.print("\tSource: ");
86
System.out.print(arc.source().name());
87
System.out.print(", Target: ");
88
System.out.println(arc.destination().name());
92
System.out.println("TRANSPORT ARCS:");
93
for(TransportArc arc : tapn.transportArcs()){
94
System.out.print("\tSource: ");
95
System.out.print(arc.source().name());
96
System.out.print(", Transition: ");
97
System.out.print(arc.transition().name());
98
System.out.print(", Target: ");
99
System.out.print(arc.destination().name());
100
System.out.print(", Interval: ");
101
System.out.println(arc.interval().toString());
104
System.out.println();
105
System.out.println("INHIBITOR ARCS:");
106
for(TimedInhibitorArc arc : tapn.inhibitorArcs()){
107
System.out.print("\tSource: ");
108
System.out.print(arc.source().name());
109
System.out.print(", Target: ");
110
System.out.print(arc.destination().name());
111
System.out.print(", Interval: ");
112
System.out.println(arc.interval().toString());
115
System.out.println();
116
System.out.println("MARKING:");
117
for(TimedPlace place : tapn.places()){
118
for(TimedToken token : place.tokens()){
119
System.out.print(token.toString());
120
System.out.print(", ");
123
System.out.println();
124
System.out.println();
127
private void createSharedPlaces(TimedArcPetriNetNetwork model, TimedArcPetriNet constructedModel, NameMapping mapping) {
128
for(SharedPlace place : model.sharedPlaces()){
129
String uniquePlaceName = getUniquePlaceName();
131
LocalTimedPlace constructedPlace = new LocalTimedPlace(uniquePlaceName, place.invariant());
132
constructedModel.add(constructedPlace);
133
mapping.addMappingForShared(place.name(), uniquePlaceName);
135
if(isSharedPlaceUsedInTemplates(model, place)){
136
for (TimedToken token : place.tokens()) {
137
constructedPlace.addToken(new TimedToken(constructedPlace, token.age()));
143
private boolean isSharedPlaceUsedInTemplates(TimedArcPetriNetNetwork model, SharedPlace place) {
144
for(TimedArcPetriNet tapn : model.templates()){
145
for(TimedPlace timedPlace : tapn.places()){
146
if(timedPlace.equals(place)) return true;
152
private void createPlaces(TimedArcPetriNetNetwork model, TimedArcPetriNet constructedModel, NameMapping mapping) {
153
for (TimedArcPetriNet tapn : model.templates()) {
154
for (TimedPlace timedPlace : tapn.places()) {
155
if(!timedPlace.isShared()){
156
String uniquePlaceName = getUniquePlaceName();
158
LocalTimedPlace place = new LocalTimedPlace(uniquePlaceName, timedPlace.invariant());
159
constructedModel.add(place);
160
mapping.addMapping(tapn.name(), timedPlace.name(), uniquePlaceName);
162
for (TimedToken token : timedPlace.tokens()) {
163
place.addToken(new TimedToken(place, token.age()));
170
private String getUniquePlaceName() {
172
return String.format(PLACE_FORMAT, nextPlaceIndex);
175
private void createTransitions(TimedArcPetriNetNetwork model, TimedArcPetriNet constructedModel, NameMapping mapping) {
176
for (TimedArcPetriNet tapn : model.templates()) {
177
for (TimedTransition timedTransition : tapn.transitions()) {
178
if(!processedSharedObjects.contains(timedTransition.name())){
179
String uniqueTransitionName = getUniqueTransitionName();
181
constructedModel.add(new TimedTransition(uniqueTransitionName));
182
if(timedTransition.isShared()){
183
String name = timedTransition.sharedTransition().name();
184
processedSharedObjects.add(name);
185
mapping.addMappingForShared(name, uniqueTransitionName);
187
mapping.addMapping(tapn.name(), timedTransition.name(), uniqueTransitionName);
194
private String getUniqueTransitionName() {
195
nextTransitionIndex++;
196
return String.format(TRANSITION_FORMAT, nextTransitionIndex);
199
private void createInputArcs(TimedArcPetriNetNetwork model,
200
TimedArcPetriNet constructedModel, NameMapping mapping) {
201
for (TimedArcPetriNet tapn : model.templates()) {
202
for (TimedInputArc arc : tapn.inputArcs()) {
203
String template = arc.source().isShared() ? "" : tapn.name();
204
TimedPlace source = constructedModel.getPlaceByName(mapping.map(template, arc.source().name()));
206
template = arc.destination().isShared() ? "" : tapn.name();
207
TimedTransition target = constructedModel.getTransitionByName(mapping.map(template, arc.destination().name()));
209
constructedModel.add(new TimedInputArc(source, target, arc.interval()));
214
private void createOutputArcs(TimedArcPetriNetNetwork model,
215
TimedArcPetriNet constructedModel, NameMapping mapping) {
216
for (TimedArcPetriNet tapn : model.templates()) {
217
for (TimedOutputArc arc : tapn.outputArcs()) {
218
String template = arc.source().isShared() ? "" : tapn.name();
219
TimedTransition source = constructedModel.getTransitionByName(mapping.map(template, arc.source().name()));
221
template = arc.destination().isShared() ? "" : tapn.name();
222
TimedPlace target = constructedModel.getPlaceByName(mapping.map(template, arc.destination().name()));
224
constructedModel.add(new TimedOutputArc(source, target));
229
private void createTransportArcs(TimedArcPetriNetNetwork model,
230
TimedArcPetriNet constructedModel, NameMapping mapping) {
231
for (TimedArcPetriNet tapn : model.templates()) {
232
for (TransportArc arc : tapn.transportArcs()) {
233
String template = arc.source().isShared() ? "" : tapn.name();
234
TimedPlace source = constructedModel.getPlaceByName(mapping.map(template, arc.source().name()));
236
template = arc.transition().isShared() ? "" : tapn.name();
237
TimedTransition transition = constructedModel.getTransitionByName(mapping.map(template, arc.transition().name()));
239
template = arc.destination().isShared() ? "" : tapn.name();
240
TimedPlace target = constructedModel.getPlaceByName(mapping.map(template, arc.destination().name()));
242
constructedModel.add(new TransportArc(source, transition,target, arc.interval()));
247
private void createInhibitorArcs(TimedArcPetriNetNetwork model,
248
TimedArcPetriNet constructedModel, NameMapping mapping) {
249
for (TimedArcPetriNet tapn : model.templates()) {
250
for (TimedInhibitorArc arc : tapn.inhibitorArcs()) {
251
String template = arc.source().isShared() ? "" : tapn.name();
252
TimedPlace source = constructedModel.getPlaceByName(mapping.map(template, arc.source().name()));
254
template = arc.destination().isShared() ? "" : tapn.name();
255
TimedTransition target = constructedModel.getTransitionByName(mapping.map(template, arc.destination().name()));
257
constructedModel.add(new TimedInhibitorArc(source, target, arc.interval()));