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 | 244 |
1 files changed, 244 insertions, 0 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 new file mode 100644 index 00000000..291b605b --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend | |||
@@ -0,0 +1,244 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition | ||
5 | import java.util.Map | ||
6 | import org.eclipse.emf.ecore.EReference | ||
7 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | ||
8 | import org.eclipse.xtend.lib.annotations.Accessors | ||
9 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery | ||
10 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | ||
12 | import org.eclipse.emf.ecore.EAttribute | ||
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality | ||
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | ||
15 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod | ||
16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult | ||
17 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion | ||
18 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransformedViatraWellformednessConstraint | ||
19 | import java.util.HashMap | ||
20 | import java.util.HashSet | ||
21 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion | ||
22 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation | ||
23 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.DefinedByDerivedFeature | ||
24 | |||
25 | class PatternGenerator { | ||
26 | @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer //= new TypeIndexer(this) | ||
27 | @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(this) | ||
28 | @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(this) | ||
29 | @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) | ||
30 | @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) | ||
31 | @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) | ||
32 | @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) | ||
33 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) | ||
34 | |||
35 | public new(TypeInferenceMethod typeInferenceMethod) { | ||
36 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { | ||
37 | this.typeIndexer = new GenericTypeIndexer(this) | ||
38 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) | ||
39 | } else if(typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { | ||
40 | this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) | ||
41 | this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) | ||
42 | } else { | ||
43 | this.typeIndexer = null | ||
44 | this.typeRefinementGenerator = null | ||
45 | throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') | ||
46 | } | ||
47 | } | ||
48 | |||
49 | public def requiresTypeAnalysis() { | ||
50 | typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis | ||
51 | } | ||
52 | |||
53 | public dispatch def referRelation( | ||
54 | RelationDeclaration referred, | ||
55 | String sourceVariable, | ||
56 | String targetVariable, | ||
57 | Modality modality, | ||
58 | Map<String,PQuery> fqn2PQuery) | ||
59 | { | ||
60 | return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality) | ||
61 | } | ||
62 | public dispatch def referRelation( | ||
63 | RelationDefinition referred, | ||
64 | String sourceVariable, | ||
65 | String targetVariable, | ||
66 | Modality modality, | ||
67 | Map<String,PQuery> fqn2PQuery) | ||
68 | { | ||
69 | val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) | ||
70 | return this.relationDefinitionIndexer.referPattern(pattern,#[sourceVariable,targetVariable],modality,true,false) | ||
71 | } | ||
72 | |||
73 | def public referRelationByName(EReference reference, | ||
74 | String sourceVariable, | ||
75 | String targetVariable, | ||
76 | Modality modality) | ||
77 | { | ||
78 | '''find «modality.name.toLowerCase»InRelation«canonizeName('''inreference «reference.name» «reference.EContainingClass.name»''') | ||
79 | »(problem,interpretation,«sourceVariable»,«targetVariable»);''' | ||
80 | } | ||
81 | |||
82 | def public CharSequence referAttributeByName(EAttribute attribute, | ||
83 | String sourceVariable, | ||
84 | String targetVariable, | ||
85 | Modality modality) | ||
86 | { | ||
87 | throw new UnsupportedOperationException | ||
88 | } | ||
89 | |||
90 | public def canonizeName(String name) { | ||
91 | name.split(' ').join('_') | ||
92 | } | ||
93 | |||
94 | public def lowerMultiplicities(LogicProblem problem) { | ||
95 | problem.assertions.map[annotations].flatten.filter(LowerMultiplicityAssertion).filter[!it.relation.isDerived] | ||
96 | } | ||
97 | public def wfQueries(LogicProblem problem) { | ||
98 | problem.assertions.map[it.annotations] | ||
99 | .flatten | ||
100 | .filter(TransformedViatraWellformednessConstraint) | ||
101 | .map[it.query] | ||
102 | } | ||
103 | public def getContainments(LogicProblem p) { | ||
104 | return p.containmentHierarchies.head.containmentRelations | ||
105 | } | ||
106 | public def getInverseRelations(LogicProblem p) { | ||
107 | val inverseRelations = new HashMap | ||
108 | p.annotations.filter(InverseRelationAssertion).forEach[ | ||
109 | inverseRelations.put(it.inverseA,it.inverseB) | ||
110 | inverseRelations.put(it.inverseB,it.inverseA) | ||
111 | ] | ||
112 | return inverseRelations | ||
113 | } | ||
114 | public def isRepresentative(Relation relation, Relation inverse) { | ||
115 | if(inverse == null) { | ||
116 | return true | ||
117 | } else { | ||
118 | relation.name.compareTo(inverse.name)<1 | ||
119 | } | ||
120 | } | ||
121 | |||
122 | public def isDerived(Relation relation) { | ||
123 | relation.annotations.exists[it instanceof DefinedByDerivedFeature] | ||
124 | } | ||
125 | public def getDerivedDefinition(RelationDeclaration relation) { | ||
126 | relation.annotations.filter(DefinedByDerivedFeature).head.query | ||
127 | } | ||
128 | |||
129 | public def transformBaseProperties( | ||
130 | LogicProblem problem, | ||
131 | PartialInterpretation emptySolution, | ||
132 | Map<String,PQuery> fqn2PQuery, | ||
133 | TypeAnalysisResult typeAnalysisResult | ||
134 | ) { | ||
135 | |||
136 | return ''' | ||
137 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" | ||
138 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" | ||
139 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/language" | ||
140 | |||
141 | ////////// | ||
142 | // 0. Util | ||
143 | ////////// | ||
144 | private pattern interpretation(problem:LogicProblem, interpetation:PartialInterpretation) { | ||
145 | PartialInterpretation.problem(interpetation,problem); | ||
146 | } | ||
147 | |||
148 | ///////////////////////// | ||
149 | // 0.1 Existance | ||
150 | ///////////////////////// | ||
151 | private pattern mustExist(problem:LogicProblem, interpetation:PartialInterpretation, element:DefinedElement) { | ||
152 | find interpretation(problem,interpetation); | ||
153 | LogicProblem.elements(problem,element); | ||
154 | } or { | ||
155 | find interpretation(problem,interpetation); | ||
156 | PartialInterpretation.newElements(interpetation,element); | ||
157 | } | ||
158 | |||
159 | private pattern mayExist(problem:LogicProblem, interpetation:PartialInterpretation, element:DefinedElement) { | ||
160 | find mustExist(problem,interpetation,element); | ||
161 | } or { | ||
162 | find interpretation(problem,interpetation); | ||
163 | neg find closeWorld(interpetation); | ||
164 | PartialInterpretation.openWorldElementPrototype(interpetation,element); | ||
165 | } | ||
166 | |||
167 | private pattern closeWorld(interpetation:PartialInterpretation) { | ||
168 | PartialInterpretation.maxNewElements(interpetation,0); | ||
169 | } | ||
170 | |||
171 | //////////////////////// | ||
172 | // 0.2 Equivalence | ||
173 | //////////////////////// | ||
174 | pattern mayEquivalent(problem:LogicProblem, interpretation:PartialInterpretation, a: DefinedElement, b: DefinedElement) { | ||
175 | find mayExist(problem,interpretation,a); | ||
176 | find mayExist(problem,interpretation,b); | ||
177 | a == b; | ||
178 | } | ||
179 | |||
180 | //////////////////////// | ||
181 | // 0.3 Required Patterns by TypeIndexer | ||
182 | //////////////////////// | ||
183 | «typeIndexer.requiredQueries» | ||
184 | |||
185 | ////////// | ||
186 | // 1. Problem-Specific Base Indexers | ||
187 | ////////// | ||
188 | // 1.1 Type Indexers | ||
189 | ////////// | ||
190 | «typeIndexer.generateInstanceOfQueries(problem,emptySolution,typeAnalysisResult)» | ||
191 | |||
192 | ////////// | ||
193 | // 1.2 Relation Declaration Indexers | ||
194 | ////////// | ||
195 | «relationDeclarationIndexer.generateRelationIndexers(problem,problem.relations.filter(RelationDeclaration),fqn2PQuery)» | ||
196 | |||
197 | ////////// | ||
198 | // 1.3 Relation Definition Indexers | ||
199 | ////////// | ||
200 | «relationDefinitionIndexer.generateRelationDefinitions(problem,problem.relations.filter(RelationDefinition),fqn2PQuery)» | ||
201 | |||
202 | ////////// | ||
203 | // 1.4 Containment Indexer | ||
204 | ////////// | ||
205 | «containmentIndexer.transformContainment(problem,problem.relations,fqn2PQuery)» | ||
206 | |||
207 | ////////// | ||
208 | // 2. Invalidation Indexers | ||
209 | ////////// | ||
210 | // 2.1 Invalidated by WF Queries | ||
211 | ////////// | ||
212 | «invalidIndexer.generateInvalidatedByWfQueries(problem,fqn2PQuery)» | ||
213 | |||
214 | ////////// | ||
215 | // 3. Unfinishedness Indexers | ||
216 | ////////// | ||
217 | // 3.1 Unfinishedness Measured by Multiplicity | ||
218 | ////////// | ||
219 | «unfinishedIndexer.generateUnfinishedMultiplicityQueries(problem,fqn2PQuery)» | ||
220 | |||
221 | ////////// | ||
222 | // 3.2 Unfinishedness Measured by WF Queries | ||
223 | ////////// | ||
224 | «unfinishedIndexer.generateUnfinishedWfQueries(problem,fqn2PQuery)» | ||
225 | |||
226 | ////////// | ||
227 | // 4. Refinement Indexers | ||
228 | ////////// | ||
229 | // 4.1 Object constructors | ||
230 | ////////// | ||
231 | «typeRefinementGenerator.generateRefineObjectQueries(problem,emptySolution,typeAnalysisResult)» | ||
232 | |||
233 | ////////// | ||
234 | // 4.2 Type refinement | ||
235 | ////////// | ||
236 | «typeRefinementGenerator.generateRefineTypeQueries(problem,emptySolution,typeAnalysisResult)» | ||
237 | |||
238 | ////////// | ||
239 | // 4.3 Relation refinement | ||
240 | ////////// | ||
241 | «relationRefinementGenerator.generateRefineReference(problem)» | ||
242 | ''' | ||
243 | } | ||
244 | } | ||