diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend')
-rw-r--r-- | Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend index b5e344f7..7cf52b41 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend | |||
@@ -58,6 +58,11 @@ class UnitPropagationPreconditionGenerationResult { | |||
58 | return unitPropagation2PatternName.get(key) !== null | 58 | return unitPropagation2PatternName.get(key) !== null |
59 | } | 59 | } |
60 | } | 60 | } |
61 | @Data | ||
62 | class UnitPropagationPreconditionFinalResult { | ||
63 | CharSequence definitions | ||
64 | HashMap<PConstraint,String> constraint2PreconditionName | ||
65 | } | ||
61 | 66 | ||
62 | class UnitPropagationPreconditionGenerator { | 67 | class UnitPropagationPreconditionGenerator { |
63 | val PatternGenerator base | 68 | val PatternGenerator base |
@@ -76,23 +81,51 @@ class UnitPropagationPreconditionGenerator { | |||
76 | // Create an empty result | 81 | // Create an empty result |
77 | val res = new UnitPropagationPreconditionGenerationResult | 82 | val res = new UnitPropagationPreconditionGenerationResult |
78 | val wfs = base.wfQueries(problem)//.map[it.patternPQuery] | 83 | val wfs = base.wfQueries(problem)//.map[it.patternPQuery] |
79 | val mainPropagationNames = new LinkedHashSet | 84 | val Map<PConstraint,List<Pair<String,Integer>>> mainPropagationNames = new HashMap |
80 | for(wf : wfs) { | 85 | for(wf : wfs) { |
81 | val query = wf.patternPQuery as PQuery | 86 | val query = wf.patternPQuery as PQuery |
82 | val relation = wf.target | 87 | val relation = wf.target |
83 | val allReferredChecks = allReferredConstraints(relation,query).filter(ExpressionEvaluation) | 88 | val allReferredChecks = allReferredConstraints(relation,query).filter(ExpressionEvaluation) |
84 | 89 | ||
85 | for(referredCheck : allReferredChecks) { | 90 | for(referredCheck : allReferredChecks) { |
86 | mainPropagationNames+= getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST) | 91 | val propagationPrecondition = getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST) |
92 | if(!mainPropagationNames.containsKey(referredCheck)) { | ||
93 | mainPropagationNames.put(referredCheck,new LinkedList) | ||
94 | } | ||
95 | if(propagationPrecondition !== null) { | ||
96 | println(query.parameterNames) | ||
97 | println(query.parameterNames.size) | ||
98 | mainPropagationNames.get(referredCheck).add(propagationPrecondition->query.parameterNames.size) | ||
99 | } | ||
87 | } | 100 | } |
88 | } | 101 | } |
89 | return ''' | 102 | val preconditions = new LinkedList |
103 | val constraint2Precondition = new HashMap | ||
104 | for(entry : mainPropagationNames.entrySet) { | ||
105 | val name = '''UPMUSTPropagate«res.getOrGenerateConstraintName(entry.key)»'''; | ||
106 | val def = ''' | ||
107 | pattern «name»( | ||
108 | problem:LogicProblem, interpretation:PartialInterpretation, | ||
109 | «FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR») | ||
110 | «FOR propagation : entry.value SEPARATOR " or "» | ||
111 | { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); } | ||
112 | «ENDFOR»''' | ||
113 | preconditions+=def | ||
114 | constraint2Precondition.put(entry.key,name) | ||
115 | } | ||
116 | |||
117 | val definitions = ''' | ||
90 | «FOR def : res.definitions» | 118 | «FOR def : res.definitions» |
91 | «def» | 119 | «def» |
92 | «ENDFOR» | 120 | «ENDFOR» |
93 | 121 | ||
94 | // Main propagations: «FOR name : mainPropagationNames SEPARATOR ", "»«name»«ENDFOR» | 122 | // Collected propagation preconditions: |
123 | |||
124 | «FOR predondition : preconditions» | ||
125 | «predondition» | ||
126 | «ENDFOR» | ||
95 | ''' | 127 | ''' |
128 | return new UnitPropagationPreconditionFinalResult(definitions,constraint2Precondition) | ||
96 | } | 129 | } |
97 | def allReferredConstraints(Relation relation, PQuery query) { | 130 | def allReferredConstraints(Relation relation, PQuery query) { |
98 | val allReferredQueries = query.allReferredQueries | 131 | val allReferredQueries = query.allReferredQueries |
@@ -207,7 +240,7 @@ class UnitPropagationPreconditionGenerator { | |||
207 | res.registerUnsatQuery(q,c,pm,m3) | 240 | res.registerUnsatQuery(q,c,pm,m3) |
208 | } else { | 241 | } else { |
209 | val definition = ''' | 242 | val definition = ''' |
210 | pattern «name»( | 243 | private pattern «name»( |
211 | problem:LogicProblem, interpretation:PartialInterpretation, | 244 | problem:LogicProblem, interpretation:PartialInterpretation, |
212 | «FOR param : q.parameters SEPARATOR ', '»var_«param.name»«ENDFOR», | 245 | «FOR param : q.parameters SEPARATOR ', '»var_«param.name»«ENDFOR», |
213 | «FOR arity : 1..constraintArity SEPARATOR ', '»«canonizeName(arity,pm)»«ENDFOR») | 246 | «FOR arity : 1..constraintArity SEPARATOR ', '»«canonizeName(arity,pm)»«ENDFOR») |