diff options
author | Kristóf Marussy <marussy@mit.bme.hu> | 2020-07-07 15:00:13 +0200 |
---|---|---|
committer | Kristóf Marussy <marussy@mit.bme.hu> | 2020-07-07 15:00:13 +0200 |
commit | a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8 (patch) | |
tree | dd816939088926b3009432afa22be0e2a116436f /Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme | |
parent | Add modified VIATRA-DSE version (diff) | |
download | VIATRA-Generator-a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8.tar.gz VIATRA-Generator-a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8.tar.zst VIATRA-Generator-a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8.zip |
Trying to fix performance regressions
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme')
7 files changed, 87 insertions, 13 deletions
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 { | |||
112 | ReasonerWorkspace workspace, | 112 | ReasonerWorkspace workspace, |
113 | boolean nameNewElements, | 113 | boolean nameNewElements, |
114 | TypeInferenceMethod typeInferenceMethod, | 114 | TypeInferenceMethod typeInferenceMethod, |
115 | boolean calculateObjectCreationCosts, | ||
115 | ScopePropagatorStrategy scopePropagatorStrategy, | 116 | ScopePropagatorStrategy scopePropagatorStrategy, |
116 | Collection<LinearTypeConstraintHint> hints, | 117 | Collection<LinearTypeConstraintHint> hints, |
117 | DocumentationLevel debugLevel | 118 | DocumentationLevel debugLevel |
@@ -135,7 +136,7 @@ class ModelGenerationMethodProvider { | |||
135 | val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, | 136 | val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, |
136 | statistics) | 137 | statistics) |
137 | 138 | ||
138 | val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries) | 139 | val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries,calculateObjectCreationCosts) |
139 | 140 | ||
140 | val unfinishedWF = queries.getUnfinishedWFQueries.values | 141 | val unfinishedWF = queries.getUnfinishedWFQueries.values |
141 | 142 | ||
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 { | |||
14 | val int cost | 14 | val int cost |
15 | 15 | ||
16 | new(String targetRelationName, IQuerySpecification<?> querySpecification, boolean containment, int lowerBound, int cost) { | 16 | new(String targetRelationName, IQuerySpecification<?> querySpecification, boolean containment, int lowerBound, int cost) { |
17 | if (lowerBound <= 0) { | ||
18 | throw new IllegalArgumentException("Invalid lower bound: " + lowerBound) | ||
19 | } | ||
17 | this.targetRelationName = targetRelationName | 20 | this.targetRelationName = targetRelationName |
18 | this.querySpecification = querySpecification | 21 | this.querySpecification = querySpecification |
19 | this.calculator = null | 22 | 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 { | |||
60 | } | 60 | } |
61 | } | 61 | } |
62 | } while (changed) | 62 | } while (changed) |
63 | 63 | ||
64 | copyScopeBoundsToHeuristic() | 64 | copyScopeBoundsToHeuristic() |
65 | } | 65 | } |
66 | 66 | ||
67 | def propagateAllScopeConstraints() { | 67 | def propagateAllScopeConstraints() { |
68 | if (!valid) { | ||
69 | return | ||
70 | } | ||
68 | statistics.incrementScopePropagationCount() | 71 | statistics.incrementScopePropagationCount() |
69 | doPropagateAllScopeConstraints() | 72 | doPropagateAllScopeConstraints() |
70 | } | 73 | } |
71 | 74 | ||
75 | def isValid() { | ||
76 | partialInterpretation.maxNewElements == -1 || | ||
77 | partialInterpretation.minNewElements <= partialInterpretation.maxNewElements | ||
78 | } | ||
79 | |||
72 | protected def copyScopeBoundsToHeuristic() { | 80 | protected def copyScopeBoundsToHeuristic() { |
73 | partialInterpretation.minNewElementsHeuristic = partialInterpretation.minNewElements | 81 | partialInterpretation.minNewElementsHeuristic = partialInterpretation.minNewElements |
74 | for (scope : partialInterpretation.scopes) { | 82 | for (scope : partialInterpretation.scopes) { |
@@ -109,7 +117,7 @@ class ScopePropagator { | |||
109 | // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] | 117 | // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] |
110 | // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') | 118 | // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') |
111 | } | 119 | } |
112 | 120 | ||
113 | protected def setScopesInvalid() { | 121 | protected def setScopesInvalid() { |
114 | partialInterpretation.minNewElements = Integer.MAX_VALUE | 122 | partialInterpretation.minNewElements = Integer.MAX_VALUE |
115 | partialInterpretation.maxNewElements = 0 | 123 | 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 { | |||
51 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) | 51 | @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) |
52 | @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) | 52 | @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) |
53 | 53 | ||
54 | public new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { | 54 | new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { |
55 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { | 55 | if(typeInferenceMethod == TypeInferenceMethod.Generic) { |
56 | this.typeIndexer = new GenericTypeIndexer(this) | 56 | this.typeIndexer = new GenericTypeIndexer(this) |
57 | this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) | 57 | 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 { | |||
19 | this.base = base | 19 | this.base = base |
20 | } | 20 | } |
21 | 21 | ||
22 | public def generateRelationIndexers(LogicProblem problem, Iterable<RelationDeclaration> relations, Map<String,PQuery> fqn2PQuery) { | 22 | def generateRelationIndexers(LogicProblem problem, Iterable<RelationDeclaration> relations, Map<String,PQuery> fqn2PQuery) { |
23 | val upperMultiplicities = new HashMap | 23 | val upperMultiplicities = new HashMap |
24 | problem.annotations.filter(UpperMultiplicityAssertion).forEach[ | 24 | problem.annotations.filter(UpperMultiplicityAssertion).forEach[ |
25 | upperMultiplicities.put(it.relation,it.upper) | 25 | upperMultiplicities.put(it.relation,it.upper) |
@@ -42,7 +42,7 @@ class RelationDeclarationIndexer { | |||
42 | '''«modality.name.toLowerCase»InRelation«base.canonizeName(r.name)»''' | 42 | '''«modality.name.toLowerCase»InRelation«base.canonizeName(r.name)»''' |
43 | } | 43 | } |
44 | 44 | ||
45 | public def referRelation( | 45 | def referRelation( |
46 | RelationDeclaration referred, | 46 | RelationDeclaration referred, |
47 | String sourceVariable, | 47 | String sourceVariable, |
48 | String targetVariable, | 48 | 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 | |||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 5 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality | 6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality |
7 | import java.util.LinkedList | 7 | import java.util.LinkedList |
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
9 | 8 | ||
10 | class RelationRefinementGenerator { | 9 | class RelationRefinementGenerator { |
11 | PatternGenerator base; | 10 | PatternGenerator base; |
12 | 11 | ||
13 | public new(PatternGenerator base) { | 12 | new(PatternGenerator base) { |
14 | this.base = base | 13 | this.base = base |
15 | } | 14 | } |
16 | 15 | ||
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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules | 1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules |
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 6 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
4 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator | 7 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator |
5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns | 8 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns |
6 | import java.util.ArrayList | 9 | import java.util.ArrayList |
10 | import java.util.HashMap | ||
11 | import java.util.LinkedList | ||
12 | import java.util.List | ||
13 | import java.util.Map | ||
7 | 14 | ||
8 | class GoalConstraintProvider { | 15 | class GoalConstraintProvider { |
9 | 16 | ||
10 | def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) { | 17 | def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns, boolean calculateObjectCost) { |
18 | val objectCosts = if (calculateObjectCost) { | ||
19 | calculateMissingObjectCost(p) | ||
20 | } else { | ||
21 | emptyMap | ||
22 | } | ||
11 | val res = new ArrayList() | 23 | val res = new ArrayList() |
12 | for (entry : patterns.multiplicityConstraintQueries.entrySet) { | 24 | for (entry : patterns.multiplicityConstraintQueries.entrySet) { |
13 | val constraint = entry.key | 25 | val constraint = entry.key |
@@ -17,10 +29,61 @@ class GoalConstraintProvider { | |||
17 | val query = queries.existingMultiplicityQuery | 29 | val query = queries.existingMultiplicityQuery |
18 | val containment = constraint.containment | 30 | val containment = constraint.containment |
19 | val lowerBound = constraint.lowerBound | 31 | val lowerBound = constraint.lowerBound |
20 | res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1, lowerBound) | 32 | val cost = objectCosts.getOrDefault(constraint.relation, 1) |
33 | res += new MultiplicityGoalConstraintCalculator( | ||
34 | targetRelationName, | ||
35 | query, | ||
36 | containment, | ||
37 | lowerBound, | ||
38 | cost | ||
39 | ) | ||
21 | } | 40 | } |
22 | } | 41 | } |
23 | return res | 42 | return res |
24 | } | 43 | } |
25 | 44 | ||
26 | } \ No newline at end of file | 45 | private def calculateMissingObjectCost(LogicProblem p) { |
46 | val containments = p.containmentHierarchies.head.containmentRelations | ||
47 | val containment2Lower = containments.toInvertedMap [ containment | | ||
48 | val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head | ||
49 | if (lower !== null) { | ||
50 | lower.lower | ||
51 | } else { | ||
52 | 0 | ||
53 | } | ||
54 | ] | ||
55 | val types = p.types | ||
56 | val Map<Type, List<? extends Pair<Type, Integer>>> type2NewCost = new HashMap | ||
57 | for (type : types) { | ||
58 | val allSupertypes = (#[type] + type.supertypes).toSet | ||
59 | val allOutgoingContainments = containments.filter [ | ||
60 | allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred) | ||
61 | ] | ||
62 | val list = new LinkedList | ||
63 | for (outgoingContainment : allOutgoingContainments) { | ||
64 | val value = containment2Lower.get(outgoingContainment) | ||
65 | if (value > 0) { | ||
66 | list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred -> value) | ||
67 | } | ||
68 | } | ||
69 | type2NewCost.put(type, list) | ||
70 | } | ||
71 | val res = new HashMap | ||
72 | for (containment : containments) { | ||
73 | val key = containment | ||
74 | val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost) | ||
75 | // println('''«key.name» --> «value» new''') | ||
76 | res.put(key, value) | ||
77 | } | ||
78 | return res | ||
79 | } | ||
80 | |||
81 | private def int count(Type t, Map<Type, List<? extends Pair<Type, Integer>>> containments) { | ||
82 | val list = containments.get(t) | ||
83 | var r = 1 | ||
84 | for (element : list) { | ||
85 | r += element.value * element.key.count(containments) | ||
86 | } | ||
87 | return r | ||
88 | } | ||
89 | } | ||