From 4c80187e223ed4b500a68a5d83446f80565e3440 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Mon, 11 May 2020 04:06:18 +0200 Subject: Instead of Bigdecimals doubleValue are used in check --- .../patterns/PConstraintTransformer.xtend | 6 +++-- .../patterns/PExpressionGenerator.xtend | 29 ++++++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver') 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 5ca78e97..423bb204 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 @@ -28,6 +28,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference +import java.util.Map class PConstraintTransformer { val extension RelationDefinitionIndexer relationDefinitionIndexer; @@ -226,6 +227,7 @@ class PConstraintTransformer { throw new UnsupportedOperationException('''Only check expressions are supported "«e.class.name»"!''') } else { val expression = expressionExtractor.extractExpression(e.evaluator) + val Map variable2Type = e.affectedVariables.toInvertedMap[v|variableMapping.filter[it.sourcePVariable === v].head.targetLogicVariable.range as PrimitiveTypeReference] if(modality.isMay) { return ''' «FOR variable: e.affectedVariables» @@ -234,7 +236,7 @@ class PConstraintTransformer { check( «FOR variable: e.affectedVariables SEPARATOR " || "»!«variable.valueSetted»«ENDFOR» || - («expressionGenerator.translateExpression(expression,e.affectedVariables.toInvertedMap[valueVariable])») + («expressionGenerator.translateExpression(expression,e.affectedVariables.toInvertedMap[valueVariable],variable2Type)») ); ''' } else { // Must or Current @@ -242,7 +244,7 @@ class PConstraintTransformer { «FOR variable: e.affectedVariables» PrimitiveElement.valueSet(«variable.canonizeName»,true); «hasValueExpression(variableMapping,variable,variable.valueVariable)» «ENDFOR» - check(«expressionGenerator.translateExpression(expression,e.affectedVariables.toInvertedMap[valueVariable])»); + check(«expressionGenerator.translateExpression(expression,e.affectedVariables.toInvertedMap[valueVariable],variable2Type)»); ''' } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PExpressionGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PExpressionGenerator.xtend index 303c87b9..62ff92b2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PExpressionGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PExpressionGenerator.xtend @@ -8,6 +8,8 @@ import org.eclipse.xtext.xbase.XFeatureCall import org.eclipse.xtext.xbase.XMemberFeatureCall import org.eclipse.xtext.xbase.XNumberLiteral import org.eclipse.xtext.xbase.XUnaryOperation +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.PrimitiveTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference class PExpressionGenerator { static val N_Base = "org.eclipse.xtext.xbase.lib." @@ -38,9 +40,9 @@ class PExpressionGenerator { static val N_POWER2 = "java.lang.Math.pow" - def dispatch CharSequence translateExpression(XBinaryOperation e, Map valueName) { - val left = e.leftOperand.translateExpression(valueName) - val right = e.rightOperand.translateExpression(valueName) + def dispatch CharSequence translateExpression(XBinaryOperation e, Map valueName, Map variable2Type) { + val left = e.leftOperand.translateExpression(valueName,variable2Type) + val right = e.rightOperand.translateExpression(valueName,variable2Type) val feature = e.feature.qualifiedName if(feature.isN(N_MINUS2)) { return '''(«left»-«right»)'''} else if(feature.isN(N_PLUS2)) { return '''(«left»+«right»)''' } @@ -65,8 +67,8 @@ class PExpressionGenerator { } } - def dispatch CharSequence translateExpression(XUnaryOperation e, Map valueName) { - val operand = e.operand.translateExpression(valueName) + def dispatch CharSequence translateExpression(XUnaryOperation e, Map valueName, Map variable2Type) { + val operand = e.operand.translateExpression(valueName,variable2Type) val feature = e.feature.qualifiedName if(feature.isN(N_MINUS1)) { return '''(-«operand»)'''} else if(feature.isN(N_PLUS1)) { return '''(+«operand»)'''} @@ -78,8 +80,8 @@ class PExpressionGenerator { } } - def dispatch CharSequence translateExpression(XMemberFeatureCall e, Map valueName) { - val transformedArguments = e.actualArguments.map[translateExpression(valueName)] + def dispatch CharSequence translateExpression(XMemberFeatureCall e, Map valueName, Map variable2Type) { + val transformedArguments = e.actualArguments.map[translateExpression(valueName,variable2Type)] val feature = e.feature.qualifiedName if(feature == N_POWER2) { return '''Math.pow(«transformedArguments.get(0)»,«transformedArguments.get(1)»)''' @@ -91,19 +93,24 @@ class PExpressionGenerator { } } - def dispatch CharSequence translateExpression(XFeatureCall e, Map valueName) { + def dispatch CharSequence translateExpression(XFeatureCall e, Map valueName, Map variable2Type) { val featureName = e.feature.qualifiedName + val type = variable2Type.entrySet.filter[it.key.name===featureName].head.value val entryWithName = valueName.entrySet.filter[it.key.name == featureName].head if(entryWithName !== null) { - return entryWithName.value + if(type instanceof RealTypeReference) { + return '''(«entryWithName.value».doubleValue)''' + } else { + return entryWithName.value + } } else { throw new IllegalArgumentException('''Feature call reference to unavailable variable "«featureName»"''') } } - def dispatch CharSequence translateExpression(XNumberLiteral l, Map valueName) '''«l.value»''' + def dispatch CharSequence translateExpression(XNumberLiteral l, Map valueName, Map variable2Type) '''«l.value»''' - def dispatch CharSequence translateExpression(XExpression expression, Map valueName) { + def dispatch CharSequence translateExpression(XExpression expression, Map valueName, Map variable2Type) { throw new UnsupportedOperationException('''Unsupported expression in check or eval: «expression.class.name», «expression»"''') } } \ No newline at end of file -- cgit v1.2.3-54-g00ecf