diff options
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.xtend | 158 |
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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns | 1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns |
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion | 3 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion |
4 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference | 4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference |
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference | 5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference |
7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference | 6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference |
@@ -17,7 +16,11 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Transform | |||
17 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality | 16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality |
18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult | 17 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult |
19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod | 18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod |
19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint | ||
20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints | ||
21 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy | ||
20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 22 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
23 | import java.util.Collection | ||
21 | import java.util.HashMap | 24 | import java.util.HashMap |
22 | import java.util.Map | 25 | import java.util.Map |
23 | import org.eclipse.emf.ecore.EAttribute | 26 | import org.eclipse.emf.ecore.EAttribute |
@@ -36,21 +39,23 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint | |||
36 | } | 39 | } |
37 | 40 | ||
38 | class PatternGenerator { | 41 | class 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 | } |