aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend')
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend205
1 files changed, 205 insertions, 0 deletions
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
new file mode 100644
index 00000000..61bd2814
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
@@ -0,0 +1,205 @@
1package modes3.run
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality
8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator
9import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator
10import java.util.Map
11import modes3.Modes3Package
12import modes3.queries.ExtraInputOfTurnout
13import modes3.queries.Output
14import modes3.queries.TurnoutOutput
15import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
16import org.eclipse.xtend2.lib.StringConcatenationClient
17
18class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator {
19 static val MUST_NOT_CONNECTED_TO = "mustNotConnectedTo"
20 static val MUST_NOT_CONNECTED_TO_HELPER = "mustNotConnectedTo_helper"
21 static val MUST_NOT_TURNOUT_OUTPUT = "mustNotTurnoutOutput"
22 static val MUST_NOT_STRAIGHT = "mustNotStraight"
23 static val MUST_NOT_DIVERGENT = "mustNotDivergent"
24
25 val Type segmentType
26 val Type turnoutType
27 val Relation connectedToRelation
28 val Relation straightRelation
29 val Relation divergentRelation
30
31 new(extension Ecore2Logic ecore2Logic, Ecore2Logic_Trace ecore2LogicTrace) {
32 extension val Modes3Package = Modes3Package.eINSTANCE
33 segmentType = ecore2LogicTrace.TypeofEClass(segment)
34 turnoutType = ecore2LogicTrace.TypeofEClass(turnout)
35 connectedToRelation = ecore2LogicTrace.relationOfReference(segment_ConnectedTo)
36 straightRelation = ecore2LogicTrace.relationOfReference(turnout_Straight)
37 divergentRelation = ecore2LogicTrace.relationOfReference(turnout_Divergent)
38 }
39
40 override getMustPatterns() {
41 emptyMap
42 }
43
44 override getMustNotPatterns() {
45 #{
46 connectedToRelation -> MUST_NOT_CONNECTED_TO,
47 straightRelation -> MUST_NOT_STRAIGHT,
48 divergentRelation -> MUST_NOT_DIVERGENT
49 }
50 }
51
52 override getAdditionalPatterns(extension PatternGenerator generator, Map<String, PQuery> fqnToPQuery) {
53 val StringConcatenationClient parameters = '''
54 problem: LogicProblem, interpretation: PartialInterpretation,
55 source: DefinedElement, target: DefinedElement
56 '''
57
58 val StringConcatenationClient commonParameterConstraints = '''
59 find interpretation(problem, interpretation);
60 find mustExist(problem, interpretation, source);
61 find mustExist(problem, interpretation, target);
62 '''
63
64 '''
65 pattern «MUST_NOT_CONNECTED_TO_HELPER»(«parameters») {
66 // connectedToReflexive unit propagation
67 «commonParameterConstraints»
68 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "source")»
69 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
70 source == target;
71 } or {
72 // tooManyInputsOfSegment unit propagation
73 «commonParameterConstraints»
74 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "source")»
75 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
76 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input1")»
77 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input2")»
78 neg «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
79 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input1", "source"], Modality.MUST, true, false)»
80 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input2", "source"], Modality.MUST, true, false)»
81 input1 != input2;
82 input1 != target;
83 input2 != target;
84 } or {
85 // turnoutConnectedToBothOutputs unit propagation 1
86 «commonParameterConstraints»
87 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
88 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
89 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "divergent")»
90 «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)»
91 «referRelation(divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery)»
92 «referRelation(connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery)»
93 } or {
94 // turnoutConnectedToBothOutputs unit propagation 2
95 «commonParameterConstraints»
96 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
97 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
98 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "straight")»
99 «referRelation(straightRelation, "source", "straight", Modality.MUST, fqnToPQuery)»
100 «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)»
101 «referRelation(connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery)»
102 } or {
103 // tooManyExtraInputsOfTurnout unit propagation
104 «commonParameterConstraints»
105 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
106 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
107 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")»
108 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(TurnoutOutput.instance.fullyQualifiedName), #["source", "target"], Modality.MAY, false, false)»
109 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)»
110 target != extraInput;
111 }
112
113 pattern «MUST_NOT_CONNECTED_TO»(«parameters») {
114 find «MUST_NOT_CONNECTED_TO_HELPER»(problem, interpretation, source, target);
115 } or {
116 find «MUST_NOT_CONNECTED_TO_HELPER»(problem, interpretation, target, source);
117 }
118
119 pattern «MUST_NOT_TURNOUT_OUTPUT»(«parameters») {
120 // outputReflexive unit propagation
121 «commonParameterConstraints»
122 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
123 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "target")»
124 source == target;
125 } or {
126 // tooManyInputsOfSegment unit propagation
127 «commonParameterConstraints»
128 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
129 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
130 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input1")»
131 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input2")»
132 neg «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "target")»
133 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input1", "target"], Modality.MUST, true, false)»
134 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input2", "target"], Modality.MUST, true, false)»
135 input1 != input2;
136 input1 != source;
137 input2 != source;
138 }
139
140 pattern «MUST_NOT_STRAIGHT»(«parameters») {
141 find «MUST_NOT_TURNOUT_OUTPUT»(problem, interpretation, source, target);
142 } or {
143 // turnoutOutputsAreSame unit propagation
144 «commonParameterConstraints»
145 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
146 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
147 «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)»
148 } or {
149 // turnoutConnectedToBothOutputs unit propagation
150 «commonParameterConstraints»
151 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
152 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
153 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "divergent")»
154 «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)»
155 «referRelation(divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery)»
156 «referRelation(connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery)»
157 } or {
158 // tooManyExtraInputsOfTurnout unit propagation
159 «commonParameterConstraints»
160 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
161 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
162 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")»
163 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "potentialExtraInput")»
164 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)»
165 «referRelation(connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery)»
166 neg «referRelation(divergentRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery)»
167 extraInput != potentialExtraInput;
168 extraInput != target;
169 potentialExtraInput != target;
170 }
171
172 pattern «MUST_NOT_DIVERGENT»(«parameters») {
173 find «MUST_NOT_TURNOUT_OUTPUT»(problem, interpretation, source, target);
174 } or {
175 // turnoutOutputsAreSame unit propagation
176 «commonParameterConstraints»
177 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
178 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
179 «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)»
180 } or {
181 // turnoutConnectedToBothOutputs unit propagation
182 «commonParameterConstraints»
183 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
184 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
185 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "straight")»
186 «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)»
187 «referRelation(straightRelation, "source", "straight", Modality.MUST, fqnToPQuery)»
188 «referRelation(connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery)»
189 } or {
190 // tooManyExtraInputsOfTurnout unit propagation
191 «commonParameterConstraints»
192 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")»
193 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")»
194 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")»
195 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "potentialExtraInput")»
196 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)»
197 «referRelation(connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery)»
198 neg «referRelation(straightRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery)»
199 extraInput != potentialExtraInput;
200 extraInput != target;
201 potentialExtraInput != target;
202 }
203 '''
204 }
205}