From 60f01f46ba232ed6416054f0a6115cb2a9b70b4e Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sat, 10 Jun 2017 19:05:05 +0200 Subject: Migrating Additional projects --- .../patterns/RelationDefinitionIndexer.xtend | 185 +++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend (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 new file mode 100644 index 00000000..7792eccb --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend @@ -0,0 +1,185 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns + +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery +import java.util.Map +import org.eclipse.emf.ecore.EAttribute +import org.eclipse.emf.ecore.EReference +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey +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.emf.types.EDataTypeInSlotsKey +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality + +class RelationDefinitionIndexer { + val PatternGenerator base; + + new(PatternGenerator base) { + this.base = base + } + + public def generateRelationDefinitions( + LogicProblem problem, + Iterable relations, + Map fqn2PQuery) { + val relation2PQuery = relations.toInvertedMap[ + annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) + ] + + return ''' + «FOR relation : relations» + // Must, May and Current queries for «relation.name» + «relation.transformPattern(relation.lookup(relation2PQuery), Modality.MUST)» + «relation.transformPattern(relation.lookup(relation2PQuery), Modality.MAY)» + «relation.transformPattern(relation.lookup(relation2PQuery), Modality.CURRENT)» + «ENDFOR» + ''' + } + + private def relationDefinitionName(RelationDefinition relation, Modality modality) + '''«modality.name.toLowerCase»InRelation_«base.canonizeName(relation.name)»''' + + private def canonizeName(PVariable v) { + return '''«IF v.referringConstraints.size == 1»_«ENDIF»var_«v.name.replaceAll("\\W","")»''' + } + + private def transformPattern(RelationDefinition relation, PQuery p, Modality modality) { + try { + return ''' + private pattern «relationDefinitionName(relation,modality)»( + problem:LogicProblem, interpretation:PartialInterpretation, + «FOR param : p.parameters SEPARATOR ', '»var_«param.name»«ENDFOR») + «FOR body : p.disjunctBodies.bodies SEPARATOR "or"»{ + find interpretation(problem,interpretation); + «FOR constraint : body.constraints» + «constraint.transformConstraint(modality)» + «ENDFOR» + }«ENDFOR» + ''' + } catch(UnsupportedOperationException e) { + throw new UnsupportedOperationException('''Can not transform pattern "«p.fullyQualifiedName»"!''',e) + } + } + + private 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) ''' + «IF !positive»neg «ENDIF»find «modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(problem,interpretation,«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 '''// attribute reference omitted'''//base.referRelationByName() + } else throw new UnsupportedOperationException('''unknown key: «key.class»''') + } else { + throw new UnsupportedOperationException() + } + } + + 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) '''«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 '''«a.canonizeName» != «b.canonizeName»;''' + } else if(modality.isMust) { + return '''neg find mayEquivalent(problem, interpretation, «a.canonizeName», «b.canonizeName»);''' + } else { + return '''«a.canonizeName» != «b.canonizeName»;''' + } + } + + private dispatch def transformConstraint(NegativePatternCall pcall, Modality modality) { + val params = (0..) { + targetString = '''const_«target.name»_«target.declaringClass.simpleName»''' + additionalDefinition = '''DefinedElement.name(«targetString»,"«target.name» «target.declaringClass.simpleName»"); LogicProblem.elements(problem,«targetString»);''' + } else if(target instanceof Integer) { + targetString = target.toString + additionalDefinition = '''''' + } else throw new UnsupportedOperationException('''Unknown constant type: «target.class»''') + + val source = c.variablesTuple + var String sourceName + if(source.size == 1) + sourceName = (source.get(0) as PVariable).canonizeName + else throw new UnsupportedOperationException("unknown source") + return '''«sourceName» == «targetString»;«additionalDefinition»'''; + } + + private dispatch def transformConstraint(PConstraint c, Modality modality) { + throw new UnsupportedOperationException('''Unknown constraint type: "«c.class.name»"!''') + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf