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/GenericTypeRefinementGenerator.xtend | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/GenericTypeRefinementGenerator.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/GenericTypeRefinementGenerator.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/GenericTypeRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/GenericTypeRefinementGenerator.xtend new file mode 100644 index 00000000..4b7af959 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/GenericTypeRefinementGenerator.xtend @@ -0,0 +1,102 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns + +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.util.HashMap + +class GenericTypeRefinementGenerator extends TypeRefinementGenerator { + public new(PatternGenerator base) { + super(base) + } + override requiresTypeAnalysis() { false } + + override generateRefineObjectQueries(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult) { + val containment = p.containmentHierarchies.head + val newObjectTypes = p.types.filter(TypeDeclaration).filter[!isAbstract] + val inverseRelations = new HashMap + p.annotations.filter(InverseRelationAssertion).forEach[ + inverseRelations.put(it.inverseA,it.inverseB) + inverseRelations.put(it.inverseB,it.inverseA) + ] + return ''' + «FOR type:newObjectTypes» + «IF(containment.typesOrderedInHierarchy.contains(type))» + «FOR containmentRelation : containment.containmentRelations.filter[canBeContainedByRelation(it,type)]» + «IF inverseRelations.containsKey(containmentRelation)» + pattern «this.patternName(containmentRelation,inverseRelations.get(containmentRelation),type)»( + problem:LogicProblem, interpretation:PartialInterpretation, + relationInterpretation:PartialRelationInterpretation, inverseInterpretation:PartialRelationInterpretation ,typeInterpretation:PartialTypeInterpratation, + container:DefinedElement) + { + find interpretation(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialTypeInterpratation.interpretationOf.name(typeInterpretation,"«type.name»"); + PartialInterpretation.partialrelationinterpretation(interpretation,relationInterpretation); + PartialRelationInterpretation.interpretationOf.name(relationInterpretation,"«containmentRelation.name»"); + PartialInterpretation.partialrelationinterpretation(interpretation,inverseInterpretation); + PartialRelationInterpretation.interpretationOf.name(inverseInterpretation,"«inverseRelations.get(containmentRelation).name»"); + «base.typeIndexer.referInstanceOf((containmentRelation.parameters.get(0) as ComplexTypeReference).referred,Modality.MUST,"container")» + «base.typeIndexer.referInstanceOf(type,Modality.MAY,"newObject")» + «base.relationDeclarationIndexer.referRelation(containmentRelation as RelationDeclaration,"container","newObject",Modality.MAY)» + find mustExist(problem, interpretation, container); + neg find mustExist(problem, interpretation, newObject); + } + «ELSE» + pattern «this.patternName(containmentRelation,null,type)»( + problem:LogicProblem, interpretation:PartialInterpretation, + relationInterpretation:PartialRelationInterpretation, typeInterpretation:PartialTypeInterpratation, + container:DefinedElement) + { + find interpretation(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialTypeInterpratation.interpretationOf.name(typeInterpretation,"«type.name»"); + PartialInterpretation.partialrelationinterpretation(interpretation,relationInterpretation); + PartialRelationInterpretation.interpretationOf.name(relationInterpretation,"«containmentRelation.name»"); + «base.typeIndexer.referInstanceOf((containmentRelation.parameters.get(0) as ComplexTypeReference).referred,Modality.MUST,"container")» + «base.typeIndexer.referInstanceOf(type,Modality.MAY,"newObject")» + «base.relationDeclarationIndexer.referRelation(containmentRelation as RelationDeclaration,"container","newObject",Modality.MAY)» + find mustExist(problem, interpretation, container); + neg find mustExist(problem, interpretation, newObject); + } + «ENDIF» + «ENDFOR» + «ELSE» + pattern createObject_«this.patternName(null,null,type)»( + problem:LogicProblem, interpretation:PartialInterpretation, + typeInterpretation:PartialTypeInterpratation) + { + find interpretation(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialTypeInterpratation.interpretationOf.name(type,"«type.name»"); + «base.typeIndexer.referInstanceOf(type,Modality.MAY,"newObject")» + find mayExist(problem, interpretation, newObject); + neg find mustExist(problem, interpretation, newObject); + } + «ENDIF» + «ENDFOR» + ''' + } + + override generateRefineTypeQueries(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult) { + return ''' + «FOR type : p.types.filter(TypeDeclaration).filter[!it.isAbstract]» + pattern refineTypeTo_«base.canonizeName(type.name)»(problem:LogicProblem, interpretation:PartialInterpretation, object: DefinedElement) { + find interpretation(problem,interpretation); + find mustExist(problem, interpretation, object); + «base.typeIndexer.referInstanceOf(type,Modality.MAY,"object")» + neg «base.typeIndexer.referInstanceOf(type,Modality.MUST,"object")» + } + «ENDFOR» + ''' + } + + override getRefineTypeQueryNames(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult) { + p.types.filter(TypeDeclaration).toInvertedMap['''refineTypeTo_«base.canonizeName(it.name)»'''] + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf