aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend')
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend243
1 files changed, 243 insertions, 0 deletions
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend
new file mode 100644
index 00000000..8445130a
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GenerateScenarios.xtend
@@ -0,0 +1,243 @@
1package run
2
3import Taxation.TaxationPackage
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
7import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
8import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
10import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
11import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult
12import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
13import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
14import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
15import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration
16import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
17import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
18import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
19import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml
20import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
21import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
22import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
23import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
24import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
25import java.math.BigDecimal
26import java.text.SimpleDateFormat
27import java.util.Date
28import java.util.HashMap
29import java.util.List
30import java.util.Map
31import java.util.TreeSet
32import org.eclipse.emf.ecore.EAttribute
33import org.eclipse.emf.ecore.EClass
34import org.eclipse.emf.ecore.EEnum
35import org.eclipse.emf.ecore.EEnumLiteral
36import org.eclipse.emf.ecore.EObject
37import org.eclipse.emf.ecore.EPackage
38import org.eclipse.emf.ecore.EReference
39import org.eclipse.emf.ecore.resource.Resource
40import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
41import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup
42import org.eclipse.viatra.query.runtime.api.IQueryGroup
43import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
44import queries.Case_study_A
45
46class GenerateScenarios {
47 def static void main(String[] args) {
48 val x = (new EMFPatternLanguageStandaloneSetup).createInjectorAndDoEMFRegistration
49// //PatternLanguageWithRSSetup.createInjectorAndDoEMFRegistration
50// ApplicationConfigurationStandaloneSetup.doSetup
51 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl)
52 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem", new XMIResourceFactoryImpl)
53 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("partialmodel", new XMIResourceFactoryImpl)
54 ReteEngine.getClass
55
56 val Ecore2Logic ecore2Logic = new Ecore2Logic
57 val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic)
58 val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic)
59 val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic
60
61 // Workspace setup
62 val Date date = new Date(System.currentTimeMillis)
63 val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm");
64 val formattedDate = format.format(date)
65
66 val inputs = new FileSystemWorkspace('''inputs/''', "")
67 val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "")
68 workspace.initAndClear
69
70 println("Input and output workspaces are created")
71
72// print(TaxationPackage.eINSTANCE.getEClassifiers.filter(EClass).toList.get(0))
73
74 //*
75 val metamodel = loadMetamodel(TaxationPackage.eINSTANCE)
76 val partialModel = loadPartialModel(inputs, "Household.xmi")
77 val queries = loadQueries(metamodel, Case_study_A.instance)
78 /*/
79 val metamodel = loadMetamodel(FamilytreePackage.eINSTANCE)
80// val partialModel = loadPartialModel(inputs, "yakindu/Yakindu.xmi")
81 val queries = loadQueries(metamodel, FamilyTreeConstraints.instance)
82 //*/
83 println("DSL loaded")
84
85 val SIZE = 10
86 var REPS = 1
87 val RUNTIME = 600
88
89 // /////////////////////////
90 // Prepare Problem
91 val modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, new Ecore2LogicConfiguration())
92 var problem = modelGenerationProblem.output
93
94// val modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel)
95// problem = modelExtensionProblem.output
96
97 val validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelGenerationProblem,
98 new Viatra2LogicConfiguration)
99 problem = validModelExtensionProblem.output
100
101 workspace.writeModel(problem, "problem.logicproblem")
102 println("Problem created")
103
104 for (var i = 0; i < REPS; i++) {
105
106 println("Run #" + i + ":")
107
108 var ViatraReasoner reasoner = new ViatraReasoner
109
110 // /////////////////////////////////////////////////////
111 // Define Config File
112 val knownIntegers = new TreeSet<Integer>
113 knownIntegers.addAll(0)
114
115 val knownReals = new TreeSet<BigDecimal>
116 knownReals.addAll(new BigDecimal("0.0"))
117
118 val knownStrings = new TreeSet<String>
119 knownStrings.addAll("r0", "r1", "r2")
120
121
122 val solverConfig = new ViatraReasonerConfiguration => [
123 it.runtimeLimit = RUNTIME
124 it.typeScopes.maxNewElements = SIZE
125// it.typeScopes.minNewElements = SIZE
126 if(!knownIntegers.isEmpty) it.typeScopes.knownIntegers = knownIntegers
127 if(!knownReals.isEmpty) it.typeScopes.knownReals = knownReals
128// if(!knownStrings.isEmpty) it.typeScopes.knownStrings = knownStrings
129 ]
130
131 val startTime = System.currentTimeMillis
132 var solution = reasoner.solve(problem, solverConfig, workspace)
133 val totalTime = System.currentTimeMillis-startTime
134
135 println(" Problem Solved")
136 solution.writeStats(totalTime)
137
138 if (solution instanceof ModelResult) {
139 solution.writeRepresentation(workspace, i)
140// solution.writeInterpretation(logic2Ecore, workspace, i, reasoner, modelGenerationProblem)
141 println(" Solution saved and visualised")
142 } else
143 println(" Returned: " + solution.class.simpleName.toString)
144
145
146// println("Stats Created")
147 // Run Garbage Collector
148 val Runtime r = Runtime.getRuntime();
149 r.gc();
150 r.gc();
151 r.gc();
152 Thread.sleep(3000)
153 }
154 println("---End---")
155
156 }
157
158 def static Map<Type, Integer> getTypeMap(Map<Class, Integer> classMap, EcoreMetamodelDescriptor metamodel,
159 Ecore2Logic e2l, Ecore2Logic_Trace trace) {
160 val typeMap = new HashMap<Type, Integer>
161 val listMap = metamodel.classes.toMap[s|s.name]
162
163 for (Class elem : classMap.keySet) {
164 typeMap.put(e2l.TypeofEClass(
165 trace,
166 listMap.get(elem.simpleName)
167 ), classMap.get(elem))
168 }
169 return typeMap
170 }
171
172 def static loadMetamodel(EPackage pckg) {
173 val List<EClass> classes = pckg.getEClassifiers.filter(EClass).toList
174 val List<EEnum> enums = pckg.getEClassifiers.filter(EEnum).toList
175 val List<EEnumLiteral> literals = enums.map[getELiterals].flatten.toList
176 val List<EReference> references = classes.map[getEReferences].flatten.toList
177 val List<EAttribute> attributes = classes.map[getEAttributes].flatten.toList
178 return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes)
179 }
180
181 def static loadPartialModel(ReasonerWorkspace inputs, String path) {
182 Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl())
183 inputs.readModel(EObject, path).eResource.contents
184// inputs.readModel(EObject,"FamInstance.xmi").eResource.allContents.toList
185 }
186
187 def static loadQueries(EcoreMetamodelDescriptor metamodel, IQueryGroup i) {
188 val patterns = i.specifications.toList
189 val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet
190 val derivedFeatures = emptyMap
191 // NO DERIVED FEATURES
192// val derivedFeatures = new LinkedHashMap
193// derivedFeatures.put(i.type,metamodel.attributes.filter[it.name == "type"].head)
194// derivedFeatures.put(i.model,metamodel.references.filter[it.name == "model"].head)
195 val res = new ViatraQuerySetDescriptor(
196 patterns,
197 wfPatterns,
198 derivedFeatures
199 )
200 return res
201 }
202
203 def static writeInterpretation(LogicResult solution, Logic2Ecore logic2Ecore, ReasonerWorkspace workspace, int i,
204 ViatraReasoner reasoner, TracedOutput<LogicProblem, Ecore2Logic_Trace> mgProb) {
205 val interpretations = reasoner.getInterpretations(solution as ModelResult)
206 for (interpIndex : 0 ..< interpretations.size) {
207// val extension b = new LogicStructureBuilder
208// val extension a = new LogicProblemBuilder
209 val interpretation = interpretations.get(interpIndex)
210 val model = logic2Ecore.transformInterpretation(interpretation, mgProb.trace)
211 workspace.writeModel(model, '''solution«i»_«interpIndex».xmi''')
212 }
213 }
214
215 def static writeRepresentation(LogicResult solution, ReasonerWorkspace workspace, int i) {
216 val representations = solution.representation
217 for (representationIndex : 0 ..< representations.size) {
218 val representation = representations.get(representationIndex)
219 if (representation instanceof PartialInterpretation) {
220 val gml = (new PartialInterpretation2Gml).transform(representation)
221 workspace.writeText('''solution«i»_«representationIndex».gml''', gml)
222
223 val png = (new GraphvizVisualiser).visualiseConcretization(representation)
224 png.writeToFile(workspace, '''solution«i»_«representationIndex».png''')
225
226// workspace.writeModel(representation, '''solution«representationIndex».partialintrpretation''')
227 } else {
228 workspace.writeText('''solution«representationIndex».txt''', representation.toString)
229 }
230 }
231 }
232
233 def static writeStats(LogicResult solution, long time) {
234 val stats = solution.statistics
235 println(" Statistics:")
236// for (e : stats.entries.filter[name.substring(0, 9) == "_Solution"]) {
237// println(" " + e.name + ": " + (e as IntStatisticEntry).value + " ms")
238// }
239 println(" \"solve\" time: " + time as double/1000 + " s")
240
241// println("<<End Statistics>>")
242 }
243}