diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns')
5 files changed, 355 insertions, 238 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 24b3e870..1b0db90e 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,6 +16,7 @@ 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.RelationConstraints | ||
20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
21 | import java.util.HashMap | 21 | import java.util.HashMap |
22 | import java.util.Map | 22 | import java.util.Map |
@@ -26,22 +26,26 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | |||
26 | import org.eclipse.xtend.lib.annotations.Accessors | 26 | import org.eclipse.xtend.lib.annotations.Accessors |
27 | 27 | ||
28 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 28 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
29 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy | ||
29 | 30 | ||
30 | class PatternGenerator { | 31 | class PatternGenerator { |
31 | @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer //= new TypeIndexer(this) | 32 | @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this) |
32 | @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(this) | 33 | @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer( |
33 | @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(this) | 34 | this) |
35 | @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer( | ||
36 | this) | ||
34 | @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) | 37 | @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) |
35 | @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) | 38 | @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) |
36 | @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) | 39 | @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer |
37 | @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) | 40 | @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator // = new RefinementGenerator(this) |
38 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) | 41 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator( |
39 | 42 | this) | |
40 | public new(TypeInferenceMethod typeInferenceMethod) { | 43 | |
41 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { | 44 | new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { |
45 | if (typeInferenceMethod == TypeInferenceMethod.Generic) { | ||
42 | this.typeIndexer = new GenericTypeIndexer(this) | 46 | this.typeIndexer = new GenericTypeIndexer(this) |
43 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) | 47 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) |
44 | } else if(typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { | 48 | } else if (typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { |
45 | this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) | 49 | this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) |
46 | this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) | 50 | this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) |
47 | } else { | 51 | } else { |
@@ -49,112 +53,100 @@ class PatternGenerator { | |||
49 | this.typeRefinementGenerator = null | 53 | this.typeRefinementGenerator = null |
50 | throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') | 54 | throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') |
51 | } | 55 | } |
56 | this.unfinishedIndexer = new UnfinishedIndexer(this, scopePropagatorStrategy.requiresUpperBoundIndexing) | ||
52 | } | 57 | } |
53 | 58 | ||
54 | public def requiresTypeAnalysis() { | 59 | def requiresTypeAnalysis() { |
55 | typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis | 60 | typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis |
56 | } | 61 | } |
57 | 62 | ||
58 | public dispatch def CharSequence referRelation( | 63 | dispatch def CharSequence referRelation(RelationDeclaration referred, String sourceVariable, String targetVariable, |
59 | RelationDeclaration referred, | 64 | Modality modality, Map<String, PQuery> fqn2PQuery) { |
60 | String sourceVariable, | 65 | return this.relationDeclarationIndexer.referRelation(referred, sourceVariable, targetVariable, modality) |
61 | String targetVariable, | ||
62 | Modality modality, | ||
63 | Map<String,PQuery> fqn2PQuery) | ||
64 | { | ||
65 | return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality) | ||
66 | } | 66 | } |
67 | public dispatch def CharSequence referRelation( | 67 | |
68 | RelationDefinition referred, | 68 | dispatch def CharSequence referRelation(RelationDefinition referred, String sourceVariable, String targetVariable, |
69 | String sourceVariable, | 69 | Modality modality, Map<String, PQuery> fqn2PQuery) { |
70 | String targetVariable, | 70 | val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup( |
71 | Modality modality, | 71 | fqn2PQuery) |
72 | Map<String,PQuery> fqn2PQuery) | 72 | return this.relationDefinitionIndexer.referPattern(pattern, #[sourceVariable, targetVariable], modality, true, |
73 | { | 73 | false) |
74 | val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) | ||
75 | return this.relationDefinitionIndexer.referPattern(pattern,#[sourceVariable,targetVariable],modality,true,false) | ||
76 | } | 74 | } |
77 | 75 | ||
78 | def public referRelationByName(EReference reference, | 76 | def referRelationByName(EReference reference, String sourceVariable, String targetVariable, Modality modality) { |
79 | String sourceVariable, | 77 | '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);''' |
80 | String targetVariable, | ||
81 | Modality modality) | ||
82 | { | ||
83 | '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''') | ||
84 | »(problem,interpretation,«sourceVariable»,«targetVariable»);''' | ||
85 | } | 78 | } |
86 | 79 | ||
87 | def public CharSequence referAttributeByName(EAttribute attribute, | 80 | def CharSequence referAttributeByName(EAttribute attribute, String sourceVariable, String targetVariable, |
88 | String sourceVariable, | 81 | Modality modality) { |
89 | String targetVariable, | 82 | '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);''' |
90 | Modality modality) | ||
91 | { | ||
92 | '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''') | ||
93 | »(problem,interpretation,«sourceVariable»,«targetVariable»);''' | ||
94 | } | 83 | } |
95 | 84 | ||
96 | public def canonizeName(String name) { | 85 | def canonizeName(String name) { |
97 | name.split(' ').join('_') | 86 | name.split(' ').join('_') |
98 | } | 87 | } |
99 | 88 | ||
100 | public def lowerMultiplicities(LogicProblem problem) { | 89 | def wfQueries(LogicProblem problem) { |
101 | problem.assertions.map[annotations].flatten.filter(LowerMultiplicityAssertion).filter[!it.relation.isDerived] | 90 | problem.assertions.map[it.annotations].flatten.filter(TransformedViatraWellformednessConstraint).map[it.query] |
102 | } | ||
103 | public def wfQueries(LogicProblem problem) { | ||
104 | problem.assertions.map[it.annotations] | ||
105 | .flatten | ||
106 | .filter(TransformedViatraWellformednessConstraint) | ||
107 | .map[it.query] | ||
108 | } | 91 | } |
109 | public def getContainments(LogicProblem p) { | 92 | |
93 | def getContainments(LogicProblem p) { | ||
110 | return p.containmentHierarchies.head.containmentRelations | 94 | return p.containmentHierarchies.head.containmentRelations |
111 | } | 95 | } |
112 | public def getInverseRelations(LogicProblem p) { | 96 | |
97 | def getInverseRelations(LogicProblem p) { | ||
113 | val inverseRelations = new HashMap | 98 | val inverseRelations = new HashMap |
114 | p.annotations.filter(InverseRelationAssertion).forEach[ | 99 | p.annotations.filter(InverseRelationAssertion).forEach [ |
115 | inverseRelations.put(it.inverseA,it.inverseB) | 100 | inverseRelations.put(it.inverseA, it.inverseB) |
116 | inverseRelations.put(it.inverseB,it.inverseA) | 101 | inverseRelations.put(it.inverseB, it.inverseA) |
117 | ] | 102 | ] |
118 | return inverseRelations | 103 | return inverseRelations |
119 | } | 104 | } |
120 | public def isRepresentative(Relation relation, Relation inverse) { | 105 | |
121 | if(inverse == null) { | 106 | def isRepresentative(Relation relation, Relation inverse) { |
107 | if (inverse === null) { | ||
122 | return true | 108 | return true |
123 | } else { | 109 | } else { |
124 | relation.name.compareTo(inverse.name)<1 | 110 | relation.name.compareTo(inverse.name) < 1 |
125 | } | 111 | } |
126 | } | 112 | } |
127 | 113 | ||
128 | public def isDerived(Relation relation) { | 114 | def isDerived(Relation relation) { |
129 | relation.annotations.exists[it instanceof DefinedByDerivedFeature] | 115 | relation.annotations.exists[it instanceof DefinedByDerivedFeature] |
130 | } | 116 | } |
131 | public def getDerivedDefinition(RelationDeclaration relation) { | 117 | |
118 | def getDerivedDefinition(RelationDeclaration relation) { | ||
132 | relation.annotations.filter(DefinedByDerivedFeature).head.query | 119 | relation.annotations.filter(DefinedByDerivedFeature).head.query |
133 | } | 120 | } |
134 | 121 | ||
135 | private def allTypeReferences(LogicProblem problem) { | 122 | private def allTypeReferences(LogicProblem problem) { |
136 | problem.eAllContents.filter(TypeReference).toIterable | 123 | problem.eAllContents.filter(TypeReference).toIterable |
137 | } | 124 | } |
125 | |||
138 | protected def hasBoolean(LogicProblem problem) { | 126 | protected def hasBoolean(LogicProblem problem) { |
139 | problem.allTypeReferences.exists[it instanceof BoolTypeReference] | 127 | problem.allTypeReferences.exists[it instanceof BoolTypeReference] |
140 | } | 128 | } |
129 | |||
141 | protected def hasInteger(LogicProblem problem) { | 130 | protected def hasInteger(LogicProblem problem) { |
142 | problem.allTypeReferences.exists[it instanceof IntTypeReference] | 131 | problem.allTypeReferences.exists[it instanceof IntTypeReference] |
143 | } | 132 | } |
133 | |||
144 | protected def hasReal(LogicProblem problem) { | 134 | protected def hasReal(LogicProblem problem) { |
145 | problem.allTypeReferences.exists[it instanceof RealTypeReference] | 135 | problem.allTypeReferences.exists[it instanceof RealTypeReference] |
146 | } | 136 | } |
137 | |||
147 | protected def hasString(LogicProblem problem) { | 138 | protected def hasString(LogicProblem problem) { |
148 | problem.allTypeReferences.exists[it instanceof StringTypeReference] | 139 | problem.allTypeReferences.exists[it instanceof StringTypeReference] |
149 | } | 140 | } |
150 | 141 | ||
151 | public def transformBaseProperties( | 142 | def transformBaseProperties( |
152 | LogicProblem problem, | 143 | LogicProblem problem, |
153 | PartialInterpretation emptySolution, | 144 | PartialInterpretation emptySolution, |
154 | Map<String,PQuery> fqn2PQuery, | 145 | Map<String, PQuery> fqn2PQuery, |
155 | TypeAnalysisResult typeAnalysisResult | 146 | TypeAnalysisResult typeAnalysisResult, |
147 | RelationConstraints constraints | ||
156 | ) { | 148 | ) { |
157 | 149 | ||
158 | return ''' | 150 | return ''' |
159 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" | 151 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" |
160 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" | 152 | import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" |
@@ -188,7 +180,7 @@ class PatternGenerator { | |||
188 | 180 | ||
189 | private pattern elementCloseWorld(element:DefinedElement) { | 181 | private pattern elementCloseWorld(element:DefinedElement) { |
190 | PartialInterpretation.openWorldElements(i,element); | 182 | PartialInterpretation.openWorldElements(i,element); |
191 | PartialInterpretation.maxNewElements(i,0); | 183 | PartialInterpretation.maxNewElements(i,0); |
192 | } or { | 184 | } or { |
193 | Scope.targetTypeInterpretation(scope,interpretation); | 185 | Scope.targetTypeInterpretation(scope,interpretation); |
194 | PartialTypeInterpratation.elements(interpretation,element); | 186 | PartialTypeInterpratation.elements(interpretation,element); |
@@ -221,7 +213,7 @@ class PatternGenerator { | |||
221 | ////////// | 213 | ////////// |
222 | // 1.1.1 primitive Type Indexers | 214 | // 1.1.1 primitive Type Indexers |
223 | ////////// | 215 | ////////// |
224 | ««« pattern instanceofBoolean(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { | 216 | ««« pattern instanceofBoolean(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { |
225 | ««« find interpretation(problem,interpretation); | 217 | ««« find interpretation(problem,interpretation); |
226 | ««« PartialInterpretation.booleanelements(interpretation,element); | 218 | ««« PartialInterpretation.booleanelements(interpretation,element); |
227 | ««« } | 219 | ««« } |
@@ -279,7 +271,7 @@ class PatternGenerator { | |||
279 | ////////// | 271 | ////////// |
280 | // 3.1 Unfinishedness Measured by Multiplicity | 272 | // 3.1 Unfinishedness Measured by Multiplicity |
281 | ////////// | 273 | ////////// |
282 | «unfinishedIndexer.generateUnfinishedMultiplicityQueries(problem,fqn2PQuery)» | 274 | «unfinishedIndexer.generateUnfinishedMultiplicityQueries(constraints.multiplicityConstraints,fqn2PQuery)» |
283 | 275 | ||
284 | ////////// | 276 | ////////// |
285 | // 3.2 Unfinishedness Measured by WF Queries | 277 | // 3.2 Unfinishedness Measured by WF Queries |
@@ -302,6 +294,6 @@ class PatternGenerator { | |||
302 | // 4.3 Relation refinement | 294 | // 4.3 Relation refinement |
303 | ////////// | 295 | ////////// |
304 | «relationRefinementGenerator.generateRefineReference(problem)» | 296 | «relationRefinementGenerator.generateRefineReference(problem)» |
305 | ''' | 297 | ''' |
306 | } | 298 | } |
307 | } | 299 | } |
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend index e87f52af..90f79810 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend | |||
@@ -10,6 +10,8 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStati | |||
10 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysis | 10 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysis |
11 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult | 11 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult |
12 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod | 12 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod |
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints | ||
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationMultiplicityConstraint | ||
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util.ParseUtil | 15 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util.ParseUtil |
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
15 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace | 17 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace |
@@ -23,78 +25,96 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | |||
23 | import org.eclipse.xtend.lib.annotations.Data | 25 | import org.eclipse.xtend.lib.annotations.Data |
24 | 26 | ||
25 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 27 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
28 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy | ||
26 | 29 | ||
27 | @Data class GeneratedPatterns { | 30 | @Data |
28 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWFQueries | 31 | class GeneratedPatterns { |
29 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWFQueries | 32 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWFQueries |
30 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedMulticiplicityQueries | 33 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWFQueries |
31 | public Map<ObjectCreationPrecondition, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refineObjectQueries | 34 | public Map<RelationMultiplicityConstraint, UnifinishedMultiplicityQueries> multiplicityConstraintQueries |
32 | public Map<? extends Type, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refineTypeQueries | 35 | public Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedMulticiplicityQueries |
33 | public Map<Pair<RelationDeclaration, Relation>, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refinerelationQueries | 36 | public Map<ObjectCreationPrecondition, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refineObjectQueries |
37 | public Map<? extends Type, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refineTypeQueries | ||
38 | public Map<Pair<RelationDeclaration, Relation>, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> refinerelationQueries | ||
34 | public Map<RelationDefinition, ModalPatternQueries> modalRelationQueries | 39 | public Map<RelationDefinition, ModalPatternQueries> modalRelationQueries |
35 | public Collection<IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allQueries | 40 | public Collection<IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allQueries |
36 | } | 41 | } |
37 | 42 | ||
38 | @Data class ModalPatternQueries { | 43 | @Data |
44 | class ModalPatternQueries { | ||
39 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mayQuery | 45 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mayQuery |
40 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mustQuery | 46 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mustQuery |
41 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> currentQuery | 47 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> currentQuery |
42 | } | 48 | } |
43 | 49 | ||
50 | @Data | ||
51 | class UnifinishedMultiplicityQueries { | ||
52 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> unfinishedMultiplicityQuery | ||
53 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> unrepairableMultiplicityQuery | ||
54 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> remainingInverseMultiplicityQuery | ||
55 | val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> remainingContentsQuery | ||
56 | } | ||
57 | |||
44 | class PatternProvider { | 58 | class PatternProvider { |
45 | 59 | ||
46 | val TypeAnalysis typeAnalysis = new TypeAnalysis | 60 | val TypeAnalysis typeAnalysis = new TypeAnalysis |
47 | 61 | ||
48 | public def generateQueries( | 62 | def generateQueries(LogicProblem problem, PartialInterpretation emptySolution, ModelGenerationStatistics statistics, |
49 | LogicProblem problem, | 63 | Set<PQuery> existingQueries, ReasonerWorkspace workspace, TypeInferenceMethod typeInferenceMethod, |
50 | PartialInterpretation emptySolution, | 64 | ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, boolean writeToFile) { |
51 | ModelGenerationStatistics statistics, | ||
52 | Set<PQuery> existingQueries, | ||
53 | ReasonerWorkspace workspace, | ||
54 | TypeInferenceMethod typeInferenceMethod, | ||
55 | boolean writeToFile) | ||
56 | { | ||
57 | val fqn2Query = existingQueries.toMap[it.fullyQualifiedName] | 65 | val fqn2Query = existingQueries.toMap[it.fullyQualifiedName] |
58 | val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod) | 66 | val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod, scopePropagatorStrategy) |
59 | val typeAnalysisResult = if(patternGenerator.requiresTypeAnalysis) { | 67 | val typeAnalysisResult = if (patternGenerator.requiresTypeAnalysis) { |
60 | val startTime = System.nanoTime | 68 | val startTime = System.nanoTime |
61 | val result = typeAnalysis.performTypeAnalysis(problem,emptySolution) | 69 | val result = typeAnalysis.performTypeAnalysis(problem, emptySolution) |
62 | val typeAnalysisTime = System.nanoTime - startTime | 70 | val typeAnalysisTime = System.nanoTime - startTime |
63 | statistics.PreliminaryTypeAnalisisTime = typeAnalysisTime | 71 | statistics.PreliminaryTypeAnalisisTime = typeAnalysisTime |
64 | result | 72 | result |
65 | } else { | 73 | } else { |
66 | null | 74 | null |
67 | } | 75 | } |
68 | val baseIndexerFile = patternGenerator.transformBaseProperties(problem,emptySolution,fqn2Query,typeAnalysisResult) | 76 | val baseIndexerFile = patternGenerator.transformBaseProperties(problem, emptySolution, fqn2Query, |
69 | if(writeToFile) { | 77 | typeAnalysisResult, relationConstraints) |
70 | workspace.writeText('''generated3valued.vql_deactivated''',baseIndexerFile) | 78 | if (writeToFile) { |
79 | workspace.writeText('''generated3valued.vql_deactivated''', baseIndexerFile) | ||
71 | } | 80 | } |
72 | val ParseUtil parseUtil = new ParseUtil | 81 | val ParseUtil parseUtil = new ParseUtil |
73 | val generatedQueries = parseUtil.parse(baseIndexerFile) | 82 | val generatedQueries = parseUtil.parse(baseIndexerFile) |
74 | val runtimeQueries = calclulateRuntimeQueries(patternGenerator,problem,emptySolution,typeAnalysisResult,generatedQueries); | 83 | val runtimeQueries = calclulateRuntimeQueries(patternGenerator, problem, emptySolution, typeAnalysisResult, |
84 | relationConstraints, generatedQueries) | ||
75 | return runtimeQueries | 85 | return runtimeQueries |
76 | } | 86 | } |
77 | 87 | ||
78 | private def GeneratedPatterns calclulateRuntimeQueries( | 88 | private def GeneratedPatterns calclulateRuntimeQueries( |
79 | PatternGenerator patternGenerator, | 89 | PatternGenerator patternGenerator, |
80 | LogicProblem problem, | 90 | LogicProblem problem, |
81 | PartialInterpretation emptySolution, | 91 | PartialInterpretation emptySolution, |
82 | TypeAnalysisResult typeAnalysisResult, | 92 | TypeAnalysisResult typeAnalysisResult, |
93 | RelationConstraints relationConstraints, | ||
83 | Map<String, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> queries | 94 | Map<String, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> queries |
84 | ) { | 95 | ) { |
85 | val Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 96 | val invalidWFQueries = patternGenerator.invalidIndexer.getInvalidateByWfQueryNames(problem).mapValues [ |
86 | invalidWFQueries = patternGenerator.invalidIndexer.getInvalidateByWfQueryNames(problem).mapValues[it.lookup(queries)] | 97 | it.lookup(queries) |
87 | val Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 98 | ] |
88 | unfinishedWFQueries = patternGenerator.unfinishedIndexer.getUnfinishedWFQueryNames(problem).mapValues[it.lookup(queries)] | 99 | val unfinishedWFQueries = patternGenerator.unfinishedIndexer.getUnfinishedWFQueryNames(problem).mapValues [ |
89 | val Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 100 | it.lookup(queries) |
90 | unfinishedMultiplicityQueries = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries(problem).mapValues[it.lookup(queries)] | 101 | ] |
91 | val Map<ObjectCreationPrecondition, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 102 | val multiplicityConstraintQueries = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries( |
92 | refineObjectsQueries = patternGenerator.typeRefinementGenerator.getRefineObjectQueryNames(problem,emptySolution,typeAnalysisResult).mapValues[it.lookup(queries)] | 103 | relationConstraints.multiplicityConstraints).mapValues [ |
93 | val Map<? extends Type, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 104 | new UnifinishedMultiplicityQueries(unfinishedMultiplicityQueryName?.lookup(queries), |
94 | refineTypeQueries = patternGenerator.typeRefinementGenerator.getRefineTypeQueryNames(problem,emptySolution,typeAnalysisResult).mapValues[it.lookup(queries)] | 105 | unrepairableMultiplicityQueryName?.lookup(queries), |
95 | val Map<Pair<RelationDeclaration, Relation>, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> | 106 | remainingInverseMultiplicityQueryName?.lookup(queries), remainingContentsQueryName?.lookup(queries)) |
96 | refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)] | 107 | ] |
97 | val Map<RelationDefinition, ModalPatternQueries> modalRelationQueries = problem.relations.filter(RelationDefinition).toMap([it], [ relationDefinition | | 108 | val unfinishedMultiplicityQueries = multiplicityConstraintQueries.entrySet.filter [ |
109 | value.unfinishedMultiplicityQuery !== null | ||
110 | ].toMap([key.relation], [value.unfinishedMultiplicityQuery]) | ||
111 | val refineObjectsQueries = patternGenerator.typeRefinementGenerator. | ||
112 | getRefineObjectQueryNames(problem, emptySolution, typeAnalysisResult).mapValues[it.lookup(queries)] | ||
113 | val refineTypeQueries = patternGenerator.typeRefinementGenerator.getRefineTypeQueryNames(problem, emptySolution, | ||
114 | typeAnalysisResult).mapValues[it.lookup(queries)] | ||
115 | val refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem). | ||
116 | mapValues[it.lookup(queries)] | ||
117 | val modalRelationQueries = problem.relations.filter(RelationDefinition).toMap([it], [ relationDefinition | | ||
98 | val indexer = patternGenerator.relationDefinitionIndexer | 118 | val indexer = patternGenerator.relationDefinitionIndexer |
99 | new ModalPatternQueries( | 119 | new ModalPatternQueries( |
100 | indexer.relationDefinitionName(relationDefinition, Modality.MAY).lookup(queries), | 120 | indexer.relationDefinitionName(relationDefinition, Modality.MAY).lookup(queries), |
@@ -105,6 +125,7 @@ class PatternProvider { | |||
105 | return new GeneratedPatterns( | 125 | return new GeneratedPatterns( |
106 | invalidWFQueries, | 126 | invalidWFQueries, |
107 | unfinishedWFQueries, | 127 | unfinishedWFQueries, |
128 | multiplicityConstraintQueries, | ||
108 | unfinishedMultiplicityQueries, | 129 | unfinishedMultiplicityQueries, |
109 | refineObjectsQueries, | 130 | refineObjectsQueries, |
110 | refineTypeQueries, | 131 | refineTypeQueries, |
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index f9e9baea..fa73c861 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend | |||
@@ -9,77 +9,71 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | |||
9 | 9 | ||
10 | class RelationRefinementGenerator { | 10 | class RelationRefinementGenerator { |
11 | PatternGenerator base; | 11 | PatternGenerator base; |
12 | |||
12 | public new(PatternGenerator base) { | 13 | public new(PatternGenerator base) { |
13 | this.base = base | 14 | this.base = base |
14 | } | 15 | } |
15 | 16 | ||
16 | def CharSequence generateRefineReference(LogicProblem p) { | 17 | def CharSequence generateRefineReference(LogicProblem p) ''' |
17 | return ''' | 18 | «FOR relationRefinement : this.getRelationRefinements(p)» |
18 | «FOR relationRefinement: this.getRelationRefinements(p)» | 19 | pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( |
19 | pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( | 20 | problem:LogicProblem, interpretation:PartialInterpretation, |
20 | problem:LogicProblem, interpretation:PartialInterpretation, | 21 | relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value !== null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», |
21 | relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value != null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», | 22 | from: DefinedElement, to: DefinedElement) |
22 | from: DefinedElement, to: DefinedElement) | 23 | { |
23 | { | 24 | find interpretation(problem,interpretation); |
24 | find interpretation(problem,interpretation); | 25 | PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); |
25 | PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); | 26 | PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); |
26 | PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); | 27 | «IF relationRefinement.value !== null» |
27 | «IF relationRefinement.value != null» | 28 | PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); |
28 | PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); | 29 | PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); |
29 | PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); | 30 | «ENDIF» |
30 | «ENDIF» | 31 | find mustExist(problem, interpretation, from); |
31 | find mustExist(problem, interpretation, from); | 32 | find mustExist(problem, interpretation, to); |
32 | find mustExist(problem, interpretation, to); | 33 | «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» |
33 | «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» | 34 | «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» |
34 | «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» | 35 | «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» |
35 | «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» | 36 | neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» |
36 | neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» | 37 | } |
37 | } | ||
38 | «ENDFOR» | 38 | «ENDFOR» |
39 | ''' | 39 | ''' |
40 | } | 40 | |
41 | |||
42 | def String relationRefinementQueryName(RelationDeclaration relation, Relation inverseRelation) { | 41 | def String relationRefinementQueryName(RelationDeclaration relation, Relation inverseRelation) { |
43 | '''«IF inverseRelation != null | 42 | '''«IF inverseRelation !== null»refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelation.name)»«ELSE»refineRelation_«base.canonizeName(relation.name)»«ENDIF»''' |
44 | »refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelation.name)»« | ||
45 | ELSE | ||
46 | »refineRelation_«base.canonizeName(relation.name)»«ENDIF»''' | ||
47 | } | 43 | } |
48 | 44 | ||
49 | def referRefinementQuery(RelationDeclaration relation, Relation inverseRelation, String relInterpretationName, | 45 | def referRefinementQuery(RelationDeclaration relation, Relation inverseRelation, String relInterpretationName, |
50 | String inverseInterpretationName, String sourceName, String targetName) | 46 | String inverseInterpretationName, String sourceName, |
51 | '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation != null»inverseInterpretationName, «ENDIF»«sourceName», «targetName»);''' | 47 | String targetName) '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation !== null»inverseInterpretationName, «ENDIF»«sourceName», «targetName»);''' |
52 | 48 | ||
53 | def getRefineRelationQueries(LogicProblem p) { | 49 | def getRefineRelationQueries(LogicProblem p) { |
54 | // val containmentRelations = p.containmentHierarchies.map[containmentRelations].flatten.toSet | 50 | // val containmentRelations = p.containmentHierarchies.map[containmentRelations].flatten.toSet |
55 | // p.relations.filter(RelationDeclaration).filter[!containmentRelations.contains(it)].toInvertedMap['''refineRelation_«base.canonizeName(it.name)»'''] | 51 | // p.relations.filter(RelationDeclaration).filter[!containmentRelations.contains(it)].toInvertedMap['''refineRelation_«base.canonizeName(it.name)»'''] |
56 | /* | 52 | /* |
57 | val res = new LinkedHashMap | 53 | * val res = new LinkedHashMap |
58 | for(relation: getRelationRefinements(p)) { | 54 | * for(relation: getRelationRefinements(p)) { |
59 | if(inverseRelations.containsKey(relation)) { | 55 | * if(inverseRelations.containsKey(relation)) { |
60 | val name = '''refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelations.get(relation).name)»''' | 56 | * val name = '''refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelations.get(relation).name)»''' |
61 | res.put(relation -> inverseRelations.get(relation),name) | 57 | * res.put(relation -> inverseRelations.get(relation),name) |
62 | } else { | 58 | * } else { |
63 | val name = '''refineRelation_«base.canonizeName(relation.name)»''' | 59 | * val name = '''refineRelation_«base.canonizeName(relation.name)»''' |
64 | res.put(relation -> null,name) | 60 | * res.put(relation -> null,name) |
65 | } | 61 | * } |
66 | } | 62 | * } |
67 | return res*/ | 63 | return res*/ |
68 | 64 | getRelationRefinements(p).toInvertedMap[relationRefinementQueryName(it.key, it.value)] | |
69 | getRelationRefinements(p).toInvertedMap[relationRefinementQueryName(it.key,it.value)] | ||
70 | } | 65 | } |
71 | |||
72 | 66 | ||
73 | def getRelationRefinements(LogicProblem p) { | 67 | def getRelationRefinements(LogicProblem p) { |
74 | val inverses = base.getInverseRelations(p) | 68 | val inverses = base.getInverseRelations(p) |
75 | val containments = base.getContainments(p) | 69 | val containments = base.getContainments(p) |
76 | val list = new LinkedList | 70 | val list = new LinkedList |
77 | for(relation : p.relations.filter(RelationDeclaration)) { | 71 | for (relation : p.relations.filter(RelationDeclaration)) { |
78 | if(!containments.contains(relation)) { | 72 | if (!containments.contains(relation)) { |
79 | if(inverses.containsKey(relation)) { | 73 | if (inverses.containsKey(relation)) { |
80 | val inverse = inverses.get(relation) | 74 | val inverse = inverses.get(relation) |
81 | if(!containments.contains(inverse)) { | 75 | if (!containments.contains(inverse)) { |
82 | if(base.isRepresentative(relation,inverse)) { | 76 | if (base.isRepresentative(relation, inverse)) { |
83 | list += (relation -> inverse) | 77 | list += (relation -> inverse) |
84 | } | 78 | } |
85 | } | 79 | } |
@@ -90,4 +84,4 @@ class RelationRefinementGenerator { | |||
90 | } | 84 | } |
91 | return list | 85 | return list |
92 | } | 86 | } |
93 | } \ No newline at end of file | 87 | } |
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend index 7e3fad91..ee7299cd 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend | |||
@@ -86,8 +86,8 @@ abstract class TypeRefinementGenerator { | |||
86 | } | 86 | } |
87 | 87 | ||
88 | protected def String patternName(Relation containmentRelation, Relation inverseContainment, Type newType) { | 88 | protected def String patternName(Relation containmentRelation, Relation inverseContainment, Type newType) { |
89 | if(containmentRelation != null) { | 89 | if(containmentRelation !== null) { |
90 | if(inverseContainment != null) { | 90 | if(inverseContainment !== null) { |
91 | '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»_with_«base.canonizeName(inverseContainment.name)»''' | 91 | '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»_with_«base.canonizeName(inverseContainment.name)»''' |
92 | } else { | 92 | } else { |
93 | '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»''' | 93 | '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»''' |
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend index ad1c9033..286756a8 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend | |||
@@ -1,85 +1,195 @@ | |||
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.LowerMultiplicityAssertion | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 3 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
5 | import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransformedViatraWellformednessConstraint | 4 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality |
5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationMultiplicityConstraint | ||
6 | import java.util.LinkedHashMap | ||
7 | import java.util.List | ||
6 | import java.util.Map | 8 | import java.util.Map |
7 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | 9 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery |
10 | import org.eclipse.xtend.lib.annotations.Data | ||
8 | 11 | ||
9 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 12 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
10 | import java.util.LinkedHashMap | 13 | |
11 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality | 14 | @Data |
12 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | 15 | class UnifinishedMultiplicityQueryNames { |
16 | val String unfinishedMultiplicityQueryName | ||
17 | val String unrepairableMultiplicityQueryName | ||
18 | val String remainingInverseMultiplicityQueryName | ||
19 | val String remainingContentsQueryName | ||
20 | } | ||
13 | 21 | ||
14 | class UnfinishedIndexer { | 22 | class UnfinishedIndexer { |
15 | val PatternGenerator base | 23 | val PatternGenerator base |
16 | 24 | val boolean indexUpperMultiplicities | |
17 | new(PatternGenerator patternGenerator) { | 25 | |
26 | new(PatternGenerator patternGenerator, boolean indexUpperMultiplicities) { | ||
18 | this.base = patternGenerator | 27 | this.base = patternGenerator |
28 | this.indexUpperMultiplicities = indexUpperMultiplicities | ||
19 | } | 29 | } |
20 | 30 | ||
21 | def generateUnfinishedWfQueries(LogicProblem problem, Map<String,PQuery> fqn2PQuery) { | 31 | def generateUnfinishedWfQueries(LogicProblem problem, Map<String, PQuery> fqn2PQuery) { |
22 | val wfQueries = base.wfQueries(problem) | 32 | val wfQueries = base.wfQueries(problem) |
23 | ''' | 33 | ''' |
24 | «FOR wfQuery: wfQueries» | 34 | «FOR wfQuery : wfQueries» |
25 | pattern unfinishedBy_«base.canonizeName(wfQuery.target.name)»(problem:LogicProblem, interpretation:PartialInterpretation, | 35 | pattern unfinishedBy_«base.canonizeName(wfQuery.target.name)»(problem:LogicProblem, interpretation:PartialInterpretation, |
26 | «FOR param : wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters SEPARATOR ', '»var_«param.name»«ENDFOR») | 36 | «FOR param : wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters SEPARATOR ', '»var_«param.name»«ENDFOR») |
27 | { | 37 | { |
28 | «base.relationDefinitionIndexer.referPattern( | 38 | «base.relationDefinitionIndexer.referPattern( |
29 | wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery), | 39 | wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery), |
30 | wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters.map['''var_«it.name»'''], | 40 | wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters.map['''var_«it.name»'''], |
31 | Modality.CURRENT, | 41 | Modality.CURRENT, |
32 | true,false)» | 42 | true,false)» |
33 | } | 43 | } |
34 | «ENDFOR» | 44 | «ENDFOR» |
35 | ''' | 45 | ''' |
36 | } | 46 | } |
47 | |||
37 | def getUnfinishedWFQueryNames(LogicProblem problem) { | 48 | def getUnfinishedWFQueryNames(LogicProblem problem) { |
38 | val wfQueries = base.wfQueries(problem) | 49 | val wfQueries = base.wfQueries(problem) |
39 | val map = new LinkedHashMap | 50 | val map = new LinkedHashMap |
40 | for(wfQuery : wfQueries) { | 51 | for (wfQuery : wfQueries) { |
41 | map.put(wfQuery.target,'''unfinishedBy_«base.canonizeName(wfQuery.target.name)»''') | 52 | map.put(wfQuery.target, '''unfinishedBy_«base.canonizeName(wfQuery.target.name)»''') |
42 | } | 53 | } |
43 | return map | 54 | return map |
44 | } | 55 | } |
45 | def generateUnfinishedMultiplicityQueries(LogicProblem problem, Map<String,PQuery> fqn2PQuery) { | 56 | |
46 | val lowerMultiplicities = base.lowerMultiplicities(problem) | 57 | def generateUnfinishedMultiplicityQueries(List<RelationMultiplicityConstraint> constraints, |
47 | return ''' | 58 | Map<String, PQuery> fqn2PQuery) ''' |
48 | «FOR lowerMultiplicity : lowerMultiplicities» | 59 | «FOR constraint : constraints» |
49 | pattern «unfinishedMultiplicityName(lowerMultiplicity)»(problem:LogicProblem, interpretation:PartialInterpretation, relationIterpretation:PartialRelationInterpretation, object:DefinedElement,missingMultiplicity) { | 60 | «IF constraint.constrainsUnfinished» |
50 | find interpretation(problem,interpretation); | 61 | private pattern «unfinishedMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, missingMultiplicity:java Integer) { |
51 | PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); | 62 | find interpretation(problem,interpretation); |
52 | PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«lowerMultiplicity.relation.name»"); | 63 | find mustExist(problem,interpretation,object); |
53 | «base.typeIndexer.referInstanceOf(lowerMultiplicity.firstParamTypeOfRelation,Modality::MUST,"object")» | 64 | «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» |
54 | numberOfExistingReferences == count «base.referRelation(lowerMultiplicity.relation,"object","_",Modality.MUST,fqn2PQuery)» | 65 | numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» |
55 | check(numberOfExistingReferences < «lowerMultiplicity.lower»); | 66 | check(numberOfExistingReferences < «constraint.lowerBound»); |
56 | missingMultiplicity == eval(«lowerMultiplicity.lower»-numberOfExistingReferences); | 67 | missingMultiplicity == eval(«constraint.lowerBound»-numberOfExistingReferences); |
57 | } | 68 | } |
69 | |||
70 | pattern «unfinishedMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, missingMultiplicity:java Integer) { | ||
71 | find interpretation(problem,interpretation); | ||
72 | missingMultiplicity == sum find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); | ||
73 | } | ||
74 | «ENDIF» | ||
75 | |||
76 | «IF indexUpperMultiplicities» | ||
77 | «IF constraint.constrainsUnrepairable» | ||
78 | private pattern «repairMatchName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, source:DefinedElement, target:DefinedElement) { | ||
79 | find interpretation(problem,interpretation); | ||
80 | find mustExist(problem,interpretation,source); | ||
81 | «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» | ||
82 | find mustExist(problem,interpretation,target); | ||
83 | «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» | ||
84 | neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» | ||
85 | «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» | ||
86 | } | ||
87 | |||
88 | private pattern «unrepairableMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, unrepairableMultiplicity:java Integer) { | ||
89 | find interpretation(problem,interpretation); | ||
90 | find mustExist(problem,interpretation,object); | ||
91 | «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» | ||
92 | find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, object, missingMultiplicity); | ||
93 | numerOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, object, _); | ||
94 | check(numerOfRepairMatches < missingMultiplicity); | ||
95 | unrepairableMultiplicity == eval(missingMultiplicity-numerOfRepairMatches); | ||
96 | } | ||
97 | |||
98 | private pattern «unrepairableMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, unrepairableMultiplicity:java Integer) { | ||
99 | find interpretation(problem,interpretation); | ||
100 | unrepairableMultiplicity == max find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); | ||
101 | } or { | ||
102 | find interpretation(problem,interpretation); | ||
103 | neg find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, _); | ||
104 | unrepairableMultiplicity == 0; | ||
105 | } | ||
106 | «ENDIF» | ||
107 | |||
108 | «IF constraint.constrainsRemainingInverse» | ||
109 | private pattern «remainingMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { | ||
110 | find interpretation(problem,interpretation); | ||
111 | find mustExist(problem,interpretation,object); | ||
112 | «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"object")» | ||
113 | numberOfExistingReferences == count «base.referRelation(constraint.relation,"_","object",Modality.MUST,fqn2PQuery)» | ||
114 | check(numberOfExistingReferences < «constraint.inverseUpperBound»); | ||
115 | remainingMultiplicity == eval(«constraint.inverseUpperBound»-numberOfExistingReferences); | ||
116 | } | ||
117 | |||
118 | pattern «remainingMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { | ||
119 | find interpretation(problem,interpretation); | ||
120 | remainingMultiplicity == sum find «remainingMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); | ||
121 | } | ||
122 | «ENDIF» | ||
123 | |||
124 | «IF constraint.constrainsRemainingContents» | ||
125 | «IF constraint.upperBoundFinite» | ||
126 | private pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { | ||
127 | find interpretation(problem,interpretation); | ||
128 | find mustExist(problem,interpretation,object); | ||
129 | «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» | ||
130 | numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» | ||
131 | check(numberOfExistingReferences < «constraint.upperBound»); | ||
132 | remainingMultiplicity == eval(«constraint.upperBound»-numberOfExistingReferences); | ||
133 | } | ||
134 | |||
135 | pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { | ||
136 | find interpretation(problem,interpretation); | ||
137 | remainingMultiplicity == sum find «remainingContentsName(constraint)»_helper(problem, interpretation, _, #_); | ||
138 | } | ||
139 | «ELSE» | ||
140 | pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation) { | ||
141 | find interpretation(problem,interpretation); | ||
142 | find mustExist(problem,interpretation,object); | ||
143 | «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» | ||
144 | } | ||
145 | |||
146 | pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { | ||
147 | find interpretation(problem,interpretation); | ||
148 | find «remainingContentsName(constraint)»_helper(problem, interpretation); | ||
149 | remainingMultiplicity == -1; | ||
150 | } or { | ||
151 | find interpretation(problem,interpretation); | ||
152 | neg find «remainingContentsName(constraint)»_helper(problem, interpretation); | ||
153 | remainingMultiplicity == 0; | ||
154 | } | ||
155 | «ENDIF» | ||
156 | «ENDIF» | ||
157 | «ENDIF» | ||
58 | «ENDFOR» | 158 | «ENDFOR» |
59 | ''' | 159 | ''' |
60 | } | 160 | |
61 | def String unfinishedMultiplicityName(LowerMultiplicityAssertion lowerMultiplicityAssertion) | 161 | def String unfinishedMultiplicityName( |
62 | '''unfinishedLowerMultiplicity_«base.canonizeName(lowerMultiplicityAssertion.relation.name)»''' | 162 | RelationMultiplicityConstraint constraint) '''unfinishedLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' |
63 | 163 | ||
64 | def public referUnfinishedMultiplicityQuery(LowerMultiplicityAssertion lowerMultiplicityAssertion) | 164 | def String unrepairableMultiplicityName( |
65 | '''find «unfinishedMultiplicityName(lowerMultiplicityAssertion)»(problem, interpretation ,object, missingMultiplicity);''' | 165 | RelationMultiplicityConstraint constraint) '''unrepairableLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' |
66 | 166 | ||
67 | def getFirstParamTypeOfRelation(LowerMultiplicityAssertion lowerMultiplicityAssertion) { | 167 | private def String repairMatchName( |
68 | val parameters = lowerMultiplicityAssertion.relation.parameters | 168 | RelationMultiplicityConstraint constraint) '''repair_«base.canonizeName(constraint.relation.name)»''' |
69 | if(parameters.size == 2) { | 169 | |
70 | val firstParam = parameters.get(0) | 170 | def String remainingMultiplicityName( |
71 | if(firstParam instanceof ComplexTypeReference) { | 171 | RelationMultiplicityConstraint constraint) '''remainingInverseUpperMultiplicity_«base.canonizeName(constraint.relation.name)»''' |
72 | return firstParam.referred | 172 | |
73 | } | 173 | def String remainingContentsName( |
74 | } | 174 | RelationMultiplicityConstraint constraint) '''remainingContents_«base.canonizeName(constraint.relation.name)»''' |
75 | } | 175 | |
76 | 176 | def getUnfinishedMultiplicityQueries(List<RelationMultiplicityConstraint> constraints) { | |
77 | def getUnfinishedMultiplicityQueries(LogicProblem problem) { | 177 | constraints.toInvertedMap [ constraint | |
78 | val lowerMultiplicities = base.lowerMultiplicities(problem) | 178 | new UnifinishedMultiplicityQueryNames( |
79 | val map = new LinkedHashMap | 179 | if(constraint.constrainsUnfinished) unfinishedMultiplicityName(constraint) else null, |
80 | for(lowerMultiplicity : lowerMultiplicities) { | 180 | if (indexUpperMultiplicities && constraint.constrainsUnrepairable) |
81 | map.put(lowerMultiplicity.relation,unfinishedMultiplicityName(lowerMultiplicity)) | 181 | unrepairableMultiplicityName(constraint) |
82 | } | 182 | else |
83 | return map | 183 | null, |
184 | if (indexUpperMultiplicities && constraint.constrainsRemainingInverse) | ||
185 | remainingMultiplicityName(constraint) | ||
186 | else | ||
187 | null, | ||
188 | if (indexUpperMultiplicities && constraint.constrainsRemainingContents) | ||
189 | remainingContentsName(constraint) | ||
190 | else | ||
191 | null | ||
192 | ) | ||
193 | ] | ||
84 | } | 194 | } |
85 | } | 195 | } |