aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.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/PatternGenerator.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend158
1 files changed, 82 insertions, 76 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
index 677170b8..f3125b80 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
@@ -1,7 +1,6 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns 1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns
2 2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion 3import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion
4import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference 4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference 5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference 6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference
@@ -17,7 +16,11 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Transform
17import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality 16import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality
18import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult 17import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult
19import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod 18import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod
19import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint
20import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints
21import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy
20import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation 22import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
23import java.util.Collection
21import java.util.HashMap 24import java.util.HashMap
22import java.util.Map 25import java.util.Map
23import org.eclipse.emf.ecore.EAttribute 26import org.eclipse.emf.ecore.EAttribute
@@ -36,21 +39,23 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint
36} 39}
37 40
38class PatternGenerator { 41class PatternGenerator {
39 @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer //= new TypeIndexer(this) 42 @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this)
40 @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(this) 43 @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(
41 @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(this) 44 this)
45 @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(
46 this)
42 @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) 47 @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this)
43 @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) 48 @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this)
44 @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) 49 @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer
45 @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) 50 @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this)
46 @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) 51 @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this)
47 @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) 52 @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this)
48 53
49 public new(TypeInferenceMethod typeInferenceMethod) { 54 public new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) {
50 if(typeInferenceMethod == TypeInferenceMethod.Generic) { 55 if(typeInferenceMethod == TypeInferenceMethod.Generic) {
51 this.typeIndexer = new GenericTypeIndexer(this) 56 this.typeIndexer = new GenericTypeIndexer(this)
52 this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) 57 this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this)
53 } else if(typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { 58 } else if (typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) {
54 this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) 59 this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this)
55 this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) 60 this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this)
56 } else { 61 } else {
@@ -58,110 +63,101 @@ class PatternGenerator {
58 this.typeRefinementGenerator = null 63 this.typeRefinementGenerator = null
59 throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') 64 throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''')
60 } 65 }
66 this.unfinishedIndexer = new UnfinishedIndexer(this, scopePropagatorStrategy.requiresUpperBoundIndexing)
61 } 67 }
62 68
63 public def requiresTypeAnalysis() { 69 def requiresTypeAnalysis() {
64 typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis 70 typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis
65 } 71 }
66 72
67 public dispatch def referRelation( 73 dispatch def CharSequence referRelation(RelationDeclaration referred, String sourceVariable, String targetVariable,
68 RelationDeclaration referred, 74 Modality modality, Map<String, PQuery> fqn2PQuery) {
69 String sourceVariable, 75 return this.relationDeclarationIndexer.referRelation(referred, sourceVariable, targetVariable, modality)
70 String targetVariable,
71 Modality modality,
72 Map<String,PQuery> fqn2PQuery)
73 {
74 return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality)
75 } 76 }
76 public dispatch def referRelation( 77
77 RelationDefinition referred, 78 dispatch def CharSequence referRelation(RelationDefinition referred, String sourceVariable, String targetVariable,
78 String sourceVariable, 79 Modality modality, Map<String, PQuery> fqn2PQuery) {
79 String targetVariable, 80 val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(
80 Modality modality, 81 fqn2PQuery)
81 Map<String,PQuery> fqn2PQuery) 82 return this.relationDefinitionIndexer.referPattern(pattern, #[sourceVariable, targetVariable], modality, true,
82 { 83 false)
83 val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery)
84 return this.relationDefinitionIndexer.referPattern(pattern,#[sourceVariable,targetVariable],modality,true,false)
85 } 84 }
86 85
87 def public referRelationByName(EReference reference, 86 def referRelationByName(EReference reference, String sourceVariable, String targetVariable, Modality modality) {
88 String sourceVariable, 87 '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);'''
89 String targetVariable,
90 Modality modality)
91 {
92 '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''')
93 »(problem,interpretation,«sourceVariable»,«targetVariable»);'''
94 } 88 }
95 89
96 def public CharSequence referAttributeByName(EAttribute attribute, 90 def CharSequence referAttributeByName(EAttribute attribute, String sourceVariable, String targetVariable,
97 String sourceVariable, 91 Modality modality) {
98 String targetVariable, 92 '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);'''
99 Modality modality)
100 {
101 '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''')
102 »(problem,interpretation,«sourceVariable»,«targetVariable»);'''
103 } 93 }
104 94
105 public def canonizeName(String name) { 95 def canonizeName(String name) {
106 name.split(' ').join('_') 96 name.split(' ').join('_')
107 } 97 }
108 98
109 public def lowerMultiplicities(LogicProblem problem) { 99 def wfQueries(LogicProblem problem) {
110 problem.assertions.map[annotations].flatten.filter(LowerMultiplicityAssertion).filter[!it.relation.isDerived] 100 problem.assertions.map[it.annotations].flatten.filter(TransformedViatraWellformednessConstraint).map[it.query]
111 }
112 public def wfQueries(LogicProblem problem) {
113 problem.assertions.map[it.annotations]
114 .flatten
115 .filter(TransformedViatraWellformednessConstraint)
116 .map[it.query]
117 } 101 }
118 public def getContainments(LogicProblem p) { 102
103 def getContainments(LogicProblem p) {
119 return p.containmentHierarchies.head.containmentRelations 104 return p.containmentHierarchies.head.containmentRelations
120 } 105 }
121 public def getInverseRelations(LogicProblem p) { 106
107 def getInverseRelations(LogicProblem p) {
122 val inverseRelations = new HashMap 108 val inverseRelations = new HashMap
123 p.annotations.filter(InverseRelationAssertion).forEach[ 109 p.annotations.filter(InverseRelationAssertion).forEach [
124 inverseRelations.put(it.inverseA,it.inverseB) 110 inverseRelations.put(it.inverseA, it.inverseB)
125 inverseRelations.put(it.inverseB,it.inverseA) 111 inverseRelations.put(it.inverseB, it.inverseA)
126 ] 112 ]
127 return inverseRelations 113 return inverseRelations
128 } 114 }
129 public def isRepresentative(Relation relation, Relation inverse) { 115
130 if(inverse == null) { 116 def isRepresentative(Relation relation, Relation inverse) {
117 if (relation === null) {
118 return false
119 } else if (inverse === null) {
131 return true 120 return true
132 } else { 121 } else {
133 relation.name.compareTo(inverse.name)<1 122 relation.name.compareTo(inverse.name) < 1
134 } 123 }
135 } 124 }
136 125
137 public def isDerived(Relation relation) { 126 def isDerived(Relation relation) {
138 relation.annotations.exists[it instanceof DefinedByDerivedFeature] 127 relation.annotations.exists[it instanceof DefinedByDerivedFeature]
139 } 128 }
140 public def getDerivedDefinition(RelationDeclaration relation) { 129
130 def getDerivedDefinition(RelationDeclaration relation) {
141 relation.annotations.filter(DefinedByDerivedFeature).head.query 131 relation.annotations.filter(DefinedByDerivedFeature).head.query
142 } 132 }
143 133
144 private def allTypeReferences(LogicProblem problem) { 134 private def allTypeReferences(LogicProblem problem) {
145 problem.eAllContents.filter(TypeReference).toIterable 135 problem.eAllContents.filter(TypeReference).toIterable
146 } 136 }
137
147 protected def hasBoolean(LogicProblem problem) { 138 protected def hasBoolean(LogicProblem problem) {
148 problem.allTypeReferences.exists[it instanceof BoolTypeReference] 139 problem.allTypeReferences.exists[it instanceof BoolTypeReference]
149 } 140 }
141
150 protected def hasInteger(LogicProblem problem) { 142 protected def hasInteger(LogicProblem problem) {
151 problem.allTypeReferences.exists[it instanceof IntTypeReference] 143 problem.allTypeReferences.exists[it instanceof IntTypeReference]
152 } 144 }
145
153 protected def hasReal(LogicProblem problem) { 146 protected def hasReal(LogicProblem problem) {
154 problem.allTypeReferences.exists[it instanceof RealTypeReference] 147 problem.allTypeReferences.exists[it instanceof RealTypeReference]
155 } 148 }
149
156 protected def hasString(LogicProblem problem) { 150 protected def hasString(LogicProblem problem) {
157 problem.allTypeReferences.exists[it instanceof StringTypeReference] 151 problem.allTypeReferences.exists[it instanceof StringTypeReference]
158 } 152 }
159 153
160 public def PatternGeneratorResult transformBaseProperties( 154 def transformBaseProperties(
161 LogicProblem problem, 155 LogicProblem problem,
162 PartialInterpretation emptySolution, 156 PartialInterpretation emptySolution,
163 Map<String,PQuery> fqn2PQuery, 157 Map<String, PQuery> fqn2PQuery,
164 TypeAnalysisResult typeAnalysisResult 158 TypeAnalysisResult typeAnalysisResult,
159 RelationConstraints constraints,
160 Collection<LinearTypeConstraintHint> hints
165 ) { 161 ) {
166 val first = 162 val first =
167 ''' 163 '''
@@ -199,7 +195,7 @@ class PatternGenerator {
199 195
200 private pattern elementCloseWorld(element:DefinedElement) { 196 private pattern elementCloseWorld(element:DefinedElement) {
201 PartialInterpretation.openWorldElements(i,element); 197 PartialInterpretation.openWorldElements(i,element);
202 PartialInterpretation.maxNewElements(i,0); 198 PartialInterpretation.maxNewElements(i,0);
203 } or { 199 } or {
204 Scope.targetTypeInterpretation(scope,interpretation); 200 Scope.targetTypeInterpretation(scope,interpretation);
205 PartialTypeInterpratation.elements(interpretation,element); 201 PartialTypeInterpratation.elements(interpretation,element);
@@ -288,7 +284,9 @@ class PatternGenerator {
288 ////////// 284 //////////
289 // 1.1.1 Required Patterns by TypeIndexer 285 // 1.1.1 Required Patterns by TypeIndexer
290 ////////// 286 //////////
287
291 «typeIndexer.requiredQueries» 288 «typeIndexer.requiredQueries»
289
292 ////////// 290 //////////
293 // 1.1.2 primitive Type Indexers 291 // 1.1.2 primitive Type Indexers
294 ////////// 292 //////////
@@ -306,6 +304,7 @@ class PatternGenerator {
306 // > StringElement.value(variableName,value) 304 // > StringElement.value(variableName,value)
307 // Whether a value is set is defined by: 305 // Whether a value is set is defined by:
308 // > PrimitiveElement.valueSet(variableName,isFilled); 306 // > PrimitiveElement.valueSet(variableName,isFilled);
307
309 ////////// 308 //////////
310 // 1.1.3 domain-specific Type Indexers 309 // 1.1.3 domain-specific Type Indexers
311 ////////// 310 //////////
@@ -338,7 +337,7 @@ class PatternGenerator {
338 ////////// 337 //////////
339 // 3.1 Unfinishedness Measured by Multiplicity 338 // 3.1 Unfinishedness Measured by Multiplicity
340 ////////// 339 //////////
341 «unfinishedIndexer.generateUnfinishedMultiplicityQueries(problem,fqn2PQuery)» 340 «unfinishedIndexer.generateUnfinishedMultiplicityQueries(constraints.multiplicityConstraints,fqn2PQuery)»
342 341
343 ////////// 342 //////////
344 // 3.2 Unfinishedness Measured by WF Queries 343 // 3.2 Unfinishedness Measured by WF Queries
@@ -363,11 +362,18 @@ class PatternGenerator {
363 «relationRefinementGenerator.generateRefineReference(problem)» 362 «relationRefinementGenerator.generateRefineReference(problem)»
364 363
365 ////////// 364 //////////
366 // 5 Unit Propagations 365 // 5 Hints
366 //////////
367 «FOR hint : hints»
368 «hint.getAdditionalPatterns(this)»
369 «ENDFOR»
370
371 //////////
372 // 6 Unit Propagations
367 ////////// 373 //////////
368 ''' 374 '''
369 val up = unitPropagationPreconditionGenerator.generateUnitPropagationRules(problem,problem.relations.filter(RelationDefinition),fqn2PQuery) 375 val up = unitPropagationPreconditionGenerator.generateUnitPropagationRules(problem,problem.relations.filter(RelationDefinition),fqn2PQuery)
370 val second = up.definitions 376 val second = up.definitions
371 return new PatternGeneratorResult(first+second,up.constraint2MustPreconditionName,up.constraint2CurrentPreconditionName) 377 return new PatternGeneratorResult(first+second,up.constraint2MustPreconditionName,up.constraint2CurrentPreconditionName)
372 } 378 }
373} 379}