From a2ba6b5addbc82a635af4f90195581c08f9913c0 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Thu, 7 May 2020 19:22:16 +0200 Subject: multiple object additions fixes --- .../logic2viatra/ScopePropagator.xtend | 9 +++-- .../patterns/PConstraintTransformer.xtend | 31 ++++++++++++------ .../patterns/RelationDefinitionIndexer.xtend | 7 ++-- .../rules/RefinementRuleProvider.xtend | 38 ++++++++++++---------- .../viatrasolver/reasoner/ViatraReasoner.xtend | 1 + .../PartialInterpretation2Graphviz.xtend | 2 +- 6 files changed, 55 insertions(+), 33 deletions(-) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ScopePropagator.xtend index 38633c07..df38337e 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ScopePropagator.xtend @@ -63,9 +63,12 @@ class ScopePropagator { def public propagateAdditionToType(PartialTypeInterpratation t) { // println('''Adding to «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') val targetScope = type2Scope.get(t) - targetScope.removeOne - val sups = superScopes.get(targetScope) - sups.forEach[removeOne] + if(targetScope!==null) { + targetScope.removeOne + val sups = superScopes.get(targetScope) + sups.forEach[removeOne] + } + if(this.partialInterpretation.minNewElements > 0) { this.partialInterpretation.minNewElements = this.partialInterpretation.minNewElements-1 } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PConstraintTransformer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PConstraintTransformer.xtend index 608ab994..5ca78e97 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PConstraintTransformer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PConstraintTransformer.xtend @@ -143,7 +143,13 @@ class PConstraintTransformer { return referPattern(pcall.referredQuery,params,modality,true,true) } dispatch def transformConstraint(ExportedParameter e, Modality modality, List variableMapping) { - return '''// «e.parameterName» is exported''' + val v1 = '''var_«e.parameterName»''' + val v2 = e.parameterVariable.canonizeName + if(v1.compareTo(v2) == 0) { + return '''// «v1» exported''' + } else { + return '''«v1» == «v2»;''' + } } dispatch def transformConstraint(ConstantValue c, Modality modality, List variableMapping) { val target = c.supplierKey @@ -189,24 +195,29 @@ class PConstraintTransformer { def hasValue(PVariable v, String target, Modality m, List variableMapping) { val typeReference = variableMapping.filter[it.sourcePVariable === v].head.targetLogicVariable.range as PrimitiveTypeReference if(m.isMay) { - '''PrimitiveElement.valueSet(«v.canonizeName»,«v.valueSetted»); «hasValueExpression(typeReference,v,v.valueVariable)» check(!«v.valueSetted»||«v.valueVariable»==«target»));''' + '''PrimitiveElement.valueSet(«v.canonizeName»,«v.valueSetted»); «hasValueExpressionByRef(typeReference,v,v.valueVariable)» check(!«v.valueSetted»||«v.valueVariable»==«target»));''' } else { // Must or current - '''PrimitiveElement.valueSet(«v.canonizeName»,true);«hasValueExpression(typeReference,v,target)»''' + '''PrimitiveElement.valueSet(«v.canonizeName»,true);«hasValueExpressionByRef(typeReference,v,target)»''' } } private def hasValueExpression(List variableMapping, PVariable v, String target) { - hasValueExpression( - variableMapping.filter[it.sourcePVariable === v].head.targetLogicVariable.range, + val mapping = variableMapping.filter[ + val v2 = (it.sourcePVariable as PVariable) + v2 === v + ].head + val range = mapping.targetLogicVariable.range + hasValueExpressionByRef( + range, v, target ) } - private def dispatch hasValueExpression(BoolTypeReference typeReference, PVariable v, String target) '''BooleanElement.value(«v.canonizeName»,«target»);''' - private def dispatch hasValueExpression(IntTypeReference typeReference, PVariable v, String target) '''IntegerElement.value(«v.canonizeName»,«target»);''' - private def dispatch hasValueExpression(RealTypeReference typeReference, PVariable v, String target) '''RealElement.value(«v.canonizeName»,«target»);''' - private def dispatch hasValueExpression(StringTypeReference typeReference, PVariable v, String target) '''StringElement.value(«v.canonizeName»,«target»);''' - private def dispatch hasValueExpression(TypeReference typeReference, PVariable v, String target) { + private def dispatch hasValueExpressionByRef(BoolTypeReference typeReference, PVariable v, String target) '''BooleanElement.value(«v.canonizeName»,«target»);''' + private def dispatch hasValueExpressionByRef(IntTypeReference typeReference, PVariable v, String target) '''IntegerElement.value(«v.canonizeName»,«target»);''' + private def dispatch hasValueExpressionByRef(RealTypeReference typeReference, PVariable v, String target) '''RealElement.value(«v.canonizeName»,«target»);''' + private def dispatch hasValueExpressionByRef(StringTypeReference typeReference, PVariable v, String target) '''StringElement.value(«v.canonizeName»,«target»);''' + private def dispatch hasValueExpressionByRef(TypeReference typeReference, PVariable v, String target) { throw new UnsupportedOperationException('''Unsupported primitive type reference: «typeReference.class»''') } 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 bd6e3e6e..37950834 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 @@ -10,6 +10,7 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.Binary 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.queries.PDisjunction class RelationDefinitionIndexer { public val PatternGenerator base; @@ -23,7 +24,8 @@ class RelationDefinitionIndexer { def generateRelationDefinitions( LogicProblem problem, Iterable relations, - Map fqn2PQuery) { + Map fqn2PQuery) + { val relation2PQuery = relations.toInvertedMap[ annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) ] @@ -67,11 +69,12 @@ class RelationDefinitionIndexer { private def transformPattern(RelationDefinition relation, PQuery p, Modality modality) { try { + val bodies = (relation.annotations.filter(TransfomedViatraQuery).head.optimizedDisjunction as PDisjunction).bodies 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"»{ + «FOR body : bodies SEPARATOR "or"»{ find interpretation(problem,interpretation); «FOR constraint : body.constraints» «this.constraintTransformer.transformConstraint(constraint,modality,relation.annotations.filter(TransfomedViatraQuery).head.variableTrace)» diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend index 013da873..b4cb9ec7 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend @@ -90,7 +90,7 @@ class RefinementRuleProvider { if(containmentRelation !== null) { if(inverseRelation!== null) { ruleBuilder.action[match | - //println(name) + println(name) val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -115,7 +115,7 @@ class RefinementRuleProvider { ] } else { ruleBuilder.action[match | - //println(name) + println(name) val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -139,6 +139,7 @@ class RefinementRuleProvider { } } else { ruleBuilder.action[match | + println(name) val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -210,7 +211,7 @@ class RefinementRuleProvider { ) } } - } else if(relation.parameters instanceof PrimitiveTypeReference) { + } else if(relation.parameters.get(1) instanceof PrimitiveTypeReference) { val targetTypeInterpretation = getTypeInterpretation(i, relation, 1) for(var times=0; times [it.param1 = newElement it.param2 = container] inverseRelationInterpretation.relationlinks+=newLink2 + // Scope propagation + scopePropagator.propagateAdditionToType(typeInterpretation) + // Do recursive object creation for(newConstructor : recursiceObjectCreations) { createObjectAction(nameNewElement,newConstructor,newElement,scopePropagator) } - // Scope propagation - scopePropagator.propagateAdditionToType(typeInterpretation) - return newElement } @@ -451,14 +455,14 @@ class RefinementRuleProvider { val newLink = factory2.createBinaryElementRelationLink => [it.param1 = container it.param2 = newElement] relationInterpretation.relationlinks+=newLink + // Scope propagation + scopePropagator.propagateAdditionToType(typeInterpretation) + // Do recursive object creation for(newConstructor : recursiceObjectCreations) { createObjectAction(nameNewElement,newConstructor,newElement,scopePropagator) } - // Scope propagation - scopePropagator.propagateAdditionToType(typeInterpretation) - return newElement } @@ -484,14 +488,14 @@ class RefinementRuleProvider { typeInterpretation.supertypeInterpretation.forEach[it.elements += newElement] } + // Scope propagation + scopePropagator.propagateAdditionToType(typeInterpretation) + // Do recursive object creation for(newConstructor : recursiceObjectCreations) { createObjectAction(nameNewElement,newConstructor,newElement,scopePropagator) } - // Scope propagation - scopePropagator.propagateAdditionToType(typeInterpretation) - return newElement } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend index bdc48b8d..1e623823 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend @@ -77,6 +77,7 @@ class ViatraReasoner extends LogicReasoner{ scopePropagator, viatraConfig.documentationLevel ) + println("parsed") dse.addObjective(new ModelGenerationCompositeObjective( new ScopeObjective, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/PartialInterpretation2Graphviz.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/PartialInterpretation2Graphviz.xtend index 78326207..05a4e6c2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/PartialInterpretation2Graphviz.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.visualisation/src/hu/bme/mit/inf/dslreasoner/visualisation/pi2graphviz/PartialInterpretation2Graphviz.xtend @@ -155,7 +155,7 @@ class GraphvizVisualiser implements PartialInterpretationVisualiser { textWithSubSup(parts.getOrNull(0),parts.getOrNull(1),parts.getOrNull(2),null) } else { val parts = ID.split("\\s+") - textWithSubSup(parts.get(0),parts.get(1),parts.getOrNull(2),null) + textWithSubSup(parts.getOrNull(0),parts.getOrNull(1),parts.getOrNull(2),null) } val label = Label.html( ''''''+ -- cgit v1.2.3-54-g00ecf