1
1
package dk.aau.cs.verification.UPPAAL;
4
import java.io.FileNotFoundException;
5
4
import java.io.IOException;
6
5
import java.io.PrintStream;
8
import dk.aau.cs.TA.NTA;
9
import dk.aau.cs.TA.UPPAALQuery;
10
import dk.aau.cs.petrinet.TAPN;
11
import dk.aau.cs.petrinet.TAPNQuery;
12
import dk.aau.cs.petrinet.TimedArcPetriNet;
13
import dk.aau.cs.petrinet.colors.ColoredTimedArcPetriNet;
14
import dk.aau.cs.petrinet.degree2converters.NaiveDegree2Converter;
15
import dk.aau.cs.translations.ColoredTranslationNamingScheme;
7
import dk.aau.cs.model.tapn.TAPNQuery;
16
8
import dk.aau.cs.translations.ModelTranslator;
17
import dk.aau.cs.translations.QueryTranslator;
18
9
import dk.aau.cs.translations.ReductionOption;
19
import dk.aau.cs.translations.TranslationNamingScheme;
20
import dk.aau.cs.translations.coloredtapn.ColoredBroadcastTranslation;
21
import dk.aau.cs.translations.coloredtapn.ColoredDegree2BroadcastKBoundOptimizationTransformer;
22
import dk.aau.cs.translations.coloredtapn.ColoredDegree2BroadcastTranslation;
23
10
import dk.aau.cs.translations.tapn.BroadcastTranslation;
24
11
import dk.aau.cs.translations.tapn.Degree2BroadcastKBoundOptimizeTranslation;
25
12
import dk.aau.cs.translations.tapn.Degree2BroadcastTranslation;
26
import dk.aau.cs.translations.tapn.OptimizedStandardNamingScheme;
27
import dk.aau.cs.translations.tapn.OptimizedStandardSymmetryTranslation;
28
13
import dk.aau.cs.translations.tapn.OptimizedStandardTranslation;
29
import dk.aau.cs.translations.tapn.StandardNamingScheme;
30
import dk.aau.cs.translations.tapn.StandardSymmetryTranslation;
31
14
import dk.aau.cs.translations.tapn.StandardTranslation;
15
import dk.aau.cs.util.Tuple;
33
17
public class UppaalExporter {
34
public ExportedModel export(ColoredTimedArcPetriNet model, TAPNQuery query, ReductionOption reduction){
35
File xmlfile = createTempFile(".xml");
36
File qfile = createTempFile(".q");
37
if(xmlfile == null || qfile == null) return null;
39
int extraTokens = query.getTotalTokens() - model.getNumberOfTokens();
41
ModelTranslator<TimedArcPetriNet, NTA> modelTransformer = null;
42
QueryTranslator<TAPNQuery, UPPAALQuery> queryTransformer = null;
43
ColoredTranslationNamingScheme namingScheme = null;
44
if(reduction == ReductionOption.BROADCAST || reduction == ReductionOption.BROADCASTSYMMETRY){
45
ColoredBroadcastTranslation transformer = new ColoredBroadcastTranslation(extraTokens, reduction == ReductionOption.BROADCASTSYMMETRY);
46
modelTransformer = transformer;
47
queryTransformer = transformer;
48
namingScheme = transformer.namingScheme();
49
} else if(reduction == ReductionOption.KBOUNDANALYSIS){
50
Degree2BroadcastTranslation broadcastTransformer = new ColoredDegree2BroadcastTranslation(extraTokens, true);
51
modelTransformer = broadcastTransformer;
52
queryTransformer = broadcastTransformer;
53
}else if(reduction == ReductionOption.KBOUNDOPTMIZATION){
54
Degree2BroadcastTranslation broadcastTransformer = new ColoredDegree2BroadcastKBoundOptimizationTransformer(extraTokens);
55
modelTransformer = broadcastTransformer;
56
queryTransformer = broadcastTransformer;
58
ColoredDegree2BroadcastTranslation broadcastTransformer = new ColoredDegree2BroadcastTranslation(extraTokens, reduction == ReductionOption.DEGREE2BROADCASTSYMMETRY);
59
modelTransformer = broadcastTransformer;
60
queryTransformer = broadcastTransformer;
61
namingScheme = broadcastTransformer.namingScheme();
18
public ExportedModel export(dk.aau.cs.model.tapn.TimedArcPetriNet model, TAPNQuery query, ReductionOption reduction) {
19
File modelFile = createTempFile(".xml");
20
File queryFile = createTempFile(".q");
22
return export(model, query, reduction, modelFile, queryFile);
25
public ExportedModel export(dk.aau.cs.model.tapn.TimedArcPetriNet model, TAPNQuery query, ReductionOption reduction, File modelFile, File queryFile) {
26
if (modelFile == null || queryFile == null) return null;
28
ModelTranslator<dk.aau.cs.model.tapn.TimedArcPetriNet, TAPNQuery, dk.aau.cs.model.NTA.NTA, dk.aau.cs.model.NTA.UPPAALQuery> translator = null;
30
if (reduction == ReductionOption.STANDARD || reduction == ReductionOption.STANDARDSYMMETRY) {
31
translator = new StandardTranslation(reduction == ReductionOption.STANDARDSYMMETRY);
32
} else if (reduction == ReductionOption.OPTIMIZEDSTANDARD
33
|| reduction == ReductionOption.OPTIMIZEDSTANDARDSYMMETRY
34
|| (reduction == ReductionOption.KBOUNDANALYSIS && !model.hasInhibitorArcs())) {
35
translator = new OptimizedStandardTranslation(reduction == ReductionOption.OPTIMIZEDSTANDARDSYMMETRY || reduction == ReductionOption.KBOUNDANALYSIS);
36
} else if (reduction == ReductionOption.BROADCAST || reduction == ReductionOption.BROADCASTSYMMETRY) {
37
translator = new BroadcastTranslation(reduction == ReductionOption.BROADCASTSYMMETRY);
38
} else if (reduction == ReductionOption.DEGREE2BROADCASTSYMMETRY || reduction == ReductionOption.DEGREE2BROADCAST || (reduction == ReductionOption.KBOUNDANALYSIS && model.hasInhibitorArcs())) {
39
translator = new Degree2BroadcastTranslation(reduction == ReductionOption.DEGREE2BROADCASTSYMMETRY);
40
} else if (reduction == ReductionOption.KBOUNDOPTMIZATION) {
41
translator = new Degree2BroadcastKBoundOptimizeTranslation();
43
throw new RuntimeException("Invalid reduction selected. Please try again");
65
NTA nta = modelTransformer.transformModel(model);
66
nta.outputToUPPAALXML(new PrintStream(xmlfile));
67
UPPAALQuery uppaalQuery = queryTransformer.transformQuery(query);
68
uppaalQuery.output(new PrintStream(qfile));
69
}catch(FileNotFoundException e){
47
Tuple<dk.aau.cs.model.NTA.NTA, dk.aau.cs.model.NTA.UPPAALQuery> translatedModel = translator.translate(model, query);
48
translatedModel.value1().outputToUPPAALXML(new PrintStream(modelFile));
49
translatedModel.value2().output(new PrintStream(queryFile));
72
50
} catch (Exception e) {
73
51
e.printStackTrace();
77
return new ExportedModel(xmlfile.getAbsolutePath(), qfile.getAbsolutePath(), namingScheme);
80
public ExportedModel export(TimedArcPetriNet model, TAPNQuery query, ReductionOption reduction){
81
File xmlfile = createTempFile(".xml");
82
File qfile = createTempFile(".q");
83
if(xmlfile == null || qfile == null) return null;
85
int extraTokens = query.getTotalTokens() - model.getNumberOfTokens();
86
TranslationNamingScheme namingScheme = null;
87
if (reduction == ReductionOption.STANDARDSYMMETRY){
89
StandardSymmetryTranslation t = new StandardSymmetryTranslation();
91
t.autoTransform((TAPN)model, new PrintStream(xmlfile), new PrintStream(qfile), query, extraTokens);
92
} catch (FileNotFoundException e) {
97
} else if (reduction == ReductionOption.OPTIMIZEDSTANDARDSYMMETRY || (reduction == ReductionOption.KBOUNDANALYSIS && !((TAPN)model).hasInhibitorArcs())){
98
OptimizedStandardSymmetryTranslation t = new OptimizedStandardSymmetryTranslation();
100
t.autoTransform((TAPN)model, new PrintStream(xmlfile), new PrintStream(qfile), query, extraTokens);
101
} catch (FileNotFoundException e) {
105
}else if (reduction == ReductionOption.OPTIMIZEDSTANDARD){
106
OptimizedStandardTranslation t = new OptimizedStandardTranslation();
108
t.autoTransform((TAPN)model, new PrintStream(xmlfile), new PrintStream(qfile), query, extraTokens);
109
} catch (FileNotFoundException e) {
113
namingScheme = new OptimizedStandardNamingScheme();
114
} else if(reduction == ReductionOption.BROADCAST || reduction == ReductionOption.BROADCASTSYMMETRY){
115
BroadcastTranslation broadcastTransformer = new BroadcastTranslation(extraTokens, reduction == ReductionOption.BROADCASTSYMMETRY);
116
namingScheme = broadcastTransformer.namingScheme();
118
dk.aau.cs.TA.NTA nta = broadcastTransformer.transformModel(model);
119
nta.outputToUPPAALXML(new PrintStream(xmlfile));
120
dk.aau.cs.TA.UPPAALQuery uppaalQuery = broadcastTransformer.transformQuery(query);
121
uppaalQuery.output(new PrintStream(qfile));
122
}catch(FileNotFoundException e){
125
} catch (Exception e) {
129
} else if(reduction == ReductionOption.DEGREE2BROADCASTSYMMETRY || reduction == ReductionOption.DEGREE2BROADCAST || (reduction == ReductionOption.KBOUNDANALYSIS && ((TAPN)model).hasInhibitorArcs())){
130
Degree2BroadcastTranslation broadcastTransformer = new Degree2BroadcastTranslation(extraTokens, reduction == ReductionOption.DEGREE2BROADCASTSYMMETRY);
131
namingScheme = broadcastTransformer.namingScheme();
133
dk.aau.cs.TA.NTA nta = broadcastTransformer.transformModel(model);
134
nta.outputToUPPAALXML(new PrintStream(xmlfile));
135
dk.aau.cs.TA.UPPAALQuery uppaalQuery = broadcastTransformer.transformQuery(query);
136
uppaalQuery.output(new PrintStream(qfile));
137
}catch(FileNotFoundException e){
140
} catch (Exception e) {
144
} else if(reduction == ReductionOption.KBOUNDOPTMIZATION){
145
Degree2BroadcastKBoundOptimizeTranslation transformer = new Degree2BroadcastKBoundOptimizeTranslation(extraTokens);
148
dk.aau.cs.TA.NTA nta = transformer.transformModel(model);
149
nta.outputToUPPAALXML(new PrintStream(xmlfile));
150
dk.aau.cs.TA.UPPAALQuery uppaalQuery = transformer.transformQuery(query);
151
uppaalQuery.output(new PrintStream(qfile));
152
}catch(FileNotFoundException e){
155
} catch (Exception e) {
162
model.convertToConservative();
163
} catch (Exception e1) {
164
e1.printStackTrace();
169
NaiveDegree2Converter deg2Converter = new NaiveDegree2Converter();
170
model = deg2Converter.transform((TAPN)model);
171
} catch (Exception e1) {
172
e1.printStackTrace();
178
//Create uppaal xml file
180
StandardTranslation t2 = new StandardTranslation((TAPN)model, new PrintStream(xmlfile), extraTokens);
182
t2.transformQueriesToUppaal(extraTokens, query, new PrintStream(qfile));
183
} catch (FileNotFoundException e) {
186
} catch (Exception e) {
191
namingScheme = new StandardNamingScheme();
193
return new ExportedModel(xmlfile.getAbsolutePath(), qfile.getAbsolutePath(), namingScheme);
55
return new ExportedModel(modelFile.getAbsolutePath(), queryFile.getAbsolutePath(), translator.namingScheme());
196
59
private File createTempFile(String ending) {
199
62
file = File.createTempFile("verifyta", ending);