diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend')
-rw-r--r-- | Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend | 183 |
1 files changed, 11 insertions, 172 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend index 0ae28b66..338a9af2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend | |||
@@ -5,39 +5,27 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | |||
5 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery | 5 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery |
6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality | 6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality |
7 | import java.util.Map | 7 | import java.util.Map |
8 | import org.eclipse.emf.common.util.Enumerator | ||
9 | import org.eclipse.emf.ecore.EAttribute | ||
10 | import org.eclipse.emf.ecore.EEnumLiteral | ||
11 | import org.eclipse.emf.ecore.EReference | ||
12 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey | ||
13 | import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey | ||
14 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey | ||
15 | import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint | ||
16 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable | 8 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable |
17 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality | ||
18 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter | ||
19 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality | ||
20 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall | ||
21 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint | ||
22 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure | 9 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure |
23 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue | 10 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction |
24 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall | ||
25 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint | ||
26 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | 11 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery |
27 | 12 | ||
28 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 13 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
29 | 14 | ||
30 | class RelationDefinitionIndexer { | 15 | class RelationDefinitionIndexer { |
31 | val PatternGenerator base; | 16 | public val PatternGenerator base; |
17 | val PConstraintTransformer constraintTransformer; | ||
32 | 18 | ||
33 | new(PatternGenerator base) { | 19 | new(PatternGenerator base) { |
34 | this.base = base | 20 | this.base = base |
21 | this.constraintTransformer = new PConstraintTransformer(this); | ||
35 | } | 22 | } |
36 | 23 | ||
37 | def generateRelationDefinitions( | 24 | def generateRelationDefinitions( |
38 | LogicProblem problem, | 25 | LogicProblem problem, |
39 | Iterable<RelationDefinition> relations, | 26 | Iterable<RelationDefinition> relations, |
40 | Map<String,PQuery> fqn2PQuery) { | 27 | Map<String,PQuery> fqn2PQuery) |
28 | { | ||
41 | val relation2PQuery = relations.toInvertedMap[ | 29 | val relation2PQuery = relations.toInvertedMap[ |
42 | annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) | 30 | annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) |
43 | ] | 31 | ] |
@@ -75,20 +63,21 @@ class RelationDefinitionIndexer { | |||
75 | def String relationDefinitionName(RelationDefinition relation, Modality modality) | 63 | def String relationDefinitionName(RelationDefinition relation, Modality modality) |
76 | '''«modality.name.toLowerCase»InRelation_«base.canonizeName(relation.name)»''' | 64 | '''«modality.name.toLowerCase»InRelation_«base.canonizeName(relation.name)»''' |
77 | 65 | ||
78 | private def canonizeName(PVariable v) { | 66 | def canonizeName(PVariable v) { |
79 | return '''«IF v.referringConstraints.size == 1»_«ENDIF»var_«v.name.replaceAll("\\W","")»''' | 67 | return '''«IF v.referringConstraints.size == 1»_«ENDIF»var_«v.name.replaceAll("\\W","")»''' |
80 | } | 68 | } |
81 | 69 | ||
82 | private def transformPattern(RelationDefinition relation, PQuery p, Modality modality) { | 70 | private def transformPattern(RelationDefinition relation, PQuery p, Modality modality) { |
83 | try { | 71 | try { |
72 | val bodies = (relation.annotations.filter(TransfomedViatraQuery).head.optimizedDisjunction as PDisjunction).bodies | ||
84 | return ''' | 73 | return ''' |
85 | private pattern «relationDefinitionName(relation,modality)»( | 74 | private pattern «relationDefinitionName(relation,modality)»( |
86 | problem:LogicProblem, interpretation:PartialInterpretation, | 75 | problem:LogicProblem, interpretation:PartialInterpretation, |
87 | «FOR param : p.parameters SEPARATOR ', '»var_«param.name»«ENDFOR») | 76 | «FOR param : p.parameters SEPARATOR ', '»var_«param.name»«ENDFOR») |
88 | «FOR body : p.disjunctBodies.bodies SEPARATOR "or"»{ | 77 | «FOR body : bodies SEPARATOR "or"»{ |
89 | find interpretation(problem,interpretation); | 78 | find interpretation(problem,interpretation); |
90 | «FOR constraint : body.constraints» | 79 | «FOR constraint : body.constraints» |
91 | «constraint.transformConstraint(modality)» | 80 | «this.constraintTransformer.transformConstraint(constraint,modality,relation.annotations.filter(TransfomedViatraQuery).head.variableTrace)» |
92 | «ENDFOR» | 81 | «ENDFOR» |
93 | }«ENDFOR» | 82 | }«ENDFOR» |
94 | ''' | 83 | ''' |
@@ -105,7 +94,7 @@ class RelationDefinitionIndexer { | |||
105 | ''' | 94 | ''' |
106 | } | 95 | } |
107 | 96 | ||
108 | private def toMustMay(Modality modality) { | 97 | def toMustMay(Modality modality) { |
109 | if(modality == Modality::MAY) return Modality::MAY | 98 | if(modality == Modality::MAY) return Modality::MAY |
110 | else return Modality::MUST | 99 | else return Modality::MUST |
111 | } | 100 | } |
@@ -113,154 +102,4 @@ class RelationDefinitionIndexer { | |||
113 | def referPattern(PQuery p, String[] variables, Modality modality, boolean positive, boolean transitive) ''' | 102 | def referPattern(PQuery p, String[] variables, Modality modality, boolean positive, boolean transitive) ''' |
114 | «IF !positive»neg «ENDIF»find «IF transitive»twoParam_«ENDIF»«modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(«IF !transitive»problem,interpretation,«ENDIF»«variables.join(',')»); | 103 | «IF !positive»neg «ENDIF»find «IF transitive»twoParam_«ENDIF»«modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(«IF !transitive»problem,interpretation,«ENDIF»«variables.join(',')»); |
115 | ''' | 104 | ''' |
116 | |||
117 | private dispatch def transformConstraint(TypeConstraint constraint, Modality modality) { | ||
118 | val touple = constraint.variablesTuple | ||
119 | if(touple.size == 1) { | ||
120 | val inputKey = constraint.equivalentJudgement.inputKey | ||
121 | if(inputKey instanceof EClassTransitiveInstancesKey) { | ||
122 | return base.typeIndexer.referInstanceOf(inputKey.emfKey,modality.toMustMay, | ||
123 | constraint.getVariableInTuple(0).canonizeName) | ||
124 | } else if(inputKey instanceof EDataTypeInSlotsKey){ | ||
125 | return '''// type constraint is enforced by construction''' | ||
126 | } | ||
127 | |||
128 | } else if(touple.size == 2){ | ||
129 | val key = (constraint.equivalentJudgement.inputKey as EStructuralFeatureInstancesKey).emfKey | ||
130 | if(key instanceof EReference) { | ||
131 | return base.referRelationByName( | ||
132 | key, | ||
133 | constraint.getVariableInTuple(0).canonizeName, | ||
134 | constraint.getVariableInTuple(1).canonizeName, | ||
135 | modality.toMustMay) | ||
136 | } else if (key instanceof EAttribute) { | ||
137 | return base.referAttributeByName(key, | ||
138 | constraint.getVariableInTuple(0).canonizeName, | ||
139 | constraint.getVariableInTuple(1).canonizeName, | ||
140 | modality.toMustMay) | ||
141 | } else throw new UnsupportedOperationException('''unknown key: «key.class»''') | ||
142 | } else { | ||
143 | throw new UnsupportedOperationException('''Unsupported touple size: «touple.size»''') | ||
144 | } | ||
145 | } | ||
146 | private dispatch def transformConstraint(TypeFilterConstraint constraint, Modality modality) { | ||
147 | val touple = constraint.variablesTuple | ||
148 | if(touple.size == 1) { | ||
149 | val inputKey = constraint.equivalentJudgement.inputKey | ||
150 | if(inputKey instanceof EClassTransitiveInstancesKey) { | ||
151 | return base.typeIndexer.referInstanceOf(inputKey.emfKey,modality.toMustMay, | ||
152 | (constraint.getVariablesTuple.get(0) as PVariable).canonizeName) | ||
153 | } else if(inputKey instanceof EDataTypeInSlotsKey){ | ||
154 | return '''// type constraint is enforced by construction''' | ||
155 | } | ||
156 | |||
157 | } else if(touple.size == 2){ | ||
158 | val key = (constraint.equivalentJudgement.inputKey as EStructuralFeatureInstancesKey).emfKey | ||
159 | if(key instanceof EReference) { | ||
160 | return base.referRelationByName( | ||
161 | key, | ||
162 | (constraint.getVariablesTuple.get(0) as PVariable).canonizeName, | ||
163 | (constraint.getVariablesTuple.get(1) as PVariable).canonizeName, | ||
164 | modality.toMustMay) | ||
165 | } else if (key instanceof EAttribute) { | ||
166 | return base.referAttributeByName(key, | ||
167 | (constraint.getVariablesTuple.get(0) as PVariable).canonizeName, | ||
168 | (constraint.getVariablesTuple.get(1) as PVariable).canonizeName, | ||
169 | modality.toMustMay) | ||
170 | } else throw new UnsupportedOperationException('''unknown key: «key.class»''') | ||
171 | } else { | ||
172 | throw new UnsupportedOperationException('''Unsupported touple size: «touple.size»''') | ||
173 | } | ||
174 | } | ||
175 | |||
176 | private dispatch def transformConstraint(Equality equality, Modality modality) { | ||
177 | val a = equality.who | ||
178 | val b = equality.withWhom | ||
179 | transformEquality(modality.toMustMay, a, b) | ||
180 | } | ||
181 | |||
182 | private def CharSequence transformEquality(Modality modality, PVariable a, PVariable b) { | ||
183 | if(modality.isMustOrCurrent) '''find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' | ||
184 | else '''find mayEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' | ||
185 | } | ||
186 | |||
187 | private dispatch def transformConstraint(Inequality inequality, Modality modality) { | ||
188 | val a = inequality.who | ||
189 | val b = inequality.withWhom | ||
190 | if(modality.isCurrent) { | ||
191 | return '''neg find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' | ||
192 | } else if(modality.isMust) { | ||
193 | return '''neg find mayEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' | ||
194 | } else { // modality.isMay | ||
195 | return '''neg find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' | ||
196 | } | ||
197 | } | ||
198 | |||
199 | private dispatch def transformConstraint(NegativePatternCall pcall, Modality modality) { | ||
200 | val params = (0..<pcall.actualParametersTuple.size).map[index | | ||
201 | val variable = pcall.actualParametersTuple.get(index) as PVariable | ||
202 | return variable.canonizeName | ||
203 | ] | ||
204 | return referPattern(pcall.referredQuery,params,modality.dual,false,false) | ||
205 | } | ||
206 | |||
207 | private dispatch def transformConstraint(PositivePatternCall pcall, Modality modality) { | ||
208 | val params = (0..<pcall.variablesTuple.size).map[index | | ||
209 | val variable = pcall.variablesTuple.get(index) as PVariable | ||
210 | return variable.canonizeName | ||
211 | ] | ||
212 | return referPattern(pcall.referredQuery,params,modality,true,false) | ||
213 | } | ||
214 | private dispatch def transformConstraint(BinaryTransitiveClosure pcall, Modality modality) { | ||
215 | val params = (0..1).map[index | | ||
216 | val variable = pcall.getVariableInTuple(index) as PVariable | ||
217 | return variable.canonizeName | ||
218 | ] | ||
219 | return referPattern(pcall.referredQuery,params,modality,true,true) | ||
220 | } | ||
221 | private dispatch def transformConstraint(ExportedParameter e, Modality modality) { | ||
222 | return '''// «e.parameterName» is exported''' | ||
223 | } | ||
224 | private dispatch def transformConstraint(ConstantValue c, Modality modality) { | ||
225 | val target = c.supplierKey | ||
226 | |||
227 | var String targetString; | ||
228 | var String additionalDefinition; | ||
229 | if(target instanceof EEnumLiteral) { | ||
230 | targetString = '''const_«target.name»_«target.EEnum.name»''' | ||
231 | additionalDefinition = '''DefinedElement.name(«targetString»,"«target.name» literal «target.EEnum.name»"); //LogicProblem.elements(problem,«targetString»);''' | ||
232 | } else if(target instanceof Enumerator) { | ||
233 | // XXX We should get the corresponding EEnum name instead of the java class name. | ||
234 | targetString = '''const_«target.name»_«target.class.simpleName»''' | ||
235 | additionalDefinition = '''DefinedElement.name(«targetString»,"«target.name» literal «target.class.simpleName»"); //LogicProblem.elements(problem,«targetString»);''' | ||
236 | } else if(target instanceof Integer) { | ||
237 | targetString = '''const_«target»_Integer''' | ||
238 | additionalDefinition = '''IntegerElement.value(«targetString»,«target»);''' | ||
239 | } else if(target instanceof Boolean) { | ||
240 | targetString = '''const_«target»_Boolean''' | ||
241 | additionalDefinition = '''BooleanElement.value(«targetString»,«target»);''' | ||
242 | } else if(target instanceof String) { | ||
243 | targetString = '''const_«target»_String''' | ||
244 | additionalDefinition = '''StringElement.value(«targetString»,"«target»");''' | ||
245 | } else if(target instanceof Double) { | ||
246 | targetString = '''const_«target»_Number''' | ||
247 | additionalDefinition = '''RealElement.value(«targetString»,"«target»");''' | ||
248 | } else if(target instanceof Float) { | ||
249 | targetString = '''const_«target»_Number''' | ||
250 | additionalDefinition = '''RealElement.value(«targetString»,"«target»");''' | ||
251 | } else { | ||
252 | throw new UnsupportedOperationException('''Unknown constant type: «target.class»''') | ||
253 | } | ||
254 | |||
255 | val source = c.variablesTuple | ||
256 | var String sourceName | ||
257 | if(source.size == 1) | ||
258 | sourceName = (source.get(0) as PVariable).canonizeName | ||
259 | else throw new UnsupportedOperationException("unknown source") | ||
260 | return '''«sourceName» == «targetString»;«additionalDefinition»'''; | ||
261 | } | ||
262 | |||
263 | private dispatch def transformConstraint(PConstraint c, Modality modality) { | ||
264 | throw new UnsupportedOperationException('''Unknown constraint type: "«c.class.name»"!''') | ||
265 | } | ||
266 | } \ No newline at end of file | 105 | } \ No newline at end of file |