From fc505b6b171a2d54c3bad6078031b028b55131d3 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 14 Jul 2019 00:56:19 +0200 Subject: Polyhedron abstraction with Z3 for cardinality propagation --- .../logic2viatra/cardinality/ScopePropagator.xtend | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend new file mode 100644 index 00000000..c8fb3409 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -0,0 +1,149 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope +import java.util.HashMap +import java.util.HashSet +import java.util.Map +import java.util.Set +import org.eclipse.xtend.lib.annotations.Accessors + +enum ScopePropagatorStrategy { + BasicTypeHierarchy, + PolyhedralTypeHierarchy +} + +class ScopePropagator { + @Accessors(PROTECTED_GETTER) PartialInterpretation partialInterpretation + Map type2Scope + + val Map> superScopes + val Map> subScopes + + new(PartialInterpretation p) { + partialInterpretation = p + type2Scope = new HashMap + for (scope : p.scopes) { + type2Scope.put(scope.targetTypeInterpretation, scope) + } + + superScopes = new HashMap + subScopes = new HashMap + for (scope : p.scopes) { + superScopes.put(scope, new HashSet) + subScopes.put(scope, new HashSet) + } + + for (scope : p.scopes) { + val target = scope.targetTypeInterpretation + if (target instanceof PartialComplexTypeInterpretation) { + val supertypeInterpretations = target.supertypeInterpretation + for (supertypeInterpretation : supertypeInterpretations) { + val supertypeScope = type2Scope.get(supertypeInterpretation) + superScopes.get(scope).add(supertypeScope) + subScopes.get(supertypeScope).add(scope) + } + } + } + } + + def propagateAllScopeConstraints() { + var boolean hadChanged + do { + hadChanged = false + for (superScopeEntry : superScopes.entrySet) { + val sub = superScopeEntry.key + hadChanged = propagateLowerLimitUp(sub, partialInterpretation) || hadChanged + hadChanged = propagateUpperLimitDown(sub, partialInterpretation) || hadChanged + for (sup : superScopeEntry.value) { + hadChanged = propagateLowerLimitUp(sub, sup) || hadChanged + hadChanged = propagateUpperLimitDown(sub, sup) || hadChanged + } + } + } while (hadChanged) + } + + def 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 (this.partialInterpretation.minNewElements > 0) { + this.partialInterpretation.minNewElements = this.partialInterpretation.minNewElements - 1 + } + if (this.partialInterpretation.maxNewElements > 0) { + this.partialInterpretation.maxNewElements = this.partialInterpretation.maxNewElements - 1 + } else if (this.partialInterpretation.maxNewElements === 0) { + throw new IllegalArgumentException('''Inconsistent object creation: lower node limit is 0!''') + } + propagateAllScopeConstraints + +// println('''Target Scope: «targetScope.minNewElements» - «targetScope.maxNewElements»''') +// println(''' «this.partialInterpretation.minNewElements» - «this.partialInterpretation.maxNewElements»''') +// this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] +// println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') + } + + private def propagateLowerLimitUp(Scope subScope, Scope superScope) { + if (subScope.minNewElements > superScope.minNewElements) { + superScope.minNewElements = subScope.minNewElements + return true + } else { + return false + } + } + + private def propagateUpperLimitDown(Scope subScope, Scope superScope) { + if (superScope.maxNewElements >= 0 && + (superScope.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> «(superScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» +// subScope.maxNewElements «subScope.maxNewElements» = superScope.maxNewElements «superScope.maxNewElements» +// ''') + subScope.maxNewElements = superScope.maxNewElements + return true + } else { + return false + } + } + + private def propagateLowerLimitUp(Scope subScope, PartialInterpretation p) { + if (subScope.minNewElements > p.minNewElements) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes +// p.minNewElements «p.minNewElements» = subScope.minNewElements «subScope.minNewElements» +// ''') + p.minNewElements = subScope.minNewElements + return true + } else { + return false + } + } + + private def propagateUpperLimitDown(Scope subScope, PartialInterpretation p) { + if (p.maxNewElements >= 0 && (p.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes +// subScope.maxNewElements «subScope.maxNewElements» = p.maxNewElements «p.maxNewElements» +// ''') + subScope.maxNewElements = p.maxNewElements + return true + } else { + return false + } + } + + private def removeOne(Scope scope) { + if (scope.maxNewElements === 0) { + throw new IllegalArgumentException('''Inconsistent object creation: «scope.targetTypeInterpretation»''') + } else if (scope.maxNewElements > 0) { + scope.maxNewElements = scope.maxNewElements - 1 + } + if (scope.minNewElements > 0) { + scope.minNewElements = scope.minNewElements - 1 + } + } +} -- cgit v1.2.3-54-g00ecf From c420930fbd57421e8accaf3d6af9baa3e868213b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 14 Jul 2019 20:48:09 +0200 Subject: Transitive closure of type hierarchy in ScopePropagator This does not mappter for propagateAllScopeConstraints(), but propagateAdditionToType gets more exact this way. --- .../cardinality/PolyhedronScopePropagator.xtend | 1 + .../logic2viatra/cardinality/ScopePropagator.xtend | 14 ++++++++++++++ 2 files changed, 15 insertions(+) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index 8f210ffb..cebd89da 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -27,6 +27,7 @@ class PolyhedronScopePropagator extends ScopePropagator { // Dimensions for instantiable types were created according to the type analysis, // but for any possible primitive types, we create them on demand, // as there is no Type directly associated with a PartialPrimitiveInterpretation. + // Below we will assume that each PartialTypeInterpretation has at most one Scope. for (scope : p.scopes) { switch (targetTypeInterpretation : scope.targetTypeInterpretation) { PartialPrimitiveInterpretation: { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index c8fb3409..f0494214 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -47,6 +47,20 @@ class ScopePropagator { } } } + var boolean changed + do { + changed = false + for (scope : p.scopes) { + val subScopeSet = subScopes.get(scope) + val superScopeSet = superScopes.get(scope) + for (subScope : subScopeSet) { + changed = changed || superScopes.get(subScope).addAll(superScopeSet) + } + for (superScope : superScopeSet) { + changed = changed || subScopes.get(superScope).addAll(subScopeSet) + } + } + } while (changed) } def propagateAllScopeConstraints() { -- cgit v1.2.3-54-g00ecf From 64138e8d91bc8d7bb54d9b042f872b43550dec16 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 24 Jul 2019 10:59:02 +0200 Subject: Cardinality propagator WIP --- .../ModelGenerationMethodProvider.xtend | 12 +- .../MultiplicityGoalConstraintCalculator.xtend | 46 --- .../MultiplicityGoalConstraintCalculator.xtend | 46 +++ .../cardinality/PolyhedronScopePropagator.xtend | 355 +++++++++++++++++---- .../cardinality/PolyhedronSolver.xtend | 32 +- .../cardinality/RelationConstraintCalculator.xtend | 133 ++++++++ .../logic2viatra/cardinality/ScopePropagator.xtend | 5 - .../cardinality/ScopePropagatorStrategy.java | 18 ++ .../logic2viatra/patterns/PatternGenerator.xtend | 150 +++++---- .../logic2viatra/patterns/PatternProvider.xtend | 115 ++++--- .../patterns/RelationRefinementGenerator.xtend | 102 +++--- .../patterns/TypeRefinementGenerator.xtend | 4 +- .../logic2viatra/patterns/UnfinishedIndexer.xtend | 222 +++++++++---- .../rules/GoalConstraintProvider.xtend | 2 +- .../reasoner/ViatraReasonerConfiguration.xtend | 2 +- .../dse/UnfinishedMultiplicityObjective.xtend | 10 +- .../tests/cardinality/PolyhedronSolverTest.xtend | 28 +- 17 files changed, 902 insertions(+), 380 deletions(-) delete mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') 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 0ceb5b2e..3a99d3bf 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 @@ -5,7 +5,9 @@ import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.CbcPolyhedronSolver +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronScopePropagator +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns @@ -61,6 +63,7 @@ class ModelGenerationMethodProvider { val PatternProvider patternProvider = new PatternProvider val RefinementRuleProvider refinementRuleProvider = new RefinementRuleProvider val GoalConstraintProvider goalConstraintProvider = new GoalConstraintProvider + val relationConstraintCalculator = new RelationConstraintCalculator def ModelGenerationMethod createModelGenerationMethod( LogicProblem logicProblem, @@ -77,8 +80,9 @@ class ModelGenerationMethodProvider { val Set existingQueries = logicProblem.relations.map[annotations].flatten.filter(TransfomedViatraQuery). map[it.patternPQuery as PQuery].toSet + val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, - workspace, typeInferenceMethod, writeFiles) + workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, writeFiles) val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, queries) scopePropagator.propagateAllScopeConstraints val // LinkedHashMap, BatchTransformationRule>> @@ -117,10 +121,12 @@ class ModelGenerationMethodProvider { switch (scopePropagatorStrategy) { case BasicTypeHierarchy: new ScopePropagator(emptySolution) - case PolyhedralTypeHierarchy: { + case PolyhedralTypeHierarchy, + case PolyhedralRelations: { val types = queries.refineObjectQueries.keySet.map[newType].toSet val solver = new CbcPolyhedronSolver - new PolyhedronScopePropagator(emptySolution, types, solver) + new PolyhedronScopePropagator(emptySolution, types, queries.multiplicityConstraintQueries, solver, + scopePropagatorStrategy.requiresUpperBoundIndexing) } default: throw new IllegalArgumentException("Unknown scope propagator strategy: " + scopePropagatorStrategy) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend deleted file mode 100644 index 4b9629df..00000000 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend +++ /dev/null @@ -1,46 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra - -import org.eclipse.emf.common.notify.Notifier -import org.eclipse.viatra.query.runtime.api.IQuerySpecification -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine -import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher -import org.eclipse.viatra.query.runtime.emf.EMFScope - -class MultiplicityGoalConstraintCalculator { - val String targetRelationName; - val IQuerySpecification querySpecification; - var ViatraQueryMatcher matcher; - - new(String targetRelationName, IQuerySpecification querySpecification) { - this.targetRelationName = targetRelationName - this.querySpecification = querySpecification - this.matcher = null - } - - new(MultiplicityGoalConstraintCalculator other) { - this.targetRelationName = other.targetRelationName - this.querySpecification = other.querySpecification - this.matcher = null - } - - def getName() { - targetRelationName - } - - def init(Notifier notifier) { - val engine = ViatraQueryEngine.on(new EMFScope(notifier)) - matcher = querySpecification.getMatcher(engine) - } - - def calculateValue() { - var res = 0 - val allMatches = this.matcher.allMatches - for(match : allMatches) { - //println(targetRelationName+ " missing multiplicity: "+match.get(3)) - val missingMultiplicity = match.get(4) as Integer - res += missingMultiplicity - } - //println(targetRelationName+ " all missing multiplicities: "+res) - return res - } -} \ No newline at end of file diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend new file mode 100644 index 00000000..86a59aa1 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend @@ -0,0 +1,46 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import org.eclipse.emf.common.notify.Notifier +import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.emf.EMFScope + +class MultiplicityGoalConstraintCalculator { + val String targetRelationName; + val IQuerySpecification querySpecification; + var ViatraQueryMatcher matcher; + + new(String targetRelationName, IQuerySpecification querySpecification) { + this.targetRelationName = targetRelationName + this.querySpecification = querySpecification + this.matcher = null + } + + new(MultiplicityGoalConstraintCalculator other) { + this.targetRelationName = other.targetRelationName + this.querySpecification = other.querySpecification + this.matcher = null + } + + def getName() { + targetRelationName + } + + def init(Notifier notifier) { + val engine = ViatraQueryEngine.on(new EMFScope(notifier)) + matcher = querySpecification.getMatcher(engine) + } + + def calculateValue() { + var res = 0 + val allMatches = this.matcher.allMatches + for(match : allMatches) { + //println(targetRelationName+ " missing multiplicity: "+match.get(3)) + val missingMultiplicity = match.get(2) as Integer + res += missingMultiplicity + } + //println(targetRelationName+ " all missing multiplicities: "+res) + return res + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index cebd89da..4f0c8f20 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -2,90 +2,60 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableMap +import com.google.common.collect.Maps import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnifinishedMultiplicityQueries import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialPrimitiveInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope import java.util.ArrayDeque +import java.util.ArrayList import java.util.HashMap import java.util.HashSet +import java.util.List import java.util.Map import java.util.Set +import javax.naming.OperationNotSupportedException +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.emf.EMFScope +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor class PolyhedronScopePropagator extends ScopePropagator { val Map scopeBounds - val LinearConstraint topLevelBounds + val LinearBoundedExpression topLevelBounds + val Polyhedron polyhedron val PolyhedronSaturationOperator operator + List updaters = emptyList - new(PartialInterpretation p, Set possibleNewDynamicTypes, PolyhedronSolver solver) { + new(PartialInterpretation p, Set possibleNewDynamicTypes, + Map unfinishedMultiplicityQueries, + PolyhedronSolver solver, boolean propagateRelations) { super(p) - val instanceCounts = possibleNewDynamicTypes.toInvertedMap[new Dimension(name, 0, null)] - val primitiveDimensions = new HashMap - val constraintsBuilder = ImmutableList.builder - val scopeBoundsBuilder = ImmutableMap.builder - // Dimensions for instantiable types were created according to the type analysis, - // but for any possible primitive types, we create them on demand, - // as there is no Type directly associated with a PartialPrimitiveInterpretation. - // Below we will assume that each PartialTypeInterpretation has at most one Scope. - for (scope : p.scopes) { - switch (targetTypeInterpretation : scope.targetTypeInterpretation) { - PartialPrimitiveInterpretation: { - val dimension = primitiveDimensions.computeIfAbsent(targetTypeInterpretation) [ interpretation | - new Dimension(interpretation.eClass.name, 0, null) - ] - scopeBoundsBuilder.put(scope, dimension) - } - PartialComplexTypeInterpretation: { - val complexType = targetTypeInterpretation.interpretationOf - val dimensions = findSubtypeDimensions(complexType, instanceCounts) - switch (dimensions.size) { - case 0: - if (scope.minNewElements > 0) { - throw new IllegalArgumentException("Found scope for " + complexType.name + - ", but the type cannot be instantiated") - } - case 1: - scopeBoundsBuilder.put(scope, dimensions.head) - default: { - val constraint = new LinearConstraint(dimensions.toInvertedMap[1], null, null) - constraintsBuilder.add(constraint) - scopeBoundsBuilder.put(scope, constraint) - } - } - } - default: - throw new IllegalArgumentException("Unknown PartialTypeInterpretation: " + targetTypeInterpretation) - } - } - val allDimensions = ImmutableList.builder.addAll(instanceCounts.values).addAll(primitiveDimensions.values).build - scopeBounds = scopeBoundsBuilder.build - topLevelBounds = new LinearConstraint(allDimensions.toInvertedMap[1], null, null) - constraintsBuilder.add(topLevelBounds) - val expressionsToSaturate = ImmutableList.builder.addAll(scopeBounds.values).add(topLevelBounds).build - val polyhedron = new Polyhedron(allDimensions, constraintsBuilder.build, expressionsToSaturate) + val builder = new PolyhedronBuilder(p) + builder.buildPolyhedron(possibleNewDynamicTypes) + scopeBounds = builder.scopeBounds + topLevelBounds = builder.topLevelBounds + polyhedron = builder.polyhedron operator = solver.createSaturationOperator(polyhedron) - } - - private def findSubtypeDimensions(Type type, Map instanceCounts) { - val subtypes = new HashSet - val dimensions = new HashSet - val stack = new ArrayDeque - stack.addLast(type) - while (!stack.empty) { - val subtype = stack.removeLast - if (subtypes.add(subtype)) { - val dimension = instanceCounts.get(subtype) - if (dimension !== null) { - dimensions.add(dimension) - } - stack.addAll(subtype.subtypes) + if (propagateRelations) { + propagateAllScopeConstraints() + val maximumNumberOfNewNodes = topLevelBounds.upperBound + if (maximumNumberOfNewNodes === null) { + throw new IllegalStateException("Could not determine maximum number of new nodes, it may be unbounded") + } + if (maximumNumberOfNewNodes <= 0) { + throw new IllegalStateException("Maximum number of new nodes is negative") } + builder.buildMultiplicityConstraints(unfinishedMultiplicityQueries, maximumNumberOfNewNodes) + updaters = builder.updaters } - dimensions } override void propagateAllScopeConstraints() { + resetBounds() populatePolyhedronFromScope() val result = operator.saturate() if (result == PolyhedronSaturationResult.EMPTY) { @@ -96,21 +66,36 @@ class PolyhedronScopePropagator extends ScopePropagator { super.propagateAllScopeConstraints() } } + // println(polyhedron) + } + + def resetBounds() { + for (dimension : polyhedron.dimensions) { + dimension.lowerBound = 0 + dimension.upperBound = null + } + for (constraint : polyhedron.constraints) { + constraint.lowerBound = null + constraint.upperBound = null + } } private def populatePolyhedronFromScope() { - topLevelBounds.lowerBound = partialInterpretation.minNewElements + topLevelBounds.tightenLowerBound(partialInterpretation.minNewElements) if (partialInterpretation.maxNewElements >= 0) { - topLevelBounds.upperBound = partialInterpretation.maxNewElements + topLevelBounds.tightenUpperBound(partialInterpretation.maxNewElements) } for (pair : scopeBounds.entrySet) { val scope = pair.key val bounds = pair.value - bounds.lowerBound = scope.minNewElements + bounds.tightenLowerBound(scope.minNewElements) if (scope.maxNewElements >= 0) { - bounds.upperBound = scope.maxNewElements + bounds.tightenUpperBound(scope.maxNewElements) } } + for (updater : updaters) { + updater.update(partialInterpretation) + } } private def populateScopesFromPolyhedron() { @@ -151,4 +136,242 @@ class PolyhedronScopePropagator extends ScopePropagator { throw new IllegalArgumentException("Infinite upper bound: " + bounds) } } + + private static def getCalculatedMultiplicity(ViatraQueryMatcher matcher, + PartialInterpretation p) { + val match = matcher.newEmptyMatch + match.set(0, p.problem) + match.set(1, p) + val iterator = matcher.streamAllMatches(match).iterator + if (!iterator.hasNext) { + return null + } + val value = iterator.next.get(2) as Integer + if (iterator.hasNext) { + throw new IllegalArgumentException("Multiplicity calculation query has more than one match") + } + value + } + + @FinalFieldsConstructor + private static class PolyhedronBuilder { + static val INFINITY_SCALE = 10 + + val PartialInterpretation p + + Map instanceCounts + Map> subtypeDimensions + Map, LinearBoundedExpression> expressionsCache + Map typeBounds + int infinity + ViatraQueryEngine queryEngine + ImmutableList.Builder updatersBuilder + + Map scopeBounds + LinearBoundedExpression topLevelBounds + Polyhedron polyhedron + List updaters + + def buildPolyhedron(Set possibleNewDynamicTypes) { + instanceCounts = possibleNewDynamicTypes.toInvertedMap[new Dimension(name, 0, null)] + val types = p.problem.types + expressionsCache = Maps.newHashMapWithExpectedSize(types.size) + subtypeDimensions = types.toInvertedMap[findSubtypeDimensions.toInvertedMap[1]] + typeBounds = ImmutableMap.copyOf(subtypeDimensions.mapValues[toExpression]) + scopeBounds = buildScopeBounds + topLevelBounds = instanceCounts.values.toInvertedMap[1].toExpression + val dimensions = ImmutableList.copyOf(instanceCounts.values) + val expressionsToSaturate = ImmutableList.copyOf(scopeBounds.values) + polyhedron = new Polyhedron(dimensions, new ArrayList, expressionsToSaturate) + addCachedConstraintsToPolyhedron() + } + + def buildMultiplicityConstraints( + Map constraints, + int maximumNuberOfNewNodes) { + infinity = maximumNuberOfNewNodes * INFINITY_SCALE + queryEngine = ViatraQueryEngine.on(new EMFScope(p)) + updatersBuilder = ImmutableList.builder + for (pair : constraints.entrySet.filter[key.containment].groupBy[key.targetType].entrySet) { + buildContainmentConstraints(pair.key, pair.value) + } + for (pair : constraints.entrySet) { + val constraint = pair.key + if (!constraint.containment) { + buildNonContainmentConstraints(constraint, pair.value) + } + } + updaters = updatersBuilder.build + addCachedConstraintsToPolyhedron() + } + + private def addCachedConstraintsToPolyhedron() { + val constraints = new HashSet + constraints.addAll(expressionsCache.values.filter(LinearConstraint)) + constraints.removeAll(polyhedron.constraints) + polyhedron.constraints.addAll(constraints) + } + + private def buildContainmentConstraints(Type containedType, + List> constraints) { + val typeCoefficients = subtypeDimensions.get(containedType) + val orphansLowerBoundCoefficients = new HashMap(typeCoefficients) + val orphansUpperBoundCoefficients = new HashMap(typeCoefficients) + val unfinishedMultiplicitiesMatchersBuilder = ImmutableList.builder + val remainingContentsQueriesBuilder = ImmutableList.builder + for (pair : constraints) { + val constraint = pair.key + val containerCoefficients = subtypeDimensions.get(constraint.sourceType) + if (constraint.isUpperBoundFinite) { + orphansLowerBoundCoefficients.addCoefficients(-constraint.upperBound, containerCoefficients) + } else { + orphansLowerBoundCoefficients.addCoefficients(-infinity, containerCoefficients) + } + orphansUpperBoundCoefficients.addCoefficients(-constraint.lowerBound, containerCoefficients) + val queries = pair.value + if (constraint.constrainsUnfinished) { + if (queries.unfinishedMultiplicityQuery === null) { + throw new IllegalArgumentException( + "Containment constraints need unfinished multiplicity queries") + } + unfinishedMultiplicitiesMatchersBuilder.add( + queries.unfinishedMultiplicityQuery.getMatcher(queryEngine)) + } + if (queries.remainingContentsQuery === null) { + throw new IllegalArgumentException("Containment constraints need remaining contents queries") + } + remainingContentsQueriesBuilder.add(queries.remainingContentsQuery.getMatcher(queryEngine)) + } + val orphanLowerBound = orphansLowerBoundCoefficients.toExpression + val orphanUpperBound = orphansUpperBoundCoefficients.toExpression + val updater = new ContainmentConstraintUpdater(containedType.name, orphanLowerBound, orphanUpperBound, + unfinishedMultiplicitiesMatchersBuilder.build, remainingContentsQueriesBuilder.build) + updatersBuilder.add(updater) + } + + private def buildNonContainmentConstraints(RelationMultiplicityConstraint constraint, + UnifinishedMultiplicityQueries queries) { + } + + private def addCoefficients(Map accumulator, int scale, Map a) { + for (pair : a.entrySet) { + val dimension = pair.key + val currentValue = accumulator.get(pair.key) ?: 0 + val newValue = currentValue + scale * pair.value + if (newValue == 0) { + accumulator.remove(dimension) + } else { + accumulator.put(dimension, newValue) + } + } + } + + private def findSubtypeDimensions(Type type) { + val subtypes = new HashSet + val dimensions = new HashSet + val stack = new ArrayDeque + stack.addLast(type) + while (!stack.empty) { + val subtype = stack.removeLast + if (subtypes.add(subtype)) { + val dimension = instanceCounts.get(subtype) + if (dimension !== null) { + dimensions.add(dimension) + } + stack.addAll(subtype.subtypes) + } + } + dimensions + } + + private def toExpression(Map coefficients) { + expressionsCache.computeIfAbsent(coefficients) [ c | + if (c.size == 1 && c.entrySet.head.value == 1) { + c.entrySet.head.key + } else { + new LinearConstraint(c, null, null) + } + ] + } + + private def buildScopeBounds() { + val scopeBoundsBuilder = ImmutableMap.builder + for (scope : p.scopes) { + switch (targetTypeInterpretation : scope.targetTypeInterpretation) { + PartialPrimitiveInterpretation: + throw new OperationNotSupportedException("Primitive type scopes are not yet implemented") + PartialComplexTypeInterpretation: { + val complexType = targetTypeInterpretation.interpretationOf + val typeBound = typeBounds.get(complexType) + if (typeBound === null) { + if (scope.minNewElements > 0) { + throw new IllegalArgumentException("Found scope for " + complexType.name + + ", but the type cannot be instantiated") + } + } else { + scopeBoundsBuilder.put(scope, typeBound) + } + } + default: + throw new IllegalArgumentException("Unknown PartialTypeInterpretation: " + + targetTypeInterpretation) + } + } + scopeBoundsBuilder.build + } + } + + private static interface RelationConstraintUpdater { + def void update(PartialInterpretation p) + } + + @FinalFieldsConstructor + static class ContainmentConstraintUpdater implements RelationConstraintUpdater { + val String name + val LinearBoundedExpression orphansLowerBound + val LinearBoundedExpression orphansUpperBound + val List> unfinishedMultiplicitiesMatchers + val List> remainingContentsQueries + + override update(PartialInterpretation p) { + tightenLowerBound(p) + tightenUpperBound(p) + } + + private def tightenLowerBound(PartialInterpretation p) { + var int sum = 0 + for (matcher : remainingContentsQueries) { + val value = matcher.getCalculatedMultiplicity(p) + if (value === null) { + throw new IllegalArgumentException("Remaining contents count is missing for " + name) + } + if (value == -1) { + // Infinite upper bound, no need to tighten. + return + } + sum += value + } + orphansLowerBound.tightenUpperBound(sum) + } + + private def tightenUpperBound(PartialInterpretation p) { + var int sum = 0 + for (matcher : unfinishedMultiplicitiesMatchers) { + val value = matcher.getCalculatedMultiplicity(p) + if (value === null) { + throw new IllegalArgumentException("Unfinished multiplicity is missing for " + name) + } + sum += value + } + orphansUpperBound.tightenLowerBound(sum) + } + } + + @FinalFieldsConstructor + static class ContainmentRootConstraintUpdater implements RelationConstraintUpdater { + + override update(PartialInterpretation p) { + throw new UnsupportedOperationException("TODO: auto-generated method stub") + } + } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend index 08bf25b9..9c6cb82e 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend @@ -52,18 +52,14 @@ class Polyhedron { val List expressionsToSaturate override toString() ''' - Dimensions: - «FOR dimension : dimensions» - «dimension» - «ENDFOR» - Constraints: - «FOR constraint : constraints» - «constraint» - «ENDFOR» -««« Saturate: -««« «FOR expression : expressionsToSaturate» -««« «IF expression instanceof Dimension»dimension«ELSEIF expression instanceof LinearConstraint»constraint«ELSE»unknown«ENDIF» «expression» -««« «ENDFOR» + Dimensions: + «FOR dimension : dimensions» + «dimension» + «ENDFOR» + Constraints: + «FOR constraint : constraints» + «constraint» + «ENDFOR» ''' } @@ -72,6 +68,18 @@ class Polyhedron { abstract class LinearBoundedExpression { var Integer lowerBound var Integer upperBound + + def void tightenLowerBound(Integer tighterBound) { + if (lowerBound === null || (tighterBound !== null && lowerBound < tighterBound)) { + lowerBound = tighterBound + } + } + + def void tightenUpperBound(Integer tighterBound) { + if (upperBound === null || (tighterBound !== null && upperBound > tighterBound)) { + upperBound = tighterBound + } + } } @Accessors diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend new file mode 100644 index 00000000..ffa9e6e6 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend @@ -0,0 +1,133 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import com.google.common.collect.ImmutableList +import com.google.common.collect.ImmutableSet +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.UpperMultiplicityAssertion +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import java.util.HashMap +import java.util.List +import org.eclipse.xtend.lib.annotations.Data + +@Data +class RelationConstraints { + val List multiplicityConstraints +} + +@Data +class RelationMultiplicityConstraint { + Relation relation + boolean containment + boolean container + int lowerBound + int upperBound + int inverseUpperBound + + def isUpperBoundFinite() { + upperBound >= 0 + } + + private def isInverseUpperBoundFinite() { + inverseUpperBound >= 0 + } + + private def canHaveMultipleSourcesPerTarget() { + inverseUpperBound != 1 + } + + def constrainsUnfinished() { + lowerBound >= 1 && (!container || lowerBound >= 2) + } + + def constrainsUnrepairable() { + constrainsUnfinished && canHaveMultipleSourcesPerTarget + } + + def constrainsRemainingInverse() { + !containment && inverseUpperBoundFinite + } + + def constrainsRemainingContents() { + containment + } + + def isActive() { + constrainsUnfinished || constrainsUnrepairable || constrainsRemainingInverse || constrainsRemainingContents + } + + def getSourceType() { + getParamType(0) + } + + def getTargetType() { + getParamType(1) + } + + private def getParamType(int i) { + val parameters = relation.parameters + if (i < parameters.size) { + val firstParam = parameters.get(i) + if (firstParam instanceof ComplexTypeReference) { + return firstParam.referred + } + } + throw new IllegalArgumentException("Constraint with unknown source type") + } +} + +class RelationConstraintCalculator { + def calculateRelationConstraints(LogicProblem problem) { + val containmentRelations = switch (problem.containmentHierarchies.size) { + case 0: + emptySet + case 1: + ImmutableSet.copyOf(problem.containmentHierarchies.head.containmentRelations) + default: + throw new IllegalArgumentException("Only a single containment hierarchy is supported") + } + val inverseRelations = new HashMap + val lowerMultiplicities = new HashMap + val upperMultiplicities = new HashMap + for (relation : problem.relations) { + lowerMultiplicities.put(relation, 0) + upperMultiplicities.put(relation, -1) + } + for (annotation : problem.annotations) { + switch (annotation) { + InverseRelationAssertion: { + inverseRelations.put(annotation.inverseA, annotation.inverseB) + inverseRelations.put(annotation.inverseB, annotation.inverseA) + } + LowerMultiplicityAssertion: + lowerMultiplicities.put(annotation.relation, annotation.lower) + UpperMultiplicityAssertion: + upperMultiplicities.put(annotation.relation, annotation.upper) + } + } + val multiplicityConstraintsBuilder = ImmutableList.builder() + for (relation : problem.relations) { + val containment = containmentRelations.contains(relation) + val lowerMultiplicity = lowerMultiplicities.get(relation) + val upperMultiplicity = upperMultiplicities.get(relation) + var container = false + var inverseUpperMultiplicity = -1 + val inverseRelation = inverseRelations.get(relation) + if (inverseRelation !== null) { + inverseUpperMultiplicity = upperMultiplicities.get(relation) + container = containmentRelations.contains(inverseRelation) + } + val constraint = new RelationMultiplicityConstraint(relation, containment, container, lowerMultiplicity, + upperMultiplicity, inverseUpperMultiplicity) + if (constraint.isActive) { + if (relation.parameters.size != 2) { + throw new IllegalArgumentException('''Relation «relation.name» has multiplicity or containment constraints, but it is not binary''') + } + multiplicityConstraintsBuilder.add(constraint) + } + } + new RelationConstraints(multiplicityConstraintsBuilder.build) + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index f0494214..3b442cd3 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -10,11 +10,6 @@ import java.util.Map import java.util.Set import org.eclipse.xtend.lib.annotations.Accessors -enum ScopePropagatorStrategy { - BasicTypeHierarchy, - PolyhedralTypeHierarchy -} - class ScopePropagator { @Accessors(PROTECTED_GETTER) PartialInterpretation partialInterpretation Map type2Scope diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java new file mode 100644 index 00000000..b1c5a658 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java @@ -0,0 +1,18 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality; + +public enum ScopePropagatorStrategy { + BasicTypeHierarchy, + + PolyhedralTypeHierarchy, + + PolyhedralRelations { + @Override + public boolean requiresUpperBoundIndexing() { + return true; + } + }; + + public boolean requiresUpperBoundIndexing() { + return false; + } +} 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 24b3e870..1b0db90e 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 @@ -1,7 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion -import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion 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 @@ -17,6 +16,7 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Transform 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.logic2viatra.TypeInferenceMethod +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import java.util.HashMap import java.util.Map @@ -26,22 +26,26 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend.lib.annotations.Accessors import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy class PatternGenerator { - @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer //= new TypeIndexer(this) - @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer(this) - @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer(this) + @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this) + @Accessors(PUBLIC_GETTER) val RelationDeclarationIndexer relationDeclarationIndexer = new RelationDeclarationIndexer( + this) + @Accessors(PUBLIC_GETTER) val RelationDefinitionIndexer relationDefinitionIndexer = new RelationDefinitionIndexer( + this) @Accessors(PUBLIC_GETTER) val ContainmentIndexer containmentIndexer = new ContainmentIndexer(this) @Accessors(PUBLIC_GETTER) val InvalidIndexer invalidIndexer = new InvalidIndexer(this) - @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer = new UnfinishedIndexer(this) - @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator //= new RefinementGenerator(this) - @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) - - public new(TypeInferenceMethod typeInferenceMethod) { - if(typeInferenceMethod == TypeInferenceMethod.Generic) { + @Accessors(PUBLIC_GETTER) val UnfinishedIndexer unfinishedIndexer + @Accessors(PUBLIC_GETTER) val TypeRefinementGenerator typeRefinementGenerator // = new RefinementGenerator(this) + @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator( + this) + + new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { + if (typeInferenceMethod == TypeInferenceMethod.Generic) { this.typeIndexer = new GenericTypeIndexer(this) this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) - } else if(typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { + } else if (typeInferenceMethod == TypeInferenceMethod.PreliminaryAnalysis) { this.typeIndexer = new TypeIndexerWithPreliminaryTypeAnalysis(this) this.typeRefinementGenerator = new TypeRefinementWithPreliminaryTypeAnalysis(this) } else { @@ -49,112 +53,100 @@ class PatternGenerator { this.typeRefinementGenerator = null throw new IllegalArgumentException('''Unknown type indexing technique : «typeInferenceMethod.name»''') } + this.unfinishedIndexer = new UnfinishedIndexer(this, scopePropagatorStrategy.requiresUpperBoundIndexing) } - - public def requiresTypeAnalysis() { + + def requiresTypeAnalysis() { typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis } - - public dispatch def CharSequence referRelation( - RelationDeclaration referred, - String sourceVariable, - String targetVariable, - Modality modality, - Map fqn2PQuery) - { - return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality) + + dispatch def CharSequence referRelation(RelationDeclaration referred, String sourceVariable, String targetVariable, + Modality modality, Map fqn2PQuery) { + return this.relationDeclarationIndexer.referRelation(referred, sourceVariable, targetVariable, modality) } - public dispatch def CharSequence referRelation( - RelationDefinition referred, - String sourceVariable, - String targetVariable, - Modality modality, - Map fqn2PQuery) - { - val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup(fqn2PQuery) - return this.relationDefinitionIndexer.referPattern(pattern,#[sourceVariable,targetVariable],modality,true,false) + + dispatch def CharSequence referRelation(RelationDefinition referred, String sourceVariable, String targetVariable, + Modality modality, Map fqn2PQuery) { + val pattern = referred.annotations.filter(TransfomedViatraQuery).head.patternFullyQualifiedName.lookup( + fqn2PQuery) + return this.relationDefinitionIndexer.referPattern(pattern, #[sourceVariable, targetVariable], modality, true, + false) } - - def public referRelationByName(EReference reference, - String sourceVariable, - String targetVariable, - Modality modality) - { - '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''') - »(problem,interpretation,«sourceVariable»,«targetVariable»);''' + + def referRelationByName(EReference reference, String sourceVariable, String targetVariable, Modality modality) { + '''find «modality.name.toLowerCase»InRelation«canonizeName('''«reference.name» reference «reference.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);''' } - - def public CharSequence referAttributeByName(EAttribute attribute, - String sourceVariable, - String targetVariable, - Modality modality) - { - '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''') - »(problem,interpretation,«sourceVariable»,«targetVariable»);''' + + def CharSequence referAttributeByName(EAttribute attribute, String sourceVariable, String targetVariable, + Modality modality) { + '''find «modality.name.toLowerCase»InRelation«canonizeName('''«attribute.name» attribute «attribute.EContainingClass.name»''')»(problem,interpretation,«sourceVariable»,«targetVariable»);''' } - - public def canonizeName(String name) { + + def canonizeName(String name) { name.split(' ').join('_') } - - public def lowerMultiplicities(LogicProblem problem) { - problem.assertions.map[annotations].flatten.filter(LowerMultiplicityAssertion).filter[!it.relation.isDerived] - } - public def wfQueries(LogicProblem problem) { - problem.assertions.map[it.annotations] - .flatten - .filter(TransformedViatraWellformednessConstraint) - .map[it.query] + + def wfQueries(LogicProblem problem) { + problem.assertions.map[it.annotations].flatten.filter(TransformedViatraWellformednessConstraint).map[it.query] } - public def getContainments(LogicProblem p) { + + def getContainments(LogicProblem p) { return p.containmentHierarchies.head.containmentRelations } - public def getInverseRelations(LogicProblem p) { + + def getInverseRelations(LogicProblem p) { val inverseRelations = new HashMap - p.annotations.filter(InverseRelationAssertion).forEach[ - inverseRelations.put(it.inverseA,it.inverseB) - inverseRelations.put(it.inverseB,it.inverseA) + p.annotations.filter(InverseRelationAssertion).forEach [ + inverseRelations.put(it.inverseA, it.inverseB) + inverseRelations.put(it.inverseB, it.inverseA) ] return inverseRelations } - public def isRepresentative(Relation relation, Relation inverse) { - if(inverse == null) { + + def isRepresentative(Relation relation, Relation inverse) { + if (inverse === null) { return true } else { - relation.name.compareTo(inverse.name)<1 + relation.name.compareTo(inverse.name) < 1 } } - - public def isDerived(Relation relation) { + + def isDerived(Relation relation) { relation.annotations.exists[it instanceof DefinedByDerivedFeature] } - public def getDerivedDefinition(RelationDeclaration relation) { + + def getDerivedDefinition(RelationDeclaration relation) { relation.annotations.filter(DefinedByDerivedFeature).head.query } - + private def allTypeReferences(LogicProblem problem) { problem.eAllContents.filter(TypeReference).toIterable } + protected def hasBoolean(LogicProblem problem) { problem.allTypeReferences.exists[it instanceof BoolTypeReference] } + protected def hasInteger(LogicProblem problem) { problem.allTypeReferences.exists[it instanceof IntTypeReference] } + protected def hasReal(LogicProblem problem) { problem.allTypeReferences.exists[it instanceof RealTypeReference] } + protected def hasString(LogicProblem problem) { problem.allTypeReferences.exists[it instanceof StringTypeReference] } - - public def transformBaseProperties( + + def transformBaseProperties( LogicProblem problem, PartialInterpretation emptySolution, - Map fqn2PQuery, - TypeAnalysisResult typeAnalysisResult + Map fqn2PQuery, + TypeAnalysisResult typeAnalysisResult, + RelationConstraints constraints ) { - + return ''' import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" @@ -188,7 +180,7 @@ class PatternGenerator { private pattern elementCloseWorld(element:DefinedElement) { PartialInterpretation.openWorldElements(i,element); - PartialInterpretation.maxNewElements(i,0); + PartialInterpretation.maxNewElements(i,0); } or { Scope.targetTypeInterpretation(scope,interpretation); PartialTypeInterpratation.elements(interpretation,element); @@ -221,7 +213,7 @@ class PatternGenerator { ////////// // 1.1.1 primitive Type Indexers ////////// -««« pattern instanceofBoolean(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { + ««« pattern instanceofBoolean(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { ««« find interpretation(problem,interpretation); ««« PartialInterpretation.booleanelements(interpretation,element); ««« } @@ -279,7 +271,7 @@ class PatternGenerator { ////////// // 3.1 Unfinishedness Measured by Multiplicity ////////// - «unfinishedIndexer.generateUnfinishedMultiplicityQueries(problem,fqn2PQuery)» + «unfinishedIndexer.generateUnfinishedMultiplicityQueries(constraints.multiplicityConstraints,fqn2PQuery)» ////////// // 3.2 Unfinishedness Measured by WF Queries @@ -302,6 +294,6 @@ class PatternGenerator { // 4.3 Relation refinement ////////// «relationRefinementGenerator.generateRefineReference(problem)» - ''' + ''' } } 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 e87f52af..90f79810 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 @@ -10,6 +10,8 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStati import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysis import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationMultiplicityConstraint import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util.ParseUtil import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace @@ -23,78 +25,96 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend.lib.annotations.Data import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy -@Data class GeneratedPatterns { - public Map>> invalidWFQueries - public Map>> unfinishedWFQueries - public Map>> unfinishedMulticiplicityQueries - public Map>> refineObjectQueries - public Map>> refineTypeQueries - public Map, IQuerySpecification>> refinerelationQueries +@Data +class GeneratedPatterns { + public Map>> invalidWFQueries + public Map>> unfinishedWFQueries + public Map multiplicityConstraintQueries + public Map>> unfinishedMulticiplicityQueries + public Map>> refineObjectQueries + public Map>> refineTypeQueries + public Map, IQuerySpecification>> refinerelationQueries public Map modalRelationQueries public Collection>> allQueries } -@Data class ModalPatternQueries { +@Data +class ModalPatternQueries { val IQuerySpecification> mayQuery val IQuerySpecification> mustQuery val IQuerySpecification> currentQuery } +@Data +class UnifinishedMultiplicityQueries { + val IQuerySpecification> unfinishedMultiplicityQuery + val IQuerySpecification> unrepairableMultiplicityQuery + val IQuerySpecification> remainingInverseMultiplicityQuery + val IQuerySpecification> remainingContentsQuery +} + class PatternProvider { - + val TypeAnalysis typeAnalysis = new TypeAnalysis - - public def generateQueries( - LogicProblem problem, - PartialInterpretation emptySolution, - ModelGenerationStatistics statistics, - Set existingQueries, - ReasonerWorkspace workspace, - TypeInferenceMethod typeInferenceMethod, - boolean writeToFile) - { + + def generateQueries(LogicProblem problem, PartialInterpretation emptySolution, ModelGenerationStatistics statistics, + Set existingQueries, ReasonerWorkspace workspace, TypeInferenceMethod typeInferenceMethod, + ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, boolean writeToFile) { val fqn2Query = existingQueries.toMap[it.fullyQualifiedName] - val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod) - val typeAnalysisResult = if(patternGenerator.requiresTypeAnalysis) { - val startTime = System.nanoTime - val result = typeAnalysis.performTypeAnalysis(problem,emptySolution) - val typeAnalysisTime = System.nanoTime - startTime - statistics.PreliminaryTypeAnalisisTime = typeAnalysisTime - result - } else { - null - } - val baseIndexerFile = patternGenerator.transformBaseProperties(problem,emptySolution,fqn2Query,typeAnalysisResult) - if(writeToFile) { - workspace.writeText('''generated3valued.vql_deactivated''',baseIndexerFile) + val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod, scopePropagatorStrategy) + val typeAnalysisResult = if (patternGenerator.requiresTypeAnalysis) { + val startTime = System.nanoTime + val result = typeAnalysis.performTypeAnalysis(problem, emptySolution) + val typeAnalysisTime = System.nanoTime - startTime + statistics.PreliminaryTypeAnalisisTime = typeAnalysisTime + result + } else { + null + } + val baseIndexerFile = patternGenerator.transformBaseProperties(problem, emptySolution, fqn2Query, + typeAnalysisResult, relationConstraints) + if (writeToFile) { + workspace.writeText('''generated3valued.vql_deactivated''', baseIndexerFile) } val ParseUtil parseUtil = new ParseUtil val generatedQueries = parseUtil.parse(baseIndexerFile) - val runtimeQueries = calclulateRuntimeQueries(patternGenerator,problem,emptySolution,typeAnalysisResult,generatedQueries); + val runtimeQueries = calclulateRuntimeQueries(patternGenerator, problem, emptySolution, typeAnalysisResult, + relationConstraints, generatedQueries) return runtimeQueries } - + private def GeneratedPatterns calclulateRuntimeQueries( PatternGenerator patternGenerator, LogicProblem problem, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult, + 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 Map>> - unfinishedMultiplicityQueries = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries(problem).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 modalRelationQueries = problem.relations.filter(RelationDefinition).toMap([it], [ relationDefinition | + val invalidWFQueries = patternGenerator.invalidIndexer.getInvalidateByWfQueryNames(problem).mapValues [ + it.lookup(queries) + ] + val unfinishedWFQueries = patternGenerator.unfinishedIndexer.getUnfinishedWFQueryNames(problem).mapValues [ + it.lookup(queries) + ] + val multiplicityConstraintQueries = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries( + relationConstraints.multiplicityConstraints).mapValues [ + new UnifinishedMultiplicityQueries(unfinishedMultiplicityQueryName?.lookup(queries), + unrepairableMultiplicityQueryName?.lookup(queries), + remainingInverseMultiplicityQueryName?.lookup(queries), remainingContentsQueryName?.lookup(queries)) + ] + val unfinishedMultiplicityQueries = multiplicityConstraintQueries.entrySet.filter [ + value.unfinishedMultiplicityQuery !== null + ].toMap([key.relation], [value.unfinishedMultiplicityQuery]) + val refineObjectsQueries = patternGenerator.typeRefinementGenerator. + getRefineObjectQueryNames(problem, emptySolution, typeAnalysisResult).mapValues[it.lookup(queries)] + val refineTypeQueries = patternGenerator.typeRefinementGenerator.getRefineTypeQueryNames(problem, emptySolution, + typeAnalysisResult).mapValues[it.lookup(queries)] + val refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem). + mapValues[it.lookup(queries)] + val modalRelationQueries = problem.relations.filter(RelationDefinition).toMap([it], [ relationDefinition | val indexer = patternGenerator.relationDefinitionIndexer new ModalPatternQueries( indexer.relationDefinitionName(relationDefinition, Modality.MAY).lookup(queries), @@ -105,6 +125,7 @@ class PatternProvider { return new GeneratedPatterns( invalidWFQueries, unfinishedWFQueries, + multiplicityConstraintQueries, unfinishedMultiplicityQueries, refineObjectsQueries, refineTypeQueries, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index f9e9baea..fa73c861 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend @@ -9,77 +9,71 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference class RelationRefinementGenerator { PatternGenerator base; + public new(PatternGenerator base) { this.base = base } - - def CharSequence generateRefineReference(LogicProblem p) { - return ''' - «FOR relationRefinement: this.getRelationRefinements(p)» - pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( - problem:LogicProblem, interpretation:PartialInterpretation, - relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value != null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», - from: DefinedElement, to: DefinedElement) - { - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); - «IF relationRefinement.value != null» - PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); - PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); - «ENDIF» - find mustExist(problem, interpretation, from); - find mustExist(problem, interpretation, to); - «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» - «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» - «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» - neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» - } + + def CharSequence generateRefineReference(LogicProblem p) ''' + «FOR relationRefinement : this.getRelationRefinements(p)» + pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value !== null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», + from: DefinedElement, to: DefinedElement) + { + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); + «IF relationRefinement.value !== null» + PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); + PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); + «ENDIF» + find mustExist(problem, interpretation, from); + find mustExist(problem, interpretation, to); + «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» + «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» + «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» + neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» + } «ENDFOR» - ''' - } - + ''' + def String relationRefinementQueryName(RelationDeclaration relation, Relation inverseRelation) { - '''«IF inverseRelation != null - »refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelation.name)»« - ELSE - »refineRelation_«base.canonizeName(relation.name)»«ENDIF»''' + '''«IF inverseRelation !== null»refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelation.name)»«ELSE»refineRelation_«base.canonizeName(relation.name)»«ENDIF»''' } - + def referRefinementQuery(RelationDeclaration relation, Relation inverseRelation, String relInterpretationName, - String inverseInterpretationName, String sourceName, String targetName) - '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation != null»inverseInterpretationName, «ENDIF»«sourceName», «targetName»);''' - + String inverseInterpretationName, String sourceName, + String targetName) '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation !== null»inverseInterpretationName, «ENDIF»«sourceName», «targetName»);''' + def getRefineRelationQueries(LogicProblem p) { // val containmentRelations = p.containmentHierarchies.map[containmentRelations].flatten.toSet // p.relations.filter(RelationDeclaration).filter[!containmentRelations.contains(it)].toInvertedMap['''refineRelation_«base.canonizeName(it.name)»'''] /* - val res = new LinkedHashMap - for(relation: getRelationRefinements(p)) { - if(inverseRelations.containsKey(relation)) { - val name = '''refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelations.get(relation).name)»''' - res.put(relation -> inverseRelations.get(relation),name) - } else { - val name = '''refineRelation_«base.canonizeName(relation.name)»''' - res.put(relation -> null,name) - } - } - return res*/ - - getRelationRefinements(p).toInvertedMap[relationRefinementQueryName(it.key,it.value)] + * val res = new LinkedHashMap + * for(relation: getRelationRefinements(p)) { + * if(inverseRelations.containsKey(relation)) { + * val name = '''refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelations.get(relation).name)»''' + * res.put(relation -> inverseRelations.get(relation),name) + * } else { + * val name = '''refineRelation_«base.canonizeName(relation.name)»''' + * res.put(relation -> null,name) + * } + * } + return res*/ + getRelationRefinements(p).toInvertedMap[relationRefinementQueryName(it.key, it.value)] } - def getRelationRefinements(LogicProblem p) { val inverses = base.getInverseRelations(p) val containments = base.getContainments(p) val list = new LinkedList - for(relation : p.relations.filter(RelationDeclaration)) { - if(!containments.contains(relation)) { - if(inverses.containsKey(relation)) { + for (relation : p.relations.filter(RelationDeclaration)) { + if (!containments.contains(relation)) { + if (inverses.containsKey(relation)) { val inverse = inverses.get(relation) - if(!containments.contains(inverse)) { - if(base.isRepresentative(relation,inverse)) { + if (!containments.contains(inverse)) { + if (base.isRepresentative(relation, inverse)) { list += (relation -> inverse) } } @@ -90,4 +84,4 @@ class RelationRefinementGenerator { } return list } -} \ No newline at end of file +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend index 7e3fad91..ee7299cd 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend @@ -86,8 +86,8 @@ abstract class TypeRefinementGenerator { } protected def String patternName(Relation containmentRelation, Relation inverseContainment, Type newType) { - if(containmentRelation != null) { - if(inverseContainment != null) { + if(containmentRelation !== null) { + if(inverseContainment !== null) { '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»_with_«base.canonizeName(inverseContainment.name)»''' } else { '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»''' diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend index ad1c9033..286756a8 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend @@ -1,85 +1,195 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns -import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem -import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransformedViatraWellformednessConstraint +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationMultiplicityConstraint +import java.util.LinkedHashMap +import java.util.List import java.util.Map import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery +import org.eclipse.xtend.lib.annotations.Data import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import java.util.LinkedHashMap -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference + +@Data +class UnifinishedMultiplicityQueryNames { + val String unfinishedMultiplicityQueryName + val String unrepairableMultiplicityQueryName + val String remainingInverseMultiplicityQueryName + val String remainingContentsQueryName +} class UnfinishedIndexer { val PatternGenerator base - - new(PatternGenerator patternGenerator) { + val boolean indexUpperMultiplicities + + new(PatternGenerator patternGenerator, boolean indexUpperMultiplicities) { this.base = patternGenerator + this.indexUpperMultiplicities = indexUpperMultiplicities } - - def generateUnfinishedWfQueries(LogicProblem problem, Map fqn2PQuery) { + + def generateUnfinishedWfQueries(LogicProblem problem, Map fqn2PQuery) { val wfQueries = base.wfQueries(problem) ''' - «FOR wfQuery: wfQueries» - pattern unfinishedBy_«base.canonizeName(wfQuery.target.name)»(problem:LogicProblem, interpretation:PartialInterpretation, - «FOR param : wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters SEPARATOR ', '»var_«param.name»«ENDFOR») - { - «base.relationDefinitionIndexer.referPattern( + «FOR wfQuery : wfQueries» + pattern unfinishedBy_«base.canonizeName(wfQuery.target.name)»(problem:LogicProblem, interpretation:PartialInterpretation, + «FOR param : wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters SEPARATOR ', '»var_«param.name»«ENDFOR») + { + «base.relationDefinitionIndexer.referPattern( wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery), wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters.map['''var_«it.name»'''], Modality.CURRENT, true,false)» - } - «ENDFOR» + } + «ENDFOR» ''' } + def getUnfinishedWFQueryNames(LogicProblem problem) { val wfQueries = base.wfQueries(problem) val map = new LinkedHashMap - for(wfQuery : wfQueries) { - map.put(wfQuery.target,'''unfinishedBy_«base.canonizeName(wfQuery.target.name)»''') + for (wfQuery : wfQueries) { + map.put(wfQuery.target, '''unfinishedBy_«base.canonizeName(wfQuery.target.name)»''') } return map } - def generateUnfinishedMultiplicityQueries(LogicProblem problem, Map fqn2PQuery) { - val lowerMultiplicities = base.lowerMultiplicities(problem) - return ''' - «FOR lowerMultiplicity : lowerMultiplicities» - pattern «unfinishedMultiplicityName(lowerMultiplicity)»(problem:LogicProblem, interpretation:PartialInterpretation, relationIterpretation:PartialRelationInterpretation, object:DefinedElement,missingMultiplicity) { - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«lowerMultiplicity.relation.name»"); - «base.typeIndexer.referInstanceOf(lowerMultiplicity.firstParamTypeOfRelation,Modality::MUST,"object")» - numberOfExistingReferences == count «base.referRelation(lowerMultiplicity.relation,"object","_",Modality.MUST,fqn2PQuery)» - check(numberOfExistingReferences < «lowerMultiplicity.lower»); - missingMultiplicity == eval(«lowerMultiplicity.lower»-numberOfExistingReferences); - } + + def generateUnfinishedMultiplicityQueries(List constraints, + Map fqn2PQuery) ''' + «FOR constraint : constraints» + «IF constraint.constrainsUnfinished» + private pattern «unfinishedMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, missingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» + numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» + check(numberOfExistingReferences < «constraint.lowerBound»); + missingMultiplicity == eval(«constraint.lowerBound»-numberOfExistingReferences); + } + + pattern «unfinishedMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, missingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + missingMultiplicity == sum find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); + } + «ENDIF» + + «IF indexUpperMultiplicities» + «IF constraint.constrainsUnrepairable» + private pattern «repairMatchName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, source:DefinedElement, target:DefinedElement) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,source); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» + find mustExist(problem,interpretation,target); + «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» + neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» + «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» + } + + private pattern «unrepairableMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, unrepairableMultiplicity:java Integer) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» + find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, object, missingMultiplicity); + numerOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, object, _); + check(numerOfRepairMatches < missingMultiplicity); + unrepairableMultiplicity == eval(missingMultiplicity-numerOfRepairMatches); + } + + private pattern «unrepairableMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, unrepairableMultiplicity:java Integer) { + find interpretation(problem,interpretation); + unrepairableMultiplicity == max find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); + } or { + find interpretation(problem,interpretation); + neg find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, _); + unrepairableMultiplicity == 0; + } + «ENDIF» + + «IF constraint.constrainsRemainingInverse» + private pattern «remainingMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"object")» + numberOfExistingReferences == count «base.referRelation(constraint.relation,"_","object",Modality.MUST,fqn2PQuery)» + check(numberOfExistingReferences < «constraint.inverseUpperBound»); + remainingMultiplicity == eval(«constraint.inverseUpperBound»-numberOfExistingReferences); + } + + pattern «remainingMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + remainingMultiplicity == sum find «remainingMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); + } + «ENDIF» + + «IF constraint.constrainsRemainingContents» + «IF constraint.upperBoundFinite» + private pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» + numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» + check(numberOfExistingReferences < «constraint.upperBound»); + remainingMultiplicity == eval(«constraint.upperBound»-numberOfExistingReferences); + } + + pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + remainingMultiplicity == sum find «remainingContentsName(constraint)»_helper(problem, interpretation, _, #_); + } + «ELSE» + pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» + } + + pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { + find interpretation(problem,interpretation); + find «remainingContentsName(constraint)»_helper(problem, interpretation); + remainingMultiplicity == -1; + } or { + find interpretation(problem,interpretation); + neg find «remainingContentsName(constraint)»_helper(problem, interpretation); + remainingMultiplicity == 0; + } + «ENDIF» + «ENDIF» + «ENDIF» «ENDFOR» - ''' - } - def String unfinishedMultiplicityName(LowerMultiplicityAssertion lowerMultiplicityAssertion) - '''unfinishedLowerMultiplicity_«base.canonizeName(lowerMultiplicityAssertion.relation.name)»''' - - def public referUnfinishedMultiplicityQuery(LowerMultiplicityAssertion lowerMultiplicityAssertion) - '''find «unfinishedMultiplicityName(lowerMultiplicityAssertion)»(problem, interpretation ,object, missingMultiplicity);''' - - def getFirstParamTypeOfRelation(LowerMultiplicityAssertion lowerMultiplicityAssertion) { - val parameters = lowerMultiplicityAssertion.relation.parameters - if(parameters.size == 2) { - val firstParam = parameters.get(0) - if(firstParam instanceof ComplexTypeReference) { - return firstParam.referred - } - } - } - - def getUnfinishedMultiplicityQueries(LogicProblem problem) { - val lowerMultiplicities = base.lowerMultiplicities(problem) - val map = new LinkedHashMap - for(lowerMultiplicity : lowerMultiplicities) { - map.put(lowerMultiplicity.relation,unfinishedMultiplicityName(lowerMultiplicity)) - } - return map + ''' + + def String unfinishedMultiplicityName( + RelationMultiplicityConstraint constraint) '''unfinishedLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' + + def String unrepairableMultiplicityName( + RelationMultiplicityConstraint constraint) '''unrepairableLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' + + private def String repairMatchName( + RelationMultiplicityConstraint constraint) '''repair_«base.canonizeName(constraint.relation.name)»''' + + def String remainingMultiplicityName( + RelationMultiplicityConstraint constraint) '''remainingInverseUpperMultiplicity_«base.canonizeName(constraint.relation.name)»''' + + def String remainingContentsName( + RelationMultiplicityConstraint constraint) '''remainingContents_«base.canonizeName(constraint.relation.name)»''' + + def getUnfinishedMultiplicityQueries(List constraints) { + constraints.toInvertedMap [ constraint | + new UnifinishedMultiplicityQueryNames( + if(constraint.constrainsUnfinished) unfinishedMultiplicityName(constraint) else null, + if (indexUpperMultiplicities && constraint.constrainsUnrepairable) + unrepairableMultiplicityName(constraint) + else + null, + if (indexUpperMultiplicities && constraint.constrainsRemainingInverse) + remainingMultiplicityName(constraint) + else + null, + if (indexUpperMultiplicities && constraint.constrainsRemainingContents) + remainingContentsName(constraint) + else + null + ) + ] } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend index e1be2742..b6fdbe06 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend @@ -1,6 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns import java.util.ArrayList 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 7a3a2d67..3c9ef74c 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 @@ -51,7 +51,7 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { */ public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint - public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.PolyhedralTypeHierarchy + public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.PolyhedralRelations public var List costObjectives = newArrayList } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend index 7d0a7884..9f0c642f 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend @@ -1,10 +1,10 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator import java.util.Comparator import org.eclipse.viatra.dse.base.ThreadContext -import org.eclipse.viatra.dse.objectives.IObjective import org.eclipse.viatra.dse.objectives.Comparators +import org.eclipse.viatra.dse.objectives.IObjective class UnfinishedMultiplicityObjective implements IObjective { val MultiplicityGoalConstraintCalculator unfinishedMultiplicity; @@ -29,9 +29,9 @@ class UnfinishedMultiplicityObjective implements IObjective { override satisifiesHardObjective(Double fitness) { return fitness <=0.01 } override setComparator(Comparator comparator) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + throw new UnsupportedOperationException } override setLevel(int level) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + throw new UnsupportedOperationException } -} \ No newline at end of file +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend index 789018cb..15758985 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend @@ -17,7 +17,7 @@ abstract class PolyhedronSolverTest { var PolyhedronSaturationOperator operator protected def PolyhedronSolver createSolver() - + @Before def void setUp() { solver = createSolver() @@ -183,7 +183,7 @@ abstract class PolyhedronSolverTest { assertEquals(PolyhedronSaturationResult.EMPTY, result) } - + @Test def void unboundedRelaxationWithNoIntegerSolutionTest() { val x = new Dimension("x", 0, 1) @@ -193,7 +193,29 @@ abstract class PolyhedronSolverTest { #[new LinearConstraint(#{x -> 2}, 1, 1)], #[x, y] )) - + + val result = saturate() + + assertEquals(PolyhedronSaturationResult.EMPTY, result) + } + + @Test + def void emptyConstraintTest() { + val constraint = new LinearConstraint(emptyMap, 0, 1) + createSaturationOperator(new Polyhedron(#[], #[constraint], #[constraint])) + + val result = saturate() + + assertEquals(PolyhedronSaturationResult.SATURATED, result) + assertEquals(0, constraint.lowerBound) + assertEquals(0, constraint.upperBound) + } + + @Test + def void emptyConstraintUnsatisfiableTest() { + val constraint = new LinearConstraint(emptyMap, 1, 0) + createSaturationOperator(new Polyhedron(#[], #[constraint], #[constraint])) + val result = saturate() assertEquals(PolyhedronSaturationResult.EMPTY, result) -- cgit v1.2.3-54-g00ecf From 7021a4d1f2805ebf3145cbc3893761d12f23361f Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 1 Aug 2019 01:00:12 +0200 Subject: Configurability and better statistics for measurements --- .../execution/GenerationTaskExecutor.xtend | 2 +- .../ModelGenerationMethodProvider.xtend | 54 ++++++++++++++---- .../cardinality/PolyhedronScopePropagator.xtend | 33 ++++++++++- .../cardinality/RelationConstraintCalculator.xtend | 7 ++- .../logic2viatra/cardinality/ScopePropagator.xtend | 22 ++++++-- .../cardinality/ScopePropagatorStrategy.java | 18 ------ .../cardinality/ScopePropagatorStrategy.xtend | 64 ++++++++++++++++++++++ .../logic2viatra/patterns/PatternProvider.xtend | 2 +- .../rules/RefinementRuleProvider.xtend | 40 ++++++++++---- .../viatrasolver/reasoner/ViatraReasoner.xtend | 28 ++++++++-- .../reasoner/ViatraReasonerConfiguration.xtend | 8 ++- .../dse/BestFirstStrategyForModelGeneration.java | 1 + 12 files changed, 218 insertions(+), 61 deletions(-) delete mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend index 8ea674d3..807d217a 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend @@ -293,7 +293,7 @@ class GenerationTaskExecutor { statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000) statistics.put("Logic to solver transformation time",solution.statistics.transformationTime) statistics.put("Solver time",solution.statistics.solverTime) - statistics.put("Postprocessing time",solutionVisualisationTime) + statistics.put("Postprocessing time",solutionVisualisationTime/1000000) for(entry: solution.statistics.entries) { statistics.put(entry.name,statisticsUtil.readValue(entry)) } 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 4b278188..8e061b63 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 @@ -27,6 +27,7 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule import org.eclipse.xtend.lib.annotations.Data +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Z3PolyhedronSolver class ModelGenerationStatistics { public var long transformationExecutionTime = 0 @@ -35,7 +36,25 @@ class ModelGenerationStatistics { transformationExecutionTime += amount } - public var long PreliminaryTypeAnalisisTime = 0 + public var long scopePropagationTime = 0 + + synchronized def addScopePropagationTime(long amount) { + scopePropagationTime += amount + } + + public var long preliminaryTypeAnalisisTime = 0 + + public var int decisionsTried = 0 + + synchronized def incrementDecisionCount() { + decisionsTried++ + } + + public var int scopePropagatorInvocations + + synchronized def incrementScopePropagationCount() { + scopePropagatorInvocations++ + } } @Data class ModelGenerationMethod { @@ -84,12 +103,12 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, writeFiles) - val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, queries) + val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, queries, statistics) scopePropagator.propagateAllScopeConstraints - val // LinkedHashMap, BatchTransformationRule>> - objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(queries, scopePropagator, + val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(queries, scopePropagator, nameNewElements, statistics) - val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, statistics) + val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, + statistics) val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(queries) val unfinishedWF = queries.getUnfinishedWFQueries.values @@ -118,15 +137,26 @@ class ModelGenerationMethodProvider { } private def createScopePropagator(ScopePropagatorStrategy scopePropagatorStrategy, - PartialInterpretation emptySolution, GeneratedPatterns queries) { + PartialInterpretation emptySolution, GeneratedPatterns queries, ModelGenerationStatistics statistics) { switch (scopePropagatorStrategy) { - case BasicTypeHierarchy: - new ScopePropagator(emptySolution) - case PolyhedralTypeHierarchy, - case PolyhedralRelations: { + case ScopePropagatorStrategy.BasicTypeHierarchy: + new ScopePropagator(emptySolution, statistics) + ScopePropagatorStrategy.Polyhedral: { val types = queries.refineObjectQueries.keySet.map[newType].toSet - val solver = new CbcPolyhedronSolver - new PolyhedronScopePropagator(emptySolution, types, queries.multiplicityConstraintQueries, + val solver = switch (scopePropagatorStrategy.solver) { + case Z3Integer: + new Z3PolyhedronSolver(false, scopePropagatorStrategy.timeoutSeconds) + case Z3Real: + new Z3PolyhedronSolver(true, scopePropagatorStrategy.timeoutSeconds) + case Cbc: + new CbcPolyhedronSolver(false, scopePropagatorStrategy.timeoutSeconds, true) + case Clp: + new CbcPolyhedronSolver(true, scopePropagatorStrategy.timeoutSeconds, true) + default: + throw new IllegalArgumentException("Unknown polyhedron solver: " + + scopePropagatorStrategy.solver) + } + new PolyhedronScopePropagator(emptySolution, statistics, types, queries.multiplicityConstraintQueries, queries.hasElementInContainmentQuery, solver, scopePropagatorStrategy.requiresUpperBoundIndexing) } default: diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index f6b101b6..e7e40ab0 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -2,9 +2,12 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableSet import com.google.common.collect.Maps import com.google.common.collect.Sets +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnifinishedMultiplicityQueries import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation @@ -30,13 +33,14 @@ class PolyhedronScopePropagator extends ScopePropagator { val LinearBoundedExpression topLevelBounds val Polyhedron polyhedron val PolyhedronSaturationOperator operator + val Set relevantRelations List updaters = emptyList - new(PartialInterpretation p, Set possibleNewDynamicTypes, + new(PartialInterpretation p, ModelGenerationStatistics statistics, Set possibleNewDynamicTypes, Map unfinishedMultiplicityQueries, IQuerySpecification> hasElementInContainmentQuery, PolyhedronSolver solver, boolean propagateRelations) { - super(p) + super(p, statistics) val builder = new PolyhedronBuilder(p) builder.buildPolyhedron(possibleNewDynamicTypes) scopeBounds = builder.scopeBounds @@ -54,11 +58,14 @@ class PolyhedronScopePropagator extends ScopePropagator { } builder.buildMultiplicityConstraints(unfinishedMultiplicityQueries, hasElementInContainmentQuery, maximumNumberOfNewNodes) + relevantRelations = builder.relevantRelations updaters = builder.updaters + } else { + relevantRelations = emptySet } } - override void propagateAllScopeConstraints() { + override void doPropagateAllScopeConstraints() { resetBounds() populatePolyhedronFromScope() // println(polyhedron) @@ -73,6 +80,13 @@ class PolyhedronScopePropagator extends ScopePropagator { } } } + + override propagateAdditionToRelation(Relation r) { + super.propagateAdditionToRelation(r) + if (relevantRelations.contains(r)) { + propagateAllScopeConstraints() + } + } def resetBounds() { for (dimension : polyhedron.dimensions) { @@ -188,6 +202,7 @@ class PolyhedronScopePropagator extends ScopePropagator { Map scopeBounds LinearBoundedExpression topLevelBounds Polyhedron polyhedron + Set relevantRelations List updaters def buildPolyhedron(Set possibleNewDynamicTypes) { @@ -222,9 +237,21 @@ class PolyhedronScopePropagator extends ScopePropagator { buildNonContainmentConstraints(constraint, pair.value) } } + buildRelevantRelations(constraints.keySet) updaters = updatersBuilder.build addCachedConstraintsToPolyhedron() } + + private def buildRelevantRelations(Set constraints) { + val builder = ImmutableSet.builder + for (constraint : constraints) { + builder.add(constraint.relation) + if (constraint.inverseRelation !== null) { + builder.add(constraint.inverseRelation) + } + } + relevantRelations = builder.build + } private def addCachedConstraintsToPolyhedron() { val constraints = new HashSet diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend index ffa9e6e6..52a390a8 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend @@ -20,6 +20,7 @@ class RelationConstraints { @Data class RelationMultiplicityConstraint { Relation relation + Relation inverseRelation boolean containment boolean container int lowerBound @@ -47,7 +48,7 @@ class RelationMultiplicityConstraint { } def constrainsRemainingInverse() { - !containment && inverseUpperBoundFinite + lowerBound >= 1 && !containment && inverseUpperBoundFinite } def constrainsRemainingContents() { @@ -119,8 +120,8 @@ class RelationConstraintCalculator { inverseUpperMultiplicity = upperMultiplicities.get(relation) container = containmentRelations.contains(inverseRelation) } - val constraint = new RelationMultiplicityConstraint(relation, containment, container, lowerMultiplicity, - upperMultiplicity, inverseUpperMultiplicity) + val constraint = new RelationMultiplicityConstraint(relation, inverseRelation, containment, container, + lowerMultiplicity, upperMultiplicity, inverseUpperMultiplicity) if (constraint.isActive) { if (relation.parameters.size != 2) { throw new IllegalArgumentException('''Relation «relation.name» has multiplicity or containment constraints, but it is not binary''') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 3b442cd3..7be6635c 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -1,5 +1,7 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation @@ -11,14 +13,15 @@ import java.util.Set import org.eclipse.xtend.lib.annotations.Accessors class ScopePropagator { - @Accessors(PROTECTED_GETTER) PartialInterpretation partialInterpretation - Map type2Scope - + @Accessors(PROTECTED_GETTER) val PartialInterpretation partialInterpretation + val ModelGenerationStatistics statistics + val Map type2Scope val Map> superScopes val Map> subScopes - new(PartialInterpretation p) { + new(PartialInterpretation p, ModelGenerationStatistics statistics) { partialInterpretation = p + this.statistics = statistics type2Scope = new HashMap for (scope : p.scopes) { type2Scope.put(scope.targetTypeInterpretation, scope) @@ -57,8 +60,13 @@ class ScopePropagator { } } while (changed) } - + def propagateAllScopeConstraints() { + statistics.incrementScopePropagationCount() + doPropagateAllScopeConstraints() + } + + protected def doPropagateAllScopeConstraints() { var boolean hadChanged do { hadChanged = false @@ -95,6 +103,10 @@ class ScopePropagator { // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') } + + def void propagateAdditionToRelation(Relation r) { + // Nothing to propagate. + } private def propagateLowerLimitUp(Scope subScope, Scope superScope) { if (subScope.minNewElements > superScope.minNewElements) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java deleted file mode 100644 index b1c5a658..00000000 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.java +++ /dev/null @@ -1,18 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality; - -public enum ScopePropagatorStrategy { - BasicTypeHierarchy, - - PolyhedralTypeHierarchy, - - PolyhedralRelations { - @Override - public boolean requiresUpperBoundIndexing() { - return true; - } - }; - - public boolean requiresUpperBoundIndexing() { - return false; - } -} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend new file mode 100644 index 00000000..37e56c9a --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend @@ -0,0 +1,64 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import org.eclipse.xtend.lib.annotations.Data +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +enum PolyhedralScopePropagatorConstraints { + TypeHierarchy, + Relational +} + +enum PolyhedralScopePropagatorSolver { + Z3Real, + Z3Integer, + Cbc, + Clp +} + +abstract class ScopePropagatorStrategy { + public static val BasicCount = new Simple("BasicCount") + + public static val BasicTypeHierarchy = new Simple("BasicTypeHierarchy") + + private new() { + } + + def boolean requiresUpperBoundIndexing() + + static class Simple extends ScopePropagatorStrategy { + val String name + + @FinalFieldsConstructor + private new() { + } + + override requiresUpperBoundIndexing() { + false + } + + override toString() { + name + } + } + + @Data + static class Polyhedral extends ScopePropagatorStrategy { + public static val UNLIMITED_TIME = -1 + + val PolyhedralScopePropagatorConstraints constraints + val PolyhedralScopePropagatorSolver solver + val double timeoutSeconds + + @FinalFieldsConstructor + new() { + } + + new(PolyhedralScopePropagatorConstraints constraints, PolyhedralScopePropagatorSolver solver) { + this(constraints, solver, UNLIMITED_TIME) + } + + override requiresUpperBoundIndexing() { + constraints == PolyhedralScopePropagatorConstraints.Relational + } + } +} 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 b10c8e88..eadf0ae0 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 @@ -69,7 +69,7 @@ class PatternProvider { val startTime = System.nanoTime val result = typeAnalysis.performTypeAnalysis(problem, emptySolution) val typeAnalysisTime = System.nanoTime - startTime - statistics.PreliminaryTypeAnalisisTime = typeAnalysisTime + statistics.preliminaryTypeAnalisisTime = typeAnalysisTime result } else { null 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 5fefa551..bf816de9 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 @@ -98,10 +98,12 @@ class RefinementRuleProvider { val newLink2 = factory2.createBinaryElementRelationLink => [it.param1 = newElement it.param2 = container] inverseRelationInterpretation.relationlinks+=newLink2 + val propagatorStartTime = System.nanoTime + statistics.addExecutionTime(propagatorStartTime-startTime) + // Scope propagation scopePropagator.propagateAdditionToType(typeInterpretation) - - statistics.addExecutionTime(System.nanoTime-startTime) + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) ] } else { ruleBuilder.action[match | @@ -132,10 +134,12 @@ class RefinementRuleProvider { val newLink = factory2.createBinaryElementRelationLink => [it.param1 = container it.param2 = newElement] relationInterpretation.relationlinks+=newLink + val propagatorStartTime = System.nanoTime + statistics.addExecutionTime(propagatorStartTime-startTime) + // Scope propagation scopePropagator.propagateAdditionToType(typeInterpretation) - - statistics.addExecutionTime(System.nanoTime-startTime) + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) ] } } else { @@ -162,29 +166,31 @@ class RefinementRuleProvider { typeInterpretation.elements += newElement typeInterpretation.supertypeInterpretation.forEach[it.elements += newElement] + val propagatorStartTime = System.nanoTime + statistics.addExecutionTime(propagatorStartTime-startTime) + // Scope propagation scopePropagator.propagateAdditionToType(typeInterpretation) - - statistics.addExecutionTime(System.nanoTime-startTime) + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) ] } return ruleBuilder.build } - def createRelationRefinementRules(GeneratedPatterns patterns, ModelGenerationStatistics statistics) { + def createRelationRefinementRules(GeneratedPatterns patterns, ScopePropagator scopePropagator, ModelGenerationStatistics statistics) { val res = new LinkedHashMap for(LHSEntry: patterns.refinerelationQueries.entrySet) { val declaration = LHSEntry.key.key val inverseReference = LHSEntry.key.value val lhs = LHSEntry.value as IQuerySpecification> - val rule = createRelationRefinementRule(declaration,inverseReference,lhs,statistics) + val rule = createRelationRefinementRule(declaration,inverseReference,lhs,scopePropagator,statistics) res.put(LHSEntry.key,rule) } return res } def private BatchTransformationRule> - createRelationRefinementRule(RelationDeclaration declaration, Relation inverseRelation, IQuerySpecification> lhs, ModelGenerationStatistics statistics) + createRelationRefinementRule(RelationDeclaration declaration, Relation inverseRelation, IQuerySpecification> lhs, ScopePropagator scopePropagator, ModelGenerationStatistics statistics) { val name = '''addRelation_«declaration.name.canonizeName»«IF inverseRelation != null»_and_«inverseRelation.name.canonizeName»«ENDIF»''' val ruleBuilder = factory.createRule @@ -201,7 +207,13 @@ class RefinementRuleProvider { val trg = match.get(4) as DefinedElement val link = createBinaryElementRelationLink => [it.param1 = src it.param2 = trg] relationInterpretation.relationlinks += link - statistics.addExecutionTime(System.nanoTime-startTime) + + val propagatorStartTime = System.nanoTime + statistics.addExecutionTime(propagatorStartTime-startTime) + + // Scope propagation + scopePropagator.propagateAdditionToRelation(declaration) + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) ] } else { ruleBuilder.action [ match | @@ -217,7 +229,13 @@ class RefinementRuleProvider { relationInterpretation.relationlinks += link val inverseLink = createBinaryElementRelationLink => [it.param1 = trg it.param2 = src] inverseInterpretation.relationlinks += inverseLink - statistics.addExecutionTime(System.nanoTime-startTime) + + val propagatorStartTime = System.nanoTime + statistics.addExecutionTime(propagatorStartTime-startTime) + + // Scope propagation + scopePropagator.propagateAdditionToRelation(declaration) + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) ] } 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 a8db5e43..1abde0a8 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 @@ -39,6 +39,7 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.NeighbourhoodBasedStateCoderFactory class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() @@ -137,11 +138,14 @@ class ViatraReasoner extends LogicReasoner { dse.setInitialModel(emptySolution, false) - val IStateCoderFactory statecoder = if (viatraConfig.stateCoderStrategy == StateCoderStrategy.Neighbourhood) { + val IStateCoderFactory statecoder = switch (viatraConfig.stateCoderStrategy) { + case Neighbourhood: + new NeighbourhoodBasedStateCoderFactory + case PairwiseNeighbourhood: new PairwiseNeighbourhoodBasedStateCoderFactory - } else { + default: new IdentifierBasedStateCoderFactory - } + } dse.stateCoderFactory = statecoder dse.maxNumberOfThreads = 1 @@ -183,9 +187,13 @@ class ViatraReasoner extends LogicReasoner { it.name = "TransformationExecutionTime" it.value = (method.statistics.transformationExecutionTime / 1000000) as int ] + it.entries += createIntStatisticEntry => [ + it.name = "ScopePropagationTime" + it.value = (method.statistics.scopePropagationTime / 1000000) as int + ] it.entries += createIntStatisticEntry => [ it.name = "TypeAnalysisTime" - it.value = (method.statistics.PreliminaryTypeAnalisisTime / 1000000) as int + it.value = (method.statistics.preliminaryTypeAnalisisTime / 1000000) as int ] it.entries += createIntStatisticEntry => [ it.name = "StateCoderTime" @@ -199,6 +207,18 @@ class ViatraReasoner extends LogicReasoner { it.name = "SolutionCopyTime" it.value = (solutionCopier.getTotalCopierRuntime / 1000000) as int ] + it.entries += createIntStatisticEntry => [ + it.name = "States" + it.value = dse.numberOfStates as int + ] + it.entries += createIntStatisticEntry => [ + it.name = "Decisions" + it.value = method.statistics.decisionsTried + ] + it.entries += createIntStatisticEntry => [ + it.name = "ScopePropagations" + it.value = method.statistics.scopePropagatorInvocations + ] if (diversityChecker.isActive) { it.entries += createIntStatisticEntry => [ it.name = "SolutionDiversityCheckTime" 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 7a3a2d67..a2f9cebe 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 @@ -14,9 +14,12 @@ 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.PolyhedralScopePropagatorConstraints +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedralScopePropagatorSolver enum StateCoderStrategy { Neighbourhood, + PairwiseNeighbourhood, NeighbourhoodWithEquivalence, IDBased, DefinedByDiversity @@ -25,7 +28,7 @@ enum StateCoderStrategy { class ViatraReasonerConfiguration extends LogicSolverConfiguration { // public var Iterable existingQueries public var nameNewElements = false - public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.Neighbourhood + public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood public var TypeInferenceMethod typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis /** * Once per 1/randomBacktrackChance the search selects a random state. @@ -50,9 +53,8 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { * Configuration for cutting search space. */ public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint - - public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.PolyhedralTypeHierarchy + public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.BasicTypeHierarchy public var List costObjectives = newArrayList } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index 144e7484..5af7fc69 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -189,6 +189,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // } logger.debug("Executing new activation: " + nextActivation); context.executeAcitvationId(nextActivation); + method.getStatistics().incrementDecisionCount(); visualiseCurrentState(); // for(ViatraQueryMatcher matcher : matchers) { -- cgit v1.2.3-54-g00ecf From c300e9e7918aa71b04cb681c558eb282dd1fb390 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 1 Aug 2019 14:45:26 +0200 Subject: Counting scope propagator (simpler than BasicTypeHierarchy) --- .../ModelGenerationMethodProvider.xtend | 7 +- .../cardinality/PolyhedronScopePropagator.xtend | 2 +- .../logic2viatra/cardinality/ScopePropagator.xtend | 73 ++------------------ .../cardinality/ScopePropagatorStrategy.xtend | 2 +- .../cardinality/TypeHierarchyScopePropagator.xtend | 77 ++++++++++++++++++++++ .../reasoner/ViatraReasonerConfiguration.xtend | 10 +-- 6 files changed, 96 insertions(+), 75 deletions(-) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') 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 8e061b63..23632d4d 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 @@ -10,6 +10,8 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Polyhedr import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.TypeHierarchyScopePropagator +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Z3PolyhedronSolver 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 @@ -27,7 +29,6 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule import org.eclipse.xtend.lib.annotations.Data -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Z3PolyhedronSolver class ModelGenerationStatistics { public var long transformationExecutionTime = 0 @@ -139,8 +140,10 @@ class ModelGenerationMethodProvider { private def createScopePropagator(ScopePropagatorStrategy scopePropagatorStrategy, PartialInterpretation emptySolution, GeneratedPatterns queries, ModelGenerationStatistics statistics) { switch (scopePropagatorStrategy) { - case ScopePropagatorStrategy.BasicTypeHierarchy: + case ScopePropagatorStrategy.Count: new ScopePropagator(emptySolution, statistics) + case ScopePropagatorStrategy.BasicTypeHierarchy: + new TypeHierarchyScopePropagator(emptySolution, statistics) ScopePropagatorStrategy.Polyhedral: { val types = queries.refineObjectQueries.keySet.map[newType].toSet val solver = switch (scopePropagatorStrategy.solver) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index e7e40ab0..7c05e818 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -28,7 +28,7 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher import org.eclipse.viatra.query.runtime.emf.EMFScope import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -class PolyhedronScopePropagator extends ScopePropagator { +class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { val Map scopeBounds val LinearBoundedExpression topLevelBounds val Polyhedron polyhedron diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 7be6635c..0bdb202e 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -16,8 +16,8 @@ class ScopePropagator { @Accessors(PROTECTED_GETTER) val PartialInterpretation partialInterpretation val ModelGenerationStatistics statistics val Map type2Scope - val Map> superScopes - val Map> subScopes + @Accessors(PROTECTED_GETTER) val Map> superScopes + @Accessors(PROTECTED_GETTER) val Map> subScopes new(PartialInterpretation p, ModelGenerationStatistics statistics) { partialInterpretation = p @@ -60,26 +60,14 @@ class ScopePropagator { } } while (changed) } - + def propagateAllScopeConstraints() { statistics.incrementScopePropagationCount() doPropagateAllScopeConstraints() } - protected def doPropagateAllScopeConstraints() { - var boolean hadChanged - do { - hadChanged = false - for (superScopeEntry : superScopes.entrySet) { - val sub = superScopeEntry.key - hadChanged = propagateLowerLimitUp(sub, partialInterpretation) || hadChanged - hadChanged = propagateUpperLimitDown(sub, partialInterpretation) || hadChanged - for (sup : superScopeEntry.value) { - hadChanged = propagateLowerLimitUp(sub, sup) || hadChanged - hadChanged = propagateUpperLimitDown(sub, sup) || hadChanged - } - } - } while (hadChanged) + protected def void doPropagateAllScopeConstraints() { + // Nothing to propagate. } def propagateAdditionToType(PartialTypeInterpratation t) { @@ -103,60 +91,11 @@ class ScopePropagator { // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') } - + def void propagateAdditionToRelation(Relation r) { // Nothing to propagate. } - private def propagateLowerLimitUp(Scope subScope, Scope superScope) { - if (subScope.minNewElements > superScope.minNewElements) { - superScope.minNewElements = subScope.minNewElements - return true - } else { - return false - } - } - - private def propagateUpperLimitDown(Scope subScope, Scope superScope) { - if (superScope.maxNewElements >= 0 && - (superScope.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { -// println(''' -// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> «(superScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -// subScope.maxNewElements «subScope.maxNewElements» = superScope.maxNewElements «superScope.maxNewElements» -// ''') - subScope.maxNewElements = superScope.maxNewElements - return true - } else { - return false - } - } - - private def propagateLowerLimitUp(Scope subScope, PartialInterpretation p) { - if (subScope.minNewElements > p.minNewElements) { -// println(''' -// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes -// p.minNewElements «p.minNewElements» = subScope.minNewElements «subScope.minNewElements» -// ''') - p.minNewElements = subScope.minNewElements - return true - } else { - return false - } - } - - private def propagateUpperLimitDown(Scope subScope, PartialInterpretation p) { - if (p.maxNewElements >= 0 && (p.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { -// println(''' -// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes -// subScope.maxNewElements «subScope.maxNewElements» = p.maxNewElements «p.maxNewElements» -// ''') - subScope.maxNewElements = p.maxNewElements - return true - } else { - return false - } - } - private def removeOne(Scope scope) { if (scope.maxNewElements === 0) { throw new IllegalArgumentException('''Inconsistent object creation: «scope.targetTypeInterpretation»''') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend index 37e56c9a..b0ed75cb 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend @@ -16,7 +16,7 @@ enum PolyhedralScopePropagatorSolver { } abstract class ScopePropagatorStrategy { - public static val BasicCount = new Simple("BasicCount") + public static val Count = new Simple("Count") public static val BasicTypeHierarchy = new Simple("BasicTypeHierarchy") diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend new file mode 100644 index 00000000..be8ef00a --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend @@ -0,0 +1,77 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope + +class TypeHierarchyScopePropagator extends ScopePropagator { + + new(PartialInterpretation p, ModelGenerationStatistics statistics) { + super(p, statistics) + } + + protected override doPropagateAllScopeConstraints() { + var boolean hadChanged + do { + hadChanged = false + for (superScopeEntry : superScopes.entrySet) { + val sub = superScopeEntry.key + hadChanged = propagateLowerLimitUp(sub, partialInterpretation) || hadChanged + hadChanged = propagateUpperLimitDown(sub, partialInterpretation) || hadChanged + for (sup : superScopeEntry.value) { + hadChanged = propagateLowerLimitUp(sub, sup) || hadChanged + hadChanged = propagateUpperLimitDown(sub, sup) || hadChanged + } + } + } while (hadChanged) + } + + private def propagateLowerLimitUp(Scope subScope, Scope superScope) { + if (subScope.minNewElements > superScope.minNewElements) { + superScope.minNewElements = subScope.minNewElements + return true + } else { + return false + } + } + + private def propagateUpperLimitDown(Scope subScope, Scope superScope) { + if (superScope.maxNewElements >= 0 && + (superScope.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> «(superScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» +// subScope.maxNewElements «subScope.maxNewElements» = superScope.maxNewElements «superScope.maxNewElements» +// ''') + subScope.maxNewElements = superScope.maxNewElements + return true + } else { + return false + } + } + + private def propagateLowerLimitUp(Scope subScope, PartialInterpretation p) { + if (subScope.minNewElements > p.minNewElements) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes +// p.minNewElements «p.minNewElements» = subScope.minNewElements «subScope.minNewElements» +// ''') + p.minNewElements = subScope.minNewElements + return true + } else { + return false + } + } + + private def propagateUpperLimitDown(Scope subScope, PartialInterpretation p) { + if (p.maxNewElements >= 0 && (p.maxNewElements < subScope.maxNewElements || subScope.maxNewElements < 0)) { +// println(''' +// «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes +// subScope.maxNewElements «subScope.maxNewElements» = p.maxNewElements «p.maxNewElements» +// ''') + subScope.maxNewElements = p.maxNewElements + return true + } else { + return false + } + } +} 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 a2f9cebe..a5f42a5f 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,6 +6,8 @@ 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.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.partialinterpretationlanguage.visualisation.PartialInterpretationVisualiser import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind @@ -14,8 +16,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.PolyhedralScopePropagatorConstraints -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedralScopePropagatorSolver enum StateCoderStrategy { Neighbourhood, @@ -28,7 +28,7 @@ enum StateCoderStrategy { class ViatraReasonerConfiguration extends LogicSolverConfiguration { // public var Iterable existingQueries public var nameNewElements = false - public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood + public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.Neighbourhood public var TypeInferenceMethod typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis /** * Once per 1/randomBacktrackChance the search selects a random state. @@ -54,7 +54,9 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { */ public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint - public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.BasicTypeHierarchy + public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( + PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) + public var List costObjectives = newArrayList } -- cgit v1.2.3-54-g00ecf From fc84d3fe670331bc89fb1e4c44104bc1fc811438 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 14 Aug 2019 18:26:33 +0200 Subject: Measurements WIP --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2570 -> 2570 bytes .../domains/transima/fam/FamPatterns.vql | 2 +- .../domains/cps/dse/RuleBasedCpsSolver.xtend | 6 +- .../.classpath | 7 +- .../.project | 1 + .../.settings/org.eclipse.core.resources.prefs | 3 - .../META-INF/MANIFEST.MF | 16 +- .../configs/generation.vsconfig | 2 +- .../ecore-gen/satellite/CommSubsystem.java | 20 +- .../ecore-gen/satellite/ConstellationMission.java | 2 +- .../ecore-gen/satellite/InterferometryMission.java | 28 -- .../ecore-gen/satellite/SatellitePackage.java | 88 +----- .../satellite/impl/CommSubsystemImpl.java | 115 +------ .../satellite/impl/InterferometryMissionImpl.java | 130 -------- .../satellite/impl/SatellitePackageImpl.java | 37 +-- .../inputs/SatelliteInstance.xmi | 9 +- .../model/satellite.ecore | 12 +- .../model/satellite.genmodel | 5 +- .../model/satellite.henshin | 61 ---- .../model/satellite.henshin_diagram | 131 -------- .../model/satellite_fixup.henshin | 61 ---- .../plugin.xml | 1 + .../representations.aird | 2 + .../domains/satellite/mdeo/CostObjective.xtend | 13 - .../satellite/mdeo/LocalSearchEngineManager.xtend | 31 -- .../mdeo/MetricBasedGuidanceFunction.xtend | 47 --- .../satellite/mdeo/PatternMatchConstraint.xtend | 29 -- .../satellite/mdeo/SatelliteMdeOptimiserMain.xtend | 51 --- .../domains/satellite/mdeo/satellite.mopt | 36 --- .../domains/satellite/queries/SatelliteQueries.vql | 11 +- .../META-INF/MANIFEST.MF | 3 +- .../plugin.xml | 74 +---- .../yakindu/mutated/mutated.vql | 270 ---------------- .../partialsnapshot_mavo/yakindu/patterns.vql | 64 ++-- .../ModelGenerationMethodProvider.xtend | 35 +- .../cardinality/LinearTypeConstraintHint.xtend | 30 ++ .../cardinality/PolyhedronScopePropagator.xtend | 106 +++++-- .../cardinality/PolyhedronSolver.xtend | 72 ++++- .../cardinality/RelationConstraintCalculator.xtend | 5 +- .../logic2viatra/cardinality/ScopePropagator.xtend | 25 +- .../cardinality/ScopePropagatorStrategy.xtend | 11 +- .../cardinality/TypeHierarchyScopePropagator.xtend | 20 +- .../cardinality/Z3PolyhedronSolver.xtend | 32 +- .../logic2viatra/patterns/PatternGenerator.xtend | 18 +- .../logic2viatra/patterns/PatternProvider.xtend | 6 +- .../patterns/RelationRefinementGenerator.xtend | 2 +- .../logic2viatra/patterns/UnfinishedIndexer.xtend | 26 +- .../rules/RefinementRuleProvider.xtend | 15 +- .../PartialInterpretation.java | 24 ++ .../PartialinterpretationPackage.java | 60 +++- .../partialinterpretation/Scope.java | 24 ++ .../impl/BinaryElementRelationLinkImpl.java | 4 + .../impl/BooleanElementImpl.java | 4 +- .../impl/IntegerElementImpl.java | 4 +- .../impl/NaryRelationLinkElementImpl.java | 6 +- .../impl/NaryRelationLinkImpl.java | 1 + .../impl/PartialComplexTypeInterpretationImpl.java | 3 + .../impl/PartialConstantInterpretationImpl.java | 2 + .../impl/PartialFunctionInterpretationImpl.java | 2 + .../impl/PartialInterpretationImpl.java | 73 ++++- .../impl/PartialRelationInterpretationImpl.java | 7 + .../impl/PartialTypeInterpratationImpl.java | 2 + .../impl/PartialinterpretationFactoryImpl.java | 19 ++ .../impl/PartialinterpretationPackageImpl.java | 88 +++++- .../impl/PrimitiveElementImpl.java | 4 +- .../impl/RealElementImpl.java | 4 +- .../partialinterpretation/impl/ScopeImpl.java | 64 +++- .../impl/StringElementImpl.java | 4 +- .../impl/UnaryElementRelationLinkImpl.java | 2 + .../model/PartialInterpretation.ecore | 6 + .../model/PartialInterpretation.genmodel | 14 +- .../neighbourhood/Descriptor.xtend | 8 + .../neighbourhood/NeighbourhoodOptions.xtend | 4 +- .../neighbourhood/PartialInterpretation2Hash.xtend | 2 +- ...nterpretation2NeighbourhoodRepresentation.xtend | 4 +- .../NeighbourhoodBasedStateCoderFactory.xtend | 29 +- .../viatrasolver/reasoner/ViatraReasoner.xtend | 25 +- .../reasoner/ViatraReasonerConfiguration.xtend | 3 + .../reasoner/dse/BasicScopeGlobalConstraint.xtend | 103 ++++++ .../dse/BestFirstStrategyForModelGeneration.java | 2 +- .../dse/ModelGenerationCompositeObjective.xtend | 2 +- .../viatrasolver/reasoner/dse/ScopeObjective.xtend | 4 +- .../reasoner/dse/UnfinishedWFObjective.xtend | 34 +- .../reasoner/dse/ViatraReasonerSolutionSaver.xtend | 11 +- .../META-INF/MANIFEST.MF | 8 +- ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 13 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 16 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 15 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 15 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 17 + .../initialModels/satellite.xmi | 14 + .../bme/mit/inf/dslreasoner/run/CountMatches.xtend | 176 ----------- .../run/Ecore2LogicTraceBasedHint.xtend | 56 ++++ .../mit/inf/dslreasoner/run/MetamodelLoader.xtend | 302 +++++++++++++----- .../bme/mit/inf/dslreasoner/run/SGraphHint.xtend | 46 +++ .../mit/inf/dslreasoner/run/SatelliteHint.xtend | 86 +++++ .../run/TypeDistributionCalculator.xtend | 35 ++ .../dslreasoner/run/script/MeasurementScript.xtend | 70 ++++ .../run/script/MeasurementScriptRunner.xtend | 351 +++++++++++++++++++++ 100 files changed, 1976 insertions(+), 1667 deletions(-) delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.settings/org.eclipse.core.resources.prefs delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin_diagram delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite_fixup.henshin create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/representations.aird delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt delete mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/mutated/mutated.vql create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BasicScopeGlobalConstraint.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/initialModels/satellite.xmi delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/CountMatches.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/Ecore2LogicTraceBasedHint.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/TypeDistributionCalculator.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index 069bd953..22db4093 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index 624846d6..3ad5d167 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Domains/Examples/ModelGenExampleFAM_plugin/src/hu/bme/mit/inf/dslreasoner/domains/transima/fam/FamPatterns.vql b/Domains/Examples/ModelGenExampleFAM_plugin/src/hu/bme/mit/inf/dslreasoner/domains/transima/fam/FamPatterns.vql index f0e48d42..1d9a6b6d 100644 --- a/Domains/Examples/ModelGenExampleFAM_plugin/src/hu/bme/mit/inf/dslreasoner/domains/transima/fam/FamPatterns.vql +++ b/Domains/Examples/ModelGenExampleFAM_plugin/src/hu/bme/mit/inf/dslreasoner/domains/transima/fam/FamPatterns.vql @@ -10,7 +10,7 @@ pattern terminatorAndInformation(T : FAMTerminator, I : InformationLink) = { InformationLink.to(I,In); FunctionalInput.terminator(In,T); } - +/* @QueryBasedFeature pattern type(This : Function, Target : FunctionType) = { find rootElements(_Model, This); diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsSolver.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsSolver.xtend index e4c758f0..503c06ea 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsSolver.xtend +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsSolver.xtend @@ -35,18 +35,18 @@ class RuleBasedCpsSolver { val dse = new DesignSpaceExplorer dse.addMetaModelPackage(CpsPackage.eINSTANCE) dse.initialModel = problem.eResource.resourceSet - dse.addTransformationRule(createRule(RequirementNotSatisfied.instance).action [ + dse.addTransformationRule(createRule.precondition(RequirementNotSatisfied.instance).action [ val app = createApplicationInstance req.type.instances += app req.instances += app ].build) - dse.addTransformationRule(createRule(Allocate.instance).action [ + dse.addTransformationRule(createRule.precondition(Allocate.instance).action [ app.allocatedTo = host ].build) // dse.addTransformationRule(createRule(UnallocateAppInstance.instance).action [ // app.allocatedTo = null // ].build) - dse.addTransformationRule(createRule(CreateHostInstance.instance).action [ + dse.addTransformationRule(createRule.precondition(CreateHostInstance.instance).action [ hostType.instances += createHostInstance ].build) // dse.addTransformationRule(createRule(RemoveHostInstance.instance).action [ diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.classpath b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.classpath index e5e58475..6781ea8f 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.classpath +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.classpath @@ -3,9 +3,12 @@ - + + + + + - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.project b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.project index 16db5fc5..e594a173 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.project +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.project @@ -32,6 +32,7 @@ + org.eclipse.sirius.nature.modelingproject org.eclipse.jdt.core.javanature org.eclipse.pde.PluginNature org.eclipse.viatra.query.projectnature diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.settings/org.eclipse.core.resources.prefs b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4a3e59e4..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -encoding//model/satellite.henshin=UTF-8 -encoding//model/satellite.henshin_diagram=UTF-8 diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/META-INF/MANIFEST.MF b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/META-INF/MANIFEST.MF index 36d729b4..966fc660 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/META-INF/MANIFEST.MF +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/META-INF/MANIFEST.MF @@ -7,6 +7,7 @@ Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: hu.bme.mit.inf.dslreasoner.domains.satellite.queries, + hu.bme.mit.inf.dslreasoner.domains.satellite.queries.internal, satellite, satellite.impl, satellite.util @@ -22,20 +23,7 @@ Require-Bundle: org.eclipse.viatra.addon.querybasedfeatures.runtime, org.eclipse.viatra.dse.genetic, hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner;bundle-version="1.0.0", org.eclipse.emf.ecore.xmi;bundle-version="2.15.0", - uk.ac.kcl.inf.mdeoptimiser.libraries.core;bundle-version="1.0.0", - uk.ac.kcl.inf.mdeoptimiser.interfaces.cli;bundle-version="1.0.0", - org.eclipse.emf.henshin.interpreter;bundle-version="1.5.0", - uk.ac.kcl.inf.mdeoptimiser.libraries.rulegen;bundle-version="1.0.0", - org.sidiff.common;bundle-version="1.0.0", - org.sidiff.common.emf;bundle-version="1.0.0", - org.sidiff.common.emf.extensions;bundle-version="1.0.0", - org.moeaframework;bundle-version="2.13.0", - org.apache.commons.math3;bundle-version="3.6.1", - org.apache.commons.lang3;bundle-version="3.8.1", - com.google.inject;bundle-version="3.0.0", - org.sidiff.common.henshin;bundle-version="1.0.0", - org.sidiff.serge;bundle-version="1.0.0", - org.eclipse.viatra.query.runtime.rete;bundle-version="2.2.0" + org.eclipse.viatra.query.runtime.rete;bundle-version="2.0.0" Import-Package: org.apache.log4j Automatic-Module-Name: hu.bme.mit.inf.dslreasoner.domains.satellite Bundle-ActivationPolicy: lazy diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/configs/generation.vsconfig b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/configs/generation.vsconfig index 66c468d0..2fb246c9 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/configs/generation.vsconfig +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/configs/generation.vsconfig @@ -2,7 +2,7 @@ import epackage "model/satellite.ecore" import viatra "src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql" generate { - metamodel = { package satellite excluding { InterferometryMission.observationTime } } + metamodel = { package satellite } constraints = { package hu.bme.mit.inf.dslreasoner.domains.satellite.queries } partial-model = { "inputs/SatelliteInstance.xmi"} solver = ViatraSolver diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/CommSubsystem.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/CommSubsystem.java index 90bca78c..3b9d7ecf 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/CommSubsystem.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/CommSubsystem.java @@ -2,7 +2,6 @@ */ package satellite; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; /** @@ -15,7 +14,6 @@ import org.eclipse.emf.ecore.EObject; *

*
    *
  • {@link satellite.CommSubsystem#getTarget Target}
  • - *
  • {@link satellite.CommSubsystem#getSource Source}
  • *
* * @see satellite.SatellitePackage#getCommSubsystem() @@ -26,14 +24,12 @@ public interface CommSubsystem extends EObject { /** * Returns the value of the 'Target' reference. - * It is bidirectional and its opposite is '{@link satellite.CommSubsystem#getSource Source}'. * * * @return the value of the 'Target' reference. * @see #setTarget(CommSubsystem) * @see satellite.SatellitePackage#getCommSubsystem_Target() - * @see satellite.CommSubsystem#getSource - * @model opposite="source" + * @model * @generated */ CommSubsystem getTarget(); @@ -48,18 +44,4 @@ public interface CommSubsystem extends EObject { */ void setTarget(CommSubsystem value); - /** - * Returns the value of the 'Source' reference list. - * The list contents are of type {@link satellite.CommSubsystem}. - * It is bidirectional and its opposite is '{@link satellite.CommSubsystem#getTarget Target}'. - * - * - * @return the value of the 'Source' reference list. - * @see satellite.SatellitePackage#getCommSubsystem_Source() - * @see satellite.CommSubsystem#getTarget - * @model opposite="target" - * @generated - */ - EList getSource(); - } // CommSubsystem diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/ConstellationMission.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/ConstellationMission.java index 6182d7ad..8ff69955 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/ConstellationMission.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/ConstellationMission.java @@ -53,7 +53,7 @@ public interface ConstellationMission extends EObject { * * @return the value of the 'Spacecraft' containment reference list. * @see satellite.SatellitePackage#getConstellationMission_Spacecraft() - * @model containment="true" lower="2" upper="50" + * @model containment="true" lower="2" * @generated */ EList getSpacecraft(); diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/InterferometryMission.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/InterferometryMission.java index eb4ea064..4e28df38 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/InterferometryMission.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/InterferometryMission.java @@ -7,39 +7,11 @@ package satellite; * A representation of the model object 'Interferometry Mission'. * * - *

- * The following features are supported: - *

- *
    - *
  • {@link satellite.InterferometryMission#getObservationTime Observation Time}
  • - *
* * @see satellite.SatellitePackage#getInterferometryMission() * @model * @generated */ public interface InterferometryMission extends ConstellationMission { - /** - * Returns the value of the 'Observation Time' attribute. - * The default value is "2.0". - * - * - * @return the value of the 'Observation Time' attribute. - * @see #setObservationTime(float) - * @see satellite.SatellitePackage#getInterferometryMission_ObservationTime() - * @model default="2.0" required="true" - * @generated - */ - float getObservationTime(); - - /** - * Sets the value of the '{@link satellite.InterferometryMission#getObservationTime Observation Time}' attribute. - * - * - * @param value the new value of the 'Observation Time' attribute. - * @see #getObservationTime() - * @generated - */ - void setObservationTime(float value); } // InterferometryMission diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/SatellitePackage.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/SatellitePackage.java index 7be4ef84..9ca99311 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/SatellitePackage.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/SatellitePackage.java @@ -2,7 +2,6 @@ */ package satellite; -import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; @@ -130,15 +129,6 @@ public interface SatellitePackage extends EPackage { */ int INTERFEROMETRY_MISSION__SPACECRAFT = CONSTELLATION_MISSION__SPACECRAFT; - /** - * The feature id for the 'Observation Time' attribute. - * - * - * @generated - * @ordered - */ - int INTERFEROMETRY_MISSION__OBSERVATION_TIME = CONSTELLATION_MISSION_FEATURE_COUNT + 0; - /** * The number of structural features of the 'Interferometry Mission' class. * @@ -146,7 +136,7 @@ public interface SatellitePackage extends EPackage { * @generated * @ordered */ - int INTERFEROMETRY_MISSION_FEATURE_COUNT = CONSTELLATION_MISSION_FEATURE_COUNT + 1; + int INTERFEROMETRY_MISSION_FEATURE_COUNT = CONSTELLATION_MISSION_FEATURE_COUNT + 0; /** * The number of operations of the 'Interferometry Mission' class. @@ -296,15 +286,6 @@ public interface SatellitePackage extends EPackage { */ int COMM_SUBSYSTEM__TARGET = 0; - /** - * The feature id for the 'Source' reference list. - * - * - * @generated - * @ordered - */ - int COMM_SUBSYSTEM__SOURCE = 1; - /** * The number of structural features of the 'Comm Subsystem' class. * @@ -312,7 +293,7 @@ public interface SatellitePackage extends EPackage { * @generated * @ordered */ - int COMM_SUBSYSTEM_FEATURE_COUNT = 2; + int COMM_SUBSYSTEM_FEATURE_COUNT = 1; /** * The number of operations of the 'Comm Subsystem' class. @@ -582,15 +563,6 @@ public interface SatellitePackage extends EPackage { */ int UHF_COMM_SUBSYSTEM__TARGET = COMM_SUBSYSTEM__TARGET; - /** - * The feature id for the 'Source' reference list. - * - * - * @generated - * @ordered - */ - int UHF_COMM_SUBSYSTEM__SOURCE = COMM_SUBSYSTEM__SOURCE; - /** * The number of structural features of the 'UHF Comm Subsystem' class. * @@ -628,15 +600,6 @@ public interface SatellitePackage extends EPackage { */ int XCOMM_SUBSYSTEM__TARGET = COMM_SUBSYSTEM__TARGET; - /** - * The feature id for the 'Source' reference list. - * - * - * @generated - * @ordered - */ - int XCOMM_SUBSYSTEM__SOURCE = COMM_SUBSYSTEM__SOURCE; - /** * The number of structural features of the 'XComm Subsystem' class. * @@ -674,15 +637,6 @@ public interface SatellitePackage extends EPackage { */ int KA_COMM_SUBSYSTEM__TARGET = COMM_SUBSYSTEM__TARGET; - /** - * The feature id for the 'Source' reference list. - * - * - * @generated - * @ordered - */ - int KA_COMM_SUBSYSTEM__SOURCE = COMM_SUBSYSTEM__SOURCE; - /** * The number of structural features of the 'Ka Comm Subsystem' class. * @@ -743,17 +697,6 @@ public interface SatellitePackage extends EPackage { */ EClass getInterferometryMission(); - /** - * Returns the meta object for the attribute '{@link satellite.InterferometryMission#getObservationTime Observation Time}'. - * - * - * @return the meta object for the attribute 'Observation Time'. - * @see satellite.InterferometryMission#getObservationTime() - * @see #getInterferometryMission() - * @generated - */ - EAttribute getInterferometryMission_ObservationTime(); - /** * Returns the meta object for class '{@link satellite.CommunicatingElement Communicating Element}'. * @@ -827,17 +770,6 @@ public interface SatellitePackage extends EPackage { */ EReference getCommSubsystem_Target(); - /** - * Returns the meta object for the reference list '{@link satellite.CommSubsystem#getSource Source}'. - * - * - * @return the meta object for the reference list 'Source'. - * @see satellite.CommSubsystem#getSource() - * @see #getCommSubsystem() - * @generated - */ - EReference getCommSubsystem_Source(); - /** * Returns the meta object for class '{@link satellite.Payload Payload}'. * @@ -988,14 +920,6 @@ public interface SatellitePackage extends EPackage { */ EClass INTERFEROMETRY_MISSION = eINSTANCE.getInterferometryMission(); - /** - * The meta object literal for the 'Observation Time' attribute feature. - * - * - * @generated - */ - EAttribute INTERFEROMETRY_MISSION__OBSERVATION_TIME = eINSTANCE.getInterferometryMission_ObservationTime(); - /** * The meta object literal for the '{@link satellite.impl.CommunicatingElementImpl Communicating Element}' class. * @@ -1060,14 +984,6 @@ public interface SatellitePackage extends EPackage { */ EReference COMM_SUBSYSTEM__TARGET = eINSTANCE.getCommSubsystem_Target(); - /** - * The meta object literal for the 'Source' reference list feature. - * - * - * @generated - */ - EReference COMM_SUBSYSTEM__SOURCE = eINSTANCE.getCommSubsystem_Source(); - /** * The meta object literal for the '{@link satellite.impl.PayloadImpl Payload}' class. * diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/CommSubsystemImpl.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/CommSubsystemImpl.java index 21e385a8..d39abd4d 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/CommSubsystemImpl.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/CommSubsystemImpl.java @@ -2,16 +2,11 @@ */ package satellite.impl; -import java.util.Collection; import org.eclipse.emf.common.notify.Notification; -import org.eclipse.emf.common.notify.NotificationChain; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.impl.MinimalEObjectImpl; -import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList; -import org.eclipse.emf.ecore.util.InternalEList; import satellite.CommSubsystem; import satellite.SatellitePackage; @@ -24,7 +19,6 @@ import satellite.SatellitePackage; *

*
    *
  • {@link satellite.impl.CommSubsystemImpl#getTarget Target}
  • - *
  • {@link satellite.impl.CommSubsystemImpl#getSource Source}
  • *
* * @generated @@ -40,16 +34,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp */ protected CommSubsystem target; - /** - * The cached value of the '{@link #getSource() Source}' reference list. - * - * - * @see #getSource() - * @generated - * @ordered - */ - protected EList source; - /** * * @@ -97,25 +81,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp return target; } - /** - * - * - * @generated - */ - public NotificationChain basicSetTarget(CommSubsystem newTarget, NotificationChain msgs) { - CommSubsystem oldTarget = target; - target = newTarget; - if (eNotificationRequired()) { - ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, - SatellitePackage.COMM_SUBSYSTEM__TARGET, oldTarget, newTarget); - if (msgs == null) - msgs = notification; - else - msgs.add(notification); - } - return msgs; - } - /** * * @@ -123,70 +88,11 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp */ @Override public void setTarget(CommSubsystem newTarget) { - if (newTarget != target) { - NotificationChain msgs = null; - if (target != null) - msgs = ((InternalEObject) target).eInverseRemove(this, SatellitePackage.COMM_SUBSYSTEM__SOURCE, - CommSubsystem.class, msgs); - if (newTarget != null) - msgs = ((InternalEObject) newTarget).eInverseAdd(this, SatellitePackage.COMM_SUBSYSTEM__SOURCE, - CommSubsystem.class, msgs); - msgs = basicSetTarget(newTarget, msgs); - if (msgs != null) - msgs.dispatch(); - } else if (eNotificationRequired()) - eNotify(new ENotificationImpl(this, Notification.SET, SatellitePackage.COMM_SUBSYSTEM__TARGET, newTarget, - newTarget)); - } - - /** - * - * - * @generated - */ - @Override - public EList getSource() { - if (source == null) { - source = new EObjectWithInverseResolvingEList(CommSubsystem.class, this, - SatellitePackage.COMM_SUBSYSTEM__SOURCE, SatellitePackage.COMM_SUBSYSTEM__TARGET); - } - return source; - } - - /** - * - * - * @generated - */ - @SuppressWarnings("unchecked") - @Override - public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { - switch (featureID) { - case SatellitePackage.COMM_SUBSYSTEM__TARGET: - if (target != null) - msgs = ((InternalEObject) target).eInverseRemove(this, SatellitePackage.COMM_SUBSYSTEM__SOURCE, - CommSubsystem.class, msgs); - return basicSetTarget((CommSubsystem) otherEnd, msgs); - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - return ((InternalEList) (InternalEList) getSource()).basicAdd(otherEnd, msgs); - } - return super.eInverseAdd(otherEnd, featureID, msgs); - } - - /** - * - * - * @generated - */ - @Override - public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { - switch (featureID) { - case SatellitePackage.COMM_SUBSYSTEM__TARGET: - return basicSetTarget(null, msgs); - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - return ((InternalEList) getSource()).basicRemove(otherEnd, msgs); - } - return super.eInverseRemove(otherEnd, featureID, msgs); + CommSubsystem oldTarget = target; + target = newTarget; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, SatellitePackage.COMM_SUBSYSTEM__TARGET, oldTarget, + target)); } /** @@ -201,8 +107,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp if (resolve) return getTarget(); return basicGetTarget(); - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - return getSource(); } return super.eGet(featureID, resolve, coreType); } @@ -219,10 +123,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp case SatellitePackage.COMM_SUBSYSTEM__TARGET: setTarget((CommSubsystem) newValue); return; - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - getSource().clear(); - getSource().addAll((Collection) newValue); - return; } super.eSet(featureID, newValue); } @@ -238,9 +138,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp case SatellitePackage.COMM_SUBSYSTEM__TARGET: setTarget((CommSubsystem) null); return; - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - getSource().clear(); - return; } super.eUnset(featureID); } @@ -255,8 +152,6 @@ public abstract class CommSubsystemImpl extends MinimalEObjectImpl.Container imp switch (featureID) { case SatellitePackage.COMM_SUBSYSTEM__TARGET: return target != null; - case SatellitePackage.COMM_SUBSYSTEM__SOURCE: - return source != null && !source.isEmpty(); } return super.eIsSet(featureID); } diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/InterferometryMissionImpl.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/InterferometryMissionImpl.java index 3401ad51..450f8a9a 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/InterferometryMissionImpl.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/InterferometryMissionImpl.java @@ -2,12 +2,7 @@ */ package satellite.impl; -import org.eclipse.emf.common.notify.Notification; - import org.eclipse.emf.ecore.EClass; - -import org.eclipse.emf.ecore.impl.ENotificationImpl; - import satellite.InterferometryMission; import satellite.SatellitePackage; @@ -15,36 +10,10 @@ import satellite.SatellitePackage; * * An implementation of the model object 'Interferometry Mission'. * - *

- * The following features are implemented: - *

- *
    - *
  • {@link satellite.impl.InterferometryMissionImpl#getObservationTime Observation Time}
  • - *
* * @generated */ public class InterferometryMissionImpl extends ConstellationMissionImpl implements InterferometryMission { - /** - * The default value of the '{@link #getObservationTime() Observation Time}' attribute. - * - * - * @see #getObservationTime() - * @generated - * @ordered - */ - protected static final float OBSERVATION_TIME_EDEFAULT = 2.0F; - - /** - * The cached value of the '{@link #getObservationTime() Observation Time}' attribute. - * - * - * @see #getObservationTime() - * @generated - * @ordered - */ - protected float observationTime = OBSERVATION_TIME_EDEFAULT; - /** * * @@ -64,103 +33,4 @@ public class InterferometryMissionImpl extends ConstellationMissionImpl implemen return SatellitePackage.Literals.INTERFEROMETRY_MISSION; } - /** - * - * - * @generated - */ - @Override - public float getObservationTime() { - return observationTime; - } - - /** - * - * - * @generated - */ - @Override - public void setObservationTime(float newObservationTime) { - float oldObservationTime = observationTime; - observationTime = newObservationTime; - if (eNotificationRequired()) - eNotify(new ENotificationImpl(this, Notification.SET, - SatellitePackage.INTERFEROMETRY_MISSION__OBSERVATION_TIME, oldObservationTime, observationTime)); - } - - /** - * - * - * @generated - */ - @Override - public Object eGet(int featureID, boolean resolve, boolean coreType) { - switch (featureID) { - case SatellitePackage.INTERFEROMETRY_MISSION__OBSERVATION_TIME: - return getObservationTime(); - } - return super.eGet(featureID, resolve, coreType); - } - - /** - * - * - * @generated - */ - @Override - public void eSet(int featureID, Object newValue) { - switch (featureID) { - case SatellitePackage.INTERFEROMETRY_MISSION__OBSERVATION_TIME: - setObservationTime((Float) newValue); - return; - } - super.eSet(featureID, newValue); - } - - /** - * - * - * @generated - */ - @Override - public void eUnset(int featureID) { - switch (featureID) { - case SatellitePackage.INTERFEROMETRY_MISSION__OBSERVATION_TIME: - setObservationTime(OBSERVATION_TIME_EDEFAULT); - return; - } - super.eUnset(featureID); - } - - /** - * - * - * @generated - */ - @Override - public boolean eIsSet(int featureID) { - switch (featureID) { - case SatellitePackage.INTERFEROMETRY_MISSION__OBSERVATION_TIME: - return observationTime != OBSERVATION_TIME_EDEFAULT; - } - return super.eIsSet(featureID); - } - - /** - * - * - * @generated - */ - @Override - public String toString() { - if (eIsProxy()) - return super.toString(); - - StringBuilder result = new StringBuilder(super.toString()); - result.append(" (observationTime: "); - result.append(observationTime); - result.append(')'); - return result.toString(); - } - } //InterferometryMissionImpl diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/SatellitePackageImpl.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/SatellitePackageImpl.java index 17212a96..f6dc1e30 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/SatellitePackageImpl.java +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/ecore-gen/satellite/impl/SatellitePackageImpl.java @@ -2,7 +2,6 @@ */ package satellite.impl; -import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; @@ -242,16 +241,6 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka return interferometryMissionEClass; } - /** - * - * - * @generated - */ - @Override - public EAttribute getInterferometryMission_ObservationTime() { - return (EAttribute) interferometryMissionEClass.getEStructuralFeatures().get(0); - } - /** * * @@ -322,16 +311,6 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka return (EReference) commSubsystemEClass.getEStructuralFeatures().get(0); } - /** - * - * - * @generated - */ - @Override - public EReference getCommSubsystem_Source() { - return (EReference) commSubsystemEClass.getEStructuralFeatures().get(1); - } - /** * * @@ -457,7 +436,6 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka createEReference(constellationMissionEClass, CONSTELLATION_MISSION__SPACECRAFT); interferometryMissionEClass = createEClass(INTERFEROMETRY_MISSION); - createEAttribute(interferometryMissionEClass, INTERFEROMETRY_MISSION__OBSERVATION_TIME); communicatingElementEClass = createEClass(COMMUNICATING_ELEMENT); createEReference(communicatingElementEClass, COMMUNICATING_ELEMENT__COMM_SUBSYSTEM); @@ -469,7 +447,6 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka commSubsystemEClass = createEClass(COMM_SUBSYSTEM); createEReference(commSubsystemEClass, COMM_SUBSYSTEM__TARGET); - createEReference(commSubsystemEClass, COMM_SUBSYSTEM__SOURCE); payloadEClass = createEClass(PAYLOAD); @@ -537,15 +514,12 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka initEReference(getConstellationMission_GroundStationNetwork(), this.getGroundStationNetwork(), null, "groundStationNetwork", null, 1, 1, ConstellationMission.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); - initEReference(getConstellationMission_Spacecraft(), this.getSpacecraft(), null, "spacecraft", null, 2, 50, + initEReference(getConstellationMission_Spacecraft(), this.getSpacecraft(), null, "spacecraft", null, 2, -1, ConstellationMission.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(interferometryMissionEClass, InterferometryMission.class, "InterferometryMission", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); - initEAttribute(getInterferometryMission_ObservationTime(), ecorePackage.getEFloat(), "observationTime", "2.0", - 1, 1, InterferometryMission.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, - IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(communicatingElementEClass, CommunicatingElement.class, "CommunicatingElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); @@ -564,12 +538,9 @@ public class SatellitePackageImpl extends EPackageImpl implements SatellitePacka initEClass(commSubsystemEClass, CommSubsystem.class, "CommSubsystem", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); - initEReference(getCommSubsystem_Target(), this.getCommSubsystem(), this.getCommSubsystem_Source(), "target", - null, 0, 1, CommSubsystem.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, - IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); - initEReference(getCommSubsystem_Source(), this.getCommSubsystem(), this.getCommSubsystem_Target(), "source", - null, 0, -1, CommSubsystem.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, - IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getCommSubsystem_Target(), this.getCommSubsystem(), null, "target", null, 0, 1, + CommSubsystem.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, + !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(payloadEClass, Payload.class, "Payload", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/inputs/SatelliteInstance.xmi b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/inputs/SatelliteInstance.xmi index 7b8e355a..3d07a199 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/inputs/SatelliteInstance.xmi +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/inputs/SatelliteInstance.xmi @@ -4,11 +4,4 @@ xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:satellite="http://www.example.org/satellite" - xsi:schemaLocation="http://www.example.org/satellite ../model/satellite.ecore"> - - - - - + xsi:schemaLocation="http://www.example.org/satellite ../model/satellite.ecore"/> diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.ecore b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.ecore index 1685c756..9f17d43c 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.ecore +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.ecore @@ -5,12 +5,9 @@ - - - + upperBound="-1" eType="#//Spacecraft" containment="true"/> + @@ -21,10 +18,7 @@ containment="true"/> - - + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.genmodel b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.genmodel index 09b5f64c..bc98abd6 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.genmodel +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.genmodel @@ -15,9 +15,7 @@ - - - + @@ -27,7 +25,6 @@ - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin deleted file mode 100644 index 33059424..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin_diagram b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin_diagram deleted file mode 100644 index a5c675d8..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.henshin_diagram +++ /dev/null @@ -1,131 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite_fixup.henshin b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite_fixup.henshin deleted file mode 100644 index 224ced8f..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite_fixup.henshin +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml index a07867dc..b0b77996 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml @@ -8,6 +8,7 @@ + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/representations.aird b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/representations.aird new file mode 100644 index 00000000..efa8e366 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/representations.aird @@ -0,0 +1,2 @@ + + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend deleted file mode 100644 index 43b2902f..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend +++ /dev/null @@ -1,13 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo - -//import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.CostMetric -// -//class CostObjective extends MetricBasedGuidanceFunction { -// new() { -// super(CostMetric.instance) -// } -// -// override getName() { -// "Cost" -// } -//} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend deleted file mode 100644 index ee7f0060..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend +++ /dev/null @@ -1,31 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo - -import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries -import java.util.WeakHashMap -import org.eclipse.emf.ecore.EObject -import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions -import org.eclipse.viatra.query.runtime.emf.EMFScope -import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchHints - -class LocalSearchEngineManager { - public static val INSTANCE = new LocalSearchEngineManager - - val WeakHashMap engineMap = new WeakHashMap - - private new() { - } - - def getEngine(EObject eObject) { - engineMap.computeIfAbsent(eObject) [ - val scope = new EMFScope(it) - val localSearchHints = LocalSearchHints.^default.build - val options = ViatraQueryEngineOptions.defineOptions.withDefaultHint(localSearchHints).withDefaultBackend( - localSearchHints.queryBackendFactory).build - val engine = AdvancedViatraQueryEngine.on(scope, options) - SatelliteQueries.instance.prepare(engine) - engine - ] - } -} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend deleted file mode 100644 index 1529794f..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend +++ /dev/null @@ -1,47 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo - -import org.eclipse.viatra.query.runtime.api.IPatternMatch -import org.eclipse.viatra.query.runtime.api.IQuerySpecification -import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher -import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction -import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution - -abstract class MetricBasedGuidanceFunction implements IGuidanceFunction { - val IQuerySpecification> querySpecification - - protected new(IQuerySpecification> querySpecification) { - this.querySpecification = querySpecification - if (querySpecification.parameters.size != 1) { - throw new IllegalArgumentException("Metric must have a single parameter") - } - } - - override computeFitness(Solution model) { - val value = getMetricValue(model) - computeFitness(value) - } - - protected def double computeFitness(double metricValue) { - metricValue - } - - private def getMetricValue(Solution solution) { - val model = solution.model - val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model) - val matcher = querySpecification.getMatcher(queryEngine) - val iterator = matcher.allMatches.iterator - if (!iterator.hasNext) { - throw new IllegalStateException("Too few matches") - } - val objectValue = iterator.next.get(0) - if (objectValue instanceof Number) { - val doubleValue = objectValue.doubleValue - if (iterator.hasNext) { - throw new IllegalStateException("Too many matches") - } - doubleValue - } else { - throw new IllegalStateException("Metric value must be a number") - } - } -} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend deleted file mode 100644 index b238e64f..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend +++ /dev/null @@ -1,29 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo - -import com.google.common.collect.ImmutableList -import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries -import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction -import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution - -class PatternMatchConstraint implements IGuidanceFunction { - static val CONSTRAINT_ANNOTATION_NAME = "Constraint" - - val queries = ImmutableList.copyOf(SatelliteQueries.instance.specifications.filter [ - allAnnotations.exists[name == CONSTRAINT_ANNOTATION_NAME] - ]) - - override getName() { - "PatternMatch" - } - - override computeFitness(Solution solution) { - val model = solution.model - val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model) - var int matchCount = 0 - for (query : queries) { - val matcher = query.getMatcher(queryEngine) - matchCount += matcher.countMatches - } - matchCount - } -} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend deleted file mode 100644 index 58034c43..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend +++ /dev/null @@ -1,51 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo - -import java.io.BufferedReader -import java.io.BufferedWriter -import java.io.FileReader -import java.io.FileWriter -import java.util.Map -import org.eclipse.emf.ecore.EPackage -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import satellite.SatellitePackage -import uk.ac.kcl.inf.mdeoptimiser.interfaces.cli.Run - -class SatelliteMdeOptimiserMain { - static val PROJECT_PATH = "." - static val MOPT_PATH = "src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt" - - private new() { - new IllegalStateException("This is a static utility class and should not be instantiated directly.") - } - - public static def void main(String[] args) { - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, - new XMIResourceFactoryImpl) - EPackage.Registry.INSTANCE.put(SatellitePackage.eNS_URI, SatellitePackage.eINSTANCE) - fixupHenshinModel("model/satellite.henshin", "model/satellite_fixup.henshin", - #{"satellite.ecore" -> SatellitePackage.eNS_URI}) - Run.main(#["-p", PROJECT_PATH, "-m", MOPT_PATH]) - } - - private def static void fixupHenshinModel(String originalPath, String outputPath, Map remapMap) { - val reader = new BufferedReader(new FileReader(originalPath)) - try { - val writer = new BufferedWriter(new FileWriter(outputPath)) - try { - var String line - while ((line = reader.readLine) !== null) { - for (entry : remapMap.entrySet) { - line = line.replace(entry.key, entry.value) - } - writer.write(line) - writer.write("\n") - } - } finally { - writer.close - } - } finally { - reader.close - } - } -} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt deleted file mode 100644 index e9bd1a64..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt +++ /dev/null @@ -1,36 +0,0 @@ -problem { - basepath - metamodel - model <../inputs/SatelliteInstance.xmi> -} - -goal { - objective Cost minimise java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.CostObjective" } - constraint PatternMatch java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.PatternMatchConstraint" } -} - -search { -// mutate using unit "addCubeSat3U" - mutate { "CubeSat3U" } - mutate { "CubeSat6U" } - mutate { "SmallSat" } - mutate { "InterferometryPayload" } - mutate { "UHFCommSubsystem" } - mutate { "XCommSubsystem" } - mutate { "KaCommSubsystem" } -} - -solver { - optimisation provider moea algorithm NSGAII { - variation: mutation - population: 25 - mutation.step: 3 - mutation.strategy: random - } - - termination { - time: 120 - } - - batches 1 -} \ No newline at end of file diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql index c1d3f7d3..1f83a3b0 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql @@ -21,6 +21,13 @@ pattern transmittingGroundStationNetwork(Station : GroundStationNetwork) { find transmittingCommSubsystem(Station, _); } +@Constraint(severity = "error", key = {Station}, + message = "The ground station network may not have UHF communication subsystems.") +pattern roundStationNetworkUHF(Station : GroundStationNetwork) { + CommunicatingElement.commSubsystem(Station, Comm); + UHFCommSubsystem(Comm); +} + // At least two spacecraft must have the interferometry payload configured @Constraint(severity = "error", key = {Mission}, @@ -97,10 +104,6 @@ private pattern cubeSat3U(Sat : CubeSat3U) { CubeSat3U(Sat); } -private pattern cubeSat6U(Sat : CubeSat6U) { - CubeSat6U(Sat); -} - // No communication loops may exist // No spacecraft may directly communicate with itself diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/META-INF/MANIFEST.MF b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/META-INF/MANIFEST.MF index 81ee8677..2666dc5e 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/META-INF/MANIFEST.MF +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/META-INF/MANIFEST.MF @@ -9,8 +9,7 @@ Bundle-Localization: plugin Export-Package: hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm, hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl, hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.util, - hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu, - hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.mutated + hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu Require-Bundle: org.eclipse.viatra.query.runtime, org.eclipse.core.runtime, org.eclipse.emf.ecore;visibility:=reexport, diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml index 993ec75d..7bf4a20b 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml @@ -9,6 +9,8 @@ + + @@ -21,10 +23,14 @@ + + + + @@ -32,72 +38,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/mutated/mutated.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/mutated/mutated.vql deleted file mode 100644 index 58f66fe2..00000000 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/mutated/mutated.vql +++ /dev/null @@ -1,270 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.mutated - -import epackage "hu.bme.mit.inf.yakindumm" - -///////// -// Entry -///////// - -pattern entryInRegion_M0(r1 : Region, e1 : Entry) { - Region.vertices(r1, e1); -} -pattern entryInRegion_M1(r1 : Region, e1) { - Region.vertices(r1, e1); -} -pattern entryInRegion_M2(r1 : Region, e1: Entry) { - // For positive constraint - Region(r1);Entry(e1); -} - - -//@Constraint(severity="error", message="error", key = {r1}) -pattern noEntryInRegion_M0(r1 : Region) { - neg find entryInRegion_M0(r1, _); -} -pattern noEntryInRegion_M1(r1 : Region) { - neg find entryInRegion_M1(r1, _); -} -pattern noEntryInRegion_M2(r1 : Region) { - neg find entryInRegion_M2(r1, _); -} -pattern noEntryInRegion_M3(r1 : Region) { - find entryInRegion_M0(r1, _); -} -pattern noEntryInRegion_M4(r1 : Region) { - find entryInRegion_M1(r1, _); -} -pattern noEntryInRegion_M5(r1 : Region) { - find entryInRegion_M2(r1, _); -} - -//@Constraint(severity="error", message="error", key = {r}) -pattern multipleEntryInRegion_M0(r : Region) { - find entryInRegion_M0(r, e1); - find entryInRegion_M0(r, e2); - e1 != e2; -} -pattern multipleEntryInRegion_M1(r : Region) { - find entryInRegion_M1(r, e1); - find entryInRegion_M0(r, e2); - e1 != e2; -} -pattern multipleEntryInRegion_M2(r : Region) { - find entryInRegion_M2(r, e1); - find entryInRegion_M0(r, e2); - e1 != e2; -} -pattern multipleEntryInRegion_M3(r : Region) { - find entryInRegion_M0(r, e1); - find entryInRegion_M1(r, e2); - e1 != e2; -} -pattern multipleEntryInRegion_M4(r : Region) { - find entryInRegion_M2(r, e1); - find entryInRegion_M2(r, e2); - e1 != e2; -} -pattern multipleEntryInRegion_M5(r : Region) { - find entryInRegion_M0(r, e1); - find entryInRegion_M0(r, e2); -} - - -pattern transition_M0(t : Transition, src : Vertex, trg : Vertex) { - Transition.source(t, src); - Transition.target(t, trg); -} -pattern transition_M1(t : Transition, src : Vertex, trg : Vertex) { - Transition.source(t, src); - Vertex(trg); -} -pattern transition_M2(t : Transition, src : Vertex, trg : Vertex) { - Vertex(src); - Transition.target(t, trg); -} -pattern transition_M3(t : Transition, src : Vertex, trg : Vertex) { - Transition.source(t_x, src); - Transition.target(t, trg); -} -pattern transition_M4(t : Transition, src : Vertex, trg : Vertex) { - Transition.source(t, src); - Transition.target(t_x, trg); -} - -//@Constraint(severity="error", message="error", key = {e}) -pattern incomingToEntry_M0(t : Transition, e : Entry) { - find transition_M0(t, _, e); -} -pattern incomingToEntry_1(t : Transition, e) { - find transition_M0(t, _, e); -} -pattern incomingToEntry_2(t : Transition, e : Entry) { - find transition_M1(t, _, e); -} -pattern incomingToEntry_3(t : Transition, e : Entry) { - find transition_M2(t, _, e); -} -pattern incomingToEntry_4(t : Transition, e : Entry) { - find transition_M3(t, _, e); -} -pattern incomingToEntry_5(t : Transition, e : Entry) { - find transition_M4(t, _, e); -} - -pattern noOutgoingTransitionFromEntry_M0(e : Entry) { - neg find transition_M0(_, e, _); -} - -pattern noOutgoingTransitionFromEntry_M1(e) { - Vertex(e); - neg find transition_M0(_, e, _); -} -pattern noOutgoingTransitionFromEntry_M2(e : Entry) { - neg find transition_M1(_, e, _); -} -pattern noOutgoingTransitionFromEntry_M3(e : Entry) { - neg find transition_M2(_, e, _); -} -pattern noOutgoingTransitionFromEntry_M4(e : Entry) { - neg find transition_M3(_, e, _); -} -pattern noOutgoingTransitionFromEntry_M5(e : Entry) { - neg find transition_M4(_, e, _); -} - - -//@Constraint(severity="error", message="error", key = {e}) -pattern multipleTransitionFromEntry_M0(e : Entry, t1 : Transition, t2: Transition) { - Entry.outgoingTransitions(e,t1); - Entry.outgoingTransitions(e,t2); - t1!=t2; -} -pattern multipleTransitionFromEntry_M1(e, t1 : Transition, t2: Transition) { - Entry.outgoingTransitions(e,t1); - Entry.outgoingTransitions(e,t2); - t1!=t2; -} -pattern multipleTransitionFromEntry_M2(e : Entry, t1 : Transition, t2: Transition) { - Transition(t1); - Entry.outgoingTransitions(e,t2); - t1!=t2; -} -pattern multipleTransitionFromEntry_M3(e : Entry, t1 : Transition, t2: Transition) { - Entry.outgoingTransitions(e,t1); - Transition(t2); - t1!=t2; -} -pattern multipleTransitionFromEntry_M4(e : Entry, t1 : Transition, t2: Transition) { - Entry.outgoingTransitions(e,t1); - Entry.outgoingTransitions(e,t2); -} - -///////// -// Exit -///////// - -//@Constraint(severity="error", message="error", key = {e}) -pattern outgoingFromExit_M0(t : Transition, e : Exit) { - Exit.outgoingTransitions(e,t); -} -pattern outgoingFromExit_M1(t : Transition, e) { - Vertex.outgoingTransitions(e,t); -} -pattern outgoingFromExit_M2(t : Transition, e : Exit) { - Transition(t); - Exit(e); -} - -///////// -// Final -///////// - -//@Constraint(severity="error", message="error", key = {f}) -pattern outgoingFromFinal_M0(t : Transition, f : FinalState) { - FinalState.outgoingTransitions(f,t); -} -pattern outgoingFromFinal_M1(t : Transition, f) { - Vertex.outgoingTransitions(f,t); -} -pattern outgoingFromFinal_M2(t : Transition, f : FinalState) { - Transition(t); - FinalState(f); -} - -///////// -// State vs Region -///////// - -//@Constraint(severity="error", message="error", key = {region}) -pattern noStateInRegion_M0(region: Region) { - neg find StateInRegion_M0(region,_); -} -pattern noStateInRegion_M1(region: Region) { - neg find StateInRegion_M1(region,_); -} -pattern noStateInRegion_M2(region: Region) { - neg find StateInRegion_M2(region,_); -} -pattern noStateInRegion_M3(region: Region) { - find StateInRegion_M0(region,_); -} - -pattern StateInRegion_M0(region: Region, state: State) { - Region.vertices(region,state); -} -pattern StateInRegion_M1(region: Region, state) { - Region.vertices(region,state); -} -pattern StateInRegion_M2(region: Region, state:State) { - Region(region);State(state); -} - -///////// -// Choice -///////// - -@Constraint(severity="error", message="error", key = {c}) -pattern choiceHasNoOutgoing_M0(c : Choice) { - neg find transition_M0(_, c, _); -} -pattern choiceHasNoOutgoing_M1(c:Vertex) { - neg find transition_M0(_, c, _); -} -pattern choiceHasNoOutgoing_M2(c : Choice) { - neg find transition_M1(_, c, _); -} -pattern choiceHasNoOutgoing_M3(c : Choice) { - neg find transition_M2(_, c, _); -} -pattern choiceHasNoOutgoing_M4(c : Choice) { - neg find transition_M3(_, c, _); -} -pattern choiceHasNoOutgoing_M5(c : Choice) { - neg find transition_M4(_, c, _); -} -pattern choiceHasNoOutgoing_M6(c : Choice) { - find transition_M0(_, c, _); -} - -@Constraint(severity="error", message="error", key = {c}) -pattern choiceHasNoIncoming_M0(c: Choice) { - neg find transition_M0(_, _, c); -} -pattern choiceHasNoIncoming_M1(c:Vertex) { - neg find transition_M0(_, _, c); -} -pattern choiceHasNoIncoming_M2(c: Choice) { - neg find transition_M1(_, _, c); -} -pattern choiceHasNoIncoming_M3(c: Choice) { - neg find transition_M2(_, _, c); -} -pattern choiceHasNoIncoming_M4(c: Choice) { - neg find transition_M3(_, _, c); -} -pattern choiceHasNoIncoming_M5(c: Choice) { - neg find transition_M4(_, _, c); -} -pattern choiceHasNoIncoming_M6(c: Choice) { - find transition_M0(_, _, c); -} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql index f4bfa3c1..98a10cde 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql @@ -27,14 +27,22 @@ pattern transition(t : Transition, src : Vertex, trg : Vertex) { Transition.target(t, trg); } +pattern transitionFrom(t : Transition, src : Vertex) { + Transition.source(t, src); +} + +pattern transitionTo(t : Transition, trg : Vertex) { + Transition.target(t, trg); +} + @Constraint(severity="error", message="error", key = {e}) pattern incomingToEntry(t : Transition, e : Entry) { - find transition(t, _, e); + find transitionTo(t, e); } @Constraint(severity="error", message="error", key = {e}) pattern noOutgoingTransitionFromEntry(e : Entry) { - neg find transition(_, e, _); + neg find transitionFrom(_, e); } @Constraint(severity="error", message="error", key = {e}) @@ -80,12 +88,12 @@ pattern StateInRegion(region: Region, state: State) { @Constraint(severity="error", message="error", key = {c}) pattern choiceHasNoOutgoing(c : Choice) { - neg find transition(_, c, _); + neg find transitionFrom(_, c); } @Constraint(severity="error", message="error", key = {c}) pattern choiceHasNoIncoming(c: Choice) { - neg find transition(_, _, c); + neg find transitionTo(_, c); } ///////// @@ -94,27 +102,33 @@ pattern choiceHasNoIncoming(c: Choice) { @Constraint(severity="error", message="error", key = {s}) pattern synchHasNoOutgoing(s : Synchronization) { - neg find transition(_, s, _); + neg find transitionFrom(_, s); } @Constraint(severity="error", message="error", key = {s}) pattern synchHasNoIncoming(s : Synchronization) { - neg find transition(_, _, s); + neg find transitionTo(_, s); } @Constraint(severity="error", message="error", key = {s}) -pattern SynchronizedIncomingInSameRegion(s : Synchronization, v1 : Vertex, v2 : Vertex) { - find transition(t1, v1, s); - find transition(t2, v2, s); +pattern SynchronizedIncomingInSameRegion(s : Synchronization, t1 : Transition, t2 : Transition) { + find SynchronizedIncomingInSameRegionHelper1(r, s, t1); + find SynchronizedIncomingInSameRegionHelper1(r, s, t2); t1!=t2; - Region.vertices(r, v1); - Region.vertices(r, v2); } or { - find transition(t1, s, v1); - find transition(t2, s, v2); + find SynchronizedIncomingInSameRegionHelper2(r, s, t1); + find SynchronizedIncomingInSameRegionHelper2(r, s, t2); t1!=t2; +} + +pattern SynchronizedIncomingInSameRegionHelper1(r : Region, s : Synchronization, t1 : Transition) { + find transition(t1, v1, s); + Region.vertices(r, v1); +} + +pattern SynchronizedIncomingInSameRegionHelper2(r : Region, s : Synchronization, t1 : Transition) { + find transition(t1, s, v1); Region.vertices(r, v1); - Region.vertices(r, v2); } @Constraint(severity="error", message="error", key = {s}) @@ -136,18 +150,24 @@ pattern hasMultipleIncomingTrainsition(v : Synchronization) { } @Constraint(severity="error", message="error", key = {s}) -pattern SynchronizedRegionsAreNotSiblings(s : Synchronization, v1 : Vertex, v2 : Vertex) { - find transition(_, v1, s); - find transition(_, v2, s); - CompositeElement.regions.vertices(r1, v1); - CompositeElement.regions.vertices(r2, v2); +pattern SynchronizedRegionsAreNotSiblings(s : Synchronization, r1 : CompositeElement, r2 : CompositeElement) { + find SynchronizedRegionsAreNotSiblingsHelper1(s, r1); + find SynchronizedRegionsAreNotSiblingsHelper1(s, r2); r1 != r2; } or { + find SynchronizedRegionsAreNotSiblingsHelper2(s, r1); + find SynchronizedRegionsAreNotSiblingsHelper2(s, r2); + r1 != r2; +} + +pattern SynchronizedRegionsAreNotSiblingsHelper1(s : Synchronization, r1 : CompositeElement) { find transition(_, s, v1); - find transition(_, s, v2); CompositeElement.regions.vertices(r1, v1); - CompositeElement.regions.vertices(r2, v2); - r1 != r2; +} + +pattern SynchronizedRegionsAreNotSiblingsHelper2(s : Synchronization, r1 : CompositeElement) { + find transition(_, v1, s); + CompositeElement.regions.vertices(r1, v1); } /////////////////////////////// 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 23632d4d..e45ec1c8 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 @@ -5,6 +5,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.CbcPolyhedronSolver +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronScopePropagator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraintCalculator @@ -46,16 +47,28 @@ class ModelGenerationStatistics { public var long preliminaryTypeAnalisisTime = 0 public var int decisionsTried = 0 - + synchronized def incrementDecisionCount() { decisionsTried++ } + + public var int transformationInvocations + synchronized def incrementTransformationCount() { + transformationInvocations++ + } + public var int scopePropagatorInvocations - + synchronized def incrementScopePropagationCount() { scopePropagatorInvocations++ } + + public var int scopePropagatorSolverInvocations + + synchronized def incrementScopePropagationSolverCount() { + scopePropagatorSolverInvocations++ + } } @Data class ModelGenerationMethod { @@ -93,6 +106,7 @@ class ModelGenerationMethodProvider { boolean nameNewElements, TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy, + Collection hints, DocumentationLevel debugLevel ) { val statistics = new ModelGenerationStatistics @@ -103,8 +117,8 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, - workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, writeFiles) - val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, queries, statistics) + workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, writeFiles) + val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(queries, scopePropagator, nameNewElements, statistics) @@ -138,14 +152,20 @@ class ModelGenerationMethodProvider { } private def createScopePropagator(ScopePropagatorStrategy scopePropagatorStrategy, - PartialInterpretation emptySolution, GeneratedPatterns queries, ModelGenerationStatistics statistics) { + PartialInterpretation emptySolution, Collection hints, GeneratedPatterns queries, + ModelGenerationStatistics statistics) { + if (!hints.empty && !(scopePropagatorStrategy instanceof ScopePropagatorStrategy.Polyhedral)) { + throw new IllegalArgumentException("Only the Polyhedral scope propagator strategy can use hints.") + } switch (scopePropagatorStrategy) { - case ScopePropagatorStrategy.Count: + case ScopePropagatorStrategy.None, + case ScopePropagatorStrategy.Basic: new ScopePropagator(emptySolution, statistics) case ScopePropagatorStrategy.BasicTypeHierarchy: new TypeHierarchyScopePropagator(emptySolution, statistics) ScopePropagatorStrategy.Polyhedral: { val types = queries.refineObjectQueries.keySet.map[newType].toSet + val allPatternsByName = queries.allQueries.toMap[fullyQualifiedName] val solver = switch (scopePropagatorStrategy.solver) { case Z3Integer: new Z3PolyhedronSolver(false, scopePropagatorStrategy.timeoutSeconds) @@ -160,7 +180,8 @@ class ModelGenerationMethodProvider { scopePropagatorStrategy.solver) } new PolyhedronScopePropagator(emptySolution, statistics, types, queries.multiplicityConstraintQueries, - queries.hasElementInContainmentQuery, solver, scopePropagatorStrategy.requiresUpperBoundIndexing) + queries.hasElementInContainmentQuery, allPatternsByName, hints, solver, + scopePropagatorStrategy.requiresUpperBoundIndexing, scopePropagatorStrategy.updateHeuristic) } default: throw new IllegalArgumentException("Unknown scope propagator strategy: " + scopePropagatorStrategy) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend new file mode 100644 index 00000000..8c21ca1d --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend @@ -0,0 +1,30 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher + +interface LinearTypeExpressionBuilderFactory { + def ViatraQueryMatcher createMatcher(String queryName) + + def LinearTypeExpressionBuilder createBuilder() +} + +interface LinearTypeExpressionBuilder { + def LinearTypeExpressionBuilder add(int scale, Type type) + + def LinearBoundedExpression build() +} + +@FunctionalInterface +interface RelationConstraintUpdater { + def void update(PartialInterpretation p) +} + +interface LinearTypeConstraintHint { + def CharSequence getAdditionalPatterns(PatternGenerator patternGenerator) + + def RelationConstraintUpdater createConstraintUpdater(LinearTypeExpressionBuilderFactory builderFactory) +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index 7c05e818..51dba244 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -1,5 +1,7 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality +import com.google.common.cache.Cache +import com.google.common.cache.CacheBuilder import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableSet @@ -15,6 +17,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope import java.util.ArrayDeque import java.util.ArrayList +import java.util.Collection import java.util.HashMap import java.util.HashSet import java.util.List @@ -29,26 +32,33 @@ import org.eclipse.viatra.query.runtime.emf.EMFScope import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { + static val CACHE_SIZE = 10000 + + val boolean updateHeuristic val Map scopeBounds val LinearBoundedExpression topLevelBounds val Polyhedron polyhedron val PolyhedronSaturationOperator operator val Set relevantRelations + val Cache cache = CacheBuilder.newBuilder.maximumSize(CACHE_SIZE).build List updaters = emptyList new(PartialInterpretation p, ModelGenerationStatistics statistics, Set possibleNewDynamicTypes, Map unfinishedMultiplicityQueries, IQuerySpecification> hasElementInContainmentQuery, - PolyhedronSolver solver, boolean propagateRelations) { + Map>> allPatternsByName, + Collection hints, PolyhedronSolver solver, boolean propagateRelations, + boolean updateHeuristic) { super(p, statistics) + this.updateHeuristic = updateHeuristic val builder = new PolyhedronBuilder(p) builder.buildPolyhedron(possibleNewDynamicTypes) scopeBounds = builder.scopeBounds topLevelBounds = builder.topLevelBounds polyhedron = builder.polyhedron operator = solver.createSaturationOperator(polyhedron) + propagateAllScopeConstraints() if (propagateRelations) { - propagateAllScopeConstraints() val maximumNumberOfNewNodes = topLevelBounds.upperBound if (maximumNumberOfNewNodes === null) { throw new IllegalStateException("Could not determine maximum number of new nodes, it may be unbounded") @@ -57,7 +67,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { throw new IllegalStateException("Maximum number of new nodes is not positive") } builder.buildMultiplicityConstraints(unfinishedMultiplicityQueries, hasElementInContainmentQuery, - maximumNumberOfNewNodes) + allPatternsByName, hints, maximumNumberOfNewNodes) relevantRelations = builder.relevantRelations updaters = builder.updaters } else { @@ -66,21 +76,40 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } override void doPropagateAllScopeConstraints() { + super.doPropagateAllScopeConstraints() resetBounds() populatePolyhedronFromScope() // println(polyhedron) - val result = operator.saturate() -// println(polyhedron) - if (result == PolyhedronSaturationResult.EMPTY) { - setScopesInvalid() - } else { - populateScopesFromPolyhedron() - if (result != PolyhedronSaturationResult.SATURATED) { - super.propagateAllScopeConstraints() + val signature = polyhedron.createSignature + val cachedSignature = cache.getIfPresent(signature) + switch (cachedSignature) { + case null: { + statistics.incrementScopePropagationSolverCount + val result = operator.saturate() + if (result == PolyhedronSaturationResult.EMPTY) { + cache.put(signature, PolyhedronSignature.EMPTY) + setScopesInvalid() + } else { + val resultSignature = polyhedron.createSignature + cache.put(signature, resultSignature) + populateScopesFromPolyhedron() + } } + case PolyhedronSignature.EMPTY: + setScopesInvalid() + PolyhedronSignature.Bounds: { + polyhedron.applySignature(signature) + populateScopesFromPolyhedron() + } + default: + throw new IllegalStateException("Unknown polyhedron signature: " + signature) + } +// println(polyhedron) + if (updateHeuristic) { + copyScopeBoundsToHeuristic() } } - + override propagateAdditionToRelation(Relation r) { super.propagateAdditionToRelation(r) if (relevantRelations.contains(r)) { @@ -186,7 +215,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } @FinalFieldsConstructor - private static class PolyhedronBuilder { + private static class PolyhedronBuilder implements LinearTypeExpressionBuilderFactory { static val INFINITY_SCALE = 10 val PartialInterpretation p @@ -197,6 +226,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { Map typeBounds int infinity ViatraQueryEngine queryEngine + Map>> allPatternsByName ImmutableList.Builder updatersBuilder Map scopeBounds @@ -222,9 +252,11 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { def buildMultiplicityConstraints( Map constraints, IQuerySpecification> hasElementInContainmentQuery, - int maximumNuberOfNewNodes) { + Map>> allPatternsByName, + Collection hints, int maximumNuberOfNewNodes) { infinity = maximumNuberOfNewNodes * INFINITY_SCALE queryEngine = ViatraQueryEngine.on(new EMFScope(p)) + this.allPatternsByName = allPatternsByName updatersBuilder = ImmutableList.builder val containmentConstraints = constraints.entrySet.filter[key.containment].groupBy[key.targetType] for (pair : containmentConstraints.entrySet) { @@ -238,10 +270,13 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } } buildRelevantRelations(constraints.keySet) + for (hint : hints) { + updatersBuilder.add(hint.createConstraintUpdater(this)) + } updaters = updatersBuilder.build addCachedConstraintsToPolyhedron() } - + private def buildRelevantRelations(Set constraints) { val builder = ImmutableSet.builder for (constraint : constraints) { @@ -345,7 +380,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } } - private def addCoefficients(Map accumulator, int scale, Map a) { + private static def addCoefficients(Map accumulator, int scale, Map a) { for (pair : a.entrySet) { val dimension = pair.key val currentValue = accumulator.get(pair.key) ?: 0 @@ -411,14 +446,41 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } scopeBoundsBuilder.build } + + override createMatcher(String queryName) { + val querySpecification = allPatternsByName.get(queryName) + if (querySpecification === null) { + throw new IllegalArgumentException("Unknown pattern: " + queryName) + } + querySpecification.getMatcher(queryEngine) + } + + override createBuilder() { + new PolyhedronBuilderLinearTypeExpressionBuilder(this) + } } - private static interface RelationConstraintUpdater { - def void update(PartialInterpretation p) + @FinalFieldsConstructor + private static class PolyhedronBuilderLinearTypeExpressionBuilder implements LinearTypeExpressionBuilder { + val PolyhedronBuilder polyhedronBuilder + val Map coefficients = new HashMap + + override add(int scale, Type type) { + val typeCoefficients = polyhedronBuilder.subtypeDimensions.get(type) + if (typeCoefficients === null) { + throw new IllegalArgumentException("Unknown type: " + type) + } + PolyhedronBuilder.addCoefficients(coefficients, scale, typeCoefficients) + this + } + + override build() { + polyhedronBuilder.toExpression(coefficients) + } } @FinalFieldsConstructor - static class ContainmentConstraintUpdater implements RelationConstraintUpdater { + private static class ContainmentConstraintUpdater implements RelationConstraintUpdater { val String name val LinearBoundedExpression orphansLowerBound val LinearBoundedExpression orphansUpperBound @@ -460,7 +522,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } @FinalFieldsConstructor - static class ContainmentRootConstraintUpdater implements RelationConstraintUpdater { + private static class ContainmentRootConstraintUpdater implements RelationConstraintUpdater { val LinearBoundedExpression typeCardinality val ViatraQueryMatcher hasElementInContainmentMatcher @@ -479,7 +541,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } @FinalFieldsConstructor - static class UnfinishedMultiplicityConstraintUpdater implements RelationConstraintUpdater { + private static class UnfinishedMultiplicityConstraintUpdater implements RelationConstraintUpdater { val String name val LinearBoundedExpression availableMultiplicityExpression val ViatraQueryMatcher unfinishedMultiplicityMatcher @@ -500,7 +562,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } @FinalFieldsConstructor - static class UnrepairableMultiplicityConstraintUpdater implements RelationConstraintUpdater { + private static class UnrepairableMultiplicityConstraintUpdater implements RelationConstraintUpdater { val String name val LinearBoundedExpression targetCardinalityExpression val ViatraQueryMatcher unrepairableMultiplicityMatcher diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend index 9c6cb82e..4e046190 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend @@ -3,6 +3,7 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality import java.util.List import java.util.Map import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor interface PolyhedronSolver { @@ -52,16 +53,66 @@ class Polyhedron { val List expressionsToSaturate override toString() ''' - Dimensions: - «FOR dimension : dimensions» - «dimension» - «ENDFOR» - Constraints: - «FOR constraint : constraints» - «constraint» - «ENDFOR» + Dimensions: + «FOR dimension : dimensions» + «dimension» + «ENDFOR» + Constraints: + «FOR constraint : constraints» + «constraint» + «ENDFOR» ''' + def createSignature() { + val size = dimensions.size + constraints.size + val lowerBounds = newArrayOfSize(size) + val upperBounds = newArrayOfSize(size) + var int i = 0 + for (dimension : dimensions) { + lowerBounds.set(i, dimension.lowerBound) + upperBounds.set(i, dimension.upperBound) + i++ + } + for (constraint : constraints) { + lowerBounds.set(i, constraint.lowerBound) + upperBounds.set(i, constraint.upperBound) + i++ + } + new PolyhedronSignature.Bounds(lowerBounds, upperBounds) + } + + def applySignature(PolyhedronSignature.Bounds signature) { + val lowerBounds = signature.lowerBounds + val upperBounds = signature.upperBounds + var int i = 0 + for (dimension : dimensions) { + dimension.lowerBound = lowerBounds.get(i) + dimension.upperBound = upperBounds.get(i) + i++ + } + for (constraint : constraints) { + constraint.lowerBound = lowerBounds.get(i) + constraint.upperBound = upperBounds.get(i) + i++ + } + } +} + +abstract class PolyhedronSignature { + public static val EMPTY = new PolyhedronSignature { + override toString() { + "PolyhedronSignature.EMPTY" + } + } + + private new() { + } + + @Data + static class Bounds extends PolyhedronSignature { + val Integer[] lowerBounds + val Integer[] upperBounds + } } @Accessors @@ -80,6 +131,11 @@ abstract class LinearBoundedExpression { upperBound = tighterBound } } + + def void assertEqualsTo(int bound) { + tightenLowerBound(bound) + tightenUpperBound(bound) + } } @Accessors diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend index 52a390a8..013e53e1 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend @@ -117,9 +117,12 @@ class RelationConstraintCalculator { var inverseUpperMultiplicity = -1 val inverseRelation = inverseRelations.get(relation) if (inverseRelation !== null) { - inverseUpperMultiplicity = upperMultiplicities.get(relation) + inverseUpperMultiplicity = upperMultiplicities.get(inverseRelation) container = containmentRelations.contains(inverseRelation) } + if (containment) { + inverseUpperMultiplicity = 1 + } val constraint = new RelationMultiplicityConstraint(relation, inverseRelation, containment, container, lowerMultiplicity, upperMultiplicity, inverseUpperMultiplicity) if (constraint.isActive) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 0bdb202e..2376fb38 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -14,7 +14,7 @@ import org.eclipse.xtend.lib.annotations.Accessors class ScopePropagator { @Accessors(PROTECTED_GETTER) val PartialInterpretation partialInterpretation - val ModelGenerationStatistics statistics + @Accessors(PROTECTED_GETTER) val ModelGenerationStatistics statistics val Map type2Scope @Accessors(PROTECTED_GETTER) val Map> superScopes @Accessors(PROTECTED_GETTER) val Map> subScopes @@ -59,12 +59,21 @@ class ScopePropagator { } } } while (changed) + + copyScopeBoundsToHeuristic() } def propagateAllScopeConstraints() { statistics.incrementScopePropagationCount() doPropagateAllScopeConstraints() } + + protected def copyScopeBoundsToHeuristic() { + partialInterpretation.minNewElementsHeuristic = partialInterpretation.minNewElements + for (scope : partialInterpretation.scopes) { + scope.minNewElementsHeuristic = scope.minNewElements + } + } protected def void doPropagateAllScopeConstraints() { // Nothing to propagate. @@ -73,12 +82,17 @@ class ScopePropagator { def 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 } + if (this.partialInterpretation.minNewElementsHeuristic > 0) { + this.partialInterpretation.minNewElementsHeuristic = this.partialInterpretation.minNewElementsHeuristic - 1 + } if (this.partialInterpretation.maxNewElements > 0) { this.partialInterpretation.maxNewElements = this.partialInterpretation.maxNewElements - 1 } else if (this.partialInterpretation.maxNewElements === 0) { @@ -105,5 +119,8 @@ class ScopePropagator { if (scope.minNewElements > 0) { scope.minNewElements = scope.minNewElements - 1 } + if (scope.minNewElementsHeuristic > 0) { + scope.minNewElementsHeuristic = scope.minNewElementsHeuristic - 1 + } } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend index b0ed75cb..3165917a 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagatorStrategy.xtend @@ -16,7 +16,9 @@ enum PolyhedralScopePropagatorSolver { } abstract class ScopePropagatorStrategy { - public static val Count = new Simple("Count") + public static val None = new Simple("None") + + public static val Basic = new Simple("Basic") public static val BasicTypeHierarchy = new Simple("BasicTypeHierarchy") @@ -47,14 +49,19 @@ abstract class ScopePropagatorStrategy { val PolyhedralScopePropagatorConstraints constraints val PolyhedralScopePropagatorSolver solver + val boolean updateHeuristic val double timeoutSeconds @FinalFieldsConstructor new() { } + new(PolyhedralScopePropagatorConstraints constraints, PolyhedralScopePropagatorSolver solver, boolean updateHeuristic) { + this(constraints, solver, updateHeuristic, UNLIMITED_TIME) + } + new(PolyhedralScopePropagatorConstraints constraints, PolyhedralScopePropagatorSolver solver) { - this(constraints, solver, UNLIMITED_TIME) + this(constraints, solver, true) } override requiresUpperBoundIndexing() { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend index be8ef00a..d1704b39 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/TypeHierarchyScopePropagator.xtend @@ -27,12 +27,16 @@ class TypeHierarchyScopePropagator extends ScopePropagator { } private def propagateLowerLimitUp(Scope subScope, Scope superScope) { + var changed = false if (subScope.minNewElements > superScope.minNewElements) { superScope.minNewElements = subScope.minNewElements - return true - } else { - return false + changed = true + } + if (subScope.minNewElementsHeuristic > superScope.minNewElementsHeuristic) { + superScope.minNewElementsHeuristic = subScope.minNewElementsHeuristic + changed = true } + changed } private def propagateUpperLimitDown(Scope subScope, Scope superScope) { @@ -50,16 +54,20 @@ class TypeHierarchyScopePropagator extends ScopePropagator { } private def propagateLowerLimitUp(Scope subScope, PartialInterpretation p) { + var changed = false if (subScope.minNewElements > p.minNewElements) { // println(''' // «(subScope.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name» -> nodes // p.minNewElements «p.minNewElements» = subScope.minNewElements «subScope.minNewElements» // ''') p.minNewElements = subScope.minNewElements - return true - } else { - return false + changed = true + } + if (subScope.minNewElementsHeuristic > p.minNewElementsHeuristic) { + p.minNewElementsHeuristic = subScope.minNewElementsHeuristic + changed = true } + changed } private def propagateUpperLimitDown(Scope subScope, PartialInterpretation p) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/Z3PolyhedronSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/Z3PolyhedronSolver.xtend index 23444956..3b831433 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/Z3PolyhedronSolver.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/Z3PolyhedronSolver.xtend @@ -13,6 +13,7 @@ import java.math.BigDecimal import java.math.MathContext import java.math.RoundingMode import java.util.Map +import org.eclipse.xtend.lib.annotations.Accessors import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor class Z3PolyhedronSolver implements PolyhedronSolver { @@ -28,10 +29,33 @@ class Z3PolyhedronSolver implements PolyhedronSolver { } override createSaturationOperator(Polyhedron polyhedron) { + new DisposingZ3SaturationOperator(this, polyhedron) + } + + def createPersistentSaturationOperator(Polyhedron polyhedron) { new Z3SaturationOperator(polyhedron, lpRelaxation, timeoutSeconds) } } +@FinalFieldsConstructor +class DisposingZ3SaturationOperator implements PolyhedronSaturationOperator { + val Z3PolyhedronSolver solver + @Accessors val Polyhedron polyhedron + + override saturate() { + val persistentOperator = solver.createPersistentSaturationOperator(polyhedron) + try { + persistentOperator.saturate + } finally { + persistentOperator.close + } + } + + override close() throws Exception { + // Nothing to close. + } +} + class Z3SaturationOperator extends AbstractPolyhedronSaturationOperator { static val INFINITY_SYMBOL_NAME = "oo" static val MULT_SYMBOL_NAME = "*" @@ -106,9 +130,9 @@ class Z3SaturationOperator extends AbstractPolyhedronSaturationOperator { IntNum: resultExpr.getInt() RatNum: - floor(resultExpr) + ceil(resultExpr) AlgebraicNum: - floor(resultExpr.toLower(ALGEBRAIC_NUMBER_ROUNDING)) + ceil(resultExpr.toUpper(ALGEBRAIC_NUMBER_ROUNDING)) default: if (isNegativeInfinity(resultExpr)) { null @@ -136,9 +160,9 @@ class Z3SaturationOperator extends AbstractPolyhedronSaturationOperator { IntNum: resultExpr.getInt() RatNum: - ceil(resultExpr) + floor(resultExpr) AlgebraicNum: - ceil(resultExpr.toUpper(ALGEBRAIC_NUMBER_ROUNDING)) + floor(resultExpr.toLower(ALGEBRAIC_NUMBER_ROUNDING)) default: if (isPositiveInfinity(resultExpr)) { null 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 1b0db90e..5c35fb54 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 @@ -16,8 +16,11 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Transform 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.logic2viatra.TypeInferenceMethod +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraints +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.util.Collection import java.util.HashMap import java.util.Map import org.eclipse.emf.ecore.EAttribute @@ -26,7 +29,6 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend.lib.annotations.Accessors import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy class PatternGenerator { @Accessors(PUBLIC_GETTER) val TypeIndexer typeIndexer // = new TypeIndexer(this) @@ -104,7 +106,9 @@ class PatternGenerator { } def isRepresentative(Relation relation, Relation inverse) { - if (inverse === null) { + if (relation === null) { + return false + } else if (inverse === null) { return true } else { relation.name.compareTo(inverse.name) < 1 @@ -144,7 +148,8 @@ class PatternGenerator { PartialInterpretation emptySolution, Map fqn2PQuery, TypeAnalysisResult typeAnalysisResult, - RelationConstraints constraints + RelationConstraints constraints, + Collection hints ) { return ''' @@ -294,6 +299,13 @@ class PatternGenerator { // 4.3 Relation refinement ////////// «relationRefinementGenerator.generateRefineReference(problem)» + + ////////// + // 5 Hints + ////////// + «FOR hint : hints» + «hint.getAdditionalPatterns(this)» + «ENDFOR» ''' } } 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 eadf0ae0..f5c85524 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 @@ -26,6 +26,7 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend.lib.annotations.Data import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint @Data class GeneratedPatterns { @@ -62,7 +63,8 @@ class PatternProvider { def generateQueries(LogicProblem problem, PartialInterpretation emptySolution, ModelGenerationStatistics statistics, Set existingQueries, ReasonerWorkspace workspace, TypeInferenceMethod typeInferenceMethod, - ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, boolean writeToFile) { + ScopePropagatorStrategy scopePropagatorStrategy, RelationConstraints relationConstraints, + Collection hints, boolean writeToFile) { val fqn2Query = existingQueries.toMap[it.fullyQualifiedName] val PatternGenerator patternGenerator = new PatternGenerator(typeInferenceMethod, scopePropagatorStrategy) val typeAnalysisResult = if (patternGenerator.requiresTypeAnalysis) { @@ -75,7 +77,7 @@ class PatternProvider { null } val baseIndexerFile = patternGenerator.transformBaseProperties(problem, emptySolution, fqn2Query, - typeAnalysisResult, relationConstraints) + typeAnalysisResult, relationConstraints, hints) if (writeToFile) { workspace.writeText('''generated3valued.vql_deactivated''', baseIndexerFile) } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index fa73c861..d915d47e 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend @@ -44,7 +44,7 @@ class RelationRefinementGenerator { def referRefinementQuery(RelationDeclaration relation, Relation inverseRelation, String relInterpretationName, String inverseInterpretationName, String sourceName, - String targetName) '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation !== null»inverseInterpretationName, «ENDIF»«sourceName», «targetName»);''' + String targetName) '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation !== null»«inverseInterpretationName», «ENDIF»«sourceName», «targetName»);''' def getRefineRelationQueries(LogicProblem p) { // val containmentRelations = p.containmentHierarchies.map[containmentRelations].flatten.toSet diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend index 15b5a047..a8a07756 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns +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 hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationMultiplicityConstraint @@ -76,21 +77,26 @@ class UnfinishedIndexer { «IF indexUpperMultiplicities» «IF constraint.constrainsUnrepairable || constraint.constrainsRemainingInverse» private pattern «repairMatchName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, source:DefinedElement, target:DefinedElement) { - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,source); - «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» - find mustExist(problem,interpretation,target); - «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» - neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» - «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» + «IF base.isRepresentative(constraint.relation, constraint.inverseRelation) && constraint.relation instanceof RelationDeclaration» + «base.relationRefinementGenerator.referRefinementQuery(constraint.relation as RelationDeclaration, constraint.inverseRelation, "_", "_", "source", "target")» + «ELSE» + «IF base.isRepresentative(constraint.inverseRelation, constraint.relation) && constraint.inverseRelation instanceof RelationDeclaration» + «base.relationRefinementGenerator.referRefinementQuery(constraint.inverseRelation as RelationDeclaration, constraint.relation, "_", "_", "target", "source")» + «ELSE» + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,source); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» + find mustExist(problem,interpretation,target); + «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» + neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» + «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» + «ENDIF» + «ENDIF» } «ENDIF» «IF constraint.constrainsUnrepairable» private pattern «unrepairableMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, unrepairableMultiplicity:java Integer) { - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,object); - «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, object, missingMultiplicity); numberOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, object, _); check(numberOfRepairMatches < missingMultiplicity); 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 bf816de9..7891ebd8 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 @@ -67,7 +67,8 @@ class RefinementRuleProvider { if(containmentRelation != null) { if(inverseRelation!= null) { ruleBuilder.action[match | - //println(name) + statistics.incrementTransformationCount +// println(name) val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -107,7 +108,8 @@ class RefinementRuleProvider { ] } else { ruleBuilder.action[match | - //println(name) + statistics.incrementTransformationCount +// println(name) val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -144,6 +146,9 @@ class RefinementRuleProvider { } } else { ruleBuilder.action[match | + statistics.incrementTransformationCount +// println(name) + val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation @@ -198,8 +203,9 @@ class RefinementRuleProvider { .precondition(lhs) if (inverseRelation == null) { ruleBuilder.action [ match | + statistics.incrementTransformationCount val startTime = System.nanoTime - //println(name) +// println(name) // val problem = match.get(0) as LogicProblem // val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation @@ -217,8 +223,9 @@ class RefinementRuleProvider { ] } else { ruleBuilder.action [ match | + statistics.incrementTransformationCount val startTime = System.nanoTime - //println(name) +// println(name) // val problem = match.get(0) as LogicProblem // val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialInterpretation.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialInterpretation.java index 098cc15b..9d0c3fea 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialInterpretation.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialInterpretation.java @@ -30,6 +30,7 @@ import org.eclipse.emf.ecore.EObject; *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getScopes Scopes}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMinNewElements Min New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMaxNewElements Max New Elements}
  • + *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMinNewElementsHeuristic Min New Elements Heuristic}
  • * * * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage#getPartialInterpretation() @@ -255,4 +256,27 @@ public interface PartialInterpretation extends EObject { */ void setMaxNewElements(int value); + /** + * Returns the value of the 'Min New Elements Heuristic' attribute. + * The default value is "0". + * + * + * @return the value of the 'Min New Elements Heuristic' attribute. + * @see #setMinNewElementsHeuristic(int) + * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage#getPartialInterpretation_MinNewElementsHeuristic() + * @model default="0" required="true" + * @generated + */ + int getMinNewElementsHeuristic(); + + /** + * Sets the value of the '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMinNewElementsHeuristic Min New Elements Heuristic}' attribute. + * + * + * @param value the new value of the 'Min New Elements Heuristic' attribute. + * @see #getMinNewElementsHeuristic() + * @generated + */ + void setMinNewElementsHeuristic(int value); + } // PartialInterpretation diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialinterpretationPackage.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialinterpretationPackage.java index 4f34b9b7..f462ebe4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialinterpretationPackage.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/PartialinterpretationPackage.java @@ -166,6 +166,15 @@ public interface PartialinterpretationPackage extends EPackage { */ int PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS = 10; + /** + * The feature id for the 'Min New Elements Heuristic' attribute. + * + * + * @generated + * @ordered + */ + int PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC = 11; + /** * The number of structural features of the 'Partial Interpretation' class. * @@ -173,7 +182,7 @@ public interface PartialinterpretationPackage extends EPackage { * @generated * @ordered */ - int PARTIAL_INTERPRETATION_FEATURE_COUNT = 11; + int PARTIAL_INTERPRETATION_FEATURE_COUNT = 12; /** * The number of operations of the 'Partial Interpretation' class. @@ -912,6 +921,15 @@ public interface PartialinterpretationPackage extends EPackage { */ int SCOPE__TARGET_TYPE_INTERPRETATION = 2; + /** + * The feature id for the 'Min New Elements Heuristic' attribute. + * + * + * @generated + * @ordered + */ + int SCOPE__MIN_NEW_ELEMENTS_HEURISTIC = 3; + /** * The number of structural features of the 'Scope' class. * @@ -919,7 +937,7 @@ public interface PartialinterpretationPackage extends EPackage { * @generated * @ordered */ - int SCOPE_FEATURE_COUNT = 3; + int SCOPE_FEATURE_COUNT = 4; /** * The number of operations of the 'Scope' class. @@ -1357,6 +1375,17 @@ public interface PartialinterpretationPackage extends EPackage { */ EAttribute getPartialInterpretation_MaxNewElements(); + /** + * Returns the meta object for the attribute '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMinNewElementsHeuristic Min New Elements Heuristic}'. + * + * + * @return the meta object for the attribute 'Min New Elements Heuristic'. + * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation#getMinNewElementsHeuristic() + * @see #getPartialInterpretation() + * @generated + */ + EAttribute getPartialInterpretation_MinNewElementsHeuristic(); + /** * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialConstantInterpretation Partial Constant Interpretation}'. * @@ -1749,6 +1778,17 @@ public interface PartialinterpretationPackage extends EPackage { */ EReference getScope_TargetTypeInterpretation(); + /** + * Returns the meta object for the attribute '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMinNewElementsHeuristic Min New Elements Heuristic}'. + * + * + * @return the meta object for the attribute 'Min New Elements Heuristic'. + * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMinNewElementsHeuristic() + * @see #getScope() + * @generated + */ + EAttribute getScope_MinNewElementsHeuristic(); + /** * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialPrimitiveInterpretation Partial Primitive Interpretation}'. * @@ -1952,6 +1992,14 @@ public interface PartialinterpretationPackage extends EPackage { */ EAttribute PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS = eINSTANCE.getPartialInterpretation_MaxNewElements(); + /** + * The meta object literal for the 'Min New Elements Heuristic' attribute feature. + * + * + * @generated + */ + EAttribute PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC = eINSTANCE.getPartialInterpretation_MinNewElementsHeuristic(); + /** * The meta object literal for the '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialConstantInterpretationImpl Partial Constant Interpretation}' class. * @@ -2278,6 +2326,14 @@ public interface PartialinterpretationPackage extends EPackage { */ EReference SCOPE__TARGET_TYPE_INTERPRETATION = eINSTANCE.getScope_TargetTypeInterpretation(); + /** + * The meta object literal for the 'Min New Elements Heuristic' attribute feature. + * + * + * @generated + */ + EAttribute SCOPE__MIN_NEW_ELEMENTS_HEURISTIC = eINSTANCE.getScope_MinNewElementsHeuristic(); + /** * The meta object literal for the '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialPrimitiveInterpretationImpl Partial Primitive Interpretation}' class. * diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/Scope.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/Scope.java index 155b9f00..a0b58615 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/Scope.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/Scope.java @@ -16,6 +16,7 @@ import org.eclipse.emf.ecore.EObject; *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMinNewElements Min New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMaxNewElements Max New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getTargetTypeInterpretation Target Type Interpretation}
  • + *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMinNewElementsHeuristic Min New Elements Heuristic}
  • * * * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage#getScope() @@ -105,4 +106,27 @@ public interface Scope extends EObject { */ void setTargetTypeInterpretation(PartialTypeInterpratation value); + /** + * Returns the value of the 'Min New Elements Heuristic' attribute. + * The default value is "0". + * + * + * @return the value of the 'Min New Elements Heuristic' attribute. + * @see #setMinNewElementsHeuristic(int) + * @see hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage#getScope_MinNewElementsHeuristic() + * @model default="0" required="true" + * @generated + */ + int getMinNewElementsHeuristic(); + + /** + * Sets the value of the '{@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope#getMinNewElementsHeuristic Min New Elements Heuristic}' attribute. + * + * + * @param value the new value of the 'Min New Elements Heuristic' attribute. + * @see #getMinNewElementsHeuristic() + * @generated + */ + void setMinNewElementsHeuristic(int value); + } // Scope diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BinaryElementRelationLinkImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BinaryElementRelationLinkImpl.java index f5efe02a..ca33dd65 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BinaryElementRelationLinkImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BinaryElementRelationLinkImpl.java @@ -73,6 +73,7 @@ public class BinaryElementRelationLinkImpl extends RelationLinkImpl implements B * * @generated */ + @Override public DefinedElement getParam1() { if (param1 != null && param1.eIsProxy()) { InternalEObject oldParam1 = (InternalEObject)param1; @@ -99,6 +100,7 @@ public class BinaryElementRelationLinkImpl extends RelationLinkImpl implements B * * @generated */ + @Override public void setParam1(DefinedElement newParam1) { DefinedElement oldParam1 = param1; param1 = newParam1; @@ -111,6 +113,7 @@ public class BinaryElementRelationLinkImpl extends RelationLinkImpl implements B * * @generated */ + @Override public DefinedElement getParam2() { if (param2 != null && param2.eIsProxy()) { InternalEObject oldParam2 = (InternalEObject)param2; @@ -137,6 +140,7 @@ public class BinaryElementRelationLinkImpl extends RelationLinkImpl implements B * * @generated */ + @Override public void setParam2(DefinedElement newParam2) { DefinedElement oldParam2 = param2; param2 = newParam2; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BooleanElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BooleanElementImpl.java index e906e07d..5f12d9e4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BooleanElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/BooleanElementImpl.java @@ -69,6 +69,7 @@ public class BooleanElementImpl extends PrimitiveElementImpl implements BooleanE * * @generated */ + @Override public boolean isValue() { return value; } @@ -78,6 +79,7 @@ public class BooleanElementImpl extends PrimitiveElementImpl implements BooleanE * * @generated */ + @Override public void setValue(boolean newValue) { boolean oldValue = value; value = newValue; @@ -152,7 +154,7 @@ public class BooleanElementImpl extends PrimitiveElementImpl implements BooleanE public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (value: "); result.append(value); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/IntegerElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/IntegerElementImpl.java index ef1a4b96..c8fbe1dd 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/IntegerElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/IntegerElementImpl.java @@ -69,6 +69,7 @@ public class IntegerElementImpl extends PrimitiveElementImpl implements IntegerE * * @generated */ + @Override public int getValue() { return value; } @@ -78,6 +79,7 @@ public class IntegerElementImpl extends PrimitiveElementImpl implements IntegerE * * @generated */ + @Override public void setValue(int newValue) { int oldValue = value; value = newValue; @@ -152,7 +154,7 @@ public class IntegerElementImpl extends PrimitiveElementImpl implements IntegerE public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (value: "); result.append(value); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkElementImpl.java index 749a03c5..c319a3f4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkElementImpl.java @@ -83,6 +83,7 @@ public class NaryRelationLinkElementImpl extends MinimalEObjectImpl.Container im * * @generated */ + @Override public int getIndex() { return index; } @@ -92,6 +93,7 @@ public class NaryRelationLinkElementImpl extends MinimalEObjectImpl.Container im * * @generated */ + @Override public void setIndex(int newIndex) { int oldIndex = index; index = newIndex; @@ -104,6 +106,7 @@ public class NaryRelationLinkElementImpl extends MinimalEObjectImpl.Container im * * @generated */ + @Override public DefinedElement getParam() { if (param != null && param.eIsProxy()) { InternalEObject oldParam = (InternalEObject)param; @@ -130,6 +133,7 @@ public class NaryRelationLinkElementImpl extends MinimalEObjectImpl.Container im * * @generated */ + @Override public void setParam(DefinedElement newParam) { DefinedElement oldParam = param; param = newParam; @@ -215,7 +219,7 @@ public class NaryRelationLinkElementImpl extends MinimalEObjectImpl.Container im public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (index: "); result.append(index); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkImpl.java index f387ee06..9f7628cf 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/NaryRelationLinkImpl.java @@ -66,6 +66,7 @@ public class NaryRelationLinkImpl extends RelationLinkImpl implements NaryRelati * * @generated */ + @Override public EList getElements() { if (elements == null) { elements = new EObjectContainmentEList(NaryRelationLinkElement.class, this, PartialinterpretationPackage.NARY_RELATION_LINK__ELEMENTS); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialComplexTypeInterpretationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialComplexTypeInterpretationImpl.java index 07ee282d..c00b4278 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialComplexTypeInterpretationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialComplexTypeInterpretationImpl.java @@ -79,6 +79,7 @@ public class PartialComplexTypeInterpretationImpl extends PartialTypeInterpratat * * @generated */ + @Override public EList getSupertypeInterpretation() { if (supertypeInterpretation == null) { supertypeInterpretation = new EObjectResolvingEList(PartialComplexTypeInterpretation.class, this, PartialinterpretationPackage.PARTIAL_COMPLEX_TYPE_INTERPRETATION__SUPERTYPE_INTERPRETATION); @@ -91,6 +92,7 @@ public class PartialComplexTypeInterpretationImpl extends PartialTypeInterpratat * * @generated */ + @Override public TypeDeclaration getInterpretationOf() { if (interpretationOf != null && interpretationOf.eIsProxy()) { InternalEObject oldInterpretationOf = (InternalEObject)interpretationOf; @@ -117,6 +119,7 @@ public class PartialComplexTypeInterpretationImpl extends PartialTypeInterpratat * * @generated */ + @Override public void setInterpretationOf(TypeDeclaration newInterpretationOf) { TypeDeclaration oldInterpretationOf = interpretationOf; interpretationOf = newInterpretationOf; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialConstantInterpretationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialConstantInterpretationImpl.java index 81b2ce8d..6d51f0db 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialConstantInterpretationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialConstantInterpretationImpl.java @@ -63,6 +63,7 @@ public class PartialConstantInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public ConstantDeclaration getInterpretationOf() { if (interpretationOf != null && interpretationOf.eIsProxy()) { InternalEObject oldInterpretationOf = (InternalEObject)interpretationOf; @@ -89,6 +90,7 @@ public class PartialConstantInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public void setInterpretationOf(ConstantDeclaration newInterpretationOf) { ConstantDeclaration oldInterpretationOf = interpretationOf; interpretationOf = newInterpretationOf; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialFunctionInterpretationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialFunctionInterpretationImpl.java index 2d361e8e..855c4abc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialFunctionInterpretationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialFunctionInterpretationImpl.java @@ -63,6 +63,7 @@ public class PartialFunctionInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public FunctionDeclaration getInterpretationOf() { if (interpretationOf != null && interpretationOf.eIsProxy()) { InternalEObject oldInterpretationOf = (InternalEObject)interpretationOf; @@ -89,6 +90,7 @@ public class PartialFunctionInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public void setInterpretationOf(FunctionDeclaration newInterpretationOf) { FunctionDeclaration oldInterpretationOf = interpretationOf; interpretationOf = newInterpretationOf; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialInterpretationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialInterpretationImpl.java index bce3e2e0..9afdd8d2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialInterpretationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialInterpretationImpl.java @@ -47,6 +47,7 @@ import org.eclipse.emf.ecore.util.InternalEList; *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialInterpretationImpl#getScopes Scopes}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialInterpretationImpl#getMinNewElements Min New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialInterpretationImpl#getMaxNewElements Max New Elements}
  • + *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialInterpretationImpl#getMinNewElementsHeuristic Min New Elements Heuristic}
  • * * * @generated @@ -182,6 +183,26 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl */ protected int maxNewElements = MAX_NEW_ELEMENTS_EDEFAULT; + /** + * The default value of the '{@link #getMinNewElementsHeuristic() Min New Elements Heuristic}' attribute. + * + * + * @see #getMinNewElementsHeuristic() + * @generated + * @ordered + */ + protected static final int MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT = 0; + + /** + * The cached value of the '{@link #getMinNewElementsHeuristic() Min New Elements Heuristic}' attribute. + * + * + * @see #getMinNewElementsHeuristic() + * @generated + * @ordered + */ + protected int minNewElementsHeuristic = MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT; + /** * * @@ -206,6 +227,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public LogicProblem getProblem() { if (problem != null && problem.eIsProxy()) { InternalEObject oldProblem = (InternalEObject)problem; @@ -232,6 +254,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public void setProblem(LogicProblem newProblem) { LogicProblem oldProblem = problem; problem = newProblem; @@ -244,6 +267,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getPartialconstantinterpretation() { if (partialconstantinterpretation == null) { partialconstantinterpretation = new EObjectContainmentEList(PartialConstantInterpretation.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__PARTIALCONSTANTINTERPRETATION); @@ -256,6 +280,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getPartialrelationinterpretation() { if (partialrelationinterpretation == null) { partialrelationinterpretation = new EObjectContainmentEList(PartialRelationInterpretation.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__PARTIALRELATIONINTERPRETATION); @@ -268,6 +293,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getPartialfunctioninterpretation() { if (partialfunctioninterpretation == null) { partialfunctioninterpretation = new EObjectContainmentEList(PartialFunctionInterpretation.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__PARTIALFUNCTIONINTERPRETATION); @@ -280,6 +306,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getNewElements() { if (newElements == null) { newElements = new EObjectContainmentEList(DefinedElement.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__NEW_ELEMENTS); @@ -292,6 +319,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getPartialtypeinterpratation() { if (partialtypeinterpratation == null) { partialtypeinterpratation = new EObjectContainmentEList(PartialTypeInterpratation.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__PARTIALTYPEINTERPRATATION); @@ -304,6 +332,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getOpenWorldElements() { if (openWorldElements == null) { openWorldElements = new EObjectContainmentEList(DefinedElement.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__OPEN_WORLD_ELEMENTS); @@ -316,6 +345,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public LogicProblem getProblemConainer() { return problemConainer; } @@ -340,6 +370,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public void setProblemConainer(LogicProblem newProblemConainer) { if (newProblemConainer != problemConainer) { NotificationChain msgs = null; @@ -359,6 +390,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public EList getScopes() { if (scopes == null) { scopes = new EObjectContainmentEList(Scope.class, this, PartialinterpretationPackage.PARTIAL_INTERPRETATION__SCOPES); @@ -371,6 +403,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public int getMinNewElements() { return minNewElements; } @@ -380,6 +413,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public void setMinNewElements(int newMinNewElements) { int oldMinNewElements = minNewElements; minNewElements = newMinNewElements; @@ -392,6 +426,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public int getMaxNewElements() { return maxNewElements; } @@ -401,6 +436,7 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl * * @generated */ + @Override public void setMaxNewElements(int newMaxNewElements) { int oldMaxNewElements = maxNewElements; maxNewElements = newMaxNewElements; @@ -408,6 +444,29 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl eNotify(new ENotificationImpl(this, Notification.SET, PartialinterpretationPackage.PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS, oldMaxNewElements, maxNewElements)); } + /** + * + * + * @generated + */ + @Override + public int getMinNewElementsHeuristic() { + return minNewElementsHeuristic; + } + + /** + * + * + * @generated + */ + @Override + public void setMinNewElementsHeuristic(int newMinNewElementsHeuristic) { + int oldMinNewElementsHeuristic = minNewElementsHeuristic; + minNewElementsHeuristic = newMinNewElementsHeuristic; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, PartialinterpretationPackage.PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC, oldMinNewElementsHeuristic, minNewElementsHeuristic)); + } + /** * * @@ -467,6 +526,8 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl return getMinNewElements(); case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS: return getMaxNewElements(); + case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC: + return getMinNewElementsHeuristic(); } return super.eGet(featureID, resolve, coreType); } @@ -520,6 +581,9 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS: setMaxNewElements((Integer)newValue); return; + case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC: + setMinNewElementsHeuristic((Integer)newValue); + return; } super.eSet(featureID, newValue); } @@ -565,6 +629,9 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS: setMaxNewElements(MAX_NEW_ELEMENTS_EDEFAULT); return; + case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC: + setMinNewElementsHeuristic(MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT); + return; } super.eUnset(featureID); } @@ -599,6 +666,8 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl return minNewElements != MIN_NEW_ELEMENTS_EDEFAULT; case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS: return maxNewElements != MAX_NEW_ELEMENTS_EDEFAULT; + case PartialinterpretationPackage.PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC: + return minNewElementsHeuristic != MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT; } return super.eIsSet(featureID); } @@ -612,11 +681,13 @@ public class PartialInterpretationImpl extends MinimalEObjectImpl.Container impl public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (minNewElements: "); result.append(minNewElements); result.append(", maxNewElements: "); result.append(maxNewElements); + result.append(", minNewElementsHeuristic: "); + result.append(minNewElementsHeuristic); result.append(')'); return result.toString(); } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialRelationInterpretationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialRelationInterpretationImpl.java index 71aef9af..7ad06504 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialRelationInterpretationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialRelationInterpretationImpl.java @@ -106,6 +106,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public RelationDeclaration getInterpretationOf() { if (interpretationOf != null && interpretationOf.eIsProxy()) { InternalEObject oldInterpretationOf = (InternalEObject)interpretationOf; @@ -132,6 +133,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public void setInterpretationOf(RelationDeclaration newInterpretationOf) { RelationDeclaration oldInterpretationOf = interpretationOf; interpretationOf = newInterpretationOf; @@ -144,6 +146,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public EList getRelationlinks() { if (relationlinks == null) { relationlinks = new EObjectContainmentEList(RelationLink.class, this, PartialinterpretationPackage.PARTIAL_RELATION_INTERPRETATION__RELATIONLINKS); @@ -156,6 +159,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public TypeReference getParam1() { if (param1 != null && param1.eIsProxy()) { InternalEObject oldParam1 = (InternalEObject)param1; @@ -182,6 +186,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public void setParam1(TypeReference newParam1) { TypeReference oldParam1 = param1; param1 = newParam1; @@ -194,6 +199,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public TypeReference getParam2() { if (param2 != null && param2.eIsProxy()) { InternalEObject oldParam2 = (InternalEObject)param2; @@ -220,6 +226,7 @@ public class PartialRelationInterpretationImpl extends MinimalEObjectImpl.Contai * * @generated */ + @Override public void setParam2(TypeReference newParam2) { TypeReference oldParam2 = param2; param2 = newParam2; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialTypeInterpratationImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialTypeInterpratationImpl.java index da9b1472..51eabd2c 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialTypeInterpratationImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialTypeInterpratationImpl.java @@ -76,6 +76,7 @@ public abstract class PartialTypeInterpratationImpl extends MinimalEObjectImpl.C * * @generated */ + @Override public EList getElements() { if (elements == null) { elements = new EObjectResolvingEList(DefinedElement.class, this, PartialinterpretationPackage.PARTIAL_TYPE_INTERPRATATION__ELEMENTS); @@ -88,6 +89,7 @@ public abstract class PartialTypeInterpratationImpl extends MinimalEObjectImpl.C * * @generated */ + @Override public EList getScopes() { if (scopes == null) { scopes = new EObjectWithInverseResolvingEList(Scope.class, this, PartialinterpretationPackage.PARTIAL_TYPE_INTERPRATATION__SCOPES, PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationFactoryImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationFactoryImpl.java index af1db8a1..06ca4e37 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationFactoryImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationFactoryImpl.java @@ -84,6 +84,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialInterpretation createPartialInterpretation() { PartialInterpretationImpl partialInterpretation = new PartialInterpretationImpl(); return partialInterpretation; @@ -94,6 +95,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialConstantInterpretation createPartialConstantInterpretation() { PartialConstantInterpretationImpl partialConstantInterpretation = new PartialConstantInterpretationImpl(); return partialConstantInterpretation; @@ -104,6 +106,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialRelationInterpretation createPartialRelationInterpretation() { PartialRelationInterpretationImpl partialRelationInterpretation = new PartialRelationInterpretationImpl(); return partialRelationInterpretation; @@ -114,6 +117,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialFunctionInterpretation createPartialFunctionInterpretation() { PartialFunctionInterpretationImpl partialFunctionInterpretation = new PartialFunctionInterpretationImpl(); return partialFunctionInterpretation; @@ -124,6 +128,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public UnaryElementRelationLink createUnaryElementRelationLink() { UnaryElementRelationLinkImpl unaryElementRelationLink = new UnaryElementRelationLinkImpl(); return unaryElementRelationLink; @@ -134,6 +139,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public BinaryElementRelationLink createBinaryElementRelationLink() { BinaryElementRelationLinkImpl binaryElementRelationLink = new BinaryElementRelationLinkImpl(); return binaryElementRelationLink; @@ -144,6 +150,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public NaryRelationLink createNaryRelationLink() { NaryRelationLinkImpl naryRelationLink = new NaryRelationLinkImpl(); return naryRelationLink; @@ -154,6 +161,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public NaryRelationLinkElement createNaryRelationLinkElement() { NaryRelationLinkElementImpl naryRelationLinkElement = new NaryRelationLinkElementImpl(); return naryRelationLinkElement; @@ -164,6 +172,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public BooleanElement createBooleanElement() { BooleanElementImpl booleanElement = new BooleanElementImpl(); return booleanElement; @@ -174,6 +183,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public IntegerElement createIntegerElement() { IntegerElementImpl integerElement = new IntegerElementImpl(); return integerElement; @@ -184,6 +194,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public RealElement createRealElement() { RealElementImpl realElement = new RealElementImpl(); return realElement; @@ -194,6 +205,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public StringElement createStringElement() { StringElementImpl stringElement = new StringElementImpl(); return stringElement; @@ -204,6 +216,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public Scope createScope() { ScopeImpl scope = new ScopeImpl(); return scope; @@ -214,6 +227,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialBooleanInterpretation createPartialBooleanInterpretation() { PartialBooleanInterpretationImpl partialBooleanInterpretation = new PartialBooleanInterpretationImpl(); return partialBooleanInterpretation; @@ -224,6 +238,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialIntegerInterpretation createPartialIntegerInterpretation() { PartialIntegerInterpretationImpl partialIntegerInterpretation = new PartialIntegerInterpretationImpl(); return partialIntegerInterpretation; @@ -234,6 +249,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialRealInterpretation createPartialRealInterpretation() { PartialRealInterpretationImpl partialRealInterpretation = new PartialRealInterpretationImpl(); return partialRealInterpretation; @@ -244,6 +260,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialStringInterpretation createPartialStringInterpretation() { PartialStringInterpretationImpl partialStringInterpretation = new PartialStringInterpretationImpl(); return partialStringInterpretation; @@ -254,6 +271,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialComplexTypeInterpretation createPartialComplexTypeInterpretation() { PartialComplexTypeInterpretationImpl partialComplexTypeInterpretation = new PartialComplexTypeInterpretationImpl(); return partialComplexTypeInterpretation; @@ -264,6 +282,7 @@ public class PartialinterpretationFactoryImpl extends EFactoryImpl implements Pa * * @generated */ + @Override public PartialinterpretationPackage getPartialinterpretationPackage() { return (PartialinterpretationPackage)getEPackage(); } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationPackageImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationPackageImpl.java index a21dc306..1ea3a11d 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationPackageImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PartialinterpretationPackageImpl.java @@ -227,7 +227,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa /** * Creates, registers, and initializes the Package for this model, and for any others upon which it depends. - * + * *

    This method is used to initialize {@link PartialinterpretationPackage#eINSTANCE} when that field is accessed. * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package. * @@ -241,7 +241,8 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa if (isInited) return (PartialinterpretationPackage)EPackage.Registry.INSTANCE.getEPackage(PartialinterpretationPackage.eNS_URI); // Obtain or create and register package - PartialinterpretationPackageImpl thePartialinterpretationPackage = (PartialinterpretationPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof PartialinterpretationPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new PartialinterpretationPackageImpl()); + Object registeredPartialinterpretationPackage = EPackage.Registry.INSTANCE.get(eNS_URI); + PartialinterpretationPackageImpl thePartialinterpretationPackage = registeredPartialinterpretationPackage instanceof PartialinterpretationPackageImpl ? (PartialinterpretationPackageImpl)registeredPartialinterpretationPackage : new PartialinterpretationPackageImpl(); isInited = true; @@ -258,7 +259,6 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa // Mark meta-data to indicate it can't be changed thePartialinterpretationPackage.freeze(); - // Update the registry and return the package EPackage.Registry.INSTANCE.put(PartialinterpretationPackage.eNS_URI, thePartialinterpretationPackage); return thePartialinterpretationPackage; @@ -269,6 +269,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialInterpretation() { return partialInterpretationEClass; } @@ -278,6 +279,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Problem() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(0); } @@ -287,6 +289,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Partialconstantinterpretation() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(1); } @@ -296,6 +299,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Partialrelationinterpretation() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(2); } @@ -305,6 +309,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Partialfunctioninterpretation() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(3); } @@ -314,6 +319,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_NewElements() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(4); } @@ -323,6 +329,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Partialtypeinterpratation() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(5); } @@ -332,6 +339,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_OpenWorldElements() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(6); } @@ -341,6 +349,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_ProblemConainer() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(7); } @@ -350,6 +359,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialInterpretation_Scopes() { return (EReference)partialInterpretationEClass.getEStructuralFeatures().get(8); } @@ -359,6 +369,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getPartialInterpretation_MinNewElements() { return (EAttribute)partialInterpretationEClass.getEStructuralFeatures().get(9); } @@ -368,6 +379,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getPartialInterpretation_MaxNewElements() { return (EAttribute)partialInterpretationEClass.getEStructuralFeatures().get(10); } @@ -377,6 +389,17 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override + public EAttribute getPartialInterpretation_MinNewElementsHeuristic() { + return (EAttribute)partialInterpretationEClass.getEStructuralFeatures().get(11); + } + + /** + * + * + * @generated + */ + @Override public EClass getPartialConstantInterpretation() { return partialConstantInterpretationEClass; } @@ -386,6 +409,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialConstantInterpretation_InterpretationOf() { return (EReference)partialConstantInterpretationEClass.getEStructuralFeatures().get(0); } @@ -395,6 +419,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialRelationInterpretation() { return partialRelationInterpretationEClass; } @@ -404,6 +429,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialRelationInterpretation_InterpretationOf() { return (EReference)partialRelationInterpretationEClass.getEStructuralFeatures().get(0); } @@ -413,6 +439,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialRelationInterpretation_Relationlinks() { return (EReference)partialRelationInterpretationEClass.getEStructuralFeatures().get(1); } @@ -422,6 +449,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialRelationInterpretation_Param1() { return (EReference)partialRelationInterpretationEClass.getEStructuralFeatures().get(2); } @@ -431,6 +459,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialRelationInterpretation_Param2() { return (EReference)partialRelationInterpretationEClass.getEStructuralFeatures().get(3); } @@ -440,6 +469,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialFunctionInterpretation() { return partialFunctionInterpretationEClass; } @@ -449,6 +479,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialFunctionInterpretation_InterpretationOf() { return (EReference)partialFunctionInterpretationEClass.getEStructuralFeatures().get(0); } @@ -458,6 +489,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialTypeInterpratation() { return partialTypeInterpratationEClass; } @@ -467,6 +499,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialTypeInterpratation_Elements() { return (EReference)partialTypeInterpratationEClass.getEStructuralFeatures().get(0); } @@ -476,6 +509,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialTypeInterpratation_Scopes() { return (EReference)partialTypeInterpratationEClass.getEStructuralFeatures().get(1); } @@ -485,6 +519,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getRelationLink() { return relationLinkEClass; } @@ -494,6 +529,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getUnaryElementRelationLink() { return unaryElementRelationLinkEClass; } @@ -503,6 +539,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getUnaryElementRelationLink_Param1() { return (EReference)unaryElementRelationLinkEClass.getEStructuralFeatures().get(0); } @@ -512,6 +549,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getBinaryElementRelationLink() { return binaryElementRelationLinkEClass; } @@ -521,6 +559,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getBinaryElementRelationLink_Param1() { return (EReference)binaryElementRelationLinkEClass.getEStructuralFeatures().get(0); } @@ -530,6 +569,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getBinaryElementRelationLink_Param2() { return (EReference)binaryElementRelationLinkEClass.getEStructuralFeatures().get(1); } @@ -539,6 +579,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getNaryRelationLink() { return naryRelationLinkEClass; } @@ -548,6 +589,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getNaryRelationLink_Elements() { return (EReference)naryRelationLinkEClass.getEStructuralFeatures().get(0); } @@ -557,6 +599,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getNaryRelationLinkElement() { return naryRelationLinkElementEClass; } @@ -566,6 +609,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getNaryRelationLinkElement_Index() { return (EAttribute)naryRelationLinkElementEClass.getEStructuralFeatures().get(0); } @@ -575,6 +619,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getNaryRelationLinkElement_Param() { return (EReference)naryRelationLinkElementEClass.getEStructuralFeatures().get(1); } @@ -584,6 +629,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPrimitiveElement() { return primitiveElementEClass; } @@ -593,6 +639,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getPrimitiveElement_ValueSet() { return (EAttribute)primitiveElementEClass.getEStructuralFeatures().get(0); } @@ -602,6 +649,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getBooleanElement() { return booleanElementEClass; } @@ -611,6 +659,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getBooleanElement_Value() { return (EAttribute)booleanElementEClass.getEStructuralFeatures().get(0); } @@ -620,6 +669,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getIntegerElement() { return integerElementEClass; } @@ -629,6 +679,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getIntegerElement_Value() { return (EAttribute)integerElementEClass.getEStructuralFeatures().get(0); } @@ -638,6 +689,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getRealElement() { return realElementEClass; } @@ -647,6 +699,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getRealElement_Value() { return (EAttribute)realElementEClass.getEStructuralFeatures().get(0); } @@ -656,6 +709,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getStringElement() { return stringElementEClass; } @@ -665,6 +719,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getStringElement_Value() { return (EAttribute)stringElementEClass.getEStructuralFeatures().get(0); } @@ -674,6 +729,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getScope() { return scopeEClass; } @@ -683,6 +739,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getScope_MinNewElements() { return (EAttribute)scopeEClass.getEStructuralFeatures().get(0); } @@ -692,6 +749,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EAttribute getScope_MaxNewElements() { return (EAttribute)scopeEClass.getEStructuralFeatures().get(1); } @@ -701,6 +759,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getScope_TargetTypeInterpretation() { return (EReference)scopeEClass.getEStructuralFeatures().get(2); } @@ -710,6 +769,17 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override + public EAttribute getScope_MinNewElementsHeuristic() { + return (EAttribute)scopeEClass.getEStructuralFeatures().get(3); + } + + /** + * + * + * @generated + */ + @Override public EClass getPartialPrimitiveInterpretation() { return partialPrimitiveInterpretationEClass; } @@ -719,6 +789,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialBooleanInterpretation() { return partialBooleanInterpretationEClass; } @@ -728,6 +799,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialIntegerInterpretation() { return partialIntegerInterpretationEClass; } @@ -737,6 +809,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialRealInterpretation() { return partialRealInterpretationEClass; } @@ -746,6 +819,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialStringInterpretation() { return partialStringInterpretationEClass; } @@ -755,6 +829,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EClass getPartialComplexTypeInterpretation() { return partialComplexTypeInterpretationEClass; } @@ -764,6 +839,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialComplexTypeInterpretation_SupertypeInterpretation() { return (EReference)partialComplexTypeInterpretationEClass.getEStructuralFeatures().get(0); } @@ -773,6 +849,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public EReference getPartialComplexTypeInterpretation_InterpretationOf() { return (EReference)partialComplexTypeInterpretationEClass.getEStructuralFeatures().get(1); } @@ -782,6 +859,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa * * @generated */ + @Override public PartialinterpretationFactory getPartialinterpretationFactory() { return (PartialinterpretationFactory)getEFactoryInstance(); } @@ -817,6 +895,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa createEReference(partialInterpretationEClass, PARTIAL_INTERPRETATION__SCOPES); createEAttribute(partialInterpretationEClass, PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS); createEAttribute(partialInterpretationEClass, PARTIAL_INTERPRETATION__MAX_NEW_ELEMENTS); + createEAttribute(partialInterpretationEClass, PARTIAL_INTERPRETATION__MIN_NEW_ELEMENTS_HEURISTIC); partialConstantInterpretationEClass = createEClass(PARTIAL_CONSTANT_INTERPRETATION); createEReference(partialConstantInterpretationEClass, PARTIAL_CONSTANT_INTERPRETATION__INTERPRETATION_OF); @@ -869,6 +948,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa createEAttribute(scopeEClass, SCOPE__MIN_NEW_ELEMENTS); createEAttribute(scopeEClass, SCOPE__MAX_NEW_ELEMENTS); createEReference(scopeEClass, SCOPE__TARGET_TYPE_INTERPRETATION); + createEAttribute(scopeEClass, SCOPE__MIN_NEW_ELEMENTS_HEURISTIC); partialPrimitiveInterpretationEClass = createEClass(PARTIAL_PRIMITIVE_INTERPRETATION); @@ -945,6 +1025,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa initEReference(getPartialInterpretation_Scopes(), this.getScope(), null, "scopes", null, 0, -1, PartialInterpretation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEAttribute(getPartialInterpretation_MinNewElements(), ecorePackage.getEInt(), "minNewElements", "0", 1, 1, PartialInterpretation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEAttribute(getPartialInterpretation_MaxNewElements(), ecorePackage.getEInt(), "maxNewElements", "-1", 1, 1, PartialInterpretation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEAttribute(getPartialInterpretation_MinNewElementsHeuristic(), ecorePackage.getEInt(), "minNewElementsHeuristic", "0", 1, 1, PartialInterpretation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(partialConstantInterpretationEClass, PartialConstantInterpretation.class, "PartialConstantInterpretation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); initEReference(getPartialConstantInterpretation_InterpretationOf(), theLogiclanguagePackage.getConstantDeclaration(), null, "interpretationOf", null, 1, 1, PartialConstantInterpretation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); @@ -997,6 +1078,7 @@ public class PartialinterpretationPackageImpl extends EPackageImpl implements Pa initEAttribute(getScope_MinNewElements(), ecorePackage.getEInt(), "minNewElements", "0", 1, 1, Scope.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEAttribute(getScope_MaxNewElements(), ecorePackage.getEInt(), "maxNewElements", "-1", 1, 1, Scope.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEReference(getScope_TargetTypeInterpretation(), this.getPartialTypeInterpratation(), this.getPartialTypeInterpratation_Scopes(), "targetTypeInterpretation", null, 1, 1, Scope.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEAttribute(getScope_MinNewElementsHeuristic(), ecorePackage.getEInt(), "minNewElementsHeuristic", "0", 1, 1, Scope.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(partialPrimitiveInterpretationEClass, PartialPrimitiveInterpretation.class, "PartialPrimitiveInterpretation", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PrimitiveElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PrimitiveElementImpl.java index 29a1e1be..a8ef81b0 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PrimitiveElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/PrimitiveElementImpl.java @@ -71,6 +71,7 @@ public abstract class PrimitiveElementImpl extends DefinedElementImpl implements * * @generated */ + @Override public boolean isValueSet() { return valueSet; } @@ -80,6 +81,7 @@ public abstract class PrimitiveElementImpl extends DefinedElementImpl implements * * @generated */ + @Override public void setValueSet(boolean newValueSet) { boolean oldValueSet = valueSet; valueSet = newValueSet; @@ -154,7 +156,7 @@ public abstract class PrimitiveElementImpl extends DefinedElementImpl implements public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (valueSet: "); result.append(valueSet); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/RealElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/RealElementImpl.java index 0361a3e9..67cff5a2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/RealElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/RealElementImpl.java @@ -71,6 +71,7 @@ public class RealElementImpl extends PrimitiveElementImpl implements RealElement * * @generated */ + @Override public BigDecimal getValue() { return value; } @@ -80,6 +81,7 @@ public class RealElementImpl extends PrimitiveElementImpl implements RealElement * * @generated */ + @Override public void setValue(BigDecimal newValue) { BigDecimal oldValue = value; value = newValue; @@ -154,7 +156,7 @@ public class RealElementImpl extends PrimitiveElementImpl implements RealElement public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (value: "); result.append(value); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/ScopeImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/ScopeImpl.java index d8ade871..a1b6de35 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/ScopeImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/ScopeImpl.java @@ -26,6 +26,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl; *

  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.ScopeImpl#getMinNewElements Min New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.ScopeImpl#getMaxNewElements Max New Elements}
  • *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.ScopeImpl#getTargetTypeInterpretation Target Type Interpretation}
  • + *
  • {@link hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.ScopeImpl#getMinNewElementsHeuristic Min New Elements Heuristic}
  • * * * @generated @@ -81,6 +82,26 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { */ protected PartialTypeInterpratation targetTypeInterpretation; + /** + * The default value of the '{@link #getMinNewElementsHeuristic() Min New Elements Heuristic}' attribute. + * + * + * @see #getMinNewElementsHeuristic() + * @generated + * @ordered + */ + protected static final int MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT = 0; + + /** + * The cached value of the '{@link #getMinNewElementsHeuristic() Min New Elements Heuristic}' attribute. + * + * + * @see #getMinNewElementsHeuristic() + * @generated + * @ordered + */ + protected int minNewElementsHeuristic = MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT; + /** * * @@ -105,6 +126,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public int getMinNewElements() { return minNewElements; } @@ -114,6 +136,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public void setMinNewElements(int newMinNewElements) { int oldMinNewElements = minNewElements; minNewElements = newMinNewElements; @@ -126,6 +149,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public int getMaxNewElements() { return maxNewElements; } @@ -135,6 +159,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public void setMaxNewElements(int newMaxNewElements) { int oldMaxNewElements = maxNewElements; maxNewElements = newMaxNewElements; @@ -147,6 +172,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public PartialTypeInterpratation getTargetTypeInterpretation() { if (targetTypeInterpretation != null && targetTypeInterpretation.eIsProxy()) { InternalEObject oldTargetTypeInterpretation = (InternalEObject)targetTypeInterpretation; @@ -188,6 +214,7 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { * * @generated */ + @Override public void setTargetTypeInterpretation(PartialTypeInterpratation newTargetTypeInterpretation) { if (newTargetTypeInterpretation != targetTypeInterpretation) { NotificationChain msgs = null; @@ -202,6 +229,29 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { eNotify(new ENotificationImpl(this, Notification.SET, PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION, newTargetTypeInterpretation, newTargetTypeInterpretation)); } + /** + * + * + * @generated + */ + @Override + public int getMinNewElementsHeuristic() { + return minNewElementsHeuristic; + } + + /** + * + * + * @generated + */ + @Override + public void setMinNewElementsHeuristic(int newMinNewElementsHeuristic) { + int oldMinNewElementsHeuristic = minNewElementsHeuristic; + minNewElementsHeuristic = newMinNewElementsHeuristic; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, PartialinterpretationPackage.SCOPE__MIN_NEW_ELEMENTS_HEURISTIC, oldMinNewElementsHeuristic, minNewElementsHeuristic)); + } + /** * * @@ -247,6 +297,8 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { case PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION: if (resolve) return getTargetTypeInterpretation(); return basicGetTargetTypeInterpretation(); + case PartialinterpretationPackage.SCOPE__MIN_NEW_ELEMENTS_HEURISTIC: + return getMinNewElementsHeuristic(); } return super.eGet(featureID, resolve, coreType); } @@ -268,6 +320,9 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { case PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION: setTargetTypeInterpretation((PartialTypeInterpratation)newValue); return; + case PartialinterpretationPackage.SCOPE__MIN_NEW_ELEMENTS_HEURISTIC: + setMinNewElementsHeuristic((Integer)newValue); + return; } super.eSet(featureID, newValue); } @@ -289,6 +344,9 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { case PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION: setTargetTypeInterpretation((PartialTypeInterpratation)null); return; + case PartialinterpretationPackage.SCOPE__MIN_NEW_ELEMENTS_HEURISTIC: + setMinNewElementsHeuristic(MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT); + return; } super.eUnset(featureID); } @@ -307,6 +365,8 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { return maxNewElements != MAX_NEW_ELEMENTS_EDEFAULT; case PartialinterpretationPackage.SCOPE__TARGET_TYPE_INTERPRETATION: return targetTypeInterpretation != null; + case PartialinterpretationPackage.SCOPE__MIN_NEW_ELEMENTS_HEURISTIC: + return minNewElementsHeuristic != MIN_NEW_ELEMENTS_HEURISTIC_EDEFAULT; } return super.eIsSet(featureID); } @@ -320,11 +380,13 @@ public class ScopeImpl extends MinimalEObjectImpl.Container implements Scope { public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (minNewElements: "); result.append(minNewElements); result.append(", maxNewElements: "); result.append(maxNewElements); + result.append(", minNewElementsHeuristic: "); + result.append(minNewElementsHeuristic); result.append(')'); return result.toString(); } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/StringElementImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/StringElementImpl.java index f207401d..0242c9b2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/StringElementImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/StringElementImpl.java @@ -69,6 +69,7 @@ public class StringElementImpl extends PrimitiveElementImpl implements StringEle * * @generated */ + @Override public String getValue() { return value; } @@ -78,6 +79,7 @@ public class StringElementImpl extends PrimitiveElementImpl implements StringEle * * @generated */ + @Override public void setValue(String newValue) { String oldValue = value; value = newValue; @@ -152,7 +154,7 @@ public class StringElementImpl extends PrimitiveElementImpl implements StringEle public String toString() { if (eIsProxy()) return super.toString(); - StringBuffer result = new StringBuffer(super.toString()); + StringBuilder result = new StringBuilder(super.toString()); result.append(" (value: "); result.append(value); result.append(')'); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/UnaryElementRelationLinkImpl.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/UnaryElementRelationLinkImpl.java index 2cb56323..e76a89b7 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/UnaryElementRelationLinkImpl.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/ecore-gen/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/partialinterpretation/impl/UnaryElementRelationLinkImpl.java @@ -62,6 +62,7 @@ public class UnaryElementRelationLinkImpl extends RelationLinkImpl implements Un * * @generated */ + @Override public DefinedElement getParam1() { if (param1 != null && param1.eIsProxy()) { InternalEObject oldParam1 = (InternalEObject)param1; @@ -88,6 +89,7 @@ public class UnaryElementRelationLinkImpl extends RelationLinkImpl implements Un * * @generated */ + @Override public void setParam1(DefinedElement newParam1) { DefinedElement oldParam1 = param1; param1 = newParam1; diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.ecore b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.ecore index acf82a3f..47d54258 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.ecore +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.ecore @@ -27,6 +27,9 @@ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt" defaultValueLiteral="0"/> + + diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.genmodel b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.genmodel index 2ac0a4f3..daeaf594 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.genmodel +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/model/PartialInterpretation.genmodel @@ -18,7 +18,10 @@ - + + + + @@ -33,9 +36,8 @@ - - + @@ -50,6 +52,7 @@ + @@ -70,11 +73,16 @@ + + + + + diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend index c7c1ad77..e4bdb086 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend @@ -60,6 +60,10 @@ import org.eclipse.xtend2.lib.StringConcatenationClient return this.dataHash.hashCode } + override equals(Object other) { + other.class == LocalNodeDescriptor && (other as AbstractNodeDescriptor).hashCode == hashCode + } + override protected prettyPrint() { '''(«dataHash»)[«IF id !== null»id = "«id»"«IF types === null || !types.empty», «ENDIF»«ENDIF»«IF types === null»TYPES = null«ELSE»«FOR type : types SEPARATOR ", "»«type»«ENDFOR»«ENDIF»]''' } @@ -143,6 +147,10 @@ import org.eclipse.xtend2.lib.StringConcatenationClient return this.dataHash.hashCode } + override equals(Object other) { + other.class == FurtherNodeDescriptor && (other as AbstractNodeDescriptor).hashCode == hashCode + } + override prettyPrint() { ''' («dataHash»)[ diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/NeighbourhoodOptions.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/NeighbourhoodOptions.xtend index efc89803..c6e03f75 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/NeighbourhoodOptions.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/NeighbourhoodOptions.xtend @@ -7,12 +7,12 @@ import org.eclipse.xtend.lib.annotations.Data @Data class NeighbourhoodOptions { - public static val FixPointRage = -1 + public static val FixPointRange = -1 public static val GraphWidthRange = -2 public static val FullParallels = Integer.MAX_VALUE public static val MaxNumbers = Integer.MAX_VALUE - public static val DEFAULT = new NeighbourhoodOptions(GraphWidthRange, FullParallels, MaxNumbers, null, null) + public static val DEFAULT = new NeighbourhoodOptions(FixPointRange, FullParallels, MaxNumbers, null, null) val int range val int parallels diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend index d474877d..ddf7d712 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend @@ -5,7 +5,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement class PartialInterpretation2Hash extends PartialInterpretation2NeighbourhoodRepresentation{ - protected new() { + new() { super(false, true) } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend index a0382e8e..3048167e 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend @@ -25,7 +25,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation nodeRepresentations = null - var Map modelRepresentation = null +class NeighbourhoodBasedHashStateCoderFactory extends AbstractNeighbourhoodBasedStateCoderFactory { + new() { + } new(NeighbourhoodOptions options) { super(options) } + override protected doCreateStateCoder(NeighbourhoodOptions options) { + new NeighbourhoodBasedPartialInterpretationStateCoder(new PartialInterpretation2Hash, options) + } +} + +class NeighbourhoodBasedPartialInterpretationStateCoder extends AbstractNeighbourhoodBasedPartialInterpretationStateCoder { + val PartialInterpretation2NeighbourhoodRepresentation calculator + var Map nodeRepresentations = null + var ModelRep modelRepresentation = null + + new(PartialInterpretation2NeighbourhoodRepresentation calculator, NeighbourhoodOptions options) { + super(options) + this.calculator = calculator + } + override protected isRefreshNeeded() { nodeRepresentations === null || modelRepresentation === null } 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 1abde0a8..aa02cd30 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 @@ -12,12 +12,15 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicresultFactory import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethodProvider +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.PartialInterpretationInitialiser import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.AbstractNeighbourhoodBasedStateCoderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.IdentifierBasedStateCoderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.NeighbourhoodBasedHashStateCoderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.PairwiseNeighbourhoodBasedStateCoderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.BasicScopeGlobalConstraint import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.BestFirstStrategyForModelGeneration import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.DiversityChecker import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.InconsistentScopeGlobalConstraint @@ -39,7 +42,6 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.NeighbourhoodBasedStateCoderFactory class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() @@ -71,6 +73,11 @@ class ViatraReasoner extends LogicReasoner { workspace.writeModel(emptySolution, "init.partialmodel") } emptySolution.problemConainer = problem + var BasicScopeGlobalConstraint basicScopeGlobalConstraint = null + if (viatraConfig.scopePropagatorStrategy == ScopePropagatorStrategy.None) { + basicScopeGlobalConstraint = new BasicScopeGlobalConstraint(emptySolution) + emptySolution.scopes.clear + } val method = modelGenerationMethodProvider.createModelGenerationMethod( problem, @@ -79,11 +86,12 @@ class ViatraReasoner extends LogicReasoner { viatraConfig.nameNewElements, viatraConfig.typeInferenceMethod, viatraConfig.scopePropagatorStrategy, + viatraConfig.hints, viatraConfig.documentationLevel ) dse.addObjective(new ModelGenerationCompositeObjective( - new ScopeObjective, + basicScopeGlobalConstraint ?: new ScopeObjective, method.unfinishedMultiplicities.map[new UnfinishedMultiplicityObjective(it)], wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF) )) @@ -132,6 +140,9 @@ class ViatraReasoner extends LogicReasoner { dse.addGlobalConstraint(wf2ObjectiveConverter.createInvalidationGlobalConstraint(method.invalidWF)) dse.addGlobalConstraint(new SurelyViolatedObjectiveGlobalConstraint(solutionSaver)) dse.addGlobalConstraint(new InconsistentScopeGlobalConstraint) + if (basicScopeGlobalConstraint !== null) { + dse.addGlobalConstraint(basicScopeGlobalConstraint) + } for (additionalConstraint : viatraConfig.searchSpaceConstraints.additionalGlobalConstraints) { dse.addGlobalConstraint(additionalConstraint.apply(method)) } @@ -140,7 +151,7 @@ class ViatraReasoner extends LogicReasoner { val IStateCoderFactory statecoder = switch (viatraConfig.stateCoderStrategy) { case Neighbourhood: - new NeighbourhoodBasedStateCoderFactory + new NeighbourhoodBasedHashStateCoderFactory case PairwiseNeighbourhood: new PairwiseNeighbourhoodBasedStateCoderFactory default: @@ -215,10 +226,18 @@ class ViatraReasoner extends LogicReasoner { it.name = "Decisions" it.value = method.statistics.decisionsTried ] + it.entries += createIntStatisticEntry => [ + it.name = "Transformations" + it.value = method.statistics.transformationInvocations + ] it.entries += createIntStatisticEntry => [ it.name = "ScopePropagations" it.value = method.statistics.scopePropagatorInvocations ] + it.entries += createIntStatisticEntry => [ + it.name = "ScopePropagationsSolverCalls" + it.value = method.statistics.scopePropagatorSolverInvocations + ] if (diversityChecker.isActive) { it.entries += createIntStatisticEntry => [ it.name = "SolutionDiversityCheckTime" 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 a5f42a5f..6f38d261 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 @@ -16,6 +16,7 @@ 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, @@ -56,6 +57,8 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) + + public var List hints = newArrayList public var List costObjectives = newArrayList } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BasicScopeGlobalConstraint.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BasicScopeGlobalConstraint.xtend new file mode 100644 index 00000000..67f447ed --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BasicScopeGlobalConstraint.xtend @@ -0,0 +1,103 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import com.google.common.collect.ImmutableList +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation +import java.util.Comparator +import java.util.List +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.Comparators +import org.eclipse.viatra.dse.objectives.IGlobalConstraint +import org.eclipse.viatra.dse.objectives.IObjective +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +class BasicScopeGlobalConstraint implements IGlobalConstraint, IObjective { + val PartialInterpretation p + val List assertions + + new(PartialInterpretation p) { + this.p = p + assertions = ImmutableList.copyOf(p.scopes.map [ + val currentSize = targetTypeInterpretation.elements.size + val minElements = minNewElements + currentSize + val maxElements = if (maxNewElements < 0) { + -1 + } else { + maxNewElements + currentSize + } + new ScopeAssertion(minElements, maxElements, targetTypeInterpretation) + ]) + } + + override init(ThreadContext context) { + if (context.model != p) { + throw new IllegalArgumentException( + "Partial model must be passed to the constructor of BasicScopeGlobalConstraint") + } + } + + override checkGlobalConstraint(ThreadContext context) { + assertions.forall[upperBoundSatisfied] + } + + override getFitness(ThreadContext context) { + var double fitness = p.minNewElements + for (assertion : assertions) { + if (!assertion.lowerBoundSatisfied) { + fitness += 1 + } + } + fitness + } + + override satisifiesHardObjective(Double fitness) { + fitness <= 0.01 + } + + override BasicScopeGlobalConstraint createNew() { + this + } + + override getName() { + class.name + } + + override getComparator() { + Comparators.LOWER_IS_BETTER + } + + override getLevel() { + 2 + } + + override isHardObjective() { + true + } + + override setComparator(Comparator comparator) { + throw new UnsupportedOperationException + } + + override setLevel(int level) { + throw new UnsupportedOperationException + } + + @FinalFieldsConstructor + private static class ScopeAssertion { + val int lowerBound + val int upperBound + val PartialTypeInterpratation typeDefinitions + + private def getCount() { + typeDefinitions.elements.size + } + + private def isLowerBoundSatisfied() { + count >= lowerBound + } + + private def isUpperBoundSatisfied() { + upperBound < 0 || count <= upperBound + } + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index 5af7fc69..081e48fa 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -255,7 +255,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { activationIds = new ArrayList(context.getUntraversedActivationIds()); Collections.shuffle(activationIds); } catch (NullPointerException e) { - logger.warn("Unexpected state code: " + context.getDesignSpaceManager().getCurrentState()); +// logger.warn("Unexpected state code: " + context.getDesignSpaceManager().getCurrentState()); numberOfStatecoderFail++; activationIds = Collections.emptyList(); } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend index 9a33753c..2976bebe 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend @@ -59,7 +59,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { } sum += multiplicity sum += unfinishedWFsFitness // *0.5 - // println('''Sum=«sum»|Scope=«scopeFitnes»|Multiplicity=«multiplicity»|WFs=«unfinishedWFsFitness»''') +// println('''Sum=«sum»|Scope=«scopeFitnes»|Multiplicity=«multiplicity»|WFs=«unfinishedWFsFitness»''') return sum } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend index 69efe0d7..e7967b00 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend @@ -23,9 +23,9 @@ class ScopeObjective implements IObjective{ override getFitness(ThreadContext context) { val interpretation = context.model as PartialInterpretation - var res = interpretation.minNewElements.doubleValue + var res = interpretation.minNewElementsHeuristic.doubleValue for(scope : interpretation.scopes) { - res += scope.minNewElements*2 + res += scope.minNewElementsHeuristic*2 } return res } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend index bf34aeeb..1b61ffa5 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend @@ -14,41 +14,51 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher class UnfinishedWFObjective implements IObjective { Collection>> unfinishedWFs val List> matchers - - new(Collection>> unfinishedWFs) { + + new( + Collection>> unfinishedWFs) { this.unfinishedWFs = unfinishedWFs matchers = new ArrayList(unfinishedWFs.size) } + override getName() '''unfinishedWFs''' + override createNew() { return new UnfinishedWFObjective(unfinishedWFs) } + override init(ThreadContext context) { - val engine = context.queryEngine//ViatraQueryEngine.on(new EMFScope(context.model)) - for(unfinishedWF : unfinishedWFs) { + val engine = context.queryEngine // ViatraQueryEngine.on(new EMFScope(context.model)) + for (unfinishedWF : unfinishedWFs) { matchers += unfinishedWF.getMatcher(engine) } } - + override getComparator() { Comparators.LOWER_IS_BETTER } + override getFitness(ThreadContext context) { var sumOfMatches = 0 - for(matcher : matchers) { + for (matcher : matchers) { val number = matcher.countMatches - //println('''«matcher.patternName» = «number»''') - sumOfMatches+=number +// if (number > 0) { +// println('''«matcher.patternName» = «number»''') +// } + sumOfMatches += number } return sumOfMatches.doubleValue } - + override getLevel() { 2 } + override isHardObjective() { true } - override satisifiesHardObjective(Double fitness) { return fitness <=0.01 } - + + override satisifiesHardObjective(Double fitness) { return fitness <= 0.01 } + override setComparator(Comparator comparator) { throw new UnsupportedOperationException() } + override setLevel(int level) { throw new UnsupportedOperationException() } -} \ 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/dse/ViatraReasonerSolutionSaver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend index 6bffeb59..74500cc2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend @@ -42,7 +42,7 @@ class ViatraReasonerSolutionSaver implements ISolutionSaver { private def saveBestSolutionOnly(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory) { val fitness = context.lastFitness - if (!fitness.satisifiesHardObjectives) { + if (!shouldSaveSolution(fitness, context)) { return false } val dominatedTrajectories = newArrayList @@ -83,7 +83,7 @@ class ViatraReasonerSolutionSaver implements ISolutionSaver { private def saveAnyDiverseSolution(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory) { val fitness = context.lastFitness - if (!fitness.satisifiesHardObjectives) { + if (!shouldSaveSolution(fitness, context)) { return false } if (!diversityChecker.newSolution(context, id, emptyList)) { @@ -92,7 +92,12 @@ class ViatraReasonerSolutionSaver implements ISolutionSaver { basicSaveSolution(context, id, solutionTrajectory, fitness) } - private def basicSaveSolution(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory, Fitness fitness) { + private def shouldSaveSolution(Fitness fitness, ThreadContext context) { + return fitness.satisifiesHardObjectives + } + + private def basicSaveSolution(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory, + Fitness fitness) { var boolean solutionSaved = false var dseSolution = solutionsCollection.get(id) if (dseSolution === null) { diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/META-INF/MANIFEST.MF b/Tests/hu.bme.mit.inf.dslreasoner.run/META-INF/MANIFEST.MF index cc274c7c..fe223d4a 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/META-INF/MANIFEST.MF +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/META-INF/MANIFEST.MF @@ -28,8 +28,10 @@ Require-Bundle: hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlan hu.bme.mit.inf.dslreasoner.visualisation;bundle-version="1.0.0", hu.bme.mit.inf.dslreasoner.domains.alloyexamples;bundle-version="1.0.0", org.eclipse.collections;bundle-version="9.2.0", - org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.2.0", - org.eclipse.viatra.query.runtime.rete;bundle-version="2.2.0", - org.objectweb.asm;bundle-version="7.0.0" + org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.0.0", + org.eclipse.viatra.query.runtime.rete;bundle-version="2.0.0", + org.objectweb.asm;bundle-version="7.0.0", + com.google.gson;bundle-version="2.8.2", + hu.bme.mit.inf.dslreasoner.domains.satellite;bundle-version="0.1.0" Import-Package: org.apache.log4j Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json new file mode 100644 index 00000000..26df3c74 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json @@ -0,0 +1,13 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 1200, + "saveModels": true, + "warmupIterations": 0, + "iterations": 1, + "domain": "FAM", + "scope": "none", + "sizes": [500], + "solver": "ViatraSolver", + "scopePropagator": "basic" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json new file mode 100644 index 00000000..5f8a01b1 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json @@ -0,0 +1,16 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 1200, + "saveModels": false, + "warmupIterations": 0, + "iterations": 5, + "domain": "Yakindu", + "scope": "quantiles", + "sizes": [100], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "hints", + "polyhedronSolver": "Clp", + "scopeHeuristic": "basic" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json new file mode 100644 index 00000000..42073422 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json @@ -0,0 +1,15 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 1200, + "saveModels": true, + "warmupIterations": 0, + "iterations": 5, + "domain": "ecore", + "scope": "quantiles", + "sizes": [100], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "relations", + "polyhedronSolver": "Clp" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json new file mode 100644 index 00000000..d7955ddd --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json @@ -0,0 +1,15 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 1200, + "saveModels": true, + "warmupIterations": 1, + "iterations": 1, + "domain": "fs", + "scope": "useful", + "sizes": [50, 100, 150, 200, 250, 300, 350, 400, 450, 500], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "relations", + "polyhedronSolver": "Clp" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json new file mode 100644 index 00000000..474962e7 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json @@ -0,0 +1,17 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 1200, + "saveModels": true, + "saveTemporaryFiles": true, + "warmupIterations": 0, + "iterations": 1, + "domain": "satellite", + "scope": "quantiles", + "sizes": [50], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "hints", + "polyhedronSolver": "Clp", + "scopeHeuristic": "polyhedral" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/initialModels/satellite.xmi b/Tests/hu.bme.mit.inf.dslreasoner.run/initialModels/satellite.xmi new file mode 100644 index 00000000..77f6ecfd --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/initialModels/satellite.xmi @@ -0,0 +1,14 @@ + + + + + + + diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/CountMatches.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/CountMatches.xtend deleted file mode 100644 index 02caf9dd..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/CountMatches.xtend +++ /dev/null @@ -1,176 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.run - -import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage -import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.mutated.Mutated -import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace -import java.io.File -import java.util.ArrayList -import java.util.Collection -import java.util.Comparator -import java.util.HashMap -import java.util.List -import java.util.Map -import java.util.TreeSet -import org.eclipse.emf.ecore.EObject -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import org.eclipse.viatra.query.runtime.api.IPatternMatch -import org.eclipse.viatra.query.runtime.api.IQuerySpecification -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine -import org.eclipse.viatra.query.runtime.emf.EMFScope - -class QueryComparator implements Comparator>{ - - override compare(IQuerySpecification arg0, IQuerySpecification arg1) { - arg0.fullyQualifiedName.compareTo(arg1.fullyQualifiedName) - } -} - -class CountMatches { - var static List> wfPatterns; - var static Map,IQuerySpecification> query2Reference - - def static void main(String[] args) { - YakindummPackage.eINSTANCE.eClass - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) - - wfPatterns = Mutated.instance.specifications.toList; - //wfPatterns = wfPatterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toList - wfPatterns.sort(new QueryComparator) - - val groupName2Representant = new HashMap - query2Reference = new HashMap - for(wfPattern : wfPatterns) { - val groupName = wfPattern.groupName - if(groupName2Representant.containsKey(groupName)) { - val representant = groupName2Representant.get(groupName) - query2Reference.put(wfPattern,representant) - } else { - groupName2Representant.put(groupName,wfPattern) - } - } - - - println('''modelpath;run;model;« - FOR wfPattern:wfPatterns SEPARATOR ";"»#(« - wfPattern.fullyQualifiedName.split("\\.").last»);hash(« - wfPattern.fullyQualifiedName.split("\\.").last»)«ENDFOR»;« - FOR mutant : wfPatterns.filter[query2Reference.keySet.contains(it)] SEPARATOR ';'»diff(« - mutant.fullyQualifiedName.split("\\.").last»)«ENDFOR»''' - ) - countMatches('''D:/FASE18Meas/RemoHF''') - } - - def private static simpleName(IQuerySpecification wfPattern) { - wfPattern.fullyQualifiedName.split("\\.").last - } - def private static groupName(IQuerySpecification wfPattern) { - wfPattern.simpleName.split('_').head - } - - def static void countMatches(String path) { - val file = new File(path) - if(file.isDirectory) { - for(subFileName : file.list) { - (path + "/" + subFileName).countMatches - } - } else if(file.isFile) { - if(path.endsWith("xmi")) { - countMatches(file,path) - } - } - } - - def static void countMatches(File file, String path) { - - - val pathSegments = path.split("/") - val groupName = pathSegments.get(pathSegments.size-2).split("\\.").last.split("_").get(0) - print(groupName +";") - val nameExtension = pathSegments.get(pathSegments.size-1).split("\\.").get(0).split("_") - try{ - val runNumber = nameExtension.get(1) - val modelNumber = nameExtension.get(2) - print('''«runNumber»;«modelNumber»''') - } catch(Exception e) { - print('''«file.name»;0''') - } - - val parent = file.parent - val workspace = new FileSystemWorkspace(parent,"") - val model = workspace.readModel(EObject,file.name) - - val engine = ViatraQueryEngine.on(new EMFScope(model)) - val objectCode = model.eResource.calculateObjectCode - - val pattern2Hash = new HashMap - for(pattern : wfPatterns) { - val matcher = pattern.getMatcher(engine) - val matches = matcher.allMatches - val hash = matches.getMatchSetDescriptor(objectCode) - pattern2Hash.put(pattern,hash) - print(''';«matcher.countMatches»;«hash»''') - } - var mutantsKilled = 0 - for(mutant : wfPatterns.filter[query2Reference.keySet.contains(it)]) { - val equals = pattern2Hash.get(mutant) == pattern2Hash.get(query2Reference.get(mutant)) - print(''';''') - if(equals) { - print('0') - } else { - print('1') - mutantsKilled++ - } - } - //print(''';«mutantsKilled»''') - println() - } - - def static Map calculateObjectCode(Resource resource) { - val res = new HashMap - val iterator = resource.allContents - var index = 1 - while(iterator.hasNext) { - res.put(iterator.next,index++) - } - return res - } - - def static getMatchSetDescriptor(Collection matchSet, Map objectCode) { - val set = new TreeSet(new ArrayComparator) - for(match: matchSet) { - val size = match.parameterNames.size - val idArray = new ArrayList(size) - for(i:0..> { - - override compare(List arg0, List arg1) { - if(arg0.size === arg1.size) { - for(i : 0.. nameToType + val Map> nameToRelation + + protected new(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + nameToType = ImmutableMap.copyOf(ecore2Logic.allClassesInScope(trace).toMap[name].mapValues [ eClass | + ecore2Logic.TypeofEClass(trace, eClass) + ]) + nameToRelation = ImmutableMap.copyOf(ecore2Logic.allReferencesInScope(trace).groupBy[EContainingClass.name]. + mapValues [ references | + ImmutableMap.copyOf(references.toMap[name].mapValues [ reference | + ecore2Logic.relationOfReference(trace, reference) + ]) + ]) + } + + protected def getType(String name) { + nameToType.get(name) + } + + protected def relation(String typeName, String relationName) { + nameToRelation.get(typeName).get(relationName) + } + + protected static def int countMatches(ViatraQueryMatcher matcher, PartialInterpretation p) { + val match = matcher.newEmptyMatch + match.set(0, p.problem) + match.set(1, p) + matcher.countMatches(match) + } + + protected static def int getCount(ViatraQueryMatcher matcher, PartialInterpretation p) { + val match = matcher.newEmptyMatch + match.set(0, p.problem) + match.set(1, p) + val realMatch = matcher.getOneArbitraryMatch(match) + if (realMatch.present) { + realMatch.get.get(2) as Integer + } else { + 0 + } + } +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend index 34f3c267..54724226 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend @@ -4,18 +4,23 @@ import functionalarchitecture.FunctionalarchitecturePackage import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.Ecore import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.FileSystem import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.Filesystem.FilesystemPackage +import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.internal.SatelliteQueriesAll import hu.bme.mit.inf.dslreasoner.domains.transima.fam.FamPatterns import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethodBasedGlobalConstraint import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace import java.util.Collection import java.util.HashMap import java.util.LinkedHashMap import java.util.List +import java.util.Map import java.util.Set import org.eclipse.emf.ecore.EAttribute import org.eclipse.emf.ecore.EClass @@ -24,60 +29,83 @@ import org.eclipse.emf.ecore.EEnumLiteral import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import org.eclipse.emf.ecore.EcorePackage +import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtext.xbase.lib.Functions.Function1 -import hu.bme.mit.inf.dslreasoner.domains.transima.fam.Type -import hu.bme.mit.inf.dslreasoner.domains.transima.fam.Model +import satellite.SatellitePackage + +@Data +class TypeQuantiles { + double low + double high +} abstract class MetamodelLoader { protected val ReasonerWorkspace workspace + new(ReasonerWorkspace workspace) { this.workspace = workspace - } + } + def EcoreMetamodelDescriptor loadMetamodel() + def Set getRelevantTypes(EcoreMetamodelDescriptor descriptor) + def Set getRelevantReferences(EcoreMetamodelDescriptor descriptor) + def ViatraQuerySetDescriptor loadQueries(EcoreMetamodelDescriptor metamodel) + def List loadPartialModel() - - def List> additionalConstraints() - - def filterByNames(Iterable collection, Function1 nameExtractor, Collection requiredNames) { + + def List> additionalConstraints() + + def Map getTypeQuantiles() { + emptyMap + } + + def List getHints(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + emptyList + } + + def filterByNames(Iterable collection, Function1 nameExtractor, + Collection requiredNames) { val res = collection.filter[requiredNames.contains(nameExtractor.apply(it))] if(res.size != requiredNames.size) throw new IllegalArgumentException return res.toSet } } -class FAMLoader extends MetamodelLoader{ - +class FAMLoader extends MetamodelLoader { + new(ReasonerWorkspace workspace) { super(workspace) } - + override loadMetamodel() { val package = FunctionalarchitecturePackage.eINSTANCE val List classes = package.EClassifiers.filter(EClass).toList val List enums = package.EClassifiers.filter(EEnum).toList val List literals = enums.map[ELiterals].flatten.toList - val List references = classes.map[EReferences].flatten.toList + val List references = classes.map[EReferences].flatten.filter[name != "type" && name != "model"]. + toList val List attributes = classes.map[EAttributes].flatten.toList - return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) + return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) } - - override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { - return descriptor.classes.filterByNames([it.name],#["FunctionalElement"]) + + override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { + return descriptor.classes.filterByNames([it.name], #["FunctionalElement"]) } + override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { - return descriptor.references.filterByNames([it.name],#["subElements"]) + return descriptor.references.filterByNames([it.name], #["subElements"]) } - + override loadQueries(EcoreMetamodelDescriptor metamodel) { val i = FamPatterns.instance val patterns = i.specifications.toList - val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name== "Constraint"]].toSet + val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = new LinkedHashMap - derivedFeatures.put(Type.instance,metamodel.attributes.filter[it.name == "type"].head) - derivedFeatures.put(Model.instance,metamodel.references.filter[it.name == "model"].head) +// derivedFeatures.put(Type.instance,metamodel.attributes.filter[it.name == "type"].head) +// derivedFeatures.put(Model.instance,metamodel.references.filter[it.name == "model"].head) val res = new ViatraQuerySetDescriptor( patterns, wfPatterns, @@ -85,65 +113,67 @@ class FAMLoader extends MetamodelLoader{ ) return res } + override loadPartialModel() { - this.workspace.readModel(EObject,"FAM.xmi").eResource.allContents.toList + this.workspace.readModel(EObject, "FAM.xmi").eResource.allContents.toList } - + override additionalConstraints() { #[] } } -class YakinduLoader extends MetamodelLoader{ - +class YakinduLoader extends MetamodelLoader { + var useSynchronization = true; - var useComplexStates = false; - public static val patternsWithSynchronization = #[ - "synchHasNoOutgoing", "synchHasNoIncoming", "SynchronizedIncomingInSameRegion", "notSynchronizingStates", - "hasMultipleOutgoingTrainsition", "hasMultipleIncomingTrainsition", "SynchronizedRegionsAreNotSiblings", - "SynchronizedRegionDoesNotHaveMultipleRegions", "synchThree", "twoSynch","noSynch2","synch","noSynch4","noSynch3","noSynch"] - public static val patternsWithComplexStates =#["outgoingFromExit","outgoingFromFinal","choiceHasNoOutgoing","choiceHasNoIncoming"] + var useComplexStates = false; + public static val patternsWithSynchronization = #["synchHasNoOutgoing", "synchHasNoIncoming", + "SynchronizedIncomingInSameRegion", "SynchronizedIncomingInSameRegionHelper1", + "SynchronizedIncomingInSameRegionHelper2", "notSynchronizingStates", "hasMultipleOutgoingTrainsition", + "hasMultipleIncomingTrainsition", "SynchronizedRegionsAreNotSiblings", + "SynchronizedRegionsAreNotSiblingsHelper1", "SynchronizedRegionsAreNotSiblingsHelper2", + "SynchronizedRegionDoesNotHaveMultipleRegions", "synchThree", "twoSynch", "noSynch2", "synch", "noSynch4", + "noSynch3", "noSynch"] + public static val patternsWithComplexStates = #["outgoingFromExit", "outgoingFromFinal", "choiceHasNoOutgoing", + "choiceHasNoIncoming"] + new(ReasonerWorkspace workspace) { super(workspace) YakindummPackage.eINSTANCE.eClass } - + def setUseSynchronization(boolean useSynchronization) { this.useSynchronization = useSynchronization } + def setUseComplexStates(boolean useComplexStates) { this.useComplexStates = useComplexStates } - + override loadMetamodel() { val useSynchInThisLoad = this.useSynchronization val useComplexStates = this.useComplexStates - + val package = YakindummPackage.eINSTANCE - val List classes = package.EClassifiers.filter(EClass) - .filter[useSynchInThisLoad || (it.name != "Synchronization")] - .filter[useComplexStates || (it.name != "Choice" && it.name != "Exit" && it.name != "FinalState")] - .toList + val List classes = package.EClassifiers.filter(EClass).filter [ + useSynchInThisLoad || (it.name != "Synchronization") + ].filter[useComplexStates || (it.name != "Choice" && it.name != "Exit" && it.name != "FinalState")].toList val List enums = package.EClassifiers.filter(EEnum).toList val List literals = enums.map[ELiterals].flatten.toList val List references = classes.map[EReferences].flatten.toList val List attributes = classes.map[EAttributes].flatten.toList - return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) + return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) } + override loadQueries(EcoreMetamodelDescriptor metamodel) { val useSynchInThisLoad = this.useSynchronization - + val i = Patterns.instance - val patterns = i.specifications - .filter[spec | - useSynchInThisLoad || - !patternsWithSynchronization.exists[spec.fullyQualifiedName.endsWith(it)] - ] - .filter[spec | - useComplexStates || - !patternsWithComplexStates.exists[spec.fullyQualifiedName.endsWith(it)] - ] - .toList - val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name== "Constraint"]].toSet + val patterns = i.specifications.filter [ spec | + useSynchInThisLoad || !patternsWithSynchronization.exists[spec.fullyQualifiedName.endsWith(it)] + ].filter [ spec | + useComplexStates || !patternsWithComplexStates.exists[spec.fullyQualifiedName.endsWith(it)] + ].toList + val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = new LinkedHashMap val res = new ViatraQuerySetDescriptor( patterns, @@ -152,53 +182,71 @@ class YakinduLoader extends MetamodelLoader{ ) return res } + override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { - descriptor.classes.filterByNames([it.name],#["Vertex","Transition","Synchronization"]) + descriptor.classes.filterByNames([it.name], #["Vertex", "Transition", "Synchronization"]) } - + override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { - descriptor.references.filterByNames([it.name],#["source","target"]) + descriptor.references.filterByNames([it.name], #["source", "target"]) } - + override loadPartialModel() { - this.workspace.readModel(EObject,"Yakindu.xmi").eResource.allContents.toList + this.workspace.readModel(EObject, "Yakindu.xmi").eResource.allContents.toList } - - override additionalConstraints() { //#[] - #[[method | new SGraphInconsistencyDetector(method)]] + + override additionalConstraints() { // #[] + #[[method|new SGraphInconsistencyDetector(method)]] + } + + override getTypeQuantiles() { + #{ + "Choice" -> new TypeQuantiles(0.118279569892473, 0.154020979020979), + "Entry" -> new TypeQuantiles(0.0283018867924528, 0.0620167525773196), + "Exit" -> new TypeQuantiles(0, 0), + "FinalState" -> new TypeQuantiles(0, 0), + "Region" -> new TypeQuantiles(0.0294117647058824, 0.0633258678611422), + "State" -> new TypeQuantiles(0.132023636740618, 0.175925925925926), +// "Statechart" -> new TypeQuantiles(0.00961538461538462, 0.010752688172043), + "Transition" -> new TypeQuantiles(0.581632653061224, 0.645161290322581) + } + } + + override getHints(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + #[new SGraphHint(ecore2Logic, trace)] } } -class FileSystemLoader extends MetamodelLoader{ - +class FileSystemLoader extends MetamodelLoader { + new(ReasonerWorkspace workspace) { super(workspace) } - + override loadMetamodel() { val package = FilesystemPackage.eINSTANCE val List classes = package.EClassifiers.filter(EClass).toList val List enums = package.EClassifiers.filter(EEnum).toList val List literals = enums.map[ELiterals].flatten.toList - val List references = classes.map[EReferences].flatten.toList + val List references = classes.map[EReferences].flatten.filter[name != "live"].toList val List attributes = classes.map[EAttributes].flatten.toList - return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) + return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) } - + override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { return null } - + override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { null } - + override loadQueries(EcoreMetamodelDescriptor metamodel) { val patternGroup = FileSystem.instance val patterns = patternGroup.specifications.toList val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = new HashMap - derivedFeatures.put(patternGroup.live,metamodel.references.filter[it.name == "live"].head) +// derivedFeatures.put(patternGroup.live,metamodel.references.filter[it.name == "live"].head) return new ViatraQuerySetDescriptor( patterns, wfPatterns, @@ -206,41 +254,46 @@ class FileSystemLoader extends MetamodelLoader{ ) } - + override loadPartialModel() { - this.workspace.readModel(EObject,"fs.xmi").eResource.allContents.toList + this.workspace.readModel(EObject, "fs.xmi").eResource.allContents.toList } - + override additionalConstraints() { - #[[method | new FileSystemInconsistencyDetector(method)]] + #[[method|new FileSystemInconsistencyDetector(method)]] } - + } class EcoreLoader extends MetamodelLoader { - + new(ReasonerWorkspace workspace) { super(workspace) } - + override loadMetamodel() { val package = EcorePackage.eINSTANCE - val List classes = package.EClassifiers.filter(EClass).filter[it.name!="EFactory"].toList + val List classes = package.EClassifiers.filter(EClass).filter [ + it.name != "EFactory" && it.name != "EObject" && it.name != "EResource" + ].toList val List enums = package.EClassifiers.filter(EEnum).toList val List literals = enums.map[ELiterals].flatten.toList - val List references = classes.map[EReferences].flatten.filter[it.name!="eFactoryInstance"].filter[!it.derived].toList - val List attributes = #[] //classes.map[EAttributes].flatten.toList - return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) + val List references = classes.map[EReferences].flatten.filter [ + it.name != "eFactoryInstance" && it.name != "contents" && it.name != "references" && + it.name != "eGenericType" && it.name != "eGenericSuperTypes" + ].filter[!it.derived].toList + val List attributes = #[] // classes.map[EAttributes].flatten.toList + return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) } - + override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { return null } - + override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { null } - + override loadQueries(EcoreMetamodelDescriptor metamodel) { val patternGroup = Ecore.instance val patterns = patternGroup.specifications.toList @@ -253,13 +306,92 @@ class EcoreLoader extends MetamodelLoader { ) } - + override loadPartialModel() { - this.workspace.readModel(EObject,"ecore.xmi").eResource.allContents.toList + this.workspace.readModel(EObject, "ecore.xmi").eResource.allContents.toList } - + override additionalConstraints() { #[] } + + override getTypeQuantiles() { + #{ + "EAnnotation" -> new TypeQuantiles(0, 0), + "EAttribute" -> new TypeQuantiles(0.14, 0.300943396226415), + "EClass" -> new TypeQuantiles(0.224014336917563, 0.372881355932203), + "EDataType" -> new TypeQuantiles(0, 0), + "EEnum" -> new TypeQuantiles(0, 0.0275208638045255), + "EEnumLiteral" -> new TypeQuantiles(0, 0.105204907665065), + "EGenericType" -> new TypeQuantiles(0, 0), + "EOperation" -> new TypeQuantiles(0, 0), + "EPackage" -> new TypeQuantiles(0.0119047619047619, 0.0192307692307692), + "EParameter" -> new TypeQuantiles(0, 0), + "EReference" -> new TypeQuantiles(0.217599234815878, 0.406779661016949), + "EStringToStringMapEntry" -> new TypeQuantiles(0, 0), + "ETypeParameter" -> new TypeQuantiles(0, 0) + } + } + +} + +class SatelliteLoader extends MetamodelLoader { + + new(ReasonerWorkspace workspace) { + super(workspace) + } + + override loadMetamodel() { + val package = SatellitePackage.eINSTANCE + val List classes = package.EClassifiers.filter(EClass).toList + val List enums = package.EClassifiers.filter(EEnum).toList + val List literals = enums.map[ELiterals].flatten.toList + val List references = classes.map[EReferences].flatten.toList + val List attributes = classes.map[EAttributes].flatten.toList + return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) + } + + override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { + null + } + + override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { + null + } + + override loadQueries(EcoreMetamodelDescriptor metamodel) { + val i = SatelliteQueriesAll.instance + val patterns = i.specifications.toList + val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet + val derivedFeatures = new LinkedHashMap + val res = new ViatraQuerySetDescriptor( + patterns, + wfPatterns, + derivedFeatures + ) + return res + } + + override loadPartialModel() { + this.workspace.readModel(EObject, "satellite.xmi").eResource.allContents.toList + } + + override additionalConstraints() { #[] } + + override getHints(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + #[new SatelliteHint(ecore2Logic, trace)] + } + + override getTypeQuantiles() { + #{ + "CubeSat3U" -> new TypeQuantiles(0.1, 0.25), + "CubeSat6U" -> new TypeQuantiles(0, 0.25), + "SmallSat" -> new TypeQuantiles(0, 0.15), + "UHFCommSubsystem" -> new TypeQuantiles(0.08, 0.25), + "XCommSubsystem" -> new TypeQuantiles(0.08, 0.25), + "KaCommSubsystem" -> new TypeQuantiles(0, 0.1), + "InterferometryPayload" -> new TypeQuantiles(0.15, 0.25) + } + } -} \ No newline at end of file +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend new file mode 100644 index 00000000..97ce4ee6 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend @@ -0,0 +1,46 @@ +package hu.bme.mit.inf.dslreasoner.run + +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator + +class SGraphHint extends Ecore2LogicTraceBasedHint { + new(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + super(ecore2Logic, trace) + } + + override getAdditionalPatterns(extension PatternGenerator patternGenerator) { + "" + } + + override createConstraintUpdater(LinearTypeExpressionBuilderFactory it) { + val newEntriesWithoutRegionCount = createBuilder.add(1, "Entry".type).add(-1, "Region".type).build + val newStatesWithoutRegionCount = createBuilder.add(1, "State".type).add(-1, "Region".type).build + val newTransitionWithoutNeedsOutgoingCount = createBuilder.add(1, "Transition".type).add(-1, "Entry".type). + add(-1, "Choice".type).build + val newTransitionWithoutNeedsIncomingCount = createBuilder.add(1, "Transition".type).add(-1, "Choice".type). + build + + val regionsWithoutEntryMatcher = createMatcher( + "unfinishedBy_pattern_hu_bme_mit_inf_dslreasoner_partialsnapshot_mavo_yakindu_noEntryInRegion") + val regionsWithoutStateMatcher = createMatcher( + "unfinishedBy_pattern_hu_bme_mit_inf_dslreasoner_partialsnapshot_mavo_yakindu_noStateInRegion") + val entryHasNoOutgoingMatcher = createMatcher( + "unfinishedBy_pattern_hu_bme_mit_inf_dslreasoner_partialsnapshot_mavo_yakindu_noOutgoingTransitionFromEntry") + val choiceHasNoOutgoingMatcher = createMatcher( + "unfinishedBy_pattern_hu_bme_mit_inf_dslreasoner_partialsnapshot_mavo_yakindu_choiceHasNoOutgoing") + val choiceHasNoIncomingMatcher = createMatcher( + "unfinishedBy_pattern_hu_bme_mit_inf_dslreasoner_partialsnapshot_mavo_yakindu_choiceHasNoIncoming") + val transitionWithoutTargetMatcher = createMatcher("unfinishedLowerMultiplicity_target_reference_Transition") + + return [ p | + newEntriesWithoutRegionCount.assertEqualsTo(regionsWithoutEntryMatcher.countMatches(p)) + newStatesWithoutRegionCount.tightenLowerBound(regionsWithoutStateMatcher.countMatches(p)) + newTransitionWithoutNeedsOutgoingCount.tightenLowerBound( + entryHasNoOutgoingMatcher.countMatches(p) + choiceHasNoOutgoingMatcher.countMatches(p)) + newTransitionWithoutNeedsIncomingCount.tightenLowerBound( + choiceHasNoIncomingMatcher.countMatches(p) - transitionWithoutTargetMatcher.getCount(p)) + ] + } +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend new file mode 100644 index 00000000..e95c0c64 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend @@ -0,0 +1,86 @@ +package hu.bme.mit.inf.dslreasoner.run + +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator + +class SatelliteHint extends Ecore2LogicTraceBasedHint { + static val INTERFEROMETY_PAYLOAD = "hint_interferometryPayload" + static val REMAINING_CONTENTS_KA_COMM_SUBSYSTEM = "hint_kaCommSubsystem" + static val HINT_SPACECRAFT_UHF_POSSIBLE_LINK = "hint_spacecraftWithUhfPossibleLink" + static val HINT_SPACECRAFT_UHF_ONLY_NO_LINK = "hint_spacecraftUhfOnlyNoLink" + + new(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { + super(ecore2Logic, trace) + } + + override getAdditionalPatterns(PatternGenerator it) ''' + pattern «INTERFEROMETY_PAYLOAD»(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, object); + «typeIndexer.referInstanceOf("InterferometryPayload".type, Modality.MUST, "object")» + } + + private pattern «REMAINING_CONTENTS_KA_COMM_SUBSYSTEM»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingContents:java Integer) { + find remainingContents_commSubsystem_reference_CommunicatingElement_helper(problem, interpretation, object, remainingContents); + «typeIndexer.referInstanceOf("SmallSat".type, Modality.MUST, "object")» + } + + pattern «REMAINING_CONTENTS_KA_COMM_SUBSYSTEM»(problem:LogicProblem, interpretation:PartialInterpretation, remainingContents:java Integer) { + find interpretation(problem, interpretation); + remainingContents == sum find «REMAINING_CONTENTS_KA_COMM_SUBSYSTEM»_helper(problem, interpretation, _, #_); + } + + private pattern hint_spacecraftNotUhfOnly(problem:LogicProblem, interpretation:PartialInterpretation, spacecraft:DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, spacecraft); + «typeIndexer.referInstanceOf("Spacecraft".type, Modality.MUST, "spacecraft")» + «relationDeclarationIndexer.referRelation("CommunicatingElement".relation("commSubsystem"), "spacecraft", "comm", Modality.MAY)» + neg «typeIndexer.referInstanceOf("UHFCommSubsystem".type, Modality.MUST, "comm")» + } + + private pattern hint_spacecraftWithUhf(problem:LogicProblem, interpretation:PartialInterpretation, spacecraft:DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, spacecraft); + «typeIndexer.referInstanceOf("Spacecraft".type, Modality.MUST, "spacecraft")» + «relationDeclarationIndexer.referRelation("CommunicatingElement".relation("commSubsystem"), "spacecraft", "comm", Modality.MUST)» + «typeIndexer.referInstanceOf("UHFCommSubsystem".type, Modality.MUST, "comm")» + } + + pattern «HINT_SPACECRAFT_UHF_POSSIBLE_LINK»(problem:LogicProblem, interpretation:PartialInterpretation) { + find hint_spacecraftWithUhf(problem, interpretation, spacecraft); + find hint_spacecraftNotUhfOnly(problem, interpretation, spacecraft); + } + + pattern «HINT_SPACECRAFT_UHF_ONLY_NO_LINK»(problem:LogicProblem, interpretation:PartialInterpretation) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, spacecraft); + «typeIndexer.referInstanceOf("Spacecraft".type, Modality.MUST, "spacecraft")» + neg find hint_spacecraftNotUhfOnly(problem, interpretation, spacecraft); + find currentInRelation_pattern_hu_bme_mit_inf_dslreasoner_domains_satellite_queries_noLinkToGroundStation(problem, interpretation, spacecraft); + } + ''' + + override createConstraintUpdater(LinearTypeExpressionBuilderFactory it) { + val interferometryPayloadCount = createBuilder.add(1, "InterferometryPayload".type).build + val kaCommSubsystemWithoutSmallSatCount = createBuilder.add(1, "KaCommSubsystem".type).add(-2, "SmallSat".type). + build + val uhfCommSubsystemCount = createBuilder.add(1, "UHFCommSubsystem".type).build + + val interferometryPayloadMatcher = createMatcher(INTERFEROMETY_PAYLOAD) + val kaCommSubsystemRemainingContentsMatcher = createMatcher(REMAINING_CONTENTS_KA_COMM_SUBSYSTEM) + val uhfPossibleLinkMatcher = createMatcher(HINT_SPACECRAFT_UHF_POSSIBLE_LINK) + val uhfNoLinkMatcher = createMatcher(HINT_SPACECRAFT_UHF_ONLY_NO_LINK) + + return [ p | + interferometryPayloadCount.tightenLowerBound(2 - interferometryPayloadMatcher.countMatches(p)) + kaCommSubsystemWithoutSmallSatCount.tightenUpperBound(kaCommSubsystemRemainingContentsMatcher.getCount(p)) + if (uhfPossibleLinkMatcher.countMatches(p) == 0 && uhfNoLinkMatcher.countMatches(p) >= 1) { + uhfCommSubsystemCount.tightenLowerBound(1) + } + ] + } + +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/TypeDistributionCalculator.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/TypeDistributionCalculator.xtend new file mode 100644 index 00000000..e2d6e6ca --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/TypeDistributionCalculator.xtend @@ -0,0 +1,35 @@ +package hu.bme.mit.inf.dslreasoner.run + +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage +import java.io.File +import org.eclipse.emf.common.util.URI +import org.eclipse.emf.ecore.EPackage +import org.eclipse.emf.ecore.EcorePackage +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl + +class TypeDistributionCalculator { + public static def void main(String[] args) { + Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl) + EPackage.Registry.INSTANCE.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE) + EPackage.Registry.INSTANCE.put(YakindummPackage.eNS_URI, YakindummPackage.eINSTANCE) + + println("model,className,count") + val directory = new File(args.get(0)) + for (file : directory.listFiles) { + val modelName = file.name + val resourceSet = new ResourceSetImpl + val resource = resourceSet.getResource(URI.createFileURI(file.absolutePath), true) + val objectsByTypeName = resource.allContents.filter [ obj | + val featureName = obj.eContainingFeature?.name + // Filter out "derived containment" references in Ecore. + // See https://stackoverflow.com/a/46340165 + featureName != "eGenericType" && featureName != "eGenericSuperTypes" + ].groupBy[eClass.name] + for (pair : objectsByTypeName.entrySet) { + println('''«modelName»,«pair.key»,«pair.value.size»''') + } + } + } +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend new file mode 100644 index 00000000..5abff962 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend @@ -0,0 +1,70 @@ +package hu.bme.mit.inf.dslreasoner.run.script + +import java.util.List +import org.eclipse.xtend.lib.annotations.Accessors + +@Accessors +class MeasurementScript { + String inputPath + String outputPath + int timeout + boolean saveModels + boolean saveTemporaryFiles + int warmupIterations + int iterations + Domain domain + Scope scope + List sizes + Solver solver + ScopePropagator scopePropagator + ScopeConstraints propagatedConstraints + PolyhedronSolver polyhedronSolver + ScopeHeuristic scopeHeuristic + + def toCsvHeader() { + '''«domain»,«scope»,«solver»,«scopePropagator ?: "NULL"»,«propagatedConstraints ?: "NULL"»,«polyhedronSolver ?: "NULL"»''' + } +} + +enum Domain { + fs, + ecore, + Yakindu, + FAM, + satellite +} + +enum Scope { + none, + quantiles +} + +enum Solver { + ViatraSolver, + AlloySolver +} + +enum ScopePropagator { + none, + basic, + polyhedral +} + +enum ScopeConstraints { + none, + typeHierarchy, + relations, + hints +} + +enum PolyhedronSolver { + Z3Integer, + Z3Real, + Cbc, + Clp +} + +enum ScopeHeuristic { + basic, + polyhedral +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend new file mode 100644 index 00000000..48e750cb --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend @@ -0,0 +1,351 @@ +package hu.bme.mit.inf.dslreasoner.run.script + +import com.google.gson.Gson +import hu.bme.mit.inf.dslreasoner.ecore2logic.EClassMapper +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace +import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel +import hu.bme.mit.inf.dslreasoner.logic.model.builder.TypeScopes +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringLiteral +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.IntStatisticEntry +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicresultFactory +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.RealStatisticEntry +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.Statistics +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.StringStatisticEntry +import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore +import hu.bme.mit.inf.dslreasoner.run.EcoreLoader +import hu.bme.mit.inf.dslreasoner.run.FAMLoader +import hu.bme.mit.inf.dslreasoner.run.FileSystemLoader +import hu.bme.mit.inf.dslreasoner.run.MetamodelLoader +import hu.bme.mit.inf.dslreasoner.run.SatelliteLoader +import hu.bme.mit.inf.dslreasoner.run.YakinduLoader +import hu.bme.mit.inf.dslreasoner.util.CollectionsUtil +import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic +import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration +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.partialinterpretation2logic.InstanceModel2Logic +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partial2logicannotations.PartialModelRelation2Assertion +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration +import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace +import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace +import java.io.FileReader +import java.util.HashMap +import java.util.HashSet +import java.util.Map +import java.util.Set +import org.eclipse.emf.ecore.EObject +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions +import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactory +import org.eclipse.xtend.lib.annotations.Data + +class MeasurementScriptRunner { + static val MODEL_SIZE_GAP = 0 + static val SCOPE_PROPAGATOR_TIMEOUT = 10 + static val USEC_TO_MSEC = 1000000 + + static extension val LogicresultFactory = LogicresultFactory.eINSTANCE + + val MeasurementScript script + val ReasonerWorkspace inputWorkspace + val ReasonerWorkspace outputWorkspace + val MetamodelLoader metamodelLoader + + new(MeasurementScript script) { + this.script = script + inputWorkspace = new FileSystemWorkspace(script.inputPath + "/", "") + outputWorkspace = new FileSystemWorkspace(script.outputPath + + "/", '''«script.domain»_«script.solver»_«script.scope»_«script.scopePropagator ?: "na"»_«script.propagatedConstraints ?: "na"»_«script.polyhedronSolver ?: "na"»_''') + metamodelLoader = switch (script.domain) { + case fs: new FileSystemLoader(inputWorkspace) + case ecore: new EcoreLoader(inputWorkspace) + case Yakindu: new YakinduLoader(inputWorkspace) => [useSynchronization = false; useComplexStates = true] + case FAM: new FAMLoader(inputWorkspace) + case satellite: new SatelliteLoader(inputWorkspace) + default: throw new IllegalArgumentException("Unsupported domain: " + script.domain) + } + } + + def run() { + if (script.sizes.empty) { + return + } + val start = System.currentTimeMillis + val warmupSize = script.sizes.head + for (var int i = 0; i < script.warmupIterations; i++) { + System.err.println('''Warmup «i + 1»/«script.warmupIterations»...''') + runExperiment(warmupSize) + } + val warmupEnd = System.currentTimeMillis + System.err.println('''Warmup completed in «(warmupEnd - start) / 1000» seconds''') + for (size : script.sizes) { + var int failures = 0 + for (var int i = 0; i < script.iterations; i++) { + System.err.println("Running GC...") + runGc() + System.err.println('''Iteration «i + 1»/«script.iterations» of size «size»...''') + val startTime = System.currentTimeMillis + val result = runExperiment(size) + val headerPrefix = '''«script.toCsvHeader»,«size»,«i + 1»,«result.resultName»''' + println('''«headerPrefix»,startTime,«startTime»''') + println('''«headerPrefix»,logic2SolverTransformationTime,«result.statistics.transformationTime»''') + println('''«headerPrefix»,solverTime,«result.statistics.solverTime»''') + for (statistic : result.statistics.entries) { + val valueString = switch (statistic) { + IntStatisticEntry: statistic.value.toString + RealStatisticEntry: statistic.value.toString + StringStatisticEntry: statistic.value.toString + default: statistic.toString + } + println('''«headerPrefix»,«statistic.name»,«valueString»''') + } + if (script.saveModels && result.model !== null) { + outputWorkspace.writeModel(result.model, '''«size»_«i + 1».xmi''') + } + if (result.resultName === "InsuficientResourcesResultImpl") { + failures++ + } + System.out.flush + } + if (failures == script.iterations) { + System.err.println("All measurements failed") + return + } + } + val end = System.currentTimeMillis + System.err.println('''Measurement completed in «(end - start) / 1000» seconds''') + } + + private static def void runGc() { + System.gc + Thread.sleep(100) + System.gc + Thread.sleep(100) + System.gc + Thread.sleep(800) + } + + private def runExperiment(int modelSize) { + if (script.solver != Solver.ViatraSolver) { + throw new IllegalArgumentException("Only VIATRA-Generator is supported") + } + val config = new ViatraReasonerConfiguration + config.solutionScope.numberOfRequiredSolutions = 1 + config.scopePropagatorStrategy = switch (script.scopePropagator) { + case none: + ScopePropagatorStrategy.None + case basic: + switch (script.propagatedConstraints) { + case none: + ScopePropagatorStrategy.Basic + case typeHierarchy: + ScopePropagatorStrategy.BasicTypeHierarchy + case relations, + case hints: + throw new IllegalArgumentException( + "Basic scope propagator does not support relational and hint constraints") + default: + throw new IllegalArgumentException("Unknown scope constraints: " + script.propagatedConstraints) + } + case polyhedral: { + val constraints = switch (script.propagatedConstraints) { + case none: + throw new IllegalArgumentException( + "Polyhedral scope propagator needs at least type hierarchy constraints") + case typeHierarchy: + PolyhedralScopePropagatorConstraints.TypeHierarchy + case relations, + case hints: + PolyhedralScopePropagatorConstraints.Relational + default: + throw new IllegalArgumentException("Unknown scope constraints: " + script.propagatedConstraints) + } + val polyhedronSolver = switch (script.polyhedronSolver) { + case Z3Integer: PolyhedralScopePropagatorSolver.Z3Integer + case Z3Real: PolyhedralScopePropagatorSolver.Z3Real + case Cbc: PolyhedralScopePropagatorSolver.Cbc + case Clp: PolyhedralScopePropagatorSolver.Clp + default: throw new IllegalArgumentException("Unknown polyhedron solver: " + script.polyhedronSolver) + } + val updateHeuristic = script.scopeHeuristic != ScopeHeuristic.basic + new ScopePropagatorStrategy.Polyhedral(constraints, polyhedronSolver, updateHeuristic, + SCOPE_PROPAGATOR_TIMEOUT) + } + default: + throw new IllegalArgumentException("Unknown scope propagator: " + script.scopePropagator) + } + config.runtimeLimit = script.timeout + config.documentationLevel = if(script.saveTemporaryFiles) DocumentationLevel.NORMAL else DocumentationLevel.NONE + config.debugConfiguration.partialInterpretatioVisualiser = null + config.searchSpaceConstraints.additionalGlobalConstraints += metamodelLoader.additionalConstraints + + val modelLoadingStart = System.nanoTime + val metamodelDescriptor = metamodelLoader.loadMetamodel + val partialModelDescriptor = metamodelLoader.loadPartialModel + val queryDescriptor = metamodelLoader.loadQueries(metamodelDescriptor) + val modelLoadingTime = System.nanoTime - modelLoadingStart + + val domain2LogicTransformationStart = System.nanoTime + val Ecore2Logic ecore2Logic = new Ecore2Logic + val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) + val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic + var modelGeneration = ecore2Logic.transformMetamodel(metamodelDescriptor, new Ecore2LogicConfiguration()) + var problem = modelGeneration.output + problem = instanceModel2Logic.transform( + modelGeneration, + partialModelDescriptor + ).output + problem = viatra2Logic.transformQueries( + queryDescriptor, + modelGeneration, + new Viatra2LogicConfiguration + ).output + initializeScope(config, modelSize, problem, ecore2Logic, modelGeneration.trace) + if (script.propagatedConstraints == ScopeConstraints.hints) { + config.hints = metamodelLoader.getHints(ecore2Logic, modelGeneration.trace) + } + val domain2LogicTransformationTime = System.nanoTime - domain2LogicTransformationStart + + if (config.documentationLevel != DocumentationLevel.NONE) { + outputWorkspace.writeModel(problem, "initial.logicproblem") + } + + val solver = new ViatraReasoner + val result = solver.solve(problem, config, outputWorkspace) + val statistics = result.statistics + statistics.entries += createIntStatisticEntry => [ + name = "modelLoadingTime" + value = (modelLoadingTime / USEC_TO_MSEC) as int + ] + statistics.entries += createIntStatisticEntry => [ + name = "domain2LogicTransformationTime" + value = (domain2LogicTransformationTime / USEC_TO_MSEC) as int + ] + var EObject modelResult = null + if (result instanceof ModelResult) { + val intepretations = solver.getInterpretations(result) + if (intepretations.size != 1) { + throw new IllegalStateException("Expected 1 interpretation, got " + intepretations.size) + } + var resultTransformationStart = System.nanoTime + val logic2Ecore = new Logic2Ecore(ecore2Logic) + modelResult = logic2Ecore.transformInterpretation(intepretations.head, modelGeneration.trace) + val resultTransformationTime = System.nanoTime - resultTransformationStart + statistics.entries += createIntStatisticEntry => [ + name = "ecore2LogicTransformationTime" + value = (resultTransformationTime / USEC_TO_MSEC) as int + ] + } + + new ExperimentResult(result.class.simpleName, statistics, modelResult) + } + + private def initializeScope(ViatraReasonerConfiguration config, int modelSize, LogicProblem problem, + EClassMapper eClassMapper, Ecore2Logic_Trace trace) { + val knownElements = initializeKnownElements(problem, config.typeScopes) + if (modelSize < 0) { + config.typeScopes.minNewElements = 0 + config.typeScopes.maxNewElements = TypeScopes.Unlimited + } else { + val numberOfKnownElements = knownElements.values.flatten.toSet.size + val newElementCount = modelSize - numberOfKnownElements + config.typeScopes.minNewElements = newElementCount + config.typeScopes.maxNewElements = newElementCount + MODEL_SIZE_GAP + } + switch (script.scope) { + case none: + return + case quantiles: { + val quantiles = metamodelLoader.typeQuantiles + for (eClassInScope : eClassMapper.allClassesInScope(trace)) { + val quantile = quantiles.get(eClassInScope.name) + if (quantile !== null) { + val type = eClassMapper.TypeofEClass(trace, eClassInScope) + val knownInstances = knownElements.get(type) + val currentCount = if(knownInstances === null) 0 else knownInstances.size + val lowCount = Math.floor(modelSize * quantile.low) as int + val highCount = Math.ceil((modelSize + MODEL_SIZE_GAP) * quantile.high) as int + config.typeScopes.minNewElementsByType.put(type, lowCount - currentCount) + config.typeScopes.maxNewElementsByType.put(type, highCount - currentCount) + } + } + } + default: + throw new IllegalArgumentException("Unknown scope: " + script.scope) + } + } + + /* + * Copied from hu.bme.mit.inf.dslreasoner.application.execution.ScopeLoader.initialiseknownElements(LogicProblem, TypeScopes) + */ + private static def initializeKnownElements(LogicProblem p, TypeScopes s) { + val Map> res = new HashMap + + // 1. fill map with every types + for (t : p.types) { + res.put(t, new HashSet) + } + + // 2. fill map with every objects + for (definedType : p.types.filter(TypeDefinition)) { + val supertypes = CollectionsUtil.transitiveClosureStar(definedType)[supertypes] + for (supertype : supertypes) { + for (element : definedType.elements) { + res.get(supertype).add(element) + } + } + } + val partialModelContents = p.annotations.filter(PartialModelRelation2Assertion).map[target].toList.map [ + eAllContents.toIterable + ].flatten.toList + s.knownIntegers += partialModelContents.filter(IntLiteral).map[it.value] + s.knownReals += partialModelContents.filter(RealLiteral).map[it.value] + s.knownStrings += partialModelContents.filter(StringLiteral).map[it.value] + + res + } + + public static def void main(String[] args) { + if (args.length != 1) { + System.err.println("Missing measurement script name.") + System.exit(-1) + } + EMFPatternLanguageStandaloneSetup.doSetup + ViatraQueryEngineOptions.setSystemDefaultBackends(ReteBackendFactory.INSTANCE, ReteBackendFactory.INSTANCE, + ReteBackendFactory.INSTANCE) + Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl) + val config = readConfig(args.get(0)) + val runnner = new MeasurementScriptRunner(config) + runnner.run() + } + + static def readConfig(String scriptPath) { + val gson = new Gson + val reader = new FileReader(scriptPath) + try { + gson.fromJson(reader, MeasurementScript) + } finally { + reader.close + } + } + + @Data + private static class ExperimentResult { + String resultName + Statistics statistics + EObject model + } +} -- cgit v1.2.3-54-g00ecf From 957082776dbb7efed53a783c5e5be6b443a9bb86 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 27 Jun 2020 17:56:46 +0200 Subject: Fix scope + numerical propagation WIP --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5334 -> 5334 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1717 -> 1717 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2742 -> 2742 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2758 -> 2758 bytes .../hu.bme.mit.inf.dslreasoner.ilp.cbc/.classpath | 6 +- .../.settings/org.eclipse.jdt.core.prefs | 8 ++ .../lib/libviatracbc.so | Bin 33944 -> 46416 bytes .../MultiplicityGoalConstraintCalculator.xtend | 15 +-- .../cardinality/PolyhedronScopePropagator.xtend | 8 +- .../logic2viatra/cardinality/ScopePropagator.xtend | 14 +- .../rules/GoalConstraintProvider.xtend | 3 +- .../rules/RefinementRuleProvider.xtend | 150 ++++++++++++--------- .../PartialInterpretationInitialiser.xtend | 29 ++-- .../reasoner/ViatraReasonerConfiguration.xtend | 5 +- .../dse/BestFirstStrategyForModelGeneration.java | 22 +-- .../dse/ModelGenerationCompositeObjective.xtend | 2 +- .../viatrasolver/reasoner/dse/ScopeObjective.xtend | 2 +- .../case.study.familyTree.run/bin/.gitignore | 1 - .../inputs/SatelliteInstance.xmi | 2 +- .../src/run/RunGeneratorConfig.xtend | 6 +- 23 files changed, 136 insertions(+), 137 deletions(-) create mode 100644 Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index b5a7c99c..94c786eb 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index 9274eee0..46ab9b95 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index 8e8e8c70..27dc1dd4 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index 741776d1..d71f4f21 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index 73356e7f..801783da 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 24f61d80..30c2ff9e 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index eae3bd77..261f466c 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ diff --git a/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.classpath b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.classpath index e19039ae..93829d26 100644 --- a/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.classpath +++ b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.classpath @@ -1,10 +1,6 @@ - - - - - + diff --git a/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.settings/org.eclipse.jdt.core.prefs b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..9f6ece88 --- /dev/null +++ b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/lib/libviatracbc.so b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/lib/libviatracbc.so index 96289216..ba3cdc06 100755 Binary files a/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/lib/libviatracbc.so and b/Solvers/ILP-Solver/hu.bme.mit.inf.dslreasoner.ilp.cbc/lib/libviatracbc.so differ diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend index 034420d6..b28cd584 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend @@ -10,15 +10,13 @@ class MultiplicityGoalConstraintCalculator { val String targetRelationName val IQuerySpecification querySpecification var ViatraQueryMatcher matcher - val int minValue val boolean containment val int cost - public new(String targetRelationName, IQuerySpecification querySpecification, int minValue, boolean containment, int cost) { + public new(String targetRelationName, IQuerySpecification querySpecification, boolean containment, int cost) { this.targetRelationName = targetRelationName this.querySpecification = querySpecification this.matcher = null - this.minValue = minValue this.containment = containment this.cost = cost } @@ -27,7 +25,6 @@ class MultiplicityGoalConstraintCalculator { this.targetRelationName = other.targetRelationName this.querySpecification = other.querySpecification this.matcher = null - this.minValue = other.minValue this.containment = other.containment this.cost = other.cost } @@ -49,14 +46,8 @@ class MultiplicityGoalConstraintCalculator { var res = 0 val allMatches = this.matcher.allMatches for(match : allMatches) { - val existingMultiplicity = match.get(4) as Integer - if(existingMultiplicity < this.minValue) { - val missingMultiplicity = this.minValue-existingMultiplicity - res += missingMultiplicity - } -// if(missingMultiplicity!=0) { -// println(targetRelationName+ " missing multiplicity: "+missingMultiplicity) -// } + val missingMultiplicity = match.get(2) as Integer + res += missingMultiplicity } // if(res>0) // println(targetRelationName+ " all missing multiplicities: "+res + "*"+cost+"="+res*cost) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index 120fb18a..9b4dff0f 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -88,6 +88,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { val result = operator.saturate() if (result == PolyhedronSaturationResult.EMPTY) { cache.put(signature, PolyhedronSignature.EMPTY) +// println("INVALID") setScopesInvalid() } else { val resultSignature = polyhedron.createSignature @@ -110,11 +111,8 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } } - override propagateAdditionToRelation(Relation r) { - super.propagateAdditionToRelation(r) - if (relevantRelations.contains(r)) { - propagateAllScopeConstraints() - } + override isPropagationNeededAfterAdditionToRelation(Relation r) { + relevantRelations.contains(r) || super.isPropagationNeededAfterAdditionToRelation(r) } def resetBounds() { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 8f3a5bb0..8350c7f4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -114,21 +114,21 @@ class ScopePropagator { } } - def void propagateAdditionToRelation(Relation r) { - // Nothing to propagate. + def isPropagationNeededAfterAdditionToRelation(Relation r) { + false } private def removeOne(Scope scope) { - if (scope.maxNewElements === 0) { - throw new IllegalArgumentException('''Inconsistent object creation: «scope.targetTypeInterpretation»''') - } else if (scope.maxNewElements > 0) { - scope.maxNewElements = scope.maxNewElements - 1 - } if (scope.minNewElements > 0) { scope.minNewElements = scope.minNewElements - 1 } if (scope.minNewElementsHeuristic > 0) { scope.minNewElementsHeuristic = scope.minNewElementsHeuristic - 1 } + if (scope.maxNewElements > 0) { + scope.maxNewElements = scope.maxNewElements - 1 + } else if (scope.maxNewElements === 0) { + setScopesInvalid() + } } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend index 238ade5b..d2ee80dc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend @@ -15,9 +15,8 @@ class GoalConstraintProvider { val queries = entry.value val targetRelationName = constraint.relation.name val query = queries.unfinishedMultiplicityQuery - val minValue = constraint.lowerBound val containment = constraint.containment - res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, minValue, containment, 1) + res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1) } } return res 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 0b8a9019..863ee18b 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 @@ -32,9 +32,12 @@ import java.util.LinkedHashMap import java.util.LinkedList import java.util.List import java.util.Map +import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine import org.eclipse.viatra.query.runtime.api.GenericPatternMatch import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.emf.EMFScope import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRuleFactory import org.eclipse.xtend.lib.annotations.Data @@ -45,6 +48,8 @@ class RefinementRuleProvider { val extension PartialinterpretationFactory factory2 = PartialinterpretationFactory.eINSTANCE val extension LogiclanguageFactory factory3 = LogiclanguageFactory.eINSTANCE + var AdvancedViatraQueryEngine queryEngine + def canonizeName(String name) { return name.replace(' ','_') } @@ -60,6 +65,7 @@ class RefinementRuleProvider { { val res = new LinkedHashMap val recursiveObjectCreation = recursiveObjectCreation(p,i) + queryEngine = ViatraQueryEngine.on(new EMFScope(i)) as AdvancedViatraQueryEngine for(LHSEntry: patterns.refineObjectQueries.entrySet) { val containmentRelation = LHSEntry.key.containmentRelation val inverseRelation = LHSEntry.key.inverseContainment @@ -90,8 +96,7 @@ class RefinementRuleProvider { if(inverseRelation!== null) { ruleBuilder.action[match | statistics.incrementTransformationCount -// println(name) - val startTime = System.nanoTime +// println(name) //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation @@ -99,79 +104,89 @@ class RefinementRuleProvider { val typeInterpretation = match.get(4) as PartialComplexTypeInterpretation val container = match.get(5) as DefinedElement - createObjectActionWithContainmentAndInverse( - nameNewElement, - interpretation, - typeInterpretation, - container, - relationInterpretation, - inverseRelationInterpretation, - [createDefinedElement], - recursiceObjectCreations, - scopePropagator - ) - - val propagatorStartTime = System.nanoTime - statistics.addExecutionTime(propagatorStartTime-startTime) + queryEngine.delayUpdatePropagation [ + val startTime = System.nanoTime + createObjectActionWithContainmentAndInverse( + nameNewElement, + interpretation, + typeInterpretation, + container, + relationInterpretation, + inverseRelationInterpretation, + [createDefinedElement], + recursiceObjectCreations, + scopePropagator + ) + statistics.addExecutionTime(System.nanoTime-startTime) + ] // Scope propagation - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + queryEngine.delayUpdatePropagation [ + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + ] ] } else { ruleBuilder.action[match | statistics.incrementTransformationCount // println(name) - val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation val typeInterpretation = match.get(3) as PartialComplexTypeInterpretation val container = match.get(4) as DefinedElement - createObjectActionWithContainment( - nameNewElement, - interpretation, - typeInterpretation, - container, - relationInterpretation, - [createDefinedElement], - recursiceObjectCreations, - scopePropagator - ) - - val propagatorStartTime = System.nanoTime - statistics.addExecutionTime(propagatorStartTime-startTime) + queryEngine.delayUpdatePropagation [ + val startTime = System.nanoTime + createObjectActionWithContainment( + nameNewElement, + interpretation, + typeInterpretation, + container, + relationInterpretation, + [createDefinedElement], + recursiceObjectCreations, + scopePropagator + ) + statistics.addExecutionTime(System.nanoTime-startTime) + ] // Scope propagation - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + queryEngine.delayUpdatePropagation [ + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + ] ] } } else { ruleBuilder.action[match | statistics.incrementTransformationCount // println(name) - val startTime = System.nanoTime //val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val typeInterpretation = match.get(2) as PartialComplexTypeInterpretation - createObjectAction( - nameNewElement, - interpretation, - typeInterpretation, - [createDefinedElement], - recursiceObjectCreations, - scopePropagator - ) - - val propagatorStartTime = System.nanoTime - statistics.addExecutionTime(propagatorStartTime-startTime) + queryEngine.delayUpdatePropagation [ + val startTime = System.nanoTime + createObjectAction( + nameNewElement, + interpretation, + typeInterpretation, + [createDefinedElement], + recursiceObjectCreations, + scopePropagator + ) + statistics.addExecutionTime(System.nanoTime-startTime) + ] // Scope propagation - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + queryEngine.delayUpdatePropagation [ + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + ] ] } return ruleBuilder.build @@ -342,7 +357,7 @@ class RefinementRuleProvider { if (inverseRelation === null) { ruleBuilder.action [ match | statistics.incrementTransformationCount - val startTime = System.nanoTime + // println(name) // val problem = match.get(0) as LogicProblem // val interpretation = match.get(1) as PartialInterpretation @@ -350,19 +365,24 @@ class RefinementRuleProvider { val src = match.get(3) as DefinedElement val trg = match.get(4) as DefinedElement - createRelationLinkAction(src, trg, relationInterpretation) - - val propagatorStartTime = System.nanoTime - statistics.addExecutionTime(propagatorStartTime-startTime) + queryEngine.delayUpdatePropagation [ + val startTime = System.nanoTime + createRelationLinkAction(src, trg, relationInterpretation) + statistics.addExecutionTime(System.nanoTime-startTime) + ] // Scope propagation - scopePropagator.propagateAdditionToRelation(declaration) - statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { + queryEngine.delayUpdatePropagation [ + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + ] + } ] } else { ruleBuilder.action [ match | statistics.incrementTransformationCount - val startTime = System.nanoTime // println(name) // val problem = match.get(0) as LogicProblem // val interpretation = match.get(1) as PartialInterpretation @@ -371,14 +391,20 @@ class RefinementRuleProvider { val src = match.get(4) as DefinedElement val trg = match.get(5) as DefinedElement - createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation) - - val propagatorStartTime = System.nanoTime - statistics.addExecutionTime(propagatorStartTime-startTime) + queryEngine.delayUpdatePropagation [ + val startTime = System.nanoTime + createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation) + statistics.addExecutionTime(System.nanoTime-startTime) + ] // Scope propagation - scopePropagator.propagateAdditionToRelation(declaration) - statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { + queryEngine.delayUpdatePropagation [ + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) + ] + } ] } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend index d37acb6d..20ff58f2 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend @@ -2,19 +2,24 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput import hu.bme.mit.inf.dslreasoner.logic.model.builder.TypeScopes +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolLiteral import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringLiteral +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.SymbolicValue import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.logic.model.patterns.SupertypeStar import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partial2logicannotations.PartialModelRelation2Assertion -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BooleanElement import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.IntegerElement -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.NaryRelationLink import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialBooleanInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialIntegerInterpretation @@ -22,10 +27,10 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialRealInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialRelationInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialStringInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.RealElement import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.StringElement -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.UnaryElementRelationLink import java.math.BigDecimal import java.util.HashMap import java.util.Map @@ -35,14 +40,6 @@ import org.eclipse.viatra.query.runtime.emf.EMFScope import org.eclipse.xtend.lib.annotations.Data import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.SymbolicValue -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolLiteral -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringLiteral -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition @Data class Problem2PartialInterpretationTrace { Map type2Interpretation @@ -194,7 +191,7 @@ class PartialInterpretationInitialiser { interpretation.minNewElements = minNewElements interpretation.maxNewElements = maxNewElements // elements from problem are included - if(maxNewElements>0) { + if(maxNewElements != 0) { val newElements = createDefinedElement => [it.name = "New Objects"] interpretation.openWorldElements += newElements } @@ -213,12 +210,8 @@ class PartialInterpretationInitialiser { def private initialiseTypeScope(PartialTypeInterpratation interpretation, Integer min, Integer max) { val res = createScope res.targetTypeInterpretation = interpretation - if(min !== null) { - res.minNewElements = min - } - if(max !== null) { - res.maxNewElements = max - } + res.minNewElements = min ?: 0 + res.maxNewElements = max ?: -1 return res } 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 ddd25aac..e33a2590 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 @@ -58,13 +58,14 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var runIntermediateNumericalConsistencyChecks = true public var punishSize = true - public var scopeWeight = 1 - public var conaintmentWeight = 2 + public var scopeWeight = 2 + public var conaintmentWeight = 1 public var nonContainmentWeight = 1 public var unfinishedWFWeight = 1 public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) +// public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.BasicTypeHierarchy public var List hints = newArrayList diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index e529892c..09575384 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.PriorityQueue; import java.util.Random; +import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -76,7 +77,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { private volatile boolean isInterrupted = false; private ModelResult modelResultByInternalSolver = null; private Random random = new Random(); - //private Collection> matchers; +// private Collection> matchers; public ActivationSelector activationSelector = new EvenActivationSelector(random); public ViatraReasonerSolutionSaver solutionSaver; public NumericSolver numericSolver; @@ -100,7 +101,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { this.method = method; this.solutionSaver = solutionSaver; this.numericSolver = numericSolver; - //logger.setLevel(Level.DEBUG); +// logger.setLevel(Level.DEBUG); } public int getNumberOfStatecoderFail() { @@ -136,7 +137,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // ViatraQueryEngine engine = context.getQueryEngine(); // matchers = new LinkedList>(); // for(IQuerySpecification> p : this.method.getAllPatterns()) { -// //System.out.println(p.getSimpleName()); // ViatraQueryMatcher matcher = p.getMatcher(engine); // matchers.add(matcher); // } @@ -154,13 +154,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { @Override public void explore() { -// System.out.println("press enter"); -// try { -// new BufferedReader(new InputStreamReader(System.in)).readLine(); -// } catch (IOException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } this.explorationStarted=System.nanoTime(); if (!checkGlobalConstraints()) { logger.info("Global contraint is not satisifed in the first state. Terminate."); @@ -219,10 +212,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { while (!isInterrupted && !configuration.progressMonitor.isCancelled() && iterator.hasNext()) { final Object nextActivation = iterator.next(); -// if (!iterator.hasNext()) { -// logger.debug("Last untraversed activation of the state."); -// trajectoiresToExplore.remove(currentTrajectoryWithfitness); -// } logger.debug("Executing new activation: " + nextActivation); context.executeAcitvationId(nextActivation); method.getStatistics().incrementDecisionCount(); @@ -230,10 +219,9 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { visualiseCurrentState(); // for(ViatraQueryMatcher matcher : matchers) { // int c = matcher.countMatches(); -// if(c>=100) { +// if(c>=1) { // System.out.println(c+ " " +matcher.getPatternName()); -// } -// +// } // } boolean consistencyCheckResult = checkConsistency(currentTrajectoryWithFitness); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend index d2faaa65..481f4ce1 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend @@ -112,7 +112,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { override isHardObjective() { true } - override satisifiesHardObjective(Double fitness) { fitness <= 0.001 } + override satisifiesHardObjective(Double fitness) { fitness <= 0.9 } override setComparator(Comparator comparator) { throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend index 69a734f8..7abc5cb8 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend @@ -25,7 +25,7 @@ class ScopeObjective implements IObjective{ val interpretation = context.model as PartialInterpretation var res = interpretation.minNewElementsHeuristic.doubleValue for(scope : interpretation.scopes) { - res += scope.minNewElementsHeuristic*2 + res += scope.minNewElementsHeuristic } return res } diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore deleted file mode 100644 index 7050a7e3..00000000 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/queries/ diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/SatelliteInstance.xmi b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/SatelliteInstance.xmi index 3d07a199..66512878 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/SatelliteInstance.xmi +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/SatelliteInstance.xmi @@ -4,4 +4,4 @@ xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:satellite="http://www.example.org/satellite" - xsi:schemaLocation="http://www.example.org/satellite ../model/satellite.ecore"/> + xsi:schemaLocation="http://www.example.org/satellite ../../hu.bme.mit.inf.dslreasoner.domains.satellite/model/satellite.ecore"/> diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/RunGeneratorConfig.xtend b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/RunGeneratorConfig.xtend index 20eed2e2..e4d6fe9f 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/RunGeneratorConfig.xtend +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/RunGeneratorConfig.xtend @@ -12,7 +12,9 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.RuntimeEn import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ScopeSpecification import hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor +import hu.bme.mit.inf.dslreasoner.application.execution.StandardOutputBasedScriptConsole import java.io.File +import java.io.PrintWriter import java.text.SimpleDateFormat import java.util.Date import org.apache.commons.cli.BasicParser @@ -23,8 +25,6 @@ import org.apache.commons.cli.Option import org.apache.commons.cli.Options import org.apache.commons.cli.ParseException import org.eclipse.core.runtime.NullProgressMonitor -import com.google.common.io.Files -import java.io.PrintWriter class RunGeneratorConfig { static var SIZE_LB = 20 @@ -102,7 +102,7 @@ class RunGeneratorConfig { val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm") val formattedDate = format.format(date) - val executor = new ScriptExecutor + val executor = new ScriptExecutor(StandardOutputBasedScriptConsole.FACTORY) val path = "config//generic" + DOMAIN + ".vsconfig" var ConfigurationScript config = StandaloneScriptExecutor.loadScript(path) -- cgit v1.2.3-54-g00ecf From 07ae9155ce0ab9407566b075356f9b7220ee8380 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 28 Jun 2020 20:33:48 +0200 Subject: Fix scope + numerical solver interaction --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5334 -> 5334 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1717 -> 1717 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2742 -> 2742 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2758 -> 2758 bytes .../ModelGenerationMethodProvider.xtend | 6 + .../MultiplicityGoalConstraintCalculator.xtend | 22 +- .../cardinality/PolyhedronScopePropagator.xtend | 133 +- .../cardinality/RelationConstraintCalculator.xtend | 33 +- .../RemainingMultiplicityCalculator.xtend | 111 + .../logic2viatra/cardinality/ScopePropagator.xtend | 5 + .../logic2viatra/patterns/PatternProvider.xtend | 11 +- .../logic2viatra/patterns/UnfinishedIndexer.xtend | 189 +- .../rules/GoalConstraintProvider.xtend | 5 +- .../viatrasolver/reasoner/ViatraReasoner.xtend | 2 +- .../model/TaxationWithRoot.aird | 10302 +++++++++---------- 18 files changed, 5436 insertions(+), 5383 deletions(-) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index 94c786eb..11aee788 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index 46ab9b95..d0ad3ab3 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index 27dc1dd4..173a7c4d 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index d71f4f21..ad60e239 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index 801783da..01242ec7 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 30c2ff9e..1bdcce7f 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index 261f466c..2c9fbbb2 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ 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 6fbbc779..78eda150 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 @@ -24,9 +24,12 @@ import java.util.Collection import java.util.List import java.util.Map import java.util.Set +import org.eclipse.viatra.query.runtime.api.GenericQueryGroup import org.eclipse.viatra.query.runtime.api.IPatternMatch import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.emf.EMFScope import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule @@ -122,6 +125,9 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, writeFiles) + val queryEngine = ViatraQueryEngine.on(new EMFScope(emptySolution)) + GenericQueryGroup.of(queries.allQueries).prepare(queryEngine) + val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(logicProblem, emptySolution, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend index b28cd584..392ab3ee 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend @@ -3,29 +3,31 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality import org.eclipse.emf.common.notify.Notifier import org.eclipse.viatra.query.runtime.api.IQuerySpecification import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine -import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher import org.eclipse.viatra.query.runtime.emf.EMFScope class MultiplicityGoalConstraintCalculator { val String targetRelationName val IQuerySpecification querySpecification - var ViatraQueryMatcher matcher + var MultiplicityCalculator calculator val boolean containment + val int lowerBound val int cost - public new(String targetRelationName, IQuerySpecification querySpecification, boolean containment, int cost) { + new(String targetRelationName, IQuerySpecification querySpecification, boolean containment, int lowerBound, int cost) { this.targetRelationName = targetRelationName this.querySpecification = querySpecification - this.matcher = null + this.calculator = null this.containment = containment + this.lowerBound = lowerBound this.cost = cost } new(MultiplicityGoalConstraintCalculator other) { this.targetRelationName = other.targetRelationName this.querySpecification = other.querySpecification - this.matcher = null + this.calculator = null this.containment = other.containment + this.lowerBound = other.lowerBound this.cost = other.cost } @@ -39,16 +41,12 @@ class MultiplicityGoalConstraintCalculator { def init(Notifier notifier) { val engine = ViatraQueryEngine.on(new EMFScope(notifier)) - matcher = querySpecification.getMatcher(engine) + val matcher = querySpecification.getMatcher(engine) + calculator = RemainingMultiplicityCalculator.of(matcher, lowerBound) } def calculateValue() { - var res = 0 - val allMatches = this.matcher.allMatches - for(match : allMatches) { - val missingMultiplicity = match.get(2) as Integer - res += missingMultiplicity - } + val res = calculator.multiplicity // if(res>0) // println(targetRelationName+ " all missing multiplicities: "+res + "*"+cost+"="+res*cost) return res*cost diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index 9b4dff0f..db22b95c 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -33,7 +33,7 @@ import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { static val CACHE_SIZE = 10000 - + val boolean updateHeuristic val Map scopeBounds val LinearBoundedExpression topLevelBounds @@ -185,22 +185,6 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { if (bounds.upperBound !== null && bounds.upperBound < 0) { throw new IllegalArgumentException("Negative upper bound: " + bounds) } - } - - private static def getCalculatedMultiplicity(ViatraQueryMatcher matcher, - PartialInterpretation p) { - val match = matcher.newEmptyMatch - match.set(0, p.problem) - match.set(1, p) - val iterator = matcher.streamAllMatches(match).iterator - if (!iterator.hasNext) { - return null - } - val value = iterator.next.get(2) as Integer - if (iterator.hasNext) { - throw new IllegalArgumentException("Multiplicity calculation query has more than one match") - } - value } @FinalFieldsConstructor @@ -243,7 +227,12 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { IQuerySpecification> hasElementInContainmentQuery, Map>> allPatternsByName, Collection hints, int maximumNuberOfNewNodes) { - infinity = maximumNuberOfNewNodes * INFINITY_SCALE + infinity = if (maximumNuberOfNewNodes <= Integer.MAX_VALUE / INFINITY_SCALE) { + maximumNuberOfNewNodes * INFINITY_SCALE + } else { + Integer.MAX_VALUE + } + queryEngine = ViatraQueryEngine.on(new EMFScope(p)) this.allPatternsByName = allPatternsByName updatersBuilder = ImmutableList.builder @@ -254,7 +243,7 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { buildConstainmentRootConstraints(containmentConstraints.keySet, hasElementInContainmentQuery) for (pair : constraints.entrySet) { val constraint = pair.key - if (!constraint.containment) { + if (!constraint.containment && !constraint.container) { buildNonContainmentConstraints(constraint, pair.value) } } @@ -289,8 +278,8 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { val typeCoefficients = subtypeDimensions.get(containedType) val orphansLowerBoundCoefficients = new HashMap(typeCoefficients) val orphansUpperBoundCoefficients = new HashMap(typeCoefficients) - val unfinishedMultiplicitiesMatchersBuilder = ImmutableList.builder - val remainingContentsQueriesBuilder = ImmutableList.builder + val unfinishedMultiplicitiesBuilder = ImmutableList.builder + val remainingContentsBuilder = ImmutableList.builder for (pair : constraints) { val constraint = pair.key val containerCoefficients = subtypeDimensions.get(constraint.sourceType) @@ -301,23 +290,21 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { } orphansUpperBoundCoefficients.addCoefficients(-constraint.lowerBound, containerCoefficients) val queries = pair.value - if (constraint.constrainsUnfinished) { - if (queries.unfinishedMultiplicityQuery === null) { - throw new IllegalArgumentException( - "Containment constraints need unfinished multiplicity queries") + if (queries.existingMultiplicityQuery !== null) { + val matcher = queries.existingMultiplicityQuery.getMatcher(queryEngine) + if (constraint.constrainsUnfinished) { + unfinishedMultiplicitiesBuilder.add( + RemainingMultiplicityCalculator.of(matcher, constraint.lowerBound)) } - unfinishedMultiplicitiesMatchersBuilder.add( - queries.unfinishedMultiplicityQuery.getMatcher(queryEngine)) - } - if (queries.remainingContentsQuery === null) { - throw new IllegalArgumentException("Containment constraints need remaining contents queries") + remainingContentsBuilder.add(RemainingMultiplicityCalculator.of(matcher, constraint.upperBound)) + } else if (constraint.constrainsUnfinished) { + throw new IllegalArgumentException("Containment constraints need multiplicity queries") } - remainingContentsQueriesBuilder.add(queries.remainingContentsQuery.getMatcher(queryEngine)) } val orphanLowerBound = orphansLowerBoundCoefficients.toExpression val orphanUpperBound = orphansUpperBoundCoefficients.toExpression - val updater = new ContainmentConstraintUpdater(containedType.name, orphanLowerBound, orphanUpperBound, - unfinishedMultiplicitiesMatchersBuilder.build, remainingContentsQueriesBuilder.build) + val updater = new ContainmentConstraintUpdater(orphanLowerBound, orphanUpperBound, + unfinishedMultiplicitiesBuilder.build, remainingContentsBuilder.build) updatersBuilder.add(updater) } @@ -336,17 +323,21 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { private def buildNonContainmentConstraints(RelationMultiplicityConstraint constraint, UnifinishedMultiplicityQueries queries) { + if (!constraint.reference) { + return + } if (constraint.constrainsRemainingInverse) { - if (queries.unfinishedMultiplicityQuery === null) { - throw new IllegalArgumentException("Reference constraints need unfinished multiplicity queries") - } - val unfinishedMultiplicityMatcher = queries.unfinishedMultiplicityQuery.getMatcher(queryEngine) - if (queries.remainingInverseMultiplicityQuery === null) { - throw new IllegalArgumentException( - "Reference constraints need remaining inverse multiplicity queries") + if (queries.getExistingMultiplicityQuery === null) { + throw new IllegalArgumentException("Reference constraints need unfinished multiplicity queries: " + + constraint.relation) } - val remainingInverseMultiplicityMatcher = queries.remainingInverseMultiplicityQuery.getMatcher( + val existingMultiplicityMatcher = queries.getExistingMultiplicityQuery.getMatcher(queryEngine) + val unfinishedMultiplicityCalculator = RemainingMultiplicityCalculator.of(existingMultiplicityMatcher, + constraint.lowerBound) + val existingInverseMultiplicityMatcher = queries.existingInverseMultiplicityQuery.getMatcher( queryEngine) + val remainingInverseMultiplicityCalculator = new RemainingInverseMultiplicityCalculator( + existingInverseMultiplicityMatcher, constraint.upperBound) val availableMultiplicityCoefficients = new HashMap availableMultiplicityCoefficients.addCoefficients(constraint.inverseUpperBound, subtypeDimensions.get(constraint.targetType)) @@ -354,18 +345,18 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { subtypeDimensions.get(constraint.targetType)) val availableMultiplicity = availableMultiplicityCoefficients.toExpression updatersBuilder.add( - new UnfinishedMultiplicityConstraintUpdater(constraint.relation.name, availableMultiplicity, - unfinishedMultiplicityMatcher, remainingInverseMultiplicityMatcher)) + new UnfinishedMultiplicityConstraintUpdater(availableMultiplicity, unfinishedMultiplicityCalculator, + remainingInverseMultiplicityCalculator)) } if (constraint.constrainsUnrepairable) { - if (queries.unrepairableMultiplicityQuery === null) { - throw new IllegalArgumentException("Reference constraints need unrepairable multiplicity queries") + if (queries.existingMultiplicityQuery.parameters.size < 5) { + throw new IllegalArgumentException("Reference constraints need repairable multiplicity queries: " + + constraint.relation) } - val unrepairableMultiplicityMatcher = queries.unrepairableMultiplicityQuery.getMatcher(queryEngine) + val matcher = queries.existingMultiplicityQuery.getMatcher(queryEngine) + val calculator = new UnrepairableMultiplicityCalculator(matcher, constraint.lowerBound) val targetTypeCardinality = typeBounds.get(constraint.targetType) - updatersBuilder.add( - new UnrepairableMultiplicityConstraintUpdater(constraint.relation.name, targetTypeCardinality, - unrepairableMultiplicityMatcher)) + updatersBuilder.add(new UnrepairableMultiplicityConstraintUpdater(targetTypeCardinality, calculator)) } } @@ -470,11 +461,10 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { @FinalFieldsConstructor private static class ContainmentConstraintUpdater implements RelationConstraintUpdater { - val String name val LinearBoundedExpression orphansLowerBound val LinearBoundedExpression orphansUpperBound - val List> unfinishedMultiplicitiesMatchers - val List> remainingContentsQueries + val List> unfinishedMultiplicities + val List> remainingContents override update(PartialInterpretation p) { tightenLowerBound(p) @@ -483,12 +473,9 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { private def tightenLowerBound(PartialInterpretation p) { var int sum = 0 - for (matcher : remainingContentsQueries) { - val value = matcher.getCalculatedMultiplicity(p) - if (value === null) { - throw new IllegalArgumentException("Remaining contents count is missing for " + name) - } - if (value == -1) { + for (calculator : remainingContents) { + val value = calculator.getMultiplicity(p) + if (value < 0) { // Infinite upper bound, no need to tighten. return } @@ -499,11 +486,8 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { private def tightenUpperBound(PartialInterpretation p) { var int sum = 0 - for (matcher : unfinishedMultiplicitiesMatchers) { - val value = matcher.getCalculatedMultiplicity(p) - if (value === null) { - throw new IllegalArgumentException("Unfinished multiplicity is missing for " + name) - } + for (calculator : unfinishedMultiplicities) { + val value = calculator.getMultiplicity(p) sum += value } orphansUpperBound.tightenLowerBound(sum) @@ -531,20 +515,13 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { @FinalFieldsConstructor private static class UnfinishedMultiplicityConstraintUpdater implements RelationConstraintUpdater { - val String name val LinearBoundedExpression availableMultiplicityExpression - val ViatraQueryMatcher unfinishedMultiplicityMatcher - val ViatraQueryMatcher remainingInverseMultiplicityMatcher + val MultiplicityCalculator unfinishedMultiplicityCalculator + val MultiplicityCalculator remainingInverseMultiplcityCalculator override update(PartialInterpretation p) { - val unfinishedMultiplicity = unfinishedMultiplicityMatcher.getCalculatedMultiplicity(p) - if (unfinishedMultiplicity === null) { - throw new IllegalArgumentException("Unfinished multiplicity is missing for " + name) - } - val remainingInverseMultiplicity = remainingInverseMultiplicityMatcher.getCalculatedMultiplicity(p) - if (remainingInverseMultiplicity === null) { - throw new IllegalArgumentException("Remaining inverse multiplicity is missing for " + name) - } + val unfinishedMultiplicity = unfinishedMultiplicityCalculator.getMultiplicity(p) + val remainingInverseMultiplicity = remainingInverseMultiplcityCalculator.getMultiplicity(p) val int requiredMultiplicity = unfinishedMultiplicity - remainingInverseMultiplicity availableMultiplicityExpression.tightenLowerBound(requiredMultiplicity) } @@ -552,15 +529,11 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { @FinalFieldsConstructor private static class UnrepairableMultiplicityConstraintUpdater implements RelationConstraintUpdater { - val String name val LinearBoundedExpression targetCardinalityExpression - val ViatraQueryMatcher unrepairableMultiplicityMatcher + val MultiplicityCalculator calculator override update(PartialInterpretation p) { - val value = unrepairableMultiplicityMatcher.getCalculatedMultiplicity(p) - if (value === null) { - throw new IllegalArgumentException("Unrepairable multiplicity is missing for " + name) - } + val value = calculator.getMultiplicity(p) targetCardinalityExpression.tightenLowerBound(value) } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend index 3e4fea8a..7fec452f 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend @@ -46,11 +46,11 @@ class RelationMultiplicityConstraint { def constrainsUnrepairable() { // TODO Optimize the unrepairable matches computation, // or come up with a heuristic when does computing unrepairables worth the overhead. - constrainsUnfinished && canHaveMultipleSourcesPerTarget && false + constrainsUnfinished && canHaveMultipleSourcesPerTarget && reference } def constrainsRemainingInverse() { - lowerBound >= 1 && !containment && inverseUpperBoundFinite + lowerBound >= 1 && !containment && !container && inverseUpperBoundFinite && reference } def constrainsRemainingContents() { @@ -61,6 +61,18 @@ class RelationMultiplicityConstraint { constrainsUnfinished || constrainsUnrepairable || constrainsRemainingInverse || constrainsRemainingContents } + def isSourceTypeComplex() { + getParamTypeReference(0) instanceof ComplexTypeReference + } + + def isTargetTypeComplex() { + getParamTypeReference(1) instanceof ComplexTypeReference + } + + def isReference() { + sourceTypeComplex && targetTypeComplex + } + def getSourceType() { getParamType(0) } @@ -69,15 +81,20 @@ class RelationMultiplicityConstraint { getParamType(1) } - private def getParamType(int i) { + private def getParamTypeReference(int i) { val parameters = relation.parameters if (i < parameters.size) { - val firstParam = parameters.get(i) - if (firstParam instanceof ComplexTypeReference) { - return firstParam.referred - } + return parameters.get(i) + } + throw new IllegalArgumentException("Argument index out of range") + } + + private def getParamType(int i) { + val reference = getParamTypeReference(i) + if (reference instanceof ComplexTypeReference) { + return reference.referred } - throw new IllegalArgumentException("Constraint with unknown source type") + throw new IllegalArgumentException("Constraint with primitive type") } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend new file mode 100644 index 00000000..48b52d28 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend @@ -0,0 +1,111 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality + +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.util.Iterator +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +@FinalFieldsConstructor +abstract class MultiplicityCalculator { + val ViatraQueryMatcher matcher + + def getMultiplicity() { + val iterator = matcher.streamAllMatches.iterator + getMultiplicity(iterator) + } + + def getMultiplicity(PartialInterpretation interpretation) { + val partialMatch = matcher.newEmptyMatch + partialMatch.set(0, interpretation.problem) + partialMatch.set(1, interpretation) + val iterator = matcher.streamAllMatches(partialMatch).iterator + getMultiplicity(iterator) + } + + protected def int getMultiplicity(Iterator iterator) +} + +class RemainingMultiplicityCalculator extends MultiplicityCalculator { + val int bound + + @FinalFieldsConstructor + private new() { + } + + protected override getMultiplicity(Iterator iterator) { + var res = 0 + while (iterator.hasNext) { + val match = iterator.next + val existingMultiplicity = match.get(3) as Integer + if (existingMultiplicity < bound) { + res += bound - existingMultiplicity + } + } + res + } + + static def of(ViatraQueryMatcher matcher, int bound) { + if (bound < 0) { + new RemainingInfiniteMultiplicityCalculator(matcher) + } else { + new RemainingMultiplicityCalculator(matcher, bound) + } + } +} + +package class RemainingInfiniteMultiplicityCalculator extends MultiplicityCalculator { + + @FinalFieldsConstructor + package new() { + } + + protected override getMultiplicity(Iterator iterator) { + if (iterator.hasNext) { + -1 + } else { + 0 + } + } +} + +@FinalFieldsConstructor +class UnrepairableMultiplicityCalculator extends MultiplicityCalculator { + val int lowerBound + + override protected getMultiplicity(Iterator iterator) { + var res = 0 + while (iterator.hasNext) { + val match = iterator.next + val existingMultiplicity = match.get(3) as Integer + if (existingMultiplicity < lowerBound) { + val missingMultiplcity = lowerBound - existingMultiplicity + val numerOfRepairMatches = match.get(4) as Integer + val unrepairableMultiplicty = missingMultiplcity - numerOfRepairMatches + if (unrepairableMultiplicty > res) { + res = unrepairableMultiplicty + } + } + } + res + } +} + +@FinalFieldsConstructor +class RemainingInverseMultiplicityCalculator extends MultiplicityCalculator { + val int upperBound + + override protected getMultiplicity(Iterator iterator) { + var res = 0 + while (iterator.hasNext) { + val match = iterator.next + val existingMultiplicity = match.get(3) as Integer + if (existingMultiplicity < upperBound) { + val availableMultiplicity = upperBound - existingMultiplicity + val numberOfRepairMatches = match.get(4) as Integer + res += Math.min(availableMultiplicity, numberOfRepairMatches) + } + } + res + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 8350c7f4..132ca8e8 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -4,6 +4,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialPrimitiveInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.Scope import java.util.HashMap @@ -80,6 +81,10 @@ class ScopePropagator { } def decrementTypeScope(PartialTypeInterpratation t) { + val isPrimitive = t instanceof PartialPrimitiveInterpretation || t === null + if (isPrimitive) { + return + } // println('''Adding to «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') val targetScope = type2Scope.get(t) if (targetScope !== null) { 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 ac4a0855..2f7c9e2d 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 @@ -53,10 +53,8 @@ class ModalPatternQueries { @Data class UnifinishedMultiplicityQueries { - val IQuerySpecification> unfinishedMultiplicityQuery - val IQuerySpecification> unrepairableMultiplicityQuery - val IQuerySpecification> remainingInverseMultiplicityQuery - val IQuerySpecification> remainingContentsQuery + val IQuerySpecification> existingMultiplicityQuery + val IQuerySpecification> existingInverseMultiplicityQuery } class PatternProvider { @@ -108,9 +106,8 @@ class PatternProvider { val unfinishedMultiplicities = patternGenerator.unfinishedIndexer.getUnfinishedMultiplicityQueries(relationConstraints.multiplicityConstraints) val multiplicityConstraintQueries = unfinishedMultiplicities.mapValues [ - new UnifinishedMultiplicityQueries(unfinishedMultiplicityQueryName?.lookup(queries), - unrepairableMultiplicityQueryName?.lookup(queries), - remainingInverseMultiplicityQueryName?.lookup(queries), remainingContentsQueryName?.lookup(queries)) + new UnifinishedMultiplicityQueries(existingMultiplicityQueryName?.lookup(queries), + existingInverseMultiplicityQueryName?.lookup(queries)) ] val hasElementInContainmentQuery = patternGenerator.typeRefinementGenerator.hasElementInContainmentName.lookup( queries) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend index a8a07756..65ad3d48 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnfinishedIndexer.xtend @@ -14,10 +14,8 @@ import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* @Data class UnifinishedMultiplicityQueryNames { - val String unfinishedMultiplicityQueryName - val String unrepairableMultiplicityQueryName - val String remainingInverseMultiplicityQueryName - val String remainingContentsQueryName + val String existingMultiplicityQueryName + val String existingInverseMultiplicityQueryName } class UnfinishedIndexer { @@ -58,147 +56,94 @@ class UnfinishedIndexer { def generateUnfinishedMultiplicityQueries(List constraints, Map fqn2PQuery) ''' «FOR constraint : constraints» - «IF constraint.constrainsUnfinished» - private pattern «unfinishedMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, missingMultiplicity:java Integer) { + «IF constraint.shouldIndexExistingMultiplicites(indexUpperMultiplicities)» + private pattern «existingMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, numberOfExistingReferences:java Integer«IF constraint.shouldIndexRepairMultiplcities(indexUpperMultiplicities)», numberOfRepairMatches: java Integer«ENDIF») { find interpretation(problem,interpretation); find mustExist(problem,interpretation,object); «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» - check(numberOfExistingReferences < «constraint.lowerBound»); - missingMultiplicity == eval(«constraint.lowerBound»-numberOfExistingReferences); - } - - pattern «unfinishedMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, missingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - missingMultiplicity == sum find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); + «IF constraint.shouldIndexRepairMultiplcities(indexUpperMultiplicities)» + numberOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, object, _); + «ENDIF» } «ENDIF» - «IF indexUpperMultiplicities» - «IF constraint.constrainsUnrepairable || constraint.constrainsRemainingInverse» - private pattern «repairMatchName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, source:DefinedElement, target:DefinedElement) { - «IF base.isRepresentative(constraint.relation, constraint.inverseRelation) && constraint.relation instanceof RelationDeclaration» - «base.relationRefinementGenerator.referRefinementQuery(constraint.relation as RelationDeclaration, constraint.inverseRelation, "_", "_", "source", "target")» - «ELSE» - «IF base.isRepresentative(constraint.inverseRelation, constraint.relation) && constraint.inverseRelation instanceof RelationDeclaration» - «base.relationRefinementGenerator.referRefinementQuery(constraint.inverseRelation as RelationDeclaration, constraint.relation, "_", "_", "target", "source")» - «ELSE» - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,source); - «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» - find mustExist(problem,interpretation,target); - «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» - neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» - «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» - «ENDIF» - «ENDIF» - } - «ENDIF» - - «IF constraint.constrainsUnrepairable» - private pattern «unrepairableMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, unrepairableMultiplicity:java Integer) { - find «unfinishedMultiplicityName(constraint)»_helper(problem, interpretation, object, missingMultiplicity); - numberOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, object, _); - check(numberOfRepairMatches < missingMultiplicity); - unrepairableMultiplicity == eval(missingMultiplicity-numberOfRepairMatches); - } - - private pattern «unrepairableMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, unrepairableMultiplicity:java Integer) { - find interpretation(problem,interpretation); - unrepairableMultiplicity == max find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); - } or { - find interpretation(problem,interpretation); - neg find «unrepairableMultiplicityName(constraint)»_helper(problem, interpretation, _, _); - unrepairableMultiplicity == 0; - } - «ENDIF» - - «IF constraint.constrainsRemainingInverse» - private pattern «remainingMultiplicityName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,object); - «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"object")» - numberOfExistingReferences == count «base.referRelation(constraint.relation,"_","object",Modality.MUST,fqn2PQuery)» - check(numberOfExistingReferences < «constraint.inverseUpperBound»); - numberOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, _, object); - remainingMultiplicity == eval(Math.min(«constraint.inverseUpperBound»-numberOfExistingReferences, numberOfRepairMatches)); - } - - pattern «remainingMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - remainingMultiplicity == sum find «remainingMultiplicityName(constraint)»_helper(problem, interpretation, _, #_); - } - «ENDIF» - - «IF constraint.constrainsRemainingContents» - «IF constraint.upperBoundFinite» - private pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, remainingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,object); - «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» - numberOfExistingReferences == count «base.referRelation(constraint.relation,"object","_",Modality.MUST,fqn2PQuery)» - check(numberOfExistingReferences < «constraint.upperBound»); - remainingMultiplicity == eval(«constraint.upperBound»-numberOfExistingReferences); - } - - pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - remainingMultiplicity == sum find «remainingContentsName(constraint)»_helper(problem, interpretation, _, #_); - } + «IF constraint.shouldIndexRepairMatches(indexUpperMultiplicities)» + private pattern «repairMatchName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, source:DefinedElement, target:DefinedElement) { + «IF constraint.containment || constraint.container» + «repairMatchFallback(constraint, fqn2PQuery)» + «ELSEIF base.isRepresentative(constraint.relation, constraint.inverseRelation) && constraint.relation instanceof RelationDeclaration» + «base.relationRefinementGenerator.referRefinementQuery(constraint.relation as RelationDeclaration, constraint.inverseRelation, "_", "_", "source", "target")» + «ELSEIF base.isRepresentative(constraint.inverseRelation, constraint.relation) && constraint.inverseRelation instanceof RelationDeclaration» + «base.relationRefinementGenerator.referRefinementQuery(constraint.inverseRelation as RelationDeclaration, constraint.relation, "_", "_", "target", "source")» «ELSE» - pattern «remainingContentsName(constraint)»_helper(problem:LogicProblem, interpretation:PartialInterpretation) { - find interpretation(problem,interpretation); - find mustExist(problem,interpretation,object); - «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"object")» - } - - pattern «remainingContentsName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, remainingMultiplicity:java Integer) { - find interpretation(problem,interpretation); - find «remainingContentsName(constraint)»_helper(problem, interpretation); - remainingMultiplicity == -1; - } or { - find interpretation(problem,interpretation); - neg find «remainingContentsName(constraint)»_helper(problem, interpretation); - remainingMultiplicity == 0; - } + «repairMatchFallback(constraint, fqn2PQuery)» «ENDIF» - «ENDIF» + } + «ENDIF» + + «IF constraint.shouldIndexInverseMultiplicites(indexUpperMultiplicities)» + private pattern «existingInverseMultiplicityName(constraint)»(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement, numberOfExistingReferences:java Integer, numberOfRepairMatches: java Integer) { + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,object); + «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"object")» + numberOfExistingReferences == count «base.referRelation(constraint.relation,"_","object",Modality.MUST,fqn2PQuery)» + numberOfRepairMatches == count find «repairMatchName(constraint)»(problem, interpretation, _, object); + } «ENDIF» «ENDFOR» ''' - def String unfinishedMultiplicityName( - RelationMultiplicityConstraint constraint) '''unfinishedLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' + private def repairMatchFallback(RelationMultiplicityConstraint constraint, Map fqn2PQuery) ''' + find interpretation(problem,interpretation); + find mustExist(problem,interpretation,source); + «base.typeIndexer.referInstanceOf(constraint.sourceType,Modality::MUST,"source")» + find mustExist(problem,interpretation,target); + «base.typeIndexer.referInstanceOf(constraint.targetType,Modality::MUST,"target")» + neg «base.referRelation(constraint.relation,"source","target",Modality.MUST,fqn2PQuery)» + «base.referRelation(constraint.relation,"source","target",Modality.MAY,fqn2PQuery)» + ''' + + def String existingMultiplicityName( + RelationMultiplicityConstraint constraint) '''existingMultiplicity_«base.canonizeName(constraint.relation.name)»''' - def String unrepairableMultiplicityName( - RelationMultiplicityConstraint constraint) '''unrepairableLowerMultiplicity_«base.canonizeName(constraint.relation.name)»''' + def String existingInverseMultiplicityName( + RelationMultiplicityConstraint constraint) '''existingInverseMultiplicity_«base.canonizeName(constraint.relation.name)»''' private def String repairMatchName( RelationMultiplicityConstraint constraint) '''repair_«base.canonizeName(constraint.relation.name)»''' - def String remainingMultiplicityName( - RelationMultiplicityConstraint constraint) '''remainingInverseUpperMultiplicity_«base.canonizeName(constraint.relation.name)»''' - - def String remainingContentsName( - RelationMultiplicityConstraint constraint) '''remainingContents_«base.canonizeName(constraint.relation.name)»''' - def getUnfinishedMultiplicityQueries(List constraints) { constraints.toInvertedMap [ constraint | new UnifinishedMultiplicityQueryNames( - if(constraint.constrainsUnfinished) unfinishedMultiplicityName(constraint) else null, - if (indexUpperMultiplicities && constraint.constrainsUnrepairable) - unrepairableMultiplicityName(constraint) - else - null, - if (indexUpperMultiplicities && constraint.constrainsRemainingInverse) - remainingMultiplicityName(constraint) - else - null, - if (indexUpperMultiplicities && constraint.constrainsRemainingContents) - remainingContentsName(constraint) - else + if (constraint.shouldIndexExistingMultiplicites(indexUpperMultiplicities)) { + existingMultiplicityName(constraint) + } else { + null + }, + if (constraint.shouldIndexInverseMultiplicites(indexUpperMultiplicities)) { + existingInverseMultiplicityName(constraint) + } else { null + } ) ] } + + static def shouldIndexExistingMultiplicites(RelationMultiplicityConstraint it, boolean indexUpperMultiplicities) { + constrainsUnfinished || (indexUpperMultiplicities && constrainsRemainingContents) + } + + static def shouldIndexRepairMultiplcities(RelationMultiplicityConstraint it, boolean indexUpperMultiplicities) { + shouldIndexExistingMultiplicites(indexUpperMultiplicities) && constrainsUnrepairable + } + + static def shouldIndexInverseMultiplicites(RelationMultiplicityConstraint it, boolean indexUpperMultiplicities) { + indexUpperMultiplicities && constrainsRemainingInverse + } + + static def shouldIndexRepairMatches(RelationMultiplicityConstraint it, boolean indexUpperMultiplicities) { + shouldIndexRepairMultiplcities(indexUpperMultiplicities) || + shouldIndexInverseMultiplicites(indexUpperMultiplicities) + } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend index d2ee80dc..7dc21410 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend @@ -14,9 +14,10 @@ class GoalConstraintProvider { if (constraint.constrainsUnfinished) { val queries = entry.value val targetRelationName = constraint.relation.name - val query = queries.unfinishedMultiplicityQuery + val query = queries.existingMultiplicityQuery val containment = constraint.containment - res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1) + val lowerBound = constraint.lowerBound + res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1, lowerBound) } } return res 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 3033eca7..b9056685 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 @@ -26,6 +26,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.DiversityChecker import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.InconsistentScopeGlobalConstraint import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.LoggerSolutionFoundHandler import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ModelGenerationCompositeObjective +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.NumericSolver import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.PartialModelAsLogicInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ScopeObjective import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.SurelyViolatedObjectiveGlobalConstraint @@ -42,7 +43,6 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.NumericSolver class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.model/model/TaxationWithRoot.aird b/Tests/MODELS2020-CaseStudies/case.study.pledge.model/model/TaxationWithRoot.aird index e5bce79e..a4252796 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.model/model/TaxationWithRoot.aird +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.model/model/TaxationWithRoot.aird @@ -1,5151 +1,5151 @@ - - - - TaxationWithRoot.ecore - TaxationWithRoot.genmodel - platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - bold - - - - - - - - - - bold - - - - - - - - - - bold - - - - bold - - - - - - - bold - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - italic - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - italic - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - - italic - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - italic - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - - italic - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - italic - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - bold - - - - - - - - bold - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - - - - - - - - - - labelSize - bold - - - labelSize - - - - - - - - - - labelSize - bold - - - labelSize - - - - - - - - - - labelSize - bold - - - labelSize - - - - - - - - - - labelSize - bold - - - labelSize - - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - italic - - - - - - - - - - - - bold - - - bold - - - - - - - - - - - bold - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - bold - - - - - - - - - - - bold - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - bold - - - - - - - - - - - bold - - - bold - - - - - - - - - - - - - - - - - - - - - - bold - - - bold - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - - - - + + + + TaxationWithRoot.ecore + TaxationWithRoot.genmodel + platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore + + + + + + + + + + + + + + + + + + + + + + + bold + + + + + + + bold + + + + + + + + + + bold + + + + + + + + + + bold + + + + bold + + + + + + + bold + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + italic + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + italic + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + + italic + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + italic + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + + italic + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + italic + + + + + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + bold + + + + + + + + bold + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + labelSize + bold + + + labelSize + + + + + + + + + + labelSize + bold + + + labelSize + + + + + + + + + + labelSize + bold + + + labelSize + + + + + + + + + + labelSize + bold + + + labelSize + + + + + + + + + + + labelSize + + + labelSize + + + + + + + + + + + labelSize + + + labelSize + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + italic + + + + + + + + + + + + bold + + + bold + + + + + + + + + + + bold + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bold + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bold + + + bold + + + + + + + + + + + bold + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bold + + + bold + + + + + + + + + + + bold + + + bold + + + + + + + + + + + + + + + + + + + + + + bold + + + bold + + + + + + + + + + labelSize + + + labelSize + + + + + + + + + + + + + -- cgit v1.2.3-54-g00ecf From a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 7 Jul 2020 15:00:13 +0200 Subject: Trying to fix performance regressions --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../application/execution/SolverLoader.xtend | 56 +++++++++------- .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5334 -> 5334 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1717 -> 1717 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2742 -> 2742 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2758 -> 2758 bytes .../ModelGenerationMethodProvider.xtend | 3 +- .../MultiplicityGoalConstraintCalculator.xtend | 3 + .../logic2viatra/cardinality/ScopePropagator.xtend | 14 +++- .../logic2viatra/patterns/PatternGenerator.xtend | 2 +- .../patterns/RelationDeclarationIndexer.xtend | 4 +- .../patterns/RelationRefinementGenerator.xtend | 3 +- .../rules/GoalConstraintProvider.xtend | 71 +++++++++++++++++++-- .../viatrasolver/reasoner/ViatraReasoner.xtend | 12 +++- .../reasoner/ViatraReasonerConfiguration.xtend | 7 +- .../dse/BestFirstStrategyForModelGeneration.java | 8 +-- .../dse/ModelGenerationCompositeObjective.xtend | 27 ++++---- .../reasoner/dse/PunishSizeObjective.xtend | 70 ++++++++++++++++++++ .../viatrasolver/reasoner/dse/ScopeObjective.xtend | 2 +- .../case.study.familyTree.run/bin/.gitignore | 1 + .../config/genericSatellite.vsconfig | 7 +- 23 files changed, 227 insertions(+), 63 deletions(-) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend create mode 100644 Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index 1641af7c..27ebff86 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index d06f6684..4c3dcf43 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend index b1be56cb..bc4fa42f 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend @@ -10,6 +10,9 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Threshold import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration +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.reasoner.CostObjectiveConfiguration import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveElementConfiguration import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor @@ -98,42 +101,47 @@ class SolverLoader { console.writeError('''Malformed number format: «e.message»''') } } - if(config.containsKey("numeric-solver-at-end")) { + if (config.containsKey("numeric-solver-at-end")) { val stringValue = config.get("numeric-solver-at-end") - if(stringValue.equals("true")) { + if (stringValue.equals("true")) { println("numeric-solver-at-end") c.runIntermediateNumericalConsistencyChecks = false } } - if(config.containsKey("fitness-punishSize")) { + if (config.containsKey("fitness-punishSize")) { val stringValue = config.get("fitness-punishSize") - try { - c.punishSize = Boolean.parseBoolean(stringValue) - } catch(Exception e) {} + c.punishSize = Boolean.parseBoolean(stringValue) } - if(config.containsKey("fitness-scope")) { + if (config.containsKey("fitness-scope")) { val stringValue = config.get("fitness-scope") - try { - c.scopeWeight = Integer.parseInt(stringValue) - } catch(Exception e) {} + c.scopeWeight = Integer.parseInt(stringValue) } - if(config.containsKey("fitness-missing-containent")) { - val stringValue = config.get("fitness-missing-containent") - try { - c.conaintmentWeight = Integer.parseInt(stringValue) - } catch(Exception e) {} + if (config.containsKey("fitness-missing-containment")) { + val stringValue = config.get("fitness-missing-containment") + c.conaintmentWeight = Integer.parseInt(stringValue) } - if(config.containsKey("fitness-missing-noncontainent")) { - val stringValue = config.get("fitness-missing-noncontainent") - try { - c.nonContainmentWeight = Integer.parseInt(stringValue) - } catch(Exception e) {} + if (config.containsKey("fitness-missing-noncontainment")) { + val stringValue = config.get("fitness-missing-noncontainment") + c.nonContainmentWeight = Integer.parseInt(stringValue) } - if(config.containsKey("fitness-missing-wf")) { + if (config.containsKey("fitness-missing-wf")) { val stringValue = config.get("fitness-missing-wf") - try { - c.unfinishedWFWeight = Integer.parseInt(stringValue) - } catch(Exception e) {} + c.unfinishedWFWeight = Integer.parseInt(stringValue) + } + if (config.containsKey("fitness-objectCreationCosts")) { + val stringValue = config.get("fitness-objectCreationCosts") + c.calculateObjectCreationCosts = Boolean.parseBoolean(stringValue) + } + if (config.containsKey("scopePropagator")) { + val stringValue = config.get("scopePropagator") + c.scopePropagatorStrategy = switch (stringValue) { + case "polyhedral": new ScopePropagatorStrategy.Polyhedral( + PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp, true) + case "hybrid": new ScopePropagatorStrategy.Polyhedral( + PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp, false) + case "typeHierarchy": ScopePropagatorStrategy.BasicTypeHierarchy + default: throw new IllegalArgumentException("Unknown scope propagator: " + stringValue) + } } for (objectiveEntry : objectiveEntries) { val costObjectiveConfig = new CostObjectiveConfiguration diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index b54e44de..dbdd38d8 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index 4976e388..6b2259b5 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index 6cd15573..5437df8f 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 3663bdb4..26756ae5 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index 08e3330b..6f7cebd0 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ 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 78eda150..b79039cb 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 @@ -112,6 +112,7 @@ class ModelGenerationMethodProvider { ReasonerWorkspace workspace, boolean nameNewElements, TypeInferenceMethod typeInferenceMethod, + boolean calculateObjectCreationCosts, ScopePropagatorStrategy scopePropagatorStrategy, Collection hints, DocumentationLevel debugLevel @@ -135,7 +136,7 @@ class ModelGenerationMethodProvider { val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, statistics) - val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries) + val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries,calculateObjectCreationCosts) val unfinishedWF = queries.getUnfinishedWFQueries.values diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend index 392ab3ee..273e0ac3 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend @@ -14,6 +14,9 @@ class MultiplicityGoalConstraintCalculator { val int cost new(String targetRelationName, IQuerySpecification querySpecification, boolean containment, int lowerBound, int cost) { + if (lowerBound <= 0) { + throw new IllegalArgumentException("Invalid lower bound: " + lowerBound) + } this.targetRelationName = targetRelationName this.querySpecification = querySpecification this.calculator = null diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 132ca8e8..3e95b2cc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -60,15 +60,23 @@ class ScopePropagator { } } } while (changed) - + copyScopeBoundsToHeuristic() } def propagateAllScopeConstraints() { + if (!valid) { + return + } statistics.incrementScopePropagationCount() doPropagateAllScopeConstraints() } - + + def isValid() { + partialInterpretation.maxNewElements == -1 || + partialInterpretation.minNewElements <= partialInterpretation.maxNewElements + } + protected def copyScopeBoundsToHeuristic() { partialInterpretation.minNewElementsHeuristic = partialInterpretation.minNewElements for (scope : partialInterpretation.scopes) { @@ -109,7 +117,7 @@ class ScopePropagator { // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') } - + protected def setScopesInvalid() { partialInterpretation.minNewElements = Integer.MAX_VALUE partialInterpretation.maxNewElements = 0 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 f3125b80..80bc3844 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 @@ -51,7 +51,7 @@ class PatternGenerator { @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) - public new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { + new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { if(typeInferenceMethod == TypeInferenceMethod.Generic) { this.typeIndexer = new GenericTypeIndexer(this) this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) 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 cef707c5..b4403979 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 @@ -19,7 +19,7 @@ class RelationDeclarationIndexer { this.base = base } - public def generateRelationIndexers(LogicProblem problem, Iterable relations, Map fqn2PQuery) { + def generateRelationIndexers(LogicProblem problem, Iterable relations, Map fqn2PQuery) { val upperMultiplicities = new HashMap problem.annotations.filter(UpperMultiplicityAssertion).forEach[ upperMultiplicities.put(it.relation,it.upper) @@ -42,7 +42,7 @@ class RelationDeclarationIndexer { '''«modality.name.toLowerCase»InRelation«base.canonizeName(r.name)»''' } - public def referRelation( + def referRelation( RelationDeclaration referred, String sourceVariable, String targetVariable, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index d915d47e..783cd36b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend @@ -5,12 +5,11 @@ 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.LinkedList -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference class RelationRefinementGenerator { PatternGenerator base; - public new(PatternGenerator base) { + new(PatternGenerator base) { this.base = base } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend index 7dc21410..732c135d 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend @@ -1,13 +1,25 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns import java.util.ArrayList +import java.util.HashMap +import java.util.LinkedList +import java.util.List +import java.util.Map class GoalConstraintProvider { - - def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) { + + def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns, boolean calculateObjectCost) { + val objectCosts = if (calculateObjectCost) { + calculateMissingObjectCost(p) + } else { + emptyMap + } val res = new ArrayList() for (entry : patterns.multiplicityConstraintQueries.entrySet) { val constraint = entry.key @@ -17,10 +29,61 @@ class GoalConstraintProvider { val query = queries.existingMultiplicityQuery val containment = constraint.containment val lowerBound = constraint.lowerBound - res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1, lowerBound) + val cost = objectCosts.getOrDefault(constraint.relation, 1) + res += new MultiplicityGoalConstraintCalculator( + targetRelationName, + query, + containment, + lowerBound, + cost + ) } } return res } -} \ No newline at end of file + private def calculateMissingObjectCost(LogicProblem p) { + val containments = p.containmentHierarchies.head.containmentRelations + val containment2Lower = containments.toInvertedMap [ containment | + val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head + if (lower !== null) { + lower.lower + } else { + 0 + } + ] + val types = p.types + val Map>> type2NewCost = new HashMap + for (type : types) { + val allSupertypes = (#[type] + type.supertypes).toSet + val allOutgoingContainments = containments.filter [ + allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred) + ] + val list = new LinkedList + for (outgoingContainment : allOutgoingContainments) { + val value = containment2Lower.get(outgoingContainment) + if (value > 0) { + list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred -> value) + } + } + type2NewCost.put(type, list) + } + val res = new HashMap + for (containment : containments) { + val key = containment + val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost) +// println('''«key.name» --> «value» new''') + res.put(key, value) + } + return res + } + + private def int count(Type t, Map>> containments) { + val list = containments.get(t) + var r = 1 + for (element : list) { + r += element.value * element.key.count(containments) + } + return r + } +} 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 b9056685..b58033d7 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 @@ -43,6 +43,7 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.PunishSizeObjective class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() @@ -86,17 +87,24 @@ class ViatraReasoner extends LogicReasoner { workspace, viatraConfig.nameNewElements, viatraConfig.typeInferenceMethod, + viatraConfig.calculateObjectCreationCosts, viatraConfig.scopePropagatorStrategy, viatraConfig.hints, viatraConfig.documentationLevel ) - dse.addObjective(new ModelGenerationCompositeObjective( + val compositeObjective = new ModelGenerationCompositeObjective( basicScopeGlobalConstraint ?: new ScopeObjective, method.unfinishedMultiplicities.map[new UnfinishedMultiplicityObjective(it)], wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF), viatraConfig - )) + ) + dse.addObjective(compositeObjective) + if (viatraConfig.punishSize) { + val punishObjective = new PunishSizeObjective + punishObjective.level = compositeObjective.level + 1 + dse.addObjective(punishObjective) + } val extremalObjectives = Lists.newArrayListWithExpectedSize(viatraConfig.costObjectives.size) for (entry : viatraConfig.costObjectives.indexed) { 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 e33a2590..a2f6de22 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 @@ -57,11 +57,12 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var runIntermediateNumericalConsistencyChecks = true - public var punishSize = true - public var scopeWeight = 2 - public var conaintmentWeight = 1 + public var punishSize = false + public var scopeWeight = 1 + public var conaintmentWeight = 2 public var nonContainmentWeight = 1 public var unfinishedWFWeight = 1 + public var calculateObjectCreationCosts = false public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index 09575384..a2de1abc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.PriorityQueue; import java.util.Random; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -29,6 +28,8 @@ import org.eclipse.viatra.dse.objectives.Fitness; import org.eclipse.viatra.dse.objectives.ObjectiveComparatorHelper; import org.eclipse.viatra.dse.solutionstore.ISolutionFoundHandler; import org.eclipse.viatra.dse.solutionstore.SolutionStore; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher; import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner; @@ -137,10 +138,9 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // ViatraQueryEngine engine = context.getQueryEngine(); // matchers = new LinkedList>(); // for(IQuerySpecification> p : this.method.getAllPatterns()) { -// ViatraQueryMatcher matcher = p.getMatcher(engine); -// matchers.add(matcher); +// ViatraQueryMatcher matcher = p.getMatcher(engine); // } - +// final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); this.comparator = new Comparator() { @Override diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend index 481f4ce1..27208cf4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend @@ -9,13 +9,13 @@ import java.util.List import org.eclipse.viatra.dse.base.ThreadContext import org.eclipse.viatra.dse.objectives.Comparators import org.eclipse.viatra.dse.objectives.IObjective +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement class ModelGenerationCompositeObjective implements IThreeValuedObjective { val IObjective scopeObjective val List unfinishedMultiplicityObjectives val UnfinishedWFObjective unfinishedWFObjective var PartialInterpretation model = null - val boolean punishSize val int scopeWeight val int conaintmentWeight val int nonContainmentWeight @@ -28,7 +28,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { ViatraReasonerConfiguration configuration) { this( - scopeObjective, unfinishedMultiplicityObjectives, unfinishedWFObjective, configuration.punishSize, + scopeObjective, unfinishedMultiplicityObjectives, unfinishedWFObjective, configuration.scopeWeight, configuration.conaintmentWeight, configuration.nonContainmentWeight, configuration.unfinishedWFWeight ) @@ -38,13 +38,12 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { IObjective scopeObjective, List unfinishedMultiplicityObjectives, UnfinishedWFObjective unfinishedWFObjective, - boolean punishSize, int scopeWeight, int conaintmentWeight, int nonContainmentWeight, int unfinishedWFWeight) + int scopeWeight, int conaintmentWeight, int nonContainmentWeight, int unfinishedWFWeight) { this.scopeObjective = scopeObjective this.unfinishedMultiplicityObjectives = unfinishedMultiplicityObjectives this.unfinishedWFObjective = unfinishedWFObjective - this.punishSize = punishSize this.scopeWeight = scopeWeight this.conaintmentWeight = conaintmentWeight this.nonContainmentWeight = nonContainmentWeight @@ -63,7 +62,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { scopeObjective.createNew, ImmutableList.copyOf(unfinishedMultiplicityObjectives.map[createNew as UnfinishedMultiplicityObjective]), unfinishedWFObjective.createNew as UnfinishedWFObjective, - punishSize, scopeWeight, conaintmentWeight, nonContainmentWeight, unfinishedWFWeight + scopeWeight, conaintmentWeight, nonContainmentWeight, unfinishedWFWeight ) } @@ -77,16 +76,14 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { var containmentMultiplicity = 0.0 var nonContainmentMultiplicity = 0.0 for(multiplicityObjective : unfinishedMultiplicityObjectives) { + val multiplicity = multiplicityObjective.getFitness(context) +// println(multiplicityObjective.name + "=" + multiplicity) if(multiplicityObjective.containment) { - containmentMultiplicity+=multiplicityObjective.getFitness(context) + containmentMultiplicity+=multiplicity } else { - nonContainmentMultiplicity+=multiplicityObjective.getFitness(context) + nonContainmentMultiplicity+=multiplicity } - } - val size = if(punishSize) { - 0.9/model.newElements.size - } else { - 0 + } var sum = 0.0 @@ -94,7 +91,9 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { sum += containmentMultiplicity*conaintmentWeight sum += nonContainmentMultiplicity*nonContainmentWeight sum += unfinishedWFsFitness*unfinishedWFWeight - sum+=size + +// println('''scope=«scopeFitnes», containment=«containmentMultiplicity», nonContainment=«nonContainmentMultiplicity», wf=«unfinishedWFsFitness», sum=«sum»''') + return sum } @@ -112,7 +111,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { override isHardObjective() { true } - override satisifiesHardObjective(Double fitness) { fitness <= 0.9 } + override satisifiesHardObjective(Double fitness) { fitness < 0.01 } override setComparator(Comparator comparator) { throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend new file mode 100644 index 00000000..8505661c --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend @@ -0,0 +1,70 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.IThreeValuedObjective +import java.util.Comparator +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.Comparators +import org.eclipse.xtend.lib.annotations.Accessors + +class PunishSizeObjective implements IThreeValuedObjective { + @Accessors int level = 3 + + override createNew() { + this + } + + override init(ThreadContext context) { + // Nothing to initialize. + } + + override getComparator() { + Comparators.LOWER_IS_BETTER + } + + override getFitness(ThreadContext threadContext) { + val model = threadContext.model + if (model instanceof PartialInterpretation) { + val size = model.newObjectCount +// println('''size=«size»''') + size as double + } else { + throw new IllegalArgumentException("notifier must be a PartialInterpretation") + } + } + + override getBestPossibleFitness(ThreadContext threadContext) { + getFitness(threadContext) + } + + override getWorstPossibleFitness(ThreadContext threadContext) { + val model = threadContext.model + if (model instanceof PartialInterpretation) { + (model.newObjectCount + model.maxNewElements) as double + } else { + throw new IllegalArgumentException("notifier must be a PartialInterpretation") + } + } + + private def getNewObjectCount(PartialInterpretation interpretation) { + interpretation.newElements.reject[it instanceof PrimitiveElement].size + } + + override getName() { + typeof(PunishSizeObjective).name + } + + override isHardObjective() { + false + } + + override satisifiesHardObjective(Double fitness) { + true + } + + override setComparator(Comparator comparator) { + throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") + } + +} \ 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/dse/ScopeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend index 7abc5cb8..b61bd20b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend @@ -25,7 +25,7 @@ class ScopeObjective implements IObjective{ val interpretation = context.model as PartialInterpretation var res = interpretation.minNewElementsHeuristic.doubleValue for(scope : interpretation.scopes) { - res += scope.minNewElementsHeuristic + res += scope.minNewElementsHeuristic * 2 } return res } diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore new file mode 100644 index 00000000..7050a7e3 --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/bin/.gitignore @@ -0,0 +1 @@ +/queries/ diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig index 127b174d..2ff20880 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig @@ -23,7 +23,7 @@ generate { generate { metamodel = { package satellite } constraints = { package hu.bme.mit.inf.dslreasoner.domains.satellite.queries } - partial-model = { "inputs/SatelliteInstance.xmi"} + partial-model = { "inputs/SatelliteInstance.xmi" } solver = ViatraSolver scope = { #node += 64..* @@ -33,7 +33,10 @@ generate { runtime = 10000, log-level = normal, "fitness-scope" = "3", - "fitness-objectCreationCosts" = "true" + "fitness-punishSize" = "true", + "fitness-objectCreationCosts" = "true", + "scopePropagator" = "typeHierarchy", + "fitness-missing-containment" = "2" } runs = 1 -- cgit v1.2.3-54-g00ecf From 329ac27dfa84e9a07760bea75b36476dddcf29a7 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 14 Jul 2020 10:45:03 +0200 Subject: Optimizations --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5334 -> 5334 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1717 -> 1717 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2742 -> 2742 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2758 -> 2758 bytes .../ModelGenerationMethodProvider.xtend | 22 +++-- .../cardinality/PolyhedronScopePropagator.xtend | 4 + .../logic2viatra/cardinality/ScopePropagator.xtend | 4 + .../logic2viatra/patterns/PatternProvider.xtend | 12 +++ .../rules/RefinementRuleProvider.xtend | 12 +-- .../META-INF/MANIFEST.MF | 3 +- .../neighbourhood/Descriptor.xtend | 106 ++++++--------------- .../neighbourhood/PartialInterpretation2Hash.xtend | 14 ++- ...nterpretation2NeighbourhoodRepresentation.xtend | 63 ++++++------ .../NeighbourhoodBasedStateCoderFactory.xtend | 21 +++- .../viatrasolver/reasoner/ViatraReasoner.xtend | 2 +- .../config/genericSatellite.vsconfig | 6 +- .../config/genericTaxation.vsconfig | 6 +- .../case.study.pledge.run/inputs/Resource50hh.xmi | 59 ++++++++++++ 21 files changed, 196 insertions(+), 138 deletions(-) create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index bd1eabaf..35e3fe34 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index f4956ec0..b597e715 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index 0ee6ab93..5d90d470 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index 1fbc1b5a..f054d52c 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index 6dfd9bdd..faaea19c 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 9e4a0e33..704006b4 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index 2a1c8746..76be2b25 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ 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 b79039cb..56beacfa 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 @@ -1,6 +1,7 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableSet import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery @@ -57,7 +58,7 @@ class ModelGenerationStatistics { } public var int transformationInvocations - + synchronized def incrementTransformationCount() { transformationInvocations++ } @@ -67,7 +68,7 @@ class ModelGenerationStatistics { synchronized def incrementScopePropagationCount() { scopePropagatorInvocations++ } - + public var int scopePropagatorSolverInvocations synchronized def incrementScopePropagationSolverCount() { @@ -126,9 +127,7 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, writeFiles) - val queryEngine = ViatraQueryEngine.on(new EMFScope(emptySolution)) - GenericQueryGroup.of(queries.allQueries).prepare(queryEngine) - + val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(logicProblem, emptySolution, @@ -136,7 +135,8 @@ class ModelGenerationMethodProvider { val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, statistics) - val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries,calculateObjectCreationCosts) + val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem, queries, + calculateObjectCreationCosts) val unfinishedWF = queries.getUnfinishedWFQueries.values @@ -150,10 +150,18 @@ class ModelGenerationMethodProvider { val modalRelationQueries = modalRelationQueriesBuilder.build val invalidWF = queries.getInvalidWFQueries.values - + val mustUnitPropagationPreconditions = queries.getMustUnitPropagationPreconditionPatterns val currentUnitPropagationPreconditions = queries.getCurrentUnitPropagationPreconditionPatterns + val queriesToPrepare = ImmutableSet.builder.addAll(queries.refineObjectQueries.values).addAll( + queries.refineTypeQueries.values).addAll(queries.refinerelationQueries.values).addAll(queries. + multiplicityConstraintQueries.values.flatMap[allQueries]).addAll(queries.unfinishedWFQueries.values).addAll( + queries.invalidWFQueries.values).addAll(queries.mustUnitPropagationPreconditionPatterns.values).addAll( + queries.currentUnitPropagationPreconditionPatterns.values).add(queries.hasElementInContainmentQuery).build + val queryEngine = ViatraQueryEngine.on(new EMFScope(emptySolution)) + GenericQueryGroup.of(queriesToPrepare).prepare(queryEngine) + return new ModelGenerationMethod( statistics, objectRefinementRules.values, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index db22b95c..c28d4caa 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -114,6 +114,10 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { override isPropagationNeededAfterAdditionToRelation(Relation r) { relevantRelations.contains(r) || super.isPropagationNeededAfterAdditionToRelation(r) } + + override isQueryEngineFlushRequiredBeforePropagation() { + true + } def resetBounds() { for (dimension : polyhedron.dimensions) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 3e95b2cc..93b83577 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -130,6 +130,10 @@ class ScopePropagator { def isPropagationNeededAfterAdditionToRelation(Relation r) { false } + + def isQueryEngineFlushRequiredBeforePropagation() { + false + } private def removeOne(Scope scope) { if (scope.minNewElements > 0) { 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 2f7c9e2d..d57705ce 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 @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns +import com.google.common.collect.ImmutableSet 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.logiclanguage.RelationDefinition @@ -55,6 +56,17 @@ class ModalPatternQueries { class UnifinishedMultiplicityQueries { val IQuerySpecification> existingMultiplicityQuery val IQuerySpecification> existingInverseMultiplicityQuery + + def Set>> getAllQueries() { + val builder = ImmutableSet.builder + if (existingMultiplicityQuery !== null) { + builder.add(existingMultiplicityQuery) + } + if (existingInverseMultiplicityQuery !== null) { + builder.add(existingInverseMultiplicityQuery) + } + builder.build + } } class PatternProvider { 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 1d976e14..f7fe97a3 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 @@ -114,7 +114,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -144,7 +144,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -171,7 +171,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -404,7 +404,7 @@ class RefinementRuleProvider { // Scope propagation if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { - flushQueryEngine + flushQueryEngine(scopePropagator) val propagatorStartTime = System.nanoTime scopePropagator.propagateAllScopeConstraints() @@ -581,8 +581,8 @@ class RefinementRuleProvider { inverseInterpretation.relationlinks += inverseLink } - protected def flushQueryEngine() { - if (queryEngine.updatePropagationDelayed) { + protected def flushQueryEngine(ScopePropagator scopePropagator) { + if (scopePropagator.queryEngineFlushRequiredBeforePropagation && queryEngine.updatePropagationDelayed) { delayMessageDelivery.setBoolean(queryEngine, false) queryEngine.getQueryBackend(ReteBackendFactory.INSTANCE).flushUpdates delayMessageDelivery.setBoolean(queryEngine, true) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF index 83c90829..639a8a9c 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF @@ -28,7 +28,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.xtend.lib.macro, org.eclipse.viatra.query.runtime;bundle-version="1.5.0", org.eclipse.viatra.dse;bundle-version="0.15.0", - hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0" + hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", + org.eclipse.collections;bundle-version="10.1.0" Bundle-ActivationPolicy: lazy Automatic-Module-Name: hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend index e4bdb086..685a1f5a 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend @@ -7,7 +7,7 @@ import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtend2.lib.StringConcatenationClient @Data abstract class AbstractNodeDescriptor { - long dataHash + int dataHash protected def StringConcatenationClient prettyPrint() { '''(«dataHash»)[«class.simpleName»]''' @@ -57,7 +57,7 @@ import org.eclipse.xtend2.lib.StringConcatenationClient } override hashCode() { - return this.dataHash.hashCode + return this.dataHash } override equals(Object other) { @@ -119,7 +119,6 @@ import org.eclipse.xtend2.lib.StringConcatenationClient } @Data class FurtherNodeDescriptor extends AbstractNodeDescriptor { - NodeRep previousRepresentation Map, Integer> incomingEdges Map, Integer> outgoingEdges @@ -128,8 +127,8 @@ import org.eclipse.xtend2.lib.StringConcatenationClient Map, Integer> outgoingEdges) { super(calculateDataHash(previousRepresentation, incomingEdges, outgoingEdges)) this.previousRepresentation = previousRepresentation - this.incomingEdges = new HashMap(incomingEdges) - this.outgoingEdges = new HashMap(outgoingEdges) + this.incomingEdges = incomingEdges + this.outgoingEdges = outgoingEdges } static def private int calculateDataHash(NodeRep previousRepresentation, @@ -137,14 +136,14 @@ import org.eclipse.xtend2.lib.StringConcatenationClient val int prime = 31; var int result = previousRepresentation.hashCode; if (incomingEdges !== null) - result = prime * result + incomingEdges.hashCode(); + result = prime * result + hashIncomingNeighborhood(incomingEdges) if (outgoingEdges !== null) - result = prime * result + outgoingEdges.hashCode(); + result = prime * result + hashOutgoingNeighborhood(outgoingEdges) return result; } override hashCode() { - return this.dataHash.hashCode + return this.dataHash } override equals(Object other) { @@ -179,80 +178,31 @@ import org.eclipse.xtend2.lib.StringConcatenationClient '''«rep»''' } } + + private static def hashIncomingNeighborhood(Map, Integer> neighborhood) { + val int prime = 31 + var int hash = 0 + for (entry : neighborhood.entrySet) { + val relation = entry.key + hash += (prime * relation.from.hashCode + relation.type.hashCode).bitwiseXor(entry.value.hashCode) + } + hash + } + + private static def hashOutgoingNeighborhood(Map, Integer> neighborhood) { + val int prime = 31 + var int hash = 0 + for (entry : neighborhood.entrySet) { + val relation = entry.key + hash += (prime * relation.to.hashCode + relation.type.hashCode).bitwiseXor(entry.value.hashCode) + } + hash + } override toString() { ''' «prettyPrint» ''' } - -// @Pure -// @Override -// override public boolean equals(Object obj) { -// if (this === obj) -// return true; -// if (obj === null) -// return false; -// if (getClass() != obj.getClass()) -// return false; -// val AbstractNodeDescriptor other = obj as AbstractNodeDescriptor; -// if (other.dataHash != this.dataHash) -// return false; -// return true; -// } -// @Pure -// override public boolean equals(Object obj) { -// if (this === obj) -// return true; -// if (obj === null) -// return false; -// if (getClass() != obj.getClass()) -// return false; -// if (!super.equals(obj)) -// return false; -// val FurtherNodeDescriptor other = obj as FurtherNodeDescriptor; -// if (this.previousRepresentation === null) { -// if (other.previousRepresentation != null) -// return false; -// -// } -//// } else if (!this.previousRepresentation.equals(other.previousRepresentation)) -//// return false; -// if (this.incomingEdges === null) { -// if (other.incomingEdges != null) -// return false; -// } else if (!this.incomingEdges.equals(other.incomingEdges)) -// return false; -// if (this.outgoingEdges === null) { -// if (other.outgoingEdges != null) -// return false; -// } else if (!this.outgoingEdges.equals(other.outgoingEdges)) -// return false; -// if (this.attributeValues === null) { -// if (other.attributeValues != null) -// return false; -// } else if (!this.attributeValues.equals(other.attributeValues)) -// return false; -// return true; -// } } -/* - * @Data - * class ModelDescriptor { - * int dataHash - * int unknownElements - * Map knownElements - * - * public new(Map knownElements, int unknownElements) { - * this.dataHash = calculateDataHash(knownElements,unknownElements) - * this.unknownElements = unknownElements - * this.knownElements = knownElements - * } - * - * def private static calculateDataHash(Map knownElements, int unknownElements) - * { - * val int prime = 31; - * return knownElements.hashCode * prime + unknownElements.hashCode - * } - * } - */ + diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend index ddf7d712..5da202eb 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend @@ -1,7 +1,8 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood -import java.util.Map import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement +import java.util.Map +import org.eclipse.collections.api.factory.Maps class PartialInterpretation2Hash extends PartialInterpretation2NeighbourhoodRepresentation{ @@ -11,15 +12,22 @@ class PartialInterpretation2Hash extends PartialInterpretation2NeighbourhoodRepr override protected createLocalRepresentation(Map node2Representation, Map representation2Amount) { return new NeighbourhoodWithTraces( - representation2Amount.hashCode,node2Representation.mapValues[it.hashCode], + representation2Amount.hashCode,node2Representation.hashValues, null) } override protected createFurtherRepresentation(Map, Integer> nodeDescriptors, Map> node2Representation, NeighbourhoodWithTraces previous, boolean deepRepresentation) { return new NeighbourhoodWithTraces( nodeDescriptors.hashCode, - node2Representation.mapValues[it.hashCode], + node2Representation.hashValues, if(deepRepresentation) {previous} else {null}) } + private def hashValues(Map map) { + val hashedMap = Maps.mutable.ofInitialCapacity(map.size) + for (entry : map.entrySet) { + hashedMap.put(entry.key, entry.value.hashCode) + } + hashedMap + } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend index 3048167e..93eab816 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend @@ -8,11 +8,11 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialPrimitiveInterpretation import java.util.ArrayList -import java.util.HashMap -import java.util.HashSet import java.util.List import java.util.Map import java.util.Set +import org.eclipse.collections.api.factory.Maps +import org.eclipse.collections.impl.factory.Sets import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* @@ -68,10 +68,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation relevantTypes, Set relevantRelations, DefinedElement focusedElement) { - val Map> types = new HashMap + val initialSize = model.elements.size + val Map> types = Maps.mutable.ofInitialCapacity(initialSize) fillTypes(model, types, relevantTypes) - val Map>> IncomingRelations = new HashMap; - val Map>> OutgoingRelations = new HashMap; + val Map>> IncomingRelations = Maps.mutable.ofInitialCapacity(initialSize); + val Map>> OutgoingRelations = Maps.mutable.ofInitialCapacity(initialSize); fillReferences(model, IncomingRelations, OutgoingRelations, relevantRelations) val res = doRecursiveNeighbourCalculation(model, types, IncomingRelations, OutgoingRelations, range, parallels, @@ -103,12 +104,12 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, Map>> OutgoingRelations) { val elements = types.keySet - var Map> reachable = new HashMap - var Map> newReachable = new HashMap + var Map> reachable = Maps.mutable.ofInitialCapacity(elements.size) + var Map> newReachable = Maps.mutable.ofInitialCapacity(elements.size) for (element : elements) { - val set = new HashSet + val set = Sets.mutable.of set.add(element) - reachable.put(element, new HashSet) + reachable.put(element, Sets.mutable.of) newReachable.put(element, set) } @@ -201,8 +202,8 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation previousNumberOfTypes lastRange = nextRange @@ -224,7 +225,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation> node2Type, Set relevantTypes) { for (element : model.elements) { - node2Type.put(element, new HashSet) + node2Type.put(element, Sets.mutable.of) } // for(typeDefinition : model.problem.types.filter(TypeDefinition)) { @@ -286,7 +287,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation max) return Integer.MAX_VALUE else return original + 1 } @@ -294,15 +299,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, DefinedElement object, Map previousNodeRepresentations, int parallel) { - val Map, Integer> res = new HashMap + val Map, Integer> res = Maps.mutable.of for (incomingConcreteEdge : IncomingRelations.get(object)) { val IncomingRelation e = new IncomingRelation( previousNodeRepresentations.get(incomingConcreteEdge.from), incomingConcreteEdge.type) - if (res.containsKey(e)) { - res.put(e, addOne(res.get(e), parallel)) - } else { - res.put(e, 1) - } + res.compute(e, [key, value | addOne(value, parallel)]) } return res } @@ -310,17 +311,13 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> OutgoingRelations, DefinedElement object, Map previousNodeRepresentations, int parallel) { - val Map, Integer> res = new HashMap + val Map, Integer> res = Maps.mutable.of for (outgoingConcreteEdge : OutgoingRelations.get(object)) { val OutgoingRelation e = new OutgoingRelation( previousNodeRepresentations.get(outgoingConcreteEdge.to), outgoingConcreteEdge.type) - if (res.containsKey(e)) { - res.put(e, addOne(res.get(e), parallel)) - } else { - res.put(e, 1) - } + res.compute(e, [key, value | addOne(value, parallel)]) } - return res; + return res } /*def private void addOrCreate_Set(Map> map, KEY key, VALUE value) { @@ -338,16 +335,17 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, Map>> OutgoingRelations, int parallels, int maxNumber) { val previousNodeRepresentations = previous.nodeRepresentations - val node2Representation = new HashMap> + val size = previousNodeRepresentations.size + val node2Representation = Maps.mutable.>ofInitialCapacity(size) val Map, Integer> descriptor2Number = if (this. mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } val Map, FurtherNodeDescriptor> uniqueDescription = if (this. mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } @@ -392,14 +390,15 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation> types, int maxNumber, DefinedElement focusedElement) { - val Map node2Representation = new HashMap + val size = types.size + val Map node2Representation = Maps.mutable.ofInitialCapacity(size) val Map representation2Amount = if (mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } val Map uniqueRepresentation = if (this.mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend index f19ac30f..04c49506 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend @@ -9,6 +9,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import java.util.ArrayList import java.util.Map import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.IQuerySpecification class NeighbourhoodBasedStateCoderFactory extends AbstractNeighbourhoodBasedStateCoderFactory { new() { @@ -38,6 +39,7 @@ class NeighbourhoodBasedHashStateCoderFactory extends AbstractNeighbourhoodBased class NeighbourhoodBasedPartialInterpretationStateCoder extends AbstractNeighbourhoodBasedPartialInterpretationStateCoder { val PartialInterpretation2NeighbourhoodRepresentation calculator + val Map, String> fullyQualifiedNames = newHashMap var Map nodeRepresentations = null var ModelRep modelRepresentation = null @@ -55,27 +57,36 @@ class NeighbourhoodBasedPartialInterpretationStateCoder exten modelRepresentation = code.modelRepresentation nodeRepresentations = code.nodeRepresentations } + + private def getFullyQualifiedNameCached(IQuerySpecification specification) { + fullyQualifiedNames.computeIfAbsent(specification, [fullyQualifiedName]) + } override doCreateActivationCode(IPatternMatch match) { val size = match.specification.parameters.size - val res = new ArrayList(size) - var int equivalenceHash = 0 + var int hash = 0 val prime = 31 for (var int index = 0; index < size; index++) { val matchArgument = match.get(index) - res.add(getCode(matchArgument)) + val code = getCode(matchArgument) + val codeNumber = if (code === null) { + 0 + } else { + code.hashCode + } + hash = prime * hash + codeNumber for (var i = 0; i < index; i++) { val number = if (matchArgument === match.get(i)) { 1 } else { 0 } - equivalenceHash = prime * equivalenceHash + number + hash = prime * hash + number } } - match.specification.fullyQualifiedName -> (res -> equivalenceHash).hashCode + match.specification.fullyQualifiedNameCached -> hash } def private getCode(Object o) { 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 fd871615..c333feca 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 @@ -206,7 +206,7 @@ class ViatraReasoner extends LogicReasoner { it.transformationTime = (transformationTime / 1000000) as int for (pair : solutionCopier.getAllCopierRuntimes(true).indexed) { it.entries += createIntStatisticEntry => [ - it.name = '''_Solution«pair.key»FoundAt''' + it.name = '''Solution«pair.key»FoundAt''' it.value = (pair.value / 1000000) as int ] } diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig index 57eaf326..192dac7b 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig @@ -33,10 +33,8 @@ generate { runtime = 10000, log-level = normal, "fitness-scope" = "3", - "fitness-punishSize" = "inverse", - "fitness-objectCreationCosts" = "true", - "scopePropagator" = "typeHierarchy", - "fitness-missing-containment" = "2" + "fitness-punishSize" = "true", + "scopePropagator" = "polyhedral" } runs = 1 diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig index 7d742202..ee3c3631 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig @@ -35,7 +35,11 @@ generate { config = { runtime = 10000, log-level = normal, - "fitness-objectCreationCosts" = "true" + "fitness-scope" = "1", + "fitness-punishSize" = "inverse", + "fitness-objectCreationCosts" = "true", + "scopePropagator" = "typeHierarchy", + "fitness-missing-containment" = "2" } runs = 1 diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi new file mode 100644 index 00000000..5b110b76 --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-54-g00ecf From 4fe7fce97aedbd516109ef81afc33e00112b7b68 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 28 Aug 2020 18:58:37 +0200 Subject: Must unit propagation --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1700 -> 1700 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2525 -> 2525 bytes .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5333 -> 5333 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1716 -> 1716 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2741 -> 2741 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2757 -> 2757 bytes Domains/ca.mcgill.rtgmrt.example.modes3/.gitignore | 1 + .../META-INF/MANIFEST.MF | 5 +- .../ecore-gen/modes3/Modes3Factory.java | 9 + .../ecore-gen/modes3/Modes3ModelRoot.java | 4 +- .../ecore-gen/modes3/Modes3Package.java | 76 + .../ecore-gen/modes3/SimpleSegment.java | 17 + .../ecore-gen/modes3/impl/Modes3FactoryImpl.java | 11 + .../ecore-gen/modes3/impl/Modes3ModelRootImpl.java | 10 +- .../ecore-gen/modes3/impl/Modes3PackageImpl.java | 24 +- .../ecore-gen/modes3/impl/SimpleSegmentImpl.java | 37 + .../modes3/util/Modes3AdapterFactory.java | 18 + .../ecore-gen/modes3/util/Modes3Switch.java | 22 + .../model/modes3.aird_deactivated | 1531 -------------------- .../model/modes3.ecore | 3 +- .../model/modes3.genmodel | 1 + .../output/solution.partialinterpretation | 1068 -------------- .../output/solution1.gml | 1191 --------------- .../output/solution1.partialinterpretation | 1037 ------------- .../output/solution1.png | Bin 105065 -> 0 bytes Domains/ca.mcgill.rtgmrt.example.modes3/plugin.xml | 8 +- .../src/modes3/queries/Modes3Queries.vql | 54 +- .../src/modes3/run/Modes3ModelGenerator.xtend | 30 +- .../src/modes3/run/Modes3TypeScopeHint.xtend | 79 + .../run/Modes3UnitPropagationGenerator.xtend | 470 ++++-- .../vql-gen/modes3/queries/.gitignore | 7 + .../modes3/queries/ExtraInputOfTurnout.java | 730 ---------- .../vql-gen/modes3/queries/InputsOfTurnout.java | 570 ++++++++ .../vql-gen/modes3/queries/Modes3Queries.java | 72 +- .../modes3/queries/NoExtraInputOfTurnout.java | 560 ------- .../modes3/queries/TooFewInputsOfTurnout.java | 559 +++++++ .../queries/TooManyExtraInputsOfTurnout.java | 570 -------- .../modes3/queries/TooManyInputsOfSegment.java | 64 +- .../modes3/queries/TooManyInputsOfTurnout.java | 600 ++++++++ .../vql-gen/modes3/queries/Turnout.java | 543 ------- .../vql-gen/modes3/queries/TurnoutInSegments.java | 564 ------- .../modes3/run/.Modes3ModelGenerator.xtendbin | Bin 14631 -> 15038 bytes .../modes3/run/.Modes3TypeScopeHint.xtendbin | Bin 0 -> 7179 bytes .../run/.Modes3UnitPropagationGenerator.xtendbin | Bin 9899 -> 11735 bytes .../xtend-gen/modes3/run/.gitignore | 1 + .../xtend-gen/modes3/run/Modes3ModelGenerator.java | 56 +- .../xtend-gen/modes3/run/Modes3TypeScopeHint.java | 133 ++ .../modes3/run/Modes3UnitPropagationGenerator.java | 1133 +++++++++++---- .../plugin.xml | 68 - .../ModelGenerationMethodProvider.xtend | 14 +- .../cardinality/LinearTypeConstraintHint.xtend | 4 +- .../logic2viatra/cardinality/ScopePropagator.xtend | 14 +- .../logic2viatra/patterns/PatternGenerator.xtend | 4 +- .../logic2viatra/patterns/PatternProvider.xtend | 11 +- .../patterns/RelationDeclarationIndexer.xtend | 2 +- .../patterns/RelationRefinementGenerator.xtend | 137 +- .../rules/RefinementRuleProvider.xtend | 338 +++-- .../viatrasolver/reasoner/ViatraReasoner.xtend | 4 + .../dse/BestFirstStrategyForModelGeneration.java | 4 +- .../mit/inf/dslreasoner/run/FileSystemHint.xtend | 4 +- .../bme/mit/inf/dslreasoner/run/SGraphHint.xtend | 4 +- .../mit/inf/dslreasoner/run/SatelliteHint.xtend | 4 +- .../hu/bme/mit/inf/dslreasoner/run/SimpleRun.xtend | 6 +- 64 files changed, 3907 insertions(+), 8579 deletions(-) create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/SimpleSegment.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/SimpleSegmentImpl.java delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.aird_deactivated delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/output/solution.partialinterpretation delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.gml delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.partialinterpretation delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.png create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3TypeScopeHint.xtend delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ExtraInputOfTurnout.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/NoExtraInputOfTurnout.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyExtraInputsOfTurnout.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Turnout.java delete mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutInSegments.java create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3TypeScopeHint.xtendbin create mode 100644 Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3TypeScopeHint.java (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index 1e457bb2..e697e27d 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index 6ad24fc0..ddbe1979 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index 18c9aee3..e1e21292 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index 0ebd4493..b967ea7c 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index bb484ba1..2c271c98 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 61448536..40f87b4c 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index 9af9309d..d0715440 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/.gitignore b/Domains/ca.mcgill.rtgmrt.example.modes3/.gitignore index ae3c1726..6cef8ea6 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/.gitignore +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/.gitignore @@ -1 +1,2 @@ /bin/ +output/ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/META-INF/MANIFEST.MF b/Domains/ca.mcgill.rtgmrt.example.modes3/META-INF/MANIFEST.MF index 53e4a39c..96bd2113 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/META-INF/MANIFEST.MF +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/META-INF/MANIFEST.MF @@ -3,6 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: ca.mcgill.rtgmrt.example.modes3;singleton:=true Bundle-Version: 0.1.0.qualifier +Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: modes3, @@ -28,7 +29,7 @@ Require-Bundle: org.eclipse.viatra.query.runtime, org.eclipse.emf.ecore.xmi;bundle-version="2.16.0", hu.bme.mit.inf.dslreasoner.visualisation;bundle-version="1.0.0", org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.4.0" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Bundle-ActivationPolicy: lazy Import-Package: org.apache.log4j Automatic-Module-Name: ca.mcgill.rtgmrt.example.modes3 +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Factory.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Factory.java index 73188db1..10ce47a1 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Factory.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Factory.java @@ -57,6 +57,15 @@ public interface Modes3Factory extends EFactory { */ Train createTrain(); + /** + * Returns a new object of class 'Simple Segment'. + * + * + * @return a new object of class 'Simple Segment'. + * @generated + */ + SimpleSegment createSimpleSegment(); + /** * Returns the package supported by this factory. * diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3ModelRoot.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3ModelRoot.java index 4f925b7a..d46ee305 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3ModelRoot.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3ModelRoot.java @@ -62,7 +62,7 @@ public interface Modes3ModelRoot extends EObject { /** * Returns the value of the 'Segments' containment reference list. - * The list contents are of type {@link modes3.Segment}. + * The list contents are of type {@link modes3.SimpleSegment}. * * * @return the value of the 'Segments' containment reference list. @@ -70,7 +70,7 @@ public interface Modes3ModelRoot extends EObject { * @model containment="true" * @generated */ - EList getSegments(); + EList getSegments(); /** * Returns the value of the 'Turnouts' containment reference list. diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Package.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Package.java index 4760af9d..a19c1955 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Package.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/Modes3Package.java @@ -304,6 +304,62 @@ public interface Modes3Package extends EPackage { int TRAIN_OPERATION_COUNT = 0; + /** + * The meta object id for the '{@link modes3.impl.SimpleSegmentImpl Simple Segment}' class. + * + * + * @see modes3.impl.SimpleSegmentImpl + * @see modes3.impl.Modes3PackageImpl#getSimpleSegment() + * @generated + */ + int SIMPLE_SEGMENT = 4; + + /** + * The feature id for the 'Connected To' reference list. + * + * + * @generated + * @ordered + */ + int SIMPLE_SEGMENT__CONNECTED_TO = SEGMENT__CONNECTED_TO; + + /** + * The feature id for the 'Occupied By' reference. + * + * + * @generated + * @ordered + */ + int SIMPLE_SEGMENT__OCCUPIED_BY = SEGMENT__OCCUPIED_BY; + + /** + * The feature id for the 'Id' attribute. + * + * + * @generated + * @ordered + */ + int SIMPLE_SEGMENT__ID = SEGMENT__ID; + + /** + * The number of structural features of the 'Simple Segment' class. + * + * + * @generated + * @ordered + */ + int SIMPLE_SEGMENT_FEATURE_COUNT = SEGMENT_FEATURE_COUNT + 0; + + /** + * The number of operations of the 'Simple Segment' class. + * + * + * @generated + * @ordered + */ + int SIMPLE_SEGMENT_OPERATION_COUNT = SEGMENT_OPERATION_COUNT + 0; + + /** * Returns the meta object for class '{@link modes3.Segment Segment}'. * @@ -476,6 +532,16 @@ public interface Modes3Package extends EPackage { */ EAttribute getTrain_Speed(); + /** + * Returns the meta object for class '{@link modes3.SimpleSegment Simple Segment}'. + * + * + * @return the meta object for class 'Simple Segment'. + * @see modes3.SimpleSegment + * @generated + */ + EClass getSimpleSegment(); + /** * Returns the factory that creates the instances of the model. * @@ -635,6 +701,16 @@ public interface Modes3Package extends EPackage { */ EAttribute TRAIN__SPEED = eINSTANCE.getTrain_Speed(); + /** + * The meta object literal for the '{@link modes3.impl.SimpleSegmentImpl Simple Segment}' class. + * + * + * @see modes3.impl.SimpleSegmentImpl + * @see modes3.impl.Modes3PackageImpl#getSimpleSegment() + * @generated + */ + EClass SIMPLE_SEGMENT = eINSTANCE.getSimpleSegment(); + } } //Modes3Package diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/SimpleSegment.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/SimpleSegment.java new file mode 100644 index 00000000..da77510f --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/SimpleSegment.java @@ -0,0 +1,17 @@ +/** + */ +package modes3; + + +/** + * + * A representation of the model object 'Simple Segment'. + * + * + * + * @see modes3.Modes3Package#getSimpleSegment() + * @model + * @generated + */ +public interface SimpleSegment extends Segment { +} // SimpleSegment diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3FactoryImpl.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3FactoryImpl.java index 6ec86cb6..60947533 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3FactoryImpl.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3FactoryImpl.java @@ -60,6 +60,7 @@ public class Modes3FactoryImpl extends EFactoryImpl implements Modes3Factory { case Modes3Package.MODES3_MODEL_ROOT: return createModes3ModelRoot(); case Modes3Package.TURNOUT: return createTurnout(); case Modes3Package.TRAIN: return createTrain(); + case Modes3Package.SIMPLE_SEGMENT: return createSimpleSegment(); default: throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); } @@ -105,6 +106,16 @@ public class Modes3FactoryImpl extends EFactoryImpl implements Modes3Factory { return train; } + /** + * + * + * @generated + */ + public SimpleSegment createSimpleSegment() { + SimpleSegmentImpl simpleSegment = new SimpleSegmentImpl(); + return simpleSegment; + } + /** * * diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3ModelRootImpl.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3ModelRootImpl.java index d1ee25ff..ccab1f29 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3ModelRootImpl.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3ModelRootImpl.java @@ -6,7 +6,7 @@ import java.util.Collection; import modes3.Modes3ModelRoot; import modes3.Modes3Package; -import modes3.Segment; +import modes3.SimpleSegment; import modes3.Train; import modes3.Turnout; @@ -79,7 +79,7 @@ public class Modes3ModelRootImpl extends MinimalEObjectImpl.Container implements * @generated * @ordered */ - protected EList segments; + protected EList segments; /** * The cached value of the '{@link #getTurnouts() Turnouts}' containment reference list. @@ -148,9 +148,9 @@ public class Modes3ModelRootImpl extends MinimalEObjectImpl.Container implements * * @generated */ - public EList getSegments() { + public EList getSegments() { if (segments == null) { - segments = new EObjectContainmentEList(Segment.class, this, Modes3Package.MODES3_MODEL_ROOT__SEGMENTS); + segments = new EObjectContainmentEList(SimpleSegment.class, this, Modes3Package.MODES3_MODEL_ROOT__SEGMENTS); } return segments; } @@ -223,7 +223,7 @@ public class Modes3ModelRootImpl extends MinimalEObjectImpl.Container implements return; case Modes3Package.MODES3_MODEL_ROOT__SEGMENTS: getSegments().clear(); - getSegments().addAll((Collection)newValue); + getSegments().addAll((Collection)newValue); return; case Modes3Package.MODES3_MODEL_ROOT__TURNOUTS: getTurnouts().clear(); diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3PackageImpl.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3PackageImpl.java index 2b9e828c..557da4c1 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3PackageImpl.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/Modes3PackageImpl.java @@ -6,6 +6,7 @@ import modes3.Modes3Factory; import modes3.Modes3ModelRoot; import modes3.Modes3Package; import modes3.Segment; +import modes3.SimpleSegment; import modes3.Train; import modes3.Turnout; @@ -51,6 +52,13 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { */ private EClass trainEClass = null; + /** + * + * + * @generated + */ + private EClass simpleSegmentEClass = null; + /** * Creates an instance of the model Package, registered with * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package @@ -256,6 +264,15 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { return (EAttribute)trainEClass.getEStructuralFeatures().get(2); } + /** + * + * + * @generated + */ + public EClass getSimpleSegment() { + return simpleSegmentEClass; + } + /** * * @@ -303,6 +320,8 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { createEReference(trainEClass, TRAIN__LOCATION); createEAttribute(trainEClass, TRAIN__ID); createEAttribute(trainEClass, TRAIN__SPEED); + + simpleSegmentEClass = createEClass(SIMPLE_SEGMENT); } /** @@ -334,6 +353,7 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { // Add supertypes to classes turnoutEClass.getESuperTypes().add(this.getSegment()); + simpleSegmentEClass.getESuperTypes().add(this.getSegment()); // Initialize classes, features, and operations; add parameters initEClass(segmentEClass, Segment.class, "Segment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); @@ -344,7 +364,7 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { initEClass(modes3ModelRootEClass, Modes3ModelRoot.class, "Modes3ModelRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); initEAttribute(getModes3ModelRoot_Id(), ecorePackage.getEInt(), "id", null, 0, 1, Modes3ModelRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEReference(getModes3ModelRoot_Trains(), this.getTrain(), null, "trains", null, 0, -1, Modes3ModelRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); - initEReference(getModes3ModelRoot_Segments(), this.getSegment(), null, "segments", null, 0, -1, Modes3ModelRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getModes3ModelRoot_Segments(), this.getSimpleSegment(), null, "segments", null, 0, -1, Modes3ModelRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEReference(getModes3ModelRoot_Turnouts(), this.getTurnout(), null, "turnouts", null, 0, -1, Modes3ModelRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(turnoutEClass, Turnout.class, "Turnout", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); @@ -356,6 +376,8 @@ public class Modes3PackageImpl extends EPackageImpl implements Modes3Package { initEAttribute(getTrain_Id(), ecorePackage.getEInt(), "id", null, 0, 1, Train.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEAttribute(getTrain_Speed(), ecorePackage.getEDouble(), "speed", null, 0, 1, Train.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEClass(simpleSegmentEClass, SimpleSegment.class, "SimpleSegment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); + // Create resource createResource(eNS_URI); } diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/SimpleSegmentImpl.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/SimpleSegmentImpl.java new file mode 100644 index 00000000..e3fd6c34 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/impl/SimpleSegmentImpl.java @@ -0,0 +1,37 @@ +/** + */ +package modes3.impl; + +import modes3.Modes3Package; +import modes3.SimpleSegment; + +import org.eclipse.emf.ecore.EClass; + +/** + * + * An implementation of the model object 'Simple Segment'. + * + * + * @generated + */ +public class SimpleSegmentImpl extends SegmentImpl implements SimpleSegment { + /** + * + * + * @generated + */ + protected SimpleSegmentImpl() { + super(); + } + + /** + * + * + * @generated + */ + @Override + protected EClass eStaticClass() { + return Modes3Package.Literals.SIMPLE_SEGMENT; + } + +} //SimpleSegmentImpl diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3AdapterFactory.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3AdapterFactory.java index 86568e9d..9c5c8d2d 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3AdapterFactory.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3AdapterFactory.java @@ -84,6 +84,10 @@ public class Modes3AdapterFactory extends AdapterFactoryImpl { return createTrainAdapter(); } @Override + public Adapter caseSimpleSegment(SimpleSegment object) { + return createSimpleSegmentAdapter(); + } + @Override public Adapter defaultCase(EObject object) { return createEObjectAdapter(); } @@ -159,6 +163,20 @@ public class Modes3AdapterFactory extends AdapterFactoryImpl { return null; } + /** + * Creates a new adapter for an object of class '{@link modes3.SimpleSegment Simple Segment}'. + * + * This default implementation returns null so that we can easily ignore cases; + * it's useful to ignore a case when inheritance will catch all the cases anyway. + * + * @return the new adapter. + * @see modes3.SimpleSegment + * @generated + */ + public Adapter createSimpleSegmentAdapter() { + return null; + } + /** * Creates a new adapter for the default case. * diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3Switch.java b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3Switch.java index 5dab272b..0c28861a 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3Switch.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/ecore-gen/modes3/util/Modes3Switch.java @@ -91,6 +91,13 @@ public class Modes3Switch extends Switch { if (result == null) result = defaultCase(theEObject); return result; } + case Modes3Package.SIMPLE_SEGMENT: { + SimpleSegment simpleSegment = (SimpleSegment)theEObject; + T result = caseSimpleSegment(simpleSegment); + if (result == null) result = caseSegment(simpleSegment); + if (result == null) result = defaultCase(theEObject); + return result; + } default: return defaultCase(theEObject); } } @@ -155,6 +162,21 @@ public class Modes3Switch extends Switch { return null; } + /** + * Returns the result of interpreting the object as an instance of 'Simple Segment'. + * + * This implementation returns null; + * returning a non-null result will terminate the switch. + * + * @param object the target of the switch. + * @return the result of interpreting the object as an instance of 'Simple Segment'. + * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) + * @generated + */ + public T caseSimpleSegment(SimpleSegment object) { + return null; + } + /** * Returns the result of interpreting the object as an instance of 'EObject'. * diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.aird_deactivated b/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.aird_deactivated deleted file mode 100644 index f5400732..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.aird_deactivated +++ /dev/null @@ -1,1531 +0,0 @@ - - - - http://www.eclipse.org/emf/2002/Ecore - modes3.ecore - modes3.genmodel - ../src/modes3/queries/Modes3Queries.vql - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch - java:/Objects/java.lang.Object - java:/Objects/jdk.internal.HotSpotIntrinsicCandidate - java:/Objects/java.lang.annotation.Target - java:/Objects/java.lang.annotation.ElementType - java:/Objects/java.lang.Enum - java:/Objects/java.lang.Comparable - java:/Primitives - java:/Objects/java.lang.CloneNotSupportedException - java:/Objects/java.lang.Exception - java:/Objects/java.lang.Throwable - java:/Objects/java.io.Serializable - java:/Objects/java.lang.Deprecated - java:/Objects/java.lang.annotation.Retention - java:/Objects/java.lang.annotation.RetentionPolicy - java:/Objects/java.lang.String - java:/Objects/java.lang.CharSequence - java:/Objects/java.util.stream.IntStream - java:/Objects/java.util.stream.BaseStream - java:/Objects/java.lang.AutoCloseable - java:/Objects/java.lang.Class - java:/Objects/java.lang.reflect.GenericDeclaration - java:/Objects/java.lang.reflect.AnnotatedElement - java:/Objects/java.lang.annotation.Annotation - java:/Objects/java.lang.InterruptedException - java:/Objects/java.lang.StackTraceElement - java:/Objects/java.lang.Module - java:/Objects/java.lang.WeakPairMap - java:/Objects/java.lang.ref.ReferenceQueue - java:/Objects/java.lang.ref.Reference - java:/Objects/java.lang.Thread - java:/Objects/java.lang.Runnable - java:/Objects/java.lang.FunctionalInterface - java:/Objects/java.lang.annotation.Documented - java:/Objects/java.io.ObjectInputStream - java:/Objects/java.io.InputStream - java:/Objects/java.io.Closeable - java:/Objects/java.io.IOException - java:/Objects/java.util.Comparator - java:/Objects/java.util.function.Function - java:/Objects/java.lang.ClassNotFoundException - java:/Objects/java.lang.ReflectiveOperationException - java:/Objects/java.lang.StringBuffer - java:/Objects/java.lang.AbstractStringBuilder - java:/Objects/java.lang.Appendable - java:/Objects/java.io.ObjectStreamException - java:/Objects/java.io.PrintStream - java:/Objects/java.io.FilterOutputStream - java:/Objects/java.io.OutputStream - java:/Objects/java.io.Flushable - java:/Objects/java.io.ObjectInput - java:/Objects/java.io.DataInput - java:/Objects/java.io.ObjectStreamConstants - java:/Objects/java.io.SerializablePermission - java:/Objects/java.security.BasicPermission - java:/Objects/java.security.Permission - java:/Objects/java.security.Guard - java:/Objects/java.lang.SecurityException - java:/Objects/java.lang.RuntimeException - java:/Objects/java.lang.StringBuilder - java:/Objects/java.io.ObjectOutputStream - java:/Objects/java.io.ObjectOutput - java:/Objects/java.io.DataOutput - java:/Objects/java.io.DataInputStream - java:/Objects/java.io.FilterInputStream - java:/Objects/java.util.concurrent.ConcurrentMap - java:/Objects/java.util.Map - java:/Objects/java.util.function.BiFunction - java:/Objects/java.io.PrintWriter - java:/Objects/java.io.Writer - java:/Objects/java.io.ObjectStreamClass - java:/Objects/java.io.InvalidClassException - java:/Objects/java.util.Set - java:/Objects/java.util.Collection - java:/Objects/java.lang.Iterable - java:/Objects/java.util.function.Consumer - java:/Objects/java.util.List - java:/Objects/java.util.Iterator - java:/Objects/java.lang.Boolean - java:/Objects/java.lang.StackFrameInfo - java:/Objects/java.lang.StackWalker - java:/Objects/java.lang.invoke.MethodType - java:/Objects/java.lang.ref.WeakReference - java:/Objects/java.lang.ThreadGroup - java:/Objects/java.lang.Void - java:/Objects/java.io.ObjectInputFilter - java:/Objects/java.lang.IllegalArgumentException - java:/Objects/java.io.UnsupportedEncodingException - java:/Objects/java.lang.reflect.Type - java:/Objects/java.lang.System - java:/Objects/java.util.function.Supplier - java:/Objects/java.lang.ClassLoader - java:/Objects/java.util.Deque - java:/Objects/java.util.Queue - java:/Objects/java.util.stream.Stream - java:/Objects/java.util.function.Predicate - java:/Objects/java.lang.module.ModuleDescriptor - java:/Objects/java.util.Optional - java:/Objects/java.io.ObjectInputValidation - java:/Objects/java.io.InvalidObjectException - java:/Objects/sun.reflect.annotation.AnnotationType - java:/Objects/java.lang.reflect.Method - java:/Objects/java.lang.reflect.Executable - java:/Objects/java.lang.reflect.AccessibleObject - java:/Objects/jdk.internal.reflect.CallerSensitive - java:/Objects/java.lang.ModuleLayer - java:/Objects/java.lang.module.Configuration - java:/Objects/java.lang.module.Resolver - java:/Objects/java.lang.module.ModuleFinder - java:/Objects/java.lang.module.ModuleReference - java:/Objects/java.net.URI - java:/Objects/java.net.URISyntaxException - java:/Objects/java.lang.ref.SoftReference - java:/Objects/jdk.internal.vm.annotation.ForceInline - java:/Objects/java.lang.module.ResolvedModule - java:/Objects/java.security.AccessControlContext - java:/Objects/java.security.ProtectionDomain - java:/Objects/sun.security.util.Debug - java:/Objects/java.math.BigInteger - java:/Objects/java.lang.Number - java:/Objects/java.io.StreamCorruptedException - java:/Objects/jdk.internal.misc.Unsafe - java:/Objects/java.lang.InstantiationException - java:/Objects/java.lang.reflect.Constructor - java:/Objects/jdk.internal.reflect.ConstructorAccessor - java:/Objects/java.lang.reflect.InvocationTargetException - java:/Objects/java.lang.reflect.Field - java:/Objects/java.lang.reflect.Member - java:/Objects/java.io.Externalizable - java:/Objects/java.io.NotActiveException - java:/Objects/java.lang.SecurityManager - java:/Objects/java.net.InetAddress - java:/Objects/java.net.UnknownHostException - java:/Objects/java.lang.reflect.AnnotatedType - java:/Objects/java.io.SerialCallbackContext - java:/Objects/java.security.PermissionCollection - java:/Objects/java.util.Enumeration - java:/Objects/java.util.stream.Collector - java:/Objects/java.util.function.BiConsumer - java:/Objects/java.util.concurrent.ConcurrentHashMap - java:/Objects/java.util.AbstractMap - java:/Objects/java.util.stream.DoubleStream - java:/Objects/java.lang.Double - java:/Objects/java.lang.NumberFormatException - java:/Objects/jdk.internal.reflect.ConstantPool - java:/Objects/sun.nio.ch.Interruptible - java:/Objects/java.util.stream.LongStream - java:/Objects/java.lang.Long - java:/Objects/java.lang.ThreadLocal - java:/Objects/java.util.concurrent.atomic.AtomicInteger - java:/Objects/java.util.function.IntBinaryOperator - java:/Objects/jdk.internal.vm.annotation.Contended - java:/Objects/java.security.DomainCombiner - java:/Objects/java.util.function.UnaryOperator - java:/Objects/java.security.AccessControlException - java:/Objects/java.lang.NoSuchMethodException - java:/Objects/java.lang.NoSuchFieldException - java:/Objects/sun.reflect.generics.factory.GenericsFactory - java:/Objects/java.lang.reflect.TypeVariable - java:/Objects/java.util.function.ToDoubleFunction - java:/Objects/jdk.internal.misc.JavaSecurityAccess - java:/Objects/java.security.PrivilegedAction - java:/Objects/java.util.function.ToIntFunction - java:/Objects/java.security.CodeSource - java:/Objects/java.net.URL - java:/Objects/java.net.URLStreamHandlerFactory - java:/Objects/java.net.URLStreamHandler - java:/Objects/java.net.URLConnection - java:/Objects/java.net.UnknownServiceException - java:/Objects/sun.reflect.generics.repository.ClassRepository - java:/Objects/sun.reflect.generics.repository.GenericDeclRepository - java:/Objects/sun.reflect.generics.repository.AbstractRepository - java:/Objects/sun.reflect.generics.visitor.Reifier - java:/Objects/sun.reflect.generics.visitor.TypeTreeVisitor - java:/Objects/sun.reflect.generics.tree.ArrayTypeSignature - java:/Objects/sun.reflect.generics.tree.FieldTypeSignature - java:/Objects/sun.reflect.generics.tree.BaseType - java:/Objects/sun.reflect.generics.tree.TypeSignature - java:/Objects/sun.reflect.generics.tree.ReturnType - java:/Objects/sun.reflect.generics.tree.TypeTree - java:/Objects/sun.reflect.generics.tree.Tree - java:/Objects/java.util.function.ToLongFunction - java:/Objects/java.security.Principal - java:/Objects/javax.security.auth.Subject - java:/Objects/javax.security.auth.AuthPermission - java:/Objects/java.security.cert.Certificate - java:/Objects/java.security.cert.CertificateEncodingException - java:/Objects/java.security.cert.CertificateException - java:/Objects/java.security.GeneralSecurityException - java:/Objects/java.nio.charset.Charset - java:/Objects/java.nio.charset.spi.CharsetProvider - java:/Objects/java.lang.SafeVarargs - java:/Objects/java.security.CodeSigner - java:/Objects/java.security.cert.CertPath - java:/Objects/java.util.function.BinaryOperator - java:/Objects/java.security.cert.CertificateFactory - java:/Objects/java.security.cert.CertificateFactorySpi - java:/Objects/java.security.cert.CRLException - java:/Objects/java.util.Locale - java:/Objects/java.lang.Cloneable - java:/Objects/java.util.function.IntFunction - java:/Objects/java.net.SocketPermission - java:/Objects/java.net.MalformedURLException - java:/Objects/java.lang.PublicMethods - java:/Objects/jdk.internal.reflect.ReflectionFactory - java:/Objects/java.lang.invoke.MethodHandle - java:/Objects/java.lang.invoke.LambdaForm - java:/Objects/sun.invoke.util.Wrapper - java:/Objects/java.lang.ClassCastException - java:/Objects/java.lang.Package - java:/Objects/java.lang.NamedPackage - java:/Objects/java.util.Spliterator - java:/Objects/java.util.function.DoubleConsumer - java:/Objects/java.net.Proxy - java:/Objects/java.net.SocketAddress - java:/Objects/java.lang.Integer - java:/Objects/java.net.spi.URLStreamHandlerProvider - java:/Objects/java.util.function.IntConsumer - java:/Objects/java.util.Hashtable - java:/Objects/java.util.Dictionary - java:/Objects/java.util.function.LongConsumer - java:/Objects/java.io.ObjectStreamField - java:/Objects/java.util.Random - java:/Objects/java.util.concurrent.atomic.AtomicLong - java:/Objects/java.util.function.LongBinaryOperator - java:/Objects/java.net.UrlDeserializedState - java:/Objects/java.util.function.LongUnaryOperator - java:/Objects/java.io.FileDescriptor - java:/Objects/jdk.internal.ref.PhantomCleanable - java:/Objects/java.lang.ref.PhantomReference - java:/Objects/java.io.DataOutputStream - java:/Objects/java.util.ListIterator - java:/Objects/java.io.SyncFailedException - java:/Objects/java.lang.IllegalAccessException - java:/Objects/java.lang.ClassValue - java:/Objects/java.util.WeakHashMap - java:/Objects/java.util.AbstractSet - java:/Objects/java.util.AbstractCollection - java:/Objects/jdk.internal.reflect.FieldAccessor - java:/Objects/sun.reflect.generics.repository.FieldRepository - java:/Objects/jdk.internal.reflect.MethodAccessor - java:/Objects/jdk.internal.reflect.LangReflectAccess - java:/Objects/java.util.function.DoublePredicate - java:/Objects/java.lang.ref.Cleaner - java:/Objects/java.util.concurrent.ThreadFactory - java:/Objects/java.io.OptionalDataException - java:/Objects/java.util.OptionalDouble - java:/Objects/java.util.function.DoubleSupplier - java:/Objects/jdk.internal.ref.CleanerImpl - java:/Objects/jdk.internal.ref.SoftCleanable - java:/Objects/sun.reflect.generics.repository.ConstructorRepository - java:/Objects/sun.reflect.generics.tree.MethodTypeSignature - java:/Objects/sun.reflect.generics.tree.Signature - java:/Objects/sun.reflect.generics.tree.FormalTypeParameter - java:/Objects/sun.reflect.generics.tree.TypeArgument - java:/Objects/sun.reflect.generics.tree.BooleanSignature - java:/Objects/sun.reflect.generics.tree.BottomSignature - java:/Objects/sun.reflect.generics.tree.ByteSignature - java:/Objects/sun.reflect.generics.tree.CharSignature - java:/Objects/sun.reflect.generics.tree.ClassTypeSignature - java:/Objects/sun.reflect.generics.tree.SimpleClassTypeSignature - java:/Objects/sun.reflect.generics.tree.DoubleSignature - java:/Objects/sun.reflect.generics.tree.FloatSignature - java:/Objects/sun.reflect.generics.tree.IntSignature - java:/Objects/sun.reflect.generics.tree.LongSignature - java:/Objects/sun.reflect.generics.tree.ShortSignature - java:/Objects/sun.reflect.generics.tree.TypeVariableSignature - java:/Objects/sun.reflect.generics.tree.VoidDescriptor - java:/Objects/sun.reflect.generics.tree.Wildcard - java:/Objects/sun.reflect.generics.visitor.Visitor - java:/Objects/sun.reflect.generics.tree.ClassSignature - java:/Objects/sun.reflect.generics.repository.MethodRepository - java:/Objects/jdk.internal.ref.WeakCleanable - java:/Objects/java.lang.invoke.BoundMethodHandle - java:/Objects/java.lang.invoke.ClassSpecializer - java:/Objects/jdk.internal.org.objectweb.asm.MethodVisitor - java:/Objects/jdk.internal.org.objectweb.asm.AnnotationVisitor - java:/Objects/java.lang.invoke.MemberName - java:/Objects/java.lang.invoke.ResolvedMethodName - java:/Objects/java.lang.invoke.MethodHandleImpl - java:/Objects/java.lang.invoke.DelegatingMethodHandle - java:/Objects/java.lang.reflect.Parameter - java:/Objects/java.lang.invoke.MethodTypeForm - java:/Objects/jdk.internal.vm.annotation.Stable - java:/Objects/java.util.function.IntUnaryOperator - java:/Objects/java.util.function.IntPredicate - java:/Objects/java.util.function.ObjIntConsumer - java:/Objects/java.util.OptionalInt - java:/Objects/java.util.function.IntSupplier - java:/Objects/java.util.PrimitiveIterator - java:/Objects/java.util.function.IntToDoubleFunction - java:/Objects/java.util.function.IntToLongFunction - java:/Objects/java.util.IntSummaryStatistics - java:/Objects/java.lang.TypeNotPresentException - java:/Objects/java.lang.UnsupportedOperationException - java:/Objects/java.io.FileNotFoundException - java:/Objects/java.util.function.ObjDoubleConsumer - java:/Objects/java.util.function.DoubleFunction - java:/Objects/java.util.function.DoubleUnaryOperator - java:/Objects/java.util.function.DoubleToIntFunction - java:/Objects/java.util.function.DoubleToLongFunction - java:/Objects/java.util.function.DoubleBinaryOperator - java:/Objects/java.util.DoubleSummaryStatistics - java:/Objects/java.lang.invoke.Invokers - java:/Objects/java.lang.invoke.VarHandle - java:/Objects/java.lang.invoke.VarForm - java:/Objects/java.lang.invoke.LambdaFormEditor - java:/Objects/java.lang.invoke.LambdaFormBuffer - java:/Objects/java.util.ArrayList - java:/Objects/java.util.AbstractList - java:/Objects/java.util.RandomAccess - java:/Objects/java.lang.IndexOutOfBoundsException - java:/Objects/java.util.function.LongPredicate - java:/Objects/java.util.function.ObjLongConsumer - java:/Objects/java.util.OptionalLong - java:/Objects/java.util.function.LongSupplier - java:/Objects/java.util.function.LongFunction - java:/Objects/java.util.function.LongToDoubleFunction - java:/Objects/java.util.function.LongToIntFunction - java:/Objects/java.util.LongSummaryStatistics - java:/Objects/java.util.concurrent.CountedCompleter - java:/Objects/java.util.concurrent.ForkJoinTask - java:/Objects/java.util.concurrent.Future - java:/Objects/java.util.concurrent.ExecutionException - java:/Objects/java.io.File - java:/Objects/java.security.SecureRandom - java:/Objects/java.util.regex.Pattern - java:/Objects/java.util.regex.Matcher - java:/Objects/java.util.regex.MatchResult - java:/Objects/java.util.function.ToDoubleBiFunction - java:/Objects/java.lang.invoke.CallSite - java:/Objects/java.lang.invoke.WrongMethodTypeException - java:/Objects/java.io.OutputStreamWriter - java:/Objects/java.nio.charset.CharsetEncoder - java:/Objects/java.nio.CharBuffer - java:/Objects/java.nio.Buffer - java:/Objects/java.util.function.ToIntBiFunction - java:/Objects/jdk.internal.vm.annotation.DontInline - java:/Objects/java.lang.ArrayIndexOutOfBoundsException - java:/Objects/java.lang.ClassFormatError - java:/Objects/java.lang.LinkageError - java:/Objects/java.lang.Error - java:/Objects/java.nio.ByteBuffer - java:/Objects/java.nio.DoubleBuffer - java:/Objects/java.nio.ByteOrder - java:/Objects/java.util.function.ToLongBiFunction - java:/Objects/java.lang.invoke.MethodHandleNatives - java:/Objects/java.lang.NoSuchMethodError - java:/Objects/java.lang.IncompatibleClassChangeError - java:/Objects/java.lang.AssertionStatusDirectives - java:/Objects/java.util.concurrent.atomic.AtomicReference - java:/Objects/java.util.concurrent.locks.ReentrantLock - java:/Objects/java.util.concurrent.locks.Lock - java:/Objects/java.util.concurrent.locks.Condition - java:/Objects/java.util.concurrent.TimeUnit - java:/Objects/java.time.Duration - java:/Objects/java.time.temporal.TemporalAmount - java:/Objects/java.time.temporal.Temporal - java:/Objects/java.time.temporal.TemporalAccessor - java:/Objects/java.time.temporal.TemporalField - java:/Objects/java.time.temporal.TemporalUnit - java:/Objects/java.util.concurrent.RunnableFuture - java:/Objects/jdk.internal.perf.PerfCounter - java:/Objects/java.nio.LongBuffer - java:/Objects/java.net.ContentHandler - java:/Objects/java.util.concurrent.Callable - java:/Objects/jdk.internal.misc.JavaLangInvokeAccess - java:/Objects/java.util.HashMap - java:/Objects/java.util.LinkedHashMap - java:/Objects/jdk.internal.perf.Perf - java:/Objects/java.util.concurrent.TimeoutException - java:/Objects/java.util.Vector - java:/Objects/java.nio.FloatBuffer - java:/Objects/java.net.FileNameMap - java:/Objects/java.util.concurrent.ForkJoinPool - java:/Objects/java.util.concurrent.AbstractExecutorService - java:/Objects/java.util.concurrent.ExecutorService - java:/Objects/java.util.concurrent.Executor - java:/Objects/java.time.temporal.ChronoUnit - java:/Objects/java.nio.IntBuffer - java:/Objects/java.net.ContentHandlerFactory - java:/Objects/java.math.BigDecimal - java:/Objects/java.math.MathContext - java:/Objects/java.math.RoundingMode - java:/Objects/java.nio.ShortBuffer - java:/Objects/sun.net.www.MessageHeader - java:/Objects/java.util.regex.PatternSyntaxException - java:/Objects/java.security.Timestamp - java:/Objects/java.util.Date - java:/Objects/java.time.Instant - java:/Objects/java.time.temporal.TemporalAdjuster - java:/Objects/java.lang.Readable - java:/Objects/java.util.regex.IntHashSet - java:/Objects/java.time.temporal.TemporalQuery - java:/Objects/jdk.internal.org.objectweb.asm.Attribute - java:/Objects/jdk.internal.org.objectweb.asm.ClassReader - java:/Objects/jdk.internal.org.objectweb.asm.ClassVisitor - java:/Objects/jdk.internal.org.objectweb.asm.FieldVisitor - java:/Objects/jdk.internal.org.objectweb.asm.TypePath - java:/Objects/java.time.temporal.ValueRange - java:/Objects/jdk.internal.org.objectweb.asm.Handle - java:/Objects/java.time.format.ResolverStyle - java:/Objects/jdk.internal.org.objectweb.asm.Label - java:/Objects/jdk.internal.org.objectweb.asm.MethodWriter - java:/Objects/jdk.internal.org.objectweb.asm.ClassWriter - java:/Objects/jdk.internal.org.objectweb.asm.Item - java:/Objects/sun.util.locale.InternalLocaleBuilder - java:/Objects/sun.util.locale.LocaleSyntaxException - java:/Objects/sun.util.calendar.BaseCalendar - java:/Objects/sun.util.calendar.AbstractCalendar - java:/Objects/sun.util.calendar.CalendarSystem - java:/Objects/sun.util.calendar.CalendarDate - java:/Objects/java.util.TimeZone - java:/Objects/java.time.ZoneId - java:/Objects/java.time.format.TextStyle - java:/Objects/jdk.internal.org.objectweb.asm.ByteVector - java:/Objects/sun.util.locale.LocaleObjectCache - java:/Objects/sun.util.locale.BaseLocale - java:/Objects/sun.util.locale.LocaleExtensions - java:/Objects/java.lang.Character - java:/Objects/jdk.internal.org.objectweb.asm.Context - java:/Objects/sun.util.locale.provider.LocaleServiceProviderPool - java:/Objects/java.util.spi.LocaleServiceProvider - java:/Objects/java.math.MutableBigInteger - java:/Objects/java.util.spi.LocaleNameProvider - java:/Objects/java.util.concurrent.ForkJoinWorkerThread - java:/Objects/java.util.ResourceBundle - java:/Objects/java.util.ServiceLoader - java:/Objects/jdk.internal.module.ServicesCatalog - java:/Objects/jdk.internal.loader.ClassLoaderValue - java:/Objects/jdk.internal.loader.AbstractClassLoaderValue - java:/Objects/java.lang.IllegalStateException - java:/Objects/java.util.Formatter - java:/Objects/java.util.Calendar - java:/Objects/java.text.DateFormatSymbols - java:/Objects/java.lang.RuntimePermission - java:/Objects/jdk.internal.org.objectweb.asm.ModuleVisitor - java:/Objects/sun.util.locale.provider.LocaleResources - java:/Objects/sun.util.locale.provider.ResourceBundleBasedAdapter - java:/Objects/sun.util.resources.LocaleData - java:/Objects/java.util.spi.ResourceBundleProvider - java:/Objects/jdk.internal.vm.annotation.ReservedStackAccess - java:/Objects/jdk.internal.org.objectweb.asm.AnnotationWriter - java:/Objects/jdk.internal.org.objectweb.asm.FieldWriter - java:/Objects/jdk.internal.org.objectweb.asm.ModuleWriter - java:/Objects/java.util.MissingResourceException - java:/Objects/java.io.BufferedWriter - java:/Objects/sun.util.locale.LanguageTag - java:/Objects/sun.util.locale.ParseStatus - java:/Objects/sun.util.locale.StringTokenIterator - java:/Objects/sun.util.locale.Extension - java:/Objects/java.util.SortedMap - java:/Objects/jdk.internal.org.objectweb.asm.Frame - java:/Objects/jdk.internal.org.objectweb.asm.Type - java:/Objects/sun.util.locale.provider.LocaleProviderAdapter - java:/Objects/sun.util.locale.provider.FallbackLocaleProviderAdapter - java:/Objects/sun.util.locale.provider.JRELocaleProviderAdapter - java:/Objects/java.text.spi.BreakIteratorProvider - java:/Objects/java.text.BreakIterator - java:/Objects/java.text.CharacterIterator - java:/Objects/sun.util.calendar.Era - java:/Objects/java.util.concurrent.locks.AbstractQueuedSynchronizer - java:/Objects/java.util.concurrent.locks.AbstractOwnableSynchronizer - java:/Objects/java.io.FilenameFilter - java:/Objects/jdk.internal.org.objectweb.asm.Handler - java:/Objects/sun.util.calendar.Gregorian - java:/Objects/java.time.ZoneOffset - java:/Objects/java.time.zone.ZoneRules - java:/Objects/java.time.zone.ZoneOffsetTransition - java:/Objects/java.time.LocalDateTime - java:/Objects/java.time.chrono.ChronoLocalDateTime - java:/Objects/java.time.chrono.ChronoZonedDateTime - java:/Objects/java.time.format.DateTimeFormatter - java:/Objects/java.text.Format - java:/Objects/java.text.AttributedCharacterIterator - java:/Objects/java.time.zone.ZoneOffsetTransitionRule - java:/Objects/java.time.Month - java:/Objects/jdk.internal.org.objectweb.asm.Edge - java:/Objects/java.time.DayOfWeek - java:/Objects/sun.invoke.empty.Empty - java:/Objects/java.time.LocalTime - java:/Objects/java.time.LocalDate - java:/Objects/java.time.chrono.ChronoLocalDate - java:/Objects/java.time.chrono.Chronology - java:/Objects/java.time.chrono.Era - java:/Objects/java.lang.InternalError - java:/Objects/java.lang.VirtualMachineError - java:/Objects/java.io.FileFilter - java:/Objects/java.lang.reflect.ParameterizedType - java:/Objects/java.time.OffsetTime - java:/Objects/java.time.OffsetDateTime - java:/Objects/java.time.ZonedDateTime - java:/Objects/java.time.Clock - java:/Objects/java.lang.reflect.WildcardType - java:/Objects/java.time.Period - java:/Objects/java.time.chrono.ChronoPeriod - java:/Objects/java.net.NetworkInterface - java:/Objects/java.net.SocketException - java:/Objects/java.util.spi.ResourceBundleControlProvider - java:/Objects/java.time.chrono.IsoChronology - java:/Objects/java.time.chrono.AbstractChronology - java:/Objects/java.time.temporal.ChronoField - java:/Objects/java.net.InetAddressImpl - java:/Objects/java.time.chrono.IsoEra - java:/Objects/java.util.NavigableSet - java:/Objects/java.util.SortedSet - java:/Objects/java.net.InterfaceAddress - java:/Objects/java.net.Inet4Address - java:/Objects/java.security.PublicKey - java:/Objects/java.security.Key - java:/Objects/java.text.FieldPosition - java:/Objects/java.text.ParseException - java:/Objects/java.util.ServiceConfigurationError - java:/Objects/java.nio.file.Path - java:/Objects/java.nio.file.Watchable - java:/Objects/java.nio.file.WatchService - java:/Objects/java.nio.file.WatchKey - java:/Objects/java.nio.file.WatchEvent - java:/Objects/java.text.ParsePosition - java:/Objects/java.time.format.DateTimeFormatterBuilder - java:/Objects/java.time.format.DateTimePrintContext - java:/Objects/java.time.format.DecimalStyle - java:/Objects/java.time.format.DateTimeParseException - java:/Objects/java.time.DateTimeException - java:/Objects/java.io.FileSystem - java:/Objects/java.time.format.FormatStyle - java:/Objects/java.security.NoSuchAlgorithmException - java:/Objects/java.security.SecureRandomSpi - java:/Objects/java.security.SecureRandomParameters - java:/Objects/java.time.format.DateTimeParseContext - java:/Objects/java.time.format.Parsed - java:/Objects/java.io.BufferedReader - java:/Objects/java.io.Reader - java:/Objects/java.time.format.SignStyle - java:/Objects/java.security.InvalidKeyException - java:/Objects/java.security.KeyException - java:/Objects/java.security.Provider - java:/Objects/java.util.Properties - java:/Objects/java.util.InvalidPropertiesFormatException - java:/Objects/java.io.NotSerializableException - java:/Objects/jdk.internal.misc.JavaLangAccess - java:/Objects/java.nio.charset.CharacterCodingException - java:/Objects/java.security.NoSuchProviderException - java:/Objects/java.lang.LayerInstantiationException - java:/Objects/java.security.MessageDigest - java:/Objects/java.security.MessageDigestSpi - java:/Objects/java.security.DigestException - java:/Objects/java.time.format.DateTimeTextProvider - java:/Objects/sun.security.util.MessageDigestSpi2 - java:/Objects/javax.crypto.SecretKey - java:/Objects/javax.security.auth.Destroyable - java:/Objects/javax.security.auth.DestroyFailedException - java:/Objects/jdk.internal.module.ModuleTarget - java:/Objects/java.nio.file.FileSystem - java:/Objects/java.nio.file.FileStore - java:/Objects/java.nio.file.attribute.FileStoreAttributeView - java:/Objects/java.nio.file.attribute.AttributeView - java:/Objects/java.nio.file.LinkOption - java:/Objects/java.nio.file.OpenOption - java:/Objects/java.nio.file.PathMatcher - java:/Objects/java.security.SignatureException - java:/Objects/java.nio.file.attribute.UserPrincipalLookupService - java:/Objects/java.nio.file.attribute.GroupPrincipal - java:/Objects/java.nio.file.attribute.UserPrincipal - java:/Objects/java.nio.file.spi.FileSystemProvider - java:/Objects/java.nio.file.AccessMode - java:/Objects/java.nio.charset.CharsetDecoder - java:/Objects/java.nio.charset.CoderResult - java:/Objects/java.nio.file.attribute.FileAttributeView - java:/Objects/java.util.LinkedList - java:/Objects/java.util.AbstractSequentialList - java:/Objects/sun.util.resources.Bundles - java:/Objects/jdk.internal.misc.JavaUtilResourceBundleAccess - java:/Objects/java.util.EnumSet - java:/Objects/java.security.cert.CRL - java:/Objects/java.security.PrivilegedExceptionAction - java:/Objects/java.security.PrivilegedActionException - java:/Objects/java.lang.module.ModuleReader - java:/Objects/java.nio.file.CopyOption - java:/Objects/java.nio.file.attribute.FileAttribute - java:/Objects/java.nio.channels.AsynchronousFileChannel - java:/Objects/java.nio.channels.AsynchronousChannel - java:/Objects/java.nio.channels.Channel - java:/Objects/java.nio.channels.SeekableByteChannel - java:/Objects/java.nio.channels.ByteChannel - java:/Objects/java.nio.channels.ReadableByteChannel - java:/Objects/java.nio.file.DirectoryStream - java:/Objects/sun.util.resources.OpenListResourceBundle - java:/Objects/java.nio.channels.FileChannel - java:/Objects/java.nio.channels.spi.AbstractInterruptibleChannel - java:/Objects/java.nio.channels.InterruptibleChannel - java:/Objects/java.nio.file.attribute.BasicFileAttributes - java:/Objects/java.nio.file.attribute.FileTime - java:/Objects/java.nio.channels.FileLock - java:/Objects/java.nio.channels.WritableByteChannel - java:/Objects/java.nio.channels.CompletionHandler - java:/Objects/java.nio.channels.GatheringByteChannel - java:/Objects/java.nio.channels.ScatteringByteChannel - java:/Objects/java.nio.MappedByteBuffer - java:/Objects/sun.util.resources.TimeZoneNamesBundle - java:/Objects/java.nio.channels.AsynchronousCloseException - java:/Objects/java.nio.channels.ClosedChannelException - java:/Objects/sun.nio.cs.StreamEncoder - java:/Objects/sun.util.resources.ParallelListResourceBundle - java:/Objects/java.util.concurrent.atomic.AtomicMarkableReference - java:/Objects/java.nio.charset.CodingErrorAction - java:/Objects/java.util.spi.CalendarDataProvider - java:/Objects/java.io.Console - java:/Objects/java.util.spi.CalendarNameProvider - java:/Objects/java.io.FileOutputStream - java:/Objects/jdk.internal.misc.JavaIOFileDescriptorAccess - java:/Objects/sun.util.spi.CalendarProvider - java:/Objects/java.text.spi.CollatorProvider - java:/Objects/java.text.Collator - java:/Objects/java.text.CollationKey - java:/Objects/java.util.spi.CurrencyNameProvider - java:/Objects/java.text.spi.DateFormatProvider - java:/Objects/java.text.DateFormat - java:/Objects/java.text.NumberFormat - java:/Objects/java.util.Currency - java:/Objects/java.util.HashSet - java:/Objects/java.text.spi.DateFormatSymbolsProvider - java:/Objects/java.text.spi.DecimalFormatSymbolsProvider - java:/Objects/java.text.DecimalFormatSymbols - java:/Objects/sun.text.spi.JavaTimeDateTimePatternProvider - java:/Objects/java.text.spi.NumberFormatProvider - java:/Objects/java.util.spi.TimeZoneNameProvider - java:/Objects/org.eclipse.viatra.query.runtime.api.IPatternMatch - java:/Objects/org.eclipse.viatra.query.runtime.api.IQuerySpecification - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQueryHeader - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IInputKey - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.PTraceable - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.PBody - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.PVariable - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryMetaContext - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.InputKeyImplication - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IPosetComparator - java:/Objects/org.eclipse.viatra.query.runtime.matchers.tuple.Tuple - java:/Objects/org.eclipse.viatra.query.runtime.matchers.tuple.AbstractTuple - java:/Objects/org.eclipse.viatra.query.runtime.matchers.tuple.ITuple - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.TypeJudgement - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.VariableDeferredPConstraint - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.DeferredPConstraint - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.BasePConstraint - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.QueryHintOption - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IQueryBackendFactory - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IMatcherCapability - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryBackendContext - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IQueryBackendHintProvider - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.PProblem - java:/Objects/org.eclipse.viatra.query.runtime.matchers.planning.QueryProcessingException - java:/Objects/org.eclipse.viatra.query.runtime.matchers.ViatraQueryRuntimeException - java:/Objects/org.eclipse.viatra.query.runtime.matchers.planning.SubPlan - java:/Objects/org.eclipse.viatra.query.runtime.matchers.planning.operations.POperation - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IQueryBackend - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IQueryResultProvider - java:/Objects/org.eclipse.viatra.query.runtime.matchers.backend.IUpdateable - java:/Objects/org.eclipse.viatra.query.runtime.matchers.tuple.TupleMask - java:/Objects/org.eclipse.viatra.query.runtime.matchers.tuple.IModifiableTuple - java:/Objects/org.eclipse.viatra.query.runtime.matchers.util.Accuracy - java:/Objects/org.apache.log4j.Logger - java:/Objects/org.apache.log4j.Category - java:/Objects/org.apache.log4j.spi.AppenderAttachable - java:/Objects/org.apache.log4j.Appender - java:/Objects/org.apache.log4j.spi.Filter - java:/Objects/org.apache.log4j.spi.OptionHandler - java:/Objects/org.apache.log4j.spi.LoggingEvent - java:/Objects/org.apache.log4j.Priority - java:/Objects/org.apache.log4j.Level - java:/Objects/org.apache.log4j.spi.ThrowableInformation - java:/Objects/org.apache.log4j.spi.LocationInfo - java:/Objects/java.io.StringWriter - java:/Objects/org.apache.log4j.spi.LoggerRepository - java:/Objects/org.apache.log4j.spi.HierarchyEventListener - java:/Objects/org.apache.log4j.helpers.AppenderAttachableImpl - java:/Objects/org.apache.log4j.spi.ErrorHandler - java:/Objects/org.apache.log4j.spi.LoggerFactory - java:/Objects/org.apache.log4j.Layout - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.analysis.QueryAnalyzer - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryCacheContext - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryResultProviderAccess - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContext - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener - java:/Objects/org.eclipse.viatra.query.runtime.matchers.context.IndexingService - java:/Objects/org.eclipse.viatra.query.runtime.api.ViatraQueryEngine - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.IBaseIndex - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.ViatraBaseIndexChangeListener - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.IIndexingErrorListener - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.IInstanceObserver - java:/Objects/org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.QueryScope - java:/Objects/org.eclipse.viatra.query.runtime.internal.apiimpl.EngineContextFactory - java:/Objects/org.eclipse.viatra.query.runtime.api.scope.IEngineContext - java:/Objects/org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseMatcher - java:/Objects/org.eclipse.viatra.query.runtime.internal.apiimpl.QueryResultWrapper - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseQuerySpecification - java:/Objects/java.lang.ExceptionInInitializerError - java:/Objects/org.eclipse.viatra.query.runtime.exception.ViatraQueryException - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.QueryInitializationException - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseQueryGroup - java:/Objects/org.eclipse.viatra.query.runtime.api.IQueryGroup - java:/Objects/org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine - java:/Objects/org.eclipse.viatra.query.runtime.api.ViatraQueryEngineLifecycleListener - java:/Objects/org.eclipse.viatra.query.runtime.api.IMatchUpdateListener - java:/Objects/org.eclipse.viatra.query.runtime.api.ViatraQueryModelUpdateListener - java:/Objects/java.lang.Override - java:/Objects/org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery - java:/Objects/org.eclipse.viatra.query.runtime.matchers.psystem.queries.BasePQuery - java:/Objects/org.eclipse.emf.ecore.EClassifier - java:/Objects/org.eclipse.emf.ecore.ENamedElement - java:/Objects/org.eclipse.emf.ecore.EModelElement - java:/Objects/org.eclipse.emf.ecore.EObject - java:/Objects/org.eclipse.emf.common.notify.Notifier - java:/Objects/org.eclipse.emf.common.util.EList - java:/Objects/org.eclipse.emf.common.notify.Adapter - java:/Objects/org.eclipse.emf.common.notify.Notification - java:/Objects/org.eclipse.emf.common.util.TreeIterator - java:/Objects/org.eclipse.emf.ecore.EClass - java:/Objects/org.eclipse.emf.ecore.EAttribute - java:/Objects/org.eclipse.emf.ecore.EStructuralFeature - java:/Objects/org.eclipse.emf.ecore.ETypedElement - java:/Objects/org.eclipse.emf.ecore.EGenericType - java:/Objects/org.eclipse.emf.ecore.ETypeParameter - java:/Objects/org.eclipse.emf.ecore.EAnnotation - java:/Objects/org.eclipse.emf.common.util.EMap - java:/Objects/org.eclipse.emf.ecore.EReference - java:/Objects/org.eclipse.emf.ecore.InternalEObject - java:/Objects/org.eclipse.emf.common.notify.NotificationChain - java:/Objects/org.eclipse.emf.ecore.resource.Resource - java:/Objects/org.eclipse.emf.common.util.URI - java:/Objects/org.eclipse.emf.common.util.Pool - java:/Objects/org.eclipse.emf.common.util.WeakInterningHashSet - java:/Objects/org.eclipse.emf.common.util.InterningSet - java:/Objects/java.util.concurrent.locks.ReentrantReadWriteLock - java:/Objects/java.util.concurrent.locks.ReadWriteLock - java:/Objects/java.lang.IllegalMonitorStateException - java:/Objects/org.eclipse.emf.common.util.SegmentSequence - java:/Objects/org.eclipse.emf.common.util.CommonUtil - java:/Objects/org.eclipse.emf.ecore.resource.ResourceSet - java:/Objects/org.eclipse.emf.common.notify.AdapterFactory - java:/Objects/org.eclipse.emf.ecore.EPackage - java:/Objects/org.eclipse.emf.ecore.EFactory - java:/Objects/org.eclipse.emf.ecore.EDataType - java:/Objects/org.eclipse.emf.common.CommonPlugin - java:/Objects/org.eclipse.emf.common.EMFPlugin - java:/Objects/org.eclipse.emf.common.util.DelegatingResourceLocator - java:/Objects/org.eclipse.emf.common.util.ResourceLocator - java:/Objects/org.eclipse.emf.common.util.Logger - java:/Objects/org.eclipse.core.runtime.Plugin - java:/Objects/org.osgi.framework.BundleActivator - java:/Objects/org.osgi.framework.BundleContext - java:/Objects/org.osgi.framework.BundleReference - java:/Objects/org.osgi.framework.Bundle - java:/Objects/org.osgi.framework.ServiceReference - java:/Objects/java.security.cert.X509Certificate - java:/Objects/java.security.cert.X509Extension - java:/Objects/java.security.cert.CertificateExpiredException - java:/Objects/java.security.cert.CertificateNotYetValidException - java:/Objects/java.security.cert.CertificateParsingException - java:/Objects/javax.security.auth.x500.X500Principal - java:/Objects/sun.security.x509.X500Name - java:/Objects/sun.security.x509.GeneralNameInterface - java:/Objects/sun.security.util.DerOutputStream - java:/Objects/java.io.ByteArrayOutputStream - java:/Objects/sun.security.util.DerEncoder - java:/Objects/sun.security.util.DerValue - java:/Objects/sun.security.util.DerInputBuffer - java:/Objects/java.io.ByteArrayInputStream - java:/Objects/sun.security.util.BitArray - java:/Objects/sun.security.util.DerInputStream - java:/Objects/sun.security.util.ObjectIdentifier - java:/Objects/sun.security.util.ByteArrayLexOrder - java:/Objects/sun.security.util.ByteArrayTagOrder - java:/Objects/sun.security.x509.RDN - java:/Objects/sun.security.x509.AVA - java:/Objects/java.lang.Byte - java:/Objects/org.osgi.framework.Version - java:/Objects/org.osgi.framework.BundleException - java:/Objects/org.osgi.framework.BundleListener - java:/Objects/java.util.EventListener - java:/Objects/org.osgi.framework.BundleEvent - java:/Objects/java.util.EventObject - java:/Objects/org.osgi.framework.FrameworkListener - java:/Objects/org.osgi.framework.FrameworkEvent - java:/Objects/org.osgi.framework.ServiceListener - java:/Objects/org.osgi.framework.ServiceEvent - java:/Objects/org.osgi.framework.InvalidSyntaxException - java:/Objects/org.osgi.framework.Filter - java:/Objects/org.osgi.framework.ServiceObjects - java:/Objects/org.osgi.framework.ServiceRegistration - java:/Objects/org.osgi.framework.ServiceFactory - java:/Objects/org.eclipse.core.runtime.IPath - java:/Objects/org.eclipse.osgi.service.debug.DebugOptions - java:/Objects/org.eclipse.osgi.service.debug.DebugTrace - java:/Objects/org.eclipse.core.runtime.ILog - java:/Objects/org.eclipse.core.runtime.ILogListener - java:/Objects/org.eclipse.core.runtime.IStatus - java:/Objects/org.eclipse.core.runtime.Preferences - java:/Objects/org.eclipse.core.runtime.CoreException - java:/Objects/org.eclipse.core.runtime.ListenerList - java:/Objects/org.osgi.util.tracker.ServiceTracker - java:/Objects/org.osgi.util.tracker.ServiceTrackerCustomizer - java:/Objects/org.osgi.framework.AllServiceListener - java:/Objects/org.osgi.util.tracker.AbstractTracked - java:/Objects/org.eclipse.emf.ecore.EOperation - java:/Objects/org.eclipse.emf.ecore.EParameter - java:/Objects/org.eclipse.emf.ecore.util.FeatureMap - java:/Objects/org.eclipse.emf.ecore.util.InternalEList - java:/Objects/org.eclipse.emf.ecore.util.EContentsEList - java:/Objects/org.eclipse.emf.ecore.util.AbstractSequentialInternalEList - java:/Objects/org.eclipse.emf.ecore.resource.URIConverter - java:/Objects/java.io.InputStreamReader - java:/Objects/sun.nio.cs.StreamDecoder - java:/Objects/java.io.FileInputStream - java:/Objects/org.eclipse.emf.ecore.resource.ContentHandler - java:/Objects/org.eclipse.emf.ecore.resource.URIHandler - java:/Objects/org.eclipse.emf.ecore.EEnumLiteral - java:/Objects/org.eclipse.emf.common.util.Enumerator - java:/Objects/org.eclipse.emf.ecore.EEnum - java:/Objects/modes3.Segment - java:/Objects/modes3.Train - java:/Objects/java.lang.SuppressWarnings - java:/Objects/modes3.Turnout - ../src/modes3/run/Modes3ModelGenerator.xtend - java:/Objects/org.eclipse.xtend.lib.annotations.FinalFieldsConstructor - java:/Objects/org.eclipse.xtend.lib.macro.Active - java:/Objects/com.google.common.annotations.Beta - java:/Objects/com.google.common.annotations.GwtCompatible - java:/Objects/org.eclipse.xtend.lib.annotations.FinalFieldsConstructorProcessor - java:/Objects/org.eclipse.xtend.lib.macro.TransformationParticipant - java:/Objects/org.eclipse.xtext.xbase.lib.Extension - java:/Objects/org.eclipse.xtend.lib.macro.TransformationContext - java:/Objects/org.eclipse.xtend.lib.macro.services.Tracability - java:/Objects/org.eclipse.xtend.lib.macro.declaration.Element - java:/Objects/org.eclipse.xtend.lib.macro.services.ProblemSupport - java:/Objects/org.eclipse.xtend.lib.macro.services.Problem - java:/Objects/org.eclipse.xtext.xbase.lib.Procedures - java:/Objects/org.eclipse.xtend.lib.macro.services.TypeReferenceProvider - java:/Objects/org.eclipse.xtend.lib.macro.declaration.TypeReference - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ResolvedMethod - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ResolvedExecutable - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ExecutableDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.TypeParameterDeclarator - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MemberDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.Declaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.AnnotationTarget - java:/Objects/org.eclipse.xtend.lib.macro.declaration.NamedElement - java:/Objects/org.eclipse.xtend.lib.macro.declaration.CompilationUnit - java:/Objects/org.eclipse.xtend.lib.macro.file.Path - java:/Objects/com.google.common.collect.ImmutableList - java:/Objects/com.google.common.collect.ImmutableCollection - java:/Objects/com.google.common.collect.UnmodifiableIterator - java:/Objects/com.google.common.annotations.VisibleForTesting - java:/Objects/com.google.common.collect.UnmodifiableListIterator - java:/Objects/com.google.common.base.Splitter - java:/Objects/com.google.common.base.AbstractIterator - java:/Objects/com.google.common.base.CharMatcher - java:/Objects/com.google.common.base.Predicate - java:/Objects/com.google.common.annotations.GwtIncompatible - java:/Objects/java.util.BitSet - java:/Objects/com.google.common.base.CommonPattern - java:/Objects/com.google.common.base.CommonMatcher - java:/Objects/org.eclipse.xtend.lib.macro.declaration.TypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.Type - java:/Objects/org.eclipse.xtend.lib.macro.declaration.AnnotationReference - java:/Objects/org.eclipse.xtend.lib.macro.declaration.AnnotationTypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.AnnotationTypeElementDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.expression.Expression - java:/Objects/org.eclipse.xtend.lib.macro.declaration.Modifier - java:/Objects/org.eclipse.xtend.lib.macro.declaration.Visibility - java:/Objects/org.eclipse.xtend.lib.macro.declaration.EnumerationValueDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.EnumerationTypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ConstructorDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ParameterDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.FieldDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MethodDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.TypeParameterDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ClassDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.InterfaceDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ResolvedConstructor - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ResolvedParameter - java:/Objects/org.eclipse.xtend.lib.macro.declaration.ResolvedTypeParameter - java:/Objects/org.eclipse.xtend.lib.macro.services.TypeLookup - java:/Objects/org.eclipse.xtend.lib.macro.services.GlobalTypeLookup - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableAnnotationTypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableTypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableMemberDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableAnnotationTarget - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableNamedElement - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableElement - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableConstructorDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableExecutableDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableTypeParameterDeclarator - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableTypeParameterDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.CompilationStrategy - java:/Objects/org.eclipse.xtend2.lib.StringConcatenationClient - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableMethodDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableParameterDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableEnumerationTypeDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableEnumerationValueDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableInterfaceDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.declaration.MutableAnnotationTypeElementDeclaration - java:/Objects/org.eclipse.xtend.lib.macro.file.FileSystemSupport - java:/Objects/org.eclipse.xtend.lib.macro.file.FileLocations - java:/Objects/org.eclipse.xtend.lib.macro.services.AnnotationReferenceProvider - java:/Objects/org.eclipse.xtend.lib.macro.services.AnnotationReferenceBuildContext - java:/Objects/org.eclipse.xtend.lib.macro.services.Associator - java:/Objects/org.eclipse.xtend.lib.annotations.Data - java:/Objects/org.eclipse.xtend.lib.annotations.DataProcessor - java:/Objects/org.eclipse.xtend.lib.macro.AbstractClassProcessor - java:/Objects/org.eclipse.xtend.lib.macro.RegisterGlobalsParticipant - java:/Objects/org.eclipse.xtend.lib.macro.RegisterGlobalsContext - java:/Objects/org.eclipse.xtend.lib.macro.services.UpstreamTypeLookup - java:/Objects/org.eclipse.xtend.lib.macro.services.SourceTypeLookup - java:/Objects/org.eclipse.xtend.lib.macro.CodeGenerationParticipant - java:/Objects/org.eclipse.xtend.lib.macro.CodeGenerationContext - java:/Objects/org.eclipse.xtend.lib.macro.file.MutableFileSystemSupport - java:/Objects/org.eclipse.xtend.lib.macro.ValidationParticipant - java:/Objects/org.eclipse.xtend.lib.macro.ValidationContext - java:/Objects/org.eclipse.xtend.lib.annotations.Accessors - java:/Objects/org.eclipse.xtend.lib.annotations.AccessorsProcessor - java:/Objects/org.eclipse.xtend.lib.annotations.AccessorType - java:/Objects/org.eclipse.xtext.xbase.lib.ArrayLiterals - java:/Objects/org.eclipse.xtext.xbase.lib.Pure - java:/Objects/org.eclipse.xtext.xbase.lib.Inline - java:/Objects/org.eclipse.xtext.xbase.lib.CollectionLiterals - java:/Objects/org.eclipse.xtext.xbase.lib.Pair - java:/Objects/java.util.LinkedHashSet - java:/Objects/java.util.TreeMap - java:/Objects/java.util.NavigableMap - java:/Objects/java.util.TreeSet - java:/Objects/org.eclipse.xtext.xbase.lib.InputOutput - java:/Objects/org.eclipse.xtext.xbase.lib.ArrayExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.BigDecimalExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.BigIntegerExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.BooleanExtensions - java:/Objects/com.google.common.primitives.Booleans - java:/Objects/org.eclipse.xtext.xbase.lib.ByteExtensions - java:/Objects/java.lang.Math - java:/Objects/org.eclipse.xtext.xbase.lib.CharacterExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.CollectionExtensions - java:/Objects/com.google.common.collect.Iterables - java:/Objects/com.google.common.collect.FluentIterable - java:/Objects/com.google.common.base.Function - java:/Objects/com.google.common.base.Optional - java:/Objects/com.google.common.base.Supplier - java:/Objects/com.google.common.collect.ImmutableListMultimap - java:/Objects/com.google.common.collect.ImmutableMultimap - java:/Objects/com.google.common.collect.BaseImmutableMultimap - java:/Objects/com.google.common.collect.AbstractMultimap - java:/Objects/com.google.common.collect.Multimap - java:/Objects/com.google.common.collect.Multiset - java:/Objects/com.google.common.collect.Multimaps - java:/Objects/com.google.common.collect.Maps - java:/Objects/com.google.common.collect.ImmutableMap - java:/Objects/com.google.common.collect.ImmutableSet - java:/Objects/com.google.common.collect.ImmutableSetMultimap - java:/Objects/com.google.common.collect.SetMultimap - java:/Objects/com.google.common.collect.Serialization - java:/Objects/com.google.common.collect.ImmutableMultiset - java:/Objects/com.google.common.collect.ImmutableMultisetGwtSerializationDependencies - java:/Objects/com.google.common.collect.IndexedImmutableSet - java:/Objects/com.google.common.collect.AbstractListMultimap - java:/Objects/com.google.common.collect.AbstractMapBasedMultimap - java:/Objects/com.google.common.collect.AbstractSetMultimap - java:/Objects/com.google.common.collect.AbstractSortedSetMultimap - java:/Objects/com.google.common.collect.SortedSetMultimap - java:/Objects/com.google.common.collect.AbstractMultiset - java:/Objects/com.google.common.collect.Multisets - java:/Objects/com.google.common.collect.Sets - java:/Objects/com.google.common.collect.ForwardingCollection - java:/Objects/com.google.common.collect.ForwardingObject - java:/Objects/com.google.common.collect.CartesianList - java:/Objects/com.google.common.collect.ForwardingNavigableSet - java:/Objects/com.google.common.collect.ForwardingSortedSet - java:/Objects/com.google.common.collect.ForwardingSet - java:/Objects/com.google.common.collect.Ordering - java:/Objects/com.google.common.collect.Collections2 - java:/Objects/com.google.common.collect.AbstractIterator - java:/Objects/java.util.concurrent.CopyOnWriteArraySet - java:/Objects/java.util.concurrent.CopyOnWriteArrayList - java:/Objects/com.google.common.collect.Range - java:/Objects/com.google.common.collect.RangeGwtSerializationDependencies - java:/Objects/com.google.common.collect.Cut - java:/Objects/com.google.common.collect.DiscreteDomain - java:/Objects/com.google.common.collect.BoundType - java:/Objects/java.util.EnumMap - java:/Objects/com.google.common.collect.ListMultimap - java:/Objects/com.google.common.collect.ForwardingMultimap - java:/Objects/com.google.common.collect.FilteredMultimap - java:/Objects/com.google.common.collect.FilteredSetMultimap - java:/Objects/com.google.common.base.Converter - java:/Objects/com.google.common.collect.BiMap - java:/Objects/com.google.common.collect.ForwardingMap - java:/Objects/com.google.common.collect.AbstractNavigableMap - java:/Objects/com.google.common.collect.MapDifference - java:/Objects/com.google.common.collect.SortedMapDifference - java:/Objects/com.google.common.collect.ForwardingSortedMap - java:/Objects/com.google.common.base.Equivalence - java:/Objects/java.util.function.BiPredicate - java:/Objects/java.util.IdentityHashMap - java:/Objects/com.google.common.collect.ForwardingMultiset - java:/Objects/com.google.common.collect.SortedMultiset - java:/Objects/com.google.common.collect.SortedMultisetBridge - java:/Objects/com.google.common.collect.SortedIterable - java:/Objects/com.google.common.base.Joiner - java:/Objects/com.google.common.collect.ImmutableSortedSet - java:/Objects/com.google.common.collect.ImmutableSortedSetFauxverideShim - java:/Objects/com.google.common.collect.RegularImmutableSortedSet - java:/Objects/com.google.common.collect.ImmutableSortedMap - java:/Objects/com.google.common.collect.ImmutableSortedMapFauxverideShim - java:/Objects/java.util.Collections - java:/Objects/java.util.AbstractQueue - java:/Objects/org.eclipse.xtext.xbase.lib.ComparableExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.DoubleExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.FloatExtensions - java:/Objects/java.lang.Float - java:/Objects/org.eclipse.xtext.xbase.lib.FunctionExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.Functions - java:/Objects/org.eclipse.xtext.xbase.lib.IntegerExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.ExclusiveRange - java:/Objects/org.eclipse.xtext.xbase.lib.IntegerRange - java:/Objects/org.eclipse.xtext.xbase.lib.IterableExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.IteratorExtensions - java:/Objects/com.google.common.collect.Iterators - java:/Objects/com.google.common.collect.AbstractIndexedListIterator - java:/Objects/com.google.common.collect.PeekingIterator - java:/Objects/org.eclipse.xtext.xbase.lib.ListExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.LongExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.MapExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.internal.UnmodifiableMergingMapView - java:/Objects/org.eclipse.xtext.xbase.lib.ObjectExtensions - java:/Objects/com.google.common.base.Objects - java:/Objects/com.google.common.base.ExtraObjectsMethodsForWeb - java:/Objects/org.eclipse.xtext.xbase.lib.ProcedureExtensions - java:/Objects/org.eclipse.xtext.xbase.lib.ShortExtensions - java:/Objects/java.lang.Short - java:/Objects/org.eclipse.xtext.xbase.lib.StringExtensions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - backgroundColor - foregroundColor - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - labelColor - backgroundColor - foregroundColor - - - - - - - - - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - backgroundColor - foregroundColor - - - - - - - - KEEP_LOCATION - KEEP_SIZE - KEEP_RATIO - - backgroundColor - foregroundColor - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - - - - bold - - - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - - - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - labelSize - - - labelSize - - - - - - - - - - - italic - - - - - - - - - - - - - - diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.ecore b/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.ecore index aa50b778..f7cb28be 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.ecore +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.ecore @@ -13,7 +13,7 @@ + eType="#//SimpleSegment" containment="true"/> @@ -29,4 +29,5 @@ + diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.genmodel b/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.genmodel index 1a6c7a84..1cd4ac41 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.genmodel +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/model/modes3.genmodel @@ -26,5 +26,6 @@ + diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution.partialinterpretation b/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution.partialinterpretation deleted file mode 100644 index bbf46091..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution.partialinterpretation +++ /dev/null @@ -1,1068 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.gml b/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.gml deleted file mode 100644 index 66b57d1a..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.gml +++ /dev/null @@ -1,1191 +0,0 @@ -graph -[ - node - [ - id 0 - graphics - [ - w 269.5 - h 54 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "o 1" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Modes3ModelRoot class DefinedPart - Modes3ModelRoot class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 1 - graphics - [ - w 41.800000000000004 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "true" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 2 - graphics - [ - w 50.6 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "false" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 3 - graphics - [ - w 115.50000000000001 - h 54 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Segment class - Turnout class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 4 - graphics - [ - w 100.10000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Train class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 5 - graphics - [ - w 115.50000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Segment class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 6 - graphics - [ - w 100.10000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Train class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 7 - graphics - [ - w 115.50000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Segment class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 8 - graphics - [ - w 100.10000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Train class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 9 - graphics - [ - w 115.50000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Segment class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 10 - graphics - [ - w 100.10000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Train class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 11 - graphics - [ - w 115.50000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Segment class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 12 - graphics - [ - w 100.10000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Train class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 13 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "?" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 14 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "?" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 15 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "?" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 16 - graphics - [ - w 103.4 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "New Objects" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - edge - [ - source 5 - target 3 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 3 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 3 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 3 - target 7 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 7 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 11 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 5 - target 11 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "connectedTo reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 5 - target 6 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "occupiedBy reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 3 - target 4 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "occupiedBy reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 8 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "occupiedBy reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 10 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "occupiedBy reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 11 - target 12 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "occupiedBy reference Segment" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 4 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "trains reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 6 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "trains reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 8 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "trains reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 10 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "trains reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 12 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "trains reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 5 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "segments reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 7 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "segments reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 9 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "segments reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 11 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "segments reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 0 - target 3 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "turnouts reference Modes3ModelRoot" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 3 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "straight reference Turnout" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 3 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "divergent reference Turnout" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 6 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "location reference Train" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 4 - target 3 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "location reference Train" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 8 - target 7 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "location reference Train" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "location reference Train" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 12 - target 11 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "location reference Train" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] -] - diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.partialinterpretation b/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.partialinterpretation deleted file mode 100644 index 8b50e17f..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.partialinterpretation +++ /dev/null @@ -1,1037 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.png b/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.png deleted file mode 100644 index b6fa6e4e..00000000 Binary files a/Domains/ca.mcgill.rtgmrt.example.modes3/output/solution1.png and /dev/null differ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/plugin.xml b/Domains/ca.mcgill.rtgmrt.example.modes3/plugin.xml index 7341e19c..a105a729 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/plugin.xml +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/plugin.xml @@ -6,21 +6,19 @@ - - - - - + + + diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql index 982e6cec..b8841928 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql @@ -2,11 +2,6 @@ package modes3.queries import "http://www.ece.mcgill.ca/wcet/modes3" -@Constraint(message = "turnoutInSegments", severity = "error", key = { T }) -pattern turnoutInSegments(T : Turnout) { - Modes3ModelRoot.segments(_, T); -} - pattern connectedTo(S1 : Segment, S2 : Segment) { Segment.connectedTo(S1, S2); } @@ -39,10 +34,6 @@ pattern turnoutOutputsAreSame(T : Turnout) { Turnout.divergent(T, S); } -pattern turnout(T : Turnout) { - Turnout(T); -} - pattern output(S1 : Segment, S2 : Segment) { Segment.connectedTo(S1, S2); } or { @@ -56,8 +47,7 @@ pattern output(S1 : Segment, S2 : Segment) { //} @Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S }) -pattern tooManyInputsOfSegment(S : Segment) { - neg find turnout(S); +pattern tooManyInputsOfSegment(S : SimpleSegment) { find output(I1, S); find output(I2, S); find output(I3, S); @@ -74,30 +64,38 @@ pattern turnoutConnectedToBothOutputs(T : Turnout) { Segment.connectedTo(T, Divergent); } -pattern extraInputOfTurnout(T : Turnout, S : Segment) { - Turnout.straight(T, Straight); - Turnout.divergent(T, Divergent); - find output(S, T); - S != Straight; - S != Divergent; +pattern adjacent(S1 : Segment, S2 : Segment) { + find output(S1, S2); +} or { + find turnoutOutput(S2, S1); } -@Constraint(message = "noExtraInputOfTurnout", severity = "error", key = { T }) -pattern noExtraInputOfTurnout(T : Turnout) { - neg find extraInputOfTurnout(T, _); +@Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T }) +pattern tooManyInputsOfTurnout(T : Turnout) { + find adjacent(I1, T); + find adjacent(I2, T); + find adjacent(I3, T); + find adjacent(I4, T); + I1 != I2; + I1 != I3; + I1 != I4; + I2 != I3; + I2 != I4; + I3 != I4; } -@Constraint(message = "tooManyExtraInputsOfTurnout", severity = "error", key = { T }) -pattern tooManyExtraInputsOfTurnout(T : Turnout) { - find extraInputOfTurnout(T, I1); - find extraInputOfTurnout(T, I2); +pattern inputsOfTurnout(T : Turnout) { + find adjacent(I1, T); + find adjacent(I2, T); + find adjacent(I3, T); I1 != I2; + I1 != I3; + I2 != I3; } -pattern adjacent(S1 : Segment, S2 : Segment) { - find output(S1, S2); -} or { - find turnoutOutput(S2, S1); +@Constraint(message = "tooFewInputsOfTurnout", severity = "error", key = { T }) +pattern tooFewInputsOfTurnout(T : Turnout) { + neg find inputsOfTurnout(T); } pattern reachable(S1 : Segment, S2 : Segment) { diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend index 71d1798f..fac7c496 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3ModelGenerator.xtend @@ -8,6 +8,7 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsFactory import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage +import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition @@ -22,6 +23,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Polyhedr 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.partialinterpretation2logic.InstanceModel2Logic +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialComplexTypeInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage @@ -44,8 +46,6 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchEMFBackendFactory import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactory import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink @FinalFieldsConstructor class Modes3ModelGenerator { @@ -92,22 +92,32 @@ class Modes3ModelGenerator { minNewElements = modelSize maxNewElements = modelSize minNewElementsByType => [ - put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), 1) +// put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), 5) ] maxNewElementsByType => [ put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.train), 5) + put(ecore2Logic.TypeofEClass(metamodelLogic.trace, Modes3Package.eINSTANCE.turnout), 5) ] ] - solutionScope.numberOfRequiredSolutions = 1 + solutionScope => [ + numberOfRequiredSolutions = 1 + ] + scopeWeight = 5 nameNewElements = false typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis - stateCoderStrategy = StateCoderStrategy::Neighbourhood + stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) -// unitPropagationPatternGenerators += new Modes3UnitPropagationGenerator(ecore2Logic, metamodelLogic.trace) - debugConfiguration.partialInterpretatioVisualiser = null + hints += new Modes3TypeScopeHint(ecore2Logic, metamodelLogic.trace) + unitPropagationPatternGenerators += new Modes3UnitPropagationGenerator(ecore2Logic, metamodelLogic.trace) + debugConfiguration => [ + partialInterpretatioVisualiser = new GraphvizVisualiser +// partalInterpretationVisualisationFrequency = 50 + ] + documentationLevel = DocumentationLevel.NORMAL ] val workspace = new FileSystemWorkspace("output/", "") + workspace.writeModel(logic.output, "problem.logicproblem") val solution = solver.solve(logic.output, config, workspace) if (solution instanceof ModelResult) { println("Saving generated solutions") @@ -122,7 +132,6 @@ class Modes3ModelGenerator { workspace.writeText('''solution«representationNumber».gml''', gml) if (representation.newElements.size < 160) { if (representation instanceof PartialInterpretation) { - representation.problem.types.forEach[println(name)] val rootType = (representation.problem.types.findFirst [ name == "Modes3ModelRoot class DefinedPart" ] as TypeDefinition) @@ -198,10 +207,7 @@ class Modes3ModelGenerator { PartialinterpretationPackage.eINSTANCE.class Ecore2logicannotationsPackage.eINSTANCE.class Viatra2LogicAnnotationsPackage.eINSTANCE.class - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("ecore", new XMIResourceFactoryImpl) - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem", new XMIResourceFactoryImpl) - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("partialinterpretation", - new XMIResourceFactoryImpl) + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*", new XMIResourceFactoryImpl) } def static void main(String[] args) { diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3TypeScopeHint.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3TypeScopeHint.xtend new file mode 100644 index 00000000..94e5eb08 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3TypeScopeHint.xtend @@ -0,0 +1,79 @@ +package modes3.run + +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator +import java.util.Map +import modes3.Modes3Package +import modes3.queries.Adjacent +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation + +class Modes3TypeScopeHint implements LinearTypeConstraintHint { + static val TURNOUT_NEIGHBOR_COUNT = "turnoutNeighborCount" + + val Type segmentType + val Type turnoutType + + new(extension Ecore2Logic ecore2Logic, Ecore2Logic_Trace ecore2LogicTrace) { + extension val Modes3Package = Modes3Package.eINSTANCE + segmentType = ecore2LogicTrace.TypeofEClass(segment) + turnoutType = ecore2LogicTrace.TypeofEClass(turnout) + } + + override getAdditionalPatterns(extension PatternGenerator patternGenerator, Map fqnToPQuery) { + ''' + pattern «TURNOUT_NEIGHBOR_COUNT»_helper(problem: LogicProblem, interpretation: PartialInterpretation, source: DefinedElement, target: DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, source); + find mustExist(problem, interpretation, target); + «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["source", "target"], Modality.MUST, true, false)» + } + + pattern «TURNOUT_NEIGHBOR_COUNT»(problem: LogicProblem, interpretation: PartialInterpretation, element: DefinedElement, N) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, element); + «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "element")» + N == count find «TURNOUT_NEIGHBOR_COUNT»_helper(problem, interpretation, element, _); + } + ''' + } + + override createConstraintUpdater(LinearTypeExpressionBuilderFactory builderFactory) { + val turnoutNeighborCountMatcher = builderFactory.createMatcher(TURNOUT_NEIGHBOR_COUNT) + val newNeighbors = builderFactory.createBuilder.add(1, segmentType).build + + return [ partialInterpretation | + val requiredNeighbbors = turnoutNeighborCountMatcher.getRemainingCount(partialInterpretation, 3) + newNeighbors.tightenLowerBound(requiredNeighbbors) + ] + } + + private static def getRemainingCount(ViatraQueryMatcher matcher, + PartialInterpretation partialInterpretation, int capacity) { + val partialMatch = matcher.newEmptyMatch + partialMatch.set(0, partialInterpretation.problem) + partialMatch.set(1, partialInterpretation) + val iterator = matcher.streamAllMatches(partialMatch).iterator + var int max = 0 + while (iterator.hasNext) { + val match = iterator.next + val n = (match.get(3) as Integer).intValue + if (n < capacity) { + val required = capacity - n + if (max < required) { + max = required + } + } + } + max + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend index 61bd2814..953a21d4 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend @@ -9,20 +9,21 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGene import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator import java.util.Map import modes3.Modes3Package -import modes3.queries.ExtraInputOfTurnout +import modes3.queries.Adjacent import modes3.queries.Output -import modes3.queries.TurnoutOutput import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.xtend2.lib.StringConcatenationClient class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator { static val MUST_NOT_CONNECTED_TO = "mustNotConnectedTo" - static val MUST_NOT_CONNECTED_TO_HELPER = "mustNotConnectedTo_helper" - static val MUST_NOT_TURNOUT_OUTPUT = "mustNotTurnoutOutput" static val MUST_NOT_STRAIGHT = "mustNotStraight" static val MUST_NOT_DIVERGENT = "mustNotDivergent" + static val MUST_CONNECTED_TO = "mustConnectedTo" + static val MUST_STRAIGHT = "mustStraight" + static val MUST_DIVERGENT = "mustDivergent" val Type segmentType + val Type simpleSegmentType val Type turnoutType val Relation connectedToRelation val Relation straightRelation @@ -31,6 +32,7 @@ class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator new(extension Ecore2Logic ecore2Logic, Ecore2Logic_Trace ecore2LogicTrace) { extension val Modes3Package = Modes3Package.eINSTANCE segmentType = ecore2LogicTrace.TypeofEClass(segment) + simpleSegmentType = ecore2LogicTrace.TypeofEClass(simpleSegment) turnoutType = ecore2LogicTrace.TypeofEClass(turnout) connectedToRelation = ecore2LogicTrace.relationOfReference(segment_ConnectedTo) straightRelation = ecore2LogicTrace.relationOfReference(turnout_Straight) @@ -38,7 +40,11 @@ class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator } override getMustPatterns() { - emptyMap + #{ + connectedToRelation -> MUST_CONNECTED_TO, + straightRelation -> MUST_STRAIGHT, + divergentRelation -> MUST_DIVERGENT + } } override getMustNotPatterns() { @@ -55,150 +61,356 @@ class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator source: DefinedElement, target: DefinedElement ''' - val StringConcatenationClient commonParameterConstraints = ''' + val StringConcatenationClient commonMustParameterConstraints = ''' find interpretation(problem, interpretation); find mustExist(problem, interpretation, source); find mustExist(problem, interpretation, target); ''' + + val StringConcatenationClient commonMayParameterConstraints = ''' + find interpretation(problem, interpretation); + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + ''' ''' - pattern «MUST_NOT_CONNECTED_TO_HELPER»(«parameters») { - // connectedToReflexive unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - source == target; + pattern mayInput(«parameters») { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["target", "source"], Modality.MAY, true, false)» + neg «referRelation(straightRelation, "target", "source", Modality.MUST, fqnToPQuery)» + neg «referRelation(straightRelation, "target", "source", Modality.MUST, fqnToPQuery)» + } + + pattern multipleMayInput(problem: LogicProblem, interpretation: PartialInterpretation, + target: DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, target); + find mayInput(problem, interpretaton, source1, target); + find mayInput(problem, interpretaton, source2, target); + neg find mustEquivalent(problem, interpretation, source1, source2); + } + + pattern multipleMayStraight(problem: LogicProblem, interpretation: PartialInterpretation, + source: DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, source); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «referRelation(straightRelation, "source", "target1", Modality.MAY, fqnToPQuery)» + «referRelation(straightRelation, "source", "target2", Modality.MAY, fqnToPQuery)» + neg find mustEquivalent(problem, interpretation, target1, target2); + } + + pattern multipleMayDivergent(problem: LogicProblem, interpretation: PartialInterpretation, + source: DefinedElement) { + find interpretation(problem, interpretation); + find mustExist(problem, interpretation, source); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «referRelation(divergentRelation, "source", "target1", Modality.MAY, fqnToPQuery)» + «referRelation(divergentRelation, "source", "target2", Modality.MAY, fqnToPQuery)» + neg find mustEquivalent(problem, interpretation, target1, target2); + } + + pattern «MUST_CONNECTED_TO»(«parameters») { + «commonMustParameterConstraints» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + find mayInput(problem, interpretaton, source, target); + neg find multipleMayInput(problem, interpretaton, target); + «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)» + neg «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)» + } + + pattern «MUST_STRAIGHT»(«parameters») { + «commonMustParameterConstraints» + neg «referRelation(straightRelation, "source", "_", Modality.MUST, fqnToPQuery)» + neg find multipleMayStraight(problem, interpretation, source); + «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)» } or { - // tooManyInputsOfSegment unit propagation - «commonParameterConstraints» + «commonMustParameterConstraints» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + find mayInput(problem, interpretaton, source, target); + neg find multipleMayInput(problem, interpretaton, target); + neg «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)» + «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)» + neg «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)» + } + + pattern «MUST_DIVERGENT»(«parameters») { + «commonMustParameterConstraints» + neg «referRelation(divergentRelation, "source", "_", Modality.MUST, fqnToPQuery)» + neg find multipleMayDivergent(problem, interpretation, source); + «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)» + } or { + «commonMustParameterConstraints» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + find mayInput(problem, interpretaton, source, target); + neg find multipleMayInput(problem, interpretaton, target); + neg «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)» + «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)» + neg «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)» + } + + pattern turnoutOutput_must_to_true_by_straight(«parameters», T : DefinedElement, S : DefinedElement) { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + T == source; + S == target; + } + + pattern turnoutOutput_must_to_true_by_divergent(«parameters», T : DefinedElement, S : DefinedElement) { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + T == source; + S == target; + } + + pattern output_must_to_true_by_connectedTo(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + S1 == source; + S2 == target; + } + + pattern output_must_to_true_by_straight(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S1, S2); + } + + pattern output_must_to_true_by_divergent(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2); + } + + pattern adjacent_must_to_true_by_connectedTo(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + find output_must_to_true_by_connectedTo(problem, interpretation, source, target, S1, S2); + } + + pattern adjacent_must_to_true_by_straight(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + find output_must_to_true_by_straight(problem, interpretation, source, target, S1, S2); + } or { + find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S2, S1); + } + + pattern adjacent_must_to_true_by_divergent(«parameters», S1 : DefinedElement, S2 : DefinedElement) { + find output_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2); + } or { + find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S2, S1); + } + + pattern connectedToReflexive_must_to_true_by_connectedTo(«parameters», S : DefinedElement) { + find mustExist(problem, interpretation, source); «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input1")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input2")» - neg «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input1", "source"], Modality.MUST, true, false)» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input2", "source"], Modality.MUST, true, false)» - input1 != input2; - input1 != target; - input2 != target; - } or { - // turnoutConnectedToBothOutputs unit propagation 1 - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "divergent")» - «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)» - «referRelation(divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery)» - «referRelation(connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery)» - } or { - // turnoutConnectedToBothOutputs unit propagation 2 - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "straight")» - «referRelation(straightRelation, "source", "straight", Modality.MUST, fqnToPQuery)» - «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)» - «referRelation(connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery)» - } or { - // tooManyExtraInputsOfTurnout unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(TurnoutOutput.instance.fullyQualifiedName), #["source", "target"], Modality.MAY, false, false)» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)» - target != extraInput; + S == source; + S == target; } - pattern «MUST_NOT_CONNECTED_TO»(«parameters») { - find «MUST_NOT_CONNECTED_TO_HELPER»(problem, interpretation, source, target); + pattern outputReflexive_must_to_true_by_straight(«parameters», T : DefinedElement) { + find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, T, T); + } + + pattern outputReflexive_must_to_true_by_divergent(«parameters», T : DefinedElement) { + find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, T, T); + } + + pattern turnoutOutputsAreSame_must_to_true_by_straight(«parameters», T : DefinedElement) { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + T == source; + S == target; + «referRelation(divergentRelation, "T", "S", Modality.MUST, fqnToPQuery)» + } + + pattern turnoutOutputsAreSame_must_to_true_by_divergent(«parameters», T : DefinedElement) { + «commonMayParameterConstraints» + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + T == source; + S == target; + «referRelation(straightRelation, "T", "S", Modality.MUST, fqnToPQuery)» + } + + pattern tooManyInputsOfSegment_must_to_true_by_connectedTo(«parameters», S : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")» + find output_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I2 != I3; + } + + pattern tooManyInputsOfSegment_must_to_true_by_straight(«parameters», S : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")» + find output_must_to_true_by_straight(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I2 != I3; + } + + pattern tooManyInputsOfSegment_must_to_true_by_divergent(«parameters», S : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")» + find output_must_to_true_by_divergent(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I2 != I3; + } + + pattern turnoutConnectedToBothOutputs_must_to_true_by_connectedTo(«parameters», T : DefinedElement) { + «commonMayParameterConstraints» + find mustExist(problem, interpretation, Straight); + find mustExist(problem, interpretation, Divergent); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")» + «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» + T == source; + Straight == target; + «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» } or { - find «MUST_NOT_CONNECTED_TO_HELPER»(problem, interpretation, target, source); + «commonMayParameterConstraints» + find mustExist(problem, interpretation, Straight); + find mustExist(problem, interpretation, Divergent); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")» + «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» + «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + T == source; + Straight == target; } - pattern «MUST_NOT_TURNOUT_OUTPUT»(«parameters») { - // outputReflexive unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "target")» - source == target; + pattern turnoutConnectedToBothOutputs_must_to_true_by_straight(«parameters», T : DefinedElement) { + «commonMayParameterConstraints» + find mustExist(problem, interpretation, Straight); + find mustExist(problem, interpretation, Divergent); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")» + T == source; + Straight == target; + «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» + «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» + } + + pattern turnoutConnectedToBothOutputs_must_to_true_by_divergent(«parameters», T : DefinedElement) { + «commonMayParameterConstraints» + find mustExist(problem, interpretation, Straight); + find mustExist(problem, interpretation, Divergent); + «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")» + «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")» + «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")» + «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + T == source; + Divergent == target; + «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)» + «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)» + } + + pattern tooManyInputsOfTurnout_must_to_true_by_connectedTo(«parameters», T : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")» + find adjacent_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I1 != I4; + I2 != I3; + I2 != I4; + I3 != I4; + } + + pattern tooManyInputsOfTurnout_must_to_true_by_straight(«parameters», T : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")» + find adjacent_must_to_true_by_straight(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I1 != I4; + I2 != I3; + I2 != I4; + I3 != I4; + } + + pattern tooManyInputsOfTurnout_must_to_true_by_divergent(«parameters», T : DefinedElement) { + find mustExist(problem, interpretation, S); + «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")» + find adjacent_must_to_true_by_divergent(problem, interpretation, source, target, I1, S); + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)» + «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)» + I1 != I2; + I1 != I3; + I1 != I4; + I2 != I3; + I2 != I4; + I3 != I4; + } + + pattern «MUST_NOT_CONNECTED_TO»_helper(«parameters») { + find connectedToReflexive_must_to_true_by_connectedTo(problem, interpretation, source, target, _); } or { - // tooManyInputsOfSegment unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input1")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "input2")» - neg «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "target")» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input1", "target"], Modality.MUST, true, false)» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["input2", "target"], Modality.MUST, true, false)» - input1 != input2; - input1 != source; - input2 != source; + find tooManyInputsOfSegment_must_to_true_by_connectedTo(problem, interpretation, source, target, _); + } or { + find turnoutConnectedToBothOutputs_must_to_true_by_connectedTo(problem, interpretation, source, target, _); + } or { + find tooManyInputsOfTurnout_must_to_true_by_connectedTo(problem, interpretation, source, target, _); + } + + pattern «MUST_NOT_CONNECTED_TO»(«parameters») { + find «MUST_NOT_CONNECTED_TO»_helper(problem, interpretation, source, target); + } or { + find «MUST_NOT_CONNECTED_TO»_helper(problem, interpretation, target, source); } pattern «MUST_NOT_STRAIGHT»(«parameters») { - find «MUST_NOT_TURNOUT_OUTPUT»(problem, interpretation, source, target); - } or { - // turnoutOutputsAreSame unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)» - } or { - // turnoutConnectedToBothOutputs unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "divergent")» - «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)» - «referRelation(divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery)» - «referRelation(connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery)» - } or { - // tooManyExtraInputsOfTurnout unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "potentialExtraInput")» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)» - «referRelation(connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery)» - neg «referRelation(divergentRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery)» - extraInput != potentialExtraInput; - extraInput != target; - potentialExtraInput != target; + find outputReflexive_must_to_true_by_straight(problem, interpretation, source, target, _); + } or { + find turnoutOutputsAreSame_must_to_true_by_straight(problem, interpretation, source, target, _); + } or { + find tooManyInputsOfSegment_must_to_true_by_straight(problem, interpretation, source, target, _); + } or { + find turnoutConnectedToBothOutputs_must_to_true_by_straight(problem, interpretation, source, target, _); + } or { + find tooManyInputsOfTurnout_must_to_true_by_straight(problem, interpretation, source, target, _); } pattern «MUST_NOT_DIVERGENT»(«parameters») { - find «MUST_NOT_TURNOUT_OUTPUT»(problem, interpretation, source, target); - } or { - // turnoutOutputsAreSame unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)» - } or { - // turnoutConnectedToBothOutputs unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "straight")» - «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)» - «referRelation(straightRelation, "source", "straight", Modality.MUST, fqnToPQuery)» - «referRelation(connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery)» - } or { - // tooManyExtraInputsOfTurnout unit propagation - «commonParameterConstraints» - «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "source")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "target")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "extraInput")» - «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "potentialExtraInput")» - «relationDefinitionIndexer.referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance.fullyQualifiedName), #["source", "extraInput"], Modality.MUST, true, false)» - «referRelation(connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery)» - neg «referRelation(straightRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery)» - extraInput != potentialExtraInput; - extraInput != target; - potentialExtraInput != target; + find outputReflexive_must_to_true_by_divergent(problem, interpretation, source, target, _); + } or { + find turnoutOutputsAreSame_must_to_true_by_divergent(problem, interpretation, source, target, _); + } or { + find tooManyInputsOfSegment_must_to_true_by_divergent(problem, interpretation, source, target, _); + } or { + find turnoutConnectedToBothOutputs_must_to_true_by_divergent(problem, interpretation, source, target, _); + } or { + find tooManyInputsOfTurnout_must_to_true_by_divergent(problem, interpretation, source, target, _); } ''' } diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore index e3a0ad7e..b3e38571 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/.gitignore @@ -24,3 +24,10 @@ /.ExtraInputOfTurnout.java._trace /.NoExtraInputOfTurnout.java._trace /.TooManyExtraInputsOfTurnout.java._trace +/.TooManyInputsOfTurnout.java._trace +/.NonDivergentInputOfTurnout.java._trace +/.NonStraightInputOfTurnout.java._trace +/.TooManyNonDivergentInputsOfTurnout.java._trace +/.TooManyNonStraightInputsOfTurnout.java._trace +/.InputsOfTurnout.java._trace +/.TooFewInputsOfTurnout.java._trace diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ExtraInputOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ExtraInputOfTurnout.java deleted file mode 100644 index 62e2a54d..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/ExtraInputOfTurnout.java +++ /dev/null @@ -1,730 +0,0 @@ -/** - * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql - */ -package modes3.queries; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import modes3.Segment; -import modes3.Turnout; -import modes3.queries.Output; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.viatra.query.runtime.api.IPatternMatch; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; -import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; -import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; -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.backend.QueryEvaluationHint; -import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; -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.basicenumerables.PositivePatternCall; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; - -/** - * A pattern-specific query specification that can instantiate Matcher in a type-safe way. - * - *

    Original source: - *

    - *         pattern extraInputOfTurnout(T : Turnout, S : Segment) {
    - *         	Turnout.straight(T, Straight);
    - *         	Turnout.divergent(T, Divergent);
    - *         	find output(S, T);
    - *         	S != Straight;
    - *         	S != Divergent;
    - *         }
    - * 
    - * - * @see Matcher - * @see Match - * - */ -@SuppressWarnings("all") -public final class ExtraInputOfTurnout extends BaseGeneratedEMFQuerySpecification { - /** - * Pattern-specific match representation of the modes3.queries.extraInputOfTurnout pattern, - * to be used in conjunction with {@link Matcher}. - * - *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. - * Each instance is a (possibly partial) substitution of pattern parameters, - * usable to represent a match of the pattern in the result of a query, - * or to specify the bound (fixed) input parameters when issuing a query. - * - * @see Matcher - * - */ - public static abstract class Match extends BasePatternMatch { - private Turnout fT; - - private Segment fS; - - private static List parameterNames = makeImmutableList("T", "S"); - - private Match(final Turnout pT, final Segment pS) { - this.fT = pT; - this.fS = pS; - } - - @Override - public Object get(final String parameterName) { - switch(parameterName) { - case "T": return this.fT; - case "S": return this.fS; - default: return null; - } - } - - @Override - public Object get(final int index) { - switch(index) { - case 0: return this.fT; - case 1: return this.fS; - default: return null; - } - } - - public Turnout getT() { - return this.fT; - } - - public Segment getS() { - return this.fS; - } - - @Override - public boolean set(final String parameterName, final Object newValue) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - if ("T".equals(parameterName) ) { - this.fT = (Turnout) newValue; - return true; - } - if ("S".equals(parameterName) ) { - this.fS = (Segment) newValue; - return true; - } - return false; - } - - public void setT(final Turnout pT) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fT = pT; - } - - public void setS(final Segment pS) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fS = pS; - } - - @Override - public String patternName() { - return "modes3.queries.extraInputOfTurnout"; - } - - @Override - public List parameterNames() { - return ExtraInputOfTurnout.Match.parameterNames; - } - - @Override - public Object[] toArray() { - return new Object[]{fT, fS}; - } - - @Override - public ExtraInputOfTurnout.Match toImmutable() { - return isMutable() ? newMatch(fT, fS) : this; - } - - @Override - public String prettyPrint() { - StringBuilder result = new StringBuilder(); - result.append("\"T\"=" + prettyPrintValue(fT) + ", "); - result.append("\"S\"=" + prettyPrintValue(fS)); - return result.toString(); - } - - @Override - public int hashCode() { - return Objects.hash(fT, fS); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if ((obj instanceof ExtraInputOfTurnout.Match)) { - ExtraInputOfTurnout.Match other = (ExtraInputOfTurnout.Match) obj; - return Objects.equals(fT, other.fT) && Objects.equals(fS, other.fS); - } else { - // this should be infrequent - if (!(obj instanceof IPatternMatch)) { - return false; - } - IPatternMatch otherSig = (IPatternMatch) obj; - return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); - } - } - - @Override - public ExtraInputOfTurnout specification() { - return ExtraInputOfTurnout.instance(); - } - - /** - * Returns an empty, mutable match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @return the empty match. - * - */ - public static ExtraInputOfTurnout.Match newEmptyMatch() { - return new Mutable(null, null); - } - - /** - * Returns a mutable (partial) match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return the new, mutable (partial) match object. - * - */ - public static ExtraInputOfTurnout.Match newMutableMatch(final Turnout pT, final Segment pS) { - return new Mutable(pT, pS); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return the (partial) match object. - * - */ - public static ExtraInputOfTurnout.Match newMatch(final Turnout pT, final Segment pS) { - return new Immutable(pT, pS); - } - - private static final class Mutable extends ExtraInputOfTurnout.Match { - Mutable(final Turnout pT, final Segment pS) { - super(pT, pS); - } - - @Override - public boolean isMutable() { - return true; - } - } - - private static final class Immutable extends ExtraInputOfTurnout.Match { - Immutable(final Turnout pT, final Segment pS) { - super(pT, pS); - } - - @Override - public boolean isMutable() { - return false; - } - } - } - - /** - * Generated pattern matcher API of the modes3.queries.extraInputOfTurnout pattern, - * providing pattern-specific query methods. - * - *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, - * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. - * - *

    Matches of the pattern will be represented as {@link Match}. - * - *

    Original source: - *

    -   * pattern extraInputOfTurnout(T : Turnout, S : Segment) {
    -   * 	Turnout.straight(T, Straight);
    -   * 	Turnout.divergent(T, Divergent);
    -   * 	find output(S, T);
    -   * 	S != Straight;
    -   * 	S != Divergent;
    -   * }
    -   * 
    - * - * @see Match - * @see ExtraInputOfTurnout - * - */ - public static class Matcher extends BaseMatcher { - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - public static ExtraInputOfTurnout.Matcher on(final ViatraQueryEngine engine) { - // check if matcher already exists - Matcher matcher = engine.getExistingMatcher(querySpecification()); - if (matcher == null) { - matcher = (Matcher)engine.getMatcher(querySpecification()); - } - return matcher; - } - - /** - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * @return an initialized matcher - * @noreference This method is for internal matcher initialization by the framework, do not call it manually. - * - */ - public static ExtraInputOfTurnout.Matcher create() { - return new Matcher(); - } - - private static final int POSITION_T = 0; - - private static final int POSITION_S = 1; - - private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(ExtraInputOfTurnout.Matcher.class); - - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - private Matcher() { - super(querySpecification()); - } - - /** - * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return matches represented as a Match object. - * - */ - public Collection getAllMatches(final Turnout pT, final Segment pS) { - return rawStreamAllMatches(new Object[]{pT, pS}).collect(Collectors.toSet()); - } - - /** - * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return a stream of matches represented as a Match object. - * - */ - public Stream streamAllMatches(final Turnout pT, final Segment pS) { - return rawStreamAllMatches(new Object[]{pT, pS}); - } - - /** - * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return a match represented as a Match object, or null if no match is found. - * - */ - public Optional getOneArbitraryMatch(final Turnout pT, final Segment pS) { - return rawGetOneArbitraryMatch(new Object[]{pT, pS}); - } - - /** - * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, - * under any possible substitution of the unspecified parameters (if any). - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return true if the input is a valid (partial) match of the pattern. - * - */ - public boolean hasMatch(final Turnout pT, final Segment pS) { - return rawHasMatch(new Object[]{pT, pS}); - } - - /** - * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return the number of pattern matches found. - * - */ - public int countMatches(final Turnout pT, final Segment pS) { - return rawCountMatches(new Object[]{pT, pS}); - } - - /** - * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @param processor the action that will process the selected match. - * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked - * - */ - public boolean forOneArbitraryMatch(final Turnout pT, final Segment pS, final Consumer processor) { - return rawForOneArbitraryMatch(new Object[]{pT, pS}, processor); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param pS the fixed value of pattern parameter S, or null if not bound. - * @return the (partial) match object. - * - */ - public ExtraInputOfTurnout.Match newMatch(final Turnout pT, final Segment pS) { - return ExtraInputOfTurnout.Match.newMatch(pT, pS); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfT(final Object[] parameters) { - return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()); - } - - /** - * Retrieve the set of values that occur in matches for T. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * - * @return the Stream of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT(final ExtraInputOfTurnout.Match partialMatch) { - return rawStreamAllValuesOfT(partialMatch.toArray()); - } - - /** - * Retrieve the set of values that occur in matches for T. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * - * @return the Stream of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT(final Segment pS) { - return rawStreamAllValuesOfT(new Object[]{null, pS}); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT(final ExtraInputOfTurnout.Match partialMatch) { - return rawStreamAllValuesOfT(partialMatch.toArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT(final Segment pS) { - return rawStreamAllValuesOfT(new Object[]{null, pS}).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for S. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfS(final Object[] parameters) { - return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for S. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfS() { - return rawStreamAllValuesOfS(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for S. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfS() { - return rawStreamAllValuesOfS(emptyArray()); - } - - /** - * Retrieve the set of values that occur in matches for S. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * - * @return the Stream of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfS(final ExtraInputOfTurnout.Match partialMatch) { - return rawStreamAllValuesOfS(partialMatch.toArray()); - } - - /** - * Retrieve the set of values that occur in matches for S. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * - * @return the Stream of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfS(final Turnout pT) { - return rawStreamAllValuesOfS(new Object[]{pT, null}); - } - - /** - * Retrieve the set of values that occur in matches for S. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfS(final ExtraInputOfTurnout.Match partialMatch) { - return rawStreamAllValuesOfS(partialMatch.toArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for S. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfS(final Turnout pT) { - return rawStreamAllValuesOfS(new Object[]{pT, null}).collect(Collectors.toSet()); - } - - @Override - protected ExtraInputOfTurnout.Match tupleToMatch(final Tuple t) { - try { - return ExtraInputOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T), (Segment) t.get(POSITION_S)); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in tuple not properly typed!",e); - return null; - } - } - - @Override - protected ExtraInputOfTurnout.Match arrayToMatch(final Object[] match) { - try { - return ExtraInputOfTurnout.Match.newMatch((Turnout) match[POSITION_T], (Segment) match[POSITION_S]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - @Override - protected ExtraInputOfTurnout.Match arrayToMatchMutable(final Object[] match) { - try { - return ExtraInputOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T], (Segment) match[POSITION_S]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - /** - * @return the singleton instance of the query specification of this pattern - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static IQuerySpecification querySpecification() { - return ExtraInputOfTurnout.instance(); - } - } - - private ExtraInputOfTurnout() { - super(GeneratedPQuery.INSTANCE); - } - - /** - * @return the singleton instance of the query specification - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static ExtraInputOfTurnout instance() { - try{ - return LazyHolder.INSTANCE; - } catch (ExceptionInInitializerError err) { - throw processInitializerError(err); - } - } - - @Override - protected ExtraInputOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { - return ExtraInputOfTurnout.Matcher.on(engine); - } - - @Override - public ExtraInputOfTurnout.Matcher instantiate() { - return ExtraInputOfTurnout.Matcher.create(); - } - - @Override - public ExtraInputOfTurnout.Match newEmptyMatch() { - return ExtraInputOfTurnout.Match.newEmptyMatch(); - } - - @Override - public ExtraInputOfTurnout.Match newMatch(final Object... parameters) { - return ExtraInputOfTurnout.Match.newMatch((modes3.Turnout) parameters[0], (modes3.Segment) parameters[1]); - } - - /** - * Inner class allowing the singleton instance of {@link ExtraInputOfTurnout} to be created - * not at the class load time of the outer class, - * but rather at the first call to {@link ExtraInputOfTurnout#instance()}. - * - *

    This workaround is required e.g. to support recursion. - * - */ - private static class LazyHolder { - private static final ExtraInputOfTurnout INSTANCE = new ExtraInputOfTurnout(); - - /** - * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. - * This initialization order is required to support indirect recursion. - * - *

    The static initializer is defined using a helper field to work around limitations of the code generator. - * - */ - private static final Object STATIC_INITIALIZER = ensureInitialized(); - - public static Object ensureInitialized() { - INSTANCE.ensureInitializedInternal(); - return null; - } - } - - private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { - private static final ExtraInputOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - - private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); - - private final PParameter parameter_S = new PParameter("S", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); - - private final List parameters = Arrays.asList(parameter_T, parameter_S); - - private GeneratedPQuery() { - super(PVisibility.PUBLIC); - } - - @Override - public String getFullyQualifiedName() { - return "modes3.queries.extraInputOfTurnout"; - } - - @Override - public List getParameterNames() { - return Arrays.asList("T","S"); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public Set doGetContainedBodies() { - setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); - Set bodies = new LinkedHashSet<>(); - { - PBody body = new PBody(this); - PVariable var_T = body.getOrCreateVariableByName("T"); - PVariable var_S = body.getOrCreateVariableByName("S"); - PVariable var_Straight = body.getOrCreateVariableByName("Straight"); - PVariable var_Divergent = body.getOrCreateVariableByName("Divergent"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); - body.setSymbolicParameters(Arrays.asList( - new ExportedParameter(body, var_T, parameter_T), - new ExportedParameter(body, var_S, parameter_S) - )); - // Turnout.straight(T, Straight) - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "straight"))); - new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); - new Equality(body, var__virtual_0_, var_Straight); - // Turnout.divergent(T, Divergent) - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout", "divergent"))); - new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); - new Equality(body, var__virtual_1_, var_Divergent); - // find output(S, T) - new PositivePatternCall(body, Tuples.flatTupleOf(var_S, var_T), Output.instance().getInternalQueryRepresentation()); - // S != Straight - new Inequality(body, var_S, var_Straight); - // S != Divergent - new Inequality(body, var_S, var_Divergent); - bodies.add(body); - } - return bodies; - } - } -} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java new file mode 100644 index 00000000..2f2eea11 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/InputsOfTurnout.java @@ -0,0 +1,570 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Turnout; +import modes3.queries.Adjacent; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +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.basicenumerables.PositivePatternCall; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         pattern inputsOfTurnout(T : Turnout) {
    + *         	find adjacent(I1, T);
    + *         	find adjacent(I2, T);
    + *         	find adjacent(I3, T);
    + *         	I1 != I2;
    + *         	I1 != I3;
    + *         	I2 != I3;
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class InputsOfTurnout extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.inputsOfTurnout pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Turnout fT; + + private static List parameterNames = makeImmutableList("T"); + + private Match(final Turnout pT) { + this.fT = pT; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "T": return this.fT; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fT; + default: return null; + } + } + + public Turnout getT() { + return this.fT; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("T".equals(parameterName) ) { + this.fT = (Turnout) newValue; + return true; + } + return false; + } + + public void setT(final Turnout pT) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fT = pT; + } + + @Override + public String patternName() { + return "modes3.queries.inputsOfTurnout"; + } + + @Override + public List parameterNames() { + return InputsOfTurnout.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fT}; + } + + @Override + public InputsOfTurnout.Match toImmutable() { + return isMutable() ? newMatch(fT) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"T\"=" + prettyPrintValue(fT)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fT); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof InputsOfTurnout.Match)) { + InputsOfTurnout.Match other = (InputsOfTurnout.Match) obj; + return Objects.equals(fT, other.fT); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public InputsOfTurnout specification() { + return InputsOfTurnout.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static InputsOfTurnout.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static InputsOfTurnout.Match newMutableMatch(final Turnout pT) { + return new Mutable(pT); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public static InputsOfTurnout.Match newMatch(final Turnout pT) { + return new Immutable(pT); + } + + private static final class Mutable extends InputsOfTurnout.Match { + Mutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends InputsOfTurnout.Match { + Immutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.inputsOfTurnout pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * pattern inputsOfTurnout(T : Turnout) {
    +   * 	find adjacent(I1, T);
    +   * 	find adjacent(I2, T);
    +   * 	find adjacent(I3, T);
    +   * 	I1 != I2;
    +   * 	I1 != I3;
    +   * 	I2 != I3;
    +   * }
    +   * 
    + * + * @see Match + * @see InputsOfTurnout + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static InputsOfTurnout.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static InputsOfTurnout.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_T = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(InputsOfTurnout.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Turnout pT) { + return rawGetOneArbitraryMatch(new Object[]{pT}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Turnout pT) { + return rawHasMatch(new Object[]{pT}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Turnout pT) { + return rawCountMatches(new Object[]{pT}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pT}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public InputsOfTurnout.Match newMatch(final Turnout pT) { + return InputsOfTurnout.Match.newMatch(pT); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfT(final Object[] parameters) { + return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()); + } + + @Override + protected InputsOfTurnout.Match tupleToMatch(final Tuple t) { + try { + return InputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected InputsOfTurnout.Match arrayToMatch(final Object[] match) { + try { + return InputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected InputsOfTurnout.Match arrayToMatchMutable(final Object[] match) { + try { + return InputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return InputsOfTurnout.instance(); + } + } + + private InputsOfTurnout() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static InputsOfTurnout instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected InputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { + return InputsOfTurnout.Matcher.on(engine); + } + + @Override + public InputsOfTurnout.Matcher instantiate() { + return InputsOfTurnout.Matcher.create(); + } + + @Override + public InputsOfTurnout.Match newEmptyMatch() { + return InputsOfTurnout.Match.newEmptyMatch(); + } + + @Override + public InputsOfTurnout.Match newMatch(final Object... parameters) { + return InputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link InputsOfTurnout} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link InputsOfTurnout#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final InputsOfTurnout INSTANCE = new InputsOfTurnout(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final InputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_T); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.inputsOfTurnout"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("T"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_T = body.getOrCreateVariableByName("T"); + PVariable var_I1 = body.getOrCreateVariableByName("I1"); + PVariable var_I2 = body.getOrCreateVariableByName("I2"); + PVariable var_I3 = body.getOrCreateVariableByName("I3"); + new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_T, parameter_T) + )); + // find adjacent(I1, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // find adjacent(I2, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I2, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // find adjacent(I3, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I3, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // I1 != I2 + new Inequality(body, var_I1, var_I2); + // I1 != I3 + new Inequality(body, var_I1, var_I3); + // I2 != I3 + new Inequality(body, var_I2, var_I3); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java index 01ec77a1..6e244430 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Modes3Queries.java @@ -7,16 +7,14 @@ import modes3.queries.Adjacent; import modes3.queries.ConnectedTo; import modes3.queries.ConnectedToNotSymmetric; import modes3.queries.ConnectedToReflexive; -import modes3.queries.ExtraInputOfTurnout; -import modes3.queries.NoExtraInputOfTurnout; +import modes3.queries.InputsOfTurnout; import modes3.queries.Output; import modes3.queries.OutputReflexive; import modes3.queries.Reachable; -import modes3.queries.TooManyExtraInputsOfTurnout; +import modes3.queries.TooFewInputsOfTurnout; import modes3.queries.TooManyInputsOfSegment; -import modes3.queries.Turnout; +import modes3.queries.TooManyInputsOfTurnout; import modes3.queries.TurnoutConnectedToBothOutputs; -import modes3.queries.TurnoutInSegments; import modes3.queries.TurnoutOutput; import modes3.queries.TurnoutOutputsAreSame; import modes3.queries.Unreachable; @@ -31,21 +29,19 @@ import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; * in order to achieve better performance than one-by-one on-demand matcher initialization. * *

    From package modes3.queries, the group contains the definition of the following patterns:

      - *
    • turnoutInSegments
    • *
    • connectedTo
    • *
    • connectedToNotSymmetric
    • *
    • connectedToReflexive
    • *
    • turnoutOutput
    • *
    • outputReflexive
    • *
    • turnoutOutputsAreSame
    • - *
    • turnout
    • *
    • output
    • *
    • tooManyInputsOfSegment
    • *
    • turnoutConnectedToBothOutputs
    • - *
    • extraInputOfTurnout
    • - *
    • noExtraInputOfTurnout
    • - *
    • tooManyExtraInputsOfTurnout
    • *
    • adjacent
    • + *
    • tooManyInputsOfTurnout
    • + *
    • inputsOfTurnout
    • + *
    • tooFewInputsOfTurnout
    • *
    • reachable
    • *
    • unreachable
    • *
    @@ -72,33 +68,23 @@ public final class Modes3Queries extends BaseGeneratedPatternGroup { private static Modes3Queries INSTANCE; private Modes3Queries() { - querySpecifications.add(TurnoutInSegments.instance()); querySpecifications.add(ConnectedTo.instance()); querySpecifications.add(ConnectedToNotSymmetric.instance()); querySpecifications.add(ConnectedToReflexive.instance()); querySpecifications.add(TurnoutOutput.instance()); querySpecifications.add(OutputReflexive.instance()); querySpecifications.add(TurnoutOutputsAreSame.instance()); - querySpecifications.add(Turnout.instance()); querySpecifications.add(Output.instance()); querySpecifications.add(TooManyInputsOfSegment.instance()); querySpecifications.add(TurnoutConnectedToBothOutputs.instance()); - querySpecifications.add(ExtraInputOfTurnout.instance()); - querySpecifications.add(NoExtraInputOfTurnout.instance()); - querySpecifications.add(TooManyExtraInputsOfTurnout.instance()); querySpecifications.add(Adjacent.instance()); + querySpecifications.add(TooManyInputsOfTurnout.instance()); + querySpecifications.add(InputsOfTurnout.instance()); + querySpecifications.add(TooFewInputsOfTurnout.instance()); querySpecifications.add(Reachable.instance()); querySpecifications.add(Unreachable.instance()); } - public TurnoutInSegments getTurnoutInSegments() { - return TurnoutInSegments.instance(); - } - - public TurnoutInSegments.Matcher getTurnoutInSegments(final ViatraQueryEngine engine) { - return TurnoutInSegments.Matcher.on(engine); - } - public ConnectedTo getConnectedTo() { return ConnectedTo.instance(); } @@ -147,14 +133,6 @@ public final class Modes3Queries extends BaseGeneratedPatternGroup { return TurnoutOutputsAreSame.Matcher.on(engine); } - public Turnout getTurnout() { - return Turnout.instance(); - } - - public Turnout.Matcher getTurnout(final ViatraQueryEngine engine) { - return Turnout.Matcher.on(engine); - } - public Output getOutput() { return Output.instance(); } @@ -179,36 +157,36 @@ public final class Modes3Queries extends BaseGeneratedPatternGroup { return TurnoutConnectedToBothOutputs.Matcher.on(engine); } - public ExtraInputOfTurnout getExtraInputOfTurnout() { - return ExtraInputOfTurnout.instance(); + public Adjacent getAdjacent() { + return Adjacent.instance(); } - public ExtraInputOfTurnout.Matcher getExtraInputOfTurnout(final ViatraQueryEngine engine) { - return ExtraInputOfTurnout.Matcher.on(engine); + public Adjacent.Matcher getAdjacent(final ViatraQueryEngine engine) { + return Adjacent.Matcher.on(engine); } - public NoExtraInputOfTurnout getNoExtraInputOfTurnout() { - return NoExtraInputOfTurnout.instance(); + public TooManyInputsOfTurnout getTooManyInputsOfTurnout() { + return TooManyInputsOfTurnout.instance(); } - public NoExtraInputOfTurnout.Matcher getNoExtraInputOfTurnout(final ViatraQueryEngine engine) { - return NoExtraInputOfTurnout.Matcher.on(engine); + public TooManyInputsOfTurnout.Matcher getTooManyInputsOfTurnout(final ViatraQueryEngine engine) { + return TooManyInputsOfTurnout.Matcher.on(engine); } - public TooManyExtraInputsOfTurnout getTooManyExtraInputsOfTurnout() { - return TooManyExtraInputsOfTurnout.instance(); + public InputsOfTurnout getInputsOfTurnout() { + return InputsOfTurnout.instance(); } - public TooManyExtraInputsOfTurnout.Matcher getTooManyExtraInputsOfTurnout(final ViatraQueryEngine engine) { - return TooManyExtraInputsOfTurnout.Matcher.on(engine); + public InputsOfTurnout.Matcher getInputsOfTurnout(final ViatraQueryEngine engine) { + return InputsOfTurnout.Matcher.on(engine); } - public Adjacent getAdjacent() { - return Adjacent.instance(); + public TooFewInputsOfTurnout getTooFewInputsOfTurnout() { + return TooFewInputsOfTurnout.instance(); } - public Adjacent.Matcher getAdjacent(final ViatraQueryEngine engine) { - return Adjacent.Matcher.on(engine); + public TooFewInputsOfTurnout.Matcher getTooFewInputsOfTurnout(final ViatraQueryEngine engine) { + return TooFewInputsOfTurnout.Matcher.on(engine); } public Reachable getReachable() { diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/NoExtraInputOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/NoExtraInputOfTurnout.java deleted file mode 100644 index 621d736f..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/NoExtraInputOfTurnout.java +++ /dev/null @@ -1,560 +0,0 @@ -/** - * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql - */ -package modes3.queries; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import modes3.Turnout; -import modes3.queries.ExtraInputOfTurnout; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.viatra.query.runtime.api.IPatternMatch; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; -import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; -import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; -import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; -import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; -import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; -import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; - -/** - * A pattern-specific query specification that can instantiate Matcher in a type-safe way. - * - *

    Original source: - *

    - *         {@literal @}Constraint(message = "noExtraInputOfTurnout", severity = "error", key = { T })
    - *         pattern noExtraInputOfTurnout(T : Turnout) {
    - *         	neg find extraInputOfTurnout(T, _);
    - *         }
    - * 
    - * - * @see Matcher - * @see Match - * - */ -@SuppressWarnings("all") -public final class NoExtraInputOfTurnout extends BaseGeneratedEMFQuerySpecification { - /** - * Pattern-specific match representation of the modes3.queries.noExtraInputOfTurnout pattern, - * to be used in conjunction with {@link Matcher}. - * - *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. - * Each instance is a (possibly partial) substitution of pattern parameters, - * usable to represent a match of the pattern in the result of a query, - * or to specify the bound (fixed) input parameters when issuing a query. - * - * @see Matcher - * - */ - public static abstract class Match extends BasePatternMatch { - private Turnout fT; - - private static List parameterNames = makeImmutableList("T"); - - private Match(final Turnout pT) { - this.fT = pT; - } - - @Override - public Object get(final String parameterName) { - switch(parameterName) { - case "T": return this.fT; - default: return null; - } - } - - @Override - public Object get(final int index) { - switch(index) { - case 0: return this.fT; - default: return null; - } - } - - public Turnout getT() { - return this.fT; - } - - @Override - public boolean set(final String parameterName, final Object newValue) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - if ("T".equals(parameterName) ) { - this.fT = (Turnout) newValue; - return true; - } - return false; - } - - public void setT(final Turnout pT) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fT = pT; - } - - @Override - public String patternName() { - return "modes3.queries.noExtraInputOfTurnout"; - } - - @Override - public List parameterNames() { - return NoExtraInputOfTurnout.Match.parameterNames; - } - - @Override - public Object[] toArray() { - return new Object[]{fT}; - } - - @Override - public NoExtraInputOfTurnout.Match toImmutable() { - return isMutable() ? newMatch(fT) : this; - } - - @Override - public String prettyPrint() { - StringBuilder result = new StringBuilder(); - result.append("\"T\"=" + prettyPrintValue(fT)); - return result.toString(); - } - - @Override - public int hashCode() { - return Objects.hash(fT); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if ((obj instanceof NoExtraInputOfTurnout.Match)) { - NoExtraInputOfTurnout.Match other = (NoExtraInputOfTurnout.Match) obj; - return Objects.equals(fT, other.fT); - } else { - // this should be infrequent - if (!(obj instanceof IPatternMatch)) { - return false; - } - IPatternMatch otherSig = (IPatternMatch) obj; - return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); - } - } - - @Override - public NoExtraInputOfTurnout specification() { - return NoExtraInputOfTurnout.instance(); - } - - /** - * Returns an empty, mutable match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @return the empty match. - * - */ - public static NoExtraInputOfTurnout.Match newEmptyMatch() { - return new Mutable(null); - } - - /** - * Returns a mutable (partial) match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the new, mutable (partial) match object. - * - */ - public static NoExtraInputOfTurnout.Match newMutableMatch(final Turnout pT) { - return new Mutable(pT); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public static NoExtraInputOfTurnout.Match newMatch(final Turnout pT) { - return new Immutable(pT); - } - - private static final class Mutable extends NoExtraInputOfTurnout.Match { - Mutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return true; - } - } - - private static final class Immutable extends NoExtraInputOfTurnout.Match { - Immutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return false; - } - } - } - - /** - * Generated pattern matcher API of the modes3.queries.noExtraInputOfTurnout pattern, - * providing pattern-specific query methods. - * - *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, - * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. - * - *

    Matches of the pattern will be represented as {@link Match}. - * - *

    Original source: - *

    -   * {@literal @}Constraint(message = "noExtraInputOfTurnout", severity = "error", key = { T })
    -   * pattern noExtraInputOfTurnout(T : Turnout) {
    -   * 	neg find extraInputOfTurnout(T, _);
    -   * }
    -   * 
    - * - * @see Match - * @see NoExtraInputOfTurnout - * - */ - public static class Matcher extends BaseMatcher { - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - public static NoExtraInputOfTurnout.Matcher on(final ViatraQueryEngine engine) { - // check if matcher already exists - Matcher matcher = engine.getExistingMatcher(querySpecification()); - if (matcher == null) { - matcher = (Matcher)engine.getMatcher(querySpecification()); - } - return matcher; - } - - /** - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * @return an initialized matcher - * @noreference This method is for internal matcher initialization by the framework, do not call it manually. - * - */ - public static NoExtraInputOfTurnout.Matcher create() { - return new Matcher(); - } - - private static final int POSITION_T = 0; - - private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(NoExtraInputOfTurnout.Matcher.class); - - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - private Matcher() { - super(querySpecification()); - } - - /** - * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return matches represented as a Match object. - * - */ - public Collection getAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); - } - - /** - * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a stream of matches represented as a Match object. - * - */ - public Stream streamAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}); - } - - /** - * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a match represented as a Match object, or null if no match is found. - * - */ - public Optional getOneArbitraryMatch(final Turnout pT) { - return rawGetOneArbitraryMatch(new Object[]{pT}); - } - - /** - * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, - * under any possible substitution of the unspecified parameters (if any). - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return true if the input is a valid (partial) match of the pattern. - * - */ - public boolean hasMatch(final Turnout pT) { - return rawHasMatch(new Object[]{pT}); - } - - /** - * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the number of pattern matches found. - * - */ - public int countMatches(final Turnout pT) { - return rawCountMatches(new Object[]{pT}); - } - - /** - * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param processor the action that will process the selected match. - * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked - * - */ - public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { - return rawForOneArbitraryMatch(new Object[]{pT}, processor); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public NoExtraInputOfTurnout.Match newMatch(final Turnout pT) { - return NoExtraInputOfTurnout.Match.newMatch(pT); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfT(final Object[] parameters) { - return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()); - } - - @Override - protected NoExtraInputOfTurnout.Match tupleToMatch(final Tuple t) { - try { - return NoExtraInputOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T)); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in tuple not properly typed!",e); - return null; - } - } - - @Override - protected NoExtraInputOfTurnout.Match arrayToMatch(final Object[] match) { - try { - return NoExtraInputOfTurnout.Match.newMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - @Override - protected NoExtraInputOfTurnout.Match arrayToMatchMutable(final Object[] match) { - try { - return NoExtraInputOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - /** - * @return the singleton instance of the query specification of this pattern - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static IQuerySpecification querySpecification() { - return NoExtraInputOfTurnout.instance(); - } - } - - private NoExtraInputOfTurnout() { - super(GeneratedPQuery.INSTANCE); - } - - /** - * @return the singleton instance of the query specification - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static NoExtraInputOfTurnout instance() { - try{ - return LazyHolder.INSTANCE; - } catch (ExceptionInInitializerError err) { - throw processInitializerError(err); - } - } - - @Override - protected NoExtraInputOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { - return NoExtraInputOfTurnout.Matcher.on(engine); - } - - @Override - public NoExtraInputOfTurnout.Matcher instantiate() { - return NoExtraInputOfTurnout.Matcher.create(); - } - - @Override - public NoExtraInputOfTurnout.Match newEmptyMatch() { - return NoExtraInputOfTurnout.Match.newEmptyMatch(); - } - - @Override - public NoExtraInputOfTurnout.Match newMatch(final Object... parameters) { - return NoExtraInputOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]); - } - - /** - * Inner class allowing the singleton instance of {@link NoExtraInputOfTurnout} to be created - * not at the class load time of the outer class, - * but rather at the first call to {@link NoExtraInputOfTurnout#instance()}. - * - *

    This workaround is required e.g. to support recursion. - * - */ - private static class LazyHolder { - private static final NoExtraInputOfTurnout INSTANCE = new NoExtraInputOfTurnout(); - - /** - * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. - * This initialization order is required to support indirect recursion. - * - *

    The static initializer is defined using a helper field to work around limitations of the code generator. - * - */ - private static final Object STATIC_INITIALIZER = ensureInitialized(); - - public static Object ensureInitialized() { - INSTANCE.ensureInitializedInternal(); - return null; - } - } - - private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { - private static final NoExtraInputOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - - private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); - - private final List parameters = Arrays.asList(parameter_T); - - private GeneratedPQuery() { - super(PVisibility.PUBLIC); - } - - @Override - public String getFullyQualifiedName() { - return "modes3.queries.noExtraInputOfTurnout"; - } - - @Override - public List getParameterNames() { - return Arrays.asList("T"); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public Set doGetContainedBodies() { - setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); - Set bodies = new LinkedHashSet<>(); - { - PBody body = new PBody(this); - PVariable var_T = body.getOrCreateVariableByName("T"); - PVariable var___0_ = body.getOrCreateVariableByName("_<0>"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - body.setSymbolicParameters(Arrays.asList( - new ExportedParameter(body, var_T, parameter_T) - )); - // neg find extraInputOfTurnout(T, _) - new NegativePatternCall(body, Tuples.flatTupleOf(var_T, var___0_), ExtraInputOfTurnout.instance().getInternalQueryRepresentation()); - bodies.add(body); - } - { - PAnnotation annotation = new PAnnotation("Constraint"); - annotation.addAttribute("message", "noExtraInputOfTurnout"); - annotation.addAttribute("severity", "error"); - annotation.addAttribute("key", Arrays.asList(new Object[] { - new ParameterReference("T") - })); - addAnnotation(annotation); - } - return bodies; - } - } -} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java new file mode 100644 index 00000000..088640ca --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooFewInputsOfTurnout.java @@ -0,0 +1,559 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Turnout; +import modes3.queries.InputsOfTurnout; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         {@literal @}Constraint(message = "tooFewInputsOfTurnout", severity = "error", key = { T })
    + *         pattern tooFewInputsOfTurnout(T : Turnout) {
    + *         	neg find inputsOfTurnout(T);
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class TooFewInputsOfTurnout extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.tooFewInputsOfTurnout pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Turnout fT; + + private static List parameterNames = makeImmutableList("T"); + + private Match(final Turnout pT) { + this.fT = pT; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "T": return this.fT; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fT; + default: return null; + } + } + + public Turnout getT() { + return this.fT; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("T".equals(parameterName) ) { + this.fT = (Turnout) newValue; + return true; + } + return false; + } + + public void setT(final Turnout pT) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fT = pT; + } + + @Override + public String patternName() { + return "modes3.queries.tooFewInputsOfTurnout"; + } + + @Override + public List parameterNames() { + return TooFewInputsOfTurnout.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fT}; + } + + @Override + public TooFewInputsOfTurnout.Match toImmutable() { + return isMutable() ? newMatch(fT) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"T\"=" + prettyPrintValue(fT)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fT); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof TooFewInputsOfTurnout.Match)) { + TooFewInputsOfTurnout.Match other = (TooFewInputsOfTurnout.Match) obj; + return Objects.equals(fT, other.fT); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public TooFewInputsOfTurnout specification() { + return TooFewInputsOfTurnout.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static TooFewInputsOfTurnout.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static TooFewInputsOfTurnout.Match newMutableMatch(final Turnout pT) { + return new Mutable(pT); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public static TooFewInputsOfTurnout.Match newMatch(final Turnout pT) { + return new Immutable(pT); + } + + private static final class Mutable extends TooFewInputsOfTurnout.Match { + Mutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends TooFewInputsOfTurnout.Match { + Immutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.tooFewInputsOfTurnout pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * {@literal @}Constraint(message = "tooFewInputsOfTurnout", severity = "error", key = { T })
    +   * pattern tooFewInputsOfTurnout(T : Turnout) {
    +   * 	neg find inputsOfTurnout(T);
    +   * }
    +   * 
    + * + * @see Match + * @see TooFewInputsOfTurnout + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static TooFewInputsOfTurnout.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static TooFewInputsOfTurnout.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_T = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooFewInputsOfTurnout.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Turnout pT) { + return rawGetOneArbitraryMatch(new Object[]{pT}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Turnout pT) { + return rawHasMatch(new Object[]{pT}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Turnout pT) { + return rawCountMatches(new Object[]{pT}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pT}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public TooFewInputsOfTurnout.Match newMatch(final Turnout pT) { + return TooFewInputsOfTurnout.Match.newMatch(pT); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfT(final Object[] parameters) { + return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()); + } + + @Override + protected TooFewInputsOfTurnout.Match tupleToMatch(final Tuple t) { + try { + return TooFewInputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected TooFewInputsOfTurnout.Match arrayToMatch(final Object[] match) { + try { + return TooFewInputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected TooFewInputsOfTurnout.Match arrayToMatchMutable(final Object[] match) { + try { + return TooFewInputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return TooFewInputsOfTurnout.instance(); + } + } + + private TooFewInputsOfTurnout() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static TooFewInputsOfTurnout instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected TooFewInputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { + return TooFewInputsOfTurnout.Matcher.on(engine); + } + + @Override + public TooFewInputsOfTurnout.Matcher instantiate() { + return TooFewInputsOfTurnout.Matcher.create(); + } + + @Override + public TooFewInputsOfTurnout.Match newEmptyMatch() { + return TooFewInputsOfTurnout.Match.newEmptyMatch(); + } + + @Override + public TooFewInputsOfTurnout.Match newMatch(final Object... parameters) { + return TooFewInputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link TooFewInputsOfTurnout} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link TooFewInputsOfTurnout#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final TooFewInputsOfTurnout INSTANCE = new TooFewInputsOfTurnout(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final TooFewInputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_T); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.tooFewInputsOfTurnout"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("T"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_T = body.getOrCreateVariableByName("T"); + new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_T, parameter_T) + )); + // neg find inputsOfTurnout(T) + new NegativePatternCall(body, Tuples.flatTupleOf(var_T), InputsOfTurnout.instance().getInternalQueryRepresentation()); + bodies.add(body); + } + { + PAnnotation annotation = new PAnnotation("Constraint"); + annotation.addAttribute("message", "tooFewInputsOfTurnout"); + annotation.addAttribute("severity", "error"); + annotation.addAttribute("key", Arrays.asList(new Object[] { + new ParameterReference("T") + })); + addAnnotation(annotation); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyExtraInputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyExtraInputsOfTurnout.java deleted file mode 100644 index 9f417795..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyExtraInputsOfTurnout.java +++ /dev/null @@ -1,570 +0,0 @@ -/** - * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql - */ -package modes3.queries; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import modes3.Turnout; -import modes3.queries.ExtraInputOfTurnout; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.viatra.query.runtime.api.IPatternMatch; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; -import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; -import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; -import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; -import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; -import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; -import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; -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.basicenumerables.PositivePatternCall; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; - -/** - * A pattern-specific query specification that can instantiate Matcher in a type-safe way. - * - *

    Original source: - *

    - *         {@literal @}Constraint(message = "tooManyExtraInputsOfTurnout", severity = "error", key = { T })
    - *         pattern tooManyExtraInputsOfTurnout(T : Turnout) {
    - *         	find extraInputOfTurnout(T, I1);
    - *         	find extraInputOfTurnout(T, I2);
    - *         	I1 != I2;
    - *         }
    - * 
    - * - * @see Matcher - * @see Match - * - */ -@SuppressWarnings("all") -public final class TooManyExtraInputsOfTurnout extends BaseGeneratedEMFQuerySpecification { - /** - * Pattern-specific match representation of the modes3.queries.tooManyExtraInputsOfTurnout pattern, - * to be used in conjunction with {@link Matcher}. - * - *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. - * Each instance is a (possibly partial) substitution of pattern parameters, - * usable to represent a match of the pattern in the result of a query, - * or to specify the bound (fixed) input parameters when issuing a query. - * - * @see Matcher - * - */ - public static abstract class Match extends BasePatternMatch { - private Turnout fT; - - private static List parameterNames = makeImmutableList("T"); - - private Match(final Turnout pT) { - this.fT = pT; - } - - @Override - public Object get(final String parameterName) { - switch(parameterName) { - case "T": return this.fT; - default: return null; - } - } - - @Override - public Object get(final int index) { - switch(index) { - case 0: return this.fT; - default: return null; - } - } - - public Turnout getT() { - return this.fT; - } - - @Override - public boolean set(final String parameterName, final Object newValue) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - if ("T".equals(parameterName) ) { - this.fT = (Turnout) newValue; - return true; - } - return false; - } - - public void setT(final Turnout pT) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fT = pT; - } - - @Override - public String patternName() { - return "modes3.queries.tooManyExtraInputsOfTurnout"; - } - - @Override - public List parameterNames() { - return TooManyExtraInputsOfTurnout.Match.parameterNames; - } - - @Override - public Object[] toArray() { - return new Object[]{fT}; - } - - @Override - public TooManyExtraInputsOfTurnout.Match toImmutable() { - return isMutable() ? newMatch(fT) : this; - } - - @Override - public String prettyPrint() { - StringBuilder result = new StringBuilder(); - result.append("\"T\"=" + prettyPrintValue(fT)); - return result.toString(); - } - - @Override - public int hashCode() { - return Objects.hash(fT); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if ((obj instanceof TooManyExtraInputsOfTurnout.Match)) { - TooManyExtraInputsOfTurnout.Match other = (TooManyExtraInputsOfTurnout.Match) obj; - return Objects.equals(fT, other.fT); - } else { - // this should be infrequent - if (!(obj instanceof IPatternMatch)) { - return false; - } - IPatternMatch otherSig = (IPatternMatch) obj; - return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); - } - } - - @Override - public TooManyExtraInputsOfTurnout specification() { - return TooManyExtraInputsOfTurnout.instance(); - } - - /** - * Returns an empty, mutable match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @return the empty match. - * - */ - public static TooManyExtraInputsOfTurnout.Match newEmptyMatch() { - return new Mutable(null); - } - - /** - * Returns a mutable (partial) match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the new, mutable (partial) match object. - * - */ - public static TooManyExtraInputsOfTurnout.Match newMutableMatch(final Turnout pT) { - return new Mutable(pT); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public static TooManyExtraInputsOfTurnout.Match newMatch(final Turnout pT) { - return new Immutable(pT); - } - - private static final class Mutable extends TooManyExtraInputsOfTurnout.Match { - Mutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return true; - } - } - - private static final class Immutable extends TooManyExtraInputsOfTurnout.Match { - Immutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return false; - } - } - } - - /** - * Generated pattern matcher API of the modes3.queries.tooManyExtraInputsOfTurnout pattern, - * providing pattern-specific query methods. - * - *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, - * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. - * - *

    Matches of the pattern will be represented as {@link Match}. - * - *

    Original source: - *

    -   * {@literal @}Constraint(message = "tooManyExtraInputsOfTurnout", severity = "error", key = { T })
    -   * pattern tooManyExtraInputsOfTurnout(T : Turnout) {
    -   * 	find extraInputOfTurnout(T, I1);
    -   * 	find extraInputOfTurnout(T, I2);
    -   * 	I1 != I2;
    -   * }
    -   * 
    - * - * @see Match - * @see TooManyExtraInputsOfTurnout - * - */ - public static class Matcher extends BaseMatcher { - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - public static TooManyExtraInputsOfTurnout.Matcher on(final ViatraQueryEngine engine) { - // check if matcher already exists - Matcher matcher = engine.getExistingMatcher(querySpecification()); - if (matcher == null) { - matcher = (Matcher)engine.getMatcher(querySpecification()); - } - return matcher; - } - - /** - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * @return an initialized matcher - * @noreference This method is for internal matcher initialization by the framework, do not call it manually. - * - */ - public static TooManyExtraInputsOfTurnout.Matcher create() { - return new Matcher(); - } - - private static final int POSITION_T = 0; - - private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooManyExtraInputsOfTurnout.Matcher.class); - - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - private Matcher() { - super(querySpecification()); - } - - /** - * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return matches represented as a Match object. - * - */ - public Collection getAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); - } - - /** - * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a stream of matches represented as a Match object. - * - */ - public Stream streamAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}); - } - - /** - * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a match represented as a Match object, or null if no match is found. - * - */ - public Optional getOneArbitraryMatch(final Turnout pT) { - return rawGetOneArbitraryMatch(new Object[]{pT}); - } - - /** - * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, - * under any possible substitution of the unspecified parameters (if any). - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return true if the input is a valid (partial) match of the pattern. - * - */ - public boolean hasMatch(final Turnout pT) { - return rawHasMatch(new Object[]{pT}); - } - - /** - * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the number of pattern matches found. - * - */ - public int countMatches(final Turnout pT) { - return rawCountMatches(new Object[]{pT}); - } - - /** - * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param processor the action that will process the selected match. - * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked - * - */ - public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { - return rawForOneArbitraryMatch(new Object[]{pT}, processor); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public TooManyExtraInputsOfTurnout.Match newMatch(final Turnout pT) { - return TooManyExtraInputsOfTurnout.Match.newMatch(pT); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfT(final Object[] parameters) { - return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()); - } - - @Override - protected TooManyExtraInputsOfTurnout.Match tupleToMatch(final Tuple t) { - try { - return TooManyExtraInputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T)); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in tuple not properly typed!",e); - return null; - } - } - - @Override - protected TooManyExtraInputsOfTurnout.Match arrayToMatch(final Object[] match) { - try { - return TooManyExtraInputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - @Override - protected TooManyExtraInputsOfTurnout.Match arrayToMatchMutable(final Object[] match) { - try { - return TooManyExtraInputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - /** - * @return the singleton instance of the query specification of this pattern - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static IQuerySpecification querySpecification() { - return TooManyExtraInputsOfTurnout.instance(); - } - } - - private TooManyExtraInputsOfTurnout() { - super(GeneratedPQuery.INSTANCE); - } - - /** - * @return the singleton instance of the query specification - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static TooManyExtraInputsOfTurnout instance() { - try{ - return LazyHolder.INSTANCE; - } catch (ExceptionInInitializerError err) { - throw processInitializerError(err); - } - } - - @Override - protected TooManyExtraInputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { - return TooManyExtraInputsOfTurnout.Matcher.on(engine); - } - - @Override - public TooManyExtraInputsOfTurnout.Matcher instantiate() { - return TooManyExtraInputsOfTurnout.Matcher.create(); - } - - @Override - public TooManyExtraInputsOfTurnout.Match newEmptyMatch() { - return TooManyExtraInputsOfTurnout.Match.newEmptyMatch(); - } - - @Override - public TooManyExtraInputsOfTurnout.Match newMatch(final Object... parameters) { - return TooManyExtraInputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]); - } - - /** - * Inner class allowing the singleton instance of {@link TooManyExtraInputsOfTurnout} to be created - * not at the class load time of the outer class, - * but rather at the first call to {@link TooManyExtraInputsOfTurnout#instance()}. - * - *

    This workaround is required e.g. to support recursion. - * - */ - private static class LazyHolder { - private static final TooManyExtraInputsOfTurnout INSTANCE = new TooManyExtraInputsOfTurnout(); - - /** - * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. - * This initialization order is required to support indirect recursion. - * - *

    The static initializer is defined using a helper field to work around limitations of the code generator. - * - */ - private static final Object STATIC_INITIALIZER = ensureInitialized(); - - public static Object ensureInitialized() { - INSTANCE.ensureInitializedInternal(); - return null; - } - } - - private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { - private static final TooManyExtraInputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - - private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); - - private final List parameters = Arrays.asList(parameter_T); - - private GeneratedPQuery() { - super(PVisibility.PUBLIC); - } - - @Override - public String getFullyQualifiedName() { - return "modes3.queries.tooManyExtraInputsOfTurnout"; - } - - @Override - public List getParameterNames() { - return Arrays.asList("T"); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public Set doGetContainedBodies() { - setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); - Set bodies = new LinkedHashSet<>(); - { - PBody body = new PBody(this); - PVariable var_T = body.getOrCreateVariableByName("T"); - PVariable var_I1 = body.getOrCreateVariableByName("I1"); - PVariable var_I2 = body.getOrCreateVariableByName("I2"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - body.setSymbolicParameters(Arrays.asList( - new ExportedParameter(body, var_T, parameter_T) - )); - // find extraInputOfTurnout(T, I1) - new PositivePatternCall(body, Tuples.flatTupleOf(var_T, var_I1), ExtraInputOfTurnout.instance().getInternalQueryRepresentation()); - // find extraInputOfTurnout(T, I2) - new PositivePatternCall(body, Tuples.flatTupleOf(var_T, var_I2), ExtraInputOfTurnout.instance().getInternalQueryRepresentation()); - // I1 != I2 - new Inequality(body, var_I1, var_I2); - bodies.add(body); - } - { - PAnnotation annotation = new PAnnotation("Constraint"); - annotation.addAttribute("message", "tooManyExtraInputsOfTurnout"); - annotation.addAttribute("severity", "error"); - annotation.addAttribute("key", Arrays.asList(new Object[] { - new ParameterReference("T") - })); - addAnnotation(annotation); - } - return bodies; - } - } -} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java index e5e8827c..ff82dda1 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfSegment.java @@ -13,9 +13,8 @@ import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; -import modes3.Segment; +import modes3.SimpleSegment; import modes3.queries.Output; -import modes3.queries.Turnout; import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EClass; import org.eclipse.viatra.query.runtime.api.IPatternMatch; @@ -33,7 +32,6 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; 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.PositivePatternCall; import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; @@ -55,8 +53,7 @@ import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; * //} * * {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S }) - * pattern tooManyInputsOfSegment(S : Segment) { - * neg find turnout(S); + * pattern tooManyInputsOfSegment(S : SimpleSegment) { * find output(I1, S); * find output(I2, S); * find output(I3, S); @@ -85,11 +82,11 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * */ public static abstract class Match extends BasePatternMatch { - private Segment fS; + private SimpleSegment fS; private static List parameterNames = makeImmutableList("S"); - private Match(final Segment pS) { + private Match(final SimpleSegment pS) { this.fS = pS; } @@ -109,7 +106,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica } } - public Segment getS() { + public SimpleSegment getS() { return this.fS; } @@ -117,13 +114,13 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica public boolean set(final String parameterName, final Object newValue) { if (!isMutable()) throw new java.lang.UnsupportedOperationException(); if ("S".equals(parameterName) ) { - this.fS = (Segment) newValue; + this.fS = (SimpleSegment) newValue; return true; } return false; } - public void setS(final Segment pS) { + public void setS(final SimpleSegment pS) { if (!isMutable()) throw new java.lang.UnsupportedOperationException(); this.fS = pS; } @@ -204,7 +201,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the new, mutable (partial) match object. * */ - public static TooManyInputsOfSegment.Match newMutableMatch(final Segment pS) { + public static TooManyInputsOfSegment.Match newMutableMatch(final SimpleSegment pS) { return new Mutable(pS); } @@ -216,12 +213,12 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the (partial) match object. * */ - public static TooManyInputsOfSegment.Match newMatch(final Segment pS) { + public static TooManyInputsOfSegment.Match newMatch(final SimpleSegment pS) { return new Immutable(pS); } private static final class Mutable extends TooManyInputsOfSegment.Match { - Mutable(final Segment pS) { + Mutable(final SimpleSegment pS) { super(pS); } @@ -232,7 +229,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica } private static final class Immutable extends TooManyInputsOfSegment.Match { - Immutable(final Segment pS) { + Immutable(final SimpleSegment pS) { super(pS); } @@ -261,8 +258,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * //} * * {@literal @}Constraint(message = "tooManyInputsOfSegment", severity = "error", key = { S }) - * pattern tooManyInputsOfSegment(S : Segment) { - * neg find turnout(S); + * pattern tooManyInputsOfSegment(S : SimpleSegment) { * find output(I1, S); * find output(I2, S); * find output(I3, S); @@ -326,7 +322,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return matches represented as a Match object. * */ - public Collection getAllMatches(final Segment pS) { + public Collection getAllMatches(final SimpleSegment pS) { return rawStreamAllMatches(new Object[]{pS}).collect(Collectors.toSet()); } @@ -340,7 +336,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return a stream of matches represented as a Match object. * */ - public Stream streamAllMatches(final Segment pS) { + public Stream streamAllMatches(final SimpleSegment pS) { return rawStreamAllMatches(new Object[]{pS}); } @@ -351,7 +347,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return a match represented as a Match object, or null if no match is found. * */ - public Optional getOneArbitraryMatch(final Segment pS) { + public Optional getOneArbitraryMatch(final SimpleSegment pS) { return rawGetOneArbitraryMatch(new Object[]{pS}); } @@ -362,7 +358,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return true if the input is a valid (partial) match of the pattern. * */ - public boolean hasMatch(final Segment pS) { + public boolean hasMatch(final SimpleSegment pS) { return rawHasMatch(new Object[]{pS}); } @@ -372,7 +368,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the number of pattern matches found. * */ - public int countMatches(final Segment pS) { + public int countMatches(final SimpleSegment pS) { return rawCountMatches(new Object[]{pS}); } @@ -384,7 +380,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked * */ - public boolean forOneArbitraryMatch(final Segment pS, final Consumer processor) { + public boolean forOneArbitraryMatch(final SimpleSegment pS, final Consumer processor) { return rawForOneArbitraryMatch(new Object[]{pS}, processor); } @@ -396,7 +392,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the (partial) match object. * */ - public TooManyInputsOfSegment.Match newMatch(final Segment pS) { + public TooManyInputsOfSegment.Match newMatch(final SimpleSegment pS) { return TooManyInputsOfSegment.Match.newMatch(pS); } @@ -405,8 +401,8 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the Set of all values or empty set if there are no matches * */ - protected Stream rawStreamAllValuesOfS(final Object[] parameters) { - return rawStreamAllValues(POSITION_S, parameters).map(Segment.class::cast); + protected Stream rawStreamAllValuesOfS(final Object[] parameters) { + return rawStreamAllValues(POSITION_S, parameters).map(SimpleSegment.class::cast); } /** @@ -414,7 +410,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the Set of all values or empty set if there are no matches * */ - public Set getAllValuesOfS() { + public Set getAllValuesOfS() { return rawStreamAllValuesOfS(emptyArray()).collect(Collectors.toSet()); } @@ -423,14 +419,14 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica * @return the Set of all values or empty set if there are no matches * */ - public Stream streamAllValuesOfS() { + public Stream streamAllValuesOfS() { return rawStreamAllValuesOfS(emptyArray()); } @Override protected TooManyInputsOfSegment.Match tupleToMatch(final Tuple t) { try { - return TooManyInputsOfSegment.Match.newMatch((Segment) t.get(POSITION_S)); + return TooManyInputsOfSegment.Match.newMatch((SimpleSegment) t.get(POSITION_S)); } catch(ClassCastException e) { LOGGER.error("Element(s) in tuple not properly typed!",e); return null; @@ -440,7 +436,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica @Override protected TooManyInputsOfSegment.Match arrayToMatch(final Object[] match) { try { - return TooManyInputsOfSegment.Match.newMatch((Segment) match[POSITION_S]); + return TooManyInputsOfSegment.Match.newMatch((SimpleSegment) match[POSITION_S]); } catch(ClassCastException e) { LOGGER.error("Element(s) in array not properly typed!",e); return null; @@ -450,7 +446,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica @Override protected TooManyInputsOfSegment.Match arrayToMatchMutable(final Object[] match) { try { - return TooManyInputsOfSegment.Match.newMutableMatch((Segment) match[POSITION_S]); + return TooManyInputsOfSegment.Match.newMutableMatch((SimpleSegment) match[POSITION_S]); } catch(ClassCastException e) { LOGGER.error("Element(s) in array not properly typed!",e); return null; @@ -501,7 +497,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica @Override public TooManyInputsOfSegment.Match newMatch(final Object... parameters) { - return TooManyInputsOfSegment.Match.newMatch((modes3.Segment) parameters[0]); + return TooManyInputsOfSegment.Match.newMatch((modes3.SimpleSegment) parameters[0]); } /** @@ -533,7 +529,7 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { private static final TooManyInputsOfSegment.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - private final PParameter parameter_S = new PParameter("S", "modes3.Segment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Segment")), PParameterDirection.INOUT); + private final PParameter parameter_S = new PParameter("S", "modes3.SimpleSegment", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "SimpleSegment")), PParameterDirection.INOUT); private final List parameters = Arrays.asList(parameter_S); @@ -566,12 +562,10 @@ public final class TooManyInputsOfSegment extends BaseGeneratedEMFQuerySpecifica PVariable var_I1 = body.getOrCreateVariableByName("I1"); PVariable var_I2 = body.getOrCreateVariableByName("I2"); PVariable var_I3 = body.getOrCreateVariableByName("I3"); - new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_S), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "SimpleSegment"))); body.setSymbolicParameters(Arrays.asList( new ExportedParameter(body, var_S, parameter_S) )); - // neg find turnout(S) - new NegativePatternCall(body, Tuples.flatTupleOf(var_S), Turnout.instance().getInternalQueryRepresentation()); // find output(I1, S) new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_S), Output.instance().getInternalQueryRepresentation()); // find output(I2, S) diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java new file mode 100644 index 00000000..93076cbb --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TooManyInputsOfTurnout.java @@ -0,0 +1,600 @@ +/** + * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql + */ +package modes3.queries; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import modes3.Turnout; +import modes3.queries.Adjacent; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; +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.basicenumerables.PositivePatternCall; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
    + *         pattern tooManyInputsOfTurnout(T : Turnout) {
    + *         	find adjacent(I1, T);
    + *         	find adjacent(I2, T);
    + *         	find adjacent(I3, T);
    + *         	find adjacent(I4, T);
    + *         	I1 != I2;
    + *         	I1 != I3;
    + *         	I1 != I4;
    + *         	I2 != I3;
    + *         	I2 != I4;
    + *         	I3 != I4;
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class TooManyInputsOfTurnout extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the modes3.queries.tooManyInputsOfTurnout pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private Turnout fT; + + private static List parameterNames = makeImmutableList("T"); + + private Match(final Turnout pT) { + this.fT = pT; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "T": return this.fT; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fT; + default: return null; + } + } + + public Turnout getT() { + return this.fT; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("T".equals(parameterName) ) { + this.fT = (Turnout) newValue; + return true; + } + return false; + } + + public void setT(final Turnout pT) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fT = pT; + } + + @Override + public String patternName() { + return "modes3.queries.tooManyInputsOfTurnout"; + } + + @Override + public List parameterNames() { + return TooManyInputsOfTurnout.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fT}; + } + + @Override + public TooManyInputsOfTurnout.Match toImmutable() { + return isMutable() ? newMatch(fT) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"T\"=" + prettyPrintValue(fT)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fT); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof TooManyInputsOfTurnout.Match)) { + TooManyInputsOfTurnout.Match other = (TooManyInputsOfTurnout.Match) obj; + return Objects.equals(fT, other.fT); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public TooManyInputsOfTurnout specification() { + return TooManyInputsOfTurnout.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static TooManyInputsOfTurnout.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static TooManyInputsOfTurnout.Match newMutableMatch(final Turnout pT) { + return new Mutable(pT); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public static TooManyInputsOfTurnout.Match newMatch(final Turnout pT) { + return new Immutable(pT); + } + + private static final class Mutable extends TooManyInputsOfTurnout.Match { + Mutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends TooManyInputsOfTurnout.Match { + Immutable(final Turnout pT) { + super(pT); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the modes3.queries.tooManyInputsOfTurnout pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * {@literal @}Constraint(message = "turnoutConnectedToBothOutputs", severity = "error", key = { T })
    +   * pattern tooManyInputsOfTurnout(T : Turnout) {
    +   * 	find adjacent(I1, T);
    +   * 	find adjacent(I2, T);
    +   * 	find adjacent(I3, T);
    +   * 	find adjacent(I4, T);
    +   * 	I1 != I2;
    +   * 	I1 != I3;
    +   * 	I1 != I4;
    +   * 	I2 != I3;
    +   * 	I2 != I4;
    +   * 	I3 != I4;
    +   * }
    +   * 
    + * + * @see Match + * @see TooManyInputsOfTurnout + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static TooManyInputsOfTurnout.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static TooManyInputsOfTurnout.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_T = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TooManyInputsOfTurnout.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final Turnout pT) { + return rawStreamAllMatches(new Object[]{pT}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final Turnout pT) { + return rawGetOneArbitraryMatch(new Object[]{pT}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final Turnout pT) { + return rawHasMatch(new Object[]{pT}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final Turnout pT) { + return rawCountMatches(new Object[]{pT}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pT}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pT the fixed value of pattern parameter T, or null if not bound. + * @return the (partial) match object. + * + */ + public TooManyInputsOfTurnout.Match newMatch(final Turnout pT) { + return TooManyInputsOfTurnout.Match.newMatch(pT); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfT(final Object[] parameters) { + return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for T. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfT() { + return rawStreamAllValuesOfT(emptyArray()); + } + + @Override + protected TooManyInputsOfTurnout.Match tupleToMatch(final Tuple t) { + try { + return TooManyInputsOfTurnout.Match.newMatch((Turnout) t.get(POSITION_T)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected TooManyInputsOfTurnout.Match arrayToMatch(final Object[] match) { + try { + return TooManyInputsOfTurnout.Match.newMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected TooManyInputsOfTurnout.Match arrayToMatchMutable(final Object[] match) { + try { + return TooManyInputsOfTurnout.Match.newMutableMatch((Turnout) match[POSITION_T]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return TooManyInputsOfTurnout.instance(); + } + } + + private TooManyInputsOfTurnout() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static TooManyInputsOfTurnout instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected TooManyInputsOfTurnout.Matcher instantiate(final ViatraQueryEngine engine) { + return TooManyInputsOfTurnout.Matcher.on(engine); + } + + @Override + public TooManyInputsOfTurnout.Matcher instantiate() { + return TooManyInputsOfTurnout.Matcher.create(); + } + + @Override + public TooManyInputsOfTurnout.Match newEmptyMatch() { + return TooManyInputsOfTurnout.Match.newEmptyMatch(); + } + + @Override + public TooManyInputsOfTurnout.Match newMatch(final Object... parameters) { + return TooManyInputsOfTurnout.Match.newMatch((modes3.Turnout) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link TooManyInputsOfTurnout} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link TooManyInputsOfTurnout#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final TooManyInputsOfTurnout INSTANCE = new TooManyInputsOfTurnout(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final TooManyInputsOfTurnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_T); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "modes3.queries.tooManyInputsOfTurnout"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("T"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_T = body.getOrCreateVariableByName("T"); + PVariable var_I1 = body.getOrCreateVariableByName("I1"); + PVariable var_I2 = body.getOrCreateVariableByName("I2"); + PVariable var_I3 = body.getOrCreateVariableByName("I3"); + PVariable var_I4 = body.getOrCreateVariableByName("I4"); + new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_T, parameter_T) + )); + // find adjacent(I1, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I1, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // find adjacent(I2, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I2, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // find adjacent(I3, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I3, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // find adjacent(I4, T) + new PositivePatternCall(body, Tuples.flatTupleOf(var_I4, var_T), Adjacent.instance().getInternalQueryRepresentation()); + // I1 != I2 + new Inequality(body, var_I1, var_I2); + // I1 != I3 + new Inequality(body, var_I1, var_I3); + // I1 != I4 + new Inequality(body, var_I1, var_I4); + // I2 != I3 + new Inequality(body, var_I2, var_I3); + // I2 != I4 + new Inequality(body, var_I2, var_I4); + // I3 != I4 + new Inequality(body, var_I3, var_I4); + bodies.add(body); + } + { + PAnnotation annotation = new PAnnotation("Constraint"); + annotation.addAttribute("message", "turnoutConnectedToBothOutputs"); + annotation.addAttribute("severity", "error"); + annotation.addAttribute("key", Arrays.asList(new Object[] { + new ParameterReference("T") + })); + addAnnotation(annotation); + } + return bodies; + } + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Turnout.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Turnout.java deleted file mode 100644 index 34c7631c..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/Turnout.java +++ /dev/null @@ -1,543 +0,0 @@ -/** - * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql - */ -package modes3.queries; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.viatra.query.runtime.api.IPatternMatch; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; -import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; -import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; -import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; -import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; -import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; -import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; - -/** - * A pattern-specific query specification that can instantiate Matcher in a type-safe way. - * - *

    Original source: - *

    - *         pattern turnout(T : Turnout) {
    - *         	Turnout(T);
    - *         }
    - * 
    - * - * @see Matcher - * @see Match - * - */ -@SuppressWarnings("all") -public final class Turnout extends BaseGeneratedEMFQuerySpecification { - /** - * Pattern-specific match representation of the modes3.queries.turnout pattern, - * to be used in conjunction with {@link Matcher}. - * - *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. - * Each instance is a (possibly partial) substitution of pattern parameters, - * usable to represent a match of the pattern in the result of a query, - * or to specify the bound (fixed) input parameters when issuing a query. - * - * @see Matcher - * - */ - public static abstract class Match extends BasePatternMatch { - private modes3.Turnout fT; - - private static List parameterNames = makeImmutableList("T"); - - private Match(final modes3.Turnout pT) { - this.fT = pT; - } - - @Override - public Object get(final String parameterName) { - switch(parameterName) { - case "T": return this.fT; - default: return null; - } - } - - @Override - public Object get(final int index) { - switch(index) { - case 0: return this.fT; - default: return null; - } - } - - public modes3.Turnout getT() { - return this.fT; - } - - @Override - public boolean set(final String parameterName, final Object newValue) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - if ("T".equals(parameterName) ) { - this.fT = (modes3.Turnout) newValue; - return true; - } - return false; - } - - public void setT(final modes3.Turnout pT) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fT = pT; - } - - @Override - public String patternName() { - return "modes3.queries.turnout"; - } - - @Override - public List parameterNames() { - return Turnout.Match.parameterNames; - } - - @Override - public Object[] toArray() { - return new Object[]{fT}; - } - - @Override - public Turnout.Match toImmutable() { - return isMutable() ? newMatch(fT) : this; - } - - @Override - public String prettyPrint() { - StringBuilder result = new StringBuilder(); - result.append("\"T\"=" + prettyPrintValue(fT)); - return result.toString(); - } - - @Override - public int hashCode() { - return Objects.hash(fT); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if ((obj instanceof Turnout.Match)) { - Turnout.Match other = (Turnout.Match) obj; - return Objects.equals(fT, other.fT); - } else { - // this should be infrequent - if (!(obj instanceof IPatternMatch)) { - return false; - } - IPatternMatch otherSig = (IPatternMatch) obj; - return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); - } - } - - @Override - public Turnout specification() { - return Turnout.instance(); - } - - /** - * Returns an empty, mutable match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @return the empty match. - * - */ - public static Turnout.Match newEmptyMatch() { - return new Mutable(null); - } - - /** - * Returns a mutable (partial) match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the new, mutable (partial) match object. - * - */ - public static Turnout.Match newMutableMatch(final modes3.Turnout pT) { - return new Mutable(pT); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public static Turnout.Match newMatch(final modes3.Turnout pT) { - return new Immutable(pT); - } - - private static final class Mutable extends Turnout.Match { - Mutable(final modes3.Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return true; - } - } - - private static final class Immutable extends Turnout.Match { - Immutable(final modes3.Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return false; - } - } - } - - /** - * Generated pattern matcher API of the modes3.queries.turnout pattern, - * providing pattern-specific query methods. - * - *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, - * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. - * - *

    Matches of the pattern will be represented as {@link Match}. - * - *

    Original source: - *

    -   * pattern turnout(T : Turnout) {
    -   * 	Turnout(T);
    -   * }
    -   * 
    - * - * @see Match - * @see Turnout - * - */ - public static class Matcher extends BaseMatcher { - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - public static Turnout.Matcher on(final ViatraQueryEngine engine) { - // check if matcher already exists - Matcher matcher = engine.getExistingMatcher(querySpecification()); - if (matcher == null) { - matcher = (Matcher)engine.getMatcher(querySpecification()); - } - return matcher; - } - - /** - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * @return an initialized matcher - * @noreference This method is for internal matcher initialization by the framework, do not call it manually. - * - */ - public static Turnout.Matcher create() { - return new Matcher(); - } - - private static final int POSITION_T = 0; - - private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Turnout.Matcher.class); - - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - private Matcher() { - super(querySpecification()); - } - - /** - * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return matches represented as a Match object. - * - */ - public Collection getAllMatches(final modes3.Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); - } - - /** - * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a stream of matches represented as a Match object. - * - */ - public Stream streamAllMatches(final modes3.Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}); - } - - /** - * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a match represented as a Match object, or null if no match is found. - * - */ - public Optional getOneArbitraryMatch(final modes3.Turnout pT) { - return rawGetOneArbitraryMatch(new Object[]{pT}); - } - - /** - * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, - * under any possible substitution of the unspecified parameters (if any). - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return true if the input is a valid (partial) match of the pattern. - * - */ - public boolean hasMatch(final modes3.Turnout pT) { - return rawHasMatch(new Object[]{pT}); - } - - /** - * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the number of pattern matches found. - * - */ - public int countMatches(final modes3.Turnout pT) { - return rawCountMatches(new Object[]{pT}); - } - - /** - * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param processor the action that will process the selected match. - * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked - * - */ - public boolean forOneArbitraryMatch(final modes3.Turnout pT, final Consumer processor) { - return rawForOneArbitraryMatch(new Object[]{pT}, processor); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public Turnout.Match newMatch(final modes3.Turnout pT) { - return Turnout.Match.newMatch(pT); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfT(final Object[] parameters) { - return rawStreamAllValues(POSITION_T, parameters).map(modes3.Turnout.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()); - } - - @Override - protected Turnout.Match tupleToMatch(final Tuple t) { - try { - return Turnout.Match.newMatch((modes3.Turnout) t.get(POSITION_T)); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in tuple not properly typed!",e); - return null; - } - } - - @Override - protected Turnout.Match arrayToMatch(final Object[] match) { - try { - return Turnout.Match.newMatch((modes3.Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - @Override - protected Turnout.Match arrayToMatchMutable(final Object[] match) { - try { - return Turnout.Match.newMutableMatch((modes3.Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - /** - * @return the singleton instance of the query specification of this pattern - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static IQuerySpecification querySpecification() { - return Turnout.instance(); - } - } - - private Turnout() { - super(GeneratedPQuery.INSTANCE); - } - - /** - * @return the singleton instance of the query specification - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static Turnout instance() { - try{ - return LazyHolder.INSTANCE; - } catch (ExceptionInInitializerError err) { - throw processInitializerError(err); - } - } - - @Override - protected Turnout.Matcher instantiate(final ViatraQueryEngine engine) { - return Turnout.Matcher.on(engine); - } - - @Override - public Turnout.Matcher instantiate() { - return Turnout.Matcher.create(); - } - - @Override - public Turnout.Match newEmptyMatch() { - return Turnout.Match.newEmptyMatch(); - } - - @Override - public Turnout.Match newMatch(final Object... parameters) { - return Turnout.Match.newMatch((modes3.Turnout) parameters[0]); - } - - /** - * Inner class allowing the singleton instance of {@link Turnout} to be created - * not at the class load time of the outer class, - * but rather at the first call to {@link Turnout#instance()}. - * - *

    This workaround is required e.g. to support recursion. - * - */ - private static class LazyHolder { - private static final Turnout INSTANCE = new Turnout(); - - /** - * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. - * This initialization order is required to support indirect recursion. - * - *

    The static initializer is defined using a helper field to work around limitations of the code generator. - * - */ - private static final Object STATIC_INITIALIZER = ensureInitialized(); - - public static Object ensureInitialized() { - INSTANCE.ensureInitializedInternal(); - return null; - } - } - - private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { - private static final Turnout.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - - private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); - - private final List parameters = Arrays.asList(parameter_T); - - private GeneratedPQuery() { - super(PVisibility.PUBLIC); - } - - @Override - public String getFullyQualifiedName() { - return "modes3.queries.turnout"; - } - - @Override - public List getParameterNames() { - return Arrays.asList("T"); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public Set doGetContainedBodies() { - setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); - Set bodies = new LinkedHashSet<>(); - { - PBody body = new PBody(this); - PVariable var_T = body.getOrCreateVariableByName("T"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - body.setSymbolicParameters(Arrays.asList( - new ExportedParameter(body, var_T, parameter_T) - )); - // Turnout(T) - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - bodies.add(body); - } - return bodies; - } - } -} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutInSegments.java b/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutInSegments.java deleted file mode 100644 index 9c9a5d18..00000000 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/vql-gen/modes3/queries/TurnoutInSegments.java +++ /dev/null @@ -1,564 +0,0 @@ -/** - * Generated from platform:/resource/ca.mcgill.rtgmrt.example.modes3/src/modes3/queries/Modes3Queries.vql - */ -package modes3.queries; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import modes3.Turnout; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.viatra.query.runtime.api.IPatternMatch; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; -import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; -import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; -import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; -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.backend.QueryEvaluationHint; -import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; -import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; -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.basicenumerables.TypeConstraint; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; - -/** - * A pattern-specific query specification that can instantiate Matcher in a type-safe way. - * - *

    Original source: - *

    - *         {@literal @}Constraint(message = "turnoutInSegments", severity = "error", key = { T })
    - *         pattern turnoutInSegments(T : Turnout) {
    - *         	Modes3ModelRoot.segments(_, T);
    - *         }
    - * 
    - * - * @see Matcher - * @see Match - * - */ -@SuppressWarnings("all") -public final class TurnoutInSegments extends BaseGeneratedEMFQuerySpecification { - /** - * Pattern-specific match representation of the modes3.queries.turnoutInSegments pattern, - * to be used in conjunction with {@link Matcher}. - * - *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. - * Each instance is a (possibly partial) substitution of pattern parameters, - * usable to represent a match of the pattern in the result of a query, - * or to specify the bound (fixed) input parameters when issuing a query. - * - * @see Matcher - * - */ - public static abstract class Match extends BasePatternMatch { - private Turnout fT; - - private static List parameterNames = makeImmutableList("T"); - - private Match(final Turnout pT) { - this.fT = pT; - } - - @Override - public Object get(final String parameterName) { - switch(parameterName) { - case "T": return this.fT; - default: return null; - } - } - - @Override - public Object get(final int index) { - switch(index) { - case 0: return this.fT; - default: return null; - } - } - - public Turnout getT() { - return this.fT; - } - - @Override - public boolean set(final String parameterName, final Object newValue) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - if ("T".equals(parameterName) ) { - this.fT = (Turnout) newValue; - return true; - } - return false; - } - - public void setT(final Turnout pT) { - if (!isMutable()) throw new java.lang.UnsupportedOperationException(); - this.fT = pT; - } - - @Override - public String patternName() { - return "modes3.queries.turnoutInSegments"; - } - - @Override - public List parameterNames() { - return TurnoutInSegments.Match.parameterNames; - } - - @Override - public Object[] toArray() { - return new Object[]{fT}; - } - - @Override - public TurnoutInSegments.Match toImmutable() { - return isMutable() ? newMatch(fT) : this; - } - - @Override - public String prettyPrint() { - StringBuilder result = new StringBuilder(); - result.append("\"T\"=" + prettyPrintValue(fT)); - return result.toString(); - } - - @Override - public int hashCode() { - return Objects.hash(fT); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if ((obj instanceof TurnoutInSegments.Match)) { - TurnoutInSegments.Match other = (TurnoutInSegments.Match) obj; - return Objects.equals(fT, other.fT); - } else { - // this should be infrequent - if (!(obj instanceof IPatternMatch)) { - return false; - } - IPatternMatch otherSig = (IPatternMatch) obj; - return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); - } - } - - @Override - public TurnoutInSegments specification() { - return TurnoutInSegments.instance(); - } - - /** - * Returns an empty, mutable match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @return the empty match. - * - */ - public static TurnoutInSegments.Match newEmptyMatch() { - return new Mutable(null); - } - - /** - * Returns a mutable (partial) match. - * Fields of the mutable match can be filled to create a partial match, usable as matcher input. - * - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the new, mutable (partial) match object. - * - */ - public static TurnoutInSegments.Match newMutableMatch(final Turnout pT) { - return new Mutable(pT); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public static TurnoutInSegments.Match newMatch(final Turnout pT) { - return new Immutable(pT); - } - - private static final class Mutable extends TurnoutInSegments.Match { - Mutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return true; - } - } - - private static final class Immutable extends TurnoutInSegments.Match { - Immutable(final Turnout pT) { - super(pT); - } - - @Override - public boolean isMutable() { - return false; - } - } - } - - /** - * Generated pattern matcher API of the modes3.queries.turnoutInSegments pattern, - * providing pattern-specific query methods. - * - *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, - * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. - * - *

    Matches of the pattern will be represented as {@link Match}. - * - *

    Original source: - *

    -   * {@literal @}Constraint(message = "turnoutInSegments", severity = "error", key = { T })
    -   * pattern turnoutInSegments(T : Turnout) {
    -   * 	Modes3ModelRoot.segments(_, T);
    -   * }
    -   * 
    - * - * @see Match - * @see TurnoutInSegments - * - */ - public static class Matcher extends BaseMatcher { - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - public static TurnoutInSegments.Matcher on(final ViatraQueryEngine engine) { - // check if matcher already exists - Matcher matcher = engine.getExistingMatcher(querySpecification()); - if (matcher == null) { - matcher = (Matcher)engine.getMatcher(querySpecification()); - } - return matcher; - } - - /** - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * @return an initialized matcher - * @noreference This method is for internal matcher initialization by the framework, do not call it manually. - * - */ - public static TurnoutInSegments.Matcher create() { - return new Matcher(); - } - - private static final int POSITION_T = 0; - - private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(TurnoutInSegments.Matcher.class); - - /** - * Initializes the pattern matcher within an existing VIATRA Query engine. - * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. - * - * @param engine the existing VIATRA Query engine in which this matcher will be created. - * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation - * - */ - private Matcher() { - super(querySpecification()); - } - - /** - * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return matches represented as a Match object. - * - */ - public Collection getAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}).collect(Collectors.toSet()); - } - - /** - * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. - *

    - * NOTE: It is important not to modify the source model while the stream is being processed. - * If the match set of the pattern changes during processing, the contents of the stream is undefined. - * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a stream of matches represented as a Match object. - * - */ - public Stream streamAllMatches(final Turnout pT) { - return rawStreamAllMatches(new Object[]{pT}); - } - - /** - * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return a match represented as a Match object, or null if no match is found. - * - */ - public Optional getOneArbitraryMatch(final Turnout pT) { - return rawGetOneArbitraryMatch(new Object[]{pT}); - } - - /** - * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, - * under any possible substitution of the unspecified parameters (if any). - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return true if the input is a valid (partial) match of the pattern. - * - */ - public boolean hasMatch(final Turnout pT) { - return rawHasMatch(new Object[]{pT}); - } - - /** - * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the number of pattern matches found. - * - */ - public int countMatches(final Turnout pT) { - return rawCountMatches(new Object[]{pT}); - } - - /** - * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. - * Neither determinism nor randomness of selection is guaranteed. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @param processor the action that will process the selected match. - * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked - * - */ - public boolean forOneArbitraryMatch(final Turnout pT, final Consumer processor) { - return rawForOneArbitraryMatch(new Object[]{pT}, processor); - } - - /** - * Returns a new (partial) match. - * This can be used e.g. to call the matcher with a partial match. - *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. - * @param pT the fixed value of pattern parameter T, or null if not bound. - * @return the (partial) match object. - * - */ - public TurnoutInSegments.Match newMatch(final Turnout pT) { - return TurnoutInSegments.Match.newMatch(pT); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - protected Stream rawStreamAllValuesOfT(final Object[] parameters) { - return rawStreamAllValues(POSITION_T, parameters).map(Turnout.class::cast); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Set getAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()).collect(Collectors.toSet()); - } - - /** - * Retrieve the set of values that occur in matches for T. - * @return the Set of all values or empty set if there are no matches - * - */ - public Stream streamAllValuesOfT() { - return rawStreamAllValuesOfT(emptyArray()); - } - - @Override - protected TurnoutInSegments.Match tupleToMatch(final Tuple t) { - try { - return TurnoutInSegments.Match.newMatch((Turnout) t.get(POSITION_T)); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in tuple not properly typed!",e); - return null; - } - } - - @Override - protected TurnoutInSegments.Match arrayToMatch(final Object[] match) { - try { - return TurnoutInSegments.Match.newMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - @Override - protected TurnoutInSegments.Match arrayToMatchMutable(final Object[] match) { - try { - return TurnoutInSegments.Match.newMutableMatch((Turnout) match[POSITION_T]); - } catch(ClassCastException e) { - LOGGER.error("Element(s) in array not properly typed!",e); - return null; - } - } - - /** - * @return the singleton instance of the query specification of this pattern - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static IQuerySpecification querySpecification() { - return TurnoutInSegments.instance(); - } - } - - private TurnoutInSegments() { - super(GeneratedPQuery.INSTANCE); - } - - /** - * @return the singleton instance of the query specification - * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded - * - */ - public static TurnoutInSegments instance() { - try{ - return LazyHolder.INSTANCE; - } catch (ExceptionInInitializerError err) { - throw processInitializerError(err); - } - } - - @Override - protected TurnoutInSegments.Matcher instantiate(final ViatraQueryEngine engine) { - return TurnoutInSegments.Matcher.on(engine); - } - - @Override - public TurnoutInSegments.Matcher instantiate() { - return TurnoutInSegments.Matcher.create(); - } - - @Override - public TurnoutInSegments.Match newEmptyMatch() { - return TurnoutInSegments.Match.newEmptyMatch(); - } - - @Override - public TurnoutInSegments.Match newMatch(final Object... parameters) { - return TurnoutInSegments.Match.newMatch((modes3.Turnout) parameters[0]); - } - - /** - * Inner class allowing the singleton instance of {@link TurnoutInSegments} to be created - * not at the class load time of the outer class, - * but rather at the first call to {@link TurnoutInSegments#instance()}. - * - *

    This workaround is required e.g. to support recursion. - * - */ - private static class LazyHolder { - private static final TurnoutInSegments INSTANCE = new TurnoutInSegments(); - - /** - * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. - * This initialization order is required to support indirect recursion. - * - *

    The static initializer is defined using a helper field to work around limitations of the code generator. - * - */ - private static final Object STATIC_INITIALIZER = ensureInitialized(); - - public static Object ensureInitialized() { - INSTANCE.ensureInitializedInternal(); - return null; - } - } - - private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { - private static final TurnoutInSegments.GeneratedPQuery INSTANCE = new GeneratedPQuery(); - - private final PParameter parameter_T = new PParameter("T", "modes3.Turnout", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.ece.mcgill.ca/wcet/modes3", "Turnout")), PParameterDirection.INOUT); - - private final List parameters = Arrays.asList(parameter_T); - - private GeneratedPQuery() { - super(PVisibility.PUBLIC); - } - - @Override - public String getFullyQualifiedName() { - return "modes3.queries.turnoutInSegments"; - } - - @Override - public List getParameterNames() { - return Arrays.asList("T"); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public Set doGetContainedBodies() { - setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); - Set bodies = new LinkedHashSet<>(); - { - PBody body = new PBody(this); - PVariable var_T = body.getOrCreateVariableByName("T"); - PVariable var___0_ = body.getOrCreateVariableByName("_<0>"); - new TypeConstraint(body, Tuples.flatTupleOf(var_T), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Turnout"))); - body.setSymbolicParameters(Arrays.asList( - new ExportedParameter(body, var_T, parameter_T) - )); - // Modes3ModelRoot.segments(_, T) - new TypeConstraint(body, Tuples.flatTupleOf(var___0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Modes3ModelRoot"))); - PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); - new TypeConstraint(body, Tuples.flatTupleOf(var___0_, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Modes3ModelRoot", "segments"))); - new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.ece.mcgill.ca/wcet/modes3", "Segment"))); - new Equality(body, var__virtual_0_, var_T); - bodies.add(body); - } - { - PAnnotation annotation = new PAnnotation("Constraint"); - annotation.addAttribute("message", "turnoutInSegments"); - annotation.addAttribute("severity", "error"); - annotation.addAttribute("key", Arrays.asList(new Object[] { - new ParameterReference("T") - })); - addAnnotation(annotation); - } - return bodies; - } - } -} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3ModelGenerator.xtendbin b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3ModelGenerator.xtendbin index 4f542a67..77f1ea6e 100644 Binary files a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3ModelGenerator.xtendbin and b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3ModelGenerator.xtendbin differ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3TypeScopeHint.xtendbin b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3TypeScopeHint.xtendbin new file mode 100644 index 00000000..4fdbb71b Binary files /dev/null and b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3TypeScopeHint.xtendbin differ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3UnitPropagationGenerator.xtendbin b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3UnitPropagationGenerator.xtendbin index 28e763b9..e5e1b63e 100644 Binary files a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3UnitPropagationGenerator.xtendbin and b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.Modes3UnitPropagationGenerator.xtendbin differ diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.gitignore b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.gitignore index 53dcf60f..fb94df96 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.gitignore +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/.gitignore @@ -1,2 +1,3 @@ /.Modes3ModelGenerator.java._trace /.Modes3UnitPropagationGenerator.java._trace +/.Modes3TypeScopeHint.java._trace diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3ModelGenerator.java b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3ModelGenerator.java index c7364257..f32a7172 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3ModelGenerator.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3ModelGenerator.java @@ -12,7 +12,9 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor; import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsFactory; import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage; import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion; +import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder; +import hu.bme.mit.inf.dslreasoner.logic.model.builder.SolutionScope; import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput; import hu.bme.mit.inf.dslreasoner.logic.model.builder.TypeScopes; import hu.bme.mit.inf.dslreasoner.logic.model.builder.VariableContext; @@ -48,6 +50,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.RelationLink; import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml; import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualisation; +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DebugConfiguration; import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy; import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner; import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration; @@ -57,12 +60,13 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Predicate; import modes3.Modes3Factory; import modes3.Modes3ModelRoot; import modes3.Modes3Package; import modes3.queries.Modes3Queries; +import modes3.run.Modes3TypeScopeHint; +import modes3.run.Modes3UnitPropagationGenerator; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAttribute; @@ -175,29 +179,47 @@ public class Modes3ModelGenerator { it_1.minNewElements = this.modelSize; it_1.maxNewElements = this.modelSize; final Procedure1> _function_4 = (Map it_2) -> { - it_2.put(this.ecore2Logic.TypeofEClass(metamodelLogic.getTrace(), Modes3Package.eINSTANCE.getTurnout()), Integer.valueOf(1)); }; ObjectExtensions.>operator_doubleArrow( it_1.minNewElementsByType, _function_4); final Procedure1> _function_5 = (Map it_2) -> { it_2.put(this.ecore2Logic.TypeofEClass(metamodelLogic.getTrace(), Modes3Package.eINSTANCE.getTrain()), Integer.valueOf(5)); + it_2.put(this.ecore2Logic.TypeofEClass(metamodelLogic.getTrace(), Modes3Package.eINSTANCE.getTurnout()), Integer.valueOf(5)); }; ObjectExtensions.>operator_doubleArrow( it_1.maxNewElementsByType, _function_5); }; ObjectExtensions.operator_doubleArrow( it.typeScopes, _function_3); - it.solutionScope.numberOfRequiredSolutions = 1; + final Procedure1 _function_4 = (SolutionScope it_1) -> { + it_1.numberOfRequiredSolutions = 1; + }; + ObjectExtensions.operator_doubleArrow( + it.solutionScope, _function_4); + it.scopeWeight = 5; it.nameNewElements = false; it.typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis; - it.stateCoderStrategy = StateCoderStrategy.Neighbourhood; + it.stateCoderStrategy = StateCoderStrategy.PairwiseNeighbourhood; ScopePropagatorStrategy.Polyhedral _polyhedral = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp); it.scopePropagatorStrategy = _polyhedral; - it.debugConfiguration.partialInterpretatioVisualiser = null; + Ecore2Logic_Trace _trace = metamodelLogic.getTrace(); + Modes3TypeScopeHint _modes3TypeScopeHint = new Modes3TypeScopeHint(this.ecore2Logic, _trace); + it.hints.add(_modes3TypeScopeHint); + Ecore2Logic_Trace _trace_1 = metamodelLogic.getTrace(); + Modes3UnitPropagationGenerator _modes3UnitPropagationGenerator = new Modes3UnitPropagationGenerator(this.ecore2Logic, _trace_1); + it.unitPropagationPatternGenerators.add(_modes3UnitPropagationGenerator); + final Procedure1 _function_5 = (DebugConfiguration it_1) -> { + GraphvizVisualiser _graphvizVisualiser = new GraphvizVisualiser(); + it_1.partialInterpretatioVisualiser = _graphvizVisualiser; + }; + ObjectExtensions.operator_doubleArrow( + it.debugConfiguration, _function_5); + it.documentationLevel = DocumentationLevel.NORMAL; }; final ViatraReasonerConfiguration config = ObjectExtensions.operator_doubleArrow(_viatraReasonerConfiguration, _function_2); final FileSystemWorkspace workspace = new FileSystemWorkspace("output/", ""); + workspace.writeModel(logic.getOutput(), "problem.logicproblem"); final LogicResult solution = this.solver.solve(logic.getOutput(), config, workspace); URI _xifexpression = null; if ((solution instanceof ModelResult)) { @@ -226,27 +248,23 @@ public class Modes3ModelGenerator { boolean _lessThan = (_size_1 < 160); if (_lessThan) { if ((representation instanceof PartialInterpretation)) { - final Consumer _function_3 = (Type it) -> { - InputOutput.println(it.getName()); - }; - ((PartialInterpretation)representation).getProblem().getTypes().forEach(_function_3); - final Function1 _function_4 = (Type it) -> { + final Function1 _function_3 = (Type it) -> { String _name_2 = it.getName(); return Boolean.valueOf(Objects.equal(_name_2, "Modes3ModelRoot class DefinedPart")); }; - Type _findFirst = IterableExtensions.findFirst(((PartialInterpretation)representation).getProblem().getTypes(), _function_4); + Type _findFirst = IterableExtensions.findFirst(((PartialInterpretation)representation).getProblem().getTypes(), _function_3); final TypeDefinition rootType = ((TypeDefinition) _findFirst); - final Function1 _function_5 = (PartialComplexTypeInterpretation it) -> { + final Function1 _function_4 = (PartialComplexTypeInterpretation it) -> { String _name_2 = it.getInterpretationOf().getName(); return Boolean.valueOf(Objects.equal(_name_2, "Modes3ModelRoot class")); }; final PartialComplexTypeInterpretation rootIntepretation = IterableExtensions.findFirst(Iterables.filter(((PartialInterpretation)representation).getPartialtypeinterpratation(), - PartialComplexTypeInterpretation.class), _function_5); + PartialComplexTypeInterpretation.class), _function_4); rootIntepretation.getElements().removeAll(rootType.getElements()); ((PartialInterpretation)representation).getProblem().getElements().removeAll(rootType.getElements()); EList _partialrelationinterpretation = ((PartialInterpretation)representation).getPartialrelationinterpretation(); for (final PartialRelationInterpretation relationInterpretation : _partialrelationinterpretation) { - final Predicate _function_6 = (RelationLink link) -> { + final Predicate _function_5 = (RelationLink link) -> { boolean _xifexpression_1 = false; if ((link instanceof BinaryElementRelationLink)) { _xifexpression_1 = (rootType.getElements().contains(((BinaryElementRelationLink)link).getParam1()) || rootType.getElements().contains(((BinaryElementRelationLink)link).getParam2())); @@ -255,7 +273,7 @@ public class Modes3ModelGenerator { } return _xifexpression_1; }; - relationInterpretation.getRelationlinks().removeIf(_function_6); + relationInterpretation.getRelationlinks().removeIf(_function_5); } rootType.getElements().clear(); } @@ -349,13 +367,7 @@ public class Modes3ModelGenerator { Viatra2LogicAnnotationsPackage.eINSTANCE.getClass(); Map _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl(); - _extensionToFactoryMap.put("ecore", _xMIResourceFactoryImpl); - Map _extensionToFactoryMap_1 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl_1 = new XMIResourceFactoryImpl(); - _extensionToFactoryMap_1.put("logicproblem", _xMIResourceFactoryImpl_1); - Map _extensionToFactoryMap_2 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl_2 = new XMIResourceFactoryImpl(); - _xblockexpression = _extensionToFactoryMap_2.put("partialinterpretation", _xMIResourceFactoryImpl_2); + _xblockexpression = _extensionToFactoryMap.put("*", _xMIResourceFactoryImpl); } return _xblockexpression; } diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3TypeScopeHint.java b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3TypeScopeHint.java new file mode 100644 index 00000000..adb69760 --- /dev/null +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3TypeScopeHint.java @@ -0,0 +1,133 @@ +package modes3.run; + +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic; +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearBoundedExpression; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.RelationConstraintUpdater; +import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator; +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation; +import java.util.Iterator; +import java.util.Map; +import modes3.Modes3Package; +import modes3.queries.Adjacent; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Extension; + +@SuppressWarnings("all") +public class Modes3TypeScopeHint implements LinearTypeConstraintHint { + private static final String TURNOUT_NEIGHBOR_COUNT = "turnoutNeighborCount"; + + private final Type segmentType; + + private final Type turnoutType; + + public Modes3TypeScopeHint(@Extension final Ecore2Logic ecore2Logic, final Ecore2Logic_Trace ecore2LogicTrace) { + @Extension + final Modes3Package Modes3Package = modes3.Modes3Package.eINSTANCE; + this.segmentType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getSegment()); + this.turnoutType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getTurnout()); + } + + @Override + public CharSequence getAdditionalPatterns(@Extension final PatternGenerator patternGenerator, final Map fqnToPQuery) { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("\t"); + _builder.append("pattern "); + _builder.append(Modes3TypeScopeHint.TURNOUT_NEIGHBOR_COUNT, "\t"); + _builder.append("_helper(problem: LogicProblem, interpretation: PartialInterpretation, source: DefinedElement, target: DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("find interpretation(problem, interpretation);"); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("find mustExist(problem, interpretation, source);"); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("find mustExist(problem, interpretation, target);"); + _builder.newLine(); + _builder.append("\t\t"); + CharSequence _referInstanceOf = patternGenerator.getTypeIndexer().referInstanceOf(this.turnoutType, Modality.MUST, "source"); + _builder.append(_referInstanceOf, "\t\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + CharSequence _referInstanceOf_1 = patternGenerator.getTypeIndexer().referInstanceOf(this.segmentType, Modality.MUST, "target"); + _builder.append(_referInstanceOf_1, "\t\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + CharSequence _referPattern = patternGenerator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "source", "target" }, Modality.MUST, true, false); + _builder.append(_referPattern, "\t\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("\t"); + _builder.append("pattern "); + _builder.append(Modes3TypeScopeHint.TURNOUT_NEIGHBOR_COUNT, "\t"); + _builder.append("(problem: LogicProblem, interpretation: PartialInterpretation, element: DefinedElement, N) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("find interpretation(problem, interpretation);"); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("find mustExist(problem, interpretation, element);"); + _builder.newLine(); + _builder.append("\t\t"); + CharSequence _referInstanceOf_2 = patternGenerator.getTypeIndexer().referInstanceOf(this.turnoutType, Modality.MUST, "element"); + _builder.append(_referInstanceOf_2, "\t\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("N == count find "); + _builder.append(Modes3TypeScopeHint.TURNOUT_NEIGHBOR_COUNT, "\t\t"); + _builder.append("_helper(problem, interpretation, element, _);"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + return _builder; + } + + @Override + public RelationConstraintUpdater createConstraintUpdater(final LinearTypeExpressionBuilderFactory builderFactory) { + final ViatraQueryMatcher turnoutNeighborCountMatcher = builderFactory.createMatcher(Modes3TypeScopeHint.TURNOUT_NEIGHBOR_COUNT); + final LinearBoundedExpression newNeighbors = builderFactory.createBuilder().add(1, this.segmentType).build(); + final RelationConstraintUpdater _function = (PartialInterpretation partialInterpretation) -> { + final int requiredNeighbbors = Modes3TypeScopeHint.getRemainingCount(turnoutNeighborCountMatcher, partialInterpretation, 3); + newNeighbors.tightenLowerBound(Integer.valueOf(requiredNeighbbors)); + }; + return _function; + } + + private static int getRemainingCount(final ViatraQueryMatcher matcher, final PartialInterpretation partialInterpretation, final int capacity) { + int _xblockexpression = (int) 0; + { + final T partialMatch = matcher.newEmptyMatch(); + partialMatch.set(0, partialInterpretation.getProblem()); + partialMatch.set(1, partialInterpretation); + final Iterator iterator = matcher.streamAllMatches(partialMatch).iterator(); + int max = 0; + while (iterator.hasNext()) { + { + final T match = iterator.next(); + Object _get = match.get(3); + final int n = ((Integer) _get).intValue(); + if ((n < capacity)) { + final int required = (capacity - n); + if ((max < required)) { + max = required; + } + } + } + } + _xblockexpression = max; + } + return _xblockexpression; + } +} diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3UnitPropagationGenerator.java b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3UnitPropagationGenerator.java index 91adaaaa..5c5f82c5 100644 --- a/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3UnitPropagationGenerator.java +++ b/Domains/ca.mcgill.rtgmrt.example.modes3/xtend-gen/modes3/run/Modes3UnitPropagationGenerator.java @@ -10,9 +10,8 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropaga import java.util.Collections; import java.util.Map; import modes3.Modes3Package; -import modes3.queries.ExtraInputOfTurnout; +import modes3.queries.Adjacent; import modes3.queries.Output; -import modes3.queries.TurnoutOutput; import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; import org.eclipse.xtend2.lib.StringConcatenationClient; import org.eclipse.xtext.xbase.lib.CollectionLiterals; @@ -23,16 +22,20 @@ import org.eclipse.xtext.xbase.lib.Pair; public class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator { private static final String MUST_NOT_CONNECTED_TO = "mustNotConnectedTo"; - private static final String MUST_NOT_CONNECTED_TO_HELPER = "mustNotConnectedTo_helper"; - - private static final String MUST_NOT_TURNOUT_OUTPUT = "mustNotTurnoutOutput"; - private static final String MUST_NOT_STRAIGHT = "mustNotStraight"; private static final String MUST_NOT_DIVERGENT = "mustNotDivergent"; + private static final String MUST_CONNECTED_TO = "mustConnectedTo"; + + private static final String MUST_STRAIGHT = "mustStraight"; + + private static final String MUST_DIVERGENT = "mustDivergent"; + private final Type segmentType; + private final Type simpleSegmentType; + private final Type turnoutType; private final Relation connectedToRelation; @@ -45,6 +48,7 @@ public class Modes3UnitPropagationGenerator implements UnitPropagationPatternGen @Extension final Modes3Package Modes3Package = modes3.Modes3Package.eINSTANCE; this.segmentType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getSegment()); + this.simpleSegmentType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getSimpleSegment()); this.turnoutType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getTurnout()); this.connectedToRelation = ecore2Logic.relationOfReference(ecore2LogicTrace, Modes3Package.getSegment_ConnectedTo()); this.straightRelation = ecore2Logic.relationOfReference(ecore2LogicTrace, Modes3Package.getTurnout_Straight()); @@ -53,7 +57,10 @@ public class Modes3UnitPropagationGenerator implements UnitPropagationPatternGen @Override public Map getMustPatterns() { - return CollectionLiterals.emptyMap(); + Pair _mappedTo = Pair.of(this.connectedToRelation, Modes3UnitPropagationGenerator.MUST_CONNECTED_TO); + Pair _mappedTo_1 = Pair.of(this.straightRelation, Modes3UnitPropagationGenerator.MUST_STRAIGHT); + Pair _mappedTo_2 = Pair.of(this.divergentRelation, Modes3UnitPropagationGenerator.MUST_DIVERGENT); + return Collections.unmodifiableMap(CollectionLiterals.newHashMap(_mappedTo, _mappedTo_1, _mappedTo_2)); } @Override @@ -89,496 +96,1078 @@ public class Modes3UnitPropagationGenerator implements UnitPropagationPatternGen _builder.newLine(); } }; - final StringConcatenationClient commonParameterConstraints = _client_1; + final StringConcatenationClient commonMustParameterConstraints = _client_1; StringConcatenationClient _client_2 = new StringConcatenationClient() { @Override protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { - _builder.append("pattern "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER); - _builder.append("("); - _builder.append(parameters); - _builder.append(") {"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("// connectedToReflexive unit propagation"); - _builder.newLine(); - _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "source"); - _builder.append(_referInstanceOf, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf_1 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_1, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("source == target;"); + _builder.append("find interpretation(problem, interpretation);"); _builder.newLine(); - _builder.append("} or {"); + _builder.append("find mayExist(problem, interpretation, source);"); _builder.newLine(); - _builder.append("\t"); - _builder.append("// tooManyInputsOfSegment unit propagation"); + _builder.append("find mayExist(problem, interpretation, target);"); _builder.newLine(); - _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + } + }; + final StringConcatenationClient commonMayParameterConstraints = _client_2; + StringConcatenationClient _client_3 = new StringConcatenationClient() { + @Override + protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { + _builder.append("pattern mayInput("); + _builder.append(parameters); + _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_2 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_2, "\t"); + _builder.append(commonMayParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_3 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_3, "\t"); + CharSequence _referInstanceOf = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_4 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input1"); - _builder.append(_referInstanceOf_4, "\t"); + CharSequence _referPattern = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "target", "source" }, Modality.MAY, true, false); + _builder.append(_referPattern, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_5 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input2"); - _builder.append(_referInstanceOf_5, "\t"); + _builder.append("neg "); + CharSequence _referRelation = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "target", "source", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("neg "); - CharSequence _referInstanceOf_6 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); - _builder.append(_referInstanceOf_6, "\t"); + CharSequence _referRelation_1 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "target", "source", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_1, "\t"); _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern multipleMayInput(problem: LogicProblem, interpretation: PartialInterpretation,"); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("target: DefinedElement) {"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referPattern = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input1", "source" }, Modality.MUST, true, false); - _builder.append(_referPattern, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("find interpretation(problem, interpretation);"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referPattern_1 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input2", "source" }, Modality.MUST, true, false); - _builder.append(_referPattern_1, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("find mustExist(problem, interpretation, target);"); + _builder.newLine(); _builder.append("\t"); - _builder.append("input1 != input2;"); + _builder.append("find mayInput(problem, interpretaton, source1, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append("input1 != target;"); + _builder.append("find mayInput(problem, interpretaton, source2, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append("input2 != target;"); + _builder.append("neg find mustEquivalent(problem, interpretation, source1, source2);"); _builder.newLine(); - _builder.append("} or {"); + _builder.append("}"); _builder.newLine(); - _builder.append("\t"); - _builder.append("// turnoutConnectedToBothOutputs unit propagation 1"); + _builder.newLine(); + _builder.append("pattern multipleMayStraight(problem: LogicProblem, interpretation: PartialInterpretation,"); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("source: DefinedElement) {"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("find interpretation(problem, interpretation);"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referInstanceOf_7 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_7, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("find mustExist(problem, interpretation, source);"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referInstanceOf_8 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_8, "\t"); + CharSequence _referInstanceOf_1 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_1, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_9 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "divergent"); - _builder.append(_referInstanceOf_9, "\t"); + CharSequence _referRelation_2 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target1", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_2, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation, "\t"); + CharSequence _referRelation_3 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target2", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_3, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_1 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_1, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("neg find mustEquivalent(problem, interpretation, target1, target2);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern multipleMayDivergent(problem: LogicProblem, interpretation: PartialInterpretation,"); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("source: DefinedElement) {"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referRelation_2 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_2, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("} or {"); + _builder.append("find interpretation(problem, interpretation);"); _builder.newLine(); _builder.append("\t"); - _builder.append("// turnoutConnectedToBothOutputs unit propagation 2"); + _builder.append("find mustExist(problem, interpretation, source);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + CharSequence _referInstanceOf_2 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_2, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_10 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_10, "\t"); + CharSequence _referRelation_4 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target1", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_4, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_11 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_11, "\t"); + CharSequence _referRelation_5 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target2", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_5, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_12 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "straight"); - _builder.append(_referInstanceOf_12, "\t"); + _builder.append("neg find mustEquivalent(problem, interpretation, target1, target2);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern "); + _builder.append(Modes3UnitPropagationGenerator.MUST_CONNECTED_TO); + _builder.append("("); + _builder.append(parameters); + _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_3 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "straight", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_3, "\t"); + _builder.append(commonMustParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_4 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_4, "\t"); + CharSequence _referInstanceOf_3 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_3, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_5 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_5, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("} or {"); + _builder.append("find mayInput(problem, interpretaton, source, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); + _builder.append("neg find multipleMayInput(problem, interpretaton, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf_13 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_13, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf_14 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_14, "\t"); + CharSequence _referRelation_6 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_6, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_15 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); - _builder.append(_referInstanceOf_15, "\t"); + _builder.append("neg "); + CharSequence _referRelation_7 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_7, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referPattern_2 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(TurnoutOutput.instance().getFullyQualifiedName()), new String[] { "source", "target" }, Modality.MAY, false, false); - _builder.append(_referPattern_2, "\t"); + _builder.append("neg "); + CharSequence _referRelation_8 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_8, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referPattern_3 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); - _builder.append(_referPattern_3, "\t"); + _builder.append("neg "); + CharSequence _referRelation_9 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_9, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("target != extraInput;"); - _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO); + _builder.append(Modes3UnitPropagationGenerator.MUST_STRAIGHT); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("find "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER, "\t"); - _builder.append("(problem, interpretation, source, target);"); + _builder.append(commonMustParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("} or {"); - _builder.newLine(); _builder.append("\t"); - _builder.append("find "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER, "\t"); - _builder.append("(problem, interpretation, target, source);"); - _builder.newLineIfNotEmpty(); - _builder.append("}"); - _builder.newLine(); - _builder.newLine(); - _builder.append("pattern "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT); - _builder.append("("); - _builder.append(parameters); - _builder.append(") {"); + _builder.append("neg "); + CharSequence _referRelation_10 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "_", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_10, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("// outputReflexive unit propagation"); + _builder.append("neg find multipleMayStraight(problem, interpretation, source);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf_16 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_16, "\t"); + CharSequence _referRelation_11 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_11, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_17 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_17, "\t"); + _builder.append("neg "); + CharSequence _referRelation_12 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_12, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("source == target;"); - _builder.newLine(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); - _builder.append("// tooManyInputsOfSegment unit propagation"); - _builder.newLine(); - _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - CharSequence _referInstanceOf_18 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_18, "\t"); + _builder.append(commonMustParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_19 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_19, "\t"); + CharSequence _referInstanceOf_4 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_4, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_20 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input1"); - _builder.append(_referInstanceOf_20, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("find mayInput(problem, interpretaton, source, target);"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referInstanceOf_21 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input2"); - _builder.append(_referInstanceOf_21, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("neg find multipleMayInput(problem, interpretaton, target);"); + _builder.newLine(); _builder.append("\t"); _builder.append("neg "); - CharSequence _referInstanceOf_22 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "target"); - _builder.append(_referInstanceOf_22, "\t"); + CharSequence _referRelation_13 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_13, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referPattern_4 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input1", "target" }, Modality.MUST, true, false); - _builder.append(_referPattern_4, "\t"); + CharSequence _referRelation_14 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_14, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referPattern_5 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input2", "target" }, Modality.MUST, true, false); - _builder.append(_referPattern_5, "\t"); + _builder.append("neg "); + CharSequence _referRelation_15 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_15, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("input1 != input2;"); - _builder.newLine(); - _builder.append("\t"); - _builder.append("input1 != source;"); - _builder.newLine(); - _builder.append("\t"); - _builder.append("input2 != source;"); - _builder.newLine(); + _builder.append("neg "); + CharSequence _referRelation_16 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_16, "\t"); + _builder.newLineIfNotEmpty(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_STRAIGHT); + _builder.append(Modes3UnitPropagationGenerator.MUST_DIVERGENT); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("find "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT, "\t"); - _builder.append("(problem, interpretation, source, target);"); + _builder.append(commonMustParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("} or {"); - _builder.newLine(); _builder.append("\t"); - _builder.append("// turnoutOutputsAreSame unit propagation"); + _builder.append("neg "); + CharSequence _referRelation_17 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "_", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_17, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("neg find multipleMayDivergent(problem, interpretation, source);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + CharSequence _referRelation_18 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_18, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_23 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_23, "\t"); + _builder.append("neg "); + CharSequence _referRelation_19 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_19, "\t"); _builder.newLineIfNotEmpty(); + _builder.append("} or {"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referInstanceOf_24 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_24, "\t"); + _builder.append(commonMustParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_6 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_6, "\t"); + CharSequence _referInstanceOf_5 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_5, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("} or {"); + _builder.append("\t"); + _builder.append("find mayInput(problem, interpretaton, source, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append("// turnoutConnectedToBothOutputs unit propagation"); + _builder.append("neg find multipleMayInput(problem, interpretaton, target);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + _builder.append("neg "); + CharSequence _referRelation_20 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_20, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_25 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_25, "\t"); + _builder.append("neg "); + CharSequence _referRelation_21 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_21, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_26 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_26, "\t"); + CharSequence _referRelation_22 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MAY, fqnToPQuery); + _builder.append(_referRelation_22, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_27 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "divergent"); - _builder.append(_referInstanceOf_27, "\t"); + _builder.append("neg "); + CharSequence _referRelation_23 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_23, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutOutput_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", T : DefinedElement, S : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_7 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_7, "\t"); + _builder.append(commonMayParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_8 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_8, "\t"); + CharSequence _referInstanceOf_6 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_6, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_9 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_9, "\t"); + CharSequence _referInstanceOf_7 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_7, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("} or {"); - _builder.newLine(); _builder.append("\t"); - _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); + _builder.append("T == source;"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + _builder.append("S == target;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutOutput_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", T : DefinedElement, S : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_28 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_28, "\t"); + _builder.append(commonMayParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_29 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_29, "\t"); + CharSequence _referInstanceOf_8 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_8, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_30 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); - _builder.append(_referInstanceOf_30, "\t"); + CharSequence _referInstanceOf_9 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_9, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_31 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "potentialExtraInput"); - _builder.append(_referInstanceOf_31, "\t"); - _builder.newLineIfNotEmpty(); + _builder.append("T == source;"); + _builder.newLine(); _builder.append("\t"); - CharSequence _referPattern_6 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); - _builder.append(_referPattern_6, "\t"); + _builder.append("S == target;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern output_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_10 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_10, "\t"); + _builder.append(commonMayParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("neg "); - CharSequence _referRelation_11 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery); - _builder.append(_referRelation_11, "\t"); + CharSequence _referInstanceOf_10 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_10, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("extraInput != potentialExtraInput;"); - _builder.newLine(); + CharSequence _referInstanceOf_11 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_11, "\t"); + _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("extraInput != target;"); + _builder.append("S1 == source;"); _builder.newLine(); _builder.append("\t"); - _builder.append("potentialExtraInput != target;"); + _builder.append("S2 == target;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); - _builder.append("pattern "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_DIVERGENT); - _builder.append("("); + _builder.append("pattern output_must_to_true_by_straight("); _builder.append(parameters); - _builder.append(") {"); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("find "); - _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT, "\t"); - _builder.append("(problem, interpretation, source, target);"); - _builder.newLineIfNotEmpty(); - _builder.append("} or {"); + _builder.append("find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S1, S2);"); _builder.newLine(); - _builder.append("\t"); - _builder.append("// turnoutOutputsAreSame unit propagation"); + _builder.append("}"); _builder.newLine(); - _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + _builder.newLine(); + _builder.append("pattern output_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_32 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); - _builder.append(_referInstanceOf_32, "\t"); + _builder.append("find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern adjacent_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_33 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); - _builder.append(_referInstanceOf_33, "\t"); + _builder.append("find output_must_to_true_by_connectedTo(problem, interpretation, source, target, S1, S2);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern adjacent_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_12 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_12, "\t"); + _builder.append("find output_must_to_true_by_straight(problem, interpretation, source, target, S1, S2);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S2, S1);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern adjacent_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", S1 : DefinedElement, S2 : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find output_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S2, S1);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern connectedToReflexive_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", S : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, source);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_12 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "source"); + _builder.append(_referInstanceOf_12, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("S == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("S == target;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern outputReflexive_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, T, T);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern outputReflexive_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, T, T);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutOutputsAreSame_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_13 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_13, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_14 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_14, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("S == target;"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referRelation_24 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "T", "S", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_24, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutOutputsAreSame_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_15 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_15, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_16 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_16, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("S == target;"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referRelation_25 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "T", "S", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_25, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfSegment_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", S : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_17 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.simpleSegmentType, Modality.MUST, "S"); + _builder.append(_referInstanceOf_17, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find output_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_1 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_1, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referPattern_2 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_2, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I3;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfSegment_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", S : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_18 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.simpleSegmentType, Modality.MUST, "S"); + _builder.append(_referInstanceOf_18, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find output_must_to_true_by_straight(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_3 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_3, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referPattern_4 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_4, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I3;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfSegment_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", S : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_19 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.simpleSegmentType, Modality.MUST, "S"); + _builder.append(_referInstanceOf_19, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find output_must_to_true_by_divergent(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_5 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_5, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referPattern_6 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_6, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I3;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutConnectedToBothOutputs_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Straight);"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Divergent);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_20 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_20, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_21 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_21, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_22 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Straight"); + _builder.append(_referInstanceOf_22, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_23 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Divergent"); + _builder.append(_referInstanceOf_23, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_26 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_26, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_27 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_27, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("Straight == target;"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referRelation_28 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_28, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); - _builder.append("// turnoutConnectedToBothOutputs unit propagation"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Straight);"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Divergent);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_24 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_24, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_25 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_25, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_26 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Straight"); + _builder.append(_referInstanceOf_26, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_27 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Divergent"); + _builder.append(_referInstanceOf_27, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_29 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_29, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_30 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_30, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_31 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_31, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("Straight == target;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutConnectedToBothOutputs_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Straight);"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Divergent);"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + CharSequence _referInstanceOf_28 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_28, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_29 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_29, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_30 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Straight"); + _builder.append(_referInstanceOf_30, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_34 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); + CharSequence _referInstanceOf_31 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Divergent"); + _builder.append(_referInstanceOf_31, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("Straight == target;"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referRelation_32 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_32, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_33 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_33, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_34 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_34, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern turnoutConnectedToBothOutputs_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(commonMayParameterConstraints, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Straight);"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, Divergent);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_32 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); + _builder.append(_referInstanceOf_32, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_33 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MAY, "target"); + _builder.append(_referInstanceOf_33, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referInstanceOf_34 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Straight"); _builder.append(_referInstanceOf_34, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_35 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); + CharSequence _referInstanceOf_35 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "Divergent"); _builder.append(_referInstanceOf_35, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_36 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "straight"); + CharSequence _referRelation_35 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_35, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("T == source;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("Divergent == target;"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referRelation_36 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_36, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referRelation_37 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery); + _builder.append(_referRelation_37, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfTurnout_must_to_true_by_connectedTo("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_36 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "S"); _builder.append(_referInstanceOf_36, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_13 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_13, "\t"); + _builder.append("find adjacent_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_7 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_7, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_14 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "straight", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_14, "\t"); + CharSequence _referPattern_8 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_8, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_15 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_15, "\t"); + CharSequence _referPattern_9 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I4", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_9, "\t"); _builder.newLineIfNotEmpty(); - _builder.append("} or {"); + _builder.append("\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I4;"); _builder.newLine(); _builder.append("\t"); - _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); + _builder.append("I2 != I3;"); _builder.newLine(); _builder.append("\t"); - _builder.append(commonParameterConstraints, "\t"); + _builder.append("I2 != I4;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I3 != I4;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfTurnout_must_to_true_by_straight("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_37 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_37 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "S"); _builder.append(_referInstanceOf_37, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_38 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); + _builder.append("find adjacent_must_to_true_by_straight(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_10 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_10, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referPattern_11 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_11, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + CharSequence _referPattern_12 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I4", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_12, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I4;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I4;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I3 != I4;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern tooManyInputsOfTurnout_must_to_true_by_divergent("); + _builder.append(parameters); + _builder.append(", T : DefinedElement) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find mustExist(problem, interpretation, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referInstanceOf_38 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "S"); _builder.append(_referInstanceOf_38, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_39 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); - _builder.append(_referInstanceOf_39, "\t"); + _builder.append("find adjacent_must_to_true_by_divergent(problem, interpretation, source, target, I1, S);"); + _builder.newLine(); + _builder.append("\t"); + CharSequence _referPattern_13 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I2", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_13, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referInstanceOf_40 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "potentialExtraInput"); - _builder.append(_referInstanceOf_40, "\t"); + CharSequence _referPattern_14 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I3", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_14, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referPattern_7 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); - _builder.append(_referPattern_7, "\t"); + CharSequence _referPattern_15 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Adjacent.instance().getFullyQualifiedName()), new String[] { "I4", "S" }, Modality.MUST, true, false); + _builder.append(_referPattern_15, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - CharSequence _referRelation_16 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery); - _builder.append(_referRelation_16, "\t"); + _builder.append("I1 != I2;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I1 != I4;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I3;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I2 != I4;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("I3 != I4;"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO); + _builder.append("_helper("); + _builder.append(parameters); + _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("neg "); - CharSequence _referRelation_17 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery); - _builder.append(_referRelation_17, "\t"); + _builder.append("find connectedToReflexive_must_to_true_by_connectedTo(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find tooManyInputsOfSegment_must_to_true_by_connectedTo(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutConnectedToBothOutputs_must_to_true_by_connectedTo(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find tooManyInputsOfTurnout_must_to_true_by_connectedTo(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO); + _builder.append("("); + _builder.append(parameters); + _builder.append(") {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO, "\t"); + _builder.append("_helper(problem, interpretation, source, target);"); + _builder.newLineIfNotEmpty(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO, "\t"); + _builder.append("_helper(problem, interpretation, target, source);"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_STRAIGHT); + _builder.append("("); + _builder.append(parameters); + _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("extraInput != potentialExtraInput;"); + _builder.append("find outputReflexive_must_to_true_by_straight(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutOutputsAreSame_must_to_true_by_straight(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find tooManyInputsOfSegment_must_to_true_by_straight(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); - _builder.append("extraInput != target;"); + _builder.append("find turnoutConnectedToBothOutputs_must_to_true_by_straight(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find tooManyInputsOfTurnout_must_to_true_by_straight(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("pattern "); + _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_DIVERGENT); + _builder.append("("); + _builder.append(parameters); + _builder.append(") {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("find outputReflexive_must_to_true_by_divergent(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutOutputsAreSame_must_to_true_by_divergent(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find tooManyInputsOfSegment_must_to_true_by_divergent(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("find turnoutConnectedToBothOutputs_must_to_true_by_divergent(problem, interpretation, source, target, _);"); + _builder.newLine(); + _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); - _builder.append("potentialExtraInput != target;"); + _builder.append("find tooManyInputsOfTurnout_must_to_true_by_divergent(problem, interpretation, source, target, _);"); _builder.newLine(); _builder.append("}"); _builder.newLine(); } }; - _xblockexpression = _client_2; + _xblockexpression = _client_3; } return _xblockexpression; } diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml index 331e2b61..d4ab204e 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml @@ -39,72 +39,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 431ae386..3bcd9116 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 @@ -49,6 +49,12 @@ class ModelGenerationStatistics { synchronized def addScopePropagationTime(long amount) { scopePropagationTime += amount } + + public var long mustRelationPropagationTime = 0 + + synchronized def addMustRelationPropagationTime(long amount) { + mustRelationPropagationTime += amount + } public var long preliminaryTypeAnalisisTime = 0 @@ -133,9 +139,11 @@ class ModelGenerationMethodProvider { val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints + val unitRulePropagator = refinementRuleProvider.createUnitPrulePropagator(logicProblem, emptySolution, + queries, scopePropagator, statistics) val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(logicProblem, emptySolution, - queries, scopePropagator, nameNewElements, statistics) - val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, + queries, unitRulePropagator, nameNewElements, statistics) + val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, unitRulePropagator, statistics) val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem, queries, @@ -158,7 +166,7 @@ class ModelGenerationMethodProvider { val currentUnitPropagationPreconditions = queries.getCurrentUnitPropagationPreconditionPatterns val queriesToPrepare = ImmutableSet.builder.addAll(queries.refineObjectQueries.values).addAll( - queries.refineTypeQueries.values).addAll(queries.refinerelationQueries.values).addAll(queries. + queries.refineTypeQueries.values).addAll(queries.refineRelationQueries.values).addAll(queries. multiplicityConstraintQueries.values.flatMap[allQueries]).addAll(queries.unfinishedWFQueries.values).addAll( queries.invalidWFQueries.values).addAll(queries.mustUnitPropagationPreconditionPatterns.values).addAll( queries.currentUnitPropagationPreconditionPatterns.values).add(queries.hasElementInContainmentQuery).build diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend index 8c21ca1d..31f98e36 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/LinearTypeConstraintHint.xtend @@ -3,8 +3,10 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.util.Map import org.eclipse.viatra.query.runtime.api.IPatternMatch import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery interface LinearTypeExpressionBuilderFactory { def ViatraQueryMatcher createMatcher(String queryName) @@ -24,7 +26,7 @@ interface RelationConstraintUpdater { } interface LinearTypeConstraintHint { - def CharSequence getAdditionalPatterns(PatternGenerator patternGenerator) + def CharSequence getAdditionalPatterns(PatternGenerator patternGenerator, Map fqnToPQuery) def RelationConstraintUpdater createConstraintUpdater(LinearTypeExpressionBuilderFactory builderFactory) } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 93b83577..cacba3c6 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -19,6 +19,8 @@ class ScopePropagator { val Map type2Scope @Accessors(PROTECTED_GETTER) val Map> superScopes @Accessors(PROTECTED_GETTER) val Map> subScopes + + @Accessors(PUBLIC_GETTER) var scopePropagationNeeded = false new(PartialInterpretation p, ModelGenerationStatistics statistics) { partialInterpretation = p @@ -64,7 +66,8 @@ class ScopePropagator { copyScopeBoundsToHeuristic() } - def propagateAllScopeConstraints() { + def void propagateAllScopeConstraints() { + scopePropagationNeeded = false if (!valid) { return } @@ -93,6 +96,7 @@ class ScopePropagator { if (isPrimitive) { return } + scopePropagationNeeded = true // println('''Adding to «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') val targetScope = type2Scope.get(t) if (targetScope !== null) { @@ -117,6 +121,12 @@ class ScopePropagator { // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') } + + def addedToRelation(Relation r) { + if (isPropagationNeededAfterAdditionToRelation(r)) { + scopePropagationNeeded = true + } + } protected def setScopesInvalid() { partialInterpretation.minNewElements = Integer.MAX_VALUE @@ -127,7 +137,7 @@ class ScopePropagator { } } - def isPropagationNeededAfterAdditionToRelation(Relation r) { + protected def isPropagationNeededAfterAdditionToRelation(Relation r) { false } 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 a3efcf76..edf92343 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 @@ -369,13 +369,13 @@ class PatternGenerator { ////////// // 4.3 Relation refinement ////////// - «relationRefinementGenerator.generateRefineReference(problem)» + «relationRefinementGenerator.generateRefineReference(problem, unitPropagationPatternGenerators)» ////////// // 5 Hints ////////// «FOR hint : hints» - «hint.getAdditionalPatterns(this)» + «hint.getAdditionalPatterns(this, fqn2PQuery)» «ENDFOR» «FOR generator : unitPropagationPatternGenerators» «generator.getAdditionalPatterns(this, fqn2PQuery)» 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 21fd1989..2e786286 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 @@ -38,7 +38,8 @@ import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* public IQuerySpecification> hasElementInContainmentQuery public Map>> refineObjectQueries public Map>> refineTypeQueries - public Map, IQuerySpecification>> refinerelationQueries + public Map, IQuerySpecification>> refineRelationQueries + public Map, IQuerySpecification>> mustRelationPropagationQueries public Map>> mustUnitPropagationPreconditionPatterns public Map>> currentUnitPropagationPreconditionPatterns public Map modalRelationQueries @@ -70,7 +71,6 @@ class UnifinishedMultiplicityQueries { } class PatternProvider { - val TypeAnalysis typeAnalysis = new TypeAnalysis def generateQueries(LogicProblem problem, PartialInterpretation emptySolution, ModelGenerationStatistics statistics, @@ -98,7 +98,8 @@ class PatternProvider { val generatedQueries = parseUtil.parse(patternGeneratorResult.patternText) val runtimeQueries = calclulateRuntimeQueries(patternGenerator, problem, emptySolution, typeAnalysisResult, patternGeneratorResult.constraint2MustPreconditionName, - patternGeneratorResult.constraint2CurrentPreconditionName, relationConstraints, generatedQueries) + patternGeneratorResult.constraint2CurrentPreconditionName, relationConstraints, + unitPropagationPatternGenerators, generatedQueries) return runtimeQueries } @@ -110,6 +111,7 @@ class PatternProvider { HashMap mustUnitPropagationTrace, HashMap currentUnitPropagationTrace, RelationConstraints relationConstraints, + Collection unitPropagationPatternGenerators, Map>> queries ) { val Map>> invalidWFQueries = patternGenerator. @@ -136,6 +138,8 @@ class PatternProvider { ] val Map, IQuerySpecification>> refineRelationQueries = patternGenerator. relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)] + val Map, IQuerySpecification>> mustRelationPropagationQueries = patternGenerator. + relationRefinementGenerator.getMustPropagationQueries(problem, unitPropagationPatternGenerators).mapValues[it.lookup(queries)] val Map>> mustUnitPropagationPreconditionPatterns = mustUnitPropagationTrace. mapValues[it.lookup(queries)] val Map>> currentUnitPropagationPreconditionPatterns = currentUnitPropagationTrace. @@ -158,6 +162,7 @@ class PatternProvider { refineObjectsQueries, refineTypeQueries, refineRelationQueries, + mustRelationPropagationQueries, mustUnitPropagationPreconditionPatterns, currentUnitPropagationPreconditionPatterns, modalRelationQueries, 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 29d3eb61..23ba3cad 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 @@ -113,7 +113,7 @@ class RelationDeclarationIndexer { // 2. Circle in the containment hierarchy neg «base.containmentIndexer.referTransitiveMustContains("source","target")» «ENDIF» - «IF mustNotRelations.empty» + «IF !mustNotRelations.empty» // ![] unit propagation relations «FOR mustNotRelation : mustNotRelations» neg find «mustNotRelation»(problem, interpretation, source, target); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index 783cd36b..6f5f2402 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend @@ -1,10 +1,17 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns +import com.google.common.collect.ImmutableList +import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableSet 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.LinkedList +import java.util.Map +import java.util.Set +import org.eclipse.xtend2.lib.StringConcatenationClient class RelationRefinementGenerator { PatternGenerator base; @@ -13,53 +20,61 @@ class RelationRefinementGenerator { this.base = base } - def CharSequence generateRefineReference(LogicProblem p) ''' - «FOR relationRefinement : this.getRelationRefinements(p)» - pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( - problem:LogicProblem, interpretation:PartialInterpretation, - relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value !== null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», - from: DefinedElement, to: DefinedElement) - { - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); - «IF relationRefinement.value !== null» - PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); - PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); + def CharSequence generateRefineReference(LogicProblem p, + Collection unitPropagationPatternGenerators) { + val mustRelations = getMustRelations(unitPropagationPatternGenerators) + + ''' + «FOR relationRefinement : this.getRelationRefinements(p)» + pattern «relationRefinementQueryName(relationRefinement.key,relationRefinement.value)»( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value !== null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», + from: DefinedElement, to: DefinedElement) + { + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«relationRefinement.key.name»"); + «IF relationRefinement.value !== null» + PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); + PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"«relationRefinement.value.name»"); + «ENDIF» + find mustExist(problem, interpretation, from); + find mustExist(problem, interpretation, to); + «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» + «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» + «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» + neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» + } + + «IF isMustPropagationQueryNeeded(relationRefinement.key, relationRefinement.value, mustRelations)» + pattern «mustPropagationQueryName(relationRefinement.key)»( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation«IF relationRefinement.value !== null», oppositeInterpretation:PartialRelationInterpretation«ENDIF», + from: DefinedElement, to: DefinedElement) + «FOR body : getMustPropagationBodies(relationRefinement.key, relationRefinement.value, mustRelations) SEPARATOR " or "» + { + «referRefinementQuery(relationRefinement.key, relationRefinement.value, "relationIterpretation", "oppositeInterpretation", "from", "to")» + «body» + } + «ENDFOR» «ENDIF» - find mustExist(problem, interpretation, from); - find mustExist(problem, interpretation, to); - «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(0), Modality::MUST,"from")» - «base.typeIndexer.referInstanceOfByReference(relationRefinement.key.parameters.get(1), Modality::MUST,"to")» - «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MAY)» - neg «base.relationDeclarationIndexer.referRelation(relationRefinement.key,"from","to",Modality.MUST)» - } - «ENDFOR» - ''' + «ENDFOR» + ''' + } def String relationRefinementQueryName(RelationDeclaration relation, Relation inverseRelation) { '''«IF inverseRelation !== null»refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelation.name)»«ELSE»refineRelation_«base.canonizeName(relation.name)»«ENDIF»''' } + def String mustPropagationQueryName(RelationDeclaration relation) { + '''mustPropagation_«base.canonizeName(relation.name)»''' + } + def referRefinementQuery(RelationDeclaration relation, Relation inverseRelation, String relInterpretationName, String inverseInterpretationName, String sourceName, String targetName) '''find «this.relationRefinementQueryName(relation,inverseRelation)»(problem, interpretation, «relInterpretationName», «IF inverseRelation !== null»«inverseInterpretationName», «ENDIF»«sourceName», «targetName»);''' def getRefineRelationQueries(LogicProblem p) { -// val containmentRelations = p.containmentHierarchies.map[containmentRelations].flatten.toSet -// p.relations.filter(RelationDeclaration).filter[!containmentRelations.contains(it)].toInvertedMap['''refineRelation_«base.canonizeName(it.name)»'''] - /* - * val res = new LinkedHashMap - * for(relation: getRelationRefinements(p)) { - * if(inverseRelations.containsKey(relation)) { - * val name = '''refineRelation_«base.canonizeName(relation.name)»_and_«base.canonizeName(inverseRelations.get(relation).name)»''' - * res.put(relation -> inverseRelations.get(relation),name) - * } else { - * val name = '''refineRelation_«base.canonizeName(relation.name)»''' - * res.put(relation -> null,name) - * } - * } - return res*/ getRelationRefinements(p).toInvertedMap[relationRefinementQueryName(it.key, it.value)] } @@ -83,4 +98,54 @@ class RelationRefinementGenerator { } return list } + + def getMustPropagationQueries(LogicProblem p, + Collection unitPropagationPatternGenerators) { + val refinements = getRelationRefinements(p) + val mustRelations = getMustRelations(unitPropagationPatternGenerators) + refinements.filter[isMustPropagationQueryNeeded(key, value, mustRelations)].toInvertedMap [ + mustPropagationQueryName(key) + ] + } + + private def getMustRelations(Collection unitPropagationPatternGenerators) { + ImmutableMap.copyOf(unitPropagationPatternGenerators.flatMap[mustPatterns.entrySet].groupBy[key].mapValues [ + ImmutableSet.copyOf(map[value]) + ]) + } + + private def isMustPropagationQueryNeeded(Relation relation, Relation inverseRelation, + Map> mustRelations) { + val mustSet = mustRelations.get(relation) + if (mustSet !== null && !mustSet.empty) { + return true + } + if (inverseRelation !== null) { + val inverseMustSet = mustRelations.get(inverseRelation) + if (inverseMustSet !== null && !inverseMustSet.empty) { + return true + } + } + false + } + + private def getMustPropagationBodies(Relation relation, Relation inverseRelation, + Map> mustRelations) { + val builder = ImmutableList.builder() + val mustSet = mustRelations.get(relation) + if (mustSet !== null) { + for (refinementQuery : mustSet) { + builder.add('''find «refinementQuery»(problem, interpretation, from, to);''') + } + } + if (inverseRelation !== null && inverseRelation != relation) { + val inverseMustSet = mustRelations.get(inverseRelation) + if (inverseMustSet !== null) { + for (refinementQuery : inverseMustSet) { + builder.add('''find «refinementQuery»(problem, interpretation, to, from);''') + } + } + } + builder.build + } } 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 699b095d..dca10baf 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 @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules +import com.google.common.collect.ImmutableList import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference @@ -29,12 +30,14 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationFactory import java.lang.reflect.Field import java.util.HashMap +import java.util.Iterator import java.util.LinkedHashMap import java.util.LinkedList import java.util.List import java.util.Map import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine import org.eclipse.viatra.query.runtime.api.GenericPatternMatch +import org.eclipse.viatra.query.runtime.api.IPatternMatch import org.eclipse.viatra.query.runtime.api.IQuerySpecification import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher @@ -43,6 +46,7 @@ import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactory import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRuleFactory import org.eclipse.xtend.lib.annotations.Data +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor import org.eclipse.xtext.xbase.lib.Functions.Function0 class RefinementRuleProvider { @@ -50,57 +54,55 @@ class RefinementRuleProvider { val extension PartialinterpretationFactory factory2 = PartialinterpretationFactory.eINSTANCE val extension LogiclanguageFactory factory3 = LogiclanguageFactory.eINSTANCE - var AdvancedViatraQueryEngine queryEngine - var Field delayMessageDelivery - def canonizeName(String name) { return name.replace(' ', '_') } + def createUnitPrulePropagator(LogicProblem p, PartialInterpretation i, GeneratedPatterns patterns, + ScopePropagator scopePropagator, ModelGenerationStatistics statistics) { + new UnitRulePropagator(p, i, this, scopePropagator, patterns.mustRelationPropagationQueries, statistics) + } + def LinkedHashMap>> createObjectRefinementRules( LogicProblem p, PartialInterpretation i, GeneratedPatterns patterns, - ScopePropagator scopePropagator, + UnitRulePropagator unitRulePropagator, boolean nameNewElement, ModelGenerationStatistics statistics ) { val res = new LinkedHashMap val recursiveObjectCreation = recursiveObjectCreation(p, i) - queryEngine = ViatraQueryEngine.on(new EMFScope(i)) as AdvancedViatraQueryEngine - delayMessageDelivery = queryEngine.class.getDeclaredField("delayMessageDelivery") - delayMessageDelivery.accessible = true for (LHSEntry : patterns.refineObjectQueries.entrySet) { val containmentRelation = LHSEntry.key.containmentRelation val inverseRelation = LHSEntry.key.inverseContainment val type = LHSEntry.key.newType val lhs = LHSEntry.value as IQuerySpecification> val rule = createObjectCreationRule(p, containmentRelation, inverseRelation, type, - recursiveObjectCreation.get(type), lhs, nameNewElement, scopePropagator, statistics) + recursiveObjectCreation.get(type), lhs, nameNewElement, unitRulePropagator, statistics) res.put(LHSEntry.key, rule) } return res } def private createObjectCreationRule(LogicProblem p, Relation containmentRelation, Relation inverseRelation, - Type type, List recursiceObjectCreations, + Type type, List recursiveObjectCreations, IQuerySpecification> lhs, boolean nameNewElement, - ScopePropagator scopePropagator, ModelGenerationStatistics statistics) { + UnitRulePropagator unitRulePropagator, ModelGenerationStatistics statistics) { val name = '''addObject_«type.name.canonizeName»«IF containmentRelation!==null»_by_«containmentRelation.name.canonizeName»«ENDIF»''' val ruleBuilder = factory.createRule(lhs).name(name) if (containmentRelation !== null) { if (inverseRelation !== null) { ruleBuilder.action [ match | statistics.incrementTransformationCount -// println(name) +// println(name) + val startTime = System.nanoTime // val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation val inverseRelationInterpretation = match.get(3) as PartialRelationInterpretation val typeInterpretation = match.get(4) as PartialComplexTypeInterpretation val container = match.get(5) as DefinedElement - - val startTime = System.nanoTime createObjectActionWithContainmentAndInverse( nameNewElement, interpretation, @@ -109,29 +111,24 @@ class RefinementRuleProvider { relationInterpretation, inverseRelationInterpretation, [createDefinedElement], - recursiceObjectCreations, - scopePropagator + recursiveObjectCreations, + unitRulePropagator ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine(scopePropagator) - - // Scope propagation - val propagatorStartTime = System.nanoTime - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) + unitRulePropagator.propagate ] } else { ruleBuilder.action [ match | statistics.incrementTransformationCount // println(name) + val startTime = System.nanoTime // val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val relationInterpretation = match.get(2) as PartialRelationInterpretation val typeInterpretation = match.get(3) as PartialComplexTypeInterpretation val container = match.get(4) as DefinedElement - val startTime = System.nanoTime createObjectActionWithContainment( nameNewElement, interpretation, @@ -139,44 +136,34 @@ class RefinementRuleProvider { container, relationInterpretation, [createDefinedElement], - recursiceObjectCreations, - scopePropagator + recursiveObjectCreations, + unitRulePropagator ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine(scopePropagator) - - // Scope propagation - val propagatorStartTime = System.nanoTime - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) + unitRulePropagator.propagate ] } } else { ruleBuilder.action [ match | statistics.incrementTransformationCount // println(name) + val startTime = System.nanoTime // val problem = match.get(0) as LogicProblem val interpretation = match.get(1) as PartialInterpretation val typeInterpretation = match.get(2) as PartialComplexTypeInterpretation - val startTime = System.nanoTime createObjectAction( nameNewElement, interpretation, typeInterpretation, [createDefinedElement], - recursiceObjectCreations, - scopePropagator + recursiveObjectCreations, + unitRulePropagator ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine(scopePropagator) - - // Scope propagation - val propagatorStartTime = System.nanoTime - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) + unitRulePropagator.propagate ] } return ruleBuilder.build @@ -342,14 +329,14 @@ class RefinementRuleProvider { [createStringElement] } - def createRelationRefinementRules(GeneratedPatterns patterns, ScopePropagator scopePropagator, + def createRelationRefinementRules(GeneratedPatterns patterns, UnitRulePropagator unitRulePropagator, ModelGenerationStatistics statistics) { val res = new LinkedHashMap - for (LHSEntry : patterns.refinerelationQueries.entrySet) { + for (LHSEntry : patterns.refineRelationQueries.entrySet) { val declaration = LHSEntry.key.key val inverseReference = LHSEntry.key.value val lhs = LHSEntry.value as IQuerySpecification> - val rule = createRelationRefinementRule(declaration, inverseReference, lhs, scopePropagator, statistics) + val rule = createRelationRefinementRule(declaration, inverseReference, lhs, unitRulePropagator, statistics) res.put(LHSEntry.key, rule) } return res @@ -357,57 +344,29 @@ class RefinementRuleProvider { def private BatchTransformationRule> createRelationRefinementRule( RelationDeclaration declaration, Relation inverseRelation, - IQuerySpecification> lhs, ScopePropagator scopePropagator, + IQuerySpecification> lhs, UnitRulePropagator unitRulePropagator, ModelGenerationStatistics statistics) { val name = '''addRelation_«declaration.name.canonizeName»«IF inverseRelation !== null»_and_«inverseRelation.name.canonizeName»«ENDIF»''' val ruleBuilder = factory.createRule(lhs).name(name) if (inverseRelation === null) { ruleBuilder.action [ match | statistics.incrementTransformationCount - // println(name) - // val problem = match.get(0) as LogicProblem - // val interpretation = match.get(1) as PartialInterpretation - val relationInterpretation = match.get(2) as PartialRelationInterpretation - val src = match.get(3) as DefinedElement - val trg = match.get(4) as DefinedElement - val startTime = System.nanoTime - createRelationLinkAction(src, trg, relationInterpretation) + createRelationLinkAction(match, unitRulePropagator) statistics.addExecutionTime(System.nanoTime - startTime) - // Scope propagation - if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { - flushQueryEngine(scopePropagator) - - val propagatorStartTime = System.nanoTime - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) - } + unitRulePropagator.propagate ] } else { ruleBuilder.action [ match | statistics.incrementTransformationCount // println(name) - // val problem = match.get(0) as LogicProblem - // val interpretation = match.get(1) as PartialInterpretation - val relationInterpretation = match.get(2) as PartialRelationInterpretation - val inverseInterpretation = match.get(3) as PartialRelationInterpretation - val src = match.get(4) as DefinedElement - val trg = match.get(5) as DefinedElement - val startTime = System.nanoTime - createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation) + createRelationLinkWithInverse(match, unitRulePropagator) statistics.addExecutionTime(System.nanoTime - startTime) - // Scope propagation - if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { - flushQueryEngine(scopePropagator) - - val propagatorStartTime = System.nanoTime - scopePropagator.propagateAllScopeConstraints() - statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) - } + unitRulePropagator.propagate ] } @@ -418,7 +377,7 @@ class RefinementRuleProvider { // Actions // /////////////////////// protected def void createObjectAction(boolean nameNewElement, ObjectCreationInterpretationData data, - DefinedElement container, ScopePropagator scopePropagator) { + DefinedElement container, UnitRulePropagator unitRulePropagator) { if (data.containerInterpretation !== null) { if (data.containerInverseInterpretation !== null) { createObjectActionWithContainmentAndInverse( @@ -430,7 +389,7 @@ class RefinementRuleProvider { data.containerInverseInterpretation, data.constructor, data.recursiveConstructors, - scopePropagator + unitRulePropagator ) } else { createObjectActionWithContainment( @@ -441,7 +400,7 @@ class RefinementRuleProvider { data.containerInterpretation, data.constructor, data.recursiveConstructors, - scopePropagator + unitRulePropagator ) } } else { @@ -451,7 +410,7 @@ class RefinementRuleProvider { data.typeInterpretation, data.constructor, data.recursiveConstructors, - scopePropagator + unitRulePropagator ) } @@ -466,7 +425,7 @@ class RefinementRuleProvider { PartialRelationInterpretation inverseRelationInterpretation, Function0 constructor, List recursiceObjectCreations, - ScopePropagator scopePropagator + UnitRulePropagator unitRulePropagator ) { val newElement = constructor.apply if (nameNewElement) { @@ -486,14 +445,16 @@ class RefinementRuleProvider { inverseRelationInterpretation.relationlinks += newLink2 // Scope propagation - scopePropagator.decrementTypeScope(typeInterpretation) + unitRulePropagator.decrementTypeScope(typeInterpretation) + unitRulePropagator.addedToRelation(relationInterpretation.interpretationOf) + unitRulePropagator.addedToRelation(inverseRelationInterpretation.interpretationOf) // Existence interpretation.newElements += newElement // Do recursive object creation for (newConstructor : recursiceObjectCreations) { - createObjectAction(nameNewElement, newConstructor, newElement, scopePropagator) + createObjectAction(nameNewElement, newConstructor, newElement, unitRulePropagator) } return newElement @@ -507,7 +468,7 @@ class RefinementRuleProvider { PartialRelationInterpretation relationInterpretation, Function0 constructor, List recursiceObjectCreations, - ScopePropagator scopePropagator + UnitRulePropagator unitRulePropagator ) { val newElement = constructor.apply if (nameNewElement) { @@ -522,16 +483,17 @@ class RefinementRuleProvider { // ContainmentRelation val newLink = factory2.createBinaryElementRelationLink => [it.param1 = container it.param2 = newElement] relationInterpretation.relationlinks += newLink + unitRulePropagator.addedToRelation(relationInterpretation.interpretationOf) // Scope propagation - scopePropagator.decrementTypeScope(typeInterpretation) + unitRulePropagator.decrementTypeScope(typeInterpretation) // Existence interpretation.newElements += newElement // Do recursive object creation for (newConstructor : recursiceObjectCreations) { - createObjectAction(nameNewElement, newConstructor, newElement, scopePropagator) + createObjectAction(nameNewElement, newConstructor, newElement, unitRulePropagator) } return newElement @@ -539,7 +501,7 @@ class RefinementRuleProvider { protected def createObjectAction(boolean nameNewElement, PartialInterpretation interpretation, PartialTypeInterpratation typeInterpretation, Function0 constructor, - List recursiceObjectCreations, ScopePropagator scopePropagator) { + List recursiceObjectCreations, UnitRulePropagator unitRulePropagator) { val newElement = constructor.apply if (nameNewElement) { newElement.name = '''new «interpretation.newElements.size»''' @@ -552,38 +514,220 @@ class RefinementRuleProvider { } // Scope propagation - scopePropagator.decrementTypeScope(typeInterpretation) + unitRulePropagator.decrementTypeScope(typeInterpretation) // Existence interpretation.newElements += newElement // Do recursive object creation for (newConstructor : recursiceObjectCreations) { - createObjectAction(nameNewElement, newConstructor, newElement, scopePropagator) + createObjectAction(nameNewElement, newConstructor, newElement, unitRulePropagator) } return newElement } - protected def boolean createRelationLinkAction(DefinedElement src, DefinedElement trg, - PartialRelationInterpretation relationInterpretation) { + protected def createRelationLinkAction(IPatternMatch match, UnitRulePropagator unitRulePropagator) { + // val problem = match.get(0) as LogicProblem + // val interpretation = match.get(1) as PartialInterpretation + val relationInterpretation = match.get(2) as PartialRelationInterpretation + val src = match.get(3) as DefinedElement + val trg = match.get(4) as DefinedElement + createRelationLinkAction(src, trg, relationInterpretation, unitRulePropagator) + } + + protected def void createRelationLinkAction(DefinedElement src, DefinedElement trg, + PartialRelationInterpretation relationInterpretation, UnitRulePropagator unitRulePropagator) { val link = createBinaryElementRelationLink => [it.param1 = src it.param2 = trg] relationInterpretation.relationlinks += link + unitRulePropagator.addedToRelation(relationInterpretation.interpretationOf) } - protected def boolean createRelationLinkWithInverse(DefinedElement src, DefinedElement trg, - PartialRelationInterpretation relationInterpretation, PartialRelationInterpretation inverseInterpretation) { + protected def void createRelationLinkWithInverse(IPatternMatch match, UnitRulePropagator unitRulePropagator) { + // val problem = match.get(0) as LogicProblem + // val interpretation = match.get(1) as PartialInterpretation + val relationInterpretation = match.get(2) as PartialRelationInterpretation + val inverseInterpretation = match.get(3) as PartialRelationInterpretation + val src = match.get(4) as DefinedElement + val trg = match.get(5) as DefinedElement + createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation, unitRulePropagator) + } + + protected def void createRelationLinkWithInverse(DefinedElement src, DefinedElement trg, + PartialRelationInterpretation relationInterpretation, PartialRelationInterpretation inverseInterpretation, + UnitRulePropagator unitRulePropagator) { val link = createBinaryElementRelationLink => [it.param1 = src it.param2 = trg] relationInterpretation.relationlinks += link val inverseLink = createBinaryElementRelationLink => [it.param1 = trg it.param2 = src] inverseInterpretation.relationlinks += inverseLink + unitRulePropagator.addedToRelation(relationInterpretation.interpretationOf) + unitRulePropagator.addedToRelation(inverseInterpretation.interpretationOf) } - protected def flushQueryEngine(ScopePropagator scopePropagator) { - if (scopePropagator.queryEngineFlushRequiredBeforePropagation && queryEngine.updatePropagationDelayed) { - delayMessageDelivery.setBoolean(queryEngine, false) - queryEngine.getQueryBackend(ReteBackendFactory.INSTANCE).flushUpdates - delayMessageDelivery.setBoolean(queryEngine, true) + static class UnitRulePropagator { + val LogicProblem p + val PartialInterpretation i + val RefinementRuleProvider refinementRuleProvider + var AdvancedViatraQueryEngine queryEngine + var Field delayMessageDelivery + val ScopePropagator scopePropagator + val List> propagators + val ModelGenerationStatistics statistics + + new(LogicProblem p, PartialInterpretation i, RefinementRuleProvider refinementRuleProvider, + ScopePropagator scopePropagator, + Map, IQuerySpecification>> mustRelationPropagationQueries, + ModelGenerationStatistics statistics) { + this.p = p + this.i = i + this.refinementRuleProvider = refinementRuleProvider + queryEngine = ViatraQueryEngine.on(new EMFScope(i)) as AdvancedViatraQueryEngine + delayMessageDelivery = queryEngine.class.getDeclaredField("delayMessageDelivery") + delayMessageDelivery.accessible = true + this.scopePropagator = scopePropagator + propagators = ImmutableList.copyOf(mustRelationPropagationQueries.entrySet.map [ entry | + val matcher = queryEngine.getMatcher(entry.value) + getPropagator(entry.key.key, entry.key.value, matcher) + ]) + this.statistics = statistics + } + + def decrementTypeScope(PartialTypeInterpratation partialTypeInterpratation) { + scopePropagator.decrementTypeScope(partialTypeInterpratation) + } + + def addedToRelation(Relation r) { + scopePropagator.addedToRelation(r) + } + + def propagate() { + var boolean changed + do { + val scopeChanged = propagateScope() + val mustChanged = propagateMustRelations() + changed = scopeChanged || mustChanged + } while (changed) + } + + protected def flushQueryEngine() { + if (queryEngine.updatePropagationDelayed) { + delayMessageDelivery.setBoolean(queryEngine, false) + queryEngine.getQueryBackend(ReteBackendFactory.INSTANCE).flushUpdates + delayMessageDelivery.setBoolean(queryEngine, true) + } + } + + protected def propagateScope() { + if (scopePropagator.scopePropagationNeeded) { + if (scopePropagator.queryEngineFlushRequiredBeforePropagation) { + flushQueryEngine() + } + val propagatorStartTime = System.nanoTime + scopePropagator.propagateAllScopeConstraints() + statistics.addScopePropagationTime(System.nanoTime - propagatorStartTime) + true + } else { + false + } + } + + protected def propagateMustRelations() { + if (propagators.empty) { + return false + } + flushQueryEngine() + val propagatorStartTime = System.nanoTime + var changed = false + for (propagator : propagators) { + changed = propagator.propagate(p, i, refinementRuleProvider, this) || changed + } + statistics.addMustRelationPropagationTime(System.nanoTime - propagatorStartTime) + changed + } + + private static def getPropagator(Relation relation, Relation inverseRelation, + ViatraQueryMatcher matcher) { + if (inverseRelation === null) { + new MustRelationPropagator(matcher) + } else if (relation == inverseRelation) { + new MustRelationPropagatorWithSelfInverse(matcher) + } else { + new MustRelationPropagatorWithInverse(matcher) + } + } + + @FinalFieldsConstructor + private static abstract class AbstractMustRelationPropagator { + val ViatraQueryMatcher matcher + + def propagate(LogicProblem p, PartialInterpretation i, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) { + val iterator = getIterator(p, i) + if (!iterator.hasNext) { + return false + } + iterate(iterator, refinementRuleProvider, unitRulePropagator) + true + } + + def iterate(Iterator iterator, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) { + while (iterator.hasNext) { + doPropagate(iterator.next, refinementRuleProvider, unitRulePropagator) + } + } + + protected def getIterator(LogicProblem p, PartialInterpretation i) { + val partialMatch = matcher.newEmptyMatch + partialMatch.set(0, p) + partialMatch.set(1, i) + matcher.streamAllMatches(partialMatch).iterator + } + + protected def void doPropagate(T match, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) + } + + private static class MustRelationPropagator extends AbstractMustRelationPropagator { + new(ViatraQueryMatcher matcher) { + super(matcher) + } + + override protected doPropagate(T match, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) { + refinementRuleProvider.createRelationLinkAction(match, unitRulePropagator) + } + } + + private static class MustRelationPropagatorWithInverse extends AbstractMustRelationPropagator { + new(ViatraQueryMatcher matcher) { + super(matcher) + } + + override protected doPropagate(T match, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) { + refinementRuleProvider.createRelationLinkWithInverse(match, unitRulePropagator) + } + } + + private static class MustRelationPropagatorWithSelfInverse extends MustRelationPropagatorWithInverse { + new(ViatraQueryMatcher matcher) { + super(matcher) + } + + override iterate(Iterator iterator, RefinementRuleProvider refinementRuleProvider, + UnitRulePropagator unitRulePropagator) { + val pairs = newHashSet + while (iterator.hasNext) { + val match = iterator.next + val src = match.get(4) as DefinedElement + val trg = match.get(5) as DefinedElement + if (!pairs.contains(trg -> src)) { + pairs.add(src -> trg) + doPropagate(match, refinementRuleProvider, unitRulePropagator) + } + } + } } } } 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 67d25208..8e05665c 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 @@ -228,6 +228,10 @@ class ViatraReasoner extends LogicReasoner { it.name = "ScopePropagationTime" it.value = (method.statistics.scopePropagationTime / 1000000) as int ] + it.entries += createIntStatisticEntry => [ + it.name = "MustRelationPropagationTime" + it.value = (method.statistics.mustRelationPropagationTime / 1000000) as int + ] it.entries += createIntStatisticEntry => [ it.name = "TypeAnalysisTime" it.value = (method.statistics.preliminaryTypeAnalisisTime / 1000000) as int diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index a2de1abc..4800f71d 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -307,7 +307,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { public List times = new LinkedList(); private void saveTimes() { - long statecoderTime = ((NeighbourhoodBasedPartialInterpretationStateCoder)this.context.getStateCoder()).getStatecoderRuntime()/1000000; long forwardTime = context.getDesignSpaceManager().getForwardTime()/1000000; long backtrackingTime = context.getDesignSpaceManager().getBacktrackingTime()/1000000; long activationSelection = this.activationSelector.getRuntime()/1000000; @@ -317,8 +316,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { long numericalSolverSolving = this.numericSolver.getSolverSolvingProblem()/1000000; long numericalSolverInterpreting = this.numericSolver.getSolverSolution()/1000000; this.times.add( - "(TransformationExecutionTime"+method.getStatistics().transformationExecutionTime/1000000+ - "|StateCoderTime:"+statecoderTime+ + "(TransformationExecutionTime"+method.getStatistics().transformationExecutionTime/1000000+ "|ForwardTime:"+forwardTime+ "|Backtrackingtime:"+backtrackingTime+ "|GlobalConstraintEvaluationTime:"+(globalConstraintEvaluationTime/1000000)+ diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/FileSystemHint.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/FileSystemHint.xtend index 8d6523b1..300f8b51 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/FileSystemHint.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/FileSystemHint.xtend @@ -4,6 +4,8 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator +import java.util.Map +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery class FileSystemHint extends Ecore2LogicTraceBasedHint { static val REMAINING_CONTENTS_ROOT = "hint_root" @@ -12,7 +14,7 @@ class FileSystemHint extends Ecore2LogicTraceBasedHint { super(ecore2Logic, trace) } - override getAdditionalPatterns(PatternGenerator it) ''' + override getAdditionalPatterns(PatternGenerator it, Map fqnToPQuery) ''' pattern «REMAINING_CONTENTS_ROOT»(problem:LogicProblem, interpretation:PartialInterpretation, remainingContents:java Integer) { find interpretation(problem, interpretation); remainingContents == sum find remainingContents_root_reference_Dir_helper(problem, interpretation, _, #_) diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend index 97ce4ee6..9a84f777 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SGraphHint.xtend @@ -4,13 +4,15 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator +import java.util.Map +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery class SGraphHint extends Ecore2LogicTraceBasedHint { new(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { super(ecore2Logic, trace) } - override getAdditionalPatterns(extension PatternGenerator patternGenerator) { + override getAdditionalPatterns(extension PatternGenerator patternGenerator, Map fqnToPQuery) { "" } diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend index ef5b779e..28954d60 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SatelliteHint.xtend @@ -5,6 +5,8 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeExpressionBuilderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator +import java.util.Map +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery class SatelliteHint extends Ecore2LogicTraceBasedHint { static val INTERFEROMETY_PAYLOAD = "hint_interferometryPayload" @@ -14,7 +16,7 @@ class SatelliteHint extends Ecore2LogicTraceBasedHint { super(ecore2Logic, trace) } - override getAdditionalPatterns(PatternGenerator it) ''' + override getAdditionalPatterns(PatternGenerator it, Map fqnToPQuery) ''' pattern «INTERFEROMETY_PAYLOAD»(problem:LogicProblem, interpretation:PartialInterpretation, object:DefinedElement) { find interpretation(problem, interpretation); find mustExist(problem, interpretation, object); diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SimpleRun.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SimpleRun.xtend index b65826ad..5e2d0920 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SimpleRun.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/SimpleRun.xtend @@ -1,9 +1,8 @@ package hu.bme.mit.inf.dslreasoner.run import functionalarchitecture.FunctionalarchitecturePackage +import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.Filesystem.Model import hu.bme.mit.inf.dslreasoner.domains.transima.fam.FamPatterns -import hu.bme.mit.inf.dslreasoner.domains.transima.fam.Model -import hu.bme.mit.inf.dslreasoner.domains.transima.fam.Type import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor @@ -15,7 +14,6 @@ import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor -import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagatorStrategy import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml @@ -121,8 +119,6 @@ class SimpleRun { val patterns = i.specifications.toList val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name== "Constraint"]].toSet val derivedFeatures = new LinkedHashMap - derivedFeatures.put(Type.instance,metamodel.attributes.filter[it.name == "type"].head) - derivedFeatures.put(Model.instance,metamodel.references.filter[it.name == "model"].head) val res = new ViatraQuerySetDescriptor( patterns, wfPatterns, -- cgit v1.2.3-54-g00ecf