From 363e62749b7415d67906ba8df46d6da8655b1869 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Thu, 30 Apr 2020 20:15:24 +0200 Subject: UnitPropagationProvider added to the generated patterns --- .../logic2viatra/patterns/PatternGenerator.xtend | 6 ++++ .../UnitPropagationPreconditionGenerator.xtend | 32 ++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme') 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 379e334a..56138ee8 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 @@ -36,6 +36,7 @@ class PatternGenerator { @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) + @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) public new(TypeInferenceMethod typeInferenceMethod) { if(typeInferenceMethod == TypeInferenceMethod.Generic) { @@ -390,6 +391,11 @@ class PatternGenerator { // 4.3 Relation refinement ////////// «relationRefinementGenerator.generateRefineReference(problem)» + + ////////// + // 5 Unit Propagations + ////////// + «unitPropagationPreconditionGenerator.generateUnitPropagationRules(problem,problem.relations.filter(RelationDefinition),fqn2PQuery)» ''' } } 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 25354af4..6cd94657 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 @@ -32,6 +32,7 @@ import java.util.ArrayList class UnitPropagationPreconditionGenerationResult { List definitions= new LinkedList Map unitPropagation2PatternName = new HashMap + Map constraintOccurence2Name = new HashMap def registerQuery(PQuery q, PConstraint c, PropagationModality pm, Modality m3, String patternName, CharSequence definition) { val key = new UnitPropagation(q,c,pm,m3) @@ -72,17 +73,27 @@ class UnitPropagationPreconditionGenerator { { // Create an empty result val res = new UnitPropagationPreconditionGenerationResult - val wfs = base.wfQueries(problem)//.map[it.patternPQuery] + val mainPropagationNames = new LinkedList for(wf : wfs) { val query = wf.patternPQuery as PQuery val relation = wf.target val allReferredChecks = query.allReferredConstraints.filter(ExpressionEvaluation) for(referredCheck : allReferredChecks) { - generatePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST) + mainPropagationNames+= getOrGeneratePropagationRule(res,relation,query,referredCheck,PropagationModality::UP, Modality::MUST) } } + return ''' + «FOR def : res.definitions» + «def» + «ENDFOR» + + // Main propagations: + «FOR name : mainPropagationNames» + «name» + «ENDFOR» + ''' } def allReferredConstraints(PQuery query) { val allReferredQueries = query.allReferredQueries @@ -97,9 +108,18 @@ class UnitPropagationPreconditionGenerator { return res.getName(q,c,pm,m3) } } + def getOrGenerateConstraintName(UnitPropagationPreconditionGenerationResult res, PConstraint c){ + if(res.constraintOccurence2Name.containsKey(c)) { + return res.constraintOccurence2Name.get(c) + } else { + val constraintName = '''Constraint«res.constraintOccurence2Name.size»''' + res.constraintOccurence2Name.put(c,constraintName) + return constraintName + } + } def void generatePropagationRule(UnitPropagationPreconditionGenerationResult res, Relation relation, PQuery q, PConstraint c, PropagationModality pm, Modality m3) { - val name = relationDefinitionName(relation,q,c,pm,m3) + val name = relationDefinitionName(res,relation,q,c,pm,m3) val constraintArity = c.arity val generatedBodies = new LinkedList for(body : q.disjunctBodies.bodies) { @@ -180,7 +200,7 @@ class UnitPropagationPreconditionGenerator { problem:LogicProblem, interpretation:PartialInterpretation, «FOR param : q.parameters SEPARATOR ', '»var_«param.name»«ENDFOR», «FOR arity : 1..constraintArity SEPARATOR ', '»«canonizeName(arity,pm)»«ENDFOR») - «FOR generatedBody: generatedBodies SEPARATOR "or"»{ + «FOR generatedBody: generatedBodies SEPARATOR " or "»{ «generatedBody» }«ENDFOR» ''' @@ -188,8 +208,8 @@ class UnitPropagationPreconditionGenerator { } } - private def String relationDefinitionName(Relation relation, PQuery q, PConstraint c, PropagationModality pm, Modality m3) - '''«pm.name»«m3.name»Propagate_«base.canonizeName(relation.name)»''' + private def String relationDefinitionName(UnitPropagationPreconditionGenerationResult res, Relation relation, PQuery q, PConstraint c, PropagationModality pm, Modality m3) + '''«pm.name»«m3.name»Propagate«res.getOrGenerateConstraintName(c)»_«base.canonizeName(relation.name)»''' def canonizeName(PVariable v) { return '''«IF v.referringConstraints.size == 1»_«ENDIF»var_«v.name.replaceAll("\\W","")»''' -- cgit v1.2.3-70-g09d2