aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend')
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend189
1 files changed, 159 insertions, 30 deletions
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend
index fac7c496..613cb3e4 100644
--- a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend
@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet
5import hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes_Trace 5import hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes_Trace
6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration 7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
8import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
8import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor 9import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
9import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsFactory 10import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsFactory
10import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage 11import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage
@@ -14,6 +15,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage
14import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition 15import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
15import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage 16import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
16import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult 17import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
18import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
17import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic 19import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
18import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration 20import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration
19import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor 21import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
@@ -25,18 +27,38 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePro
25import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic 27import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
26import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink 28import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink
27import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation 29import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation
28import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
29import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage 30import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
30import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml 31import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml
32import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveConfiguration
33import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveElementConfiguration
31import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy 34import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy
32import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner 35import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
33import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration 36import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
37import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.PartialModelAsLogicInterpretation
38import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind
39import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold
34import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser 40import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
35import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace 41import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
36import java.util.List 42import java.util.List
37import modes3.Modes3Factory 43import modes3.Modes3Factory
38import modes3.Modes3Package 44import modes3.Modes3Package
45import modes3.queries.CloseTrains_step_2
46import modes3.queries.CloseTrains_step_3
47import modes3.queries.CloseTrains_step_4
48import modes3.queries.CloseTrains_step_5
49import modes3.queries.CloseTrains_step_6
50import modes3.queries.CloseTrains_step_7
51import modes3.queries.EndOfSiding_step_2
52import modes3.queries.EndOfSiding_step_3
53import modes3.queries.EndOfSiding_step_4
54import modes3.queries.EndOfSiding_step_5
55import modes3.queries.MisalignedTurnout_step_2
56import modes3.queries.MisalignedTurnout_step_3
57import modes3.queries.MisalignedTurnout_step_4
58import modes3.queries.MisalignedTurnout_step_5
39import modes3.queries.Modes3Queries 59import modes3.queries.Modes3Queries
60import modes3.queries.TrainLocations_step_2
61import modes3.queries.TrainLocations_step_3
40import org.eclipse.emf.ecore.EClass 62import org.eclipse.emf.ecore.EClass
41import org.eclipse.emf.ecore.EObject 63import org.eclipse.emf.ecore.EObject
42import org.eclipse.emf.ecore.resource.Resource 64import org.eclipse.emf.ecore.resource.Resource
@@ -92,17 +114,21 @@ class Modes3ModelGenerator {
92 minNewElements = modelSize 114 minNewElements = modelSize
93 maxNewElements = modelSize 115 maxNewElements = modelSize
94 minNewElementsByType => [ 116 minNewElementsByType => [
95// put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), 5) 117// put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.train), modelSize / 5)
118// put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), modelSize / 5)
119// put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.simpleSegment), 3 * modelSize / 5)
96 ] 120 ]
97 maxNewElementsByType => [ 121 maxNewElementsByType => [
98 put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.train), 5) 122 put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.train), modelSize / 5)
99 put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), 5) 123 put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), modelSize / 5)
124 put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.simpleSegment), 3 * modelSize / 5)
100 ] 125 ]
101 ] 126 ]
102 solutionScope => [ 127 solutionScope => [
103 numberOfRequiredSolutions = 1 128 numberOfRequiredSolutions = 1
104 ] 129 ]
105 scopeWeight = 5 130 costObjectives += getObjective(ecore2Logic, metamodelLogic.trace)
131 scopeWeight = 6
106 nameNewElements = false 132 nameNewElements = false
107 typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis 133 typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis
108 stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood 134 stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood
@@ -121,47 +147,60 @@ class Modes3ModelGenerator {
121 val solution = solver.solve(logic.output, config, workspace) 147 val solution = solver.solve(logic.output, config, workspace)
122 if (solution instanceof ModelResult) { 148 if (solution instanceof ModelResult) {
123 println("Saving generated solutions") 149 println("Saving generated solutions")
124 val representations = solution.representation 150 val logic2Ecore = new Logic2Ecore(ecore2Logic)
125 for (representationIndex : 0 ..< representations.size) { 151 val interpretations = solver.getInterpretations(solution)
126 val representation = representations.get(representationIndex) 152 for (representationIndex : 0 ..< interpretations.size) {
153 val interpretation = interpretations.get(representationIndex)
127 val representationNumber = representationIndex + 1 154 val representationNumber = representationIndex + 1
128 if (representation instanceof PartialInterpretation) { 155 if (interpretation instanceof PartialModelAsLogicInterpretation) {
156 val representation = interpretation.partialInterpretation
129 workspace.writeModel(representation, '''solution«representationNumber».partialinterpretation''') 157 workspace.writeModel(representation, '''solution«representationNumber».partialinterpretation''')
130 val partialInterpretation2GML = new PartialInterpretation2Gml 158 val partialInterpretation2GML = new PartialInterpretation2Gml
131 val gml = partialInterpretation2GML.transform(representation) 159 val gml = partialInterpretation2GML.transform(representation)
132 workspace.writeText('''solution«representationNumber».gml''', gml) 160 workspace.writeText('''solution«representationNumber».gml''', gml)
161 val model = logic2Ecore.transformInterpretation(interpretation, metamodelLogic.trace)
162 val iterator = model.eAllContents
163 var int id = 0
164 while (iterator.hasNext) {
165 val obj = iterator.next
166 val idFeature = obj.eClass.EAllAttributes.findFirst[name == 'id']
167 if (idFeature !== null) {
168 obj.eSet(idFeature, id)
169 id++
170 }
171 }
172 workspace.writeModel(model, '''solution«representationNumber».modes3''')
133 if (representation.newElements.size < 160) { 173 if (representation.newElements.size < 160) {
134 if (representation instanceof PartialInterpretation) { 174 val rootType = (representation.problem.types.findFirst [
135 val rootType = (representation.problem.types.findFirst [ 175 name == "Modes3ModelRoot class DefinedPart"
136 name == "Modes3ModelRoot class DefinedPart" 176 ] as TypeDefinition)
137 ] as TypeDefinition) 177 val rootIntepretation = representation.partialtypeinterpratation.filter(
138 val rootIntepretation = representation.partialtypeinterpratation.filter( 178 PartialComplexTypeInterpretation).findFirst [
139 PartialComplexTypeInterpretation).findFirst [ 179 interpretationOf.name == "Modes3ModelRoot class"
140 interpretationOf.name == "Modes3ModelRoot class" 180 ]
181 rootIntepretation.elements.removeAll(rootType.elements)
182 representation.problem.elements.removeAll(rootType.elements)
183 for (relationInterpretation : representation.partialrelationinterpretation) {
184 relationInterpretation.relationlinks.removeIf [ link |
185 if (link instanceof BinaryElementRelationLink) {
186 rootType.elements.contains(link.param1) ||
187 rootType.elements.contains(link.param2)
188 } else {
189 false
190 }
141 ] 191 ]
142 rootIntepretation.elements.removeAll(rootType.elements)
143 representation.problem.elements.removeAll(rootType.elements)
144 for (relationInterpretation : representation.partialrelationinterpretation) {
145 relationInterpretation.relationlinks.removeIf [ link |
146 if (link instanceof BinaryElementRelationLink) {
147 rootType.elements.contains(link.param1) || rootType.elements.contains(link.param2)
148 } else {
149 false
150 }
151 ]
152 }
153 rootType.elements.clear
154 } 192 }
193 rootType.elements.clear
155 val visualiser = new GraphvizVisualiser 194 val visualiser = new GraphvizVisualiser
156 val visualisation = visualiser.visualiseConcretization(representation) 195 val visualisation = visualiser.visualiseConcretization(representation)
157 visualisation.writeToFile(workspace, '''solution«representationNumber».png''') 196 visualisation.writeToFile(workspace, '''solution«representationNumber».png''')
158 } 197 }
159 } else { 198 } else {
160 workspace.writeText('''solution«representationNumber».txt''', representation.toString) 199 workspace.writeText('''solution«representationNumber».txt''', interpretation.toString)
161 } 200 }
162 } 201 }
163 } else { 202 } else {
164 println("Failed to solver problem") 203 println("Failed to solve problem")
165 val partial = logic.output 204 val partial = logic.output
166 workspace.writeModel(partial, "solution.partialinterpretation") 205 workspace.writeModel(partial, "solution.partialinterpretation")
167 } 206 }
@@ -198,6 +237,94 @@ class Modes3ModelGenerator {
198 ) 237 )
199 } 238 }
200 239
240 def getObjective(Ecore2Logic ecore2Logic, Ecore2Logic_Trace ecore2LogicTrace) {
241 new CostObjectiveConfiguration => [
242 switch (monitoringQuery) {
243 case closeTrains: {
244 elements += new CostObjectiveElementConfiguration => [
245 patternQualifiedName = CloseTrains_step_2.instance.fullyQualifiedName
246 weight = 14 + 53 + 11
247 ]
248 elements += new CostObjectiveElementConfiguration => [
249 patternQualifiedName = CloseTrains_step_3.instance.fullyQualifiedName
250 weight = 21 + 14
251 ]
252 elements += new CostObjectiveElementConfiguration => [
253 patternQualifiedName = CloseTrains_step_4.instance.fullyQualifiedName
254 weight = 14 + 44 + 14 + 9
255 ]
256 elements += new CostObjectiveElementConfiguration => [
257 patternQualifiedName = CloseTrains_step_5.instance.fullyQualifiedName
258 weight = 14 + 41 + 11
259 ]
260 elements += new CostObjectiveElementConfiguration => [
261 patternQualifiedName = CloseTrains_step_6.instance.fullyQualifiedName
262 weight = 27
263 ]
264 elements += new CostObjectiveElementConfiguration => [
265 patternQualifiedName = CloseTrains_step_7.instance.fullyQualifiedName
266 weight = 48
267 ]
268 hint = new CloseTrainsObjectiveHint(ecore2Logic, ecore2LogicTrace)
269 }
270 case trainLocations: {
271 elements += new CostObjectiveElementConfiguration => [
272 patternQualifiedName = TrainLocations_step_2.instance.fullyQualifiedName
273 weight = 14 + 53 + 11
274 ]
275 elements += new CostObjectiveElementConfiguration => [
276 patternQualifiedName = TrainLocations_step_3.instance.fullyQualifiedName
277 weight = 48
278 ]
279 hint = new TrainLocationsObjectiveHint(ecore2Logic, ecore2LogicTrace)
280 }
281 case misalignedTurnout: {
282 elements += new CostObjectiveElementConfiguration => [
283 patternQualifiedName = MisalignedTurnout_step_2.instance.fullyQualifiedName
284 weight = 14 + 53 + 11
285 ]
286 elements += new CostObjectiveElementConfiguration => [
287 patternQualifiedName = MisalignedTurnout_step_3.instance.fullyQualifiedName
288 weight = 108
289 ]
290 elements += new CostObjectiveElementConfiguration => [
291 patternQualifiedName = MisalignedTurnout_step_4.instance.fullyQualifiedName
292 weight = 27
293 ]
294 elements += new CostObjectiveElementConfiguration => [
295 patternQualifiedName = MisalignedTurnout_step_5.instance.fullyQualifiedName
296 weight = 48
297 ]
298 hint = new MisalignedTurnoutObjectiveHint(ecore2Logic, ecore2LogicTrace)
299 }
300 case endOfSiding: {
301 elements += new CostObjectiveElementConfiguration => [
302 patternQualifiedName = EndOfSiding_step_2.instance.fullyQualifiedName
303 weight = 14 + 53 + 11
304 ]
305 elements += new CostObjectiveElementConfiguration => [
306 patternQualifiedName = EndOfSiding_step_3.instance.fullyQualifiedName
307 weight = 21 + 14
308 ]
309 elements += new CostObjectiveElementConfiguration => [
310 patternQualifiedName = EndOfSiding_step_4.instance.fullyQualifiedName
311 weight = 14 + 35 + 21 + 15 + 14 + 21 + 15 + 11
312 ]
313 elements += new CostObjectiveElementConfiguration => [
314 patternQualifiedName = EndOfSiding_step_5.instance.fullyQualifiedName
315 weight = 48
316 ]
317 hint = new EndOfSidingObjectiveHint(ecore2Logic, ecore2LogicTrace)
318 }
319 default:
320 throw new IllegalArgumentException("Unknown monitoring query: " + monitoringQuery)
321 }
322 kind = ObjectiveKind.HIGHER_IS_BETTER
323 threshold = ObjectiveThreshold.NO_THRESHOLD
324 findExtremum = true
325 ]
326 }
327
201 def static init() { 328 def static init() {
202 EMFPatternLanguageStandaloneSetup.doSetup 329 EMFPatternLanguageStandaloneSetup.doSetup
203 ViatraQueryEngineOptions.setSystemDefaultBackends(ReteBackendFactory.INSTANCE, ReteBackendFactory.INSTANCE, 330 ViatraQueryEngineOptions.setSystemDefaultBackends(ReteBackendFactory.INSTANCE, ReteBackendFactory.INSTANCE,
@@ -223,6 +350,8 @@ class Modes3ModelGenerator {
223 350
224 private static enum MonitoringQuery { 351 private static enum MonitoringQuery {
225 closeTrains, 352 closeTrains,
353 trainLocations,
354 endOfSiding,
226 misalignedTurnout 355 misalignedTurnout
227 } 356 }
228} 357}