5
5
import java.util.Iterator;
6
6
import java.util.List;
8
import dk.aau.cs.TA.trace.Participant;
9
import dk.aau.cs.TA.trace.TAFiringAction;
10
import dk.aau.cs.TA.trace.TimeDelayFiringAction;
11
import dk.aau.cs.TA.trace.TransitionFiring;
12
import dk.aau.cs.TA.trace.UppaalTrace;
13
import dk.aau.cs.petrinet.TAPNPlace;
14
import dk.aau.cs.petrinet.TAPNTransition;
15
import dk.aau.cs.petrinet.TimedArcPetriNet;
16
import dk.aau.cs.petrinet.Token;
17
import dk.aau.cs.petrinet.trace.TAPNFiringAction;
18
import dk.aau.cs.petrinet.trace.TAPNTrace;
8
import dk.aau.cs.model.NTA.trace.Participant;
9
import dk.aau.cs.model.NTA.trace.TAFiringAction;
10
import dk.aau.cs.model.NTA.trace.TimeDelayFiringAction;
11
import dk.aau.cs.model.NTA.trace.TransitionFiring;
12
import dk.aau.cs.model.NTA.trace.UppaalTrace;
13
import dk.aau.cs.model.tapn.TimedArcPetriNet;
14
import dk.aau.cs.model.tapn.TimedPlace;
15
import dk.aau.cs.model.tapn.TimedToken;
16
import dk.aau.cs.model.tapn.TimedTransition;
17
import dk.aau.cs.model.tapn.simulation.TimeDelayStep;
18
import dk.aau.cs.model.tapn.simulation.TimedArcPetriNetTrace;
19
import dk.aau.cs.model.tapn.simulation.TimedTransitionStep;
19
20
import dk.aau.cs.translations.TranslationNamingScheme;
20
21
import dk.aau.cs.translations.TranslationNamingScheme.TransitionTranslation;
21
22
import dk.aau.cs.translations.TranslationNamingScheme.TransitionTranslation.SequenceInfo;
24
25
private final TimedArcPetriNet tapn;
25
26
private final TranslationNamingScheme namingScheme;
27
public VerifytaTraceInterpreter(TimedArcPetriNet tapn, TranslationNamingScheme namingScheme){
28
public VerifytaTraceInterpreter(TimedArcPetriNet model, TranslationNamingScheme namingScheme) {
29
30
this.namingScheme = namingScheme;
32
protected TimedArcPetriNet tapn(){
33
protected TimedArcPetriNet tapn() {
36
protected TranslationNamingScheme namingScheme(){
37
protected TranslationNamingScheme namingScheme() {
37
38
return namingScheme;
40
public TAPNTrace interpretTrace(UppaalTrace trace){
41
public TimedArcPetriNetTrace interpretTrace(UppaalTrace trace) {
41
42
return interpretTimedTrace(trace);
44
private TAPNTrace interpretTimedTrace(UppaalTrace trace) {
45
private TimedArcPetriNetTrace interpretTimedTrace(UppaalTrace trace) {
45
46
boolean isConcreteTrace = trace.isConcreteTrace();
46
TAPNTrace result = new TAPNTrace(isConcreteTrace);
47
TimedArcPetriNetTrace result = new TimedArcPetriNetTrace(isConcreteTrace);
48
49
Iterator<TAFiringAction> iterator = trace.iterator();
49
50
TAFiringAction action = null;
51
while(iterator.hasNext()){
52
while (iterator.hasNext()) {
52
53
List<TransitionFiring> firingSequence = new ArrayList<TransitionFiring>();
53
54
List<String> firingSequenceNames = new ArrayList<String>();
55
while(iterator.hasNext() &&
56
(action = iterator.next()) instanceof TransitionFiring){
57
firingSequence.add((TransitionFiring)action);
58
firingSequenceNames.add(((TransitionFiring)action).channel());
56
while (iterator.hasNext() && (action = iterator.next()) instanceof TransitionFiring) {
57
firingSequence.add((TransitionFiring) action);
58
firingSequenceNames.add(((TransitionFiring) action).channel());
61
61
TransitionTranslation[] transitions = namingScheme.interpretTransitionSequence(firingSequenceNames);
63
for(TransitionTranslation transitionTranslation : transitions){
64
TAPNFiringAction firingAction = interpretTransitionFiring(firingSequence, transitionTranslation, isConcreteTrace);
65
result.addFiringAction(firingAction);
63
for (TransitionTranslation transitionTranslation : transitions) {
64
TimedTransitionStep transitionStep = interpretTransitionFiring(firingSequence, transitionTranslation, isConcreteTrace);
65
result.add(transitionStep);
69
if(action != null && action instanceof TimeDelayFiringAction){
70
BigDecimal delay = ((TimeDelayFiringAction)action).getDelay();
71
TAPNFiringAction delayAction = new dk.aau.cs.petrinet.trace.TimeDelayFiringAction(delay);
72
result.addFiringAction(delayAction);
68
if (action != null && action instanceof TimeDelayFiringAction) {
69
BigDecimal delay = ((TimeDelayFiringAction) action).getDelay();
70
TimeDelayStep delayAction = new TimeDelayStep(delay);
71
result.add(delayAction);
79
protected TAPNFiringAction interpretTransitionFiring
81
List<TransitionFiring> firingSequence,
82
TransitionTranslation transitionTranslation,
83
boolean isConcreteTrace
85
TAPNTransition transition = tapn.getTransitionsByName(transitionTranslation.originalTransitionName());
86
List<Token> tokens = null;
88
if(transitionTranslation.sequenceInfo().equals(SequenceInfo.WHOLE)){
89
tokens = parseConsumedTokens(
90
firingSequence.subList(transitionTranslation.startsAt(), transitionTranslation.endsAt()+1)
92
}else if(transitionTranslation.sequenceInfo().equals(SequenceInfo.END)){
78
protected TimedTransitionStep interpretTransitionFiring(List<TransitionFiring> firingSequence, TransitionTranslation transitionTranslation, boolean isConcreteTrace) {
79
TimedTransition transition = tapn.getTransitionByName(transitionTranslation.originalTransitionName());
80
List<TimedToken> tokens = null;
81
if (isConcreteTrace) {
82
if (transitionTranslation.sequenceInfo().equals(SequenceInfo.WHOLE)) {
83
tokens = parseConsumedTokens(firingSequence.subList(transitionTranslation.startsAt(), transitionTranslation.endsAt() + 1));
84
} else if (transitionTranslation.sequenceInfo().equals(SequenceInfo.END)) {
93
85
TransitionFiring start = firingSequence.get(transitionTranslation.startsAt());
94
86
TransitionFiring end = firingSequence.get(transitionTranslation.endsAt());
95
87
tokens = parseConsumedTokens(start, end);
99
return new dk.aau.cs.petrinet.trace.TransitionFiringAction(transition, tokens);
91
return new TimedTransitionStep(transition,tokens);
102
private List<Token> parseConsumedTokens(List<TransitionFiring> actions) {
103
ArrayList<Token> tokens = new ArrayList<Token>();
94
private List<TimedToken> parseConsumedTokens(List<TransitionFiring> actions) {
95
ArrayList<TimedToken> tokens = new ArrayList<TimedToken>();
105
for(int i = 0; i < actions.size(); i++){
97
for (int i = 0; i < actions.size(); i++) {
106
98
TransitionFiring action = actions.get(i);
108
for(Participant participant : action.participants()){
100
for (Participant participant : action.participants()) {
109
101
String automata = participant.automata();
110
102
String sourceLocation = participant.location();
112
if(!namingScheme.isIgnoredAutomata(automata) && !namingScheme.isIgnoredPlace(sourceLocation)){
113
TAPNPlace place = tapn.getPlaceByName(sourceLocation);
104
if (!namingScheme.isIgnoredAutomata(automata) && !namingScheme.isIgnoredPlace(sourceLocation)) {
105
TimedPlace place = tapn.getPlaceByName(sourceLocation);
114
106
BigDecimal clockValue = participant.clockOrVariableValue(namingScheme().tokenClockName()).lower();
115
Token token = new Token(place, clockValue);
107
TimedToken token = new TimedToken(place, clockValue);
116
108
tokens.add(token);
124
private List<Token> parseConsumedTokens(TransitionFiring start, TransitionFiring end) {
125
ArrayList<Token> tokens = new ArrayList<Token>();
116
private List<TimedToken> parseConsumedTokens(TransitionFiring start, TransitionFiring end) {
117
ArrayList<TimedToken> tokens = new ArrayList<TimedToken>();
127
for(Participant participant : end.participants()){
119
for (Participant participant : end.participants()) {
128
120
String automata = participant.automata();
129
121
String sourceLocation = start.sourceState().locationFor(automata);
131
if(!namingScheme.isIgnoredAutomata(automata) && !namingScheme.isIgnoredPlace(sourceLocation)){
132
TAPNPlace place = tapn.getPlaceByName(sourceLocation);
123
if (!namingScheme.isIgnoredAutomata(automata) && !namingScheme.isIgnoredPlace(sourceLocation)) {
124
TimedPlace place = tapn.getPlaceByName(sourceLocation);
133
125
BigDecimal clockValue = start.sourceState().getLocalClockOrVariable(automata, namingScheme().tokenClockName()).lower();
134
Token token = new Token(place, clockValue);
126
TimedToken token = new TimedToken(place, clockValue);
135
127
tokens.add(token);