From a620f07468780778bd55dcffc30245def37ece69 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 6 Aug 2020 16:07:16 +0200 Subject: MoDeS3 unit propagation WIP --- .../ModelGenerationMethodProvider.xtend | 5 +- .../logic2viatra/patterns/PatternGenerator.xtend | 21 ++- .../logic2viatra/patterns/PatternProvider.xtend | 56 ++++---- .../patterns/RelationDeclarationIndexer.xtend | 158 +++++++++++---------- .../viatrasolver/reasoner/ViatraReasoner.xtend | 1 + .../reasoner/ViatraReasonerConfiguration.xtend | 5 +- 6 files changed, 140 insertions(+), 106 deletions(-) (limited to 'Solvers/VIATRA-Solver') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend index 56beacfa..431ae386 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend @@ -17,6 +17,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Z3Polyhe import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.ModalPatternQueries import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternProvider +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.GoalConstraintProvider import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.RefinementRuleProvider import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation @@ -116,6 +117,7 @@ class ModelGenerationMethodProvider { boolean calculateObjectCreationCosts, ScopePropagatorStrategy scopePropagatorStrategy, Collection hints, + Collection unitPropagationPatternGenerators, DocumentationLevel debugLevel ) { val statistics = new ModelGenerationStatistics @@ -126,7 +128,8 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, - workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, writeFiles) + workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, + unitPropagationPatternGenerators, writeFiles) val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend index 80bc3844..a3efcf76 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend @@ -25,12 +25,13 @@ import java.util.HashMap import java.util.Map import org.eclipse.emf.ecore.EAttribute import org.eclipse.emf.ecore.EReference +import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtend.lib.annotations.Data +import org.eclipse.xtend2.lib.StringConcatenationClient import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import org.eclipse.xtend.lib.annotations.Data -import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint @Data class PatternGeneratorResult { CharSequence patternText @@ -38,6 +39,14 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint HashMap constraint2CurrentPreconditionName } +interface UnitPropagationPatternGenerator { + def Map getMustPatterns() + + def Map getMustNotPatterns() + + def StringConcatenationClient getAdditionalPatterns(PatternGenerator generator, Map fqn2PQuery) +} + class PatternGenerator { @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this) @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer( @@ -157,7 +166,8 @@ class PatternGenerator { Map fqn2PQuery, TypeAnalysisResult typeAnalysisResult, RelationConstraints constraints, - Collection hints + Collection hints, + Collection unitPropagationPatternGenerators ) { val first = ''' @@ -313,7 +323,7 @@ class PatternGenerator { ////////// // 1.2 Relation Declaration Indexers ////////// - «relationDeclarationIndexer.generateRelationIndexers(problem,problem.relations.filter(RelationDeclaration),fqn2PQuery)» + «relationDeclarationIndexer.generateRelationIndexers(problem,problem.relations.filter(RelationDeclaration),unitPropagationPatternGenerators,fqn2PQuery)» ////////// // 1.3 Relation Definition Indexers @@ -367,6 +377,9 @@ class PatternGenerator { «FOR hint : hints» «hint.getAdditionalPatterns(this)» «ENDFOR» + «FOR generator : unitPropagationPatternGenerators» + «generator.getAdditionalPatterns(this, fqn2PQuery)» + «ENDFOR» ////////// // 6 Unit Propagations diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend index d57705ce..21fd1989 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend @@ -36,9 +36,9 @@ import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* public Map>> unfinishedWFQueries public Map multiplicityConstraintQueries public IQuerySpecification> hasElementInContainmentQuery - public Map>> refineObjectQueries + public Map>> refineObjectQueries public Map>> refineTypeQueries - public Map, IQuerySpecification>> refinerelationQueries + public Map, IQuerySpecification>> refinerelationQueries public Map>> mustUnitPropagationPreconditionPatterns public Map>> currentUnitPropagationPreconditionPatterns public Map modalRelationQueries @@ -56,7 +56,7 @@ class ModalPatternQueries { class UnifinishedMultiplicityQueries { val IQuerySpecification> existingMultiplicityQuery val IQuerySpecification> existingInverseMultiplicityQuery - + def Set>> getAllQueries() { val builder = ImmutableSet.builder if (existingMultiplicityQuery !== null) { @@ -75,8 +75,9 @@ class PatternProvider { def generateQueries(LogicProblem problem, PartialInterpretation emptySolution, ModelGenerationStatistics statistics, Set existingQueries, ReasonerWorkspace workspace, TypeInferenceMethod typeInferenceMethod, - ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, - Collection hints, boolean writeToFile) { + ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, + Collection hints, + Collection unitPropagationPatternGenerators, boolean writeToFile) { val fqn2Query = existingQueries.toMap[it.fullyQualifiedName] val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod, scopePropagatorStrategy) val typeAnalysisResult = if (patternGenerator.requiresTypeAnalysis) { @@ -89,15 +90,15 @@ class PatternProvider { null } val patternGeneratorResult = patternGenerator.transformBaseProperties(problem, emptySolution, fqn2Query, - typeAnalysisResult, relationConstraints, hints) + typeAnalysisResult, relationConstraints, hints, unitPropagationPatternGenerators) if (writeToFile) { workspace.writeText('''generated3valued.vql_deactivated''', patternGeneratorResult.patternText) } val ParseUtil parseUtil = new ParseUtil val generatedQueries = parseUtil.parse(patternGeneratorResult.patternText) val runtimeQueries = calclulateRuntimeQueries(patternGenerator, problem, emptySolution, typeAnalysisResult, - patternGeneratorResult.constraint2MustPreconditionName, patternGeneratorResult.constraint2CurrentPreconditionName, - relationConstraints, generatedQueries) + patternGeneratorResult.constraint2MustPreconditionName, + patternGeneratorResult.constraint2CurrentPreconditionName, relationConstraints, generatedQueries) return runtimeQueries } @@ -111,12 +112,13 @@ class PatternProvider { RelationConstraints relationConstraints, Map>> queries ) { - val Map>> - invalidWFQueries = patternGenerator.invalidIndexer.getInvalidateByWfQueryNames(problem).mapValues[it.lookup(queries)] - val Map>> - unfinishedWFQueries = patternGenerator.unfinishedIndexer.getUnfinishedWFQueryNames(problem).mapValues[it.lookup(queries)] - - val unfinishedMultiplicities = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries(relationConstraints.multiplicityConstraints) + val Map>> invalidWFQueries = patternGenerator. + invalidIndexer.getInvalidateByWfQueryNames(problem).mapValues[it.lookup(queries)] + val Map>> unfinishedWFQueries = patternGenerator. + unfinishedIndexer.getUnfinishedWFQueryNames(problem).mapValues[it.lookup(queries)] + + val unfinishedMultiplicities = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries( + relationConstraints.multiplicityConstraints) val multiplicityConstraintQueries = unfinishedMultiplicities.mapValues [ new UnifinishedMultiplicityQueries(existingMultiplicityQueryName?.lookup(queries), existingInverseMultiplicityQueryName?.lookup(queries)) @@ -124,16 +126,20 @@ class PatternProvider { val hasElementInContainmentQuery = patternGenerator.typeRefinementGenerator.hasElementInContainmentName.lookup( queries) - val Map>> - refineObjectsQueries = patternGenerator.typeRefinementGenerator.getRefineObjectQueryNames(problem,emptySolution,typeAnalysisResult).mapValues[it.lookup(queries)] - val Map>> - refineTypeQueries = patternGenerator.typeRefinementGenerator.getRefineTypeQueryNames(problem,emptySolution,typeAnalysisResult).mapValues[it.lookup(queries)] - val Map, IQuerySpecification>> - refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)] - val Map>> - mustUnitPropagationPreconditionPatterns = mustUnitPropagationTrace.mapValues[it.lookup(queries)] - val Map>> - currentUnitPropagationPreconditionPatterns = currentUnitPropagationTrace.mapValues[it.lookup(queries)] + val Map>> refineObjectsQueries = patternGenerator. + typeRefinementGenerator.getRefineObjectQueryNames(problem, emptySolution, typeAnalysisResult).mapValues [ + it.lookup(queries) + ] + val Map>> refineTypeQueries = patternGenerator. + typeRefinementGenerator.getRefineTypeQueryNames(problem, emptySolution, typeAnalysisResult).mapValues [ + it.lookup(queries) + ] + val Map, IQuerySpecification>> refineRelationQueries = patternGenerator. + relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)] + val Map>> mustUnitPropagationPreconditionPatterns = mustUnitPropagationTrace. + mapValues[it.lookup(queries)] + val Map>> currentUnitPropagationPreconditionPatterns = currentUnitPropagationTrace. + mapValues[it.lookup(queries)] val modalRelationQueries = problem.relations.filter(RelationDefinition).toMap([it], [ relationDefinition | val indexer = patternGenerator.relationDefinitionIndexer @@ -143,7 +149,7 @@ class PatternProvider { indexer.relationDefinitionName(relationDefinition, Modality.CURRENT).lookup(queries) ) ]) - + return new GeneratedPatterns( invalidWFQueries, unfinishedWFQueries, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend index b4403979..29d3eb61 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend @@ -1,10 +1,13 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns +import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableSet import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.UpperMultiplicityAssertion import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality +import java.util.Collection import java.util.HashMap import java.util.List import java.util.Map @@ -14,41 +17,40 @@ import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* class RelationDeclarationIndexer { val PatternGenerator base; - + new(PatternGenerator base) { this.base = base } - - def generateRelationIndexers(LogicProblem problem, Iterable relations, Map fqn2PQuery) { + + def generateRelationIndexers(LogicProblem problem, Iterable relations, + Iterable unitPropagationPatternGenerators, Map fqn2PQuery) { val upperMultiplicities = new HashMap - problem.annotations.filter(UpperMultiplicityAssertion).forEach[ - upperMultiplicities.put(it.relation,it.upper) + problem.annotations.filter(UpperMultiplicityAssertion).forEach [ + upperMultiplicities.put(it.relation, it.upper) ] - + val mustNotRelations = ImmutableMap.copyOf(unitPropagationPatternGenerators.flatMap[mustNotPatterns.entrySet]. + groupBy[key].mapValues[ImmutableSet.copyOf(map[value])]) + return ''' - «FOR relation : relations» - «IF base.isDerived(relation)» - «generateDerivedMustRelation(problem,relation,base.getDerivedDefinition(relation).patternFullyQualifiedName.lookup(fqn2PQuery))» - «generateDerivedMayRelation(problem,relation,base.getDerivedDefinition(relation).patternFullyQualifiedName.lookup(fqn2PQuery))» - «ELSE» - «generateMustRelation(problem,relation)» - «generateMayRelation(problem,relation,upperMultiplicities,base.getContainments(problem),base.getInverseRelations(problem),fqn2PQuery)» - «ENDIF» - «ENDFOR» + «FOR relation : relations» + «IF base.isDerived(relation)» + «generateDerivedMustRelation(problem,relation,base.getDerivedDefinition(relation).patternFullyQualifiedName.lookup(fqn2PQuery))» + «generateDerivedMayRelation(problem,relation,base.getDerivedDefinition(relation).patternFullyQualifiedName.lookup(fqn2PQuery))» + «ELSE» + «generateMustRelation(problem, relation)» + «generateMayRelation(problem, relation, upperMultiplicities, base.getContainments(problem), base.getInverseRelations(problem), mustNotRelations.get(relation) ?: emptySet, fqn2PQuery)» + «ENDIF» + «ENDFOR» ''' } - + def private patternName(RelationDeclaration r, Modality modality) { '''«modality.name.toLowerCase»InRelation«base.canonizeName(r.name)»''' } - - def referRelation( - RelationDeclaration referred, - String sourceVariable, - String targetVariable, - Modality modality) - '''find «referred.patternName(modality)»(problem,interpretation,«sourceVariable»,«targetVariable»);''' - + + def referRelation(RelationDeclaration referred, String sourceVariable, String targetVariable, + Modality modality) '''find «referred.patternName(modality)»(problem,interpretation,«sourceVariable»,«targetVariable»);''' + def generateMustRelation(LogicProblem problem, RelationDeclaration relation) ''' /** * Matcher for detecting tuples t where []«relation.name»(source,target) @@ -65,59 +67,64 @@ class RelationDeclarationIndexer { BinaryElementRelationLink.param2(link,target); } ''' + def generateMayRelation(LogicProblem problem, RelationDeclaration relation, - Map upperMultiplicities, - List containments, - HashMap inverseRelations, - Map fqn2PQuery) - { + Map upperMultiplicities, List containments, + HashMap inverseRelations, Collection mustNotRelations, + Map fqn2PQuery) { return ''' - /** - * Matcher for detecting tuples t where <>«relation.name»(source,target) - */ - private pattern «relation.patternName(Modality.MAY)»( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) - { - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - «base.typeIndexer.referInstanceOfByReference(relation.parameters.get(0),Modality.MAY,"source")» - «base.typeIndexer.referInstanceOfByReference(relation.parameters.get(1),Modality.MAY,"target")» - «IF upperMultiplicities.containsKey(relation)» - // There are "numberOfExistingReferences" currently existing instances of the reference from the source, - // the upper bound of the multiplicity should be considered. - numberOfExistingReferences == count «referRelation(relation,"source","_",Modality.MUST)» - numberOfExistingReferences != «upperMultiplicities.get(relation)»; - «ENDIF» - «IF inverseRelations.containsKey(relation) && upperMultiplicities.containsKey(inverseRelations.get(relation))» - // There are "numberOfExistingReferences" currently existing instances of the reference to the target, - // the upper bound of the opposite reference multiplicity should be considered. - numberOfExistingOppositeReferences == count «base.referRelation(inverseRelations.get(relation),"target","_",Modality.MUST,fqn2PQuery)» - numberOfExistingOppositeReferences != «upperMultiplicities.get(inverseRelations.get(relation))»; - «ENDIF» - «IF containments.contains(relation)» - // The reference is containment, then a new reference cannot be create if: - // 1. Multiple parents - neg «base.containmentIndexer.referMustContaint("_","target")» - // 2. Circle in the containment hierarchy - neg «base.containmentIndexer.referTransitiveMustContains("target","source")» - «ENDIF» - «IF inverseRelations.containsKey(relation) && containments.contains(inverseRelations.get(relation))» - // The eOpposite of the reference is containment, then a referene cannot be created if - // 1. Multiple parents - neg «base.containmentIndexer.referMustContaint("source","_")» - // 2. Circle in the containment hierarchy - neg «base.containmentIndexer.referTransitiveMustContains("source","target")» - «ENDIF» - } or { - «relation.referRelation("source","target",Modality.MUST)» - } - ''' + /** + * Matcher for detecting tuples t where <>«relation.name»(source,target) + */ + private pattern «relation.patternName(Modality.MAY)»( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) + { + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + «base.typeIndexer.referInstanceOfByReference(relation.parameters.get(0),Modality.MAY,"source")» + «base.typeIndexer.referInstanceOfByReference(relation.parameters.get(1),Modality.MAY,"target")» + «IF upperMultiplicities.containsKey(relation)» + // There are "numberOfExistingReferences" currently existing instances of the reference from the source, + // the upper bound of the multiplicity should be considered. + numberOfExistingReferences == count «referRelation(relation,"source","_",Modality.MUST)» + numberOfExistingReferences != «upperMultiplicities.get(relation)»; + «ENDIF» + «IF inverseRelations.containsKey(relation) && upperMultiplicities.containsKey(inverseRelations.get(relation))» + // There are "numberOfExistingReferences" currently existing instances of the reference to the target, + // the upper bound of the opposite reference multiplicity should be considered. + numberOfExistingOppositeReferences == count «base.referRelation(inverseRelations.get(relation),"target","_",Modality.MUST,fqn2PQuery)» + numberOfExistingOppositeReferences != «upperMultiplicities.get(inverseRelations.get(relation))»; + «ENDIF» + «IF containments.contains(relation)» + // The reference is containment, then a new reference cannot be create if: + // 1. Multiple parents + neg «base.containmentIndexer.referMustContaint("_","target")» + // 2. Circle in the containment hierarchy + neg «base.containmentIndexer.referTransitiveMustContains("target","source")» + «ENDIF» + «IF inverseRelations.containsKey(relation) && containments.contains(inverseRelations.get(relation))» + // The eOpposite of the reference is containment, then a referene cannot be created if + // 1. Multiple parents + neg «base.containmentIndexer.referMustContaint("source","_")» + // 2. Circle in the containment hierarchy + neg «base.containmentIndexer.referTransitiveMustContains("source","target")» + «ENDIF» + «IF mustNotRelations.empty» + // ![] unit propagation relations + «FOR mustNotRelation : mustNotRelations» + neg find «mustNotRelation»(problem, interpretation, source, target); + «ENDFOR» + «ENDIF» + } or { + «relation.referRelation("source","target",Modality.MUST)» + } + ''' } - + def generateDerivedMustRelation(LogicProblem problem, RelationDeclaration relation, PQuery definition) ''' /** * Matcher for detecting tuples t where []«relation.name»(source,target) @@ -129,6 +136,7 @@ class RelationDeclarationIndexer { «base.relationDefinitionIndexer.referPattern(definition,#["source","target"],Modality::MUST,true,false)» } ''' + def generateDerivedMayRelation(LogicProblem problem, RelationDeclaration relation, PQuery definition) ''' /** * Matcher for detecting tuples t where []«relation.name»(source,target) @@ -140,4 +148,4 @@ class RelationDeclarationIndexer { «base.relationDefinitionIndexer.referPattern(definition,#["source","target"],Modality::MAY,true,false)» } ''' -} \ No newline at end of file +} 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 c333feca..67d25208 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 @@ -91,6 +91,7 @@ class ViatraReasoner extends LogicReasoner { viatraConfig.calculateObjectCreationCosts, viatraConfig.scopePropagatorStrategy, viatraConfig.hints, + viatraConfig.unitPropagationPatternGenerators, viatraConfig.documentationLevel ) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend index 0173124c..a2ed6016 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend @@ -6,9 +6,11 @@ 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.viatrasolver.logic2viatra.ModelGenerationMethod import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedralScopePropagatorConstraints import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedralScopePropagatorSolver import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualiser import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold @@ -16,7 +18,6 @@ import java.util.LinkedList import java.util.List import java.util.Set import org.eclipse.xtext.xbase.lib.Functions.Function1 -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint enum StateCoderStrategy { Neighbourhood, @@ -77,6 +78,8 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var List hints = newArrayList public var List costObjectives = newArrayList + + public var List unitPropagationPatternGenerators = newArrayList } class DiversityDescriptor { -- cgit v1.2.3-70-g09d2