aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend
diff options
context:
space:
mode:
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.xtend43
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
62class UnitPropagationPreconditionFinalResult {
63 CharSequence definitions
64 HashMap<PConstraint,String> constraint2PreconditionName
65}
61 66
62class UnitPropagationPreconditionGenerator { 67class 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»)