aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-05 22:01:10 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-07 14:55:46 +0200
commitc14d8efd509f834b80573bc0339bb990698b265c (patch)
treedc3ca21785ea17bc75a861f373ee69ec64d6e97f
parentfeat(language): validate assignment expressions (diff)
downloadrefinery-c14d8efd509f834b80573bc0339bb990698b265c.tar.gz
refinery-c14d8efd509f834b80573bc0339bb990698b265c.tar.zst
refinery-c14d8efd509f834b80573bc0339bb990698b265c.zip
feat(language): type inference
* Customizable operator overloads. * Customizable aggregation operators. * Simplify ProblemQualifiedNameProvider.
-rw-r--r--subprojects/frontend/src/editor/EditorTheme.ts2
-rw-r--r--subprojects/frontend/src/language/problem.grammar31
-rw-r--r--subprojects/frontend/src/language/problemLanguageSupport.ts9
-rw-r--r--subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java12
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java18
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java10
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java3
-rw-r--r--subprojects/language-model/problem.aird657
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.ecore28
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.genmodel28
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java17
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java8
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java15
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java3
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/Problem.xtext56
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java9
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/expressions/AbstractTermInterpreter.java131
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/expressions/BuiltinTermInterpreter.java54
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java99
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/expressions/TermInterpreter.java29
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java44
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java56
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java20
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java7
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java5
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java71
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapterProvider.java68
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java5
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/AggregatorName.java19
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/DataExprType.java19
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java16
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java18
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/InvalidType.java16
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/LiteralType.java16
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/MutableType.java32
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/NodeType.java16
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/ProblemTypeAnalyzer.java32
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/Signature.java11
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/SignatureProvider.java107
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java568
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java57
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java98
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java15
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java96
-rw-r--r--subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.expressions.TermInterpreter4
-rw-r--r--subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery8
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java4
-rw-r--r--subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java16
48 files changed, 1889 insertions, 774 deletions
diff --git a/subprojects/frontend/src/editor/EditorTheme.ts b/subprojects/frontend/src/editor/EditorTheme.ts
index b211f2a7..1f8152d3 100644
--- a/subprojects/frontend/src/editor/EditorTheme.ts
+++ b/subprojects/frontend/src/editor/EditorTheme.ts
@@ -166,7 +166,7 @@ export default styled('div', {
166 '.tok-problem-abstract': { 166 '.tok-problem-abstract': {
167 fontStyle: 'italic', 167 fontStyle: 'italic',
168 }, 168 },
169 '.tok-problem-datatype': { 169 '.tok-problem-datatype, .tok-problem-aggregator': {
170 '&, & .tok-typeName': { 170 '&, & .tok-typeName': {
171 color: theme.palette.primary.main, 171 color: theme.palette.primary.main,
172 }, 172 },
diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar
index 0f6ea3e1..829dc138 100644
--- a/subprojects/frontend/src/language/problem.grammar
+++ b/subprojects/frontend/src/language/problem.grammar
@@ -11,12 +11,13 @@
11@precedence { 11@precedence {
12 cast, 12 cast,
13 prefix, 13 prefix,
14 range @left,
14 exponential @right, 15 exponential @right,
15 multiplicative @left, 16 multiplicative @left,
16 additive @left, 17 additive @left,
17 range @left,
18 lattice @left, 18 lattice @left,
19 comparison @left, 19 comparison @left,
20 boolean @left,
20 assignment, 21 assignment,
21 feature @cut 22 feature @cut
22} 23}
@@ -45,7 +46,10 @@ statement {
45 (EnumBody { "{" sep<",", AtomNodeName> "}" } | ".") 46 (EnumBody { "{" sep<",", AtomNodeName> "}" } | ".")
46 } | 47 } |
47 DatatypeDeclaration { 48 DatatypeDeclaration {
48 kw<"extern"> kw<"datatype"> DatatypeName "." 49 kw<"extern"> ckw<"datatype"> DatatypeName "."
50 } |
51 AggregatorDeclaration {
52 kw<"extern"> ckw<"aggregator"> AggregatorName "."
49 } | 53 } |
50 PredicateDefinition { 54 PredicateDefinition {
51 ( 55 (
@@ -92,7 +96,7 @@ FeatureDeclaration {
92 ";"? 96 ";"?
93} 97}
94 98
95Parameter { Modality? RelationName? VariableName } 99Parameter { RelationName? VariableName }
96 100
97// Use @dynamicPrecedence to prevent a(b) from being parsed as Expr { a } Expr { b } 101// Use @dynamicPrecedence to prevent a(b) from being parsed as Expr { a } Expr { b }
98// instead of Atom { a(b) } 102// instead of Atom { a(b) }
@@ -111,22 +115,23 @@ Expr {
111AssignmentExpr { !assignment VariableName kw<"is"> Expr } 115AssignmentExpr { !assignment VariableName kw<"is"> Expr }
112 116
113BinaryExpr { 117BinaryExpr {
118 Expr !boolean ("&&" | "||" | "^^") Expr |
114 Expr !comparison ComparisonOp Expr | 119 Expr !comparison ComparisonOp Expr |
115 Expr !lattice (LatticeMeet | "\\/") Expr | 120 Expr !lattice (LatticeMeet | "\\/") Expr |
116 Expr !range ".." Expr |
117 Expr !additive ("+" | "-") Expr | 121 Expr !additive ("+" | "-") Expr |
118 Expr !multiplicative (StarMult | Divide) Expr | 122 Expr !multiplicative (StarMult | Divide) Expr |
119 Expr !exponential "**" Expr 123 Expr !exponential "**" Expr |
124 Expr !range ".." Expr
120} 125}
121 126
122UnaryExpr { 127UnaryExpr {
123 !prefix ("+" | "-" | "!" | kw<"count"> | Modality) Expr 128 !prefix ("+" | "-" | "!" | kw<"count">) Expr
124} 129}
125 130
126CastExpr { !cast Expr kw<"as"> DatatypeName } 131CastExpr { !cast Expr kw<"as"> DatatypeName }
127 132
128Aggregation { 133Aggregation {
129 AggregationOp "{" Expr "|" Expr "}" 134 AggregatorName "{" Expr "|" Expr "}"
130} 135}
131 136
132Atom { RelationName "+"? ParameterList<Expr> } 137Atom { RelationName "+"? ParameterList<Expr> }
@@ -151,14 +156,6 @@ LogicValue {
151 kw<"true"> | kw<"false"> | kw<"unknown"> | kw<"error"> 156 kw<"true"> | kw<"false"> | kw<"unknown"> | kw<"error">
152} 157}
153 158
154Modality {
155 kw<"must"> | kw<"may"> | kw<"current">
156}
157
158AggregationOp {
159 ckw<"sum"> | ckw<"prod"> | ckw<"min"> | ckw<"max">
160}
161
162ComparisonOp { SymbolicComparisonOp | kw<"in"> } 159ComparisonOp { SymbolicComparisonOp | kw<"in"> }
163 160
164ScopeElement { RelationName ("=" | "+=") Multiplicity } 161ScopeElement { RelationName ("=" | "+=") Multiplicity }
@@ -183,6 +180,8 @@ NodeName { QualifiedName }
183 180
184ModuleName { QualifiedName } 181ModuleName { QualifiedName }
185 182
183AggregatorName { QualifiedName }
184
186QualifiedName[implicitCompletion=true] { "::"? identifier (QualifiedNameSeparator "::" identifier)* } 185QualifiedName[implicitCompletion=true] { "::"? identifier (QualifiedNameSeparator "::" identifier)* }
187 186
188kw<term> { @specialize[@name={term},implicitCompletion=true]<identifier, term> } 187kw<term> { @specialize[@name={term},implicitCompletion=true]<identifier, term> }
@@ -237,7 +236,7 @@ sep1<separator, content> { content (separator content)* }
237 236
238 SymbolicComparisonOp { 237 SymbolicComparisonOp {
239 ">" | ">=" | "<" | "<=" | "==" | "!=" | 238 ">" | ">=" | "<" | "<=" | "==" | "!=" |
240 "<:" | ":>" | "===" | "!==" 239 "===" | "!=="
241 } 240 }
242 241
243 NotOp { "!" } 242 NotOp { "!" }
diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts
index 3d25d699..594351d6 100644
--- a/subprojects/frontend/src/language/problemLanguageSupport.ts
+++ b/subprojects/frontend/src/language/problemLanguageSupport.ts
@@ -28,12 +28,12 @@ const parserWithMetadata = parser.configure({
28 LineComment: t.lineComment, 28 LineComment: t.lineComment,
29 BlockComment: t.blockComment, 29 BlockComment: t.blockComment,
30 'module problem class enum pred fn scope': t.definitionKeyword, 30 'module problem class enum pred fn scope': t.definitionKeyword,
31 'import as declare atom multi extern datatype': t.definitionKeyword, 31 'import as declare atom multi': t.definitionKeyword,
32 'extern datatype aggregator': t.definitionKeyword,
32 'abstract extends refers contains container opposite': t.modifier, 33 'abstract extends refers contains container opposite': t.modifier,
33 'default error contained containment': t.modifier, 34 default: t.modifier,
34 'true false unknown error': t.keyword, 35 'true false unknown error': t.keyword,
35 'may must current count': t.operatorKeyword, 36 'count in is': t.operatorKeyword,
36 'sum prod min max in is': t.operatorKeyword,
37 // 'new delete': t.keyword, 37 // 'new delete': t.keyword,
38 NotOp: t.operator, 38 NotOp: t.operator,
39 UnknownOp: t.operator, 39 UnknownOp: t.operator,
@@ -44,6 +44,7 @@ const parserWithMetadata = parser.configure({
44 String: t.string, 44 String: t.string,
45 'RelationName/QualifiedName': t.typeName, 45 'RelationName/QualifiedName': t.typeName,
46 'DatatypeName/QualifiedName': t.keyword, 46 'DatatypeName/QualifiedName': t.keyword,
47 'AggregatorName/QualifiedName': t.operatorKeyword,
47 // 'RuleName/QualifiedName': t.typeName, 48 // 'RuleName/QualifiedName': t.typeName,
48 'AtomNodeName/QualifiedName': t.atom, 49 'AtomNodeName/QualifiedName': t.atom,
49 'VariableName/QualifiedName': t.variableName, 50 'VariableName/QualifiedName': t.variableName,
diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java
index 580a87b6..c76fb7aa 100644
--- a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java
+++ b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java
@@ -12,7 +12,10 @@ import org.eclipse.emf.ecore.resource.Resource;
12import org.eclipse.emf.ecore.util.EcoreUtil; 12import org.eclipse.emf.ecore.util.EcoreUtil;
13import org.eclipse.xtext.diagnostics.Severity; 13import org.eclipse.xtext.diagnostics.Severity;
14import org.eclipse.xtext.naming.IQualifiedNameConverter; 14import org.eclipse.xtext.naming.IQualifiedNameConverter;
15import org.eclipse.xtext.resource.*; 15import org.eclipse.xtext.resource.FileExtensionProvider;
16import org.eclipse.xtext.resource.IEObjectDescription;
17import org.eclipse.xtext.resource.IResourceFactory;
18import org.eclipse.xtext.resource.XtextResourceSet;
16import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider; 19import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider;
17import org.eclipse.xtext.util.CancelIndicator; 20import org.eclipse.xtext.util.CancelIndicator;
18import org.eclipse.xtext.util.LazyStringInputStream; 21import org.eclipse.xtext.util.LazyStringInputStream;
@@ -25,7 +28,7 @@ import tools.refinery.language.model.problem.ScopeDeclaration;
25import tools.refinery.language.naming.NamingUtil; 28import tools.refinery.language.naming.NamingUtil;
26import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; 29import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
27import tools.refinery.language.resource.ProblemResourceDescriptionStrategy.ShadowingKey; 30import tools.refinery.language.resource.ProblemResourceDescriptionStrategy.ShadowingKey;
28import tools.refinery.language.scoping.imports.ImportAdapter; 31import tools.refinery.language.scoping.imports.ImportAdapterProvider;
29import tools.refinery.language.scoping.imports.ImportCollector; 32import tools.refinery.language.scoping.imports.ImportCollector;
30import tools.refinery.store.util.CancellationToken; 33import tools.refinery.store.util.CancellationToken;
31 34
@@ -61,6 +64,9 @@ public class ProblemLoader {
61 @Inject 64 @Inject
62 private IQualifiedNameConverter qualifiedNameConverter; 65 private IQualifiedNameConverter qualifiedNameConverter;
63 66
67 @Inject
68 private ImportAdapterProvider importAdapterProvider;
69
64 private CancellationToken cancellationToken = CancellationToken.NONE; 70 private CancellationToken cancellationToken = CancellationToken.NONE;
65 71
66 private final List<Path> extraPaths = new ArrayList<>(); 72 private final List<Path> extraPaths = new ArrayList<>();
@@ -125,7 +131,7 @@ public class ProblemLoader {
125 131
126 private XtextResourceSet createResourceSet() { 132 private XtextResourceSet createResourceSet() {
127 var resourceSet = resourceSetProvider.get(); 133 var resourceSet = resourceSetProvider.get();
128 var adapter = ImportAdapter.getOrInstall(resourceSet); 134 var adapter = importAdapterProvider.getOrInstall(resourceSet);
129 adapter.getLibraryPaths().addAll(0, extraPaths); 135 adapter.getLibraryPaths().addAll(0, extraPaths);
130 return resourceSet; 136 return resourceSet;
131 } 137 }
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
index 8b2542f3..8dad8f8a 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
@@ -24,9 +24,9 @@ import tools.refinery.language.model.problem.*;
24import tools.refinery.language.naming.NamingUtil; 24import tools.refinery.language.naming.NamingUtil;
25import tools.refinery.language.naming.ProblemQualifiedNameConverter; 25import tools.refinery.language.naming.ProblemQualifiedNameConverter;
26import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; 26import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
27import tools.refinery.language.scoping.imports.ImportAdapterProvider;
27import tools.refinery.language.scoping.imports.ImportCollector; 28import tools.refinery.language.scoping.imports.ImportCollector;
28import tools.refinery.language.utils.BuiltinSymbols; 29import tools.refinery.language.utils.BuiltinSymbols;
29import tools.refinery.language.utils.ProblemDesugarer;
30import tools.refinery.language.utils.ProblemUtil; 30import tools.refinery.language.utils.ProblemUtil;
31import tools.refinery.language.validation.ReferenceCounter; 31import tools.refinery.language.validation.ReferenceCounter;
32 32
@@ -43,10 +43,10 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
43 private ReferenceCounter referenceCounter; 43 private ReferenceCounter referenceCounter;
44 44
45 @Inject 45 @Inject
46 private ProblemDesugarer desugarer; 46 private ImportCollector importCollector;
47 47
48 @Inject 48 @Inject
49 private ImportCollector importCollector; 49 private ImportAdapterProvider importAdapterProvider;
50 50
51 @Override 51 @Override
52 protected Iterable<IEObjectDescription> queryScope(IScope scope, CrossReference crossReference, 52 protected Iterable<IEObjectDescription> queryScope(IScope scope, CrossReference crossReference,
@@ -132,11 +132,7 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
132 } 132 }
133 } 133 }
134 134
135 var builtinSymbolsOption = desugarer.getBuiltinSymbols(context.getRootModel()); 135 var builtinSymbols = importAdapterProvider.getBuiltinSymbols(context.getResource());
136 if (builtinSymbolsOption.isEmpty()) {
137 return true;
138 }
139 var builtinSymbols = builtinSymbolsOption.get();
140 136
141 return builtinSymbolAwareShouldBeVisible(candidate, context, eReference, builtinSymbols, 137 return builtinSymbolAwareShouldBeVisible(candidate, context, eReference, builtinSymbols,
142 candidateEObjectOrProxy); 138 candidateEObjectOrProxy);
@@ -144,7 +140,7 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
144 140
145 private VariableOrNode getAssignedVariable(EObject context) { 141 private VariableOrNode getAssignedVariable(EObject context) {
146 var assignmentExpr = EcoreUtil2.getContainerOfType(context, AssignmentExpr.class); 142 var assignmentExpr = EcoreUtil2.getContainerOfType(context, AssignmentExpr.class);
147 if (assignmentExpr.getLeft() instanceof VariableOrNodeExpr variableOrNodeExpr) { 143 if (assignmentExpr != null && assignmentExpr.getLeft() instanceof VariableOrNodeExpr variableOrNodeExpr) {
148 return variableOrNodeExpr.getVariableOrNode(); 144 return variableOrNodeExpr.getVariableOrNode();
149 } 145 }
150 return null; 146 return null;
@@ -202,8 +198,8 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
202 if (builtinSymbols.exists().equals(candidateEObjectOrProxy)) { 198 if (builtinSymbols.exists().equals(candidateEObjectOrProxy)) {
203 return false; 199 return false;
204 } 200 }
205 var arity = candidate.getUserData(ProblemResourceDescriptionStrategy.ARITY); 201 return ProblemResourceDescriptionStrategy.TYPE_LIKE_TRUE.equals(
206 return arity == null || arity.equals("1"); 202 candidate.getUserData(ProblemResourceDescriptionStrategy.TYPE_LIKE));
207 } 203 }
208 204
209 if (eReference.equals(ProblemPackage.Literals.CLASS_DECLARATION__SUPER_TYPES)) { 205 if (eReference.equals(ProblemPackage.Literals.CLASS_DECLARATION__SUPER_TYPES)) {
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index a8849b7c..06f0e758 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -18,7 +18,6 @@ import org.eclipse.xtext.service.OperationCanceledManager;
18import org.eclipse.xtext.util.CancelIndicator; 18import org.eclipse.xtext.util.CancelIndicator;
19import org.jetbrains.annotations.NotNull; 19import org.jetbrains.annotations.NotNull;
20import tools.refinery.language.model.problem.*; 20import tools.refinery.language.model.problem.*;
21import tools.refinery.language.utils.ProblemDesugarer;
22import tools.refinery.language.utils.ProblemUtil; 21import tools.refinery.language.utils.ProblemUtil;
23 22
24import java.util.List; 23import java.util.List;
@@ -27,6 +26,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
27 private static final String BUILTIN_CLASS = "builtin"; 26 private static final String BUILTIN_CLASS = "builtin";
28 private static final String ABSTRACT_CLASS = "abstract"; 27 private static final String ABSTRACT_CLASS = "abstract";
29 private static final String DATATYPE_CLASS = "datatype"; 28 private static final String DATATYPE_CLASS = "datatype";
29 private static final String AGGREGATOR_CLASS = "aggregator";
30 private static final String CONTAINMENT_CLASS = "containment"; 30 private static final String CONTAINMENT_CLASS = "containment";
31 private static final String ERROR_CLASS = "error"; 31 private static final String ERROR_CLASS = "error";
32 private static final String NODE_CLASS = "node"; 32 private static final String NODE_CLASS = "node";
@@ -37,9 +37,6 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
37 private OperationCanceledManager operationCanceledManager; 37 private OperationCanceledManager operationCanceledManager;
38 38
39 @Inject 39 @Inject
40 private ProblemDesugarer desugarer;
41
42 @Inject
43 private TypeHashProvider typeHashProvider; 40 private TypeHashProvider typeHashProvider;
44 41
45 @Override 42 @Override
@@ -116,8 +113,11 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
116 if (eObject instanceof DatatypeDeclaration) { 113 if (eObject instanceof DatatypeDeclaration) {
117 classesBuilder.add(DATATYPE_CLASS); 114 classesBuilder.add(DATATYPE_CLASS);
118 } 115 }
116 if (eObject instanceof AggregatorDeclaration) {
117 classesBuilder.add(AGGREGATOR_CLASS);
118 }
119 if (eObject instanceof ReferenceDeclaration referenceDeclaration 119 if (eObject instanceof ReferenceDeclaration referenceDeclaration
120 && desugarer.isContainmentReference(referenceDeclaration)) { 120 && ProblemUtil.isContainmentReference(referenceDeclaration)) {
121 classesBuilder.add(CONTAINMENT_CLASS); 121 classesBuilder.add(CONTAINMENT_CLASS);
122 } 122 }
123 if (isError && reference != null) { 123 if (isError && reference != null) {
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java
index 82a6af06..2821e1b6 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java
@@ -17,6 +17,7 @@ import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider;
17import org.eclipse.xtext.util.IResourceScopeCache; 17import org.eclipse.xtext.util.IResourceScopeCache;
18import tools.refinery.language.documentation.DocumentationCommentParser; 18import tools.refinery.language.documentation.DocumentationCommentParser;
19import tools.refinery.language.model.problem.*; 19import tools.refinery.language.model.problem.*;
20import tools.refinery.language.naming.NamingUtil;
20import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; 21import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
21import tools.refinery.language.scoping.imports.ImportCollector; 22import tools.refinery.language.scoping.imports.ImportCollector;
22import tools.refinery.language.utils.ProblemUtil; 23import tools.refinery.language.utils.ProblemUtil;
@@ -55,7 +56,7 @@ public class TypeHashProvider {
55 if (qualifiedName == null) { 56 if (qualifiedName == null) {
56 return null; 57 return null;
57 } 58 }
58 var qualifiedNameString = qualifiedNameConverter.toString(qualifiedName); 59 var qualifiedNameString = qualifiedNameConverter.toString(NamingUtil.addRootPrefix(qualifiedName));
59 var problem = EcoreUtil2.getContainerOfType(relation, Problem.class); 60 var problem = EcoreUtil2.getContainerOfType(relation, Problem.class);
60 if (problem == null) { 61 if (problem == null) {
61 return null; 62 return null;
diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird
index c253facb..f8a50a76 100644
--- a/subprojects/language-model/problem.aird
+++ b/subprojects/language-model/problem.aird
@@ -7,11 +7,11 @@
7 <semanticResources>build/resources/main/model/problem.genmodel</semanticResources> 7 <semanticResources>build/resources/main/model/problem.genmodel</semanticResources>
8 <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg"> 8 <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg">
9 <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> 9 <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="1708374464734"> 10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="1709659837733">
11 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 11 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
12 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 12 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
13 </ownedRepresentationDescriptors> 13 </ownedRepresentationDescriptors>
14 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_z1bOYF3lEe2LuOZzJ_LhLg" name="expressions" repPath="#_z1YyIF3lEe2LuOZzJ_LhLg" changeId="1709214207759"> 14 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_z1bOYF3lEe2LuOZzJ_LhLg" name="expressions" repPath="#_z1YyIF3lEe2LuOZzJ_LhLg" changeId="1709659698980">
15 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 15 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
16 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 16 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
17 </ownedRepresentationDescriptors> 17 </ownedRepresentationDescriptors>
@@ -95,7 +95,7 @@
95 <styles xmi:type="notation:FilteringStyle" xmi:id="_fit3lqA5EeuqkpDnuik1sg"/> 95 <styles xmi:type="notation:FilteringStyle" xmi:id="_fit3lqA5EeuqkpDnuik1sg"/>
96 </children> 96 </children>
97 <styles xmi:type="notation:ShapeStyle" xmi:id="_fit3kaA5EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 97 <styles xmi:type="notation:ShapeStyle" xmi:id="_fit3kaA5EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
98 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fit3kqA5EeuqkpDnuik1sg" x="1524" y="716" width="150" height="100"/> 98 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fit3kqA5EeuqkpDnuik1sg" x="1680" y="716" width="150" height="100"/>
99 </children> 99 </children>
100 <children xmi:type="notation:Node" xmi:id="_QKLK0KA6EeuqkpDnuik1sg" type="2003" element="_QKD2EKA6EeuqkpDnuik1sg"> 100 <children xmi:type="notation:Node" xmi:id="_QKLK0KA6EeuqkpDnuik1sg" type="2003" element="_QKD2EKA6EeuqkpDnuik1sg">
101 <children xmi:type="notation:Node" xmi:id="_QKLK06A6EeuqkpDnuik1sg" type="5007"/> 101 <children xmi:type="notation:Node" xmi:id="_QKLK06A6EeuqkpDnuik1sg" type="5007"/>
@@ -104,7 +104,7 @@
104 <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/> 104 <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/>
105 </children> 105 </children>
106 <styles xmi:type="notation:ShapeStyle" xmi:id="_QKLK0aA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 106 <styles xmi:type="notation:ShapeStyle" xmi:id="_QKLK0aA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
107 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QKLK0qA6EeuqkpDnuik1sg" x="1531" y="530" width="120" height="100"/> 107 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QKLK0qA6EeuqkpDnuik1sg" x="1687" y="530" width="120" height="100"/>
108 </children> 108 </children>
109 <children xmi:type="notation:Node" xmi:id="_jP6FkKA6EeuqkpDnuik1sg" type="2003" element="_jPpm4KA6EeuqkpDnuik1sg"> 109 <children xmi:type="notation:Node" xmi:id="_jP6FkKA6EeuqkpDnuik1sg" type="2003" element="_jPpm4KA6EeuqkpDnuik1sg">
110 <children xmi:type="notation:Node" xmi:id="_jP6soKA6EeuqkpDnuik1sg" type="5007"/> 110 <children xmi:type="notation:Node" xmi:id="_jP6soKA6EeuqkpDnuik1sg" type="5007"/>
@@ -113,7 +113,7 @@
113 <styles xmi:type="notation:FilteringStyle" xmi:id="_jP6so6A6EeuqkpDnuik1sg"/> 113 <styles xmi:type="notation:FilteringStyle" xmi:id="_jP6so6A6EeuqkpDnuik1sg"/>
114 </children> 114 </children>
115 <styles xmi:type="notation:ShapeStyle" xmi:id="_jP6FkaA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 115 <styles xmi:type="notation:ShapeStyle" xmi:id="_jP6FkaA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
116 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jP6FkqA6EeuqkpDnuik1sg" x="1356" y="332" width="120" height="100"/> 116 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jP6FkqA6EeuqkpDnuik1sg" x="1512" y="332" width="120" height="100"/>
117 </children> 117 </children>
118 <children xmi:type="notation:Node" xmi:id="_xsq_MKA8EeuqkpDnuik1sg" type="2003" element="_xsYrUKA8EeuqkpDnuik1sg"> 118 <children xmi:type="notation:Node" xmi:id="_xsq_MKA8EeuqkpDnuik1sg" type="2003" element="_xsYrUKA8EeuqkpDnuik1sg">
119 <children xmi:type="notation:Node" xmi:id="_xsrmQKA8EeuqkpDnuik1sg" type="5007"/> 119 <children xmi:type="notation:Node" xmi:id="_xsrmQKA8EeuqkpDnuik1sg" type="5007"/>
@@ -219,7 +219,7 @@
219 <styles xmi:type="notation:FilteringStyle" xmi:id="_Kw_WM9bNEeuymriYTNxK2g"/> 219 <styles xmi:type="notation:FilteringStyle" xmi:id="_Kw_WM9bNEeuymriYTNxK2g"/>
220 </children> 220 </children>
221 <styles xmi:type="notation:ShapeStyle" xmi:id="_Kw-vIdbNEeuymriYTNxK2g" fontName="Noto Sans" fontHeight="8"/> 221 <styles xmi:type="notation:ShapeStyle" xmi:id="_Kw-vIdbNEeuymriYTNxK2g" fontName="Noto Sans" fontHeight="8"/>
222 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kw-vItbNEeuymriYTNxK2g" x="1109" y="176" width="120" height="100"/> 222 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kw-vItbNEeuymriYTNxK2g" x="1260" y="176" width="120" height="100"/>
223 </children> 223 </children>
224 <children xmi:type="notation:Node" xmi:id="_pdJrwAGyEey7cfH5K6RyCw" type="2003" element="_pcXBkAGyEey7cfH5K6RyCw"> 224 <children xmi:type="notation:Node" xmi:id="_pdJrwAGyEey7cfH5K6RyCw" type="2003" element="_pcXBkAGyEey7cfH5K6RyCw">
225 <children xmi:type="notation:Node" xmi:id="_pdOkQAGyEey7cfH5K6RyCw" type="5007"/> 225 <children xmi:type="notation:Node" xmi:id="_pdOkQAGyEey7cfH5K6RyCw" type="5007"/>
@@ -241,7 +241,7 @@
241 <styles xmi:type="notation:FilteringStyle" xmi:id="_A9eK0irZEeyyC-O0_LlY9w"/> 241 <styles xmi:type="notation:FilteringStyle" xmi:id="_A9eK0irZEeyyC-O0_LlY9w"/>
242 </children> 242 </children>
243 <styles xmi:type="notation:ShapeStyle" xmi:id="_A9YrQSrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/> 243 <styles xmi:type="notation:ShapeStyle" xmi:id="_A9YrQSrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/>
244 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_A9YrQirZEeyyC-O0_LlY9w" x="1869" y="530" width="148" height="100"/> 244 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_A9YrQirZEeyyC-O0_LlY9w" x="2025" y="530" width="148" height="100"/>
245 </children> 245 </children>
246 <children xmi:type="notation:Node" xmi:id="_N0FQ4CrZEeyyC-O0_LlY9w" type="2003" element="_NzpMACrZEeyyC-O0_LlY9w"> 246 <children xmi:type="notation:Node" xmi:id="_N0FQ4CrZEeyyC-O0_LlY9w" type="2003" element="_NzpMACrZEeyyC-O0_LlY9w">
247 <children xmi:type="notation:Node" xmi:id="_N0F38CrZEeyyC-O0_LlY9w" type="5007"/> 247 <children xmi:type="notation:Node" xmi:id="_N0F38CrZEeyyC-O0_LlY9w" type="5007"/>
@@ -250,7 +250,7 @@
250 <styles xmi:type="notation:FilteringStyle" xmi:id="_N0F38yrZEeyyC-O0_LlY9w"/> 250 <styles xmi:type="notation:FilteringStyle" xmi:id="_N0F38yrZEeyyC-O0_LlY9w"/>
251 </children> 251 </children>
252 <styles xmi:type="notation:ShapeStyle" xmi:id="_N0FQ4SrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/> 252 <styles xmi:type="notation:ShapeStyle" xmi:id="_N0FQ4SrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/>
253 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_N0FQ4irZEeyyC-O0_LlY9w" x="2136" y="716" width="132" height="100"/> 253 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_N0FQ4irZEeyyC-O0_LlY9w" x="2292" y="716" width="132" height="100"/>
254 </children> 254 </children>
255 <children xmi:type="notation:Node" xmi:id="_jzknACrZEeyyC-O0_LlY9w" type="2003" element="_jzRFACrZEeyyC-O0_LlY9w"> 255 <children xmi:type="notation:Node" xmi:id="_jzknACrZEeyyC-O0_LlY9w" type="2003" element="_jzRFACrZEeyyC-O0_LlY9w">
256 <children xmi:type="notation:Node" xmi:id="_jzknAyrZEeyyC-O0_LlY9w" type="5007"/> 256 <children xmi:type="notation:Node" xmi:id="_jzknAyrZEeyyC-O0_LlY9w" type="5007"/>
@@ -259,7 +259,7 @@
259 <styles xmi:type="notation:FilteringStyle" xmi:id="_jzknBirZEeyyC-O0_LlY9w"/> 259 <styles xmi:type="notation:FilteringStyle" xmi:id="_jzknBirZEeyyC-O0_LlY9w"/>
260 </children> 260 </children>
261 <styles xmi:type="notation:ShapeStyle" xmi:id="_jzknASrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/> 261 <styles xmi:type="notation:ShapeStyle" xmi:id="_jzknASrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/>
262 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jzknAirZEeyyC-O0_LlY9w" x="2136" y="956" width="120" height="100"/> 262 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jzknAirZEeyyC-O0_LlY9w" x="2292" y="956" width="120" height="100"/>
263 </children> 263 </children>
264 <children xmi:type="notation:Node" xmi:id="_re7JICrZEeyyC-O0_LlY9w" type="2003" element="_remZACrZEeyyC-O0_LlY9w"> 264 <children xmi:type="notation:Node" xmi:id="_re7JICrZEeyyC-O0_LlY9w" type="2003" element="_remZACrZEeyyC-O0_LlY9w">
265 <children xmi:type="notation:Node" xmi:id="_re7JIyrZEeyyC-O0_LlY9w" type="5007"/> 265 <children xmi:type="notation:Node" xmi:id="_re7JIyrZEeyyC-O0_LlY9w" type="5007"/>
@@ -268,32 +268,7 @@
268 <styles xmi:type="notation:FilteringStyle" xmi:id="_re7JJirZEeyyC-O0_LlY9w"/> 268 <styles xmi:type="notation:FilteringStyle" xmi:id="_re7JJirZEeyyC-O0_LlY9w"/>
269 </children> 269 </children>
270 <styles xmi:type="notation:ShapeStyle" xmi:id="_re7JISrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/> 270 <styles xmi:type="notation:ShapeStyle" xmi:id="_re7JISrZEeyyC-O0_LlY9w" fontName="Segoe UI" fontHeight="8"/>
271 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_re7JIirZEeyyC-O0_LlY9w" x="2142" y="1124" width="120" height="100"/> 271 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_re7JIirZEeyyC-O0_LlY9w" x="2298" y="1124" width="120" height="100"/>
272 </children>
273 <children xmi:type="notation:Node" xmi:id="_eKvl8BEKEe2AArBmfNpEZA" visible="false" type="2003" element="_eKVWQBEKEe2AArBmfNpEZA">
274 <children xmi:type="notation:Node" xmi:id="_eKwNABEKEe2AArBmfNpEZA" type="5007"/>
275 <children xmi:type="notation:Node" xmi:id="_eKwNAREKEe2AArBmfNpEZA" type="7004">
276 <children xmi:type="notation:Node" xmi:id="_ftnt8BEKEe2AArBmfNpEZA" visible="false" type="3010" element="_fs9moBEKEe2AArBmfNpEZA">
277 <styles xmi:type="notation:FontStyle" xmi:id="_ftnt8REKEe2AArBmfNpEZA" fontName="Noto Sans" fontHeight="8"/>
278 <layoutConstraint xmi:type="notation:Location" xmi:id="_ftnt8hEKEe2AArBmfNpEZA"/>
279 </children>
280 <children xmi:type="notation:Node" xmi:id="_gPRpgBEKEe2AArBmfNpEZA" visible="false" type="3010" element="_gO3Z0BEKEe2AArBmfNpEZA">
281 <styles xmi:type="notation:FontStyle" xmi:id="_gPRpgREKEe2AArBmfNpEZA" fontName="Noto Sans" fontHeight="8"/>
282 <layoutConstraint xmi:type="notation:Location" xmi:id="_gPRpghEKEe2AArBmfNpEZA"/>
283 </children>
284 <children xmi:type="notation:Node" xmi:id="_gppRUBEKEe2AArBmfNpEZA" visible="false" type="3010" element="_gpdEEBEKEe2AArBmfNpEZA">
285 <styles xmi:type="notation:FontStyle" xmi:id="_gppRUREKEe2AArBmfNpEZA" fontName="Noto Sans" fontHeight="8"/>
286 <layoutConstraint xmi:type="notation:Location" xmi:id="_gppRUhEKEe2AArBmfNpEZA"/>
287 </children>
288 <children xmi:type="notation:Node" xmi:id="_uvSwUF4MEe2m7IaHDkh2Xg" visible="false" type="3010" element="_uumz0F4MEe2m7IaHDkh2Xg">
289 <styles xmi:type="notation:FontStyle" xmi:id="_uvSwUV4MEe2m7IaHDkh2Xg" fontName="Noto Sans" fontHeight="8"/>
290 <layoutConstraint xmi:type="notation:Location" xmi:id="_uvSwUl4MEe2m7IaHDkh2Xg"/>
291 </children>
292 <styles xmi:type="notation:SortingStyle" xmi:id="_eKwNAhEKEe2AArBmfNpEZA"/>
293 <styles xmi:type="notation:FilteringStyle" xmi:id="_eKwNAxEKEe2AArBmfNpEZA"/>
294 </children>
295 <styles xmi:type="notation:ShapeStyle" xmi:id="_eKvl8REKEe2AArBmfNpEZA" fontName="Noto Sans" fontHeight="8"/>
296 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eKvl8hEKEe2AArBmfNpEZA" x="1308" y="1280" width="120" height="100"/>
297 </children> 272 </children>
298 <children xmi:type="notation:Node" xmi:id="_xp1icDNlEe2fD4dIhR_vzA" type="2003" element="_xpDfUDNlEe2fD4dIhR_vzA"> 273 <children xmi:type="notation:Node" xmi:id="_xp1icDNlEe2fD4dIhR_vzA" type="2003" element="_xpDfUDNlEe2fD4dIhR_vzA">
299 <children xmi:type="notation:Node" xmi:id="_xp2JgDNlEe2fD4dIhR_vzA" type="5007"/> 274 <children xmi:type="notation:Node" xmi:id="_xp2JgDNlEe2fD4dIhR_vzA" type="5007"/>
@@ -327,7 +302,7 @@
327 <styles xmi:type="notation:FilteringStyle" xmi:id="_783To19mEe2rXNsIDUvqhw"/> 302 <styles xmi:type="notation:FilteringStyle" xmi:id="_783To19mEe2rXNsIDUvqhw"/>
328 </children> 303 </children>
329 <styles xmi:type="notation:ShapeStyle" xmi:id="_782skV9mEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 304 <styles xmi:type="notation:ShapeStyle" xmi:id="_782skV9mEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
330 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_782skl9mEe2rXNsIDUvqhw" x="1734" y="716" width="132" height="100"/> 305 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_782skl9mEe2rXNsIDUvqhw" x="1890" y="716" width="132" height="100"/>
331 </children> 306 </children>
332 <children xmi:type="notation:Node" xmi:id="_rsftYF9vEe2rXNsIDUvqhw" type="2003" element="_rsVVUF9vEe2rXNsIDUvqhw"> 307 <children xmi:type="notation:Node" xmi:id="_rsftYF9vEe2rXNsIDUvqhw" type="2003" element="_rsVVUF9vEe2rXNsIDUvqhw">
333 <children xmi:type="notation:Node" xmi:id="_rsgUcF9vEe2rXNsIDUvqhw" type="5007"/> 308 <children xmi:type="notation:Node" xmi:id="_rsgUcF9vEe2rXNsIDUvqhw" type="5007"/>
@@ -336,7 +311,7 @@
336 <styles xmi:type="notation:FilteringStyle" xmi:id="_rsgUc19vEe2rXNsIDUvqhw"/> 311 <styles xmi:type="notation:FilteringStyle" xmi:id="_rsgUc19vEe2rXNsIDUvqhw"/>
337 </children> 312 </children>
338 <styles xmi:type="notation:ShapeStyle" xmi:id="_rsftYV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 313 <styles xmi:type="notation:ShapeStyle" xmi:id="_rsftYV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
339 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rsftYl9vEe2rXNsIDUvqhw" x="1968" y="956" width="120" height="100"/> 314 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rsftYl9vEe2rXNsIDUvqhw" x="2124" y="956" width="120" height="100"/>
340 </children> 315 </children>
341 <children xmi:type="notation:Node" xmi:id="_thrGUF9vEe2rXNsIDUvqhw" type="2003" element="_thaAkF9vEe2rXNsIDUvqhw"> 316 <children xmi:type="notation:Node" xmi:id="_thrGUF9vEe2rXNsIDUvqhw" type="2003" element="_thaAkF9vEe2rXNsIDUvqhw">
342 <children xmi:type="notation:Node" xmi:id="_thrGU19vEe2rXNsIDUvqhw" type="5007"/> 317 <children xmi:type="notation:Node" xmi:id="_thrGU19vEe2rXNsIDUvqhw" type="5007"/>
@@ -345,7 +320,7 @@
345 <styles xmi:type="notation:FilteringStyle" xmi:id="_thrGVl9vEe2rXNsIDUvqhw"/> 320 <styles xmi:type="notation:FilteringStyle" xmi:id="_thrGVl9vEe2rXNsIDUvqhw"/>
346 </children> 321 </children>
347 <styles xmi:type="notation:ShapeStyle" xmi:id="_thrGUV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 322 <styles xmi:type="notation:ShapeStyle" xmi:id="_thrGUV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
348 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_thrGUl9vEe2rXNsIDUvqhw" x="1746" y="1124" width="120" height="100"/> 323 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_thrGUl9vEe2rXNsIDUvqhw" x="1902" y="1124" width="120" height="100"/>
349 </children> 324 </children>
350 <children xmi:type="notation:Node" xmi:id="_uqERwF9vEe2rXNsIDUvqhw" type="2003" element="_up7H0F9vEe2rXNsIDUvqhw"> 325 <children xmi:type="notation:Node" xmi:id="_uqERwF9vEe2rXNsIDUvqhw" type="2003" element="_up7H0F9vEe2rXNsIDUvqhw">
351 <children xmi:type="notation:Node" xmi:id="_uqERw19vEe2rXNsIDUvqhw" type="5007"/> 326 <children xmi:type="notation:Node" xmi:id="_uqERw19vEe2rXNsIDUvqhw" type="5007"/>
@@ -354,7 +329,7 @@
354 <styles xmi:type="notation:FilteringStyle" xmi:id="_uqE40l9vEe2rXNsIDUvqhw"/> 329 <styles xmi:type="notation:FilteringStyle" xmi:id="_uqE40l9vEe2rXNsIDUvqhw"/>
355 </children> 330 </children>
356 <styles xmi:type="notation:ShapeStyle" xmi:id="_uqERwV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 331 <styles xmi:type="notation:ShapeStyle" xmi:id="_uqERwV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
357 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uqERwl9vEe2rXNsIDUvqhw" x="1968" y="1124" width="120" height="100"/> 332 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uqERwl9vEe2rXNsIDUvqhw" x="2124" y="1124" width="120" height="100"/>
358 </children> 333 </children>
359 <children xmi:type="notation:Node" xmi:id="_1HBuIF9vEe2rXNsIDUvqhw" type="2003" element="_1G5LQF9vEe2rXNsIDUvqhw"> 334 <children xmi:type="notation:Node" xmi:id="_1HBuIF9vEe2rXNsIDUvqhw" type="2003" element="_1G5LQF9vEe2rXNsIDUvqhw">
360 <children xmi:type="notation:Node" xmi:id="_1HBuI19vEe2rXNsIDUvqhw" type="5007"/> 335 <children xmi:type="notation:Node" xmi:id="_1HBuI19vEe2rXNsIDUvqhw" type="5007"/>
@@ -363,7 +338,7 @@
363 <styles xmi:type="notation:FilteringStyle" xmi:id="_1HBuJl9vEe2rXNsIDUvqhw"/> 338 <styles xmi:type="notation:FilteringStyle" xmi:id="_1HBuJl9vEe2rXNsIDUvqhw"/>
364 </children> 339 </children>
365 <styles xmi:type="notation:ShapeStyle" xmi:id="_1HBuIV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 340 <styles xmi:type="notation:ShapeStyle" xmi:id="_1HBuIV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
366 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1HBuIl9vEe2rXNsIDUvqhw" x="1531" y="956" width="135"/> 341 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1HBuIl9vEe2rXNsIDUvqhw" x="1687" y="956" width="135"/>
367 </children> 342 </children>
368 <children xmi:type="notation:Node" xmi:id="_286RsF9vEe2rXNsIDUvqhw" type="2003" element="_28xu0F9vEe2rXNsIDUvqhw"> 343 <children xmi:type="notation:Node" xmi:id="_286RsF9vEe2rXNsIDUvqhw" type="2003" element="_28xu0F9vEe2rXNsIDUvqhw">
369 <children xmi:type="notation:Node" xmi:id="_2864wF9vEe2rXNsIDUvqhw" type="5007"/> 344 <children xmi:type="notation:Node" xmi:id="_2864wF9vEe2rXNsIDUvqhw" type="5007"/>
@@ -372,7 +347,7 @@
372 <styles xmi:type="notation:FilteringStyle" xmi:id="_2864w19vEe2rXNsIDUvqhw"/> 347 <styles xmi:type="notation:FilteringStyle" xmi:id="_2864w19vEe2rXNsIDUvqhw"/>
373 </children> 348 </children>
374 <styles xmi:type="notation:ShapeStyle" xmi:id="_286RsV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 349 <styles xmi:type="notation:ShapeStyle" xmi:id="_286RsV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
375 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_286Rsl9vEe2rXNsIDUvqhw" x="1308" y="956"/> 350 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_286Rsl9vEe2rXNsIDUvqhw" x="1464" y="956"/>
376 </children> 351 </children>
377 <children xmi:type="notation:Node" xmi:id="_HyypsF9wEe2rXNsIDUvqhw" type="2003" element="_HynqkF9wEe2rXNsIDUvqhw"> 352 <children xmi:type="notation:Node" xmi:id="_HyypsF9wEe2rXNsIDUvqhw" type="2003" element="_HynqkF9wEe2rXNsIDUvqhw">
378 <children xmi:type="notation:Node" xmi:id="_Hyyps19wEe2rXNsIDUvqhw" type="5007"/> 353 <children xmi:type="notation:Node" xmi:id="_Hyyps19wEe2rXNsIDUvqhw" type="5007"/>
@@ -381,7 +356,7 @@
381 <styles xmi:type="notation:FilteringStyle" xmi:id="_Hyyptl9wEe2rXNsIDUvqhw"/> 356 <styles xmi:type="notation:FilteringStyle" xmi:id="_Hyyptl9wEe2rXNsIDUvqhw"/>
382 </children> 357 </children>
383 <styles xmi:type="notation:ShapeStyle" xmi:id="_HyypsV9wEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 358 <styles xmi:type="notation:ShapeStyle" xmi:id="_HyypsV9wEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
384 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Hyypsl9wEe2rXNsIDUvqhw" x="1863" y="1280"/> 359 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Hyypsl9wEe2rXNsIDUvqhw" x="2019" y="1280"/>
385 </children> 360 </children>
386 <children xmi:type="notation:Node" xmi:id="_dzfLYGTvEe2qdtyPWAtoxA" type="2003" element="_dzVaYGTvEe2qdtyPWAtoxA"> 361 <children xmi:type="notation:Node" xmi:id="_dzfLYGTvEe2qdtyPWAtoxA" type="2003" element="_dzVaYGTvEe2qdtyPWAtoxA">
387 <children xmi:type="notation:Node" xmi:id="_dzfLY2TvEe2qdtyPWAtoxA" type="5007"/> 362 <children xmi:type="notation:Node" xmi:id="_dzfLY2TvEe2qdtyPWAtoxA" type="5007"/>
@@ -450,7 +425,16 @@
450 <styles xmi:type="notation:FilteringStyle" xmi:id="_uudkc89kEe6T2u19X9cqmQ"/> 425 <styles xmi:type="notation:FilteringStyle" xmi:id="_uudkc89kEe6T2u19X9cqmQ"/>
451 </children> 426 </children>
452 <styles xmi:type="notation:ShapeStyle" xmi:id="_uuYr8c9kEe6T2u19X9cqmQ" fontName="Noto Sans" fontHeight="8"/> 427 <styles xmi:type="notation:ShapeStyle" xmi:id="_uuYr8c9kEe6T2u19X9cqmQ" fontName="Noto Sans" fontHeight="8"/>
453 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uuYr8s9kEe6T2u19X9cqmQ" x="1174" y="716" width="137" height="100"/> 428 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uuYr8s9kEe6T2u19X9cqmQ" x="1330" y="716" width="137" height="100"/>
429 </children>
430 <children xmi:type="notation:Node" xmi:id="_jlSckNsVEe6c9ehqpe3s7A" type="2003" element="_jjj-QNsVEe6c9ehqpe3s7A">
431 <children xmi:type="notation:Node" xmi:id="_jlWuANsVEe6c9ehqpe3s7A" type="5007"/>
432 <children xmi:type="notation:Node" xmi:id="_jlXVENsVEe6c9ehqpe3s7A" type="7004">
433 <styles xmi:type="notation:SortingStyle" xmi:id="_jlXVEdsVEe6c9ehqpe3s7A"/>
434 <styles xmi:type="notation:FilteringStyle" xmi:id="_jlXVEtsVEe6c9ehqpe3s7A"/>
435 </children>
436 <styles xmi:type="notation:ShapeStyle" xmi:id="_jlSckdsVEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/>
437 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jlScktsVEe6c9ehqpe3s7A" x="1128" y="716" width="147" height="100"/>
454 </children> 438 </children>
455 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/> 439 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/>
456 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg"> 440 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg">
@@ -695,17 +679,17 @@
695 </edges> 679 </edges>
696 <edges xmi:type="notation:Edge" xmi:id="_zKMY0AGyEey7cfH5K6RyCw" type="4001" element="_zJpmRgGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_xsq_MKA8EeuqkpDnuik1sg"> 680 <edges xmi:type="notation:Edge" xmi:id="_zKMY0AGyEey7cfH5K6RyCw" type="4001" element="_zJpmRgGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_xsq_MKA8EeuqkpDnuik1sg">
697 <children xmi:type="notation:Node" xmi:id="_zKM_4AGyEey7cfH5K6RyCw" type="6001"> 681 <children xmi:type="notation:Node" xmi:id="_zKM_4AGyEey7cfH5K6RyCw" type="6001">
698 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4QGyEey7cfH5K6RyCw" x="-397" y="-12"/> 682 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4QGyEey7cfH5K6RyCw" x="-425" y="-12"/>
699 </children> 683 </children>
700 <children xmi:type="notation:Node" xmi:id="_zKM_4gGyEey7cfH5K6RyCw" type="6002"> 684 <children xmi:type="notation:Node" xmi:id="_zKM_4gGyEey7cfH5K6RyCw" type="6002">
701 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4wGyEey7cfH5K6RyCw" x="-43"/> 685 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4wGyEey7cfH5K6RyCw" x="-71"/>
702 </children> 686 </children>
703 <children xmi:type="notation:Node" xmi:id="_zKM_5AGyEey7cfH5K6RyCw" type="6003"> 687 <children xmi:type="notation:Node" xmi:id="_zKM_5AGyEey7cfH5K6RyCw" type="6003">
704 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_5QGyEey7cfH5K6RyCw" x="-88" y="10"/> 688 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_5QGyEey7cfH5K6RyCw" x="-116" y="10"/>
705 </children> 689 </children>
706 <styles xmi:type="notation:ConnectorStyle" xmi:id="_zKMY0QGyEey7cfH5K6RyCw" routing="Rectilinear"/> 690 <styles xmi:type="notation:ConnectorStyle" xmi:id="_zKMY0QGyEey7cfH5K6RyCw" routing="Rectilinear"/>
707 <styles xmi:type="notation:FontStyle" xmi:id="_zKMY0gGyEey7cfH5K6RyCw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 691 <styles xmi:type="notation:FontStyle" xmi:id="_zKMY0gGyEey7cfH5K6RyCw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
708 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zKMY0wGyEey7cfH5K6RyCw" points="[-21, -3, -828, 120]$[-21, -51, -828, 72]$[843, -51, 36, 72]$[843, -97, 36, 26]"/> 692 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zKMY0wGyEey7cfH5K6RyCw" points="[-21, -3, -828, 120]$[-21, -23, -828, 100]$[843, -23, 36, 100]$[843, -97, 36, 26]"/>
709 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8AGyEey7cfH5K6RyCw" id="(0.4576271186440678,0.030612244897959183)"/> 693 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8AGyEey7cfH5K6RyCw" id="(0.4576271186440678,0.030612244897959183)"/>
710 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8QGyEey7cfH5K6RyCw" id="(0.0,0.7346938775510204)"/> 694 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8QGyEey7cfH5K6RyCw" id="(0.0,0.7346938775510204)"/>
711 </edges> 695 </edges>
@@ -1207,17 +1191,17 @@
1207 </edges> 1191 </edges>
1208 <edges xmi:type="notation:Edge" xmi:id="_iXIY4GTzEe2qdtyPWAtoxA" type="4001" element="_iWzpAmTzEe2qdtyPWAtoxA" source="_QKLK0KA6EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> 1192 <edges xmi:type="notation:Edge" xmi:id="_iXIY4GTzEe2qdtyPWAtoxA" type="4001" element="_iWzpAmTzEe2qdtyPWAtoxA" source="_QKLK0KA6EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA">
1209 <children xmi:type="notation:Node" xmi:id="_iXIY5GTzEe2qdtyPWAtoxA" type="6001"> 1193 <children xmi:type="notation:Node" xmi:id="_iXIY5GTzEe2qdtyPWAtoxA" type="6001">
1210 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY5WTzEe2qdtyPWAtoxA" x="-396" y="18"/> 1194 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY5WTzEe2qdtyPWAtoxA" x="-318" y="18"/>
1211 </children> 1195 </children>
1212 <children xmi:type="notation:Node" xmi:id="_iXIY5mTzEe2qdtyPWAtoxA" type="6002"> 1196 <children xmi:type="notation:Node" xmi:id="_iXIY5mTzEe2qdtyPWAtoxA" type="6002">
1213 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY52TzEe2qdtyPWAtoxA" x="235" y="-10"/> 1197 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY52TzEe2qdtyPWAtoxA" x="368" y="-10"/>
1214 </children> 1198 </children>
1215 <children xmi:type="notation:Node" xmi:id="_iXIY6GTzEe2qdtyPWAtoxA" type="6003"> 1199 <children xmi:type="notation:Node" xmi:id="_iXIY6GTzEe2qdtyPWAtoxA" type="6003">
1216 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY6WTzEe2qdtyPWAtoxA" x="-14" y="10"/> 1200 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iXIY6WTzEe2qdtyPWAtoxA" x="9" y="10"/>
1217 </children> 1201 </children>
1218 <styles xmi:type="notation:ConnectorStyle" xmi:id="_iXIY4WTzEe2qdtyPWAtoxA" routing="Rectilinear"/> 1202 <styles xmi:type="notation:ConnectorStyle" xmi:id="_iXIY4WTzEe2qdtyPWAtoxA" routing="Rectilinear"/>
1219 <styles xmi:type="notation:FontStyle" xmi:id="_iXIY4mTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 1203 <styles xmi:type="notation:FontStyle" xmi:id="_iXIY4mTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
1220 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_iXIY42TzEe2qdtyPWAtoxA" points="[-72, 48, 975, 5]$[-988, 48, 59, 5]"/> 1204 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_iXIY42TzEe2qdtyPWAtoxA" points="[-72, 48, 1131, 5]$[-1144, 48, 59, 5]"/>
1221 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iXIY6mTzEe2qdtyPWAtoxA" id="(0.6101694915254238,0.0)"/> 1205 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iXIY6mTzEe2qdtyPWAtoxA" id="(0.6101694915254238,0.0)"/>
1222 </edges> 1206 </edges>
1223 <edges xmi:type="notation:Edge" xmi:id="_q7DhwGTzEe2qdtyPWAtoxA" type="4001" element="_q604amTzEe2qdtyPWAtoxA" source="_zaq8oKA9EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> 1207 <edges xmi:type="notation:Edge" xmi:id="_q7DhwGTzEe2qdtyPWAtoxA" type="4001" element="_q604amTzEe2qdtyPWAtoxA" source="_zaq8oKA9EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA">
@@ -1254,17 +1238,17 @@
1254 </edges> 1238 </edges>
1255 <edges xmi:type="notation:Edge" xmi:id="_UVB0MMBeEe6Mo_-4--GvQg" type="4001" element="_UU0Y5cBeEe6Mo_-4--GvQg" source="_GTtOgMBeEe6Mo_-4--GvQg" target="_e73WIKA9EeuqkpDnuik1sg"> 1239 <edges xmi:type="notation:Edge" xmi:id="_UVB0MMBeEe6Mo_-4--GvQg" type="4001" element="_UU0Y5cBeEe6Mo_-4--GvQg" source="_GTtOgMBeEe6Mo_-4--GvQg" target="_e73WIKA9EeuqkpDnuik1sg">
1256 <children xmi:type="notation:Node" xmi:id="_UVB0NMBeEe6Mo_-4--GvQg" type="6001"> 1240 <children xmi:type="notation:Node" xmi:id="_UVB0NMBeEe6Mo_-4--GvQg" type="6001">
1257 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0NcBeEe6Mo_-4--GvQg" y="-10"/> 1241 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0NcBeEe6Mo_-4--GvQg" x="12" y="-10"/>
1258 </children> 1242 </children>
1259 <children xmi:type="notation:Node" xmi:id="_UVB0NsBeEe6Mo_-4--GvQg" type="6002"> 1243 <children xmi:type="notation:Node" xmi:id="_UVB0NsBeEe6Mo_-4--GvQg" type="6002">
1260 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0N8BeEe6Mo_-4--GvQg" y="10"/> 1244 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0N8BeEe6Mo_-4--GvQg" x="12" y="10"/>
1261 </children> 1245 </children>
1262 <children xmi:type="notation:Node" xmi:id="_UVB0OMBeEe6Mo_-4--GvQg" type="6003"> 1246 <children xmi:type="notation:Node" xmi:id="_UVB0OMBeEe6Mo_-4--GvQg" type="6003">
1263 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0OcBeEe6Mo_-4--GvQg" y="10"/> 1247 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UVB0OcBeEe6Mo_-4--GvQg" x="12" y="10"/>
1264 </children> 1248 </children>
1265 <styles xmi:type="notation:ConnectorStyle" xmi:id="_UVB0McBeEe6Mo_-4--GvQg" routing="Tree"/> 1249 <styles xmi:type="notation:ConnectorStyle" xmi:id="_UVB0McBeEe6Mo_-4--GvQg" routing="Tree"/>
1266 <styles xmi:type="notation:FontStyle" xmi:id="_UVB0MsBeEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/> 1250 <styles xmi:type="notation:FontStyle" xmi:id="_UVB0MsBeEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
1267 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UVB0M8BeEe6Mo_-4--GvQg" points="[0, 0, -706, 180]$[706, -180, 0, 0]"/> 1251 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UVB0M8BeEe6Mo_-4--GvQg" points="[0, -3, -808, 192]$[0, -47, -808, 148]$[809, -47, 1, 148]$[809, -97, 1, 98]"/>
1268 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_UVCbQMBeEe6Mo_-4--GvQg" id="(0.635593220338983,0.030612244897959183)"/> 1252 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_UVCbQMBeEe6Mo_-4--GvQg" id="(0.635593220338983,0.030612244897959183)"/>
1269 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_UVCbQcBeEe6Mo_-4--GvQg" id="(0.5,0.0)"/> 1253 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_UVCbQcBeEe6Mo_-4--GvQg" id="(0.5,0.0)"/>
1270 </edges> 1254 </edges>
@@ -1364,6 +1348,38 @@
1364 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RjiF5s9lEe6T2u19X9cqmQ" id="(0.0,0.5)"/> 1348 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RjiF5s9lEe6T2u19X9cqmQ" id="(0.0,0.5)"/>
1365 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RjiF589lEe6T2u19X9cqmQ" id="(1.0,0.5)"/> 1349 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RjiF589lEe6T2u19X9cqmQ" id="(1.0,0.5)"/>
1366 </edges> 1350 </edges>
1351 <edges xmi:type="notation:Edge" xmi:id="_qBfrANsVEe6c9ehqpe3s7A" type="4001" element="_qAygeNsVEe6c9ehqpe3s7A" source="_jlSckNsVEe6c9ehqpe3s7A" target="_e73WIKA9EeuqkpDnuik1sg">
1352 <children xmi:type="notation:Node" xmi:id="_qBgSENsVEe6c9ehqpe3s7A" type="6001">
1353 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qBgSEdsVEe6c9ehqpe3s7A" y="-10"/>
1354 </children>
1355 <children xmi:type="notation:Node" xmi:id="_qBgSEtsVEe6c9ehqpe3s7A" type="6002">
1356 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qBgSE9sVEe6c9ehqpe3s7A" y="10"/>
1357 </children>
1358 <children xmi:type="notation:Node" xmi:id="_qBgSFNsVEe6c9ehqpe3s7A" type="6003">
1359 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qBgSFdsVEe6c9ehqpe3s7A" y="10"/>
1360 </children>
1361 <styles xmi:type="notation:ConnectorStyle" xmi:id="_qBfrAdsVEe6c9ehqpe3s7A" routing="Tree"/>
1362 <styles xmi:type="notation:FontStyle" xmi:id="_qBfrAtsVEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/>
1363 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qBfrA9sVEe6c9ehqpe3s7A" points="[0, 0, 294, 356]$[-294, -356, 0, 0]"/>
1364 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qBgSFtsVEe6c9ehqpe3s7A" id="(0.31724137931034485,0.01020408163265306)"/>
1365 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qBgSF9sVEe6c9ehqpe3s7A" id="(0.5,0.0)"/>
1366 </edges>
1367 <edges xmi:type="notation:Edge" xmi:id="_EJdSYNsWEe6c9ehqpe3s7A" type="4001" element="_EI0ZOdsWEe6c9ehqpe3s7A" source="_jlSckNsVEe6c9ehqpe3s7A" target="_RzZA0KA5EeuqkpDnuik1sg">
1368 <children xmi:type="notation:Node" xmi:id="_EJd5cNsWEe6c9ehqpe3s7A" type="6001">
1369 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EJd5cdsWEe6c9ehqpe3s7A" y="-10"/>
1370 </children>
1371 <children xmi:type="notation:Node" xmi:id="_EJd5ctsWEe6c9ehqpe3s7A" type="6002">
1372 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EJd5c9sWEe6c9ehqpe3s7A" y="10"/>
1373 </children>
1374 <children xmi:type="notation:Node" xmi:id="_EJd5dNsWEe6c9ehqpe3s7A" type="6003">
1375 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EJd5ddsWEe6c9ehqpe3s7A" y="10"/>
1376 </children>
1377 <styles xmi:type="notation:ConnectorStyle" xmi:id="_EJdSYdsWEe6c9ehqpe3s7A" routing="Tree"/>
1378 <styles xmi:type="notation:FontStyle" xmi:id="_EJdSYtsWEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/>
1379 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_EJdSY9sWEe6c9ehqpe3s7A" points="[0, 0, 115, 598]$[-115, -598, 0, 0]"/>
1380 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_EJd5dtsWEe6c9ehqpe3s7A" id="(0.6068965517241379,0.030612244897959183)"/>
1381 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_EJd5d9sWEe6c9ehqpe3s7A" id="(0.5,0.5)"/>
1382 </edges>
1367 </data> 1383 </data>
1368 </ownedAnnotationEntries> 1384 </ownedAnnotationEntries>
1369 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY"> 1385 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY">
@@ -1471,7 +1487,7 @@
1471 </ownedStyle> 1487 </ownedStyle>
1472 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 1488 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
1473 </ownedDiagramElements> 1489 </ownedDiagramElements>
1474 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_RzK-YKA5EeuqkpDnuik1sg" name="NamedElement" tooltipText="" incomingEdges="_m-6OTNXtEeuF_d0WEhR3Xw _Smi9eNbNEeuymriYTNxK2g _WUsgHCrcEeyyC-O0_LlY9w _-OYJtGTvEe2qdtyPWAtoxA" width="12" height="10"> 1490 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_RzK-YKA5EeuqkpDnuik1sg" name="NamedElement" tooltipText="" incomingEdges="_m-6OTNXtEeuF_d0WEhR3Xw _Smi9eNbNEeuymriYTNxK2g _WUsgHCrcEeyyC-O0_LlY9w _-OYJtGTvEe2qdtyPWAtoxA _EI0ZOdsWEe6c9ehqpe3s7A" width="12" height="10">
1475 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NamedElement"/> 1491 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NamedElement"/>
1476 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NamedElement"/> 1492 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NamedElement"/>
1477 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1493 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -1593,7 +1609,7 @@
1593 </ownedStyle> 1609 </ownedStyle>
1594 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> 1610 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
1595 </ownedDiagramElements> 1611 </ownedDiagramElements>
1596 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_e7ydoKA9EeuqkpDnuik1sg" name="Statement" tooltipText="" incomingEdges="_hU64ZqA9EeuqkpDnuik1sg _mzziwKA9EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _vdptgqA9EeuqkpDnuik1sg _WX_5w9bGEeuymriYTNxK2g _s68oXAGyEey7cfH5K6RyCw _UU0Y5cBeEe6Mo_-4--GvQg _8EJzMM9kEe6T2u19X9cqmQ" width="12" height="10"> 1612 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_e7ydoKA9EeuqkpDnuik1sg" name="Statement" tooltipText="" incomingEdges="_hU64ZqA9EeuqkpDnuik1sg _mzziwKA9EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _vdptgqA9EeuqkpDnuik1sg _WX_5w9bGEeuymriYTNxK2g _s68oXAGyEey7cfH5K6RyCw _UU0Y5cBeEe6Mo_-4--GvQg _8EJzMM9kEe6T2u19X9cqmQ _qAygeNsVEe6c9ehqpe3s7A" width="12" height="10">
1597 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/> 1613 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/>
1598 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/> 1614 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/>
1599 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1615 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -2078,50 +2094,6 @@
2078 </ownedStyle> 2094 </ownedStyle>
2079 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 2095 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
2080 </ownedDiagramElements> 2096 </ownedDiagramElements>
2081 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_eKVWQBEKEe2AArBmfNpEZA" name="Modality" visible="false" tooltipText="" width="12" height="10">
2082 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
2083 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
2084 <graphicalFilters xmi:type="diagram:HideFilter" uid="_VqQDoM9lEe6T2u19X9cqmQ"/>
2085 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2086 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2087 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2088 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_eKXLcBEKEe2AArBmfNpEZA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
2089 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/>
2090 </ownedStyle>
2091 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
2092 <ownedElements xmi:type="diagram:DNodeListElement" uid="_fs9moBEKEe2AArBmfNpEZA" name="DEFAULT" visible="false" tooltipText="">
2093 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/DEFAULT"/>
2094 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/DEFAULT"/>
2095 <ownedStyle xmi:type="diagram:BundledImage" uid="_fs-NsBEKEe2AArBmfNpEZA" labelAlignment="LEFT">
2096 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2097 </ownedStyle>
2098 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2099 </ownedElements>
2100 <ownedElements xmi:type="diagram:DNodeListElement" uid="_gO3Z0BEKEe2AArBmfNpEZA" name="MAY" visible="false" tooltipText="">
2101 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
2102 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
2103 <ownedStyle xmi:type="diagram:BundledImage" uid="_gO4A4BEKEe2AArBmfNpEZA" labelAlignment="LEFT">
2104 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2105 </ownedStyle>
2106 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2107 </ownedElements>
2108 <ownedElements xmi:type="diagram:DNodeListElement" uid="_gpdEEBEKEe2AArBmfNpEZA" name="MUST" visible="false" tooltipText="">
2109 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
2110 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
2111 <ownedStyle xmi:type="diagram:BundledImage" uid="_gpdEEREKEe2AArBmfNpEZA" labelAlignment="LEFT">
2112 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2113 </ownedStyle>
2114 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2115 </ownedElements>
2116 <ownedElements xmi:type="diagram:DNodeListElement" uid="_uumz0F4MEe2m7IaHDkh2Xg" name="CURRENT" visible="false" tooltipText="">
2117 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/CURRENT"/>
2118 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/CURRENT"/>
2119 <ownedStyle xmi:type="diagram:BundledImage" uid="_uuna4F4MEe2m7IaHDkh2Xg" labelAlignment="LEFT">
2120 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2121 </ownedStyle>
2122 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2123 </ownedElements>
2124 </ownedDiagramElements>
2125 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_xpDfUDNlEe2fD4dIhR_vzA" name="ReferenceKind" tooltipText="" width="12" height="10"> 2097 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_xpDfUDNlEe2fD4dIhR_vzA" name="ReferenceKind" tooltipText="" width="12" height="10">
2126 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ReferenceKind"/> 2098 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ReferenceKind"/>
2127 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ReferenceKind"/> 2099 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ReferenceKind"/>
@@ -2673,6 +2645,41 @@
2673 </ownedStyle> 2645 </ownedStyle>
2674 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 2646 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
2675 </ownedDiagramElements> 2647 </ownedDiagramElements>
2648 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_jjj-QNsVEe6c9ehqpe3s7A" name="AggregatorDeclaration" tooltipText="" outgoingEdges="_qAygeNsVEe6c9ehqpe3s7A _EI0ZOdsWEe6c9ehqpe3s7A" width="12" height="10">
2649 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2650 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2651 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2652 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2653 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2654 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_jjlMYNsVEe6c9ehqpe3s7A" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
2655 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
2656 </ownedStyle>
2657 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
2658 </ownedDiagramElements>
2659 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_qAygeNsVEe6c9ehqpe3s7A" sourceNode="_jjj-QNsVEe6c9ehqpe3s7A" targetNode="_e7ydoKA9EeuqkpDnuik1sg">
2660 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2661 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2662 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_qAygedsVEe6c9ehqpe3s7A" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
2663 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
2664 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_qAygetsVEe6c9ehqpe3s7A" showIcon="false">
2665 <labelFormat>italic</labelFormat>
2666 </beginLabelStyle>
2667 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_qAyge9sVEe6c9ehqpe3s7A" showIcon="false"/>
2668 </ownedStyle>
2669 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
2670 </ownedDiagramElements>
2671 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_EI0ZOdsWEe6c9ehqpe3s7A" sourceNode="_jjj-QNsVEe6c9ehqpe3s7A" targetNode="_RzK-YKA5EeuqkpDnuik1sg">
2672 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2673 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
2674 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_EI0ZOtsWEe6c9ehqpe3s7A" targetArrow="InputClosedArrow" routingStyle="tree">
2675 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
2676 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_EI0ZO9sWEe6c9ehqpe3s7A" showIcon="false">
2677 <labelFormat>italic</labelFormat>
2678 </beginLabelStyle>
2679 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_EI0ZPNsWEe6c9ehqpe3s7A" showIcon="false"/>
2680 </ownedStyle>
2681 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
2682 </ownedDiagramElements>
2676 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 2683 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
2677 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> 2684 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/>
2678 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 2685 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
@@ -2717,7 +2724,7 @@
2717 <styles xmi:type="notation:FilteringStyle" xmi:id="_bTgeLF3tEe2LuOZzJ_LhLg"/> 2724 <styles xmi:type="notation:FilteringStyle" xmi:id="_bTgeLF3tEe2LuOZzJ_LhLg"/>
2718 </children> 2725 </children>
2719 <styles xmi:type="notation:ShapeStyle" xmi:id="_bTgeJ13tEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2726 <styles xmi:type="notation:ShapeStyle" xmi:id="_bTgeJ13tEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2720 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bTgeKF3tEe2LuOZzJ_LhLg" x="2127" y="168" width="120" height="100"/> 2727 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bTgeKF3tEe2LuOZzJ_LhLg" x="1955" y="168" width="120" height="100"/>
2721 </children> 2728 </children>
2722 <children xmi:type="notation:Node" xmi:id="_meWJcF3uEe2LuOZzJ_LhLg" type="2003" element="_mdrbEF3uEe2LuOZzJ_LhLg"> 2729 <children xmi:type="notation:Node" xmi:id="_meWJcF3uEe2LuOZzJ_LhLg" type="2003" element="_mdrbEF3uEe2LuOZzJ_LhLg">
2723 <children xmi:type="notation:Node" xmi:id="_meWwgF3uEe2LuOZzJ_LhLg" type="5007"/> 2730 <children xmi:type="notation:Node" xmi:id="_meWwgF3uEe2LuOZzJ_LhLg" type="5007"/>
@@ -2768,11 +2775,23 @@
2768 <styles xmi:type="notation:FontStyle" xmi:id="_n5Y5MV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2775 <styles xmi:type="notation:FontStyle" xmi:id="_n5Y5MV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2769 <layoutConstraint xmi:type="notation:Location" xmi:id="_n5Y5Ml3wEe2LuOZzJ_LhLg"/> 2776 <layoutConstraint xmi:type="notation:Location" xmi:id="_n5Y5Ml3wEe2LuOZzJ_LhLg"/>
2770 </children> 2777 </children>
2778 <children xmi:type="notation:Node" xmi:id="_BjWXkNf8Ee66mJJuF_pPGg" type="3010" element="_BiDXENf8Ee66mJJuF_pPGg">
2779 <styles xmi:type="notation:FontStyle" xmi:id="_BjWXkdf8Ee66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/>
2780 <layoutConstraint xmi:type="notation:Location" xmi:id="_BjWXktf8Ee66mJJuF_pPGg"/>
2781 </children>
2782 <children xmi:type="notation:Node" xmi:id="_CG2GMNf8Ee66mJJuF_pPGg" type="3010" element="_CGRecNf8Ee66mJJuF_pPGg">
2783 <styles xmi:type="notation:FontStyle" xmi:id="_CG2GMdf8Ee66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/>
2784 <layoutConstraint xmi:type="notation:Location" xmi:id="_CG2GMtf8Ee66mJJuF_pPGg"/>
2785 </children>
2786 <children xmi:type="notation:Node" xmi:id="_CpQPsNf8Ee66mJJuF_pPGg" type="3010" element="_CopLsNf8Ee66mJJuF_pPGg">
2787 <styles xmi:type="notation:FontStyle" xmi:id="_CpQPsdf8Ee66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/>
2788 <layoutConstraint xmi:type="notation:Location" xmi:id="_CpQPstf8Ee66mJJuF_pPGg"/>
2789 </children>
2771 <styles xmi:type="notation:SortingStyle" xmi:id="_ccRVpV3wEe2LuOZzJ_LhLg"/> 2790 <styles xmi:type="notation:SortingStyle" xmi:id="_ccRVpV3wEe2LuOZzJ_LhLg"/>
2772 <styles xmi:type="notation:FilteringStyle" xmi:id="_ccRVpl3wEe2LuOZzJ_LhLg"/> 2791 <styles xmi:type="notation:FilteringStyle" xmi:id="_ccRVpl3wEe2LuOZzJ_LhLg"/>
2773 </children> 2792 </children>
2774 <styles xmi:type="notation:ShapeStyle" xmi:id="_ccRVoV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2793 <styles xmi:type="notation:ShapeStyle" xmi:id="_ccRVoV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2775 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccRVol3wEe2LuOZzJ_LhLg" x="1788" y="450" width="120" height="117"/> 2794 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccRVol3wEe2LuOZzJ_LhLg" x="1616" y="450" width="120" height="165"/>
2776 </children> 2795 </children>
2777 <children xmi:type="notation:Node" xmi:id="_R7b9sF38Ee2LuOZzJ_LhLg" type="2003" element="_R7XFMF38Ee2LuOZzJ_LhLg"> 2796 <children xmi:type="notation:Node" xmi:id="_R7b9sF38Ee2LuOZzJ_LhLg" type="2003" element="_R7XFMF38Ee2LuOZzJ_LhLg">
2778 <children xmi:type="notation:Node" xmi:id="_R7b9s138Ee2LuOZzJ_LhLg" type="5007"/> 2797 <children xmi:type="notation:Node" xmi:id="_R7b9s138Ee2LuOZzJ_LhLg" type="5007"/>
@@ -2808,41 +2827,12 @@
2808 <children xmi:type="notation:Node" xmi:id="_3BISYF4GEe2LuOZzJ_LhLg" type="2003" element="_3A1XcF4GEe2LuOZzJ_LhLg"> 2827 <children xmi:type="notation:Node" xmi:id="_3BISYF4GEe2LuOZzJ_LhLg" type="2003" element="_3A1XcF4GEe2LuOZzJ_LhLg">
2809 <children xmi:type="notation:Node" xmi:id="_3BISY14GEe2LuOZzJ_LhLg" type="5007"/> 2828 <children xmi:type="notation:Node" xmi:id="_3BISY14GEe2LuOZzJ_LhLg" type="5007"/>
2810 <children xmi:type="notation:Node" xmi:id="_3BISZF4GEe2LuOZzJ_LhLg" type="7004"> 2829 <children xmi:type="notation:Node" xmi:id="_3BISZF4GEe2LuOZzJ_LhLg" type="7004">
2811 <children xmi:type="notation:Node" xmi:id="_naQcIF9vEe2rXNsIDUvqhw" type="3010" element="_nZoxHl9vEe2rXNsIDUvqhw">
2812 <styles xmi:type="notation:FontStyle" xmi:id="_naQcIV9vEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
2813 <layoutConstraint xmi:type="notation:Location" xmi:id="_naQcIl9vEe2rXNsIDUvqhw"/>
2814 </children>
2815 <styles xmi:type="notation:SortingStyle" xmi:id="_3BISZV4GEe2LuOZzJ_LhLg"/> 2830 <styles xmi:type="notation:SortingStyle" xmi:id="_3BISZV4GEe2LuOZzJ_LhLg"/>
2816 <styles xmi:type="notation:FilteringStyle" xmi:id="_3BISZl4GEe2LuOZzJ_LhLg"/> 2831 <styles xmi:type="notation:FilteringStyle" xmi:id="_3BISZl4GEe2LuOZzJ_LhLg"/>
2817 </children> 2832 </children>
2818 <styles xmi:type="notation:ShapeStyle" xmi:id="_3BISYV4GEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2833 <styles xmi:type="notation:ShapeStyle" xmi:id="_3BISYV4GEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2819 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3BISYl4GEe2LuOZzJ_LhLg" x="919" y="312" width="147" height="100"/> 2834 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3BISYl4GEe2LuOZzJ_LhLg" x="919" y="312" width="147" height="100"/>
2820 </children> 2835 </children>
2821 <children xmi:type="notation:Node" xmi:id="_Yrrhdl4HEe2LuOZzJ_LhLg" type="2003" element="_YrdfAF4HEe2LuOZzJ_LhLg">
2822 <children xmi:type="notation:Node" xmi:id="_YrsIgF4HEe2LuOZzJ_LhLg" type="5007"/>
2823 <children xmi:type="notation:Node" xmi:id="_YrsIgV4HEe2LuOZzJ_LhLg" type="7004">
2824 <children xmi:type="notation:Node" xmi:id="_ZYoHAF4HEe2LuOZzJ_LhLg" type="3010" element="_ZYVzIF4HEe2LuOZzJ_LhLg">
2825 <styles xmi:type="notation:FontStyle" xmi:id="_ZYoHAV4HEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2826 <layoutConstraint xmi:type="notation:Location" xmi:id="_ZYoHAl4HEe2LuOZzJ_LhLg"/>
2827 </children>
2828 <children xmi:type="notation:Node" xmi:id="_Zy7dYF4HEe2LuOZzJ_LhLg" type="3010" element="_Zyjp8F4HEe2LuOZzJ_LhLg">
2829 <styles xmi:type="notation:FontStyle" xmi:id="_Zy7dYV4HEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2830 <layoutConstraint xmi:type="notation:Location" xmi:id="_Zy7dYl4HEe2LuOZzJ_LhLg"/>
2831 </children>
2832 <children xmi:type="notation:Node" xmi:id="_aD__QF4HEe2LuOZzJ_LhLg" type="3010" element="_aDuScF4HEe2LuOZzJ_LhLg">
2833 <styles xmi:type="notation:FontStyle" xmi:id="_aD__QV4HEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2834 <layoutConstraint xmi:type="notation:Location" xmi:id="_aD__Ql4HEe2LuOZzJ_LhLg"/>
2835 </children>
2836 <children xmi:type="notation:Node" xmi:id="_aVHkcF4HEe2LuOZzJ_LhLg" type="3010" element="_aU4T4F4HEe2LuOZzJ_LhLg">
2837 <styles xmi:type="notation:FontStyle" xmi:id="_aVHkcV4HEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2838 <layoutConstraint xmi:type="notation:Location" xmi:id="_aVHkcl4HEe2LuOZzJ_LhLg"/>
2839 </children>
2840 <styles xmi:type="notation:SortingStyle" xmi:id="_YrsIgl4HEe2LuOZzJ_LhLg"/>
2841 <styles xmi:type="notation:FilteringStyle" xmi:id="_YrsIg14HEe2LuOZzJ_LhLg"/>
2842 </children>
2843 <styles xmi:type="notation:ShapeStyle" xmi:id="_Yrrhd14HEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2844 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YrrheF4HEe2LuOZzJ_LhLg" x="933" y="446" width="120" height="106"/>
2845 </children>
2846 <children xmi:type="notation:Node" xmi:id="_87Ju4F4IEe2LuOZzJ_LhLg" type="2003" element="_86zJkF4IEe2LuOZzJ_LhLg"> 2836 <children xmi:type="notation:Node" xmi:id="_87Ju4F4IEe2LuOZzJ_LhLg" type="2003" element="_86zJkF4IEe2LuOZzJ_LhLg">
2847 <children xmi:type="notation:Node" xmi:id="_87Ju414IEe2LuOZzJ_LhLg" type="5007"/> 2837 <children xmi:type="notation:Node" xmi:id="_87Ju414IEe2LuOZzJ_LhLg" type="5007"/>
2848 <children xmi:type="notation:Node" xmi:id="_87Ju5F4IEe2LuOZzJ_LhLg" type="7004"> 2838 <children xmi:type="notation:Node" xmi:id="_87Ju5F4IEe2LuOZzJ_LhLg" type="7004">
@@ -2850,7 +2840,7 @@
2850 <styles xmi:type="notation:FilteringStyle" xmi:id="_87Ju5l4IEe2LuOZzJ_LhLg"/> 2840 <styles xmi:type="notation:FilteringStyle" xmi:id="_87Ju5l4IEe2LuOZzJ_LhLg"/>
2851 </children> 2841 </children>
2852 <styles xmi:type="notation:ShapeStyle" xmi:id="_87Ju4V4IEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8" italic="true"/> 2842 <styles xmi:type="notation:ShapeStyle" xmi:id="_87Ju4V4IEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8" italic="true"/>
2853 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_87Ju4l4IEe2LuOZzJ_LhLg" x="2880" y="168"/> 2843 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_87Ju4l4IEe2LuOZzJ_LhLg" x="2820" y="168"/>
2854 </children> 2844 </children>
2855 <children xmi:type="notation:Node" xmi:id="_JYXdgF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIwF4JEe2LuOZzJ_LhLg"> 2845 <children xmi:type="notation:Node" xmi:id="_JYXdgF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIwF4JEe2LuOZzJ_LhLg">
2856 <children xmi:type="notation:Node" xmi:id="_JYXdg14JEe2LuOZzJ_LhLg" type="5007"/> 2846 <children xmi:type="notation:Node" xmi:id="_JYXdg14JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2863,7 +2853,7 @@
2863 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYXdhl4JEe2LuOZzJ_LhLg"/> 2853 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYXdhl4JEe2LuOZzJ_LhLg"/>
2864 </children> 2854 </children>
2865 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYXdgV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2855 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYXdgV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2866 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYXdgl4JEe2LuOZzJ_LhLg" x="2628" y="312"/> 2856 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYXdgl4JEe2LuOZzJ_LhLg" x="2456" y="312"/>
2867 </children> 2857 </children>
2868 <children xmi:type="notation:Node" xmi:id="_JYYEkF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIw14JEe2LuOZzJ_LhLg"> 2858 <children xmi:type="notation:Node" xmi:id="_JYYEkF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIw14JEe2LuOZzJ_LhLg">
2869 <children xmi:type="notation:Node" xmi:id="_JYYEk14JEe2LuOZzJ_LhLg" type="5007"/> 2859 <children xmi:type="notation:Node" xmi:id="_JYYEk14JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2876,7 +2866,7 @@
2876 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEll4JEe2LuOZzJ_LhLg"/> 2866 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEll4JEe2LuOZzJ_LhLg"/>
2877 </children> 2867 </children>
2878 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEkV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2868 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEkV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2879 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEkl4JEe2LuOZzJ_LhLg" x="2777" y="312"/> 2869 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEkl4JEe2LuOZzJ_LhLg" x="2605" y="312"/>
2880 </children> 2870 </children>
2881 <children xmi:type="notation:Node" xmi:id="_JYYEl14JEe2LuOZzJ_LhLg" type="2003" element="_JYQv0l4JEe2LuOZzJ_LhLg"> 2871 <children xmi:type="notation:Node" xmi:id="_JYYEl14JEe2LuOZzJ_LhLg" type="2003" element="_JYQv0l4JEe2LuOZzJ_LhLg">
2882 <children xmi:type="notation:Node" xmi:id="_JYYEml4JEe2LuOZzJ_LhLg" type="5007"/> 2872 <children xmi:type="notation:Node" xmi:id="_JYYEml4JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2889,7 +2879,7 @@
2889 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEnV4JEe2LuOZzJ_LhLg"/> 2879 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEnV4JEe2LuOZzJ_LhLg"/>
2890 </children> 2880 </children>
2891 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEmF4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2881 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEmF4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2892 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEmV4JEe2LuOZzJ_LhLg" x="2964" y="312"/> 2882 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEmV4JEe2LuOZzJ_LhLg" x="2792" y="312"/>
2893 </children> 2883 </children>
2894 <children xmi:type="notation:Node" xmi:id="_9AqPEF4KEe2m7IaHDkh2Xg" type="2003" element="_9AeB0F4KEe2m7IaHDkh2Xg"> 2884 <children xmi:type="notation:Node" xmi:id="_9AqPEF4KEe2m7IaHDkh2Xg" type="2003" element="_9AeB0F4KEe2m7IaHDkh2Xg">
2895 <children xmi:type="notation:Node" xmi:id="_9ArdMF4KEe2m7IaHDkh2Xg" type="5007"/> 2885 <children xmi:type="notation:Node" xmi:id="_9ArdMF4KEe2m7IaHDkh2Xg" type="5007"/>
@@ -2920,7 +2910,7 @@
2920 <styles xmi:type="notation:FilteringStyle" xmi:id="_GNwrhmTUEe2qdtyPWAtoxA"/> 2910 <styles xmi:type="notation:FilteringStyle" xmi:id="_GNwrhmTUEe2qdtyPWAtoxA"/>
2921 </children> 2911 </children>
2922 <styles xmi:type="notation:ShapeStyle" xmi:id="_GNwrgWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 2912 <styles xmi:type="notation:ShapeStyle" xmi:id="_GNwrgWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2923 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GNwrgmTUEe2qdtyPWAtoxA" x="2124" y="312" width="123"/> 2913 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GNwrgmTUEe2qdtyPWAtoxA" x="1952" y="312" width="123"/>
2924 </children> 2914 </children>
2925 <children xmi:type="notation:Node" xmi:id="_M-upAGTUEe2qdtyPWAtoxA" type="2003" element="_M-ZR0GTUEe2qdtyPWAtoxA"> 2915 <children xmi:type="notation:Node" xmi:id="_M-upAGTUEe2qdtyPWAtoxA" type="2003" element="_M-ZR0GTUEe2qdtyPWAtoxA">
2926 <children xmi:type="notation:Node" xmi:id="_M-upA2TUEe2qdtyPWAtoxA" type="5007"/> 2916 <children xmi:type="notation:Node" xmi:id="_M-upA2TUEe2qdtyPWAtoxA" type="5007"/>
@@ -2933,7 +2923,7 @@
2933 <styles xmi:type="notation:FilteringStyle" xmi:id="_M-upBmTUEe2qdtyPWAtoxA"/> 2923 <styles xmi:type="notation:FilteringStyle" xmi:id="_M-upBmTUEe2qdtyPWAtoxA"/>
2934 </children> 2924 </children>
2935 <styles xmi:type="notation:ShapeStyle" xmi:id="_M-upAWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 2925 <styles xmi:type="notation:ShapeStyle" xmi:id="_M-upAWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2936 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M-upAmTUEe2qdtyPWAtoxA" x="1780" y="312" width="135" height="100"/> 2926 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M-upAmTUEe2qdtyPWAtoxA" x="1608" y="312" width="135" height="100"/>
2937 </children> 2927 </children>
2938 <children xmi:type="notation:Node" xmi:id="_QkXS8GTUEe2qdtyPWAtoxA" type="2003" element="_QkP-MGTUEe2qdtyPWAtoxA"> 2928 <children xmi:type="notation:Node" xmi:id="_QkXS8GTUEe2qdtyPWAtoxA" type="2003" element="_QkP-MGTUEe2qdtyPWAtoxA">
2939 <children xmi:type="notation:Node" xmi:id="_QkXS82TUEe2qdtyPWAtoxA" type="5007"/> 2929 <children xmi:type="notation:Node" xmi:id="_QkXS82TUEe2qdtyPWAtoxA" type="5007"/>
@@ -2966,14 +2956,6 @@
2966 <styles xmi:type="notation:FontStyle" xmi:id="_pZfy4WgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/> 2956 <styles xmi:type="notation:FontStyle" xmi:id="_pZfy4WgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/>
2967 <layoutConstraint xmi:type="notation:Location" xmi:id="_pZfy4mgpEe24RpwpWgpkFQ"/> 2957 <layoutConstraint xmi:type="notation:Location" xmi:id="_pZfy4mgpEe24RpwpWgpkFQ"/>
2968 </children> 2958 </children>
2969 <children xmi:type="notation:Node" xmi:id="_BuRG0GkFEe24rIYSlCjKHA" type="3010" element="_BtK6oGkFEe24rIYSlCjKHA">
2970 <styles xmi:type="notation:FontStyle" xmi:id="_BuRG0WkFEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
2971 <layoutConstraint xmi:type="notation:Location" xmi:id="_BuRG0mkFEe24rIYSlCjKHA"/>
2972 </children>
2973 <children xmi:type="notation:Node" xmi:id="_dTWMcGkFEe24rIYSlCjKHA" type="3010" element="_dSepwGkFEe24rIYSlCjKHA">
2974 <styles xmi:type="notation:FontStyle" xmi:id="_dTWMcWkFEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
2975 <layoutConstraint xmi:type="notation:Location" xmi:id="_dTWMcmkFEe24rIYSlCjKHA"/>
2976 </children>
2977 <children xmi:type="notation:Node" xmi:id="_eqflkGkFEe24rIYSlCjKHA" type="3010" element="_eqCSkGkFEe24rIYSlCjKHA"> 2959 <children xmi:type="notation:Node" xmi:id="_eqflkGkFEe24rIYSlCjKHA" type="3010" element="_eqCSkGkFEe24rIYSlCjKHA">
2978 <styles xmi:type="notation:FontStyle" xmi:id="_eqflkWkFEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/> 2960 <styles xmi:type="notation:FontStyle" xmi:id="_eqflkWkFEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
2979 <layoutConstraint xmi:type="notation:Location" xmi:id="_eqflkmkFEe24rIYSlCjKHA"/> 2961 <layoutConstraint xmi:type="notation:Location" xmi:id="_eqflkmkFEe24rIYSlCjKHA"/>
@@ -2986,7 +2968,7 @@
2986 <styles xmi:type="notation:FilteringStyle" xmi:id="_QkXS9mTUEe2qdtyPWAtoxA"/> 2968 <styles xmi:type="notation:FilteringStyle" xmi:id="_QkXS9mTUEe2qdtyPWAtoxA"/>
2987 </children> 2969 </children>
2988 <styles xmi:type="notation:ShapeStyle" xmi:id="_QkXS8WTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 2970 <styles xmi:type="notation:ShapeStyle" xmi:id="_QkXS8WTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2989 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QkXS8mTUEe2qdtyPWAtoxA" x="2126" y="448" height="215"/> 2971 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QkXS8mTUEe2qdtyPWAtoxA" x="1954" y="448" height="179"/>
2990 </children> 2972 </children>
2991 <children xmi:type="notation:Node" xmi:id="_36XqIGTuEe2qdtyPWAtoxA" type="2003" element="_36CS8GTuEe2qdtyPWAtoxA"> 2973 <children xmi:type="notation:Node" xmi:id="_36XqIGTuEe2qdtyPWAtoxA" type="2003" element="_36CS8GTuEe2qdtyPWAtoxA">
2992 <children xmi:type="notation:Node" xmi:id="_36YRMGTuEe2qdtyPWAtoxA" type="5007"/> 2974 <children xmi:type="notation:Node" xmi:id="_36YRMGTuEe2qdtyPWAtoxA" type="5007"/>
@@ -3028,44 +3010,6 @@
3028 <styles xmi:type="notation:ShapeStyle" xmi:id="_Z0bU0WTvEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 3010 <styles xmi:type="notation:ShapeStyle" xmi:id="_Z0bU0WTvEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3029 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Z0bU0mTvEe2qdtyPWAtoxA" x="182" y="312" width="120" height="100"/> 3011 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Z0bU0mTvEe2qdtyPWAtoxA" x="182" y="312" width="120" height="100"/>
3030 </children> 3012 </children>
3031 <children xmi:type="notation:Node" xmi:id="_DNRsUGTwEe2qdtyPWAtoxA" type="2003" element="_DM_YcGTwEe2qdtyPWAtoxA">
3032 <children xmi:type="notation:Node" xmi:id="_DNRsU2TwEe2qdtyPWAtoxA" type="5007"/>
3033 <children xmi:type="notation:Node" xmi:id="_DNRsVGTwEe2qdtyPWAtoxA" type="7004">
3034 <children xmi:type="notation:Node" xmi:id="_GEP5cGTwEe2qdtyPWAtoxA" type="3010" element="_GD-MoGTwEe2qdtyPWAtoxA">
3035 <styles xmi:type="notation:FontStyle" xmi:id="_GEP5cWTwEe2qdtyPWAtoxA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
3036 <layoutConstraint xmi:type="notation:Location" xmi:id="_GEP5cmTwEe2qdtyPWAtoxA"/>
3037 </children>
3038 <styles xmi:type="notation:SortingStyle" xmi:id="_DNRsVWTwEe2qdtyPWAtoxA"/>
3039 <styles xmi:type="notation:FilteringStyle" xmi:id="_DNRsVmTwEe2qdtyPWAtoxA"/>
3040 </children>
3041 <styles xmi:type="notation:ShapeStyle" xmi:id="_DNRsUWTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3042 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DNRsUmTwEe2qdtyPWAtoxA" x="1608" y="312" width="120" height="100"/>
3043 </children>
3044 <children xmi:type="notation:Node" xmi:id="_FOjAgGTwEe2qdtyPWAtoxA" type="2003" element="_FOadoGTwEe2qdtyPWAtoxA">
3045 <children xmi:type="notation:Node" xmi:id="_FOjnkGTwEe2qdtyPWAtoxA" type="5007"/>
3046 <children xmi:type="notation:Node" xmi:id="_FOjnkWTwEe2qdtyPWAtoxA" type="7004">
3047 <children xmi:type="notation:Node" xmi:id="_FOjnlGTwEe2qdtyPWAtoxA" type="3010" element="_FOevIGTwEe2qdtyPWAtoxA">
3048 <styles xmi:type="notation:FontStyle" xmi:id="_FOjnlWTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3049 <layoutConstraint xmi:type="notation:Location" xmi:id="_FOjnlmTwEe2qdtyPWAtoxA"/>
3050 </children>
3051 <children xmi:type="notation:Node" xmi:id="_FOjnl2TwEe2qdtyPWAtoxA" type="3010" element="_FOevImTwEe2qdtyPWAtoxA">
3052 <styles xmi:type="notation:FontStyle" xmi:id="_FOjnmGTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3053 <layoutConstraint xmi:type="notation:Location" xmi:id="_FOjnmWTwEe2qdtyPWAtoxA"/>
3054 </children>
3055 <children xmi:type="notation:Node" xmi:id="_FOkOoGTwEe2qdtyPWAtoxA" type="3010" element="_FOevJGTwEe2qdtyPWAtoxA">
3056 <styles xmi:type="notation:FontStyle" xmi:id="_FOkOoWTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3057 <layoutConstraint xmi:type="notation:Location" xmi:id="_FOkOomTwEe2qdtyPWAtoxA"/>
3058 </children>
3059 <children xmi:type="notation:Node" xmi:id="_FOkOo2TwEe2qdtyPWAtoxA" type="3010" element="_FOevJmTwEe2qdtyPWAtoxA">
3060 <styles xmi:type="notation:FontStyle" xmi:id="_FOkOpGTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3061 <layoutConstraint xmi:type="notation:Location" xmi:id="_FOkOpWTwEe2qdtyPWAtoxA"/>
3062 </children>
3063 <styles xmi:type="notation:SortingStyle" xmi:id="_FOjnkmTwEe2qdtyPWAtoxA"/>
3064 <styles xmi:type="notation:FilteringStyle" xmi:id="_FOjnk2TwEe2qdtyPWAtoxA"/>
3065 </children>
3066 <styles xmi:type="notation:ShapeStyle" xmi:id="_FOjAgWTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3067 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FOjAgmTwEe2qdtyPWAtoxA" x="1608" y="446"/>
3068 </children>
3069 <children xmi:type="notation:Node" xmi:id="_3ahdoGgpEe24RpwpWgpkFQ" type="2003" element="_3aQ-8GgpEe24RpwpWgpkFQ"> 3013 <children xmi:type="notation:Node" xmi:id="_3ahdoGgpEe24RpwpWgpkFQ" type="2003" element="_3aQ-8GgpEe24RpwpWgpkFQ">
3070 <children xmi:type="notation:Node" xmi:id="_3ahdo2gpEe24RpwpWgpkFQ" type="5007"/> 3014 <children xmi:type="notation:Node" xmi:id="_3ahdo2gpEe24RpwpWgpkFQ" type="5007"/>
3071 <children xmi:type="notation:Node" xmi:id="_3ahdpGgpEe24RpwpWgpkFQ" type="7004"> 3015 <children xmi:type="notation:Node" xmi:id="_3ahdpGgpEe24RpwpWgpkFQ" type="7004">
@@ -3073,7 +3017,7 @@
3073 <styles xmi:type="notation:FilteringStyle" xmi:id="_3ahdpmgpEe24RpwpWgpkFQ"/> 3017 <styles xmi:type="notation:FilteringStyle" xmi:id="_3ahdpmgpEe24RpwpWgpkFQ"/>
3074 </children> 3018 </children>
3075 <styles xmi:type="notation:ShapeStyle" xmi:id="_3ahdoWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/> 3019 <styles xmi:type="notation:ShapeStyle" xmi:id="_3ahdoWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/>
3076 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3ahdomgpEe24RpwpWgpkFQ" x="2292" y="312" width="120" height="100"/> 3020 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3ahdomgpEe24RpwpWgpkFQ" x="2120" y="312" width="120" height="100"/>
3077 </children> 3021 </children>
3078 <children xmi:type="notation:Node" xmi:id="_ZjfaEGkGEe24rIYSlCjKHA" type="2003" element="_Zi8AcGkGEe24rIYSlCjKHA"> 3022 <children xmi:type="notation:Node" xmi:id="_ZjfaEGkGEe24rIYSlCjKHA" type="2003" element="_Zi8AcGkGEe24rIYSlCjKHA">
3079 <children xmi:type="notation:Node" xmi:id="_ZjkSkGkGEe24rIYSlCjKHA" type="5007"/> 3023 <children xmi:type="notation:Node" xmi:id="_ZjkSkGkGEe24rIYSlCjKHA" type="5007"/>
@@ -3086,7 +3030,7 @@
3086 <styles xmi:type="notation:FilteringStyle" xmi:id="_ZjkSk2kGEe24rIYSlCjKHA"/> 3030 <styles xmi:type="notation:FilteringStyle" xmi:id="_ZjkSk2kGEe24rIYSlCjKHA"/>
3087 </children> 3031 </children>
3088 <styles xmi:type="notation:ShapeStyle" xmi:id="_ZjfaEWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/> 3032 <styles xmi:type="notation:ShapeStyle" xmi:id="_ZjfaEWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
3089 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZjfaEmkGEe24rIYSlCjKHA" x="3132" y="312" width="120" height="100"/> 3033 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZjfaEmkGEe24rIYSlCjKHA" x="3120" y="312" width="120" height="100"/>
3090 </children> 3034 </children>
3091 <children xmi:type="notation:Node" xmi:id="_fdU7QGkGEe24rIYSlCjKHA" type="2003" element="_fdLKQGkGEe24rIYSlCjKHA"> 3035 <children xmi:type="notation:Node" xmi:id="_fdU7QGkGEe24rIYSlCjKHA" type="2003" element="_fdLKQGkGEe24rIYSlCjKHA">
3092 <children xmi:type="notation:Node" xmi:id="_fdViUGkGEe24rIYSlCjKHA" type="5007"/> 3036 <children xmi:type="notation:Node" xmi:id="_fdViUGkGEe24rIYSlCjKHA" type="5007"/>
@@ -3111,7 +3055,7 @@
3111 <styles xmi:type="notation:FilteringStyle" xmi:id="_fdViU2kGEe24rIYSlCjKHA"/> 3055 <styles xmi:type="notation:FilteringStyle" xmi:id="_fdViU2kGEe24rIYSlCjKHA"/>
3112 </children> 3056 </children>
3113 <styles xmi:type="notation:ShapeStyle" xmi:id="_fdU7QWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/> 3057 <styles xmi:type="notation:ShapeStyle" xmi:id="_fdU7QWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
3114 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fdU7QmkGEe24rIYSlCjKHA" x="3132" y="449"/> 3058 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fdU7QmkGEe24rIYSlCjKHA" x="3120" y="449"/>
3115 </children> 3059 </children>
3116 <children xmi:type="notation:Node" xmi:id="_IYGPgNZUEe69IbObpvsypA" type="2003" element="_IXrYwNZUEe69IbObpvsypA"> 3060 <children xmi:type="notation:Node" xmi:id="_IYGPgNZUEe69IbObpvsypA" type="2003" element="_IXrYwNZUEe69IbObpvsypA">
3117 <children xmi:type="notation:Node" xmi:id="_IYGPg9ZUEe69IbObpvsypA" type="5007"/> 3061 <children xmi:type="notation:Node" xmi:id="_IYGPg9ZUEe69IbObpvsypA" type="5007"/>
@@ -3124,7 +3068,7 @@
3124 <styles xmi:type="notation:FilteringStyle" xmi:id="_IYGPhtZUEe69IbObpvsypA"/> 3068 <styles xmi:type="notation:FilteringStyle" xmi:id="_IYGPhtZUEe69IbObpvsypA"/>
3125 </children> 3069 </children>
3126 <styles xmi:type="notation:ShapeStyle" xmi:id="_IYGPgdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/> 3070 <styles xmi:type="notation:ShapeStyle" xmi:id="_IYGPgdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/>
3127 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IYGPgtZUEe69IbObpvsypA" x="1956" y="312" width="120" height="100"/> 3071 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IYGPgtZUEe69IbObpvsypA" x="1784" y="312" width="120" height="100"/>
3128 </children> 3072 </children>
3129 <children xmi:type="notation:Node" xmi:id="_Nm2zYNZUEe69IbObpvsypA" type="2003" element="_Nmg1INZUEe69IbObpvsypA"> 3073 <children xmi:type="notation:Node" xmi:id="_Nm2zYNZUEe69IbObpvsypA" type="2003" element="_Nmg1INZUEe69IbObpvsypA">
3130 <children xmi:type="notation:Node" xmi:id="_Nm2zY9ZUEe69IbObpvsypA" type="5007"/> 3074 <children xmi:type="notation:Node" xmi:id="_Nm2zY9ZUEe69IbObpvsypA" type="5007"/>
@@ -3141,7 +3085,7 @@
3141 <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm3actZUEe69IbObpvsypA"/> 3085 <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm3actZUEe69IbObpvsypA"/>
3142 </children> 3086 </children>
3143 <styles xmi:type="notation:ShapeStyle" xmi:id="_Nm2zYdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/> 3087 <styles xmi:type="notation:ShapeStyle" xmi:id="_Nm2zYdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/>
3144 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm2zYtZUEe69IbObpvsypA" x="1956" y="449" width="120" height="100"/> 3088 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm2zYtZUEe69IbObpvsypA" x="1784" y="449" width="120" height="100"/>
3145 </children> 3089 </children>
3146 <children xmi:type="notation:Node" xmi:id="_FTa2MNZXEe69IbObpvsypA" type="2003" element="_FTH7QNZXEe69IbObpvsypA"> 3090 <children xmi:type="notation:Node" xmi:id="_FTa2MNZXEe69IbObpvsypA" type="2003" element="_FTH7QNZXEe69IbObpvsypA">
3147 <children xmi:type="notation:Node" xmi:id="_FTbdQNZXEe69IbObpvsypA" type="5007"/> 3091 <children xmi:type="notation:Node" xmi:id="_FTbdQNZXEe69IbObpvsypA" type="5007"/>
@@ -3159,7 +3103,25 @@
3159 <styles xmi:type="notation:FilteringStyle" xmi:id="_c0zXctcIEe6pjNxdSs0E0Q"/> 3103 <styles xmi:type="notation:FilteringStyle" xmi:id="_c0zXctcIEe6pjNxdSs0E0Q"/>
3160 </children> 3104 </children>
3161 <styles xmi:type="notation:ShapeStyle" xmi:id="_c0ue8NcIEe6pjNxdSs0E0Q" fontName="Noto Sans" fontHeight="8"/> 3105 <styles xmi:type="notation:ShapeStyle" xmi:id="_c0ue8NcIEe6pjNxdSs0E0Q" fontName="Noto Sans" fontHeight="8"/>
3162 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c0ue8dcIEe6pjNxdSs0E0Q" x="2460" y="312" width="120" height="100"/> 3106 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c0ue8dcIEe6pjNxdSs0E0Q" x="2288" y="312" width="120" height="100"/>
3107 </children>
3108 <children xmi:type="notation:Node" xmi:id="_hOS68NjvEe66mJJuF_pPGg" type="2003" element="_hNitANjvEe66mJJuF_pPGg">
3109 <children xmi:type="notation:Node" xmi:id="_hOYagNjvEe66mJJuF_pPGg" type="5007"/>
3110 <children xmi:type="notation:Node" xmi:id="_hOZBkNjvEe66mJJuF_pPGg" type="7004">
3111 <styles xmi:type="notation:SortingStyle" xmi:id="_hOZBkdjvEe66mJJuF_pPGg"/>
3112 <styles xmi:type="notation:FilteringStyle" xmi:id="_hOZBktjvEe66mJJuF_pPGg"/>
3113 </children>
3114 <styles xmi:type="notation:ShapeStyle" xmi:id="_hOS68djvEe66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/>
3115 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hOS68tjvEe66mJJuF_pPGg" x="2964" y="312" width="120" height="100"/>
3116 </children>
3117 <children xmi:type="notation:Node" xmi:id="_tkOK4NsVEe6c9ehqpe3s7A" type="2003" element="_tkAvgNsVEe6c9ehqpe3s7A">
3118 <children xmi:type="notation:Node" xmi:id="_tkOK49sVEe6c9ehqpe3s7A" type="5007"/>
3119 <children xmi:type="notation:Node" xmi:id="_tkOK5NsVEe6c9ehqpe3s7A" type="7004">
3120 <styles xmi:type="notation:SortingStyle" xmi:id="_tkOK5dsVEe6c9ehqpe3s7A"/>
3121 <styles xmi:type="notation:FilteringStyle" xmi:id="_tkOK5tsVEe6c9ehqpe3s7A"/>
3122 </children>
3123 <styles xmi:type="notation:ShapeStyle" xmi:id="_tkOK4dsVEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/>
3124 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tkOK4tsVEe6c9ehqpe3s7A" x="919" y="448" width="147"/>
3163 </children> 3125 </children>
3164 <styles xmi:type="notation:DiagramStyle" xmi:id="_z1ff0l3lEe2LuOZzJ_LhLg"/> 3126 <styles xmi:type="notation:DiagramStyle" xmi:id="_z1ff0l3lEe2LuOZzJ_LhLg"/>
3165 <edges xmi:type="notation:Edge" xmi:id="_C-b04F3mEe2LuOZzJ_LhLg" type="4001" element="_C9_I8F3mEe2LuOZzJ_LhLg" source="_9ZUmgF3lEe2LuOZzJ_LhLg" target="_8bUtMF3lEe2LuOZzJ_LhLg"> 3127 <edges xmi:type="notation:Edge" xmi:id="_C-b04F3mEe2LuOZzJ_LhLg" type="4001" element="_C9_I8F3mEe2LuOZzJ_LhLg" source="_9ZUmgF3lEe2LuOZzJ_LhLg" target="_8bUtMF3lEe2LuOZzJ_LhLg">
@@ -3196,33 +3158,33 @@
3196 </edges> 3158 </edges>
3197 <edges xmi:type="notation:Edge" xmi:id="_oAifgF3vEe2LuOZzJ_LhLg" type="4001" element="_oARZ0l3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3159 <edges xmi:type="notation:Edge" xmi:id="_oAifgF3vEe2LuOZzJ_LhLg" type="4001" element="_oARZ0l3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3198 <children xmi:type="notation:Node" xmi:id="_oAifhF3vEe2LuOZzJ_LhLg" type="6001"> 3160 <children xmi:type="notation:Node" xmi:id="_oAifhF3vEe2LuOZzJ_LhLg" type="6001">
3199 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifhV3vEe2LuOZzJ_LhLg" x="-367" y="-38"/> 3161 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifhV3vEe2LuOZzJ_LhLg" x="-281" y="-38"/>
3200 </children> 3162 </children>
3201 <children xmi:type="notation:Node" xmi:id="_oAifhl3vEe2LuOZzJ_LhLg" type="6002"> 3163 <children xmi:type="notation:Node" xmi:id="_oAifhl3vEe2LuOZzJ_LhLg" type="6002">
3202 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifh13vEe2LuOZzJ_LhLg" x="-52" y="-68"/> 3164 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifh13vEe2LuOZzJ_LhLg" x="-26" y="-68"/>
3203 </children> 3165 </children>
3204 <children xmi:type="notation:Node" xmi:id="_oAifiF3vEe2LuOZzJ_LhLg" type="6003"> 3166 <children xmi:type="notation:Node" xmi:id="_oAifiF3vEe2LuOZzJ_LhLg" type="6003">
3205 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifiV3vEe2LuOZzJ_LhLg" x="-298" y="-10"/> 3167 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifiV3vEe2LuOZzJ_LhLg" x="-324" y="-10"/>
3206 </children> 3168 </children>
3207 <styles xmi:type="notation:ConnectorStyle" xmi:id="_oAifgV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/> 3169 <styles xmi:type="notation:ConnectorStyle" xmi:id="_oAifgV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/>
3208 <styles xmi:type="notation:FontStyle" xmi:id="_oAifgl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 3170 <styles xmi:type="notation:FontStyle" xmi:id="_oAifgl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
3209 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_oAifg13vEe2LuOZzJ_LhLg" points="[6, 0, 974, 50]$[6, -96, 974, -46]$[-886, -96, 82, -46]"/> 3171 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_oAifg13vEe2LuOZzJ_LhLg" points="[6, 0, 802, 50]$[6, -96, 802, -46]$[-714, -96, 82, -46]"/>
3210 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifil3vEe2LuOZzJ_LhLg" id="(0.3050847457627119,0.0)"/> 3172 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifil3vEe2LuOZzJ_LhLg" id="(0.3050847457627119,0.0)"/>
3211 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifi13vEe2LuOZzJ_LhLg" id="(0.3050847457627119,1.0)"/> 3173 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifi13vEe2LuOZzJ_LhLg" id="(0.3050847457627119,1.0)"/>
3212 </edges> 3174 </edges>
3213 <edges xmi:type="notation:Edge" xmi:id="_qyMHwF3vEe2LuOZzJ_LhLg" type="4001" element="_qx9eWF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3175 <edges xmi:type="notation:Edge" xmi:id="_qyMHwF3vEe2LuOZzJ_LhLg" type="4001" element="_qx9eWF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3214 <children xmi:type="notation:Node" xmi:id="_qyMHxF3vEe2LuOZzJ_LhLg" type="6001"> 3176 <children xmi:type="notation:Node" xmi:id="_qyMHxF3vEe2LuOZzJ_LhLg" type="6001">
3215 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHxV3vEe2LuOZzJ_LhLg" x="-440" y="-62"/> 3177 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHxV3vEe2LuOZzJ_LhLg" x="-354" y="-62"/>
3216 </children> 3178 </children>
3217 <children xmi:type="notation:Node" xmi:id="_qyMHxl3vEe2LuOZzJ_LhLg" type="6002"> 3179 <children xmi:type="notation:Node" xmi:id="_qyMHxl3vEe2LuOZzJ_LhLg" type="6002">
3218 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHx13vEe2LuOZzJ_LhLg" x="-36" y="-83"/> 3180 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHx13vEe2LuOZzJ_LhLg" x="-10" y="-83"/>
3219 </children> 3181 </children>
3220 <children xmi:type="notation:Node" xmi:id="_qyMHyF3vEe2LuOZzJ_LhLg" type="6003"> 3182 <children xmi:type="notation:Node" xmi:id="_qyMHyF3vEe2LuOZzJ_LhLg" type="6003">
3221 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHyV3vEe2LuOZzJ_LhLg" x="-304" y="-10"/> 3183 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHyV3vEe2LuOZzJ_LhLg" x="-330" y="-10"/>
3222 </children> 3184 </children>
3223 <styles xmi:type="notation:ConnectorStyle" xmi:id="_qyMHwV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/> 3185 <styles xmi:type="notation:ConnectorStyle" xmi:id="_qyMHwV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/>
3224 <styles xmi:type="notation:FontStyle" xmi:id="_qyMHwl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 3186 <styles xmi:type="notation:FontStyle" xmi:id="_qyMHwl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
3225 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qyMHw13vEe2LuOZzJ_LhLg" points="[0, 0, 968, 50]$[0, -120, 968, -70]$[-922, -120, 46, -70]"/> 3187 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qyMHw13vEe2LuOZzJ_LhLg" points="[0, 0, 796, 50]$[0, -120, 796, -70]$[-750, -120, 46, -70]"/>
3226 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHyl3vEe2LuOZzJ_LhLg" id="(0.6101694915254238,0.0)"/> 3188 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHyl3vEe2LuOZzJ_LhLg" id="(0.6101694915254238,0.0)"/>
3227 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHy13vEe2LuOZzJ_LhLg" id="(0.6101694915254238,1.0)"/> 3189 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHy13vEe2LuOZzJ_LhLg" id="(0.6101694915254238,1.0)"/>
3228 </edges> 3190 </edges>
@@ -3244,17 +3206,17 @@
3244 </edges> 3206 </edges>
3245 <edges xmi:type="notation:Edge" xmi:id="_v0nf0F3vEe2LuOZzJ_LhLg" type="4001" element="_v0WaHF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3207 <edges xmi:type="notation:Edge" xmi:id="_v0nf0F3vEe2LuOZzJ_LhLg" type="4001" element="_v0WaHF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3246 <children xmi:type="notation:Node" xmi:id="_v0nf1F3vEe2LuOZzJ_LhLg" type="6001"> 3208 <children xmi:type="notation:Node" xmi:id="_v0nf1F3vEe2LuOZzJ_LhLg" type="6001">
3247 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf1V3vEe2LuOZzJ_LhLg" x="-7" y="-10"/> 3209 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf1V3vEe2LuOZzJ_LhLg" x="-15" y="-10"/>
3248 </children> 3210 </children>
3249 <children xmi:type="notation:Node" xmi:id="_v0nf1l3vEe2LuOZzJ_LhLg" type="6002"> 3211 <children xmi:type="notation:Node" xmi:id="_v0nf1l3vEe2LuOZzJ_LhLg" type="6002">
3250 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf113vEe2LuOZzJ_LhLg" x="-18" y="10"/> 3212 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf113vEe2LuOZzJ_LhLg" x="-26" y="10"/>
3251 </children> 3213 </children>
3252 <children xmi:type="notation:Node" xmi:id="_v0nf2F3vEe2LuOZzJ_LhLg" type="6003"> 3214 <children xmi:type="notation:Node" xmi:id="_v0nf2F3vEe2LuOZzJ_LhLg" type="6003">
3253 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf2V3vEe2LuOZzJ_LhLg" x="6" y="10"/> 3215 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v0nf2V3vEe2LuOZzJ_LhLg" x="-2" y="10"/>
3254 </children> 3216 </children>
3255 <styles xmi:type="notation:ConnectorStyle" xmi:id="_v0nf0V3vEe2LuOZzJ_LhLg" routing="Tree"/> 3217 <styles xmi:type="notation:ConnectorStyle" xmi:id="_v0nf0V3vEe2LuOZzJ_LhLg" routing="Tree"/>
3256 <styles xmi:type="notation:FontStyle" xmi:id="_v0nf0l3vEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 3218 <styles xmi:type="notation:FontStyle" xmi:id="_v0nf0l3vEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
3257 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v0nf013vEe2LuOZzJ_LhLg" points="[0, -2, 758, 99]$[0, -26, 758, 75]$[-764, -26, -6, 75]$[-764, -52, -6, 49]"/> 3219 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v0nf013vEe2LuOZzJ_LhLg" points="[0, -2, 929, 99]$[0, -26, 929, 75]$[-935, -26, -6, 75]$[-935, -52, -6, 49]"/>
3258 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v0nf2l3vEe2LuOZzJ_LhLg" id="(0.1694915254237288,0.02040816326530612)"/> 3220 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v0nf2l3vEe2LuOZzJ_LhLg" id="(0.1694915254237288,0.02040816326530612)"/>
3259 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v0nf213vEe2LuOZzJ_LhLg" id="(0.5,0.5)"/> 3221 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v0nf213vEe2LuOZzJ_LhLg" id="(0.5,0.5)"/>
3260 </edges> 3222 </edges>
@@ -3594,22 +3556,6 @@
3594 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_cBzLV2TvEe2qdtyPWAtoxA" id="(0.5,1.0)"/> 3556 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_cBzLV2TvEe2qdtyPWAtoxA" id="(0.5,1.0)"/>
3595 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_cBzLWGTvEe2qdtyPWAtoxA" id="(0.5,0.0)"/> 3557 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_cBzLWGTvEe2qdtyPWAtoxA" id="(0.5,0.0)"/>
3596 </edges> 3558 </edges>
3597 <edges xmi:type="notation:Edge" xmi:id="_HgqNEGTwEe2qdtyPWAtoxA" type="4001" element="_HgMTBmTwEe2qdtyPWAtoxA" source="_DNRsUGTwEe2qdtyPWAtoxA" target="_meWJcF3uEe2LuOZzJ_LhLg">
3598 <children xmi:type="notation:Node" xmi:id="_HgqNFGTwEe2qdtyPWAtoxA" type="6001">
3599 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HgqNFWTwEe2qdtyPWAtoxA" y="-10"/>
3600 </children>
3601 <children xmi:type="notation:Node" xmi:id="_HgqNFmTwEe2qdtyPWAtoxA" type="6002">
3602 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HgqNF2TwEe2qdtyPWAtoxA" y="10"/>
3603 </children>
3604 <children xmi:type="notation:Node" xmi:id="_Hgq0IGTwEe2qdtyPWAtoxA" type="6003">
3605 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Hgq0IWTwEe2qdtyPWAtoxA" y="10"/>
3606 </children>
3607 <styles xmi:type="notation:ConnectorStyle" xmi:id="_HgqNEWTwEe2qdtyPWAtoxA" routing="Tree"/>
3608 <styles xmi:type="notation:FontStyle" xmi:id="_HgqNEmTwEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
3609 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HgqNE2TwEe2qdtyPWAtoxA" points="[0, 0, 211, 132]$[-211, -132, 0, 0]"/>
3610 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Hgq0ImTwEe2qdtyPWAtoxA" id="(0.4067796610169492,0.0)"/>
3611 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Hgq0I2TwEe2qdtyPWAtoxA" id="(0.5,0.5)"/>
3612 </edges>
3613 <edges xmi:type="notation:Edge" xmi:id="_MXL3IGTwEe2qdtyPWAtoxA" type="4001" element="_MW7_mGTwEe2qdtyPWAtoxA" source="_LC6oUGTvEe2qdtyPWAtoxA" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3559 <edges xmi:type="notation:Edge" xmi:id="_MXL3IGTwEe2qdtyPWAtoxA" type="4001" element="_MW7_mGTwEe2qdtyPWAtoxA" source="_LC6oUGTvEe2qdtyPWAtoxA" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3614 <children xmi:type="notation:Node" xmi:id="_MXL3JGTwEe2qdtyPWAtoxA" type="6001"> 3560 <children xmi:type="notation:Node" xmi:id="_MXL3JGTwEe2qdtyPWAtoxA" type="6001">
3615 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MXL3JWTwEe2qdtyPWAtoxA" x="-12" y="-10"/> 3561 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MXL3JWTwEe2qdtyPWAtoxA" x="-12" y="-10"/>
@@ -3754,6 +3700,38 @@
3754 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fkYjINcIEe6pjNxdSs0E0Q" id="(0.5,0.0)"/> 3700 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fkYjINcIEe6pjNxdSs0E0Q" id="(0.5,0.0)"/>
3755 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fkYjIdcIEe6pjNxdSs0E0Q" id="(0.5,0.5)"/> 3701 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fkYjIdcIEe6pjNxdSs0E0Q" id="(0.5,0.5)"/>
3756 </edges> 3702 </edges>
3703 <edges xmi:type="notation:Edge" xmi:id="_nICVgNjvEe66mJJuF_pPGg" type="4001" element="_nHjNetjvEe66mJJuF_pPGg" source="_hOS68NjvEe66mJJuF_pPGg" target="_87Ju4F4IEe2LuOZzJ_LhLg">
3704 <children xmi:type="notation:Node" xmi:id="_nIC8kNjvEe66mJJuF_pPGg" type="6001">
3705 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nIC8kdjvEe66mJJuF_pPGg" y="-10"/>
3706 </children>
3707 <children xmi:type="notation:Node" xmi:id="_nIDjoNjvEe66mJJuF_pPGg" type="6002">
3708 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nIDjodjvEe66mJJuF_pPGg" y="10"/>
3709 </children>
3710 <children xmi:type="notation:Node" xmi:id="_nIEKsNjvEe66mJJuF_pPGg" type="6003">
3711 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nIEKsdjvEe66mJJuF_pPGg" y="10"/>
3712 </children>
3713 <styles xmi:type="notation:ConnectorStyle" xmi:id="_nICVgdjvEe66mJJuF_pPGg" routing="Tree"/>
3714 <styles xmi:type="notation:FontStyle" xmi:id="_nICVgtjvEe66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/>
3715 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nICVg9jvEe66mJJuF_pPGg" points="[0, 0, 210, 108]$[-210, -108, 0, 0]"/>
3716 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nIFY0NjvEe66mJJuF_pPGg" id="(0.6101694915254238,0.0)"/>
3717 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nIFY0djvEe66mJJuF_pPGg" id="(0.5,0.5)"/>
3718 </edges>
3719 <edges xmi:type="notation:Edge" xmi:id="_vaGHYNsVEe6c9ehqpe3s7A" type="4001" element="_vZd1TNsVEe6c9ehqpe3s7A" source="_3BISYF4GEe2LuOZzJ_LhLg" target="_tkOK4NsVEe6c9ehqpe3s7A">
3720 <children xmi:type="notation:Node" xmi:id="_vaGucNsVEe6c9ehqpe3s7A" type="6001">
3721 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vaGucdsVEe6c9ehqpe3s7A" x="-1" y="-47"/>
3722 </children>
3723 <children xmi:type="notation:Node" xmi:id="_vaGuctsVEe6c9ehqpe3s7A" type="6002">
3724 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vaGuc9sVEe6c9ehqpe3s7A" y="10"/>
3725 </children>
3726 <children xmi:type="notation:Node" xmi:id="_vaGudNsVEe6c9ehqpe3s7A" type="6003">
3727 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vaGuddsVEe6c9ehqpe3s7A" y="10"/>
3728 </children>
3729 <styles xmi:type="notation:ConnectorStyle" xmi:id="_vaGHYdsVEe6c9ehqpe3s7A" routing="Rectilinear"/>
3730 <styles xmi:type="notation:FontStyle" xmi:id="_vaGHYtsVEe6c9ehqpe3s7A" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
3731 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vaGHY9sVEe6c9ehqpe3s7A" points="[0, 0, 0, -38]$[0, 38, 0, 0]"/>
3732 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vaGudtsVEe6c9ehqpe3s7A" id="(0.503448275862069,1.0)"/>
3733 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vaGud9sVEe6c9ehqpe3s7A" id="(0.503448275862069,0.0)"/>
3734 </edges>
3757 </data> 3735 </data>
3758 </ownedAnnotationEntries> 3736 </ownedAnnotationEntries>
3759 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_z1k_YV3lEe2LuOZzJ_LhLg" source="DANNOTATION_CUSTOMIZATION_KEY"> 3737 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_z1k_YV3lEe2LuOZzJ_LhLg" source="DANNOTATION_CUSTOMIZATION_KEY">
@@ -3830,7 +3808,7 @@
3830 </ownedStyle> 3808 </ownedStyle>
3831 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> 3809 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
3832 </ownedDiagramElements> 3810 </ownedDiagramElements>
3833 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mdrbEF3uEe2LuOZzJ_LhLg" name="UnaryExpr" tooltipText="" outgoingEdges="_FMB-xl3vEe2LuOZzJ_LhLg _uSiCAF3vEe2LuOZzJ_LhLg" incomingEdges="_vB8OTF4GEe2LuOZzJ_LhLg _EUlvyF4LEe2m7IaHDkh2Xg _HgMTBmTwEe2qdtyPWAtoxA" width="12" height="10"> 3811 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mdrbEF3uEe2LuOZzJ_LhLg" name="UnaryExpr" tooltipText="" outgoingEdges="_FMB-xl3vEe2LuOZzJ_LhLg _uSiCAF3vEe2LuOZzJ_LhLg" incomingEdges="_vB8OTF4GEe2LuOZzJ_LhLg _EUlvyF4LEe2m7IaHDkh2Xg" width="12" height="10">
3834 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/> 3812 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/>
3835 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/> 3813 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/>
3836 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 3814 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -3982,6 +3960,30 @@
3982 </ownedStyle> 3960 </ownedStyle>
3983 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> 3961 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
3984 </ownedElements> 3962 </ownedElements>
3963 <ownedElements xmi:type="diagram:DNodeListElement" uid="_BiDXENf8Ee66mJJuF_pPGg" name="AND" tooltipText="">
3964 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/AND"/>
3965 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/AND"/>
3966 <ownedStyle xmi:type="diagram:BundledImage" uid="_BiFMQNf8Ee66mJJuF_pPGg" labelAlignment="LEFT">
3967 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
3968 </ownedStyle>
3969 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
3970 </ownedElements>
3971 <ownedElements xmi:type="diagram:DNodeListElement" uid="_CGRecNf8Ee66mJJuF_pPGg" name="OR" tooltipText="">
3972 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/OR"/>
3973 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/OR"/>
3974 <ownedStyle xmi:type="diagram:BundledImage" uid="_CGRecdf8Ee66mJJuF_pPGg" labelAlignment="LEFT">
3975 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
3976 </ownedStyle>
3977 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
3978 </ownedElements>
3979 <ownedElements xmi:type="diagram:DNodeListElement" uid="_CopLsNf8Ee66mJJuF_pPGg" name="XOR" tooltipText="">
3980 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/XOR"/>
3981 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//BinaryOp/XOR"/>
3982 <ownedStyle xmi:type="diagram:BundledImage" uid="_CopywNf8Ee66mJJuF_pPGg" labelAlignment="LEFT">
3983 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
3984 </ownedStyle>
3985 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
3986 </ownedElements>
3985 </ownedDiagramElements> 3987 </ownedDiagramElements>
3986 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_R7XFMF38Ee2LuOZzJ_LhLg" name="ExistentialQuantifier" tooltipText="" outgoingEdges="_WGxVyF38Ee2LuOZzJ_LhLg" incomingEdges="_C0JQzV4LEe2m7IaHDkh2Xg _ZLAvTl9vEe2rXNsIDUvqhw" width="12" height="10"> 3988 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_R7XFMF38Ee2LuOZzJ_LhLg" name="ExistentialQuantifier" tooltipText="" outgoingEdges="_WGxVyF38Ee2LuOZzJ_LhLg" incomingEdges="_C0JQzV4LEe2m7IaHDkh2Xg _ZLAvTl9vEe2rXNsIDUvqhw" width="12" height="10">
3987 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ExistentialQuantifier"/> 3989 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ExistentialQuantifier"/>
@@ -4050,24 +4052,16 @@
4050 </ownedStyle> 4052 </ownedStyle>
4051 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 4053 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4052 </ownedDiagramElements> 4054 </ownedDiagramElements>
4053 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_3A1XcF4GEe2LuOZzJ_LhLg" name="AggregationExpr" tooltipText="" outgoingEdges="_ObhgTF4HEe2LuOZzJ_LhLg _q0dkhF4KEe2m7IaHDkh2Xg _Y-E8MF4LEe2m7IaHDkh2Xg _ZLAvTl9vEe2rXNsIDUvqhw" width="12" height="10"> 4055 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_3A1XcF4GEe2LuOZzJ_LhLg" name="AggregationExpr" tooltipText="" outgoingEdges="_ObhgTF4HEe2LuOZzJ_LhLg _q0dkhF4KEe2m7IaHDkh2Xg _Y-E8MF4LEe2m7IaHDkh2Xg _ZLAvTl9vEe2rXNsIDUvqhw _vZd1TNsVEe6c9ehqpe3s7A" width="12" height="10">
4054 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4056 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4055 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4057 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4056 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 4058 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4057 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 4059 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4058 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 4060 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4059 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_LM1SS19xEe2rXNsIDUvqhw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 4061 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_syXQI9sVEe6c9ehqpe3s7A" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
4060 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> 4062 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
4061 </ownedStyle> 4063 </ownedStyle>
4062 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> 4064 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
4063 <ownedElements xmi:type="diagram:DNodeListElement" uid="_nZoxHl9vEe2rXNsIDUvqhw" name="op : AggregationOp = SUM" tooltipText="">
4064 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AggregationExpr/op"/>
4065 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AggregationExpr/op"/>
4066 <ownedStyle xmi:type="diagram:BundledImage" uid="_nZoxH19vEe2rXNsIDUvqhw" labelAlignment="LEFT">
4067 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
4068 </ownedStyle>
4069 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
4070 </ownedElements>
4071 </ownedDiagramElements> 4065 </ownedDiagramElements>
4072 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ObhgTF4HEe2LuOZzJ_LhLg" name="[0..1] value" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg"> 4066 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ObhgTF4HEe2LuOZzJ_LhLg" name="[0..1] value" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg">
4073 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AggregationExpr/value"/> 4067 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AggregationExpr/value"/>
@@ -4082,49 +4076,6 @@
4082 </ownedStyle> 4076 </ownedStyle>
4083 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 4077 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
4084 </ownedDiagramElements> 4078 </ownedDiagramElements>
4085 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_YrdfAF4HEe2LuOZzJ_LhLg" name="AggregationOp" tooltipText="" width="12" height="10">
4086 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//AggregationOp"/>
4087 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//AggregationOp"/>
4088 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4089 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4090 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4091 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_YrdfAV4HEe2LuOZzJ_LhLg" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
4092 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/>
4093 </ownedStyle>
4094 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
4095 <ownedElements xmi:type="diagram:DNodeListElement" uid="_ZYVzIF4HEe2LuOZzJ_LhLg" name="SUM" tooltipText="">
4096 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/SUM"/>
4097 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/SUM"/>
4098 <ownedStyle xmi:type="diagram:BundledImage" uid="_ZYVzIV4HEe2LuOZzJ_LhLg" labelAlignment="LEFT">
4099 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4100 </ownedStyle>
4101 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4102 </ownedElements>
4103 <ownedElements xmi:type="diagram:DNodeListElement" uid="_Zyjp8F4HEe2LuOZzJ_LhLg" name="PROD" tooltipText="">
4104 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/PROD"/>
4105 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/PROD"/>
4106 <ownedStyle xmi:type="diagram:BundledImage" uid="_Zyjp8V4HEe2LuOZzJ_LhLg" labelAlignment="LEFT">
4107 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4108 </ownedStyle>
4109 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4110 </ownedElements>
4111 <ownedElements xmi:type="diagram:DNodeListElement" uid="_aDuScF4HEe2LuOZzJ_LhLg" name="MIN" tooltipText="">
4112 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/MIN"/>
4113 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/MIN"/>
4114 <ownedStyle xmi:type="diagram:BundledImage" uid="_aDuScV4HEe2LuOZzJ_LhLg" labelAlignment="LEFT">
4115 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4116 </ownedStyle>
4117 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4118 </ownedElements>
4119 <ownedElements xmi:type="diagram:DNodeListElement" uid="_aU4T4F4HEe2LuOZzJ_LhLg" name="MAX" tooltipText="">
4120 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/MAX"/>
4121 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//AggregationOp/MAX"/>
4122 <ownedStyle xmi:type="diagram:BundledImage" uid="_aU4T4V4HEe2LuOZzJ_LhLg" labelAlignment="LEFT">
4123 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4124 </ownedStyle>
4125 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4126 </ownedElements>
4127 </ownedDiagramElements>
4128 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_D6U8-V4IEe2LuOZzJ_LhLg" name="[0..1] singletonVariable" sourceNode="_9Ys7cF3lEe2LuOZzJ_LhLg" targetNode="_WGuSZF38Ee2LuOZzJ_LhLg"> 4079 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_D6U8-V4IEe2LuOZzJ_LhLg" name="[0..1] singletonVariable" sourceNode="_9Ys7cF3lEe2LuOZzJ_LhLg" targetNode="_WGuSZF38Ee2LuOZzJ_LhLg">
4129 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//VariableOrNodeExpr/singletonVariable"/> 4080 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//VariableOrNodeExpr/singletonVariable"/>
4130 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//VariableOrNodeExpr/singletonVariable"/> 4081 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//VariableOrNodeExpr/singletonVariable"/>
@@ -4138,7 +4089,7 @@
4138 </ownedStyle> 4089 </ownedStyle>
4139 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 4090 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
4140 </ownedDiagramElements> 4091 </ownedDiagramElements>
4141 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_86zJkF4IEe2LuOZzJ_LhLg" name="Constant" tooltipText="" outgoingEdges="_qYZuyGgtEe24RpwpWgpkFQ" incomingEdges="_JYWPtF4JEe2LuOZzJ_LhLg _JYW2c14JEe2LuOZzJ_LhLg _JYW2el4JEe2LuOZzJ_LhLg _dSnXTmkGEe24rIYSlCjKHA" width="12" height="10"> 4092 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_86zJkF4IEe2LuOZzJ_LhLg" name="Constant" tooltipText="" outgoingEdges="_qYZuyGgtEe24RpwpWgpkFQ" incomingEdges="_JYWPtF4JEe2LuOZzJ_LhLg _JYW2c14JEe2LuOZzJ_LhLg _JYW2el4JEe2LuOZzJ_LhLg _dSnXTmkGEe24rIYSlCjKHA _nHjNetjvEe66mJJuF_pPGg" width="12" height="10">
4142 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Constant"/> 4093 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Constant"/>
4143 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Constant"/> 4094 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Constant"/>
4144 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 4095 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -4246,12 +4197,12 @@
4246 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_q0dkhF4KEe2m7IaHDkh2Xg" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg"> 4197 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_q0dkhF4KEe2m7IaHDkh2Xg" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg">
4247 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4198 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4248 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4199 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4249 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_q0eLcF4KEe2m7IaHDkh2Xg" targetArrow="InputClosedArrow" routingStyle="tree"> 4200 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_syi2VtsVEe6c9ehqpe3s7A" targetArrow="InputClosedArrow" routingStyle="tree">
4250 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/> 4201 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
4251 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_q0eLcV4KEe2m7IaHDkh2Xg" showIcon="false"> 4202 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_syi2V9sVEe6c9ehqpe3s7A" showIcon="false">
4252 <labelFormat>italic</labelFormat> 4203 <labelFormat>italic</labelFormat>
4253 </beginLabelStyle> 4204 </beginLabelStyle>
4254 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_q0eLcl4KEe2m7IaHDkh2Xg" showIcon="false"/> 4205 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_syi2WNsVEe6c9ehqpe3s7A" showIcon="false"/>
4255 </ownedStyle> 4206 </ownedStyle>
4256 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 4207 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4257 </ownedDiagramElements> 4208 </ownedDiagramElements>
@@ -4355,12 +4306,12 @@
4355 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ZLAvTl9vEe2rXNsIDUvqhw" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_R7XFMF38Ee2LuOZzJ_LhLg"> 4306 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ZLAvTl9vEe2rXNsIDUvqhw" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_R7XFMF38Ee2LuOZzJ_LhLg">
4356 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4307 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4357 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/> 4308 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregationExpr"/>
4358 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_ZLAvT19vEe2rXNsIDUvqhw" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> 4309 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_syi2XNsVEe6c9ehqpe3s7A" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
4359 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/> 4310 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
4360 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_ZLAvUF9vEe2rXNsIDUvqhw" showIcon="false"> 4311 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_syi2XdsVEe6c9ehqpe3s7A" showIcon="false">
4361 <labelFormat>italic</labelFormat> 4312 <labelFormat>italic</labelFormat>
4362 </beginLabelStyle> 4313 </beginLabelStyle>
4363 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_ZLAvUV9vEe2rXNsIDUvqhw" showIcon="false"/> 4314 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_syi2XtsVEe6c9ehqpe3s7A" showIcon="false"/>
4364 </ownedStyle> 4315 </ownedStyle>
4365 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 4316 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4366 </ownedDiagramElements> 4317 </ownedDiagramElements>
@@ -4468,33 +4419,17 @@
4468 </ownedStyle> 4419 </ownedStyle>
4469 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> 4420 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4470 </ownedElements> 4421 </ownedElements>
4471 <ownedElements xmi:type="diagram:DNodeListElement" uid="_BtK6oGkFEe24rIYSlCjKHA" name="SUBSUMES" tooltipText=""> 4422 <ownedElements xmi:type="diagram:DNodeListElement" uid="_eqCSkGkFEe24rIYSlCjKHA" name="NODE_EQ" tooltipText="">
4472 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/SUBSUMES"/> 4423 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/NODE_EQ"/>
4473 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/SUBSUMES"/> 4424 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/NODE_EQ"/>
4474 <ownedStyle xmi:type="diagram:BundledImage" uid="_BtMv0GkFEe24rIYSlCjKHA" labelAlignment="LEFT">
4475 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4476 </ownedStyle>
4477 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4478 </ownedElements>
4479 <ownedElements xmi:type="diagram:DNodeListElement" uid="_dSepwGkFEe24rIYSlCjKHA" name="SUBSUMED_BY" tooltipText="">
4480 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/SUBSUMED_BY"/>
4481 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/SUBSUMED_BY"/>
4482 <ownedStyle xmi:type="diagram:BundledImage" uid="_dSfQ0GkFEe24rIYSlCjKHA" labelAlignment="LEFT">
4483 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4484 </ownedStyle>
4485 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4486 </ownedElements>
4487 <ownedElements xmi:type="diagram:DNodeListElement" uid="_eqCSkGkFEe24rIYSlCjKHA" name="ABS_EQ" tooltipText="">
4488 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/ABS_EQ"/>
4489 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/ABS_EQ"/>
4490 <ownedStyle xmi:type="diagram:BundledImage" uid="_eqCSkWkFEe24rIYSlCjKHA" labelAlignment="LEFT"> 4425 <ownedStyle xmi:type="diagram:BundledImage" uid="_eqCSkWkFEe24rIYSlCjKHA" labelAlignment="LEFT">
4491 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> 4426 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4492 </ownedStyle> 4427 </ownedStyle>
4493 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> 4428 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4494 </ownedElements> 4429 </ownedElements>
4495 <ownedElements xmi:type="diagram:DNodeListElement" uid="_p9Q6UGkFEe24rIYSlCjKHA" name="ABS_NOT_EQ" tooltipText=""> 4430 <ownedElements xmi:type="diagram:DNodeListElement" uid="_p9Q6UGkFEe24rIYSlCjKHA" name="NODE_NOT_EQ" tooltipText="">
4496 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/ABS_NOT_EQ"/> 4431 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/NODE_NOT_EQ"/>
4497 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/ABS_NOT_EQ"/> 4432 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ComparisonOp/NODE_NOT_EQ"/>
4498 <ownedStyle xmi:type="diagram:BundledImage" uid="_p9RhYGkFEe24rIYSlCjKHA" labelAlignment="LEFT"> 4433 <ownedStyle xmi:type="diagram:BundledImage" uid="_p9RhYGkFEe24rIYSlCjKHA" labelAlignment="LEFT">
4499 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> 4434 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4500 </ownedStyle> 4435 </ownedStyle>
@@ -4629,80 +4564,6 @@
4629 </ownedStyle> 4564 </ownedStyle>
4630 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 4565 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
4631 </ownedDiagramElements> 4566 </ownedDiagramElements>
4632 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_DM_YcGTwEe2qdtyPWAtoxA" name="ModalExpr" tooltipText="" outgoingEdges="_HgMTBmTwEe2qdtyPWAtoxA" width="12" height="10">
4633 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
4634 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
4635 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4636 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4637 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4638 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_G0fDp2TwEe2qdtyPWAtoxA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
4639 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
4640 </ownedStyle>
4641 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
4642 <ownedElements xmi:type="diagram:DNodeListElement" uid="_GD-MoGTwEe2qdtyPWAtoxA" name="modality : Modality = DEFAULT" tooltipText="">
4643 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/modality"/>
4644 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/modality"/>
4645 <ownedStyle xmi:type="diagram:BundledImage" uid="_G0fqp2TwEe2qdtyPWAtoxA" labelAlignment="LEFT">
4646 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
4647 </ownedStyle>
4648 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
4649 </ownedElements>
4650 </ownedDiagramElements>
4651 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_FOadoGTwEe2qdtyPWAtoxA" name="Modality" tooltipText="" width="12" height="10">
4652 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
4653 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
4654 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4655 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4656 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4657 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_FOadoWTwEe2qdtyPWAtoxA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
4658 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/>
4659 </ownedStyle>
4660 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
4661 <ownedElements xmi:type="diagram:DNodeListElement" uid="_FOevIGTwEe2qdtyPWAtoxA" name="DEFAULT" tooltipText="">
4662 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/DEFAULT"/>
4663 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/DEFAULT"/>
4664 <ownedStyle xmi:type="diagram:BundledImage" uid="_FOevIWTwEe2qdtyPWAtoxA" labelAlignment="LEFT">
4665 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4666 </ownedStyle>
4667 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4668 </ownedElements>
4669 <ownedElements xmi:type="diagram:DNodeListElement" uid="_FOevImTwEe2qdtyPWAtoxA" name="MAY" tooltipText="">
4670 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
4671 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
4672 <ownedStyle xmi:type="diagram:BundledImage" uid="_FOevI2TwEe2qdtyPWAtoxA" labelAlignment="LEFT">
4673 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4674 </ownedStyle>
4675 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4676 </ownedElements>
4677 <ownedElements xmi:type="diagram:DNodeListElement" uid="_FOevJGTwEe2qdtyPWAtoxA" name="MUST" tooltipText="">
4678 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
4679 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
4680 <ownedStyle xmi:type="diagram:BundledImage" uid="_FOevJWTwEe2qdtyPWAtoxA" labelAlignment="LEFT">
4681 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4682 </ownedStyle>
4683 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4684 </ownedElements>
4685 <ownedElements xmi:type="diagram:DNodeListElement" uid="_FOevJmTwEe2qdtyPWAtoxA" name="CURRENT" tooltipText="">
4686 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/CURRENT"/>
4687 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/CURRENT"/>
4688 <ownedStyle xmi:type="diagram:BundledImage" uid="_FOfWIGTwEe2qdtyPWAtoxA" labelAlignment="LEFT">
4689 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
4690 </ownedStyle>
4691 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
4692 </ownedElements>
4693 </ownedDiagramElements>
4694 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_HgMTBmTwEe2qdtyPWAtoxA" sourceNode="_DM_YcGTwEe2qdtyPWAtoxA" targetNode="_mdrbEF3uEe2LuOZzJ_LhLg">
4695 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
4696 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
4697 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_HgMTB2TwEe2qdtyPWAtoxA" targetArrow="InputClosedArrow" routingStyle="tree">
4698 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
4699 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_HgMTCGTwEe2qdtyPWAtoxA" showIcon="false">
4700 <labelFormat>italic</labelFormat>
4701 </beginLabelStyle>
4702 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_HgMTCWTwEe2qdtyPWAtoxA" showIcon="false"/>
4703 </ownedStyle>
4704 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4705 </ownedDiagramElements>
4706 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_MW7_mGTwEe2qdtyPWAtoxA" sourceNode="_LCzTkGTvEe2qdtyPWAtoxA" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg"> 4567 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_MW7_mGTwEe2qdtyPWAtoxA" sourceNode="_LCzTkGTvEe2qdtyPWAtoxA" targetNode="_3wvNYF3lEe2LuOZzJ_LhLg">
4707 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/> 4568 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/>
4708 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/> 4569 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/>
@@ -4947,6 +4808,50 @@
4947 </ownedStyle> 4808 </ownedStyle>
4948 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 4809 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4949 </ownedDiagramElements> 4810 </ownedDiagramElements>
4811 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_hNitANjvEe66mJJuF_pPGg" name="InfiniteConstant" tooltipText="" outgoingEdges="_nHjNetjvEe66mJJuF_pPGg" width="12" height="10">
4812 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//InfiniteConstant"/>
4813 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//InfiniteConstant"/>
4814 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4815 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4816 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4817 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_kgGbMdj1Ee6BBtaAvpH7kw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
4818 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
4819 </ownedStyle>
4820 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
4821 </ownedDiagramElements>
4822 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_nHjNetjvEe66mJJuF_pPGg" sourceNode="_hNitANjvEe66mJJuF_pPGg" targetNode="_86zJkF4IEe2LuOZzJ_LhLg">
4823 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//InfiniteConstant"/>
4824 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//InfiniteConstant"/>
4825 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_kgeOrNj1Ee6BBtaAvpH7kw" targetArrow="InputClosedArrow" routingStyle="tree">
4826 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
4827 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_kgeOrdj1Ee6BBtaAvpH7kw" showIcon="false">
4828 <labelFormat>italic</labelFormat>
4829 </beginLabelStyle>
4830 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_kgeOrtj1Ee6BBtaAvpH7kw" showIcon="false"/>
4831 </ownedStyle>
4832 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
4833 </ownedDiagramElements>
4834 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_tkAvgNsVEe6c9ehqpe3s7A" name="AggregatorDeclaration" tooltipText="" incomingEdges="_vZd1TNsVEe6c9ehqpe3s7A" width="12" height="10">
4835 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
4836 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AggregatorDeclaration"/>
4837 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
4838 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
4839 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
4840 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_tkAvgdsVEe6c9ehqpe3s7A" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
4841 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
4842 </ownedStyle>
4843 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
4844 </ownedDiagramElements>
4845 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_vZd1TNsVEe6c9ehqpe3s7A" name="[0..1] aggregator" sourceNode="_3A1XcF4GEe2LuOZzJ_LhLg" targetNode="_tkAvgNsVEe6c9ehqpe3s7A">
4846 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AggregationExpr/aggregator"/>
4847 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AggregationExpr/aggregator"/>
4848 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_vZecUNsVEe6c9ehqpe3s7A" routingStyle="manhattan" strokeColor="0,0,0">
4849 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']/@style"/>
4850 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_vZecUtsVEe6c9ehqpe3s7A" showIcon="false"/>
4851 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_vZecUdsVEe6c9ehqpe3s7A" labelSize="6" showIcon="false" labelColor="39,76,114"/>
4852 </ownedStyle>
4853 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
4854 </ownedDiagramElements>
4950 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 4855 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
4951 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_z1aAQF3lEe2LuOZzJ_LhLg"/> 4856 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_z1aAQF3lEe2LuOZzJ_LhLg"/>
4952 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 4857 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore
index eed134fd..9a349490 100644
--- a/subprojects/language-model/src/main/resources/model/problem.ecore
+++ b/subprojects/language-model/src/main/resources/model/problem.ecore
@@ -150,12 +150,6 @@
150 <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//VariableOrNode"/> 150 <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//VariableOrNode"/>
151 </eClassifiers> 151 </eClassifiers>
152 <eClassifiers xsi:type="ecore:EClass" name="NewVariable" eSuperTypes="#//Variable"/> 152 <eClassifiers xsi:type="ecore:EClass" name="NewVariable" eSuperTypes="#//Variable"/>
153 <eClassifiers xsi:type="ecore:EEnum" name="Modality">
154 <eLiterals name="DEFAULT" value="1"/>
155 <eLiterals name="MAY" value="2"/>
156 <eLiterals name="MUST" value="3"/>
157 <eLiterals name="CURRENT" value="3"/>
158 </eClassifiers>
159 <eClassifiers xsi:type="ecore:EEnum" name="ComparisonOp"> 153 <eClassifiers xsi:type="ecore:EEnum" name="ComparisonOp">
160 <eLiterals name="LESS"/> 154 <eLiterals name="LESS"/>
161 <eLiterals name="LESS_EQ" value="1"/> 155 <eLiterals name="LESS_EQ" value="1"/>
@@ -164,10 +158,8 @@
164 <eLiterals name="EQ" value="4"/> 158 <eLiterals name="EQ" value="4"/>
165 <eLiterals name="NOT_EQ" value="5"/> 159 <eLiterals name="NOT_EQ" value="5"/>
166 <eLiterals name="IN" value="6"/> 160 <eLiterals name="IN" value="6"/>
167 <eLiterals name="SUBSUMES" value="7"/> 161 <eLiterals name="NODE_EQ" value="9"/>
168 <eLiterals name="SUBSUMED_BY" value="8"/> 162 <eLiterals name="NODE_NOT_EQ" value="10"/>
169 <eLiterals name="ABS_EQ" value="9"/>
170 <eLiterals name="ABS_NOT_EQ" value="10"/>
171 </eClassifiers> 163 </eClassifiers>
172 <eClassifiers xsi:type="ecore:EEnum" name="ReferenceKind"> 164 <eClassifiers xsi:type="ecore:EEnum" name="ReferenceKind">
173 <eLiterals name="DEFAULT" value="1"/> 165 <eLiterals name="DEFAULT" value="1"/>
@@ -199,6 +191,9 @@
199 <eLiterals name="MUL" value="2"/> 191 <eLiterals name="MUL" value="2"/>
200 <eLiterals name="DIV" value="3"/> 192 <eLiterals name="DIV" value="3"/>
201 <eLiterals name="POW" value="4"/> 193 <eLiterals name="POW" value="4"/>
194 <eLiterals name="AND" value="5"/>
195 <eLiterals name="OR" value="6"/>
196 <eLiterals name="XOR" value="7"/>
202 </eClassifiers> 197 </eClassifiers>
203 <eClassifiers xsi:type="ecore:EClass" name="ArithmeticUnaryExpr" eSuperTypes="#//UnaryExpr"> 198 <eClassifiers xsi:type="ecore:EClass" name="ArithmeticUnaryExpr" eSuperTypes="#//UnaryExpr">
204 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="#//UnaryOp"/> 199 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="#//UnaryOp"/>
@@ -208,13 +203,7 @@
208 containment="true"/> 203 containment="true"/>
209 <eStructuralFeatures xsi:type="ecore:EReference" name="condition" eType="#//Expr" 204 <eStructuralFeatures xsi:type="ecore:EReference" name="condition" eType="#//Expr"
210 containment="true"/> 205 containment="true"/>
211 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="#//AggregationOp"/> 206 <eStructuralFeatures xsi:type="ecore:EReference" name="aggregator" eType="#//AggregatorDeclaration"/>
212 </eClassifiers>
213 <eClassifiers xsi:type="ecore:EEnum" name="AggregationOp">
214 <eLiterals name="SUM"/>
215 <eLiterals name="PROD" value="1"/>
216 <eLiterals name="MIN" value="2"/>
217 <eLiterals name="MAX" value="3"/>
218 </eClassifiers> 207 </eClassifiers>
219 <eClassifiers xsi:type="ecore:EClass" name="ComparisonExpr" eSuperTypes="#//BinaryExpr"> 208 <eClassifiers xsi:type="ecore:EClass" name="ComparisonExpr" eSuperTypes="#//BinaryExpr">
220 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="#//ComparisonOp"/> 209 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="#//ComparisonOp"/>
@@ -243,9 +232,6 @@
243 <eClassifiers xsi:type="ecore:EClass" name="NegationExpr" eSuperTypes="#//QuantifiedUnaryExpr"/> 232 <eClassifiers xsi:type="ecore:EClass" name="NegationExpr" eSuperTypes="#//QuantifiedUnaryExpr"/>
244 <eClassifiers xsi:type="ecore:EClass" name="CountExpr" eSuperTypes="#//QuantifiedUnaryExpr"/> 233 <eClassifiers xsi:type="ecore:EClass" name="CountExpr" eSuperTypes="#//QuantifiedUnaryExpr"/>
245 <eClassifiers xsi:type="ecore:EClass" name="Relation" abstract="true" eSuperTypes="#//NamedElement"/> 234 <eClassifiers xsi:type="ecore:EClass" name="Relation" abstract="true" eSuperTypes="#//NamedElement"/>
246 <eClassifiers xsi:type="ecore:EClass" name="ModalExpr" eSuperTypes="#//UnaryExpr">
247 <eStructuralFeatures xsi:type="ecore:EAttribute" name="modality" eType="#//Modality"/>
248 </eClassifiers>
249 <eClassifiers xsi:type="ecore:EClass" name="RangeExpr" eSuperTypes="#//BinaryExpr"/> 235 <eClassifiers xsi:type="ecore:EClass" name="RangeExpr" eSuperTypes="#//BinaryExpr"/>
250 <eClassifiers xsi:type="ecore:EClass" name="LogicConstant" eSuperTypes="#//Constant"> 236 <eClassifiers xsi:type="ecore:EClass" name="LogicConstant" eSuperTypes="#//Constant">
251 <eStructuralFeatures xsi:type="ecore:EAttribute" name="logicValue" eType="#//LogicValue"/> 237 <eStructuralFeatures xsi:type="ecore:EAttribute" name="logicValue" eType="#//LogicValue"/>
@@ -276,4 +262,6 @@
276 <eStructuralFeatures xsi:type="ecore:EReference" name="targetType" eType="#//Relation"/> 262 <eStructuralFeatures xsi:type="ecore:EReference" name="targetType" eType="#//Relation"/>
277 </eClassifiers> 263 </eClassifiers>
278 <eClassifiers xsi:type="ecore:EClass" name="AssignmentExpr" eSuperTypes="#//BinaryExpr"/> 264 <eClassifiers xsi:type="ecore:EClass" name="AssignmentExpr" eSuperTypes="#//BinaryExpr"/>
265 <eClassifiers xsi:type="ecore:EClass" name="InfiniteConstant" eSuperTypes="#//Constant"/>
266 <eClassifiers xsi:type="ecore:EClass" name="AggregatorDeclaration" eSuperTypes="#//Statement #//NamedElement"/>
279</ecore:EPackage> 267</ecore:EPackage>
diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel
index 927ec609..2a1d8522 100644
--- a/subprojects/language-model/src/main/resources/model/problem.genmodel
+++ b/subprojects/language-model/src/main/resources/model/problem.genmodel
@@ -16,12 +16,6 @@
16 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/UNKNOWN"/> 16 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/UNKNOWN"/>
17 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/ERROR"/> 17 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/ERROR"/>
18 </genEnums> 18 </genEnums>
19 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//Modality">
20 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/DEFAULT"/>
21 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/MAY"/>
22 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/MUST"/>
23 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/CURRENT"/>
24 </genEnums>
25 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ComparisonOp"> 19 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ComparisonOp">
26 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/LESS"/> 20 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/LESS"/>
27 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/LESS_EQ"/> 21 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/LESS_EQ"/>
@@ -30,10 +24,8 @@
30 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/EQ"/> 24 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/EQ"/>
31 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/NOT_EQ"/> 25 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/NOT_EQ"/>
32 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/IN"/> 26 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/IN"/>
33 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/SUBSUMES"/> 27 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/NODE_EQ"/>
34 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/SUBSUMED_BY"/> 28 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/NODE_NOT_EQ"/>
35 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/ABS_EQ"/>
36 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ComparisonOp/ABS_NOT_EQ"/>
37 </genEnums> 29 </genEnums>
38 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ReferenceKind"> 30 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ReferenceKind">
39 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/DEFAULT"/> 31 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/DEFAULT"/>
@@ -51,12 +43,9 @@
51 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/MUL"/> 43 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/MUL"/>
52 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/DIV"/> 44 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/DIV"/>
53 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/POW"/> 45 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/POW"/>
54 </genEnums> 46 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/AND"/>
55 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//AggregationOp"> 47 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/OR"/>
56 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//AggregationOp/SUM"/> 48 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//BinaryOp/XOR"/>
57 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//AggregationOp/PROD"/>
58 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//AggregationOp/MIN"/>
59 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//AggregationOp/MAX"/>
60 </genEnums> 49 </genEnums>
61 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ModuleKind"> 50 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ModuleKind">
62 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ModuleKind/PROBLEM"/> 51 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ModuleKind/PROBLEM"/>
@@ -200,7 +189,7 @@
200 <genClasses ecoreClass="problem.ecore#//AggregationExpr"> 189 <genClasses ecoreClass="problem.ecore#//AggregationExpr">
201 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AggregationExpr/value"/> 190 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AggregationExpr/value"/>
202 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AggregationExpr/condition"/> 191 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AggregationExpr/condition"/>
203 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//AggregationExpr/op"/> 192 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//AggregationExpr/aggregator"/>
204 </genClasses> 193 </genClasses>
205 <genClasses ecoreClass="problem.ecore#//ComparisonExpr"> 194 <genClasses ecoreClass="problem.ecore#//ComparisonExpr">
206 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ComparisonExpr/op"/> 195 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ComparisonExpr/op"/>
@@ -224,9 +213,6 @@
224 <genClasses ecoreClass="problem.ecore#//NegationExpr"/> 213 <genClasses ecoreClass="problem.ecore#//NegationExpr"/>
225 <genClasses ecoreClass="problem.ecore#//CountExpr"/> 214 <genClasses ecoreClass="problem.ecore#//CountExpr"/>
226 <genClasses ecoreClass="problem.ecore#//Relation"/> 215 <genClasses ecoreClass="problem.ecore#//Relation"/>
227 <genClasses ecoreClass="problem.ecore#//ModalExpr">
228 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ModalExpr/modality"/>
229 </genClasses>
230 <genClasses ecoreClass="problem.ecore#//RangeExpr"/> 216 <genClasses ecoreClass="problem.ecore#//RangeExpr"/>
231 <genClasses ecoreClass="problem.ecore#//LogicConstant"> 217 <genClasses ecoreClass="problem.ecore#//LogicConstant">
232 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//LogicConstant/logicValue"/> 218 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//LogicConstant/logicValue"/>
@@ -244,5 +230,7 @@
244 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//CastExpr/targetType"/> 230 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//CastExpr/targetType"/>
245 </genClasses> 231 </genClasses>
246 <genClasses ecoreClass="problem.ecore#//AssignmentExpr"/> 232 <genClasses ecoreClass="problem.ecore#//AssignmentExpr"/>
233 <genClasses ecoreClass="problem.ecore#//InfiniteConstant"/>
234 <genClasses ecoreClass="problem.ecore#//AggregatorDeclaration"/>
247 </genPackages> 235 </genPackages>
248</genmodel:GenModel> 236</genmodel:GenModel>
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
index 203baad6..2a623cf1 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -8,10 +8,10 @@ package tools.refinery.language.semantics;
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import tools.refinery.language.library.BuiltinLibrary; 9import tools.refinery.language.library.BuiltinLibrary;
10import tools.refinery.language.model.problem.*; 10import tools.refinery.language.model.problem.*;
11import tools.refinery.language.scoping.imports.ImportAdapterProvider;
11import tools.refinery.language.scoping.imports.ImportCollector; 12import tools.refinery.language.scoping.imports.ImportCollector;
12import tools.refinery.language.semantics.internal.MutableSeed; 13import tools.refinery.language.semantics.internal.MutableSeed;
13import tools.refinery.language.utils.BuiltinSymbols; 14import tools.refinery.language.utils.BuiltinSymbols;
14import tools.refinery.language.utils.ProblemDesugarer;
15import tools.refinery.language.utils.ProblemUtil; 15import tools.refinery.language.utils.ProblemUtil;
16import tools.refinery.store.dse.propagation.PropagationBuilder; 16import tools.refinery.store.dse.propagation.PropagationBuilder;
17import tools.refinery.store.model.ModelStoreBuilder; 17import tools.refinery.store.model.ModelStoreBuilder;
@@ -48,9 +48,6 @@ import java.util.*;
48 48
49public class ModelInitializer { 49public class ModelInitializer {
50 @Inject 50 @Inject
51 private ProblemDesugarer desugarer;
52
53 @Inject
54 private SemanticsUtils semanticsUtils; 51 private SemanticsUtils semanticsUtils;
55 52
56 @Inject 53 @Inject
@@ -59,6 +56,9 @@ public class ModelInitializer {
59 @Inject 56 @Inject
60 private ImportCollector importCollector; 57 private ImportCollector importCollector;
61 58
59 @Inject
60 private ImportAdapterProvider importAdapterProvider;
61
62 private Problem problem; 62 private Problem problem;
63 63
64 private final Set<Problem> importedProblems = new HashSet<>(); 64 private final Set<Problem> importedProblems = new HashSet<>();
@@ -96,8 +96,7 @@ public class ModelInitializer {
96 importedProblems.add(problem); 96 importedProblems.add(problem);
97 problemTrace.setProblem(problem); 97 problemTrace.setProblem(problem);
98 try { 98 try {
99 builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalArgumentException( 99 builtinSymbols = importAdapterProvider.getBuiltinSymbols(problem);
100 "Problem has no builtin library"));
101 var nodeInfo = collectPartialRelation(builtinSymbols.node(), 1, TruthValue.TRUE, TruthValue.TRUE); 100 var nodeInfo = collectPartialRelation(builtinSymbols.node(), 1, TruthValue.TRUE, TruthValue.TRUE);
102 nodeRelation = nodeInfo.partialRelation(); 101 nodeRelation = nodeInfo.partialRelation();
103 metamodelBuilder.type(nodeRelation); 102 metamodelBuilder.type(nodeRelation);
@@ -681,8 +680,8 @@ public class ModelInitializer {
681 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), 680 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()),
682 localScope, literals); 681 localScope, literals);
683 boolean positive = switch (comparisonExpr.getOp()) { 682 boolean positive = switch (comparisonExpr.getOp()) {
684 case EQ -> true; 683 case NODE_EQ -> true;
685 case NOT_EQ -> false; 684 case NODE_NOT_EQ -> false;
686 default -> throw new TracedException( 685 default -> throw new TracedException(
687 comparisonExpr, "Unsupported operator"); 686 comparisonExpr, "Unsupported operator");
688 }; 687 };
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java
index 9c40e6df..5e0526bc 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java
@@ -7,7 +7,6 @@ package tools.refinery.language.semantics;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import com.google.inject.Singleton; 9import com.google.inject.Singleton;
10import com.google.inject.name.Named;
11import org.eclipse.emf.ecore.EClass; 10import org.eclipse.emf.ecore.EClass;
12import org.eclipse.emf.ecore.EObject; 11import org.eclipse.emf.ecore.EObject;
13import org.eclipse.emf.ecore.util.EcoreUtil; 12import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -20,7 +19,6 @@ import org.eclipse.xtext.scoping.IScope;
20import org.jetbrains.annotations.NotNull; 19import org.jetbrains.annotations.NotNull;
21import org.jetbrains.annotations.Nullable; 20import org.jetbrains.annotations.Nullable;
22import tools.refinery.language.model.problem.Problem; 21import tools.refinery.language.model.problem.Problem;
23import tools.refinery.language.naming.ProblemQualifiedNameProvider;
24 22
25import java.util.Optional; 23import java.util.Optional;
26 24
@@ -30,17 +28,13 @@ public class SemanticsUtils {
30 private IQualifiedNameProvider qualifiedNameProvider; 28 private IQualifiedNameProvider qualifiedNameProvider;
31 29
32 @Inject 30 @Inject
33 @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE)
34 private IQualifiedNameProvider delegateQualifiedNameProvider;
35
36 @Inject
37 private IQualifiedNameConverter qualifiedNameConverter; 31 private IQualifiedNameConverter qualifiedNameConverter;
38 32
39 @Inject 33 @Inject
40 private IResourceDescriptionsProvider resourceDescriptionsProvider; 34 private IResourceDescriptionsProvider resourceDescriptionsProvider;
41 35
42 public Optional<String> getNameWithoutRootPrefix(EObject eObject) { 36 public Optional<String> getNameWithoutRootPrefix(EObject eObject) {
43 var qualifiedName = delegateQualifiedNameProvider.getFullyQualifiedName(eObject); 37 var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(eObject);
44 if (qualifiedName == null) { 38 if (qualifiedName == null) {
45 return Optional.empty(); 39 return Optional.empty();
46 } 40 }
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
index 377a66f3..61e70bcd 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
@@ -21,7 +21,8 @@ import org.eclipse.xtext.resource.XtextResourceSet;
21import org.eclipse.xtext.scoping.IScopeProvider; 21import org.eclipse.xtext.scoping.IScopeProvider;
22import tools.refinery.language.model.problem.*; 22import tools.refinery.language.model.problem.*;
23import tools.refinery.language.naming.NamingUtil; 23import tools.refinery.language.naming.NamingUtil;
24import tools.refinery.language.utils.ProblemDesugarer; 24import tools.refinery.language.scoping.imports.ImportAdapterProvider;
25import tools.refinery.language.typesystem.SignatureProvider;
25import tools.refinery.language.utils.ProblemUtil; 26import tools.refinery.language.utils.ProblemUtil;
26import tools.refinery.store.model.Model; 27import tools.refinery.store.model.Model;
27import tools.refinery.store.reasoning.ReasoningAdapter; 28import tools.refinery.store.reasoning.ReasoningAdapter;
@@ -57,10 +58,13 @@ public class SolutionSerializer {
57 private IScopeProvider scopeProvider; 58 private IScopeProvider scopeProvider;
58 59
59 @Inject 60 @Inject
60 private ProblemDesugarer desugarer; 61 private NodeNameProvider nameProvider;
61 62
62 @Inject 63 @Inject
63 private NodeNameProvider nameProvider; 64 private ImportAdapterProvider importAdapterProvider;
65
66 @Inject
67 private SignatureProvider signatureProvider;
64 68
65 private ProblemTrace trace; 69 private ProblemTrace trace;
66 private Model model; 70 private Model model;
@@ -223,8 +227,7 @@ public class SolutionSerializer {
223 } 227 }
224 228
225 private void addExistsAssertions() { 229 private void addExistsAssertions() {
226 var builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalStateException("No " + 230 var builtinSymbols = importAdapterProvider.getBuiltinSymbols(problem);
227 "builtin library in copied problem"));
228 // Make sure to output exists assertions in a deterministic order. 231 // Make sure to output exists assertions in a deterministic order.
229 var sortedNewNodes = new TreeMap<Integer, Node>(); 232 var sortedNewNodes = new TreeMap<Integer, Node>();
230 for (var pair : trace.getNodeTrace().keyValuesView()) { 233 for (var pair : trace.getNodeTrace().keyValuesView()) {
@@ -336,7 +339,7 @@ public class SolutionSerializer {
336 var assertion = ProblemFactory.eINSTANCE.createAssertion(); 339 var assertion = ProblemFactory.eINSTANCE.createAssertion();
337 assertion.setDefault(true); 340 assertion.setDefault(true);
338 assertion.setRelation(relation); 341 assertion.setRelation(relation);
339 int arity = ProblemUtil.getArity(relation); 342 int arity = signatureProvider.getArity(relation);
340 for (int i = 0; i < arity; i++) { 343 for (int i = 0; i < arity; i++) {
341 var argument = ProblemFactory.eINSTANCE.createWildcardAssertionArgument(); 344 var argument = ProblemFactory.eINSTANCE.createWildcardAssertionArgument();
342 assertion.getArguments().add(argument); 345 assertion.getArguments().add(argument);
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
index 1858fc87..91008919 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
@@ -7,7 +7,6 @@ package tools.refinery.language.web.semantics.metadata;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import com.google.inject.Provider; 9import com.google.inject.Provider;
10import com.google.inject.name.Named;
11import org.eclipse.emf.ecore.EObject; 10import org.eclipse.emf.ecore.EObject;
12import org.eclipse.xtext.naming.IQualifiedNameConverter; 11import org.eclipse.xtext.naming.IQualifiedNameConverter;
13import org.eclipse.xtext.naming.IQualifiedNameProvider; 12import org.eclipse.xtext.naming.IQualifiedNameProvider;
@@ -15,7 +14,6 @@ import org.eclipse.xtext.naming.QualifiedName;
15import org.eclipse.xtext.scoping.IScope; 14import org.eclipse.xtext.scoping.IScope;
16import org.eclipse.xtext.scoping.IScopeProvider; 15import org.eclipse.xtext.scoping.IScopeProvider;
17import tools.refinery.language.model.problem.*; 16import tools.refinery.language.model.problem.*;
18import tools.refinery.language.naming.ProblemQualifiedNameProvider;
19import tools.refinery.language.semantics.ProblemTrace; 17import tools.refinery.language.semantics.ProblemTrace;
20import tools.refinery.language.semantics.TracedException; 18import tools.refinery.language.semantics.TracedException;
21import tools.refinery.language.utils.ProblemUtil; 19import tools.refinery.language.utils.ProblemUtil;
@@ -34,7 +32,6 @@ public class MetadataCreator {
34 private IScopeProvider scopeProvider; 32 private IScopeProvider scopeProvider;
35 33
36 @Inject 34 @Inject
37 @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE)
38 private IQualifiedNameProvider qualifiedNameProvider; 35 private IQualifiedNameProvider qualifiedNameProvider;
39 36
40 @Inject 37 @Inject
diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
index 43351d3e..08f7a585 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
+++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
@@ -17,7 +17,8 @@ enum ModuleKind:
17 17
18Statement: 18Statement:
19 ImportStatement | Assertion | ClassDeclaration | EnumDeclaration | 19 ImportStatement | Assertion | ClassDeclaration | EnumDeclaration |
20 DatatypeDeclaration | PredicateDefinition | /* FunctionDefinition | RuleDefinition | */ 20 DatatypeDeclaration | AggregatorDeclaration | PredicateDefinition |
21 /* FunctionDefinition | RuleDefinition | */
21 ScopeDeclaration | NodeDeclaration; 22 ScopeDeclaration | NodeDeclaration;
22 23
23ImportStatement: 24ImportStatement:
@@ -40,6 +41,9 @@ EnumLiteral returns Node:
40DatatypeDeclaration: 41DatatypeDeclaration:
41 "extern" "datatype" name=Identifier "."; 42 "extern" "datatype" name=Identifier ".";
42 43
44AggregatorDeclaration:
45 "extern" "aggregator" name=Identifier ".";
46
43enum ReferenceKind: 47enum ReferenceKind:
44 REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container"; 48 REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container";
45 49
@@ -71,7 +75,6 @@ Conjunction:
71// 75//
72//Case: 76//Case:
73// Conjunction ({Match.condition=current} "->" value=Expr)?; 77// Conjunction ({Match.condition=current} "->" value=Expr)?;
74
75//RuleDefinition: 78//RuleDefinition:
76// "rule" 79// "rule"
77// name=Identifier 80// name=Identifier
@@ -106,11 +109,18 @@ Expr:
106 AssignmentExpr; 109 AssignmentExpr;
107 110
108AssignmentExpr returns Expr: 111AssignmentExpr returns Expr:
109 ComparisonExpr ({AssignmentExpr.left=current}"is" right=ComparisonExpr)*; 112 BooleanExpr ({AssignmentExpr.left=current} "is" right=BooleanExpr)*;
113
114enum BooleanBinaryOp returns BinaryOp:
115 AND="&&" | OR="||" | XOR="^^";
116
117BooleanExpr returns Expr:
118 ComparisonExpr ({ArithmeticBinaryExpr.left=current}
119 op=BooleanBinaryOp right=ComparisonExpr)*;
110 120
111enum ComparisonOp: 121enum ComparisonOp:
112 LESS="<" | LESS_EQ="<=" | GREATER=">" | GREATER_EQ=">=" | EQ="==" | NOT_EQ="!=" | 122 LESS="<" | LESS_EQ="<=" | GREATER=">" | GREATER_EQ=">=" | EQ="===" | NOT_EQ="!==" |
113 IN="in" | SUBSUMES=":>" | SUBSUMED_BY="<:" | ABS_EQ="===" | ABS_NOT_EQ="!=="; 123 IN="in" | NODE_EQ="==" | NODE_NOT_EQ="!=";
114 124
115ComparisonExpr returns Expr: 125ComparisonExpr returns Expr:
116 LatticeExpr ({ComparisonExpr.left=current} 126 LatticeExpr ({ComparisonExpr.left=current}
@@ -120,12 +130,8 @@ enum LatticeBinaryOp:
120 MEET="/\\" | JOIN="\\/"; 130 MEET="/\\" | JOIN="\\/";
121 131
122LatticeExpr returns Expr: 132LatticeExpr returns Expr:
123 RangeExpr ({LatticeBinaryExpr.left=current} 133 AdditiveExpr ({LatticeBinaryExpr.left=current}
124 op=LatticeBinaryOp right=RangeExpr)*; 134 op=LatticeBinaryOp right=AdditiveExpr)*;
125
126RangeExpr returns Expr:
127 AdditiveExpr ({RangeExpr.left=current} ".." ("*" | right=AdditiveExpr))* |
128 {RangeExpr} "*" ".." ("*" | right=AdditiveExpr);
129 135
130enum AdditiveOp returns BinaryOp: 136enum AdditiveOp returns BinaryOp:
131 ADD="+" | SUB="-"; 137 ADD="+" | SUB="-";
@@ -145,11 +151,14 @@ enum ExponentialOp returns BinaryOp:
145 POW="**"; 151 POW="**";
146 152
147ExponentialExpr returns Expr: 153ExponentialExpr returns Expr:
148 UnaryExpr ({ArithmeticBinaryExpr.left=current} 154 RangeExpr ({ArithmeticBinaryExpr.left=current}
149 op=ExponentialOp right=ExponentialExpr)?; 155 op=ExponentialOp right=ExponentialExpr)?;
150 156
157RangeExpr returns Expr:
158 UnaryExpr ({RangeExpr.left=current} ".." right=UnaryExpr)*;
159
151UnaryExpr returns Expr: 160UnaryExpr returns Expr:
152 ArithmeticUnaryExpr | ModalExpr | NegationExpr | 161 ArithmeticUnaryExpr | NegationExpr |
153 CountExpr | AggregationExpr | CastExpr; 162 CountExpr | AggregationExpr | CastExpr;
154 163
155enum UnaryOp: 164enum UnaryOp:
@@ -158,23 +167,15 @@ enum UnaryOp:
158ArithmeticUnaryExpr: 167ArithmeticUnaryExpr:
159 op=UnaryOp body=UnaryExpr; 168 op=UnaryOp body=UnaryExpr;
160 169
161enum Modality:
162 MAY="may" | MUST="must" | CURRENT="current";
163
164ModalExpr:
165 modality=Modality body=UnaryExpr;
166
167NegationExpr: 170NegationExpr:
168 "!" body=UnaryExpr; 171 "!" body=UnaryExpr;
169 172
170CountExpr: 173CountExpr:
171 "count" body=UnaryExpr; 174 "count" body=UnaryExpr;
172 175
173enum AggregationOp:
174 SUM="sum" | PROD="prod" | MIN="min" | MAX="max";
175
176AggregationExpr: 176AggregationExpr:
177 op=AggregationOp "{" value=Expr "|" condition=ComparisonExpr "}"; 177 aggregator=[AggregatorDeclaration|QualifiedName]
178 "{" value=Expr "|" condition=ComparisonExpr "}";
178 179
179CastExpr returns Expr: 180CastExpr returns Expr:
180 CastExprBody ({CastExpr.body=current} "as" targetType=[Relation|QualifiedName])?; 181 CastExprBody ({CastExpr.body=current} "as" targetType=[Relation|QualifiedName])?;
@@ -191,7 +192,7 @@ VariableOrNodeExpr:
191 variableOrNode=[VariableOrNode|QualifiedName]; 192 variableOrNode=[VariableOrNode|QualifiedName];
192 193
193Constant: 194Constant:
194 RealConstant | IntConstant | StringConstant | LogicConstant; 195 RealConstant | IntConstant | StringConstant | InfiniteConstant | LogicConstant;
195 196
196IntConstant: 197IntConstant:
197 intValue=INT; 198 intValue=INT;
@@ -202,6 +203,9 @@ RealConstant:
202StringConstant: 203StringConstant:
203 stringValue=STRING; 204 stringValue=STRING;
204 205
206InfiniteConstant:
207 {InfiniteConstant} "*";
208
205enum LogicValue: 209enum LogicValue:
206 TRUE="true" | FALSE="false" | UNKNOWN="unknown" | ERROR="error"; 210 TRUE="true" | FALSE="false" | UNKNOWN="unknown" | ERROR="error";
207 211
@@ -276,8 +280,8 @@ Identifier:
276 NonContainmentIdentifier | "contains" | "container"; 280 NonContainmentIdentifier | "contains" | "container";
277 281
278NonContainmentIdentifier: 282NonContainmentIdentifier:
279 ID | "atom" | "multi" | "contained" | 283 ID | "atom" | "multi" | "contained" | "problem" | "module" |
280 "sum" | "prod" | "min" | "max" | "problem" | "module"; 284 "datatype" | "aggregator";
281 285
282Real returns ecore::EDouble: 286Real returns ecore::EDouble:
283 EXPONENTIAL | INT "." (INT | EXPONENTIAL); 287 EXPONENTIAL | INT "." (INT | EXPONENTIAL);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java
index f7039027..955a89f9 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java
@@ -30,9 +30,8 @@ import org.eclipse.xtext.validation.IResourceValidator;
30import org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator; 30import org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator;
31import tools.refinery.language.conversion.ProblemValueConverterService; 31import tools.refinery.language.conversion.ProblemValueConverterService;
32import tools.refinery.language.linking.ProblemLinkingService; 32import tools.refinery.language.linking.ProblemLinkingService;
33import tools.refinery.language.naming.ProblemDelegateQualifiedNameProvider;
34import tools.refinery.language.naming.ProblemQualifiedNameConverter;
35import tools.refinery.language.naming.ProblemQualifiedNameProvider; 33import tools.refinery.language.naming.ProblemQualifiedNameProvider;
34import tools.refinery.language.naming.ProblemQualifiedNameConverter;
36import tools.refinery.language.parser.ProblemEcoreElementFactory; 35import tools.refinery.language.parser.ProblemEcoreElementFactory;
37import tools.refinery.language.parser.antlr.TokenSourceInjectingProblemParser; 36import tools.refinery.language.parser.antlr.TokenSourceInjectingProblemParser;
38import tools.refinery.language.resource.ProblemLocationInFileProvider; 37import tools.refinery.language.resource.ProblemLocationInFileProvider;
@@ -68,12 +67,6 @@ public class ProblemRuntimeModule extends AbstractProblemRuntimeModule {
68 return ProblemQualifiedNameConverter.class; 67 return ProblemQualifiedNameConverter.class;
69 } 68 }
70 69
71 public void configureIQualifiedNameProviderDelegate(Binder binder) {
72 binder.bind(IQualifiedNameProvider.class)
73 .annotatedWith(Names.named(ProblemQualifiedNameProvider.NAMED_DELEGATE))
74 .to(ProblemDelegateQualifiedNameProvider.class);
75 }
76
77 @Override 70 @Override
78 public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() { 71 public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
79 return ProblemQualifiedNameProvider.class; 72 return ProblemQualifiedNameProvider.class;
diff --git a/subprojects/language/src/main/java/tools/refinery/language/expressions/AbstractTermInterpreter.java b/subprojects/language/src/main/java/tools/refinery/language/expressions/AbstractTermInterpreter.java
new file mode 100644
index 00000000..2530b707
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/expressions/AbstractTermInterpreter.java
@@ -0,0 +1,131 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.expressions;
7
8import tools.refinery.language.model.problem.BinaryOp;
9import tools.refinery.language.model.problem.UnaryOp;
10import tools.refinery.language.typesystem.AggregatorName;
11import tools.refinery.language.typesystem.DataExprType;
12
13import java.util.*;
14
15// This class is used to configure term interpreters by clients with various arguments.
16@SuppressWarnings("SameParameterValue")
17public abstract class AbstractTermInterpreter implements TermInterpreter {
18 private final Map<DataExprType, DataExprType> negations = new HashMap<>();
19 private final Map<UnaryKey, DataExprType> unaryOperators = new HashMap<>();
20 private final Set<DataExprType> comparisons = new HashSet<>();
21 private final Set<DataExprType> ranges = new HashSet<>();
22 private final Map<BinaryKey, DataExprType> binaryOperators = new HashMap<>();
23 private final Set<CastKey> casts = new HashSet<>();
24 private final Map<AggregatorKey, DataExprType> aggregators = new HashMap<>();
25
26 protected AbstractTermInterpreter() {
27 }
28
29 protected void addNegation(DataExprType type, DataExprType result) {
30 negations.put(type, result);
31 }
32
33 protected void addNegation(DataExprType type) {
34 addNegation(type, type);
35 }
36
37 protected void addUnaryOperator(UnaryOp op, DataExprType type, DataExprType result) {
38 unaryOperators.put(new UnaryKey(op, type), result);
39 }
40
41 protected void addUnaryOperator(UnaryOp op, DataExprType type) {
42 addUnaryOperator(op, type, type);
43 }
44
45 protected void addComparison(DataExprType type) {
46 comparisons.add(type);
47 }
48
49 protected void addRange(DataExprType type) {
50 ranges.add(type);
51 }
52
53 protected void addBinaryOperator(BinaryOp op, DataExprType leftType, DataExprType rightType, DataExprType result) {
54 binaryOperators.put(new BinaryKey(op, leftType, rightType), result);
55 }
56
57 protected void addBinaryOperator(BinaryOp op, DataExprType type) {
58 addBinaryOperator(op, type, type, type);
59 }
60
61 protected void addCast(DataExprType fromType, DataExprType toType) {
62 if (fromType.equals(toType)) {
63 throw new IllegalArgumentException("The fromType and toType of a cast operator must be different");
64 }
65 casts.add(new CastKey(fromType, toType));
66 }
67
68 protected void addAggregator(AggregatorName aggregator, DataExprType type, DataExprType result) {
69 aggregators.put(new AggregatorKey(aggregator, type), result);
70 }
71
72 protected void addAggregator(AggregatorName aggregator, DataExprType type) {
73 addAggregator(aggregator, type, type);
74 }
75
76 @Override
77 public Optional<DataExprType> getNegationType(DataExprType type) {
78 return Optional.ofNullable(negations.get(type));
79 }
80
81 @Override
82 public Optional<DataExprType> getUnaryOperationType(UnaryOp op, DataExprType type) {
83 if (unaryOperators.isEmpty()) {
84 return Optional.empty();
85 }
86 return Optional.ofNullable(unaryOperators.get(new UnaryKey(op, type)));
87 }
88
89 @Override
90 public boolean isComparisonSupported(DataExprType type) {
91 return comparisons.contains(type);
92 }
93
94 @Override
95 public boolean isRangeSupported(DataExprType type) {
96 return ranges.contains(type);
97 }
98
99 @Override
100 public Optional<DataExprType> getBinaryOperationType(BinaryOp op, DataExprType leftType, DataExprType rightType) {
101 if (binaryOperators.isEmpty()) {
102 return Optional.empty();
103 }
104 return Optional.ofNullable(binaryOperators.get(new BinaryKey(op, leftType, rightType)));
105 }
106
107 @Override
108 public Optional<DataExprType> getAggregationType(AggregatorName aggregator, DataExprType type) {
109 if (aggregators.isEmpty()) {
110 return Optional.empty();
111 }
112 return Optional.ofNullable(aggregators.get(new AggregatorKey(aggregator, type)));
113 }
114
115 @Override
116 public boolean isCastSupported(DataExprType fromType, DataExprType toType) {
117 return casts.contains(new CastKey(fromType, toType));
118 }
119
120 private record UnaryKey(UnaryOp op, DataExprType type) {
121 }
122
123 private record BinaryKey(BinaryOp op, DataExprType leftType, DataExprType rightType) {
124 }
125
126 private record CastKey(DataExprType fromType, DataExprType toType) {
127 }
128
129 private record AggregatorKey(AggregatorName aggregator, DataExprType type) {
130 }
131}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/expressions/BuiltinTermInterpreter.java b/subprojects/language/src/main/java/tools/refinery/language/expressions/BuiltinTermInterpreter.java
new file mode 100644
index 00000000..412ed8ba
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/expressions/BuiltinTermInterpreter.java
@@ -0,0 +1,54 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.expressions;
7
8import tools.refinery.language.library.BuiltinLibrary;
9import tools.refinery.language.model.problem.BinaryOp;
10import tools.refinery.language.model.problem.UnaryOp;
11import tools.refinery.language.typesystem.AggregatorName;
12import tools.refinery.language.typesystem.DataExprType;
13
14public final class BuiltinTermInterpreter extends AbstractTermInterpreter {
15 public static final DataExprType BOOLEAN_TYPE = new DataExprType(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "boolean");
16 public static final DataExprType INT_TYPE = new DataExprType(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "int");
17 public static final DataExprType REAL_TYPE = new DataExprType(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "real");
18 public static final DataExprType STRING_TYPE = new DataExprType(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "string");
19 public static final AggregatorName MIN_AGGREGATOR = new AggregatorName(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "min");
20 public static final AggregatorName MAX_AGGREGATOR = new AggregatorName(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "max");
21 public static final AggregatorName SUM_AGGREGATOR = new AggregatorName(BuiltinLibrary.BUILTIN_LIBRARY_NAME, "sum");
22
23 public BuiltinTermInterpreter() {
24 addNegation(BOOLEAN_TYPE);
25 addBinaryOperator(BinaryOp.AND, BOOLEAN_TYPE);
26 addBinaryOperator(BinaryOp.OR, BOOLEAN_TYPE);
27 addBinaryOperator(BinaryOp.XOR, BOOLEAN_TYPE);
28
29 addUnaryOperator(UnaryOp.PLUS, INT_TYPE);
30 addUnaryOperator(UnaryOp.MINUS, INT_TYPE);
31 addComparison(INT_TYPE);
32 addRange(INT_TYPE);
33 addBinaryOperator(BinaryOp.ADD, INT_TYPE);
34 addBinaryOperator(BinaryOp.SUB, INT_TYPE);
35 addBinaryOperator(BinaryOp.MUL, INT_TYPE);
36 addAggregator(MIN_AGGREGATOR, INT_TYPE);
37 addAggregator(MAX_AGGREGATOR, INT_TYPE);
38 addAggregator(SUM_AGGREGATOR, INT_TYPE);
39
40 addUnaryOperator(UnaryOp.PLUS, REAL_TYPE);
41 addUnaryOperator(UnaryOp.MINUS, REAL_TYPE);
42 addCast(INT_TYPE, REAL_TYPE);
43 addComparison(REAL_TYPE);
44 addRange(REAL_TYPE);
45 addBinaryOperator(BinaryOp.ADD, REAL_TYPE);
46 addBinaryOperator(BinaryOp.SUB, REAL_TYPE);
47 addBinaryOperator(BinaryOp.MUL, REAL_TYPE);
48 addBinaryOperator(BinaryOp.DIV, REAL_TYPE);
49 addBinaryOperator(BinaryOp.POW, REAL_TYPE);
50 addAggregator(MIN_AGGREGATOR, REAL_TYPE);
51 addAggregator(MAX_AGGREGATOR, REAL_TYPE);
52 addAggregator(SUM_AGGREGATOR, REAL_TYPE);
53 }
54}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java b/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java
new file mode 100644
index 00000000..b337e5dd
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java
@@ -0,0 +1,99 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.expressions;
7
8import tools.refinery.language.model.problem.BinaryOp;
9import tools.refinery.language.model.problem.UnaryOp;
10import tools.refinery.language.typesystem.AggregatorName;
11import tools.refinery.language.typesystem.DataExprType;
12
13import java.util.List;
14import java.util.Optional;
15
16public class CompositeTermInterpreter implements TermInterpreter {
17 private final List<TermInterpreter> interpreters;
18
19 public CompositeTermInterpreter(List<TermInterpreter> interpreters) {
20 this.interpreters = interpreters;
21 }
22
23 @Override
24 public Optional<DataExprType> getNegationType(DataExprType type) {
25 for (var interpreter : interpreters) {
26 var result = interpreter.getNegationType(type);
27 if (result.isPresent()) {
28 return result;
29 }
30 }
31 return Optional.empty();
32 }
33
34 @Override
35 public Optional<DataExprType> getUnaryOperationType(UnaryOp op, DataExprType type) {
36 for (var interpreter : interpreters) {
37 var result = interpreter.getUnaryOperationType(op, type);
38 if (result.isPresent()) {
39 return result;
40 }
41 }
42 return Optional.empty();
43 }
44
45 @Override
46 public boolean isComparisonSupported(DataExprType type) {
47 for (var interpreter : interpreters) {
48 var result = interpreter.isComparisonSupported(type);
49 if (result) {
50 return true;
51 }
52 }
53 return false;
54 }
55
56 @Override
57 public boolean isRangeSupported(DataExprType type) {
58 for (var interpreter : interpreters) {
59 var result = interpreter.isRangeSupported(type);
60 if (result) {
61 return true;
62 }
63 }
64 return false;
65 }
66
67 @Override
68 public Optional<DataExprType> getBinaryOperationType(BinaryOp op, DataExprType leftType, DataExprType rightType) {
69 for (var interpreter : interpreters) {
70 var result = interpreter.getBinaryOperationType(op, leftType, rightType);
71 if (result.isPresent()) {
72 return result;
73 }
74 }
75 return Optional.empty();
76 }
77
78 @Override
79 public boolean isCastSupported(DataExprType fromType, DataExprType toType) {
80 for (var interpreter : interpreters) {
81 var result = interpreter.isCastSupported(fromType, toType);
82 if (result) {
83 return true;
84 }
85 }
86 return false;
87 }
88
89 @Override
90 public Optional<DataExprType> getAggregationType(AggregatorName aggregator, DataExprType type) {
91 for (var interpreter : interpreters) {
92 var result = interpreter.getAggregationType(aggregator, type);
93 if (result.isPresent()) {
94 return result;
95 }
96 }
97 return Optional.empty();
98 }
99}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/expressions/TermInterpreter.java b/subprojects/language/src/main/java/tools/refinery/language/expressions/TermInterpreter.java
new file mode 100644
index 00000000..122785f2
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/expressions/TermInterpreter.java
@@ -0,0 +1,29 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.expressions;
7
8import tools.refinery.language.model.problem.BinaryOp;
9import tools.refinery.language.model.problem.UnaryOp;
10import tools.refinery.language.typesystem.AggregatorName;
11import tools.refinery.language.typesystem.DataExprType;
12
13import java.util.Optional;
14
15public interface TermInterpreter {
16 Optional<DataExprType> getNegationType(DataExprType type);
17
18 Optional<DataExprType> getUnaryOperationType(UnaryOp op, DataExprType type);
19
20 boolean isComparisonSupported(DataExprType type);
21
22 boolean isRangeSupported(DataExprType type);
23
24 Optional<DataExprType> getBinaryOperationType(BinaryOp op, DataExprType leftType, DataExprType rightType);
25
26 boolean isCastSupported(DataExprType fromType, DataExprType toType);
27
28 Optional<DataExprType> getAggregationType(AggregatorName aggregator, DataExprType type);
29}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java
deleted file mode 100644
index b3931401..00000000
--- a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.naming;
7
8import com.google.inject.Inject;
9import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
10import org.eclipse.xtext.naming.IQualifiedNameConverter;
11import org.eclipse.xtext.naming.QualifiedName;
12import tools.refinery.language.model.problem.Problem;
13import tools.refinery.language.scoping.imports.ImportAdapter;
14import tools.refinery.language.utils.ProblemUtil;
15
16public class ProblemDelegateQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
17 @Inject
18 private IQualifiedNameConverter qualifiedNameConverter;
19
20 protected QualifiedName qualifiedName(Problem problem) {
21 var qualifiedNameString = problem.getName();
22 if (qualifiedNameString != null) {
23 return NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(qualifiedNameString));
24 }
25 if (!ProblemUtil.isModule(problem)) {
26 return null;
27 }
28 var resource = problem.eResource();
29 if (resource == null) {
30 return null;
31 }
32 var resourceUri = resource.getURI();
33 if (resourceUri == null) {
34 return null;
35 }
36 var resourceSet = resource.getResourceSet();
37 if (resourceSet == null) {
38 return null;
39 }
40 var adapter = ImportAdapter.getOrInstall(resourceSet);
41 // If a module has no explicitly specified name, return the qualified name it was resolved under.
42 return adapter.getQualifiedName(resourceUri);
43 }
44}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java
index 5b682058..2a4df4d0 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java
@@ -6,36 +6,44 @@
6package tools.refinery.language.naming; 6package tools.refinery.language.naming;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import com.google.inject.name.Named; 9import com.google.inject.Singleton;
10import org.eclipse.emf.ecore.EObject; 10import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
11import org.eclipse.xtext.naming.IQualifiedNameProvider; 11import org.eclipse.xtext.naming.IQualifiedNameConverter;
12import org.eclipse.xtext.naming.QualifiedName; 12import org.eclipse.xtext.naming.QualifiedName;
13import org.eclipse.xtext.util.IResourceScopeCache; 13import tools.refinery.language.model.problem.Problem;
14import org.eclipse.xtext.util.Tuples; 14import tools.refinery.language.scoping.imports.ImportAdapterProvider;
15import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; 15import tools.refinery.language.utils.ProblemUtil;
16
17public class ProblemQualifiedNameProvider extends IQualifiedNameProvider.AbstractImpl {
18 private static final String PREFIX = "tools.refinery.language.naming.ProblemQualifiedNameProvider.";
19 public static final String NAMED_DELEGATE = PREFIX + "NAMED_DELEGATE";
20 public static final String CACHE_KEY = PREFIX + "CACHE_KEY";
21 16
17@Singleton
18public class ProblemQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
22 @Inject 19 @Inject
23 @Named(NAMED_DELEGATE) 20 private IQualifiedNameConverter qualifiedNameConverter;
24 private IQualifiedNameProvider delegate;
25 21
26 @Inject 22 @Inject
27 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE; 23 private ImportAdapterProvider importAdapterProvider;
28
29 @Override
30 public QualifiedName getFullyQualifiedName(EObject obj) {
31 return cache.get(Tuples.pair(obj, CACHE_KEY), obj.eResource(), () -> computeFullyQualifiedName(obj));
32 }
33 24
34 public QualifiedName computeFullyQualifiedName(EObject obj) { 25 protected QualifiedName qualifiedName(Problem problem) {
35 var qualifiedName = delegate.getFullyQualifiedName(obj); 26 var qualifiedNameString = problem.getName();
36 if (qualifiedName != null && ProblemResourceDescriptionStrategy.shouldExport(obj)) { 27 if (qualifiedNameString != null) {
37 return NamingUtil.addRootPrefix(qualifiedName); 28 return NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(qualifiedNameString));
29 }
30 if (!ProblemUtil.isModule(problem)) {
31 return null;
32 }
33 var resource = problem.eResource();
34 if (resource == null) {
35 return null;
36 }
37 var resourceUri = resource.getURI();
38 if (resourceUri == null) {
39 return null;
40 }
41 var resourceSet = resource.getResourceSet();
42 if (resourceSet == null) {
43 return null;
38 } 44 }
39 return qualifiedName; 45 var adapter = importAdapterProvider.getOrInstall(resourceSet);
46 // If a module has no explicitly specified name, return the qualified name it was resolved under.
47 return adapter.getQualifiedName(resourceUri);
40 } 48 }
41} 49}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
index 3dcf6b1f..8fd60364 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
@@ -8,7 +8,6 @@ package tools.refinery.language.resource;
8import com.google.common.collect.ImmutableMap; 8import com.google.common.collect.ImmutableMap;
9import com.google.inject.Inject; 9import com.google.inject.Inject;
10import com.google.inject.Singleton; 10import com.google.inject.Singleton;
11import com.google.inject.name.Named;
12import org.eclipse.emf.ecore.EObject; 11import org.eclipse.emf.ecore.EObject;
13import org.eclipse.xtext.EcoreUtil2; 12import org.eclipse.xtext.EcoreUtil2;
14import org.eclipse.xtext.naming.IQualifiedNameConverter; 13import org.eclipse.xtext.naming.IQualifiedNameConverter;
@@ -19,10 +18,9 @@ import org.eclipse.xtext.resource.IEObjectDescription;
19import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy; 18import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
20import org.eclipse.xtext.util.IAcceptor; 19import org.eclipse.xtext.util.IAcceptor;
21import tools.refinery.language.documentation.DocumentationCommentParser; 20import tools.refinery.language.documentation.DocumentationCommentParser;
22import tools.refinery.language.naming.ProblemQualifiedNameProvider;
23import tools.refinery.language.scoping.imports.ImportCollector;
24import tools.refinery.language.model.problem.*; 21import tools.refinery.language.model.problem.*;
25import tools.refinery.language.naming.NamingUtil; 22import tools.refinery.language.naming.NamingUtil;
23import tools.refinery.language.scoping.imports.ImportCollector;
26import tools.refinery.language.utils.ProblemUtil; 24import tools.refinery.language.utils.ProblemUtil;
27 25
28import java.util.Map; 26import java.util.Map;
@@ -32,13 +30,15 @@ import java.util.stream.Collectors;
32public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy { 30public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {
33 private static final String DATA_PREFIX = "tools.refinery.language.resource.ProblemResourceDescriptionStrategy."; 31 private static final String DATA_PREFIX = "tools.refinery.language.resource.ProblemResourceDescriptionStrategy.";
34 32
35 public static final String ARITY = DATA_PREFIX + "ARITY"; 33 public static final String TYPE_LIKE = DATA_PREFIX + "ARITY";
34 public static final String TYPE_LIKE_TRUE = "true";
36 public static final String ERROR_PREDICATE = DATA_PREFIX + "ERROR_PREDICATE"; 35 public static final String ERROR_PREDICATE = DATA_PREFIX + "ERROR_PREDICATE";
37 public static final String ERROR_PREDICATE_TRUE = "true"; 36 public static final String ERROR_PREDICATE_TRUE = "true";
38 public static final String SHADOWING_KEY = DATA_PREFIX + "SHADOWING_KEY"; 37 public static final String SHADOWING_KEY = DATA_PREFIX + "SHADOWING_KEY";
39 public static final String SHADOWING_KEY_PROBLEM = "problem"; 38 public static final String SHADOWING_KEY_PROBLEM = "problem";
40 public static final String SHADOWING_KEY_NODE = "node"; 39 public static final String SHADOWING_KEY_NODE = "node";
41 public static final String SHADOWING_KEY_RELATION = "relation"; 40 public static final String SHADOWING_KEY_RELATION = "relation";
41 public static final String SHADOWING_KEY_AGGREGATOR = "aggregator";
42 public static final String PREFERRED_NAME = DATA_PREFIX + "PREFERRED_NAME"; 42 public static final String PREFERRED_NAME = DATA_PREFIX + "PREFERRED_NAME";
43 public static final String PREFERRED_NAME_TRUE = "true"; 43 public static final String PREFERRED_NAME_TRUE = "true";
44 public static final String IMPORTS = DATA_PREFIX + "IMPORTS"; 44 public static final String IMPORTS = DATA_PREFIX + "IMPORTS";
@@ -51,8 +51,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
51 private IQualifiedNameConverter qualifiedNameConverter; 51 private IQualifiedNameConverter qualifiedNameConverter;
52 52
53 @Inject 53 @Inject
54 @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) 54 private IQualifiedNameProvider qualifiedNameProvider;
55 private IQualifiedNameProvider delegateQualifiedNameProvider;
56 55
57 @Inject 56 @Inject
58 private ImportCollector importCollector; 57 private ImportCollector importCollector;
@@ -123,7 +122,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
123 if (problem == null) { 122 if (problem == null) {
124 return QualifiedName.EMPTY; 123 return QualifiedName.EMPTY;
125 } 124 }
126 var qualifiedName = delegateQualifiedNameProvider.getFullyQualifiedName(problem); 125 var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(problem);
127 return qualifiedName == null ? QualifiedName.EMPTY : qualifiedName; 126 return qualifiedName == null ? QualifiedName.EMPTY : qualifiedName;
128 } 127 }
129 128
@@ -152,8 +151,11 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
152 builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); 151 builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE);
153 } else if (eObject instanceof Relation relation) { 152 } else if (eObject instanceof Relation relation) {
154 builder.put(SHADOWING_KEY, SHADOWING_KEY_RELATION); 153 builder.put(SHADOWING_KEY, SHADOWING_KEY_RELATION);
155 int arity = ProblemUtil.getArity(relation); 154 if (ProblemUtil.isTypeLike(relation)) {
156 builder.put(ARITY, Integer.toString(arity)); 155 builder.put(TYPE_LIKE, TYPE_LIKE_TRUE);
156 }
157 } else if (eObject instanceof AggregatorDeclaration) {
158 builder.put(SHADOWING_KEY, SHADOWING_KEY_AGGREGATOR);
157 } 159 }
158 if (eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError()) { 160 if (eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError()) {
159 builder.put(ERROR_PREDICATE, ERROR_PREDICATE_TRUE); 161 builder.put(ERROR_PREDICATE, ERROR_PREDICATE_TRUE);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
index 0067bf94..3b94423a 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java
@@ -6,7 +6,6 @@
6package tools.refinery.language.scoping; 6package tools.refinery.language.scoping;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import com.google.inject.name.Named;
10import org.eclipse.emf.ecore.EObject; 9import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.EReference; 10import org.eclipse.emf.ecore.EReference;
12import org.eclipse.emf.ecore.resource.Resource; 11import org.eclipse.emf.ecore.resource.Resource;
@@ -17,14 +16,12 @@ import org.eclipse.xtext.resource.ISelectable;
17import org.eclipse.xtext.scoping.IScope; 16import org.eclipse.xtext.scoping.IScope;
18import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; 17import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider;
19import org.eclipse.xtext.util.IResourceScopeCache; 18import org.eclipse.xtext.util.IResourceScopeCache;
20import tools.refinery.language.naming.ProblemQualifiedNameProvider;
21 19
22public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider { 20public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider {
23 private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY"; 21 private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY";
24 22
25 @Inject 23 @Inject
26 @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) 24 private IQualifiedNameProvider qualifiedNameProvider;
27 private IQualifiedNameProvider delegateQualifiedNameProvider;
28 25
29 @Inject 26 @Inject
30 private IResourceDescriptionsProvider resourceDescriptionsProvider; 27 private IResourceDescriptionsProvider resourceDescriptionsProvider;
@@ -59,7 +56,7 @@ public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScop
59 if (rootElement == null) { 56 if (rootElement == null) {
60 return new NoFullyQualifiedNamesSelectable(resourceDescription); 57 return new NoFullyQualifiedNamesSelectable(resourceDescription);
61 } 58 }
62 var rootName = delegateQualifiedNameProvider.getFullyQualifiedName(rootElement); 59 var rootName = qualifiedNameProvider.getFullyQualifiedName(rootElement);
63 if (rootName == null) { 60 if (rootName == null) {
64 return new NoFullyQualifiedNamesSelectable(resourceDescription); 61 return new NoFullyQualifiedNamesSelectable(resourceDescription);
65 } 62 }
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
index f83a7ebd..d94c9a13 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java
@@ -9,14 +9,12 @@
9 */ 9 */
10package tools.refinery.language.scoping; 10package tools.refinery.language.scoping;
11 11
12import com.google.inject.Inject;
13import org.eclipse.emf.ecore.EObject; 12import org.eclipse.emf.ecore.EObject;
14import org.eclipse.emf.ecore.EReference; 13import org.eclipse.emf.ecore.EReference;
15import org.eclipse.xtext.EcoreUtil2; 14import org.eclipse.xtext.EcoreUtil2;
16import org.eclipse.xtext.scoping.IScope; 15import org.eclipse.xtext.scoping.IScope;
17import org.eclipse.xtext.scoping.Scopes; 16import org.eclipse.xtext.scoping.Scopes;
18import tools.refinery.language.model.problem.*; 17import tools.refinery.language.model.problem.*;
19import tools.refinery.language.utils.ProblemDesugarer;
20 18
21import java.util.Collection; 19import java.util.Collection;
22import java.util.LinkedHashSet; 20import java.util.LinkedHashSet;
@@ -29,9 +27,6 @@ import java.util.LinkedHashSet;
29 * on how and when to use it. 27 * on how and when to use it.
30 */ 28 */
31public class ProblemScopeProvider extends AbstractProblemScopeProvider { 29public class ProblemScopeProvider extends AbstractProblemScopeProvider {
32 @Inject
33 private ProblemDesugarer desugarer;
34
35 @Override 30 @Override
36 public IScope getScope(EObject context, EReference reference) { 31 public IScope getScope(EObject context, EReference reference) {
37 var scope = super.getScope(context, reference); 32 var scope = super.getScope(context, reference);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java
index d7a5304f..753c8565 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java
@@ -16,7 +16,12 @@ import org.eclipse.emf.ecore.resource.Resource;
16import org.eclipse.emf.ecore.resource.ResourceSet; 16import org.eclipse.emf.ecore.resource.ResourceSet;
17import org.eclipse.emf.ecore.util.EcoreUtil; 17import org.eclipse.emf.ecore.util.EcoreUtil;
18import org.eclipse.xtext.naming.QualifiedName; 18import org.eclipse.xtext.naming.QualifiedName;
19import tools.refinery.language.expressions.CompositeTermInterpreter;
20import tools.refinery.language.expressions.TermInterpreter;
21import tools.refinery.language.library.BuiltinLibrary;
19import tools.refinery.language.library.RefineryLibrary; 22import tools.refinery.language.library.RefineryLibrary;
23import tools.refinery.language.model.problem.Problem;
24import tools.refinery.language.utils.BuiltinSymbols;
20 25
21import java.io.File; 26import java.io.File;
22import java.nio.file.Path; 27import java.nio.file.Path;
@@ -25,15 +30,12 @@ import java.util.*;
25public class ImportAdapter extends AdapterImpl { 30public class ImportAdapter extends AdapterImpl {
26 private static final Logger LOG = Logger.getLogger(ImportAdapter.class); 31 private static final Logger LOG = Logger.getLogger(ImportAdapter.class);
27 private static final List<RefineryLibrary> DEFAULT_LIBRARIES; 32 private static final List<RefineryLibrary> DEFAULT_LIBRARIES;
33 private static final List<TermInterpreter> DEFAULT_TERM_INTERPRETERS;
28 private static final List<Path> DEFAULT_PATHS; 34 private static final List<Path> DEFAULT_PATHS;
29 35
30 static { 36 static {
31 var serviceLoader = ServiceLoader.load(RefineryLibrary.class); 37 DEFAULT_LIBRARIES = loadServices(RefineryLibrary.class);
32 var defaultLibraries = new ArrayList<RefineryLibrary>(); 38 DEFAULT_TERM_INTERPRETERS = loadServices(TermInterpreter.class);
33 for (var service : serviceLoader) {
34 defaultLibraries.add(service);
35 }
36 DEFAULT_LIBRARIES = List.copyOf(defaultLibraries);
37 var pathEnv = System.getenv("REFINERY_LIBRARY_PATH"); 39 var pathEnv = System.getenv("REFINERY_LIBRARY_PATH");
38 if (pathEnv == null) { 40 if (pathEnv == null) {
39 DEFAULT_PATHS = List.of(); 41 DEFAULT_PATHS = List.of();
@@ -45,16 +47,29 @@ public class ImportAdapter extends AdapterImpl {
45 } 47 }
46 } 48 }
47 49
48 private final List<RefineryLibrary> libraries; 50 private static <T> List<T> loadServices(Class<T> serviceClass) {
49 private final List<Path> libraryPaths; 51 var serviceLoader = ServiceLoader.load(serviceClass);
52 var services = new ArrayList<T>();
53 for (var service : serviceLoader) {
54 services.add(service);
55 }
56 return List.copyOf(services);
57 }
58
59 private ResourceSet resourceSet;
60 private final List<RefineryLibrary> libraries = new ArrayList<>(DEFAULT_LIBRARIES);
61 private final List<TermInterpreter> termInterpreters = new ArrayList<>(DEFAULT_TERM_INTERPRETERS);
62 private final TermInterpreter termInterpreter = new CompositeTermInterpreter(termInterpreters);
63 private final List<Path> libraryPaths = new ArrayList<>(DEFAULT_PATHS);
50 private final Cache<QualifiedName, QualifiedName> failedResolutions = 64 private final Cache<QualifiedName, QualifiedName> failedResolutions =
51 CacheBuilder.newBuilder().maximumSize(100).build(); 65 CacheBuilder.newBuilder().maximumSize(100).build();
52 private final Map<QualifiedName, URI> qualifiedNameToUriMap = new LinkedHashMap<>(); 66 private final Map<QualifiedName, URI> qualifiedNameToUriMap = new LinkedHashMap<>();
53 private final Map<URI, QualifiedName> uriToQualifiedNameMap = new LinkedHashMap<>(); 67 private final Map<URI, QualifiedName> uriToQualifiedNameMap = new LinkedHashMap<>();
68 private Problem builtinProblem;
69 private BuiltinSymbols builtinSymbols;
54 70
55 private ImportAdapter(ResourceSet resourceSet) { 71 void setResourceSet(ResourceSet resourceSet) {
56 libraries = new ArrayList<>(DEFAULT_LIBRARIES); 72 this.resourceSet = resourceSet;
57 libraryPaths = new ArrayList<>(DEFAULT_PATHS);
58 for (var resource : resourceSet.getResources()) { 73 for (var resource : resourceSet.getResources()) {
59 resourceAdded(resource); 74 resourceAdded(resource);
60 } 75 }
@@ -69,6 +84,14 @@ public class ImportAdapter extends AdapterImpl {
69 return libraries; 84 return libraries;
70 } 85 }
71 86
87 public List<TermInterpreter> getTermInterpreters() {
88 return termInterpreters;
89 }
90
91 public TermInterpreter getTermInterpreter() {
92 return termInterpreter;
93 }
94
72 public List<Path> getLibraryPaths() { 95 public List<Path> getLibraryPaths() {
73 return libraryPaths; 96 return libraryPaths;
74 } 97 }
@@ -190,16 +213,26 @@ public class ImportAdapter extends AdapterImpl {
190 } 213 }
191 } 214 }
192 215
193 public static ImportAdapter getOrInstall(ResourceSet resourceSet) { 216 public Problem getBuiltinProblem() {
194 var adapter = getAdapter(resourceSet); 217 if (builtinProblem == null) {
195 if (adapter == null) { 218 var builtinResource = resourceSet.getResource(BuiltinLibrary.BUILTIN_LIBRARY_URI, true);
196 adapter = new ImportAdapter(resourceSet); 219 if (builtinResource == null) {
197 resourceSet.eAdapters().add(adapter); 220 throw new IllegalStateException("Failed to load builtin resource");
221 }
222 var contents = builtinResource.getContents();
223 if (contents.isEmpty()) {
224 throw new IllegalStateException("builtin resource is empty");
225 }
226 builtinProblem = (Problem) contents.getFirst();
227 EcoreUtil.resolveAll(builtinResource);
198 } 228 }
199 return adapter; 229 return builtinProblem;
200 } 230 }
201 231
202 private static ImportAdapter getAdapter(ResourceSet resourceSet) { 232 public BuiltinSymbols getBuiltinSymbols() {
203 return (ImportAdapter) EcoreUtil.getAdapter(resourceSet.eAdapters(), ImportAdapter.class); 233 if (builtinSymbols == null) {
234 builtinSymbols = new BuiltinSymbols(getBuiltinProblem());
235 }
236 return builtinSymbols;
204 } 237 }
205} 238}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapterProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapterProvider.java
new file mode 100644
index 00000000..5ab3a851
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapterProvider.java
@@ -0,0 +1,68 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.scoping.imports;
7
8import com.google.inject.Inject;
9import com.google.inject.Provider;
10import com.google.inject.Singleton;
11import org.eclipse.emf.ecore.EObject;
12import org.eclipse.emf.ecore.resource.Resource;
13import org.eclipse.emf.ecore.resource.ResourceSet;
14import org.eclipse.emf.ecore.util.EcoreUtil;
15import org.jetbrains.annotations.NotNull;
16import tools.refinery.language.expressions.TermInterpreter;
17import tools.refinery.language.utils.BuiltinSymbols;
18
19@Singleton
20public class ImportAdapterProvider {
21 @Inject
22 private Provider<ImportAdapter> delegateProvider;
23
24 public BuiltinSymbols getBuiltinSymbols(@NotNull EObject context) {
25 var adapter = getOrInstall(context);
26 return adapter.getBuiltinSymbols();
27 }
28
29 public BuiltinSymbols getBuiltinSymbols(@NotNull Resource context) {
30 var adapter = getOrInstall(context);
31 return adapter.getBuiltinSymbols();
32 }
33
34 public TermInterpreter getTermInterpreter(@NotNull EObject context) {
35 var adapter = getOrInstall(context);
36 return adapter.getTermInterpreter();
37 }
38
39 public ImportAdapter getOrInstall(@NotNull EObject context) {
40 var resource = context.eResource();
41 if (resource == null) {
42 throw new IllegalArgumentException("context is not in a resource");
43 }
44 return getOrInstall(resource);
45 }
46
47 public ImportAdapter getOrInstall(@NotNull Resource context) {
48 var resourceSet = context.getResourceSet();
49 if (resourceSet == null) {
50 throw new IllegalArgumentException("context is not in a resource set");
51 }
52 return getOrInstall(resourceSet);
53 }
54
55 public ImportAdapter getOrInstall(@NotNull ResourceSet resourceSet) {
56 var adapter = getAdapter(resourceSet);
57 if (adapter == null) {
58 adapter = delegateProvider.get();
59 adapter.setResourceSet(resourceSet);
60 resourceSet.eAdapters().add(adapter);
61 }
62 return adapter;
63 }
64
65 public static ImportAdapter getAdapter(@NotNull ResourceSet resourceSet) {
66 return (ImportAdapter) EcoreUtil.getAdapter(resourceSet.eAdapters(), ImportAdapter.class);
67 }
68}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java
index ac5a92ba..f3ab54ae 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java
@@ -46,6 +46,9 @@ public class ImportCollector {
46 @Inject 46 @Inject
47 private Provider<LoadOnDemandResourceDescriptionProvider> loadOnDemandProvider; 47 private Provider<LoadOnDemandResourceDescriptionProvider> loadOnDemandProvider;
48 48
49 @Inject
50 private ImportAdapterProvider importAdapterProvider;
51
49 public ImportCollection getDirectImports(Resource resource) { 52 public ImportCollection getDirectImports(Resource resource) {
50 return cache.get(DIRECT_IMPORTS_KEY, resource, () -> this.computeDirectImports(resource)); 53 return cache.get(DIRECT_IMPORTS_KEY, resource, () -> this.computeDirectImports(resource));
51 } 54 }
@@ -58,7 +61,7 @@ public class ImportCollector {
58 if (resourceSet == null) { 61 if (resourceSet == null) {
59 return ImportCollection.EMPTY; 62 return ImportCollection.EMPTY;
60 } 63 }
61 var adapter = ImportAdapter.getOrInstall(resourceSet); 64 var adapter = importAdapterProvider.getOrInstall(resourceSet);
62 var collection = new ImportCollection(); 65 var collection = new ImportCollection();
63 collectAutomaticImports(collection, adapter); 66 collectAutomaticImports(collection, adapter);
64 collectExplicitImports(problem, collection, adapter); 67 collectExplicitImports(problem, collection, adapter);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/AggregatorName.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/AggregatorName.java
new file mode 100644
index 00000000..5939865a
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/AggregatorName.java
@@ -0,0 +1,19 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import org.eclipse.xtext.naming.QualifiedName;
9
10public record AggregatorName(QualifiedName qualifiedName) {
11 public AggregatorName(QualifiedName prefix, String name) {
12 this(prefix.append(name));
13 }
14
15 @Override
16 public String toString() {
17 return qualifiedName.isEmpty() ? "" : qualifiedName.getLastSegment();
18 }
19}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/DataExprType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/DataExprType.java
new file mode 100644
index 00000000..9bc3e6aa
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/DataExprType.java
@@ -0,0 +1,19 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import org.eclipse.xtext.naming.QualifiedName;
9
10public record DataExprType(QualifiedName qualifiedName) implements FixedType {
11 public DataExprType(QualifiedName prefix, String name) {
12 this(prefix.append(name));
13 }
14
15 @Override
16 public String toString() {
17 return qualifiedName.isEmpty() ? "" : qualifiedName.getLastSegment();
18 }
19}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java
new file mode 100644
index 00000000..9e44063d
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java
@@ -0,0 +1,16 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public sealed interface ExprType permits FixedType, MutableType {
9 NodeType NODE = new NodeType();
10 LiteralType LITERAL = new LiteralType();
11 InvalidType INVALID = new InvalidType();
12
13 FixedType getActualType();
14
15 ExprType unwrapIfSet();
16}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java
new file mode 100644
index 00000000..1b2ded48
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java
@@ -0,0 +1,18 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public sealed interface FixedType extends ExprType permits NodeType, LiteralType, InvalidType, DataExprType {
9 @Override
10 default FixedType getActualType() {
11 return this;
12 }
13
14 @Override
15 default FixedType unwrapIfSet() {
16 return this;
17 }
18}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/InvalidType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/InvalidType.java
new file mode 100644
index 00000000..c18612bc
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/InvalidType.java
@@ -0,0 +1,16 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public final class InvalidType implements FixedType {
9 InvalidType() {
10 }
11
12 @Override
13 public String toString() {
14 return "invalid";
15 }
16}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/LiteralType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/LiteralType.java
new file mode 100644
index 00000000..7fd33553
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/LiteralType.java
@@ -0,0 +1,16 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public final class LiteralType implements FixedType {
9 LiteralType() {
10 }
11
12 @Override
13 public String toString() {
14 return "constraint";
15 }
16}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/MutableType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/MutableType.java
new file mode 100644
index 00000000..78fdf884
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/MutableType.java
@@ -0,0 +1,32 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public final class MutableType implements ExprType {
9 private DataExprType actualType;
10
11 @Override
12 public FixedType getActualType() {
13 return actualType == null ? INVALID : actualType;
14 }
15
16 public void setActualType(DataExprType actualType) {
17 if (this.actualType != null) {
18 throw new IllegalStateException("Actual type was already set");
19 }
20 this.actualType = actualType;
21 }
22
23 @Override
24 public ExprType unwrapIfSet() {
25 return actualType == null ? this : actualType;
26 }
27
28 @Override
29 public String toString() {
30 return getActualType().toString();
31 }
32}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/NodeType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/NodeType.java
new file mode 100644
index 00000000..1baff212
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/NodeType.java
@@ -0,0 +1,16 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8public final class NodeType implements FixedType {
9 NodeType() {
10 }
11
12 @Override
13 public String toString() {
14 return "node";
15 }
16}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/ProblemTypeAnalyzer.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ProblemTypeAnalyzer.java
new file mode 100644
index 00000000..fcf99ad8
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ProblemTypeAnalyzer.java
@@ -0,0 +1,32 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import com.google.inject.Inject;
9import com.google.inject.Provider;
10import com.google.inject.Singleton;
11import org.eclipse.xtext.util.IResourceScopeCache;
12import tools.refinery.language.model.problem.Problem;
13
14@Singleton
15public class ProblemTypeAnalyzer {
16 private static final String CACHE_KEY = "tools.refinery.language.typesystem.ProblemTypeAnalyzer.CACHE_KEY";
17
18 @Inject
19 private IResourceScopeCache resourceScopeCache;
20
21 @Inject
22 private Provider<TypedModule> typedModuleProvider;
23
24 public TypedModule getOrComputeTypes(Problem problem) {
25 var resource = problem.eResource();
26 return resourceScopeCache.get(CACHE_KEY, resource, () -> {
27 var typedModule = typedModuleProvider.get();
28 typedModule.setProblem(problem);
29 return typedModule;
30 });
31 }
32}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/Signature.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/Signature.java
new file mode 100644
index 00000000..8e72c185
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/Signature.java
@@ -0,0 +1,11 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import java.util.List;
9
10public record Signature(List<FixedType> parameterTypes, FixedType resultType) {
11}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/SignatureProvider.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/SignatureProvider.java
new file mode 100644
index 00000000..3e25a0f5
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/SignatureProvider.java
@@ -0,0 +1,107 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import com.google.inject.Inject;
9import com.google.inject.Singleton;
10import org.eclipse.xtext.naming.IQualifiedNameProvider;
11import org.eclipse.xtext.util.IResourceScopeCache;
12import tools.refinery.language.model.problem.*;
13
14import java.util.ArrayList;
15import java.util.HashMap;
16import java.util.List;
17
18@Singleton
19public class SignatureProvider {
20 private static final String PREFIX = "tools.refinery.language.typesystem.SignatureProvider.";
21 private static final String SIGNATURE_CACHE = PREFIX + "SIGNATURE_CACHE";
22 private static final String DATATYPE_CACHE = PREFIX + "DATATYPE_CACHE";
23 private static final String AGGREGATOR_CACHE = PREFIX + "AGGREGATOR_CACHE";
24
25 @Inject
26 private IQualifiedNameProvider qualifiedNameProvider;
27
28 @Inject
29 private IResourceScopeCache cache;
30
31 public Signature getSignature(Relation relation) {
32 var signatures = cache.get(SIGNATURE_CACHE, relation.eResource(), () -> new HashMap<Relation, Signature>());
33 return signatures.computeIfAbsent(relation, this::computeSignature);
34 }
35
36 public int getArity(Relation relation) {
37 return getSignature(relation).parameterTypes().size();
38 }
39
40 private Signature computeSignature(Relation relation) {
41 return new Signature(getParameterTypes(relation), getResultType(relation));
42 }
43
44 private List<FixedType> getParameterTypes(Relation relation) {
45 return switch (relation) {
46 case ClassDeclaration ignored -> List.of(ExprType.NODE);
47 case EnumDeclaration ignored -> List.of(ExprType.NODE);
48 case DatatypeDeclaration datatypeDeclaration -> List.of(getDataType(datatypeDeclaration));
49 case ReferenceDeclaration referenceDeclaration -> {
50 if (referenceDeclaration.getReferenceType() instanceof DatatypeDeclaration) {
51 yield List.of(ExprType.NODE);
52 }
53 yield List.of(ExprType.NODE, ExprType.NODE);
54 }
55 case ParametricDefinition parametricDefinition -> {
56 var parameters = parametricDefinition.getParameters();
57 var exprTypes = new ArrayList<FixedType>(parameters.size());
58 for (var parameter : parameters) {
59 if (parameter.getParameterType() instanceof DatatypeDeclaration datatypeDeclaration) {
60 exprTypes.add(getDataType(datatypeDeclaration));
61 } else {
62 exprTypes.add(ExprType.NODE);
63 }
64 }
65 yield List.copyOf(exprTypes);
66 }
67 default -> throw new IllegalArgumentException("Unknown Relation: " + relation);
68 };
69 }
70
71 private FixedType getResultType(Relation relation) {
72 if (relation instanceof ReferenceDeclaration referenceDeclaration &&
73 referenceDeclaration.getReferenceType() instanceof DatatypeDeclaration datatypeDeclaration) {
74 return getDataType(datatypeDeclaration);
75 }
76 return ExprType.LITERAL;
77 }
78
79 public DataExprType getDataType(DatatypeDeclaration datatypeDeclaration) {
80 var dataTypes = cache.get(DATATYPE_CACHE, datatypeDeclaration.eResource(),
81 () -> new HashMap<DatatypeDeclaration, DataExprType>());
82 return dataTypes.computeIfAbsent(datatypeDeclaration, this::computeDataType);
83 }
84
85 private DataExprType computeDataType(DatatypeDeclaration datatypeDeclaration) {
86 var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(datatypeDeclaration);
87 if (qualifiedName == null) {
88 throw new IllegalArgumentException("Datatype declaration has no qualified name: " + datatypeDeclaration);
89 }
90 return new DataExprType(qualifiedName);
91 }
92
93 public AggregatorName getAggregatorName(AggregatorDeclaration aggregatorDeclaration) {
94 var dataTypes = cache.get(AGGREGATOR_CACHE, aggregatorDeclaration.eResource(),
95 () -> new HashMap<AggregatorDeclaration, AggregatorName>());
96 return dataTypes.computeIfAbsent(aggregatorDeclaration, this::computeAggregatorName);
97 }
98
99 private AggregatorName computeAggregatorName(AggregatorDeclaration aggregatorDeclaration) {
100 var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(aggregatorDeclaration);
101 if (qualifiedName == null) {
102 throw new IllegalArgumentException(
103 "Aggregator declaration has no qualified name: " + aggregatorDeclaration);
104 }
105 return new AggregatorName(qualifiedName);
106 }
107}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java
new file mode 100644
index 00000000..de923e0d
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java
@@ -0,0 +1,568 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.typesystem;
7
8import com.google.inject.Inject;
9import org.eclipse.emf.common.util.Diagnostic;
10import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.EStructuralFeature;
12import org.eclipse.xtext.validation.CheckType;
13import org.eclipse.xtext.validation.FeatureBasedDiagnostic;
14import tools.refinery.language.expressions.BuiltinTermInterpreter;
15import tools.refinery.language.expressions.TermInterpreter;
16import tools.refinery.language.model.problem.*;
17import tools.refinery.language.scoping.imports.ImportAdapterProvider;
18import tools.refinery.language.validation.ProblemValidator;
19
20import java.util.*;
21
22public class TypedModule {
23 private static final String OPERAND_TYPE_ERROR_MESSAGE = "Cannot determine operand type.";
24
25 @Inject
26 private SignatureProvider signatureProvider;
27
28 @Inject
29 private ImportAdapterProvider importAdapterProvider;
30
31 private TermInterpreter interpreter;
32 private final Map<Variable, List<AssignmentExpr>> assignments = new LinkedHashMap<>();
33 private final Map<Variable, FixedType> variableTypes = new HashMap<>();
34 private final Map<Expr, ExprType> expressionTypes = new HashMap<>();
35 private final Set<Variable> variablesToProcess = new LinkedHashSet<>();
36 private final List<FeatureBasedDiagnostic> diagnostics = new ArrayList<>();
37
38 void setProblem(Problem problem) {
39 interpreter = importAdapterProvider.getTermInterpreter(problem);
40 gatherAssignments(problem);
41 checkTypes(problem);
42 }
43
44 private void gatherAssignments(Problem problem) {
45 var iterator = problem.eAllContents();
46 while (iterator.hasNext()) {
47 var eObject = iterator.next();
48 if (!(eObject instanceof AssignmentExpr assignmentExpr)) {
49 continue;
50 }
51 if (assignmentExpr.getLeft() instanceof VariableOrNodeExpr variableOrNodeExpr &&
52 variableOrNodeExpr.getVariableOrNode() instanceof Variable variable) {
53 var assignmentList = assignments.computeIfAbsent(variable, ignored -> new ArrayList<>(1));
54 assignmentList.add(assignmentExpr);
55 }
56 iterator.prune();
57 }
58 }
59
60 private void checkTypes(Problem problem) {
61 for (var statement : problem.getStatements()) {
62 switch (statement) {
63 case PredicateDefinition predicateDefinition -> checkTypes(predicateDefinition);
64 case Assertion assertion -> checkTypes(assertion);
65 default -> {
66 // Nothing to type check.
67 }
68 }
69 }
70 }
71
72 private void checkTypes(PredicateDefinition predicateDefinition) {
73 for (var conjunction : predicateDefinition.getBodies()) {
74 for (var literal : conjunction.getLiterals()) {
75 coerceIntoLiteral(literal);
76 }
77 }
78 }
79
80 private void checkTypes(Assertion assertion) {
81 var relation = assertion.getRelation();
82 var value = assertion.getValue();
83 if (relation == null) {
84 return;
85 }
86 var type = signatureProvider.getSignature(relation).resultType();
87 if (type == ExprType.LITERAL) {
88 if (value == null) {
89 return;
90 }
91 expectType(value, BuiltinTermInterpreter.BOOLEAN_TYPE);
92 return;
93 }
94 if (value == null) {
95 var message = "Assertion value of type %s is required.".formatted(type);
96 error(message, assertion, ProblemPackage.Literals.ASSERTION__RELATION, 0, ProblemValidator.TYPE_ERROR);
97 }
98 expectType(value, type);
99 }
100
101 public List<FeatureBasedDiagnostic> getDiagnostics() {
102 return diagnostics;
103 }
104
105 public FixedType getVariableType(Variable variable) {
106 // We can't use computeIfAbsent here, because translating referenced queries calls this method in a reentrant
107 // way, which would cause a ConcurrentModificationException with computeIfAbsent.
108 @SuppressWarnings("squid:S3824")
109 var type = variableTypes.get(variable);
110 //noinspection Java8MapApi
111 if (type == null) {
112 type = computeVariableType(variable);
113 variableTypes.put(variable, type);
114 }
115 return type;
116 }
117
118 private FixedType computeVariableType(Variable variable) {
119 if (variable instanceof Parameter) {
120 return computeUnassignedVariableType(variable);
121 }
122 var assignmnentList = assignments.get(variable);
123 if (assignmnentList == null || assignmnentList.isEmpty()) {
124 return computeUnassignedVariableType(variable);
125 }
126 if (variablesToProcess.contains(variable)) {
127 throw new IllegalStateException("Circular reference to variable: " + variable.getName());
128 }
129 if (assignmnentList.size() > 1) {
130 var message = "Multiple assignments for variable '%s'.".formatted(variable.getName());
131 for (var assignment : assignmnentList) {
132 error(message, assignment, ProblemPackage.Literals.BINARY_EXPR__LEFT, 0,
133 ProblemValidator.INVALID_ASSIGNMENT_ISSUE);
134 }
135 return ExprType.INVALID;
136 }
137 var assignment = assignmnentList.getFirst();
138 variablesToProcess.add(variable);
139 try {
140 var assignedType = getExpressionType(assignment.getRight());
141 if (assignedType instanceof MutableType) {
142 var message = "Cannot determine type of variable '%s'.".formatted(variable.getName());
143 error(message, assignment, ProblemPackage.Literals.BINARY_EXPR__RIGHT, 0, ProblemValidator.TYPE_ERROR);
144 return ExprType.INVALID;
145 }
146 if (assignedType instanceof DataExprType dataExprType) {
147 return dataExprType;
148 }
149 if (assignedType != ExprType.INVALID) {
150 var message = "Expected data expression for variable '%s', got %s instead."
151 .formatted(variable.getName(), assignedType);
152 error(message, assignment, ProblemPackage.Literals.BINARY_EXPR__RIGHT, 0, ProblemValidator.TYPE_ERROR);
153 }
154 return ExprType.INVALID;
155 } finally {
156 variablesToProcess.remove(variable);
157 }
158 }
159
160 private FixedType computeUnassignedVariableType(Variable variable) {
161 if (variable instanceof Parameter parameter &&
162 parameter.getParameterType() instanceof DatatypeDeclaration datatypeDeclaration) {
163 return signatureProvider.getDataType(datatypeDeclaration);
164 }
165 // Parameters without an explicit datatype annotation are node variables.
166 return ExprType.NODE;
167 }
168
169 public ExprType getExpressionType(Expr expr) {
170 // We can't use computeIfAbsent here, because translating referenced queries calls this method in a reentrant
171 // way, which would cause a ConcurrentModificationException with computeIfAbsent.
172 @SuppressWarnings("squid:S3824")
173 var type = expressionTypes.get(expr);
174 //noinspection Java8MapApi
175 if (type == null) {
176 type = computeExpressionType(expr);
177 expressionTypes.put(expr, type);
178 }
179 return type.unwrapIfSet();
180 }
181
182 private ExprType computeExpressionType(Expr expr) {
183 return switch (expr) {
184 case LogicConstant logicConstant -> computeExpressionType(logicConstant);
185 case IntConstant ignored -> BuiltinTermInterpreter.INT_TYPE;
186 case RealConstant ignored -> BuiltinTermInterpreter.REAL_TYPE;
187 case StringConstant ignored -> BuiltinTermInterpreter.STRING_TYPE;
188 case InfiniteConstant ignored -> new MutableType();
189 case VariableOrNodeExpr variableOrNodeExpr -> computeExpressionType(variableOrNodeExpr);
190 case AssignmentExpr assignmentExpr -> computeExpressionType(assignmentExpr);
191 case Atom atom -> computeExpressionType(atom);
192 case NegationExpr negationExpr -> computeExpressionType(negationExpr);
193 case ArithmeticUnaryExpr arithmeticUnaryExpr -> computeExpressionType(arithmeticUnaryExpr);
194 case CountExpr countExpr -> computeExpressionType(countExpr);
195 case AggregationExpr aggregationExpr -> computeExpressionType(aggregationExpr);
196 case ComparisonExpr comparisonExpr -> computeExpressionType(comparisonExpr);
197 case LatticeBinaryExpr latticeBinaryExpr -> computeExpressionType(latticeBinaryExpr);
198 case RangeExpr rangeExpr -> computeExpressionType(rangeExpr);
199 case ArithmeticBinaryExpr arithmeticBinaryExpr -> computeExpressionType(arithmeticBinaryExpr);
200 case CastExpr castExpr -> computeExpressionType(castExpr);
201 default -> {
202 error("Unknown expression: " + expr.getClass().getSimpleName(), expr, null, 0,
203 ProblemValidator.UNKNOWN_EXPRESSION_ISSUE);
204 yield ExprType.INVALID;
205 }
206 };
207 }
208
209 private ExprType computeExpressionType(LogicConstant expr) {
210 return switch (expr.getLogicValue()) {
211 case TRUE, FALSE -> BuiltinTermInterpreter.BOOLEAN_TYPE;
212 case UNKNOWN, ERROR -> new MutableType();
213 case null -> ExprType.INVALID;
214 };
215 }
216
217 private ExprType computeExpressionType(VariableOrNodeExpr expr) {
218 var target = expr.getVariableOrNode();
219 if (target == null || target.eIsProxy()) {
220 return ExprType.INVALID;
221 }
222 return switch (target) {
223 case Node ignored -> ExprType.NODE;
224 case Variable variable -> {
225 if (variablesToProcess.contains(variable)) {
226 var message = "Circular reference to variable '%s'.".formatted(variable.getName());
227 error(message, expr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, 0,
228 ProblemValidator.INVALID_ASSIGNMENT_ISSUE);
229 yield ExprType.INVALID;
230 }
231 yield getVariableType(variable);
232 }
233 default -> {
234 error("Unknown variable: " + target.getName(), expr,
235 ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, 0,
236 ProblemValidator.UNKNOWN_EXPRESSION_ISSUE);
237 yield ExprType.INVALID;
238 }
239 };
240 }
241
242 private ExprType computeExpressionType(AssignmentExpr expr) {
243 // Force the left side to type check. Since the left side is a variable, it will force the right side to also
244 // type check in order to infer the variable type.
245 return getExpressionType(expr.getLeft()) == ExprType.INVALID ? ExprType.INVALID : ExprType.LITERAL;
246 }
247
248 private ExprType computeExpressionType(Atom atom) {
249 var relation = atom.getRelation();
250 if (relation == null || relation.eIsProxy()) {
251 return ExprType.INVALID;
252 }
253 if (relation instanceof DatatypeDeclaration) {
254 var message = "Invalid call to data type. Use 'as %s' for casting.".formatted(
255 relation.getName());
256 error(message, atom, ProblemPackage.Literals.ATOM__RELATION, 0, ProblemValidator.TYPE_ERROR);
257 }
258 var signature = signatureProvider.getSignature(relation);
259 var parameterTypes = signature.parameterTypes();
260 var arguments = atom.getArguments();
261 int size = Math.min(parameterTypes.size(), arguments.size());
262 boolean ok = parameterTypes.size() == arguments.size();
263 for (int i = 0; i < size; i++) {
264 var parameterType = parameterTypes.get(i);
265 var argument = arguments.get(i);
266 if (!expectType(argument, parameterType)) {
267 // Avoid short-circuiting to let us type check all arguments.
268 ok = false;
269 }
270 }
271 return ok ? signature.resultType() : ExprType.INVALID;
272 }
273
274 private ExprType computeExpressionType(NegationExpr negationExpr) {
275 var body = negationExpr.getBody();
276 if (body == null) {
277 return ExprType.INVALID;
278 }
279 var actualType = getExpressionType(body);
280 if (actualType == ExprType.LITERAL) {
281 // Negation of literals yields another (non-enumerable) literal.
282 return ExprType.LITERAL;
283 }
284 if (actualType == DataExprType.INVALID) {
285 return ExprType.INVALID;
286 }
287 if (actualType instanceof MutableType) {
288 error(OPERAND_TYPE_ERROR_MESSAGE, body, null, 0, ProblemValidator.TYPE_ERROR);
289 return ExprType.INVALID;
290 }
291 if (actualType instanceof DataExprType dataExprType) {
292 var result = interpreter.getNegationType(dataExprType);
293 if (result.isPresent()) {
294 return result.get();
295 }
296 }
297 var message = "Data type %s does not support negation.".formatted(actualType);
298 error(message, negationExpr, null, 0, ProblemValidator.TYPE_ERROR);
299 return ExprType.INVALID;
300 }
301
302 private ExprType computeExpressionType(ArithmeticUnaryExpr expr) {
303 var op = expr.getOp();
304 var body = expr.getBody();
305 if (op == null || body == null) {
306 return ExprType.INVALID;
307 }
308 var actualType = getExpressionType(body);
309 if (actualType == DataExprType.INVALID) {
310 return ExprType.INVALID;
311 }
312 if (actualType instanceof MutableType) {
313 error(OPERAND_TYPE_ERROR_MESSAGE, body, null, 0, ProblemValidator.TYPE_ERROR);
314 return ExprType.INVALID;
315 }
316 if (actualType instanceof DataExprType dataExprType) {
317 var result = interpreter.getUnaryOperationType(op, dataExprType);
318 if (result.isPresent()) {
319 return result.get();
320 }
321 }
322 var message = "Unsupported operator for data type %s.".formatted(actualType);
323 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
324 return ExprType.INVALID;
325 }
326
327 private ExprType computeExpressionType(CountExpr countExpr) {
328 return coerceIntoLiteral(countExpr.getBody()) ? BuiltinTermInterpreter.INT_TYPE : ExprType.INVALID;
329 }
330
331 private ExprType computeExpressionType(AggregationExpr expr) {
332 var aggregator = expr.getAggregator();
333 if (aggregator == null || aggregator.eIsProxy()) {
334 return null;
335 }
336 // Avoid short-circuiting to let us type check both the value and the condition.
337 boolean ok = coerceIntoLiteral(expr.getCondition());
338 var value = expr.getValue();
339 var actualType = getExpressionType(value);
340 if (actualType == ExprType.INVALID) {
341 return ExprType.INVALID;
342 }
343 if (actualType instanceof MutableType) {
344 error(OPERAND_TYPE_ERROR_MESSAGE, value, null, 0, ProblemValidator.TYPE_ERROR);
345 return ExprType.INVALID;
346 }
347 if (actualType instanceof DataExprType dataExprType) {
348 var aggregatorName = signatureProvider.getAggregatorName(aggregator);
349 var result = interpreter.getAggregationType(aggregatorName, dataExprType);
350 if (result.isPresent()) {
351 return ok ? result.get() : ExprType.INVALID;
352 }
353 }
354 var message = "Unsupported aggregator for type %s.".formatted(actualType);
355 error(message, expr, ProblemPackage.Literals.AGGREGATION_EXPR__AGGREGATOR, 0, ProblemValidator.TYPE_ERROR);
356 return ExprType.INVALID;
357 }
358
359 private ExprType computeExpressionType(ComparisonExpr expr) {
360 var left = expr.getLeft();
361 var right = expr.getRight();
362 var op = expr.getOp();
363 if (op == ComparisonOp.NODE_EQ || op == ComparisonOp.NODE_NOT_EQ) {
364 // Avoid short-circuiting to let us type check both arguments.
365 boolean leftOk = expectType(left, ExprType.NODE);
366 boolean rightOk = expectType(right, ExprType.NODE);
367 return leftOk && rightOk ? ExprType.LITERAL : ExprType.INVALID;
368 }
369 if (!(getCommonDataType(expr) instanceof DataExprType commonType)) {
370 return ExprType.INVALID;
371 }
372 // Data equality and inequality are always supported for data types.
373 if (op != ComparisonOp.EQ && op != ComparisonOp.NOT_EQ && !interpreter.isComparisonSupported(commonType)) {
374 var message = "Data type %s does not support comparison.".formatted(commonType);
375 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
376 return ExprType.INVALID;
377 }
378 return BuiltinTermInterpreter.BOOLEAN_TYPE;
379 }
380
381 private ExprType computeExpressionType(LatticeBinaryExpr expr) {
382 // Lattice operations are always supported for data types.
383 return getCommonDataType(expr);
384 }
385
386 private ExprType computeExpressionType(RangeExpr expr) {
387 var left = expr.getLeft();
388 var right = expr.getRight();
389 if (left instanceof InfiniteConstant && right instanceof InfiniteConstant) {
390 // `*..*` is equivalent to `unknown` if neither subexpression have been typed yet.
391 var mutableType = new MutableType();
392 if (expressionTypes.putIfAbsent(left, mutableType) == null &&
393 expressionTypes.put(right, mutableType) == null) {
394 return mutableType;
395 }
396 }
397 if (!(getCommonDataType(expr) instanceof DataExprType commonType)) {
398 return ExprType.INVALID;
399 }
400 if (!interpreter.isRangeSupported(commonType)) {
401 var message = "Data type %s does not support ranges.".formatted(commonType);
402 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
403 return ExprType.INVALID;
404 }
405 return commonType;
406 }
407
408 private ExprType computeExpressionType(ArithmeticBinaryExpr expr) {
409 var op = expr.getOp();
410 var left = expr.getLeft();
411 var right = expr.getRight();
412 if (op == null || left == null || right == null) {
413 return ExprType.INVALID;
414 }
415 // Avoid short-circuiting to let us type check both arguments.
416 var leftType = getExpressionType(left);
417 var rightType = getExpressionType(right);
418 if (leftType == ExprType.INVALID || rightType == ExprType.INVALID) {
419 return ExprType.INVALID;
420 }
421 if (rightType instanceof MutableType rightMutableType) {
422 if (leftType instanceof DataExprType leftExprType) {
423 rightMutableType.setActualType(leftExprType);
424 rightType = leftExprType;
425 } else {
426 error(OPERAND_TYPE_ERROR_MESSAGE, right, null, 0, ProblemValidator.TYPE_ERROR);
427 return ExprType.INVALID;
428 }
429 }
430 if (leftType instanceof MutableType leftMutableType) {
431 if (rightType instanceof DataExprType rightExprType) {
432 leftMutableType.setActualType(rightExprType);
433 leftType = rightExprType;
434 } else {
435 error(OPERAND_TYPE_ERROR_MESSAGE, left, null, 0, ProblemValidator.TYPE_ERROR);
436 return ExprType.INVALID;
437 }
438 }
439 if (leftType instanceof DataExprType leftExprType && rightType instanceof DataExprType rightExprType) {
440 var result = interpreter.getBinaryOperationType(op, leftExprType, rightExprType);
441 if (result.isPresent()) {
442 return result.get();
443 }
444 }
445 var messageBuilder = new StringBuilder("Unsupported operator for ");
446 if (leftType.equals(rightType)) {
447 messageBuilder.append("data type ").append(leftType);
448 } else {
449 messageBuilder.append("data types ").append(leftType).append(" and ").append(rightType);
450 }
451 messageBuilder.append(".");
452 error(messageBuilder.toString(), expr, null, 0, ProblemValidator.TYPE_ERROR);
453 return ExprType.INVALID;
454 }
455
456 private ExprType computeExpressionType(CastExpr expr) {
457 var body = expr.getBody();
458 var targetRelation = expr.getTargetType();
459 if (body == null || !(targetRelation instanceof DatatypeDeclaration targetDeclaration)) {
460 return null;
461 }
462 var actualType = getExpressionType(body);
463 if (actualType == ExprType.INVALID) {
464 return ExprType.INVALID;
465 }
466 var targetType = signatureProvider.getDataType(targetDeclaration);
467 if (actualType instanceof MutableType mutableType) {
468 // Type ascription for polymorphic literal (e.g., `unknown as int` for the set of all integers).
469 mutableType.setActualType(targetType);
470 return targetType;
471 }
472 if (actualType.equals(targetType)) {
473 return targetType;
474 }
475 if (actualType instanceof DataExprType dataExprType && interpreter.isCastSupported(dataExprType, targetType)) {
476 return targetType;
477 }
478 var message = "Casting from %s to %s is not supported.".formatted(actualType, targetType);
479 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
480 return ExprType.INVALID;
481 }
482
483 private FixedType getCommonDataType(BinaryExpr expr) {
484 var commonType = getCommonType(expr);
485 if (!(commonType instanceof DataExprType) && commonType != ExprType.INVALID) {
486 var message = "Expected data expression, got %s instead.".formatted(commonType);
487 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
488 return ExprType.INVALID;
489 }
490 return commonType;
491 }
492
493 private FixedType getCommonType(BinaryExpr expr) {
494 var left = expr.getLeft();
495 var right = expr.getRight();
496 if (left == null || right == null) {
497 return ExprType.INVALID;
498 }
499 var leftType = getExpressionType(left);
500 if (leftType instanceof FixedType fixedLeftType) {
501 return expectType(right, fixedLeftType) ? fixedLeftType : ExprType.INVALID;
502 } else {
503 var rightType = getExpressionType(right);
504 if (rightType instanceof FixedType fixedRightType) {
505 return expectType(left, leftType, fixedRightType) ? fixedRightType : ExprType.INVALID;
506 } else {
507 error(OPERAND_TYPE_ERROR_MESSAGE, left, null, 0, ProblemValidator.TYPE_ERROR);
508 error(OPERAND_TYPE_ERROR_MESSAGE, right, null, 0, ProblemValidator.TYPE_ERROR);
509 return ExprType.INVALID;
510 }
511 }
512 }
513
514 private boolean coerceIntoLiteral(Expr expr) {
515 if (expr == null) {
516 return false;
517 }
518 var actualType = getExpressionType(expr);
519 if (actualType == ExprType.LITERAL) {
520 return true;
521 }
522 return expectType(expr, actualType, BuiltinTermInterpreter.BOOLEAN_TYPE);
523 }
524
525 private boolean expectType(Expr expr, FixedType expectedType) {
526 if (expr == null) {
527 return false;
528 }
529 var actualType = getExpressionType(expr);
530 return expectType(expr, actualType, expectedType);
531 }
532
533 private boolean expectType(Expr expr, ExprType actualType, FixedType expectedType) {
534 if (expectedType == ExprType.INVALID) {
535 // Silence any further errors is the expected type failed to compute.
536 return false;
537 }
538 if (actualType.equals(expectedType)) {
539 return true;
540 }
541 if (actualType == ExprType.INVALID) {
542 // We have already emitted an error previously.
543 return false;
544 }
545 if (actualType instanceof MutableType mutableType && expectedType instanceof DataExprType dataExprType) {
546 mutableType.setActualType(dataExprType);
547 return true;
548 }
549 var builder = new StringBuilder()
550 .append("Expected ")
551 .append(expectedType)
552 .append(" expression");
553 if (!(actualType instanceof MutableType)) {
554 builder.append(", got ")
555 .append(actualType)
556 .append(" instead");
557 }
558 builder.append(".");
559 error(builder.toString(), expr, null, 0, ProblemValidator.TYPE_ERROR);
560 return false;
561 }
562
563 private void error(String message, EObject object, EStructuralFeature feature, int index, String code,
564 String... issueData) {
565 diagnostics.add(new FeatureBasedDiagnostic(Diagnostic.ERROR, message, object, feature, index,
566 CheckType.NORMAL, code, issueData));
567 }
568}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
index c87fa044..72f23e85 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -7,7 +7,56 @@ package tools.refinery.language.utils;
7 7
8import tools.refinery.language.model.problem.*; 8import tools.refinery.language.model.problem.*;
9 9
10public record BuiltinSymbols(Problem problem, ClassDeclaration node, PredicateDefinition equals, 10public final class BuiltinSymbols {
11 PredicateDefinition exists, ClassDeclaration contained, PredicateDefinition contains, 11 private final Problem problem;
12 PredicateDefinition invalidContainer) { 12 private final ClassDeclaration node;
13 private final PredicateDefinition equals;
14 private final PredicateDefinition exists;
15 private final ClassDeclaration contained;
16 private final PredicateDefinition contains;
17 private final PredicateDefinition invalidContainer;
18
19 public BuiltinSymbols(Problem problem) {
20 this.problem = problem;
21 node = getDeclaration(ClassDeclaration.class, "node");
22 equals = getDeclaration(PredicateDefinition.class, "equals");
23 exists = getDeclaration(PredicateDefinition.class, "exists");
24 contained = getDeclaration(ClassDeclaration.class, "contained");
25 contains = getDeclaration(PredicateDefinition.class, "contains");
26 invalidContainer = getDeclaration(PredicateDefinition.class, "invalidContainer");
27 }
28
29 public Problem problem() {
30 return problem;
31 }
32
33 public ClassDeclaration node() {
34 return node;
35 }
36
37 public PredicateDefinition equals() {
38 return equals;
39 }
40
41 public PredicateDefinition exists() {
42 return exists;
43 }
44
45 public ClassDeclaration contained() {
46 return contained;
47 }
48
49 public PredicateDefinition contains() {
50 return contains;
51 }
52
53 public PredicateDefinition invalidContainer() {
54 return invalidContainer;
55 }
56
57 private <T extends Statement & NamedElement> T getDeclaration(Class<T> type, String name) {
58 return problem.getStatements().stream().filter(type::isInstance).map(type::cast)
59 .filter(declaration -> name.equals(declaration.getName())).findFirst()
60 .orElseThrow(() -> new IllegalArgumentException("Built-in declaration " + name + " was not found"));
61 }
13} 62}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java
deleted file mode 100644
index d45c8083..00000000
--- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java
+++ /dev/null
@@ -1,98 +0,0 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.utils;
7
8import com.google.inject.Inject;
9import com.google.inject.Singleton;
10import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.resource.Resource;
12import org.eclipse.xtext.util.IResourceScopeCache;
13import org.eclipse.xtext.util.Tuples;
14import tools.refinery.language.library.BuiltinLibrary;
15import tools.refinery.language.model.problem.*;
16
17import java.util.*;
18
19@Singleton
20public class ProblemDesugarer {
21 @Inject
22 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
23
24 public Optional<Problem> getBuiltinProblem(EObject context) {
25 return Optional.ofNullable(context).map(EObject::eResource).flatMap(resource ->
26 cache.get("builtinProblem", resource, () -> doGetBuiltinProblem(resource)));
27 }
28
29 private Optional<Problem> doGetBuiltinProblem(Resource resource) {
30 return Optional.ofNullable(resource).map(Resource::getResourceSet)
31 .map(resourceSet -> resourceSet.getResource(BuiltinLibrary.BUILTIN_LIBRARY_URI, true))
32 .map(Resource::getContents).filter(contents -> !contents.isEmpty()).map(List::getFirst)
33 .filter(Problem.class::isInstance).map(Problem.class::cast);
34 }
35
36 public Optional<BuiltinSymbols> getBuiltinSymbols(EObject context) {
37 return getBuiltinProblem(context).map(builtin ->
38 cache.get("builtinSymbols", builtin.eResource(), () -> doGetBuiltinSymbols(builtin)));
39 }
40
41 private BuiltinSymbols doGetBuiltinSymbols(Problem builtin) {
42 var node = doGetDeclaration(builtin, ClassDeclaration.class, "node");
43 var equals = doGetDeclaration(builtin, PredicateDefinition.class, "equals");
44 var exists = doGetDeclaration(builtin, PredicateDefinition.class, "exists");
45 var contained = doGetDeclaration(builtin, ClassDeclaration.class, "contained");
46 var contains = doGetDeclaration(builtin, PredicateDefinition.class, "contains");
47 var invalidContainer = doGetDeclaration(builtin, PredicateDefinition.class, "invalidContainer");
48 return new BuiltinSymbols(builtin, node, equals, exists, contained, contains, invalidContainer);
49 }
50
51 private <T extends Statement & NamedElement> T doGetDeclaration(Problem builtin, Class<T> type, String name) {
52 return builtin.getStatements().stream().filter(type::isInstance).map(type::cast)
53 .filter(declaration -> name.equals(declaration.getName())).findFirst()
54 .orElseThrow(() -> new IllegalArgumentException("Built-in declaration " + name + " was not found"));
55 }
56
57 public Collection<ClassDeclaration> getSuperclassesAndSelf(ClassDeclaration classDeclaration) {
58 return cache.get(Tuples.create(classDeclaration, "superclassesAndSelf"), classDeclaration.eResource(),
59 () -> doGetSuperclassesAndSelf(classDeclaration));
60 }
61
62 private Collection<ClassDeclaration> doGetSuperclassesAndSelf(ClassDeclaration classDeclaration) {
63 var builtinSymbols = getBuiltinSymbols(classDeclaration);
64 Set<ClassDeclaration> found = new HashSet<>();
65 builtinSymbols.ifPresent(symbols -> found.add(symbols.node()));
66 Deque<ClassDeclaration> queue = new ArrayDeque<>();
67 queue.addLast(classDeclaration);
68 while (!queue.isEmpty()) {
69 ClassDeclaration current = queue.removeFirst();
70 if (!found.contains(current)) {
71 found.add(current);
72 for (Relation superType : current.getSuperTypes()) {
73 if (superType instanceof ClassDeclaration superDeclaration) {
74 queue.addLast(superDeclaration);
75 }
76 }
77 }
78 }
79 return found;
80 }
81
82 public Collection<ReferenceDeclaration> getAllReferenceDeclarations(ClassDeclaration classDeclaration) {
83 return cache.get(Tuples.create(classDeclaration, "allReferenceDeclarations"), classDeclaration.eResource(),
84 () -> doGetAllReferenceDeclarations(classDeclaration));
85 }
86
87 private Collection<ReferenceDeclaration> doGetAllReferenceDeclarations(ClassDeclaration classDeclaration) {
88 Set<ReferenceDeclaration> referenceDeclarations = new HashSet<>();
89 for (ClassDeclaration superclass : getSuperclassesAndSelf(classDeclaration)) {
90 referenceDeclarations.addAll(superclass.getFeatureDeclarations());
91 }
92 return referenceDeclarations;
93 }
94
95 public boolean isContainmentReference(ReferenceDeclaration referenceDeclaration) {
96 return referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT;
97 }
98}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
index 6d6d65da..9daa8f61 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
@@ -98,18 +98,19 @@ public final class ProblemUtil {
98 return true; 98 return true;
99 } 99 }
100 100
101 public static int getArity(Relation relation) { 101 public static boolean isTypeLike(Relation relation) {
102 if (relation instanceof ClassDeclaration || relation instanceof EnumDeclaration || 102 if (relation instanceof ClassDeclaration || relation instanceof EnumDeclaration ||
103 relation instanceof DatatypeDeclaration) { 103 relation instanceof DatatypeDeclaration) {
104 return 1; 104 return true;
105 }
106 if (relation instanceof ReferenceDeclaration) {
107 return 2;
108 } 105 }
109 if (relation instanceof PredicateDefinition predicateDefinition) { 106 if (relation instanceof PredicateDefinition predicateDefinition) {
110 return predicateDefinition.getParameters().size(); 107 return predicateDefinition.getParameters().size() == 1;
111 } 108 }
112 throw new IllegalArgumentException("Unknown Relation: " + relation); 109 return false;
110 }
111
112 public static boolean isContainmentReference(ReferenceDeclaration referenceDeclaration) {
113 return referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT;
113 } 114 }
114 115
115 public static boolean isContainerReference(ReferenceDeclaration referenceDeclaration) { 116 public static boolean isContainerReference(ReferenceDeclaration referenceDeclaration) {
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
index 7f45bc20..745e2d2b 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
@@ -10,6 +10,7 @@
10package tools.refinery.language.validation; 10package tools.refinery.language.validation;
11 11
12import com.google.inject.Inject; 12import com.google.inject.Inject;
13import org.eclipse.emf.common.util.Diagnostic;
13import org.eclipse.emf.ecore.EObject; 14import org.eclipse.emf.ecore.EObject;
14import org.eclipse.emf.ecore.EReference; 15import org.eclipse.emf.ecore.EReference;
15import org.eclipse.xtext.EcoreUtil2; 16import org.eclipse.xtext.EcoreUtil2;
@@ -18,11 +19,15 @@ import org.eclipse.xtext.validation.Check;
18import org.jetbrains.annotations.Nullable; 19import org.jetbrains.annotations.Nullable;
19import tools.refinery.language.model.problem.*; 20import tools.refinery.language.model.problem.*;
20import tools.refinery.language.naming.NamingUtil; 21import tools.refinery.language.naming.NamingUtil;
21import tools.refinery.language.scoping.imports.ImportAdapter; 22import tools.refinery.language.scoping.imports.ImportAdapterProvider;
22import tools.refinery.language.utils.ProblemDesugarer; 23import tools.refinery.language.typesystem.ProblemTypeAnalyzer;
24import tools.refinery.language.typesystem.SignatureProvider;
23import tools.refinery.language.utils.ProblemUtil; 25import tools.refinery.language.utils.ProblemUtil;
24 26
25import java.util.*; 27import java.util.ArrayList;
28import java.util.LinkedHashMap;
29import java.util.LinkedHashSet;
30import java.util.Set;
26 31
27/** 32/**
28 * This class contains custom validation rules. 33 * This class contains custom validation rules.
@@ -32,47 +37,39 @@ import java.util.*;
32 */ 37 */
33public class ProblemValidator extends AbstractProblemValidator { 38public class ProblemValidator extends AbstractProblemValidator {
34 private static final String ISSUE_PREFIX = "tools.refinery.language.validation.ProblemValidator."; 39 private static final String ISSUE_PREFIX = "tools.refinery.language.validation.ProblemValidator.";
35
36 public static final String UNEXPECTED_MODULE_NAME_ISSUE = ISSUE_PREFIX + "UNEXPECTED_MODULE_NAME"; 40 public static final String UNEXPECTED_MODULE_NAME_ISSUE = ISSUE_PREFIX + "UNEXPECTED_MODULE_NAME";
37
38 public static final String INVALID_IMPORT_ISSUE = ISSUE_PREFIX + "INVALID_IMPORT"; 41 public static final String INVALID_IMPORT_ISSUE = ISSUE_PREFIX + "INVALID_IMPORT";
39
40 public static final String SINGLETON_VARIABLE_ISSUE = ISSUE_PREFIX + "SINGLETON_VARIABLE"; 42 public static final String SINGLETON_VARIABLE_ISSUE = ISSUE_PREFIX + "SINGLETON_VARIABLE";
41
42 public static final String NODE_CONSTANT_ISSUE = ISSUE_PREFIX + "NODE_CONSTANT_ISSUE"; 43 public static final String NODE_CONSTANT_ISSUE = ISSUE_PREFIX + "NODE_CONSTANT_ISSUE";
43
44 public static final String DUPLICATE_NAME_ISSUE = ISSUE_PREFIX + "DUPLICATE_NAME"; 44 public static final String DUPLICATE_NAME_ISSUE = ISSUE_PREFIX + "DUPLICATE_NAME";
45
46 public static final String INVALID_MULTIPLICITY_ISSUE = ISSUE_PREFIX + "INVALID_MULTIPLICITY"; 45 public static final String INVALID_MULTIPLICITY_ISSUE = ISSUE_PREFIX + "INVALID_MULTIPLICITY";
47
48 public static final String ZERO_MULTIPLICITY_ISSUE = ISSUE_PREFIX + "ZERO_MULTIPLICITY"; 46 public static final String ZERO_MULTIPLICITY_ISSUE = ISSUE_PREFIX + "ZERO_MULTIPLICITY";
49
50 public static final String MISSING_OPPOSITE_ISSUE = ISSUE_PREFIX + "MISSING_OPPOSITE"; 47 public static final String MISSING_OPPOSITE_ISSUE = ISSUE_PREFIX + "MISSING_OPPOSITE";
51
52 public static final String INVALID_OPPOSITE_ISSUE = ISSUE_PREFIX + "INVALID_OPPOSITE"; 48 public static final String INVALID_OPPOSITE_ISSUE = ISSUE_PREFIX + "INVALID_OPPOSITE";
53
54 public static final String INVALID_SUPERTYPE_ISSUE = ISSUE_PREFIX + "INVALID_SUPERTYPE"; 49 public static final String INVALID_SUPERTYPE_ISSUE = ISSUE_PREFIX + "INVALID_SUPERTYPE";
55
56 public static final String INVALID_REFERENCE_TYPE_ISSUE = ISSUE_PREFIX + "INVALID_REFERENCE_TYPE"; 50 public static final String INVALID_REFERENCE_TYPE_ISSUE = ISSUE_PREFIX + "INVALID_REFERENCE_TYPE";
57
58 public static final String INVALID_ARITY_ISSUE = ISSUE_PREFIX + "INVALID_ARITY"; 51 public static final String INVALID_ARITY_ISSUE = ISSUE_PREFIX + "INVALID_ARITY";
59
60 public static final String INVALID_TRANSITIVE_CLOSURE_ISSUE = ISSUE_PREFIX + "INVALID_TRANSITIVE_CLOSURE"; 52 public static final String INVALID_TRANSITIVE_CLOSURE_ISSUE = ISSUE_PREFIX + "INVALID_TRANSITIVE_CLOSURE";
61
62 public static final String INVALID_VALUE_ISSUE = ISSUE_PREFIX + "INVALID_VALUE"; 53 public static final String INVALID_VALUE_ISSUE = ISSUE_PREFIX + "INVALID_VALUE";
63
64 public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION"; 54 public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION";
65 55 public static final String UNKNOWN_EXPRESSION_ISSUE = ISSUE_PREFIX + "UNKNOWN_EXPRESSION";
66 public static final String INVALID_ASSIGNMENT_ISSUE = ISSUE_PREFIX + "INVALID_ASSIGNMENT"; 56 public static final String INVALID_ASSIGNMENT_ISSUE = ISSUE_PREFIX + "INVALID_ASSIGNMENT";
57 public static final String TYPE_ERROR = ISSUE_PREFIX + "TYPE_ERROR";
67 58
68 @Inject 59 @Inject
69 private ReferenceCounter referenceCounter; 60 private ReferenceCounter referenceCounter;
70 61
71 @Inject 62 @Inject
72 private ProblemDesugarer desugarer; 63 private IQualifiedNameConverter qualifiedNameConverter;
73 64
74 @Inject 65 @Inject
75 private IQualifiedNameConverter qualifiedNameConverter; 66 private ImportAdapterProvider importAdapterProvider;
67
68 @Inject
69 private SignatureProvider signatureProvider;
70
71 @Inject
72 private ProblemTypeAnalyzer typeAnalyzer;
76 73
77 @Check 74 @Check
78 public void checkModuleName(Problem problem) { 75 public void checkModuleName(Problem problem) {
@@ -88,7 +85,7 @@ public class ProblemValidator extends AbstractProblemValidator {
88 if (resourceSet == null) { 85 if (resourceSet == null) {
89 return; 86 return;
90 } 87 }
91 var adapter = ImportAdapter.getOrInstall(resourceSet); 88 var adapter = importAdapterProvider.getOrInstall(resourceSet);
92 var expectedName = adapter.getQualifiedName(resource.getURI()); 89 var expectedName = adapter.getQualifiedName(resource.getURI());
93 if (expectedName == null) { 90 if (expectedName == null) {
94 return; 91 return;
@@ -158,15 +155,19 @@ public class ProblemValidator extends AbstractProblemValidator {
158 public void checkUniqueDeclarations(Problem problem) { 155 public void checkUniqueDeclarations(Problem problem) {
159 var relations = new ArrayList<Relation>(); 156 var relations = new ArrayList<Relation>();
160 var nodes = new ArrayList<Node>(); 157 var nodes = new ArrayList<Node>();
158 var aggregators = new ArrayList<AggregatorDeclaration>();
161 for (var statement : problem.getStatements()) { 159 for (var statement : problem.getStatements()) {
162 if (statement instanceof Relation relation) { 160 if (statement instanceof Relation relation) {
163 relations.add(relation); 161 relations.add(relation);
164 } else if (statement instanceof NodeDeclaration nodeDeclaration) { 162 } else if (statement instanceof NodeDeclaration nodeDeclaration) {
165 nodes.addAll(nodeDeclaration.getNodes()); 163 nodes.addAll(nodeDeclaration.getNodes());
164 } else if (statement instanceof AggregatorDeclaration aggregatorDeclaration) {
165 aggregators.add(aggregatorDeclaration);
166 } 166 }
167 } 167 }
168 checkUniqueSimpleNames(relations); 168 checkUniqueSimpleNames(relations);
169 checkUniqueSimpleNames(nodes); 169 checkUniqueSimpleNames(nodes);
170 checkUniqueSimpleNames(aggregators);
170 } 171 }
171 172
172 @Check 173 @Check
@@ -353,11 +354,14 @@ public class ProblemValidator extends AbstractProblemValidator {
353 354
354 @Check 355 @Check
355 public void checkAssertion(Assertion assertion) { 356 public void checkAssertion(Assertion assertion) {
356 int argumentCount = assertion.getArguments().size(); 357 var relation = assertion.getRelation();
357 if (!(assertion.getValue() instanceof LogicConstant)) { 358 if (relation instanceof DatatypeDeclaration) {
358 var message = "Assertion value must be one of 'true', 'false', 'unknown', or 'error'."; 359 var message = "Assertions for data types are not supported.";
359 acceptError(message, assertion, ProblemPackage.Literals.ASSERTION__VALUE, 0, INVALID_VALUE_ISSUE); 360 acceptError(message, assertion, ProblemPackage.Literals.ASSERTION__RELATION, 0,
361 UNSUPPORTED_ASSERTION_ISSUE);
362 return;
360 } 363 }
364 int argumentCount = assertion.getArguments().size();
361 checkArity(assertion, ProblemPackage.Literals.ASSERTION__RELATION, argumentCount); 365 checkArity(assertion, ProblemPackage.Literals.ASSERTION__RELATION, argumentCount);
362 } 366 }
363 367
@@ -376,7 +380,7 @@ public class ProblemValidator extends AbstractProblemValidator {
376 // Feature does not point to a {@link Relation}, we are probably already emitting another error. 380 // Feature does not point to a {@link Relation}, we are probably already emitting another error.
377 return; 381 return;
378 } 382 }
379 int arity = ProblemUtil.getArity(relation); 383 int arity = signatureProvider.getArity(relation);
380 if (arity == expectedArity) { 384 if (arity == expectedArity) {
381 return; 385 return;
382 } 386 }
@@ -387,11 +391,7 @@ public class ProblemValidator extends AbstractProblemValidator {
387 391
388 @Check 392 @Check
389 public void checkMultiObjectAssertion(Assertion assertion) { 393 public void checkMultiObjectAssertion(Assertion assertion) {
390 var builtinSymbolsOption = desugarer.getBuiltinSymbols(assertion); 394 var builtinSymbols = importAdapterProvider.getBuiltinSymbols(assertion);
391 if (builtinSymbolsOption.isEmpty()) {
392 return;
393 }
394 var builtinSymbols = builtinSymbolsOption.get();
395 var relation = assertion.getRelation(); 395 var relation = assertion.getRelation();
396 boolean isExists = builtinSymbols.exists().equals(relation); 396 boolean isExists = builtinSymbols.exists().equals(relation);
397 boolean isEquals = builtinSymbols.equals().equals(relation); 397 boolean isEquals = builtinSymbols.equals().equals(relation);
@@ -524,5 +524,37 @@ public class ProblemValidator extends AbstractProblemValidator {
524 acceptError(message, variableOrNodeExpr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, 524 acceptError(message, variableOrNodeExpr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE,
525 0, INVALID_ASSIGNMENT_ISSUE); 525 0, INVALID_ASSIGNMENT_ISSUE);
526 } 526 }
527 if (!(assignmentExpr.eContainer() instanceof Conjunction)) {
528 var message = "Assignments may only appear as top-level expressions.";
529 acceptError(message, assignmentExpr, null, 0, INVALID_ASSIGNMENT_ISSUE);
530 }
531 }
532
533 @Check
534 private void checkInfiniteConstant(InfiniteConstant infiniteConstant) {
535 if (!(infiniteConstant.eContainer() instanceof RangeExpr)) {
536 var message = "Negative and positive infinity literals may only appear in '..' range expressions.";
537 acceptError(message, infiniteConstant, null, 0, TYPE_ERROR);
538 }
539 }
540
541 @Check
542 private void checkTypes(Problem problem) {
543 var diagnostics = typeAnalyzer.getOrComputeTypes(problem).getDiagnostics();
544 for (var diagnostic : diagnostics) {
545 switch (diagnostic.getSeverity()) {
546 case Diagnostic.INFO -> info(diagnostic.getMessage(), diagnostic.getSourceEObject(),
547 diagnostic.getFeature(), diagnostic.getIndex(), diagnostic.getIssueCode(),
548 diagnostic.getIssueData());
549 case Diagnostic.WARNING -> warning(diagnostic.getMessage(), diagnostic.getSourceEObject(),
550 diagnostic.getFeature(), diagnostic.getIndex(), diagnostic.getIssueCode(),
551 diagnostic.getIssueData());
552 case Diagnostic.ERROR -> error(diagnostic.getMessage(), diagnostic.getSourceEObject(),
553 diagnostic.getFeature(), diagnostic.getIndex(), diagnostic.getIssueCode(),
554 diagnostic.getIssueData());
555 default -> throw new IllegalStateException("Unknown severity %s of %s"
556 .formatted(diagnostic.getSeverity(), diagnostic));
557 }
558 }
527 } 559 }
528} 560}
diff --git a/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.expressions.TermInterpreter b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.expressions.TermInterpreter
new file mode 100644
index 00000000..11b6ccae
--- /dev/null
+++ b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.expressions.TermInterpreter
@@ -0,0 +1,4 @@
1# SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
2#
3# SPDX-License-Identifier: EPL-2.0
4tools.refinery.language.expressions.BuiltinTermInterpreter
diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
index faca332f..09c7d92b 100644
--- a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
+++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
@@ -14,8 +14,16 @@ pred contains(container, contained contained).
14 14
15error invalidContainer(contained contained). 15error invalidContainer(contained contained).
16 16
17extern datatype boolean.
18
17extern datatype int. 19extern datatype int.
18 20
19extern datatype real. 21extern datatype real.
20 22
21extern datatype string. 23extern datatype string.
24
25extern aggregator min.
26
27extern aggregator max.
28
29extern aggregator sum.
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java
index 1fb08845..b995d0bb 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -35,7 +35,7 @@ class AssertionValidationTest {
35 """); 35 """);
36 var issues = problem.validate(); 36 var issues = problem.validate();
37 assertThat(issues, hasItem(hasProperty("issueCode", 37 assertThat(issues, hasItem(hasProperty("issueCode",
38 is(ProblemValidator.INVALID_VALUE_ISSUE)))); 38 is(ProblemValidator.TYPE_ERROR))));
39 } 39 }
40 40
41 @ParameterizedTest 41 @ParameterizedTest
diff --git a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
index 58bfce44..b31eed6d 100644
--- a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
+++ b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -7,9 +7,9 @@ package tools.refinery.language.model.tests.utils;
7 7
8import org.eclipse.emf.ecore.resource.Resource.Diagnostic; 8import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
9import org.eclipse.emf.ecore.util.Diagnostician; 9import org.eclipse.emf.ecore.util.Diagnostician;
10import org.eclipse.emf.ecore.util.EcoreUtil;
11import tools.refinery.language.library.BuiltinLibrary;
10import tools.refinery.language.model.problem.*; 12import tools.refinery.language.model.problem.*;
11import tools.refinery.language.utils.BuiltinSymbols;
12import tools.refinery.language.utils.ProblemDesugarer;
13 13
14import java.util.List; 14import java.util.List;
15import java.util.stream.Stream; 15import java.util.stream.Stream;
@@ -32,11 +32,11 @@ public record WrappedProblem(Problem problem) {
32 } 32 }
33 33
34 public WrappedProblem builtin() { 34 public WrappedProblem builtin() {
35 return new WrappedProblem(new ProblemDesugarer().getBuiltinProblem(problem).orElseThrow()); 35 var resourceSet = problem.eResource().getResourceSet();
36 } 36 var builtinResource = resourceSet.getResource(BuiltinLibrary.BUILTIN_LIBRARY_URI, true);
37 37 EcoreUtil.resolveAll(builtinResource);
38 public BuiltinSymbols builtinSymbols() { 38 var builtinProblem = (Problem) builtinResource.getContents().getFirst();
39 return new ProblemDesugarer().getBuiltinSymbols(problem).orElseThrow(); 39 return new WrappedProblem(builtinProblem);
40 } 40 }
41 41
42 public List<String> nodeNames() { 42 public List<String> nodeNames() {