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 | 179 |
1 files changed, 99 insertions, 80 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..edf92343 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,17 +16,22 @@ 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 |
24 | import org.eclipse.emf.ecore.EReference | 27 | import org.eclipse.emf.ecore.EReference |
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint | ||
25 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery | 29 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery |
26 | import org.eclipse.xtend.lib.annotations.Accessors | 30 | import org.eclipse.xtend.lib.annotations.Accessors |
31 | import org.eclipse.xtend.lib.annotations.Data | ||
32 | import org.eclipse.xtend2.lib.StringConcatenationClient | ||
27 | 33 | ||
28 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 34 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
29 | import org.eclipse.xtend.lib.annotations.Data | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint | ||
31 | 35 | ||
32 | @Data class PatternGeneratorResult { | 36 | @Data class PatternGeneratorResult { |
33 | CharSequence patternText | 37 | CharSequence patternText |
@@ -35,22 +39,32 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint | |||
35 | HashMap<PConstraint,String> constraint2CurrentPreconditionName | 39 | HashMap<PConstraint,String> constraint2CurrentPreconditionName |
36 | } | 40 | } |
37 | 41 | ||
42 | interface UnitPropagationPatternGenerator { | ||
43 | def Map<Relation, String> getMustPatterns() | ||
44 | |||
45 | def Map<Relation, String> getMustNotPatterns() | ||
46 | |||
47 | def StringConcatenationClient getAdditionalPatterns(PatternGenerator generator, Map<String, PQuery> fqn2PQuery) | ||
48 | } | ||
49 | |||
38 | class PatternGenerator { | 50 | class PatternGenerator { |
39 | @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer //= new TypeIndexer(this) | 51 | @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this) |
40 | @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(this) | 52 | @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer( |
41 | @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(this) | 53 | this) |
54 | @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer( | ||
55 | this) | ||
42 | @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) | 56 | @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) |
43 | @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) | 57 | @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) |
44 | @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) | 58 | @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer |
45 | @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) | 59 | @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) |
46 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) | 60 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) |
47 | @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) | 61 | @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) |
48 | 62 | ||
49 | public new(TypeInferenceMethod typeInferenceMethod) { | 63 | new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { |
50 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { | 64 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { |
51 | this.typeIndexer = new GenericTypeIndexer(this) | 65 | this.typeIndexer = new GenericTypeIndexer(this) |
52 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) | 66 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) |
53 | } else if(typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { | 67 | } else if (typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { |
54 | this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) | 68 | this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) |
55 | this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) | 69 | this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) |
56 | } else { | 70 | } else { |
@@ -58,110 +72,102 @@ class PatternGenerator { | |||
58 | this.typeRefinementGenerator = null | 72 | this.typeRefinementGenerator = null |
59 | throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') | 73 | throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') |
60 | } | 74 | } |
75 | this.unfinishedIndexer = new UnfinishedIndexer(this, scopePropagatorStrategy.requiresUpperBoundIndexing) | ||
61 | } | 76 | } |
62 | 77 | ||
63 | public def requiresTypeAnalysis() { | 78 | def requiresTypeAnalysis() { |
64 | typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis | 79 | typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis |
65 | } | 80 | } |
66 | 81 | ||
67 | public dispatch def referRelation( | 82 | dispatch def CharSequence referRelation(RelationDeclaration referred, String sourceVariable, String targetVariable, |
68 | RelationDeclaration referred, | 83 | Modality modality, Map<String, PQuery> fqn2PQuery) { |
69 | String sourceVariable, | 84 | 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 | } | 85 | } |
76 | public dispatch def referRelation( | 86 | |
77 | RelationDefinition referred, | 87 | dispatch def CharSequence referRelation(RelationDefinition referred, String sourceVariable, String targetVariable, |
78 | String sourceVariable, | 88 | Modality modality, Map<String, PQuery> fqn2PQuery) { |
79 | String targetVariable, | 89 | val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup( |
80 | Modality modality, | 90 | fqn2PQuery) |
81 | Map<String,PQuery> fqn2PQuery) | 91 | return this.relationDefinitionIndexer.referPattern(pattern, #[sourceVariable, targetVariable], modality, true, |
82 | { | 92 | false) |
83 | val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) | ||
84 | return this.relationDefinitionIndexer.referPattern(pattern,#[sourceVariable,targetVariable],modality,true,false) | ||
85 | } | 93 | } |
86 | 94 | ||
87 | def public referRelationByName(EReference reference, | 95 | def referRelationByName(EReference reference, String sourceVariable, String targetVariable, Modality modality) { |
88 | String sourceVariable, | 96 | '''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 | } | 97 | } |
95 | 98 | ||
96 | def public CharSequence referAttributeByName(EAttribute attribute, | 99 | def CharSequence referAttributeByName(EAttribute attribute, String sourceVariable, String targetVariable, |
97 | String sourceVariable, | 100 | Modality modality) { |
98 | String targetVariable, | 101 | '''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 | } | 102 | } |
104 | 103 | ||
105 | public def canonizeName(String name) { | 104 | def canonizeName(String name) { |
106 | name.split(' ').join('_') | 105 | name.split(' ').join('_') |
107 | } | 106 | } |
108 | 107 | ||
109 | public def lowerMultiplicities(LogicProblem problem) { | 108 | def wfQueries(LogicProblem problem) { |
110 | problem.assertions.map[annotations].flatten.filter(LowerMultiplicityAssertion).filter[!it.relation.isDerived] | 109 | 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 | } | 110 | } |
118 | public def getContainments(LogicProblem p) { | 111 | |
112 | def getContainments(LogicProblem p) { | ||
119 | return p.containmentHierarchies.head.containmentRelations | 113 | return p.containmentHierarchies.head.containmentRelations |
120 | } | 114 | } |
121 | public def getInverseRelations(LogicProblem p) { | 115 | |
116 | def getInverseRelations(LogicProblem p) { | ||
122 | val inverseRelations = new HashMap | 117 | val inverseRelations = new HashMap |
123 | p.annotations.filter(InverseRelationAssertion).forEach[ | 118 | p.annotations.filter(InverseRelationAssertion).forEach [ |
124 | inverseRelations.put(it.inverseA,it.inverseB) | 119 | inverseRelations.put(it.inverseA, it.inverseB) |
125 | inverseRelations.put(it.inverseB,it.inverseA) | 120 | inverseRelations.put(it.inverseB, it.inverseA) |
126 | ] | 121 | ] |
127 | return inverseRelations | 122 | return inverseRelations |
128 | } | 123 | } |
129 | public def isRepresentative(Relation relation, Relation inverse) { | 124 | |
130 | if(inverse == null) { | 125 | def isRepresentative(Relation relation, Relation inverse) { |
126 | if (relation === null) { | ||
127 | return false | ||
128 | } else if (inverse === null) { | ||
131 | return true | 129 | return true |
132 | } else { | 130 | } else { |
133 | relation.name.compareTo(inverse.name)<1 | 131 | relation.name.compareTo(inverse.name) < 1 |
134 | } | 132 | } |
135 | } | 133 | } |
136 | 134 | ||
137 | public def isDerived(Relation relation) { | 135 | def isDerived(Relation relation) { |
138 | relation.annotations.exists[it instanceof DefinedByDerivedFeature] | 136 | relation.annotations.exists[it instanceof DefinedByDerivedFeature] |
139 | } | 137 | } |
140 | public def getDerivedDefinition(RelationDeclaration relation) { | 138 | |
139 | def getDerivedDefinition(RelationDeclaration relation) { | ||
141 | relation.annotations.filter(DefinedByDerivedFeature).head.query | 140 | relation.annotations.filter(DefinedByDerivedFeature).head.query |
142 | } | 141 | } |
143 | 142 | ||
144 | private def allTypeReferences(LogicProblem problem) { | 143 | private def allTypeReferences(LogicProblem problem) { |
145 | problem.eAllContents.filter(TypeReference).toIterable | 144 | problem.eAllContents.filter(TypeReference).toIterable |
146 | } | 145 | } |
146 | |||
147 | protected def hasBoolean(LogicProblem problem) { | 147 | protected def hasBoolean(LogicProblem problem) { |
148 | problem.allTypeReferences.exists[it instanceof BoolTypeReference] | 148 | problem.allTypeReferences.exists[it instanceof BoolTypeReference] |
149 | } | 149 | } |
150 | |||
150 | protected def hasInteger(LogicProblem problem) { | 151 | protected def hasInteger(LogicProblem problem) { |
151 | problem.allTypeReferences.exists[it instanceof IntTypeReference] | 152 | problem.allTypeReferences.exists[it instanceof IntTypeReference] |
152 | } | 153 | } |
154 | |||
153 | protected def hasReal(LogicProblem problem) { | 155 | protected def hasReal(LogicProblem problem) { |
154 | problem.allTypeReferences.exists[it instanceof RealTypeReference] | 156 | problem.allTypeReferences.exists[it instanceof RealTypeReference] |
155 | } | 157 | } |
158 | |||
156 | protected def hasString(LogicProblem problem) { | 159 | protected def hasString(LogicProblem problem) { |
157 | problem.allTypeReferences.exists[it instanceof StringTypeReference] | 160 | problem.allTypeReferences.exists[it instanceof StringTypeReference] |
158 | } | 161 | } |
159 | 162 | ||
160 | public def PatternGeneratorResult transformBaseProperties( | 163 | def transformBaseProperties( |
161 | LogicProblem problem, | 164 | LogicProblem problem, |
162 | PartialInterpretation emptySolution, | 165 | PartialInterpretation emptySolution, |
163 | Map<String,PQuery> fqn2PQuery, | 166 | Map<String, PQuery> fqn2PQuery, |
164 | TypeAnalysisResult typeAnalysisResult | 167 | TypeAnalysisResult typeAnalysisResult, |
168 | RelationConstraints constraints, | ||
169 | Collection<LinearTypeConstraintHint> hints, | ||
170 | Collection<UnitPropagationPatternGenerator> unitPropagationPatternGenerators | ||
165 | ) { | 171 | ) { |
166 | val first = | 172 | val first = |
167 | ''' | 173 | ''' |
@@ -199,7 +205,7 @@ class PatternGenerator { | |||
199 | 205 | ||
200 | private pattern elementCloseWorld(element:DefinedElement) { | 206 | private pattern elementCloseWorld(element:DefinedElement) { |
201 | PartialInterpretation.openWorldElements(i,element); | 207 | PartialInterpretation.openWorldElements(i,element); |
202 | PartialInterpretation.maxNewElements(i,0); | 208 | PartialInterpretation.maxNewElements(i,0); |
203 | } or { | 209 | } or { |
204 | Scope.targetTypeInterpretation(scope,interpretation); | 210 | Scope.targetTypeInterpretation(scope,interpretation); |
205 | PartialTypeInterpratation.elements(interpretation,element); | 211 | PartialTypeInterpratation.elements(interpretation,element); |
@@ -288,7 +294,9 @@ class PatternGenerator { | |||
288 | ////////// | 294 | ////////// |
289 | // 1.1.1 Required Patterns by TypeIndexer | 295 | // 1.1.1 Required Patterns by TypeIndexer |
290 | ////////// | 296 | ////////// |
297 | |||
291 | «typeIndexer.requiredQueries» | 298 | «typeIndexer.requiredQueries» |
299 | |||
292 | ////////// | 300 | ////////// |
293 | // 1.1.2 primitive Type Indexers | 301 | // 1.1.2 primitive Type Indexers |
294 | ////////// | 302 | ////////// |
@@ -306,6 +314,7 @@ class PatternGenerator { | |||
306 | // > StringElement.value(variableName,value) | 314 | // > StringElement.value(variableName,value) |
307 | // Whether a value is set is defined by: | 315 | // Whether a value is set is defined by: |
308 | // > PrimitiveElement.valueSet(variableName,isFilled); | 316 | // > PrimitiveElement.valueSet(variableName,isFilled); |
317 | |||
309 | ////////// | 318 | ////////// |
310 | // 1.1.3 domain-specific Type Indexers | 319 | // 1.1.3 domain-specific Type Indexers |
311 | ////////// | 320 | ////////// |
@@ -314,7 +323,7 @@ class PatternGenerator { | |||
314 | ////////// | 323 | ////////// |
315 | // 1.2 Relation Declaration Indexers | 324 | // 1.2 Relation Declaration Indexers |
316 | ////////// | 325 | ////////// |
317 | «relationDeclarationIndexer.generateRelationIndexers(problem,problem.relations.filter(RelationDeclaration),fqn2PQuery)» | 326 | «relationDeclarationIndexer.generateRelationIndexers(problem,problem.relations.filter(RelationDeclaration),unitPropagationPatternGenerators,fqn2PQuery)» |
318 | 327 | ||
319 | ////////// | 328 | ////////// |
320 | // 1.3 Relation Definition Indexers | 329 | // 1.3 Relation Definition Indexers |
@@ -338,7 +347,7 @@ class PatternGenerator { | |||
338 | ////////// | 347 | ////////// |
339 | // 3.1 Unfinishedness Measured by Multiplicity | 348 | // 3.1 Unfinishedness Measured by Multiplicity |
340 | ////////// | 349 | ////////// |
341 | «unfinishedIndexer.generateUnfinishedMultiplicityQueries(problem,fqn2PQuery)» | 350 | «unfinishedIndexer.generateUnfinishedMultiplicityQueries(constraints.multiplicityConstraints,fqn2PQuery)» |
342 | 351 | ||
343 | ////////// | 352 | ////////// |
344 | // 3.2 Unfinishedness Measured by WF Queries | 353 | // 3.2 Unfinishedness Measured by WF Queries |
@@ -360,14 +369,24 @@ class PatternGenerator { | |||
360 | ////////// | 369 | ////////// |
361 | // 4.3 Relation refinement | 370 | // 4.3 Relation refinement |
362 | ////////// | 371 | ////////// |
363 | «relationRefinementGenerator.generateRefineReference(problem)» | 372 | «relationRefinementGenerator.generateRefineReference(problem, unitPropagationPatternGenerators)» |
373 | |||
374 | ////////// | ||
375 | // 5 Hints | ||
376 | ////////// | ||
377 | «FOR hint : hints» | ||
378 | «hint.getAdditionalPatterns(this, fqn2PQuery)» | ||
379 | «ENDFOR» | ||
380 | «FOR generator : unitPropagationPatternGenerators» | ||
381 | «generator.getAdditionalPatterns(this, fqn2PQuery)» | ||
382 | «ENDFOR» | ||
364 | 383 | ||
365 | ////////// | 384 | ////////// |
366 | // 5 Unit Propagations | 385 | // 6 Unit Propagations |
367 | ////////// | 386 | ////////// |
368 | ''' | 387 | ''' |
369 | val up = unitPropagationPreconditionGenerator.generateUnitPropagationRules(problem,problem.relations.filter(RelationDefinition),fqn2PQuery) | 388 | val up = unitPropagationPreconditionGenerator.generateUnitPropagationRules(problem,problem.relations.filter(RelationDefinition),fqn2PQuery) |
370 | val second = up.definitions | 389 | val second = up.definitions |
371 | return new PatternGeneratorResult(first+second,up.constraint2MustPreconditionName,up.constraint2CurrentPreconditionName) | 390 | return new PatternGeneratorResult(first+second,up.constraint2MustPreconditionName,up.constraint2CurrentPreconditionName) |
372 | } | 391 | } |
373 | } | 392 | } |