aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend
diff options
context:
space:
mode:
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.xtend183
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
5import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery 5import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery
6import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality 6import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality
7import java.util.Map 7import java.util.Map
8import org.eclipse.emf.common.util.Enumerator
9import org.eclipse.emf.ecore.EAttribute
10import org.eclipse.emf.ecore.EEnumLiteral
11import org.eclipse.emf.ecore.EReference
12import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey
13import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey
14import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey
15import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint
16import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable 8import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
17import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality
18import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter
19import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality
20import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall
21import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint
22import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure 9import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure
23import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue 10import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction
24import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall
25import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint
26import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery 11import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
27 12
28import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* 13import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
29 14
30class RelationDefinitionIndexer { 15class 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