aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <oszka@152.66.252.189>2017-07-05 16:38:04 +0200
committerLibravatar OszkarSemerath <oszka@152.66.252.189>2017-07-05 16:38:04 +0200
commitc085abd5f2dd49c8be1b32451c8f2ca05fa15f52 (patch)
tree3740158d8d00c8f4ede888eead105f6650871713 /Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend
parentSupport for generationg multiple difference models by VIATRA-Solver (diff)
downloadVIATRA-Generator-c085abd5f2dd49c8be1b32451c8f2ca05fa15f52.tar.gz
VIATRA-Generator-c085abd5f2dd49c8be1b32451c8f2ca05fa15f52.tar.zst
VIATRA-Generator-c085abd5f2dd49c8be1b32451c8f2ca05fa15f52.zip
Example configuration for running measurements.
Diffstat (limited to 'Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend')
-rw-r--r--Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend288
1 files changed, 199 insertions, 89 deletions
diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend
index f2a70552..e6ee0ad9 100644
--- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend
+++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/DiverseMeasurementRunner.xtend
@@ -1,41 +1,52 @@
1package hu.bme.mit.inf.dslreasoner.run 1package hu.bme.mit.inf.dslreasoner.run
2 2
3import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
4import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage
6import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
7import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage
8import org.eclipse.emf.ecore.resource.Resource
9import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Viatra2LogicAnnotationsPackage
10import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
11import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
12import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
13import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy
14import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod
15import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
16import org.eclipse.xtend.lib.annotations.Data
17import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
18import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
19import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
20import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
21import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
22import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration 4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
23import org.eclipse.emf.ecore.EObject 5import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
24import java.util.List 6import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage
25import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration 7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage
8import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
26import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult 9import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult
27import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
28import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult 10import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
29import hu.bme.mit.inf.dslreasoner.logic.model.statistics.StatisticSections2Print 11import hu.bme.mit.inf.dslreasoner.logic.model.statistics.StatisticSections2Print
12import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
13import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
14import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration
15import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
16import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Viatra2LogicAnnotationsPackage
17import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod
18import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
19import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
20import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
21import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml
22import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
23import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy
24import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
25import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
26import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
27import java.util.List
28import org.eclipse.emf.ecore.EObject
29import org.eclipse.emf.ecore.resource.Resource
30import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
31import org.eclipse.viatra.query.runtime.api.IPatternMatch
32import org.eclipse.viatra.query.runtime.api.IQuerySpecification
33import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
34import org.eclipse.xtend.lib.annotations.Data
35import java.util.LinkedList
36import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver
37import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration
30 38
31enum Metamodel { 39enum Metamodel {
32 FAM, YakinduWOSynch, Yakindu 40 FAM, YakinduWOSynch, Yakindu
33} 41}
34enum Constraints { 42enum Constraints {
35 None, PlusOne, MinusOne 43 None, Metamodel, All, PlusOne, MinusOne
36} 44}
37enum StateCoder { 45enum StateCoder {
38 ID, R1, R2, R3; 46 ID, Normal, R1, R2, R3;
47}
48enum Solver {
49 ViatraSolver, Alloy
39} 50}
40 51
41@Data 52@Data
@@ -46,6 +57,7 @@ class Scenario {
46 Constraints constraints 57 Constraints constraints
47 StateCoder statecoder 58 StateCoder statecoder
48 int runs 59 int runs
60 Solver solver
49} 61}
50 62
51class ScenarioRunner { 63class ScenarioRunner {
@@ -53,12 +65,15 @@ class ScenarioRunner {
53 // Workspace 65 // Workspace
54 private val FileSystemWorkspace inputs = new FileSystemWorkspace('''initialModels/''',"") 66 private val FileSystemWorkspace inputs = new FileSystemWorkspace('''initialModels/''',"")
55 private val ViatraReasoner viatraSolver = new ViatraReasoner 67 private val ViatraReasoner viatraSolver = new ViatraReasoner
68 private val AlloySolver alloySolver = new AlloySolver
56 private var MetamodelLoader loader 69 private var MetamodelLoader loader
57 70
58 val Ecore2Logic ecore2Logic = new Ecore2Logic 71 val Ecore2Logic ecore2Logic = new Ecore2Logic
59 val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) 72 val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic)
73 val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic)
60 val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic 74 val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic
61 75
76 var matchStatistics = ""
62 77
63 public def runScenario(Scenario scenario) { 78 public def runScenario(Scenario scenario) {
64 init() 79 init()
@@ -69,31 +84,46 @@ class ScenarioRunner {
69 84
70// printHeader(scenario) 85// printHeader(scenario)
71 86
72 if(scenario.constraints == Constraints.None) { 87 if( scenario.constraints == Constraints.None ||
88 scenario.constraints == Constraints.Metamodel||
89 scenario.constraints == Constraints.All)
90 {
91 if(scenario.constraints == Constraints.None) {
92 mm.attributes.forEach[it.lowerBound = 0]
93 mm.references.forEach[it.lowerBound = 0]
94 }
95
96 val useVQ = if(scenario.constraints == Constraints.None || scenario.constraints == Constraints.Metamodel) {
97 new ViatraQuerySetDescriptor(emptyList,emptySet,emptyMap)
98 } else {
99 vq
100 }
73 101
74 mm.attributes.forEach[it.lowerBound = 0]
75 mm.references.forEach[it.lowerBound = 0]
76 mm.references.removeAll(vq.derivedFeatures.values)
77 mm.attributes.removeAll(vq.derivedFeatures.values)
78 for(run : 1..scenario.runs) { 102 for(run : 1..scenario.runs) {
79 runCase(run==1,"noConstraints"+run,scenario,mm,new ViatraQuerySetDescriptor(vq.patterns,emptySet,emptyMap),ps) 103 runCase(run==1,scenario.constraints+""+run,run,scenario,mm,useVQ,ps)
104
105 System.gc System.gc System.gc
106 Thread.sleep(3000)
80 } 107 }
81 } else { 108 println(matchStatistics)
82 109
110 } else if(scenario.constraints == Constraints.MinusOne) {
111 var first = true
112 //for(remove : vq.validationPatterns) {
113 for(run : 1..scenario.runs) {
114
115 //val removeName = remove.fullyQualifiedName
116 //val desc = new ViatraQuerySetDescriptor(vq.patterns,vq.validationPatterns.filter[it != remove].toSet,emptyMap)
117 runCase(first,"minusOne"+run,run,scenario,mm,vq,ps)
118 first = false
119 System.gc System.gc System.gc
120 //Thread.sleep(3000)
121 }
122 //}
83 } 123 }
84
85
86 } 124 }
87 125
88// private def printHeader(Scenario scenario) { 126 private def runCase(boolean first, String id, int run, Scenario scenario, EcoreMetamodelDescriptor mm, ViatraQuerySetDescriptor vq, List<EObject> partialModel) {
89// print("id;Solution type (ms);Transformation time (ms);Solver time (ms);")
90// (1..scenario.number).forEach[print("sol"+it+" (nano);")]
91// print("TransformationExecutionTime (ms);TypeAnalysisTime (ms);StateCoderTime (ms);SolutionCopyTime (ms);")
92// print("SolutionDiversityCheckTime (ms);SolutionDiversitySuccessRate (%);")
93// println("save")
94// }
95
96 private def runCase(boolean first, String id, Scenario scenario, EcoreMetamodelDescriptor mm, ViatraQuerySetDescriptor vq, List<EObject> partialModel) {
97 // Transform 127 // Transform
98 val metamodelProblem = ecore2Logic.transformMetamodel(mm,new Ecore2LogicConfiguration()) 128 val metamodelProblem = ecore2Logic.transformMetamodel(mm,new Ecore2LogicConfiguration())
99 instanceModel2Logic.transform(metamodelProblem,partialModel) 129 instanceModel2Logic.transform(metamodelProblem,partialModel)
@@ -107,9 +137,19 @@ class ScenarioRunner {
107 val config = getSolverConfiguration(scenario,vq) 137 val config = getSolverConfiguration(scenario,vq)
108 138
109 // Execute 139 // Execute
110 val solution = viatraSolver.solve(problem,config,workspace) 140 val solution = getSolver(scenario).solve(problem,config,workspace)
111 printStatistics(solution,scenario,workspace,id,first) 141 //printMatchCountStatistics(solution,id)
112 142 val emfModels = new LinkedList
143 if(solution instanceof ModelResult) {
144 val interpretations = getSolver(scenario).getInterpretations(solution)
145 for(interpretation : interpretations) {
146 val instanceModel = logic2Ecore.transformInterpretation(interpretation,metamodelProblem.trace)
147 emfModels+=instanceModel
148 }
149
150 }
151 printStatistics(solution,emfModels,scenario,workspace,id,run,first)
152
113 } 153 }
114 154
115 private def init() { 155 private def init() {
@@ -128,43 +168,67 @@ class ScenarioRunner {
128 loader = if(metamodel == Metamodel::FAM) { 168 loader = if(metamodel == Metamodel::FAM) {
129 new FAMLoader(inputs) 169 new FAMLoader(inputs)
130 } else if(metamodel == Metamodel::Yakindu || metamodel == Metamodel::YakinduWOSynch) { 170 } else if(metamodel == Metamodel::Yakindu || metamodel == Metamodel::YakinduWOSynch) {
131 new YakinduLoader(inputs) 171 new YakinduLoader(inputs) => [it.useSynchronization = false]
132 } else throw new IllegalArgumentException('''Unknown domain: «metamodel»''') 172 } else throw new IllegalArgumentException('''Unknown domain: «metamodel»''')
133 } 173 }
134 174
175 def private getSolver(Scenario scenario) {
176 if(scenario.solver == Solver::ViatraSolver) {
177 viatraSolver
178 } else if(scenario.solver == Solver::Alloy) {
179 alloySolver
180 }
181 }
182
135 def private getSolverConfiguration(Scenario scenario, ViatraQuerySetDescriptor vq) { 183 def private getSolverConfiguration(Scenario scenario, ViatraQuerySetDescriptor vq) {
136 val viatraConfig = new ViatraReasonerConfiguration => [ 184 if(scenario.solver == Solver.ViatraSolver) {
137 it.runtimeLimit = 300 185 val viatraConfig = new ViatraReasonerConfiguration => [
138 it.typeScopes.maxNewElements = scenario.size 186 it.runtimeLimit = 300
139 it.typeScopes.minNewElements = scenario.size 187 it.typeScopes.maxNewElements = scenario.size
140 it.solutionScope.numberOfRequiredSolution = scenario.number 188 it.typeScopes.minNewElements = scenario.size
141 it.existingQueries = vq.patterns.map[it.internalQueryRepresentation] 189 it.solutionScope.numberOfRequiredSolution = scenario.number
142 it.nameNewElements = false 190 it.existingQueries = vq.patterns.map[it.internalQueryRepresentation]
143 it.typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis 191 it.nameNewElements = false
144 it.additionalGlobalConstraints += loader.additionalConstraints 192 it.typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis
145 it.stateCoderStrategy = StateCoderStrategy::Neighbourhood 193 it.additionalGlobalConstraints += loader.additionalConstraints
146 if(scenario.statecoder != StateCoder::ID) { 194 it.stateCoderStrategy = if(scenario.statecoder == StateCoder::ID) {
147 val range = if(scenario.statecoder != StateCoder::R1) { 195 StateCoderStrategy::IDBased
148 1 196 } else {
149 } else if(scenario.statecoder != StateCoder::R2) { 197 StateCoderStrategy::Neighbourhood
150 2
151 } else if(scenario.statecoder != StateCoder::R3) {
152 3
153 } 198 }
154 199 if(scenario.statecoder != StateCoder::ID || scenario.statecoder != StateCoder::Normal) {
155 it.diversityRequirement = new DiversityDescriptor => [ 200 val range = if(scenario.statecoder != StateCoder::R1) {
156 it.relevantTypes = null 201 1
157 it.relevantRelations = null 202 } else if(scenario.statecoder != StateCoder::R2) {
158 it.maxNumber = 1 203 2
159 it.range = range 204 } else if(scenario.statecoder != StateCoder::R3) {
160 it.parallels = 1 205 3
161 ] 206 }
162 } 207
163 ] 208 it.diversityRequirement = new DiversityDescriptor => [
164 return viatraConfig 209 it.relevantTypes = null
210 it.relevantRelations = null
211 it.maxNumber = 1
212 it.range = range
213 it.parallels = 1
214 ]
215 }
216 ]
217 return viatraConfig
218 } else if(scenario.solver == Solver::Alloy) {
219 return new AlloySolverConfiguration => [
220 it.runtimeLimit = 300
221 it.typeScopes.maxNewElements = scenario.size
222 it.typeScopes.minNewElements = scenario.size
223 it.solutionScope.numberOfRequiredSolution = scenario.number
224 it.typeScopes.maxIntScope = 0
225 it.writeToFile=true
226 ]
227 }
228
165 } 229 }
166 230
167 def printStatistics(LogicResult solution, Scenario scenario, FileSystemWorkspace workspace, String id, boolean printHeader) { 231 def printStatistics(LogicResult solution, List<EObject> emfModels, Scenario scenario, FileSystemWorkspace workspace, String id,int run, boolean printHeader) {
168 if(printHeader) { 232 if(printHeader) {
169 print("id;Solution type (ms);Transformation time (ms);Solver time (ms);") 233 print("id;Solution type (ms);Transformation time (ms);Solver time (ms);")
170 solution.statistics.entries.map[name].forEach[print(it+";")] 234 solution.statistics.entries.map[name].forEach[print(it+";")]
@@ -179,27 +243,73 @@ class ScenarioRunner {
179 243
180 print((new StatisticSections2Print).transformStatisticDatas2CSV(solution.statistics.entries)) 244 print((new StatisticSections2Print).transformStatisticDatas2CSV(solution.statistics.entries))
181 245
182 if(solution instanceof ModelResult) { 246 val representations = solution.representation
183 val representations = solution.representation 247 for(representationIndex : 0..<representations.size) {
184 for(representationIndex : 0..<representations.size) { 248 val representation = representations.get(representationIndex)
185 val representation = representations.get(representationIndex) 249 val emfModel = emfModels.get(representationIndex)
186 val representationNumber = representationIndex + 1 250 val representationNumber = representationIndex + 1
187 if(representation instanceof PartialInterpretation) { 251 if(representation instanceof PartialInterpretation) {
188 workspace.writeModel(representation, '''solution«representationNumber».partialinterpretation''') 252 workspace.writeModel(representation, '''solution«representationNumber».partialinterpretation''')
189 } else { 253 val partialInterpretation2GML = new PartialInterpretation2Gml
190 workspace.writeText('''solution«representationNumber».txt''',representation.toString) 254 val gml = partialInterpretation2GML.transform(representation)
191 } 255 //ecore2GML.transform(root)
256 workspace.writeText('''solutionVisualisation«representationNumber».gml''',gml)
257 } else {
258 workspace.writeText('''solution«representationNumber».txt''',representation.toString)
192 } 259 }
193 println('''saved''') 260 workspace.writeModel(emfModel,'''AM_«run»_«representationIndex+1».xmi''')
194 } else {
195 println('''notsaved''')
196 } 261 }
262 println('''saved''')
197 } 263 }
264
265 /*
266 def printMatchCountStatistics(LogicResult solution, String run) {
267 //val additionalMatches = ViatraReasoner::additionalMatches
268 val allPatterns = ViatraReasoner::allPatterns
269 val allModels = solution.representation
270 //val header = additionalMatches.head.keySet
271 //var res = '''run;model;«FOR pattern: header SEPARATOR ";"»«pattern»«ENDFOR»
272 //'''
273 var res = '''run;model;«FOR pattern: allPatterns.filter[calculateCount] SEPARATOR ";"»«pattern.fullyQualifiedName»«ENDFOR»
274 '''
275 var modelIndex = 1
276 for(model : allModels) {
277 //println(modelIndex)
278 val actualModel = model as PartialInterpretation
279
280 // Access the default local search hint
281 val localSearchHint = LocalSearchHints.getDefault().build();
282
283 // Build an engine options with the local search hint
284 //val options = ViatraQueryEngineOptions.
285 // defineOptions().
286 // withDefaultHint(localSearchHint).
287 // withDefaultBackend(localSearchHint.getQueryBackendFactory()). // this line is needed in 1.4 due to bug 507777
288 // build();
289
290 val engine = ViatraQueryEngine.on(new EMFScope(actualModel),options)
291 var line = '''«run»;«modelIndex»'''
292 for(pattern : allPatterns.filter[calculateCount]) {
293 val matcher = pattern.getMatcher(engine)
294 line+=";"+matcher.countMatches
295 }
296 //;«FOR pattern : model.entrySet SEPARATOR ";"»«pattern.value»«ENDFOR»'''
297 //val p = model as PartialInterpretation;
298 modelIndex++
299 res+=line+"\n"
300 }
301 matchStatistics+= res
302 }
303
304 def boolean calculateCount(IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> pattern) {
305 pattern.fullyQualifiedName.startsWith("currentInRelation_pattern")
306 //true
307 }*/
198} 308}
199 309
200class DiverseMeasurementRunner { 310class DiverseMeasurementRunner {
201 def static void main(String[] args) { 311 def static void main(String[] args) {
202 val scenario = new Scenario(50,50,Metamodel::Yakindu,Constraints.None,StateCoder.ID,12) 312 val scenario = new Scenario(100,49,Metamodel::Yakindu,Constraints.All,StateCoder.Normal,1,Solver::Alloy)
203 val scenarioRunner = new ScenarioRunner 313 val scenarioRunner = new ScenarioRunner
204 scenarioRunner.runScenario(scenario) 314 scenarioRunner.runScenario(scenario)
205 } 315 }