From ed434397058fd520ad92a938eccd8f93ef378d8a Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Tue, 14 Apr 2020 22:45:52 +0200 Subject: restructured pattern generation --- .../patterns/RelationDefinitionIndexer.xtend | 173 +-------------------- 1 file changed, 8 insertions(+), 165 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend index 9723373f..6b9818b4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend @@ -5,35 +5,22 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality import java.util.Map -import org.eclipse.emf.ecore.EAttribute -import org.eclipse.emf.ecore.EEnumLiteral -import org.eclipse.emf.ecore.EReference -import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey -import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey -import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey -import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint class RelationDefinitionIndexer { - val PatternGenerator base; + public val PatternGenerator base; + val PConstraintTransformer constraintTransformer; new(PatternGenerator base) { this.base = base + this.constraintTransformer = new PConstraintTransformer(this); } - public def generateRelationDefinitions( + def generateRelationDefinitions( LogicProblem problem, Iterable relations, Map fqn2PQuery) { @@ -74,7 +61,7 @@ class RelationDefinitionIndexer { private def relationDefinitionName(RelationDefinition relation, Modality modality) '''«modality.name.toLowerCase»InRelation_«base.canonizeName(relation.name)»''' - private def canonizeName(PVariable v) { + def canonizeName(PVariable v) { return '''«IF v.referringConstraints.size == 1»_«ENDIF»var_«v.name.replaceAll("\\W","")»''' } @@ -87,7 +74,7 @@ class RelationDefinitionIndexer { «FOR body : p.disjunctBodies.bodies SEPARATOR "or"»{ find interpretation(problem,interpretation); «FOR constraint : body.constraints» - «constraint.transformConstraint(modality)» + «this.constraintTransformer.transformConstraint(constraint,modality)» «ENDFOR» }«ENDFOR» ''' @@ -104,158 +91,14 @@ class RelationDefinitionIndexer { ''' } - private def toMustMay(Modality modality) { + def toMustMay(Modality modality) { if(modality == Modality::MAY) return Modality::MAY else return Modality::MUST } - def public referPattern(PQuery p, String[] variables, Modality modality, boolean positive, boolean transitive) ''' + def referPattern(PQuery p, String[] variables, Modality modality, boolean positive, boolean transitive) ''' «IF !positive»neg «ENDIF»find «IF transitive»twoParam_«ENDIF»«modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(«IF !transitive»problem,interpretation,«ENDIF»«variables.join(',')»); ''' - private dispatch def transformConstraint(TypeConstraint constraint, Modality modality) { - val touple = constraint.variablesTuple - if(touple.size == 1) { - val inputKey = constraint.equivalentJudgement.inputKey - if(inputKey instanceof EClassTransitiveInstancesKey) { - return base.typeIndexer.referInstanceOf(inputKey.emfKey,modality.toMustMay, - constraint.getVariableInTuple(0).canonizeName) - } else if(inputKey instanceof EDataTypeInSlotsKey){ - return '''// type constraint is enforced by construction''' - } - - } else if(touple.size == 2){ - val key = (constraint.equivalentJudgement.inputKey as EStructuralFeatureInstancesKey).emfKey - if(key instanceof EReference) { - return base.referRelationByName( - key, - constraint.getVariableInTuple(0).canonizeName, - constraint.getVariableInTuple(1).canonizeName, - modality.toMustMay) - } else if (key instanceof EAttribute) { - return base.referAttributeByName(key, - constraint.getVariableInTuple(0).canonizeName, - constraint.getVariableInTuple(1).canonizeName, - modality.toMustMay) - } else throw new UnsupportedOperationException('''unknown key: «key.class»''') - } else { - throw new UnsupportedOperationException('''Unsupported touple size: «touple.size»''') - } - } - private dispatch def transformConstraint(TypeFilterConstraint constraint, Modality modality) { - val touple = constraint.variablesTuple - if(touple.size == 1) { - val inputKey = constraint.equivalentJudgement.inputKey - if(inputKey instanceof EClassTransitiveInstancesKey) { - return base.typeIndexer.referInstanceOf(inputKey.emfKey,modality.toMustMay, - (constraint.getVariablesTuple.get(0) as PVariable).canonizeName) - } else if(inputKey instanceof EDataTypeInSlotsKey){ - return '''// type constraint is enforced by construction''' - } - - } else if(touple.size == 2){ - val key = (constraint.equivalentJudgement.inputKey as EStructuralFeatureInstancesKey).emfKey - if(key instanceof EReference) { - return base.referRelationByName( - key, - (constraint.getVariablesTuple.get(0) as PVariable).canonizeName, - (constraint.getVariablesTuple.get(1) as PVariable).canonizeName, - modality.toMustMay) - } else if (key instanceof EAttribute) { - return base.referAttributeByName(key, - (constraint.getVariablesTuple.get(0) as PVariable).canonizeName, - (constraint.getVariablesTuple.get(1) as PVariable).canonizeName, - modality.toMustMay) - } else throw new UnsupportedOperationException('''unknown key: «key.class»''') - } else { - throw new UnsupportedOperationException('''Unsupported touple size: «touple.size»''') - } - } - - private dispatch def transformConstraint(Equality equality, Modality modality) { - val a = equality.who - val b = equality.withWhom - transformEquality(modality.toMustMay, a, b) - } - - private def CharSequence transformEquality(Modality modality, PVariable a, PVariable b) { - if(modality.isMustOrCurrent) '''find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' - else '''find mayEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' - } - - private dispatch def transformConstraint(Inequality inequality, Modality modality) { - val a = inequality.who - val b = inequality.withWhom - if(modality.isCurrent) { - return '''neg find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' - } else if(modality.isMust) { - return '''neg find mayEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' - } else { // modality.isMay - return '''neg find mustEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' - } - } - - private dispatch def transformConstraint(NegativePatternCall pcall, Modality modality) { - val params = (0..