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.xtend42
1 files changed, 31 insertions, 11 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 d487db64..91a7a2c2 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
@@ -61,7 +61,8 @@ class UnitPropagationPreconditionGenerationResult {
61@Data 61@Data
62class UnitPropagationPreconditionFinalResult { 62class UnitPropagationPreconditionFinalResult {
63 CharSequence definitions 63 CharSequence definitions
64 HashMap<PConstraint,String> constraint2PreconditionName 64 HashMap<PConstraint,String> constraint2MustPreconditionName
65 HashMap<PConstraint,String> constraint2CurrentPreconditionName
65} 66}
66 67
67class UnitPropagationPreconditionGenerator { 68class UnitPropagationPreconditionGenerator {
@@ -81,25 +82,34 @@ class UnitPropagationPreconditionGenerator {
81 // Create an empty result 82 // Create an empty result
82 val res = new UnitPropagationPreconditionGenerationResult 83 val res = new UnitPropagationPreconditionGenerationResult
83 val wfs = base.wfQueries(problem)//.map[it.patternPQuery] 84 val wfs = base.wfQueries(problem)//.map[it.patternPQuery]
84 val Map<PConstraint,List<Pair<String,Integer>>> mainPropagationNames = new HashMap 85 val Map<PConstraint,List<Pair<String,Integer>>> mainMustPropagationNames = new HashMap
86 val Map<PConstraint,List<Pair<String,Integer>>> mainCurrentPropagationNames = new HashMap
85 for(wf : wfs) { 87 for(wf : wfs) {
86 val query = wf.patternPQuery as PQuery 88 val query = wf.patternPQuery as PQuery
87 val relation = wf.target 89 val relation = wf.target
88 val allReferredChecks = allReferredConstraints(relation,query).filter(ExpressionEvaluation) 90 val allReferredChecks = allReferredConstraints(relation,query).filter(ExpressionEvaluation)
89 91
90 for(referredCheck : allReferredChecks) { 92 for(referredCheck : allReferredChecks) {
91 val propagationPrecondition = getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST) 93 val mustPropagationPrecondition = getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST)
92 if(!mainPropagationNames.containsKey(referredCheck)) { 94 val currentPropagationPrecondition = getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::CURRENT)
93 mainPropagationNames.put(referredCheck,new LinkedList) 95 if(!mainMustPropagationNames.containsKey(referredCheck)) {
96 mainMustPropagationNames.put(referredCheck,new LinkedList)
94 } 97 }
95 if(propagationPrecondition !== null) { 98 if(!mainCurrentPropagationNames.containsKey(referredCheck)) {
96 mainPropagationNames.get(referredCheck).add(propagationPrecondition->query.parameterNames.size) 99 mainCurrentPropagationNames.put(referredCheck,new LinkedList)
100 }
101 if(mustPropagationPrecondition !== null) {
102 mainMustPropagationNames.get(referredCheck).add(mustPropagationPrecondition->query.parameterNames.size)
103 }
104 if(currentPropagationPrecondition !== null) {
105 mainCurrentPropagationNames.get(referredCheck).add(currentPropagationPrecondition->query.parameterNames.size)
97 } 106 }
98 } 107 }
99 } 108 }
100 val preconditions = new LinkedList 109 val preconditions = new LinkedList
101 val constraint2Precondition = new HashMap 110 val constraint2MustPrecondition = new HashMap
102 for(entry : mainPropagationNames.entrySet) { 111 val constraint2CurrentPrecondition = new HashMap
112 for(entry : mainMustPropagationNames.entrySet) {
103 val name = '''UPMUSTPropagate_«res.getOrGenerateConstraintName(entry.key)»'''; 113 val name = '''UPMUSTPropagate_«res.getOrGenerateConstraintName(entry.key)»''';
104 val def = ''' 114 val def = '''
105 pattern «name»(«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR») 115 pattern «name»(«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»)
@@ -107,7 +117,17 @@ class UnitPropagationPreconditionGenerator {
107 { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); } 117 { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); }
108 «ENDFOR»''' 118 «ENDFOR»'''
109 preconditions+=def 119 preconditions+=def
110 constraint2Precondition.put(entry.key,name) 120 constraint2MustPrecondition.put(entry.key,name)
121 }
122 for(entry : mainCurrentPropagationNames.entrySet) {
123 val name = '''UPCurrentPropagate_«res.getOrGenerateConstraintName(entry.key)»''';
124 val def = '''
125 pattern «name»(«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»)
126 «FOR propagation : entry.value SEPARATOR " or "»
127 { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); }
128 «ENDFOR»'''
129 preconditions+=def
130 constraint2CurrentPrecondition.put(entry.key,name)
111 } 131 }
112 132
113 val definitions = ''' 133 val definitions = '''
@@ -121,7 +141,7 @@ class UnitPropagationPreconditionGenerator {
121 «predondition» 141 «predondition»
122 «ENDFOR» 142 «ENDFOR»
123 ''' 143 '''
124 return new UnitPropagationPreconditionFinalResult(definitions,constraint2Precondition) 144 return new UnitPropagationPreconditionFinalResult(definitions,constraint2MustPrecondition,constraint2CurrentPrecondition)
125 } 145 }
126 def allReferredConstraints(Relation relation, PQuery query) { 146 def allReferredConstraints(Relation relation, PQuery query) {
127 val allReferredQueries = query.allReferredQueries 147 val allReferredQueries = query.allReferredQueries