aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2024-06-17 16:47:33 +0200
committerLibravatar GitHub <noreply@github.com>2024-06-17 16:47:33 +0200
commitac5b71917023cec36c3c5bacf779692542ff8e1a (patch)
treee14fc5d1473c4951ee32c4a82ea6d8b72e4857fd /subprojects
parentchore(deps): bump dependencies (diff)
parentchore(deps): bump dependencies (diff)
downloadrefinery-ac5b71917023cec36c3c5bacf779692542ff8e1a.tar.gz
refinery-ac5b71917023cec36c3c5bacf779692542ff8e1a.tar.zst
refinery-ac5b71917023cec36c3c5bacf779692542ff8e1a.zip
Merge pull request #60 from kris7t/rules
Refinement rule support
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/docs/package.json26
-rw-r--r--subprojects/frontend/package.json28
-rw-r--r--subprojects/frontend/src/language/folding.ts2
-rw-r--r--subprojects/frontend/src/language/problem.grammar46
-rw-r--r--subprojects/frontend/src/language/problemLanguageSupport.ts23
-rw-r--r--subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java52
-rw-r--r--subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java43
-rw-r--r--subprojects/generator/src/main/java/tools/refinery/generator/ModelGeneratorFactory.java20
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java8
-rw-r--r--subprojects/language-model/problem.aird1249
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.ecore57
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.genmodel54
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java393
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java2
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java21
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java2
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/Problem.xtext74
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java2
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java3
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java15
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/serializer/PreferShortAssertionsProblemSemanticSequencer.java12
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java1
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java3
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/ModalLiteralType.java16
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java83
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java14
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ActionTargetCollector.java73
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ExistsVariableCollector.java75
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java150
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ReferenceCounter.java17
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/rules/RuleParsingTest.java54
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/validation/OppositeValidationTest.java36
-rw-r--r--subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAction.java16
-rw-r--r--subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAssertionArgument.java2
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/literal/ConstantLiteral.java3
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java25
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/Action.java4
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ActionLiterals.java4
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ConstantActionLiteral.java45
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/PartialClauseRewriter.java64
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialNeighbourhoodCalculator.java63
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialRelationTranslator.java37
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java43
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceInfo.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceTranslator.java160
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInfo.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceTranslator.java134
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java10
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfo.java9
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfoBuilder.java8
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiplicity/InvalidMultiplicityErrorTranslator.java12
-rw-r--r--subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyPartialModelTest.java6
-rw-r--r--subprojects/store/build.gradle.kts2
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/AbstractNeighbourhoodCalculator.java171
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/LazyNeighbourhoodCalculator.java195
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java117
56 files changed, 2531 insertions, 1262 deletions
diff --git a/subprojects/docs/package.json b/subprojects/docs/package.json
index 9ecd6820..0771c08d 100644
--- a/subprojects/docs/package.json
+++ b/subprojects/docs/package.json
@@ -30,19 +30,19 @@
30 }, 30 },
31 "homepage": "https://refinery.tools", 31 "homepage": "https://refinery.tools",
32 "dependencies": { 32 "dependencies": {
33 "@docusaurus/core": "^3.3.2", 33 "@docusaurus/core": "^3.4.0",
34 "@docusaurus/plugin-content-docs": "^3.3.2", 34 "@docusaurus/plugin-content-docs": "^3.4.0",
35 "@docusaurus/plugin-content-pages": "^3.3.2", 35 "@docusaurus/plugin-content-pages": "^3.4.0",
36 "@docusaurus/plugin-sitemap": "^3.3.2", 36 "@docusaurus/plugin-sitemap": "^3.4.0",
37 "@docusaurus/theme-classic": "^3.3.2", 37 "@docusaurus/theme-classic": "^3.4.0",
38 "@docusaurus/theme-common": "^3.3.2", 38 "@docusaurus/theme-common": "^3.4.0",
39 "@docusaurus/theme-search-algolia": "^3.3.2", 39 "@docusaurus/theme-search-algolia": "^3.4.0",
40 "@fontsource-variable/jetbrains-mono": "^5.0.21", 40 "@fontsource-variable/jetbrains-mono": "^5.0.21",
41 "@fontsource-variable/open-sans": "^5.0.29", 41 "@fontsource-variable/open-sans": "^5.0.29",
42 "@fontsource/open-sans": "^5.0.28", 42 "@fontsource/open-sans": "^5.0.28",
43 "@material-icons/svg": "^1.0.33", 43 "@material-icons/svg": "^1.0.33",
44 "@mdx-js/react": "^3.0.1", 44 "@mdx-js/react": "^3.0.1",
45 "@swc/core": "^1.5.7", 45 "@swc/core": "^1.6.1",
46 "clsx": "^2.1.1", 46 "clsx": "^2.1.1",
47 "mdast-util-mdx": "^3.0.0", 47 "mdast-util-mdx": "^3.0.0",
48 "prism-react-renderer": "^2.3.1", 48 "prism-react-renderer": "^2.3.1",
@@ -55,15 +55,15 @@
55 "terser-webpack-plugin": "^5.3.10", 55 "terser-webpack-plugin": "^5.3.10",
56 "unified": "^11.0.4", 56 "unified": "^11.0.4",
57 "unist-util-visit": "^5.0.0", 57 "unist-util-visit": "^5.0.0",
58 "webpack": "^5.91.0" 58 "webpack": "^5.92.0"
59 }, 59 },
60 "devDependencies": { 60 "devDependencies": {
61 "@docusaurus/mdx-loader": "^3.3.2", 61 "@docusaurus/mdx-loader": "^3.4.0",
62 "@docusaurus/module-type-aliases": "^3.3.2", 62 "@docusaurus/module-type-aliases": "^3.4.0",
63 "@docusaurus/types": "^3.3.2", 63 "@docusaurus/types": "^3.4.0",
64 "@types/babel__core": "^7.20.5", 64 "@types/babel__core": "^7.20.5",
65 "@types/mdast": "^4.0.4", 65 "@types/mdast": "^4.0.4",
66 "@types/node": "^20.12.12", 66 "@types/node": "^20.14.2",
67 "@types/react": "^18.3.3", 67 "@types/react": "^18.3.3",
68 "@types/react-dom": "^18.3.0", 68 "@types/react-dom": "^18.3.0",
69 "@types/unist": "^3.0.2" 69 "@types/unist": "^3.0.2"
diff --git a/subprojects/frontend/package.json b/subprojects/frontend/package.json
index 859a4b5c..ae1103d6 100644
--- a/subprojects/frontend/package.json
+++ b/subprojects/frontend/package.json
@@ -28,13 +28,13 @@
28 }, 28 },
29 "homepage": "https://refinery.tools", 29 "homepage": "https://refinery.tools",
30 "dependencies": { 30 "dependencies": {
31 "@codemirror/autocomplete": "^6.16.0", 31 "@codemirror/autocomplete": "^6.16.2",
32 "@codemirror/commands": "^6.5.0", 32 "@codemirror/commands": "^6.6.0",
33 "@codemirror/language": "^6.10.1", 33 "@codemirror/language": "^6.10.2",
34 "@codemirror/lint": "^6.8.0", 34 "@codemirror/lint": "^6.8.0",
35 "@codemirror/search": "^6.5.6", 35 "@codemirror/search": "^6.5.6",
36 "@codemirror/state": "^6.4.1", 36 "@codemirror/state": "^6.4.1",
37 "@codemirror/view": "^6.26.3", 37 "@codemirror/view": "^6.28.1",
38 "@emotion/cache": "^11.11.0", 38 "@emotion/cache": "^11.11.0",
39 "@emotion/react": "^11.11.4", 39 "@emotion/react": "^11.11.4",
40 "@emotion/serialize": "^1.1.4", 40 "@emotion/serialize": "^1.1.4",
@@ -46,12 +46,12 @@
46 "@hpcc-js/wasm": "^2.16.2", 46 "@hpcc-js/wasm": "^2.16.2",
47 "@lezer/common": "^1.2.1", 47 "@lezer/common": "^1.2.1",
48 "@lezer/highlight": "^1.2.0", 48 "@lezer/highlight": "^1.2.0",
49 "@lezer/lr": "^1.4.0", 49 "@lezer/lr": "^1.4.1",
50 "@material-icons/svg": "^1.0.33", 50 "@material-icons/svg": "^1.0.33",
51 "@mui/icons-material": "^5.15.18", 51 "@mui/icons-material": "^5.15.20",
52 "@mui/material": "^5.15.18", 52 "@mui/material": "^5.15.20",
53 "@mui/system": "^5.15.15", 53 "@mui/system": "^5.15.20",
54 "@mui/x-data-grid": "^7.5.1", 54 "@mui/x-data-grid": "^7.7.0",
55 "ansi-styles": "^6.2.1", 55 "ansi-styles": "^6.2.1",
56 "csstype": "^3.1.3", 56 "csstype": "^3.1.3",
57 "d3": "^7.9.0", 57 "d3": "^7.9.0",
@@ -64,15 +64,15 @@
64 "lodash-es": "^4.17.21", 64 "lodash-es": "^4.17.21",
65 "loglevel": "^1.9.1", 65 "loglevel": "^1.9.1",
66 "loglevel-plugin-prefix": "^0.8.4", 66 "loglevel-plugin-prefix": "^0.8.4",
67 "mobx": "^6.12.3", 67 "mobx": "^6.12.4",
68 "mobx-react-lite": "^4.0.7", 68 "mobx-react-lite": "^4.0.7",
69 "ms": "^2.1.3", 69 "ms": "^2.1.3",
70 "nanoid": "^5.0.7", 70 "nanoid": "^5.0.7",
71 "notistack": "^3.0.1", 71 "notistack": "^3.0.1",
72 "react": "^18.3.1", 72 "react": "^18.3.1",
73 "react-dom": "^18.3.1", 73 "react-dom": "^18.3.1",
74 "react-resize-detector": "^10.0.1", 74 "react-resize-detector": "^11.0.1",
75 "svg2pdf.js": "^2.2.3", 75 "svg2pdf.js": "^2.2.4",
76 "xstate": "^4.38.3", 76 "xstate": "^4.38.3",
77 "zod": "^3.23.8" 77 "zod": "^3.23.8"
78 }, 78 },
@@ -88,7 +88,7 @@
88 "@types/lodash-es": "^4.17.12", 88 "@types/lodash-es": "^4.17.12",
89 "@types/micromatch": "^4.0.7", 89 "@types/micromatch": "^4.0.7",
90 "@types/ms": "^0.7.34", 90 "@types/ms": "^0.7.34",
91 "@types/node": "^20.12.12", 91 "@types/node": "^20.14.2",
92 "@types/pnpapi": "^0.0.5", 92 "@types/pnpapi": "^0.0.5",
93 "@types/react": "^18.3.3", 93 "@types/react": "^18.3.3",
94 "@types/react-dom": "^18.3.0", 94 "@types/react-dom": "^18.3.0",
@@ -98,7 +98,7 @@
98 "micromatch": "^4.0.7", 98 "micromatch": "^4.0.7",
99 "pnpapi": "^0.0.0", 99 "pnpapi": "^0.0.0",
100 "typescript": "5.4.5", 100 "typescript": "5.4.5",
101 "vite": "^5.2.11", 101 "vite": "^5.3.1",
102 "vite-plugin-pwa": "^0.20.0", 102 "vite-plugin-pwa": "^0.20.0",
103 "workbox-window": "^7.1.0" 103 "workbox-window": "^7.1.0"
104 } 104 }
diff --git a/subprojects/frontend/src/language/folding.ts b/subprojects/frontend/src/language/folding.ts
index b4d4ca22..0afabfa0 100644
--- a/subprojects/frontend/src/language/folding.ts
+++ b/subprojects/frontend/src/language/folding.ts
@@ -109,7 +109,7 @@ function foldWithSibling(node: SyntaxNode): FoldRange | null {
109 return null; 109 return null;
110} 110}
111 111
112function foldWholeNode(node: SyntaxNode): FoldRange { 112export function foldWholeNode(node: SyntaxNode): FoldRange {
113 return { 113 return {
114 from: node.from, 114 from: node.from,
115 to: node.to, 115 to: node.to,
diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar
index 7949f90c..a172835d 100644
--- a/subprojects/frontend/src/language/problem.grammar
+++ b/subprojects/frontend/src/language/problem.grammar
@@ -63,11 +63,11 @@ statement {
63 // kw<"fn"> RelationName RelationName ParameterList<Parameter>? 63 // kw<"fn"> RelationName RelationName ParameterList<Parameter>?
64 // FunctionBody { ("=" sep<OrOp, Case>)? "." } 64 // FunctionBody { ("=" sep<OrOp, Case>)? "." }
65 // } | 65 // } |
66 //RuleDefinition { 66 RuleDefinition {
67 // kw<"rule"> 67 (ckw<"decision"> | ckw<"propagation">)? kw<"rule">
68 // RuleName ParameterList<Parameter>? 68 RuleName ParameterList<Parameter>?
69 // RuleBody { ":" sep<OrOp, Conjunction> "==>" sep<OrOp, Consequent> "." } 69 RuleBody { ("<->" sep<OrOp, Conjunction>)? ("==>" sep<OrOp, Consequent>)? "." }
70 //} | 70 } |
71 AtomDeclaration { 71 AtomDeclaration {
72 kw<"declare">? ckw<"atom"> sep<",", AtomNodeName> "." 72 kw<"declare">? ckw<"atom"> sep<",", AtomNodeName> "."
73 } | 73 } |
@@ -96,7 +96,12 @@ FeatureDeclaration {
96 ";"? 96 ";"?
97} 97}
98 98
99Parameter { RelationName? VariableName } 99Parameter {
100 kw<"candidate">? (kw<"may"> | kw<"must">)?
101 RelationName?
102 (AndBinding | StarBinding)?
103 VariableName
104}
100 105
101// Use @dynamicPrecedence to prevent a(b) from being parsed as Expr { a } Expr { b } 106// Use @dynamicPrecedence to prevent a(b) from being parsed as Expr { a } Expr { b }
102// instead of Atom { a(b) } 107// instead of Atom { a(b) }
@@ -125,7 +130,12 @@ BinaryExpr {
125} 130}
126 131
127UnaryExpr { 132UnaryExpr {
128 !prefix ("+" | "-" | "!" | kw<"count">) Expr 133 !prefix
134 (
135 "+" | "-" | "!" | kw<"count"> |
136 kw<"candidate"> | kw<"may"> | kw<"must">
137 )
138 Expr
129} 139}
130 140
131CastExpr { !cast Expr kw<"as"> DatatypeName } 141CastExpr { !cast Expr kw<"as"> DatatypeName }
@@ -136,20 +146,22 @@ Aggregation {
136 146
137Atom { RelationName "+"? ParameterList<Expr> } 147Atom { RelationName "+"? ParameterList<Expr> }
138 148
139//Consequent { ("," | Action)+ } 149Consequent { ("," | Action)+ }
140 150
141//Action { 151Action {
142// ckw<"new"> VariableName ("<:" VariableName)? | 152 (NotOp | UnknownOp)? RelationName
143// kw<"delete"> VariableName | 153 ParameterList<AssertionActionArgument>
144// Literal 154 (":" Expr)?
145//} 155}
146 156
147AssertionArgument { NodeName | StarArgument } 157AssertionArgument { NodeName | StarArgument }
148 158
159AssertionActionArgument { VariableName | StarArgument }
160
149Constant { Real | String | StarMult | LogicValue } 161Constant { Real | String | StarMult | LogicValue }
150 162
151ReferenceKind { 163ReferenceKind {
152 kw<"refers"> | ckw<"contains"> | kw<"container"> 164 kw<"refers"> | ckw<"contains"> | kw<"container"> | kw<"partial">
153} 165}
154 166
155LogicValue { 167LogicValue {
@@ -170,7 +182,7 @@ RelationName { QualifiedName ~name }
170 182
171DatatypeName { QualifiedName } 183DatatypeName { QualifiedName }
172 184
173//RuleName { QualifiedName } 185RuleName { QualifiedName }
174 186
175AtomNodeName { QualifiedName } 187AtomNodeName { QualifiedName }
176 188
@@ -247,5 +259,9 @@ sep1<separator, content> { content (separator content)* }
247 259
248 StarArgument { "*" } 260 StarArgument { "*" }
249 261
262 StarBinding { "*" }
263
264 AndBinding { "&" }
265
250 "{" "}" "(" ")" "[" "]" "." ".." "," ":" "->" "<->" "+" "-" "**" "=" "+=" 266 "{" "}" "(" ")" "[" "]" "." ".." "," ":" "->" "<->" "+" "-" "**" "=" "+="
251} 267}
diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts
index dd5d6347..5ca162d9 100644
--- a/subprojects/frontend/src/language/problemLanguageSupport.ts
+++ b/subprojects/frontend/src/language/problemLanguageSupport.ts
@@ -14,7 +14,12 @@ import {
14} from '@codemirror/language'; 14} from '@codemirror/language';
15import { styleTags, tags as t } from '@lezer/highlight'; 15import { styleTags, tags as t } from '@lezer/highlight';
16 16
17import { foldBlockComment, foldConjunction, foldDeclaration } from './folding'; 17import {
18 foldBlockComment,
19 foldConjunction,
20 foldDeclaration,
21 foldWholeNode,
22} from './folding';
18import { 23import {
19 indentBlockComment, 24 indentBlockComment,
20 indentDeclaration, 25 indentDeclaration,
@@ -30,11 +35,13 @@ const parserWithMetadata = parser.configure({
30 'module problem class enum pred fn scope': t.definitionKeyword, 35 'module problem class enum pred fn scope': t.definitionKeyword,
31 'import as declare atom multi': t.definitionKeyword, 36 'import as declare atom multi': t.definitionKeyword,
32 'extern datatype aggregator': t.definitionKeyword, 37 'extern datatype aggregator': t.definitionKeyword,
33 'abstract extends refers contains container opposite': t.modifier, 38 rule: t.definitionKeyword,
39 'abstract extends refers contains container partial opposite': t.modifier,
34 default: t.modifier, 40 default: t.modifier,
41 'propagation decision': t.modifier,
35 'true false unknown error': t.keyword, 42 'true false unknown error': t.keyword,
43 'candidate may must': t.operatorKeyword,
36 'count in is': t.operatorKeyword, 44 'count in is': t.operatorKeyword,
37 // 'new delete': t.keyword,
38 NotOp: t.operator, 45 NotOp: t.operator,
39 UnknownOp: t.operator, 46 UnknownOp: t.operator,
40 OrOp: t.separator, 47 OrOp: t.separator,
@@ -45,7 +52,7 @@ const parserWithMetadata = parser.configure({
45 'RelationName/QualifiedName': t.typeName, 52 'RelationName/QualifiedName': t.typeName,
46 'DatatypeName/QualifiedName': t.keyword, 53 'DatatypeName/QualifiedName': t.keyword,
47 'AggregatorName/QualifiedName': t.operatorKeyword, 54 'AggregatorName/QualifiedName': t.operatorKeyword,
48 // 'RuleName/QualifiedName': t.typeName, 55 'RuleName/QualifiedName': t.typeName,
49 'AtomNodeName/QualifiedName': t.atom, 56 'AtomNodeName/QualifiedName': t.atom,
50 'VariableName/QualifiedName': t.variableName, 57 'VariableName/QualifiedName': t.variableName,
51 'ModuleName/QualifiedName': t.typeName, 58 'ModuleName/QualifiedName': t.typeName,
@@ -62,7 +69,7 @@ const parserWithMetadata = parser.configure({
62 ScopeDeclaration: indentDeclaration, 69 ScopeDeclaration: indentDeclaration,
63 PredicateBody: indentPredicateOrRule, 70 PredicateBody: indentPredicateOrRule,
64 // FunctionBody: indentPredicateOrRule, 71 // FunctionBody: indentPredicateOrRule,
65 // RuleBody: indentPredicateOrRule, 72 RuleBody: indentPredicateOrRule,
66 BlockComment: indentBlockComment, 73 BlockComment: indentBlockComment,
67 }), 74 }),
68 foldNodeProp.add({ 75 foldNodeProp.add({
@@ -71,9 +78,9 @@ const parserWithMetadata = parser.configure({
71 ParameterList: foldInside, 78 ParameterList: foldInside,
72 PredicateBody: foldInside, 79 PredicateBody: foldInside,
73 // FunctionBody: foldInside, 80 // FunctionBody: foldInside,
74 // RuleBody: foldInside, 81 RuleBody: foldInside,
75 Conjunction: foldConjunction, 82 Conjunction: foldConjunction,
76 // Consequent: foldWholeNode, 83 Consequent: foldWholeNode,
77 AtomDeclaration: foldDeclaration, 84 AtomDeclaration: foldDeclaration,
78 NodeDeclaration: foldDeclaration, 85 NodeDeclaration: foldDeclaration,
79 ScopeDeclaration: foldDeclaration, 86 ScopeDeclaration: foldDeclaration,
@@ -92,7 +99,7 @@ const problemLanguage = LRLanguage.define({
92 }, 99 },
93 line: '%', 100 line: '%',
94 }, 101 },
95 indentOnInput: /^\s*(?:\{|\}|\(|\)|->|;|\.)$/, 102 indentOnInput: /^\s*(?:\{|\}|\(|\)|->|==>|;|\.)$/,
96 }, 103 },
97}); 104});
98 105
diff --git a/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java b/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java
index b1c28df0..0fb97316 100644
--- a/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java
+++ b/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.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 */
@@ -17,9 +17,12 @@ import java.io.IOException;
17import java.util.ArrayList; 17import java.util.ArrayList;
18import java.util.List; 18import java.util.List;
19import java.util.Map; 19import java.util.Map;
20import java.util.regex.Pattern;
20 21
21@Parameters(commandDescription = "Generate a model from a partial model") 22@Parameters(commandDescription = "Generate a model from a partial model")
22public class GenerateCommand { 23public class GenerateCommand {
24 private static final Pattern EXTENSION_REGEX = Pattern.compile("(.+)\\.([^./\\\\]+)");
25
23 @Inject 26 @Inject
24 private ProblemLoader loader; 27 private ProblemLoader loader;
25 28
@@ -31,6 +34,7 @@ public class GenerateCommand {
31 private List<String> scopes = new ArrayList<>(); 34 private List<String> scopes = new ArrayList<>();
32 private List<String> overrideScopes = new ArrayList<>(); 35 private List<String> overrideScopes = new ArrayList<>();
33 private long randomSeed = 1; 36 private long randomSeed = 1;
37 private int count = 1;
34 38
35 @Parameter(description = "input path", required = true) 39 @Parameter(description = "input path", required = true)
36 public void setInputPath(String inputPath) { 40 public void setInputPath(String inputPath) {
@@ -57,21 +61,47 @@ public class GenerateCommand {
57 this.randomSeed = randomSeed; 61 this.randomSeed = randomSeed;
58 } 62 }
59 63
64 @Parameter(names = {"-solution-number", "-n"}, description = "Maximum number of solutions")
65 public void setCount(int count) {
66 if (count <= 0) {
67 throw new IllegalArgumentException("Count must be positive");
68 }
69 this.count = count;
70 }
71
60 public void run() throws IOException { 72 public void run() throws IOException {
73 if (count > 1 && isStandardStream(outputPath)) {
74 throw new IllegalArgumentException("Must provide output path if count is larger than 1");
75 }
61 loader.extraPath(System.getProperty("user.dir")); 76 loader.extraPath(System.getProperty("user.dir"));
62 var problem = isStandardStream(inputPath) ? loader.loadStream(System.in) : loader.loadFile(inputPath); 77 var problem = isStandardStream(inputPath) ? loader.loadStream(System.in) : loader.loadFile(inputPath);
63 problem = loader.loadScopeConstraints(problem, scopes, overrideScopes); 78 problem = loader.loadScopeConstraints(problem, scopes, overrideScopes);
79 generatorFactory.partialInterpretationBasedNeighbourhoods(count >= 2);
64 var generator = generatorFactory.createGenerator(problem); 80 var generator = generatorFactory.createGenerator(problem);
65 generator.setRandomSeed(randomSeed); 81 generator.setRandomSeed(randomSeed);
82 generator.setMaxNumberOfSolutions(count);
66 generator.generate(); 83 generator.generate();
67 var solution = generator.serializeSolution();
68 var solutionResource = solution.eResource();
69 var saveOptions = Map.of(); 84 var saveOptions = Map.of();
70 if (isStandardStream(outputPath)) { 85 if (count == 1) {
71 printSolution(solutionResource, saveOptions); 86 var solution = generator.serializeSolution();
87 var solutionResource = solution.eResource();
88 if (isStandardStream(outputPath)) {
89 printSolution(solutionResource, saveOptions);
90 } else {
91 try (var outputStream = new FileOutputStream(outputPath)) {
92 solutionResource.save(outputStream, saveOptions);
93 }
94 }
72 } else { 95 } else {
73 try (var outputStream = new FileOutputStream(outputPath)) { 96 int solutionCount = generator.getSolutionCount();
74 solutionResource.save(outputStream, saveOptions); 97 for (int i = 0; i < solutionCount; i++) {
98 generator.loadSolution(i);
99 var solution = generator.serializeSolution();
100 var solutionResource = solution.eResource();
101 var pathWithIndex = getFileNameWithIndex(outputPath, i + 1);
102 try (var outputStream = new FileOutputStream(pathWithIndex)) {
103 solutionResource.save(outputStream, saveOptions);
104 }
75 } 105 }
76 } 106 }
77 } 107 }
@@ -85,4 +115,12 @@ public class GenerateCommand {
85 private void printSolution(Resource solutionResource, Map<?, ?> saveOptions) throws IOException { 115 private void printSolution(Resource solutionResource, Map<?, ?> saveOptions) throws IOException {
86 solutionResource.save(System.out, saveOptions); 116 solutionResource.save(System.out, saveOptions);
87 } 117 }
118
119 private String getFileNameWithIndex(String simpleName, int index) {
120 var match = EXTENSION_REGEX.matcher(simpleName);
121 if (match.matches()) {
122 return "%s_%03d.%s".formatted(match.group(1), index, match.group(2));
123 }
124 return "%s_%03d".formatted(simpleName, index);
125 }
88} 126}
diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java
index 36190b76..8dff5622 100644
--- a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java
+++ b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.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 */
@@ -11,6 +11,7 @@ import tools.refinery.language.semantics.ProblemTrace;
11import tools.refinery.language.semantics.SolutionSerializer; 11import tools.refinery.language.semantics.SolutionSerializer;
12import tools.refinery.logic.AbstractValue; 12import tools.refinery.logic.AbstractValue;
13import tools.refinery.store.dse.strategy.BestFirstStoreManager; 13import tools.refinery.store.dse.strategy.BestFirstStoreManager;
14import tools.refinery.store.dse.transition.statespace.SolutionStore;
14import tools.refinery.store.map.Version; 15import tools.refinery.store.map.Version;
15import tools.refinery.store.model.ModelStore; 16import tools.refinery.store.model.ModelStore;
16import tools.refinery.store.reasoning.interpretation.PartialInterpretation; 17import tools.refinery.store.reasoning.interpretation.PartialInterpretation;
@@ -22,7 +23,8 @@ public class ModelGenerator extends ModelFacade {
22 private final Version initialVersion; 23 private final Version initialVersion;
23 private final Provider<SolutionSerializer> solutionSerializerProvider; 24 private final Provider<SolutionSerializer> solutionSerializerProvider;
24 private long randomSeed = 1; 25 private long randomSeed = 1;
25 private boolean lastGenerationSuccessful; 26 private int maxNumberOfSolutions = 1;
27 private SolutionStore solutionStore;
26 28
27 ModelGenerator(ProblemTrace problemTrace, ModelStore store, ModelSeed modelSeed, 29 ModelGenerator(ProblemTrace problemTrace, ModelStore store, ModelSeed modelSeed,
28 Provider<SolutionSerializer> solutionSerializerProvider) { 30 Provider<SolutionSerializer> solutionSerializerProvider) {
@@ -37,26 +39,51 @@ public class ModelGenerator extends ModelFacade {
37 39
38 public void setRandomSeed(long randomSeed) { 40 public void setRandomSeed(long randomSeed) {
39 this.randomSeed = randomSeed; 41 this.randomSeed = randomSeed;
40 this.lastGenerationSuccessful = false; 42 this.solutionStore = null;
41 } 43 }
42 44
45 public int getMaxNumberOfSolutions() {
46 return maxNumberOfSolutions;
47 }
48
49 public void setMaxNumberOfSolutions(int maxNumberOfSolutions) {
50 this.maxNumberOfSolutions = maxNumberOfSolutions;
51 this.solutionStore = null;
52 }
53
54 public int getSolutionCount() {
55 if (!isLastGenerationSuccessful()) {
56 return 0;
57 }
58 return this.solutionStore.getSolutions().size();
59 }
60
61 public void loadSolution(int index) {
62 if (index >= getSolutionCount()) {
63 throw new IndexOutOfBoundsException("No such solution");
64 }
65 getModel().restore(solutionStore.getSolutions().get(index).version());
66 }
67
68 // It makes more sense to check for success than for failure.
69 @SuppressWarnings("BooleanMethodIsAlwaysInverted")
43 public boolean isLastGenerationSuccessful() { 70 public boolean isLastGenerationSuccessful() {
44 return lastGenerationSuccessful; 71 return solutionStore != null;
45 } 72 }
46 73
47 // This method only makes sense if it returns {@code true} on success. 74 // This method only makes sense if it returns {@code true} on success.
48 @SuppressWarnings("BooleanMethodIsAlwaysInverted") 75 @SuppressWarnings("BooleanMethodIsAlwaysInverted")
49 public boolean tryGenerate() { 76 public boolean tryGenerate() {
50 lastGenerationSuccessful = false; 77 solutionStore = null;
51 randomSeed++; 78 randomSeed++;
52 var bestFirst = new BestFirstStoreManager(getModelStore(), 1); 79 var bestFirst = new BestFirstStoreManager(getModelStore(), maxNumberOfSolutions);
53 bestFirst.startExploration(initialVersion, randomSeed); 80 bestFirst.startExploration(initialVersion, randomSeed);
54 var solutions = bestFirst.getSolutionStore().getSolutions(); 81 var solutions = bestFirst.getSolutionStore().getSolutions();
55 if (solutions.isEmpty()) { 82 if (solutions.isEmpty()) {
56 return false; 83 return false;
57 } 84 }
58 getModel().restore(solutions.getFirst().version()); 85 getModel().restore(solutions.getFirst().version());
59 lastGenerationSuccessful = true; 86 solutionStore = bestFirst.getSolutionStore();
60 return true; 87 return true;
61 } 88 }
62 89
@@ -80,7 +107,7 @@ public class ModelGenerator extends ModelFacade {
80 } 107 }
81 108
82 private void checkSuccessfulGeneration() { 109 private void checkSuccessfulGeneration() {
83 if (!lastGenerationSuccessful) { 110 if (!isLastGenerationSuccessful()) {
84 throw new IllegalStateException("No generated model is available"); 111 throw new IllegalStateException("No generated model is available");
85 } 112 }
86 } 113 }
diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGeneratorFactory.java b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGeneratorFactory.java
index 587601f2..ec273cf4 100644
--- a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGeneratorFactory.java
+++ b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGeneratorFactory.java
@@ -15,8 +15,11 @@ import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
15import tools.refinery.store.model.ModelStore; 15import tools.refinery.store.model.ModelStore;
16import tools.refinery.store.query.interpreter.QueryInterpreterAdapter; 16import tools.refinery.store.query.interpreter.QueryInterpreterAdapter;
17import tools.refinery.store.reasoning.ReasoningAdapter; 17import tools.refinery.store.reasoning.ReasoningAdapter;
18import tools.refinery.store.reasoning.interpretation.PartialNeighbourhoodCalculator;
18import tools.refinery.store.reasoning.literal.Concreteness; 19import tools.refinery.store.reasoning.literal.Concreteness;
20import tools.refinery.store.statecoding.StateCodeCalculatorFactory;
19import tools.refinery.store.statecoding.StateCoderAdapter; 21import tools.refinery.store.statecoding.StateCoderAdapter;
22import tools.refinery.store.statecoding.neighbourhood.NeighbourhoodCalculator;
20import tools.refinery.store.util.CancellationToken; 23import tools.refinery.store.util.CancellationToken;
21 24
22import java.util.Collection; 25import java.util.Collection;
@@ -33,6 +36,8 @@ public final class ModelGeneratorFactory {
33 36
34 private boolean debugPartialInterpretations; 37 private boolean debugPartialInterpretations;
35 38
39 private boolean partialInterpretationBasedNeighbourhoods;
40
36 public ModelGeneratorFactory cancellationToken(CancellationToken cancellationToken) { 41 public ModelGeneratorFactory cancellationToken(CancellationToken cancellationToken) {
37 this.cancellationToken = cancellationToken; 42 this.cancellationToken = cancellationToken;
38 return this; 43 return this;
@@ -43,6 +48,10 @@ public final class ModelGeneratorFactory {
43 return this; 48 return this;
44 } 49 }
45 50
51 public void partialInterpretationBasedNeighbourhoods(boolean partialInterpretationBasedNeighbourhoods) {
52 this.partialInterpretationBasedNeighbourhoods = partialInterpretationBasedNeighbourhoods;
53 }
54
46 public ModelGenerator createGenerator(Problem problem) { 55 public ModelGenerator createGenerator(Problem problem) {
47 var initializer = initializerProvider.get(); 56 var initializer = initializerProvider.get();
48 initializer.readProblem(problem); 57 initializer.readProblem(problem);
@@ -51,7 +60,8 @@ public final class ModelGeneratorFactory {
51 .cancellationToken(cancellationToken) 60 .cancellationToken(cancellationToken)
52 .with(QueryInterpreterAdapter.builder()) 61 .with(QueryInterpreterAdapter.builder())
53 .with(PropagationAdapter.builder()) 62 .with(PropagationAdapter.builder())
54 .with(StateCoderAdapter.builder()) 63 .with(StateCoderAdapter.builder()
64 .stateCodeCalculatorFactory(getStateCoderCalculatorFactory()))
55 .with(DesignSpaceExplorationAdapter.builder()) 65 .with(DesignSpaceExplorationAdapter.builder())
56 .with(ReasoningAdapter.builder() 66 .with(ReasoningAdapter.builder()
57 .requiredInterpretations(getRequiredInterpretations())); 67 .requiredInterpretations(getRequiredInterpretations()));
@@ -62,7 +72,13 @@ public final class ModelGeneratorFactory {
62 } 72 }
63 73
64 private Collection<Concreteness> getRequiredInterpretations() { 74 private Collection<Concreteness> getRequiredInterpretations() {
65 return debugPartialInterpretations ? Set.of(Concreteness.PARTIAL, Concreteness.CANDIDATE) : 75 return debugPartialInterpretations || partialInterpretationBasedNeighbourhoods ?
76 Set.of(Concreteness.PARTIAL, Concreteness.CANDIDATE) :
66 Set.of(Concreteness.CANDIDATE); 77 Set.of(Concreteness.CANDIDATE);
67 } 78 }
79
80 private StateCodeCalculatorFactory getStateCoderCalculatorFactory() {
81 return partialInterpretationBasedNeighbourhoods ? PartialNeighbourhoodCalculator.FACTORY :
82 NeighbourhoodCalculator::new;
83 }
68} 84}
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 06f0e758..58d6748a 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
@@ -125,7 +125,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
125 classesBuilder.add(ERROR_CLASS); 125 classesBuilder.add(ERROR_CLASS);
126 } 126 }
127 if (eObject instanceof Node node) { 127 if (eObject instanceof Node node) {
128 highlightNode(node, reference, classesBuilder); 128 highlightNode(node, classesBuilder);
129 } 129 }
130 if (eObject instanceof Relation relation) { 130 if (eObject instanceof Relation relation) {
131 var typeHash = typeHashProvider.getTypeHash(relation); 131 var typeHash = typeHashProvider.getTypeHash(relation);
@@ -137,10 +137,8 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
137 return classes.toArray(new String[0]); 137 return classes.toArray(new String[0]);
138 } 138 }
139 139
140 private static void highlightNode(Node node, EReference reference, ImmutableList.Builder<String> classesBuilder) { 140 private static void highlightNode(Node node, ImmutableList.Builder<String> classesBuilder) {
141 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) { 141 classesBuilder.add(NODE_CLASS);
142 classesBuilder.add(NODE_CLASS);
143 }
144 if (ProblemUtil.isAtomNode(node)) { 142 if (ProblemUtil.isAtomNode(node)) {
145 classesBuilder.add(ATOM_NODE_CLASS); 143 classesBuilder.add(ATOM_NODE_CLASS);
146 } 144 }
diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird
index f8a50a76..74c658d4 100644
--- a/subprojects/language-model/problem.aird
+++ b/subprojects/language-model/problem.aird
@@ -7,19 +7,19 @@
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="1709659837733"> 10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="1717085395802">
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="1709659698980"> 14 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_z1bOYF3lEe2LuOZzJ_LhLg" name="expressions" repPath="#_z1YyIF3lEe2LuOZzJ_LhLg" changeId="1715884068732">
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>
18 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_xj9yMF4eEe2rXNsIDUvqhw" name="assertions" repPath="#_xj6H0F4eEe2rXNsIDUvqhw" changeId="1706657349781"> 18 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_xj9yMF4eEe2rXNsIDUvqhw" name="assertions" repPath="#_xj6H0F4eEe2rXNsIDUvqhw" changeId="1715963376752">
19 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 19 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
20 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 20 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
21 </ownedRepresentationDescriptors> 21 </ownedRepresentationDescriptors>
22 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_sCFokF4fEe2rXNsIDUvqhw" name="actions" repPath="#_sCFBgF4fEe2rXNsIDUvqhw" changeId="1706657349781"> 22 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_sCFokF4fEe2rXNsIDUvqhw" name="actions" repPath="#_sCFBgF4fEe2rXNsIDUvqhw" changeId="1715963438471">
23 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 23 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
24 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 24 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
25 </ownedRepresentationDescriptors> 25 </ownedRepresentationDescriptors>
@@ -100,11 +100,23 @@
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"/>
102 <children xmi:type="notation:Node" xmi:id="_QKLK1KA6EeuqkpDnuik1sg" type="7004"> 102 <children xmi:type="notation:Node" xmi:id="_QKLK1KA6EeuqkpDnuik1sg" type="7004">
103 <children xmi:type="notation:Node" xmi:id="_JR-dPBOyEe-4k7CzzL6IsA" type="3010" element="_JRfVABOyEe-4k7CzzL6IsA">
104 <styles xmi:type="notation:FontStyle" xmi:id="_JR-dPROyEe-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
105 <layoutConstraint xmi:type="notation:Location" xmi:id="_JR-dPhOyEe-4k7CzzL6IsA"/>
106 </children>
107 <children xmi:type="notation:Node" xmi:id="_LJy6eROyEe-4k7CzzL6IsA" type="3010" element="_LJG98BOyEe-4k7CzzL6IsA">
108 <styles xmi:type="notation:FontStyle" xmi:id="_LJy6ehOyEe-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
109 <layoutConstraint xmi:type="notation:Location" xmi:id="_LJy6exOyEe-4k7CzzL6IsA"/>
110 </children>
111 <children xmi:type="notation:Node" xmi:id="_he4bMBO0Ee-4k7CzzL6IsA" type="3010" element="_heTzcBO0Ee-4k7CzzL6IsA">
112 <styles xmi:type="notation:FontStyle" xmi:id="_he4bMRO0Ee-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
113 <layoutConstraint xmi:type="notation:Location" xmi:id="_he4bMhO0Ee-4k7CzzL6IsA"/>
114 </children>
103 <styles xmi:type="notation:SortingStyle" xmi:id="_QKLK1aA6EeuqkpDnuik1sg"/> 115 <styles xmi:type="notation:SortingStyle" xmi:id="_QKLK1aA6EeuqkpDnuik1sg"/>
104 <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/> 116 <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/>
105 </children> 117 </children>
106 <styles xmi:type="notation:ShapeStyle" xmi:id="_QKLK0aA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 118 <styles xmi:type="notation:ShapeStyle" xmi:id="_QKLK0aA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
107 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QKLK0qA6EeuqkpDnuik1sg" x="1687" y="530" width="120" height="100"/> 119 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QKLK0qA6EeuqkpDnuik1sg" x="1656" y="516" width="174" height="114"/>
108 </children> 120 </children>
109 <children xmi:type="notation:Node" xmi:id="_jP6FkKA6EeuqkpDnuik1sg" type="2003" element="_jPpm4KA6EeuqkpDnuik1sg"> 121 <children xmi:type="notation:Node" xmi:id="_jP6FkKA6EeuqkpDnuik1sg" type="2003" element="_jPpm4KA6EeuqkpDnuik1sg">
110 <children xmi:type="notation:Node" xmi:id="_jP6soKA6EeuqkpDnuik1sg" type="5007"/> 122 <children xmi:type="notation:Node" xmi:id="_jP6soKA6EeuqkpDnuik1sg" type="5007"/>
@@ -246,6 +258,10 @@
246 <children xmi:type="notation:Node" xmi:id="_N0FQ4CrZEeyyC-O0_LlY9w" type="2003" element="_NzpMACrZEeyyC-O0_LlY9w"> 258 <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"/> 259 <children xmi:type="notation:Node" xmi:id="_N0F38CrZEeyyC-O0_LlY9w" type="5007"/>
248 <children xmi:type="notation:Node" xmi:id="_N0F38SrZEeyyC-O0_LlY9w" type="7004"> 260 <children xmi:type="notation:Node" xmi:id="_N0F38SrZEeyyC-O0_LlY9w" type="7004">
261 <children xmi:type="notation:Node" xmi:id="_-wphkBOzEe-4k7CzzL6IsA" type="3010" element="_-wOq0BOzEe-4k7CzzL6IsA">
262 <styles xmi:type="notation:FontStyle" xmi:id="_-wphkROzEe-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
263 <layoutConstraint xmi:type="notation:Location" xmi:id="_-wphkhOzEe-4k7CzzL6IsA"/>
264 </children>
249 <styles xmi:type="notation:SortingStyle" xmi:id="_N0F38irZEeyyC-O0_LlY9w"/> 265 <styles xmi:type="notation:SortingStyle" xmi:id="_N0F38irZEeyyC-O0_LlY9w"/>
250 <styles xmi:type="notation:FilteringStyle" xmi:id="_N0F38yrZEeyyC-O0_LlY9w"/> 266 <styles xmi:type="notation:FilteringStyle" xmi:id="_N0F38yrZEeyyC-O0_LlY9w"/>
251 </children> 267 </children>
@@ -289,11 +305,15 @@
289 <styles xmi:type="notation:FontStyle" xmi:id="_9ZwJoc9jEe6T2u19X9cqmQ" fontName="Noto Sans" fontHeight="8"/> 305 <styles xmi:type="notation:FontStyle" xmi:id="_9ZwJoc9jEe6T2u19X9cqmQ" fontName="Noto Sans" fontHeight="8"/>
290 <layoutConstraint xmi:type="notation:Location" xmi:id="_9ZwJos9jEe6T2u19X9cqmQ"/> 306 <layoutConstraint xmi:type="notation:Location" xmi:id="_9ZwJos9jEe6T2u19X9cqmQ"/>
291 </children> 307 </children>
308 <children xmi:type="notation:Node" xmi:id="_Cl4ksB6fEe-D29eT4GV5Hg" type="3010" element="_Ck5GMB6fEe-D29eT4GV5Hg">
309 <styles xmi:type="notation:FontStyle" xmi:id="_Cl4ksR6fEe-D29eT4GV5Hg" fontName="Noto Sans" fontHeight="8"/>
310 <layoutConstraint xmi:type="notation:Location" xmi:id="_Cl4ksh6fEe-D29eT4GV5Hg"/>
311 </children>
292 <styles xmi:type="notation:SortingStyle" xmi:id="_xp2JgjNlEe2fD4dIhR_vzA"/> 312 <styles xmi:type="notation:SortingStyle" xmi:id="_xp2JgjNlEe2fD4dIhR_vzA"/>
293 <styles xmi:type="notation:FilteringStyle" xmi:id="_xp2JgzNlEe2fD4dIhR_vzA"/> 313 <styles xmi:type="notation:FilteringStyle" xmi:id="_xp2JgzNlEe2fD4dIhR_vzA"/>
294 </children> 314 </children>
295 <styles xmi:type="notation:ShapeStyle" xmi:id="_xp1icTNlEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> 315 <styles xmi:type="notation:ShapeStyle" xmi:id="_xp1icTNlEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/>
296 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xp1icjNlEe2fD4dIhR_vzA" x="574" y="1280" width="120" height="100"/> 316 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xp1icjNlEe2fD4dIhR_vzA" x="574" y="1280" width="120" height="115"/>
297 </children> 317 </children>
298 <children xmi:type="notation:Node" xmi:id="_782skF9mEe2rXNsIDUvqhw" type="2003" element="_78pRMF9mEe2rXNsIDUvqhw"> 318 <children xmi:type="notation:Node" xmi:id="_782skF9mEe2rXNsIDUvqhw" type="2003" element="_78pRMF9mEe2rXNsIDUvqhw">
299 <children xmi:type="notation:Node" xmi:id="_783ToF9mEe2rXNsIDUvqhw" type="5007"/> 319 <children xmi:type="notation:Node" xmi:id="_783ToF9mEe2rXNsIDUvqhw" type="5007"/>
@@ -436,6 +456,48 @@
436 <styles xmi:type="notation:ShapeStyle" xmi:id="_jlSckdsVEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/> 456 <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"/> 457 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jlScktsVEe6c9ehqpe3s7A" x="1128" y="716" width="147" height="100"/>
438 </children> 458 </children>
459 <children xmi:type="notation:Node" xmi:id="_3c-frBOzEe-4k7CzzL6IsA" type="2003" element="_3cdiQBOzEe-4k7CzzL6IsA">
460 <children xmi:type="notation:Node" xmi:id="_3c-frxOzEe-4k7CzzL6IsA" type="5007"/>
461 <children xmi:type="notation:Node" xmi:id="_3c-fsBOzEe-4k7CzzL6IsA" type="7004">
462 <children xmi:type="notation:Node" xmi:id="_5DOEsBOzEe-4k7CzzL6IsA" type="3010" element="_5Cz1ABOzEe-4k7CzzL6IsA">
463 <styles xmi:type="notation:FontStyle" xmi:id="_5DOEsROzEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
464 <layoutConstraint xmi:type="notation:Location" xmi:id="_5DOEshOzEe-4k7CzzL6IsA"/>
465 </children>
466 <children xmi:type="notation:Node" xmi:id="_7IGGgBOzEe-4k7CzzL6IsA" type="3010" element="_7Hb_MBOzEe-4k7CzzL6IsA">
467 <styles xmi:type="notation:FontStyle" xmi:id="_7IGGgROzEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
468 <layoutConstraint xmi:type="notation:Location" xmi:id="_7IGGghOzEe-4k7CzzL6IsA"/>
469 </children>
470 <children xmi:type="notation:Node" xmi:id="_8KIyUBOzEe-4k7CzzL6IsA" type="3010" element="_8JiVYBOzEe-4k7CzzL6IsA">
471 <styles xmi:type="notation:FontStyle" xmi:id="_8KIyUROzEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
472 <layoutConstraint xmi:type="notation:Location" xmi:id="_8KIyUhOzEe-4k7CzzL6IsA"/>
473 </children>
474 <styles xmi:type="notation:SortingStyle" xmi:id="_3c-fsROzEe-4k7CzzL6IsA"/>
475 <styles xmi:type="notation:FilteringStyle" xmi:id="_3c-fshOzEe-4k7CzzL6IsA"/>
476 </children>
477 <styles xmi:type="notation:ShapeStyle" xmi:id="_3c-frROzEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
478 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3c-frhOzEe-4k7CzzL6IsA" x="2298" y="1280" width="120" height="100"/>
479 </children>
480 <children xmi:type="notation:Node" xmi:id="_Z2K9bBO0Ee-4k7CzzL6IsA" type="2003" element="_Z12NQBO0Ee-4k7CzzL6IsA">
481 <children xmi:type="notation:Node" xmi:id="_Z2K9bxO0Ee-4k7CzzL6IsA" type="5007"/>
482 <children xmi:type="notation:Node" xmi:id="_Z2K9cBO0Ee-4k7CzzL6IsA" type="7004">
483 <children xmi:type="notation:Node" xmi:id="_eBUvNhO0Ee-4k7CzzL6IsA" type="3010" element="_eBCbUBO0Ee-4k7CzzL6IsA">
484 <styles xmi:type="notation:FontStyle" xmi:id="_eBUvNxO0Ee-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
485 <layoutConstraint xmi:type="notation:Location" xmi:id="_eBUvOBO0Ee-4k7CzzL6IsA"/>
486 </children>
487 <children xmi:type="notation:Node" xmi:id="_eoD_HBO0Ee-4k7CzzL6IsA" type="3010" element="_enuA0BO0Ee-4k7CzzL6IsA">
488 <styles xmi:type="notation:FontStyle" xmi:id="_eoD_HRO0Ee-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
489 <layoutConstraint xmi:type="notation:Location" xmi:id="_eoD_HhO0Ee-4k7CzzL6IsA"/>
490 </children>
491 <children xmi:type="notation:Node" xmi:id="_fGm8QBO0Ee-4k7CzzL6IsA" type="3010" element="_fGJCMBO0Ee-4k7CzzL6IsA">
492 <styles xmi:type="notation:FontStyle" xmi:id="_fGm8QRO0Ee-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
493 <layoutConstraint xmi:type="notation:Location" xmi:id="_fGm8QhO0Ee-4k7CzzL6IsA"/>
494 </children>
495 <styles xmi:type="notation:SortingStyle" xmi:id="_Z2K9cRO0Ee-4k7CzzL6IsA"/>
496 <styles xmi:type="notation:FilteringStyle" xmi:id="_Z2K9chO0Ee-4k7CzzL6IsA"/>
497 </children>
498 <styles xmi:type="notation:ShapeStyle" xmi:id="_Z2K9bRO0Ee-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
499 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Z2K9bhO0Ee-4k7CzzL6IsA" x="2039" y="332" width="120" height="100"/>
500 </children>
439 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/> 501 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/>
440 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg"> 502 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg">
441 <children xmi:type="notation:Node" xmi:id="_4ea_06A8EeuqkpDnuik1sg" type="6001"> 503 <children xmi:type="notation:Node" xmi:id="_4ea_06A8EeuqkpDnuik1sg" type="6001">
@@ -610,7 +672,7 @@
610 <styles xmi:type="notation:ConnectorStyle" xmi:id="_onzXUaA6EeuqkpDnuik1sg" routing="Tree"/> 672 <styles xmi:type="notation:ConnectorStyle" xmi:id="_onzXUaA6EeuqkpDnuik1sg" routing="Tree"/>
611 <styles xmi:type="notation:FontStyle" xmi:id="_onzXUqA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 673 <styles xmi:type="notation:FontStyle" xmi:id="_onzXUqA6EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
612 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_onzXU6A6EeuqkpDnuik1sg" points="[0, 0, 61, 191]$[0, -72, 61, 119]$[-60, -72, 1, 119]$[-60, -142, 1, 49]"/> 674 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_onzXU6A6EeuqkpDnuik1sg" points="[0, 0, 61, 191]$[0, -72, 61, 119]$[-60, -72, 1, 119]$[-60, -142, 1, 49]"/>
613 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_on1MgKA6EeuqkpDnuik1sg" id="(0.2033898305084746,0.0)"/> 675 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_on1MgKA6EeuqkpDnuik1sg" id="(0.31976744186046513,0.125)"/>
614 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_on1MgaA6EeuqkpDnuik1sg" id="(0.5,0.5)"/> 676 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_on1MgaA6EeuqkpDnuik1sg" id="(0.5,0.5)"/>
615 </edges> 677 </edges>
616 <edges xmi:type="notation:Edge" xmi:id="_vndkcCrcEeyyC-O0_LlY9w" type="4001" element="_Uy4bWaA6EeuqkpDnuik1sg" source="_A9YrQCrZEeyyC-O0_LlY9w" target="_QKLK0KA6EeuqkpDnuik1sg"> 678 <edges xmi:type="notation:Edge" xmi:id="_vndkcCrcEeyyC-O0_LlY9w" type="4001" element="_Uy4bWaA6EeuqkpDnuik1sg" source="_A9YrQCrZEeyyC-O0_LlY9w" target="_QKLK0KA6EeuqkpDnuik1sg">
@@ -627,7 +689,7 @@
627 <styles xmi:type="notation:FontStyle" xmi:id="_vndkcircEeyyC-O0_LlY9w" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/> 689 <styles xmi:type="notation:FontStyle" xmi:id="_vndkcircEeyyC-O0_LlY9w" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/>
628 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vndkcyrcEeyyC-O0_LlY9w" points="[-38, -41, 287, 48]$[-258, -41, 67, 48]"/> 690 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vndkcyrcEeyyC-O0_LlY9w" points="[-38, -41, 287, 48]$[-258, -41, 67, 48]"/>
629 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vndkeircEeyyC-O0_LlY9w" id="(0.2602739726027397,0.9081632653061225)"/> 691 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vndkeircEeyyC-O0_LlY9w" id="(0.2602739726027397,0.9081632653061225)"/>
630 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vneLgCrcEeyyC-O0_LlY9w" id="(0.4322033898305085,0.0)"/> 692 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vneLgCrcEeyyC-O0_LlY9w" id="(0.47674418604651164,0.125)"/>
631 </edges> 693 </edges>
632 <edges xmi:type="notation:Edge" xmi:id="_TuLToNbNEeuymriYTNxK2g" type="4001" element="_Tt9RRtbNEeuymriYTNxK2g" source="_jP6FkKA6EeuqkpDnuik1sg" target="_Kw-vINbNEeuymriYTNxK2g"> 694 <edges xmi:type="notation:Edge" xmi:id="_TuLToNbNEeuymriYTNxK2g" type="4001" element="_Tt9RRtbNEeuymriYTNxK2g" source="_jP6FkKA6EeuqkpDnuik1sg" target="_Kw-vINbNEeuymriYTNxK2g">
633 <children xmi:type="notation:Node" xmi:id="_TuLTpNbNEeuymriYTNxK2g" type="6001"> 695 <children xmi:type="notation:Node" xmi:id="_TuLTpNbNEeuymriYTNxK2g" type="6001">
@@ -1202,7 +1264,7 @@
1202 <styles xmi:type="notation:ConnectorStyle" xmi:id="_iXIY4WTzEe2qdtyPWAtoxA" routing="Rectilinear"/> 1264 <styles xmi:type="notation:ConnectorStyle" xmi:id="_iXIY4WTzEe2qdtyPWAtoxA" routing="Rectilinear"/>
1203 <styles xmi:type="notation:FontStyle" xmi:id="_iXIY4mTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 1265 <styles xmi:type="notation:FontStyle" xmi:id="_iXIY4mTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
1204 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_iXIY42TzEe2qdtyPWAtoxA" points="[-72, 48, 1131, 5]$[-1144, 48, 59, 5]"/> 1266 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_iXIY42TzEe2qdtyPWAtoxA" points="[-72, 48, 1131, 5]$[-1144, 48, 59, 5]"/>
1205 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iXIY6mTzEe2qdtyPWAtoxA" id="(0.6101694915254238,0.0)"/> 1267 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_iXIY6mTzEe2qdtyPWAtoxA" id="(0.5988372093023255,0.125)"/>
1206 </edges> 1268 </edges>
1207 <edges xmi:type="notation:Edge" xmi:id="_q7DhwGTzEe2qdtyPWAtoxA" type="4001" element="_q604amTzEe2qdtyPWAtoxA" source="_zaq8oKA9EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> 1269 <edges xmi:type="notation:Edge" xmi:id="_q7DhwGTzEe2qdtyPWAtoxA" type="4001" element="_q604amTzEe2qdtyPWAtoxA" source="_zaq8oKA9EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA">
1208 <children xmi:type="notation:Node" xmi:id="_q7EI0GTzEe2qdtyPWAtoxA" type="6001"> 1270 <children xmi:type="notation:Node" xmi:id="_q7EI0GTzEe2qdtyPWAtoxA" type="6001">
@@ -1532,10 +1594,34 @@
1532 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1594 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
1533 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 1595 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
1534 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 1596 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
1535 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_Cr-9nBjHEe2_erjsEmF9GQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 1597 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_iG6EixO0Ee-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
1536 <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"/> 1598 <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"/>
1537 </ownedStyle> 1599 </ownedStyle>
1538 <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']"/> 1600 <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']"/>
1601 <ownedElements xmi:type="diagram:DNodeListElement" uid="_JRfVABOyEe-4k7CzzL6IsA" name="concreteness : Concreteness = PARTIAL" tooltipText="">
1602 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/concreteness"/>
1603 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/concreteness"/>
1604 <ownedStyle xmi:type="diagram:BundledImage" uid="_KAVYBROyEe-4k7CzzL6IsA" labelAlignment="LEFT">
1605 <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"/>
1606 </ownedStyle>
1607 <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']"/>
1608 </ownedElements>
1609 <ownedElements xmi:type="diagram:DNodeListElement" uid="_LJG98BOyEe-4k7CzzL6IsA" name="modality : Modality = NONE" tooltipText="">
1610 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/modality"/>
1611 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/modality"/>
1612 <ownedStyle xmi:type="diagram:BundledImage" uid="_LwmbwxOyEe-4k7CzzL6IsA" labelAlignment="LEFT">
1613 <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"/>
1614 </ownedStyle>
1615 <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']"/>
1616 </ownedElements>
1617 <ownedElements xmi:type="diagram:DNodeListElement" uid="_heTzcBO0Ee-4k7CzzL6IsA" name="binding : ParameterBinding = SINGLE" tooltipText="">
1618 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/binding"/>
1619 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/binding"/>
1620 <ownedStyle xmi:type="diagram:BundledImage" uid="_iG75tRO0Ee-4k7CzzL6IsA" labelAlignment="LEFT">
1621 <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"/>
1622 </ownedStyle>
1623 <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']"/>
1624 </ownedElements>
1539 </ownedDiagramElements> 1625 </ownedDiagramElements>
1540 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_Uy4bWaA6EeuqkpDnuik1sg" name="[0..*] parameters" sourceNode="_A8hIkCrZEeyyC-O0_LlY9w" targetNode="_QKD2EKA6EeuqkpDnuik1sg"> 1626 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_Uy4bWaA6EeuqkpDnuik1sg" name="[0..*] parameters" sourceNode="_A8hIkCrZEeyyC-O0_LlY9w" targetNode="_QKD2EKA6EeuqkpDnuik1sg">
1541 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ParametricDefinition/parameters"/> 1627 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ParametricDefinition/parameters"/>
@@ -1565,12 +1651,12 @@
1565 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_oni4rKA6EeuqkpDnuik1sg" sourceNode="_QKD2EKA6EeuqkpDnuik1sg" targetNode="_jPpm4KA6EeuqkpDnuik1sg"> 1651 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_oni4rKA6EeuqkpDnuik1sg" sourceNode="_QKD2EKA6EeuqkpDnuik1sg" targetNode="_jPpm4KA6EeuqkpDnuik1sg">
1566 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Parameter"/> 1652 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Parameter"/>
1567 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Parameter"/> 1653 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Parameter"/>
1568 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_CsIunBjHEe2_erjsEmF9GQ" targetArrow="InputClosedArrow" routingStyle="tree"> 1654 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_iHDOfBO0Ee-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
1569 <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"/> 1655 <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"/>
1570 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_CsIunRjHEe2_erjsEmF9GQ" showIcon="false"> 1656 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_iHDOfRO0Ee-4k7CzzL6IsA" showIcon="false">
1571 <labelFormat>italic</labelFormat> 1657 <labelFormat>italic</labelFormat>
1572 </beginLabelStyle> 1658 </beginLabelStyle>
1573 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_CsIunhjHEe2_erjsEmF9GQ" showIcon="false"/> 1659 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_iHDOfhO0Ee-4k7CzzL6IsA" showIcon="false"/>
1574 </ownedStyle> 1660 </ownedStyle>
1575 <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']"/> 1661 <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']"/>
1576 </ownedDiagramElements> 1662 </ownedDiagramElements>
@@ -2004,10 +2090,18 @@
2004 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 2090 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2005 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 2091 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2006 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 2092 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2007 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_OVFKZhEJEe2AArBmfNpEZA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 2093 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="__y9TRxOzEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
2008 <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"/> 2094 <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"/>
2009 </ownedStyle> 2095 </ownedStyle>
2010 <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']"/> 2096 <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']"/>
2097 <ownedElements xmi:type="diagram:DNodeListElement" uid="_-wOq0BOzEe-4k7CzzL6IsA" name="kind : RuleKind = REFINEMENT" tooltipText="">
2098 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//RuleDefinition/kind"/>
2099 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//RuleDefinition/kind"/>
2100 <ownedStyle xmi:type="diagram:BundledImage" uid="__y-hRhOzEe-4k7CzzL6IsA" labelAlignment="LEFT">
2101 <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"/>
2102 </ownedStyle>
2103 <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']"/>
2104 </ownedElements>
2011 </ownedDiagramElements> 2105 </ownedDiagramElements>
2012 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ddmjcCrZEeyyC-O0_LlY9w" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_A8hIkCrZEeyyC-O0_LlY9w"> 2106 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ddmjcCrZEeyyC-O0_LlY9w" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_A8hIkCrZEeyyC-O0_LlY9w">
2013 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> 2107 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/>
@@ -2024,12 +2118,12 @@
2024 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_eGZo7irZEeyyC-O0_LlY9w" sourceNode="_NzpMACrZEeyyC-O0_LlY9w" targetNode="_A8hIkCrZEeyyC-O0_LlY9w"> 2118 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_eGZo7irZEeyyC-O0_LlY9w" sourceNode="_NzpMACrZEeyyC-O0_LlY9w" targetNode="_A8hIkCrZEeyyC-O0_LlY9w">
2025 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/> 2119 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/>
2026 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/> 2120 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/>
2027 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_OVL4VhEJEe2AArBmfNpEZA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> 2121 <ownedStyle xmi:type="diagram:EdgeStyle" uid="__zCMAxOzEe-4k7CzzL6IsA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
2028 <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"/> 2122 <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"/>
2029 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_OVL4VxEJEe2AArBmfNpEZA" showIcon="false"> 2123 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="__zCMBBOzEe-4k7CzzL6IsA" showIcon="false">
2030 <labelFormat>italic</labelFormat> 2124 <labelFormat>italic</labelFormat>
2031 </beginLabelStyle> 2125 </beginLabelStyle>
2032 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_OVL4WBEJEe2AArBmfNpEZA" showIcon="false"/> 2126 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="__zCMBROzEe-4k7CzzL6IsA" showIcon="false"/>
2033 </ownedStyle> 2127 </ownedStyle>
2034 <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']"/> 2128 <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']"/>
2035 </ownedDiagramElements> 2129 </ownedDiagramElements>
@@ -2050,9 +2144,9 @@
2050 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 2144 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2051 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 2145 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2052 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 2146 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2053 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_swnaiirZEeyyC-O0_LlY9w" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228"> 2147 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_tGkYexRqEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
2054 <labelFormat>italic</labelFormat> 2148 <labelFormat>italic</labelFormat>
2055 <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']/@conditionnalStyles.1/@style"/> 2149 <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']/@conditionnalStyles.0/@style"/>
2056 </ownedStyle> 2150 </ownedStyle>
2057 <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']"/> 2151 <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']"/>
2058 </ownedDiagramElements> 2152 </ownedDiagramElements>
@@ -2072,12 +2166,12 @@
2072 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_WUsgHCrcEeyyC-O0_LlY9w" sourceNode="_NzpMACrZEeyyC-O0_LlY9w" targetNode="_RzK-YKA5EeuqkpDnuik1sg"> 2166 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_WUsgHCrcEeyyC-O0_LlY9w" sourceNode="_NzpMACrZEeyyC-O0_LlY9w" targetNode="_RzK-YKA5EeuqkpDnuik1sg">
2073 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/> 2167 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/>
2074 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/> 2168 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//RuleDefinition"/>
2075 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_OVMfAxEJEe2AArBmfNpEZA" targetArrow="InputClosedArrow" routingStyle="tree"> 2169 <ownedStyle xmi:type="diagram:EdgeStyle" uid="__zCMCROzEe-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
2076 <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"/> 2170 <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"/>
2077 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_OVMfBBEJEe2AArBmfNpEZA" showIcon="false"> 2171 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="__zCMChOzEe-4k7CzzL6IsA" showIcon="false">
2078 <labelFormat>italic</labelFormat> 2172 <labelFormat>italic</labelFormat>
2079 </beginLabelStyle> 2173 </beginLabelStyle>
2080 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_OVMfBREJEe2AArBmfNpEZA" showIcon="false"/> 2174 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="__zCMCxOzEe-4k7CzzL6IsA" showIcon="false"/>
2081 </ownedStyle> 2175 </ownedStyle>
2082 <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']"/> 2176 <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']"/>
2083 </ownedDiagramElements> 2177 </ownedDiagramElements>
@@ -2136,6 +2230,14 @@
2136 </ownedStyle> 2230 </ownedStyle>
2137 <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']"/> 2231 <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']"/>
2138 </ownedElements> 2232 </ownedElements>
2233 <ownedElements xmi:type="diagram:DNodeListElement" uid="_Ck5GMB6fEe-D29eT4GV5Hg" name="PARTIAL" tooltipText="">
2234 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ReferenceKind/PARTIAL"/>
2235 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ReferenceKind/PARTIAL"/>
2236 <ownedStyle xmi:type="diagram:BundledImage" uid="_Ck67YB6fEe-D29eT4GV5Hg" labelAlignment="LEFT">
2237 <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"/>
2238 </ownedStyle>
2239 <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']"/>
2240 </ownedElements>
2139 </ownedDiagramElements> 2241 </ownedDiagramElements>
2140 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_78pRMF9mEe2rXNsIDUvqhw" name="FunctionDefinition" tooltipText="" outgoingEdges="_rKoQHF9nEe2rXNsIDUvqhw _S6YCJl9wEe2rXNsIDUvqhw _sMPaBmTvEe2qdtyPWAtoxA _RjRnQs9lEe6T2u19X9cqmQ" width="12" height="10"> 2242 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_78pRMF9mEe2rXNsIDUvqhw" name="FunctionDefinition" tooltipText="" outgoingEdges="_rKoQHF9nEe2rXNsIDUvqhw _S6YCJl9wEe2rXNsIDUvqhw _sMPaBmTvEe2qdtyPWAtoxA _RjRnQs9lEe6T2u19X9cqmQ" width="12" height="10">
2141 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/> 2243 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/>
@@ -2680,6 +2782,76 @@
2680 </ownedStyle> 2782 </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']"/> 2783 <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> 2784 </ownedDiagramElements>
2785 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_3cdiQBOzEe-4k7CzzL6IsA" name="RuleKind" tooltipText="" width="12" height="10">
2786 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//RuleKind"/>
2787 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//RuleKind"/>
2788 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2789 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2790 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2791 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_3cdiQROzEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
2792 <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"/>
2793 </ownedStyle>
2794 <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']"/>
2795 <ownedElements xmi:type="diagram:DNodeListElement" uid="_5Cz1ABOzEe-4k7CzzL6IsA" name="REFINEMENT" tooltipText="">
2796 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/REFINEMENT"/>
2797 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/REFINEMENT"/>
2798 <ownedStyle xmi:type="diagram:BundledImage" uid="_5Cz1AROzEe-4k7CzzL6IsA" labelAlignment="LEFT">
2799 <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"/>
2800 </ownedStyle>
2801 <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']"/>
2802 </ownedElements>
2803 <ownedElements xmi:type="diagram:DNodeListElement" uid="_7Hb_MBOzEe-4k7CzzL6IsA" name="PROPAGATION" tooltipText="">
2804 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/PROPAGATION"/>
2805 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/PROPAGATION"/>
2806 <ownedStyle xmi:type="diagram:BundledImage" uid="_7Hb_MROzEe-4k7CzzL6IsA" labelAlignment="LEFT">
2807 <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"/>
2808 </ownedStyle>
2809 <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']"/>
2810 </ownedElements>
2811 <ownedElements xmi:type="diagram:DNodeListElement" uid="_8JiVYBOzEe-4k7CzzL6IsA" name="DECISION" tooltipText="">
2812 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/DECISION"/>
2813 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//RuleKind/DECISION"/>
2814 <ownedStyle xmi:type="diagram:BundledImage" uid="_8JiVYROzEe-4k7CzzL6IsA" labelAlignment="LEFT">
2815 <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"/>
2816 </ownedStyle>
2817 <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']"/>
2818 </ownedElements>
2819 </ownedDiagramElements>
2820 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_Z12NQBO0Ee-4k7CzzL6IsA" name="ParameterBinding" tooltipText="" width="12" height="10">
2821 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ParameterBinding"/>
2822 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ParameterBinding"/>
2823 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2824 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2825 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2826 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_Z12NQRO0Ee-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
2827 <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"/>
2828 </ownedStyle>
2829 <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']"/>
2830 <ownedElements xmi:type="diagram:DNodeListElement" uid="_eBCbUBO0Ee-4k7CzzL6IsA" name="SINGLE" tooltipText="">
2831 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/SINGLE"/>
2832 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/SINGLE"/>
2833 <ownedStyle xmi:type="diagram:BundledImage" uid="_eBCbURO0Ee-4k7CzzL6IsA" labelAlignment="LEFT">
2834 <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"/>
2835 </ownedStyle>
2836 <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']"/>
2837 </ownedElements>
2838 <ownedElements xmi:type="diagram:DNodeListElement" uid="_enuA0BO0Ee-4k7CzzL6IsA" name="FOCUS" tooltipText="">
2839 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/FOCUS"/>
2840 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/FOCUS"/>
2841 <ownedStyle xmi:type="diagram:BundledImage" uid="_enun4BO0Ee-4k7CzzL6IsA" labelAlignment="LEFT">
2842 <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"/>
2843 </ownedStyle>
2844 <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']"/>
2845 </ownedElements>
2846 <ownedElements xmi:type="diagram:DNodeListElement" uid="_fGJCMBO0Ee-4k7CzzL6IsA" name="MULTI" tooltipText="">
2847 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/MULTI"/>
2848 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ParameterBinding/MULTI"/>
2849 <ownedStyle xmi:type="diagram:BundledImage" uid="_fGJCMRO0Ee-4k7CzzL6IsA" labelAlignment="LEFT">
2850 <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"/>
2851 </ownedStyle>
2852 <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']"/>
2853 </ownedElements>
2854 </ownedDiagramElements>
2683 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 2855 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
2684 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> 2856 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/>
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"/> 2857 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
@@ -2724,7 +2896,7 @@
2724 <styles xmi:type="notation:FilteringStyle" xmi:id="_bTgeLF3tEe2LuOZzJ_LhLg"/> 2896 <styles xmi:type="notation:FilteringStyle" xmi:id="_bTgeLF3tEe2LuOZzJ_LhLg"/>
2725 </children> 2897 </children>
2726 <styles xmi:type="notation:ShapeStyle" xmi:id="_bTgeJ13tEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2898 <styles xmi:type="notation:ShapeStyle" xmi:id="_bTgeJ13tEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2727 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bTgeKF3tEe2LuOZzJ_LhLg" x="1955" y="168" width="120" height="100"/> 2899 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bTgeKF3tEe2LuOZzJ_LhLg" x="2123" y="168" width="120" height="100"/>
2728 </children> 2900 </children>
2729 <children xmi:type="notation:Node" xmi:id="_meWJcF3uEe2LuOZzJ_LhLg" type="2003" element="_mdrbEF3uEe2LuOZzJ_LhLg"> 2901 <children xmi:type="notation:Node" xmi:id="_meWJcF3uEe2LuOZzJ_LhLg" type="2003" element="_mdrbEF3uEe2LuOZzJ_LhLg">
2730 <children xmi:type="notation:Node" xmi:id="_meWwgF3uEe2LuOZzJ_LhLg" type="5007"/> 2902 <children xmi:type="notation:Node" xmi:id="_meWwgF3uEe2LuOZzJ_LhLg" type="5007"/>
@@ -2791,7 +2963,7 @@
2791 <styles xmi:type="notation:FilteringStyle" xmi:id="_ccRVpl3wEe2LuOZzJ_LhLg"/> 2963 <styles xmi:type="notation:FilteringStyle" xmi:id="_ccRVpl3wEe2LuOZzJ_LhLg"/>
2792 </children> 2964 </children>
2793 <styles xmi:type="notation:ShapeStyle" xmi:id="_ccRVoV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 2965 <styles xmi:type="notation:ShapeStyle" xmi:id="_ccRVoV3wEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2794 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccRVol3wEe2LuOZzJ_LhLg" x="1616" y="450" width="120" height="165"/> 2966 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccRVol3wEe2LuOZzJ_LhLg" x="1784" y="450" width="120" height="165"/>
2795 </children> 2967 </children>
2796 <children xmi:type="notation:Node" xmi:id="_R7b9sF38Ee2LuOZzJ_LhLg" type="2003" element="_R7XFMF38Ee2LuOZzJ_LhLg"> 2968 <children xmi:type="notation:Node" xmi:id="_R7b9sF38Ee2LuOZzJ_LhLg" type="2003" element="_R7XFMF38Ee2LuOZzJ_LhLg">
2797 <children xmi:type="notation:Node" xmi:id="_R7b9s138Ee2LuOZzJ_LhLg" type="5007"/> 2969 <children xmi:type="notation:Node" xmi:id="_R7b9s138Ee2LuOZzJ_LhLg" type="5007"/>
@@ -2840,7 +3012,7 @@
2840 <styles xmi:type="notation:FilteringStyle" xmi:id="_87Ju5l4IEe2LuOZzJ_LhLg"/> 3012 <styles xmi:type="notation:FilteringStyle" xmi:id="_87Ju5l4IEe2LuOZzJ_LhLg"/>
2841 </children> 3013 </children>
2842 <styles xmi:type="notation:ShapeStyle" xmi:id="_87Ju4V4IEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8" italic="true"/> 3014 <styles xmi:type="notation:ShapeStyle" xmi:id="_87Ju4V4IEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8" italic="true"/>
2843 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_87Ju4l4IEe2LuOZzJ_LhLg" x="2820" y="168"/> 3015 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_87Ju4l4IEe2LuOZzJ_LhLg" x="2988" y="168"/>
2844 </children> 3016 </children>
2845 <children xmi:type="notation:Node" xmi:id="_JYXdgF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIwF4JEe2LuOZzJ_LhLg"> 3017 <children xmi:type="notation:Node" xmi:id="_JYXdgF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIwF4JEe2LuOZzJ_LhLg">
2846 <children xmi:type="notation:Node" xmi:id="_JYXdg14JEe2LuOZzJ_LhLg" type="5007"/> 3018 <children xmi:type="notation:Node" xmi:id="_JYXdg14JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2853,7 +3025,7 @@
2853 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYXdhl4JEe2LuOZzJ_LhLg"/> 3025 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYXdhl4JEe2LuOZzJ_LhLg"/>
2854 </children> 3026 </children>
2855 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYXdgV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 3027 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYXdgV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2856 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYXdgl4JEe2LuOZzJ_LhLg" x="2456" y="312"/> 3028 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYXdgl4JEe2LuOZzJ_LhLg" x="2624" y="312"/>
2857 </children> 3029 </children>
2858 <children xmi:type="notation:Node" xmi:id="_JYYEkF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIw14JEe2LuOZzJ_LhLg"> 3030 <children xmi:type="notation:Node" xmi:id="_JYYEkF4JEe2LuOZzJ_LhLg" type="2003" element="_JYQIw14JEe2LuOZzJ_LhLg">
2859 <children xmi:type="notation:Node" xmi:id="_JYYEk14JEe2LuOZzJ_LhLg" type="5007"/> 3031 <children xmi:type="notation:Node" xmi:id="_JYYEk14JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2866,7 +3038,7 @@
2866 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEll4JEe2LuOZzJ_LhLg"/> 3038 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEll4JEe2LuOZzJ_LhLg"/>
2867 </children> 3039 </children>
2868 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEkV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 3040 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEkV4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2869 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEkl4JEe2LuOZzJ_LhLg" x="2605" y="312"/> 3041 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEkl4JEe2LuOZzJ_LhLg" x="2773" y="312"/>
2870 </children> 3042 </children>
2871 <children xmi:type="notation:Node" xmi:id="_JYYEl14JEe2LuOZzJ_LhLg" type="2003" element="_JYQv0l4JEe2LuOZzJ_LhLg"> 3043 <children xmi:type="notation:Node" xmi:id="_JYYEl14JEe2LuOZzJ_LhLg" type="2003" element="_JYQv0l4JEe2LuOZzJ_LhLg">
2872 <children xmi:type="notation:Node" xmi:id="_JYYEml4JEe2LuOZzJ_LhLg" type="5007"/> 3044 <children xmi:type="notation:Node" xmi:id="_JYYEml4JEe2LuOZzJ_LhLg" type="5007"/>
@@ -2879,7 +3051,7 @@
2879 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEnV4JEe2LuOZzJ_LhLg"/> 3051 <styles xmi:type="notation:FilteringStyle" xmi:id="_JYYEnV4JEe2LuOZzJ_LhLg"/>
2880 </children> 3052 </children>
2881 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEmF4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/> 3053 <styles xmi:type="notation:ShapeStyle" xmi:id="_JYYEmF4JEe2LuOZzJ_LhLg" fontName="Noto Sans" fontHeight="8"/>
2882 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEmV4JEe2LuOZzJ_LhLg" x="2792" y="312"/> 3054 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JYYEmV4JEe2LuOZzJ_LhLg" x="2960" y="312"/>
2883 </children> 3055 </children>
2884 <children xmi:type="notation:Node" xmi:id="_9AqPEF4KEe2m7IaHDkh2Xg" type="2003" element="_9AeB0F4KEe2m7IaHDkh2Xg"> 3056 <children xmi:type="notation:Node" xmi:id="_9AqPEF4KEe2m7IaHDkh2Xg" type="2003" element="_9AeB0F4KEe2m7IaHDkh2Xg">
2885 <children xmi:type="notation:Node" xmi:id="_9ArdMF4KEe2m7IaHDkh2Xg" type="5007"/> 3057 <children xmi:type="notation:Node" xmi:id="_9ArdMF4KEe2m7IaHDkh2Xg" type="5007"/>
@@ -2910,7 +3082,7 @@
2910 <styles xmi:type="notation:FilteringStyle" xmi:id="_GNwrhmTUEe2qdtyPWAtoxA"/> 3082 <styles xmi:type="notation:FilteringStyle" xmi:id="_GNwrhmTUEe2qdtyPWAtoxA"/>
2911 </children> 3083 </children>
2912 <styles xmi:type="notation:ShapeStyle" xmi:id="_GNwrgWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 3084 <styles xmi:type="notation:ShapeStyle" xmi:id="_GNwrgWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2913 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GNwrgmTUEe2qdtyPWAtoxA" x="1952" y="312" width="123"/> 3085 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GNwrgmTUEe2qdtyPWAtoxA" x="2120" y="312" width="123"/>
2914 </children> 3086 </children>
2915 <children xmi:type="notation:Node" xmi:id="_M-upAGTUEe2qdtyPWAtoxA" type="2003" element="_M-ZR0GTUEe2qdtyPWAtoxA"> 3087 <children xmi:type="notation:Node" xmi:id="_M-upAGTUEe2qdtyPWAtoxA" type="2003" element="_M-ZR0GTUEe2qdtyPWAtoxA">
2916 <children xmi:type="notation:Node" xmi:id="_M-upA2TUEe2qdtyPWAtoxA" type="5007"/> 3088 <children xmi:type="notation:Node" xmi:id="_M-upA2TUEe2qdtyPWAtoxA" type="5007"/>
@@ -2923,7 +3095,7 @@
2923 <styles xmi:type="notation:FilteringStyle" xmi:id="_M-upBmTUEe2qdtyPWAtoxA"/> 3095 <styles xmi:type="notation:FilteringStyle" xmi:id="_M-upBmTUEe2qdtyPWAtoxA"/>
2924 </children> 3096 </children>
2925 <styles xmi:type="notation:ShapeStyle" xmi:id="_M-upAWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 3097 <styles xmi:type="notation:ShapeStyle" xmi:id="_M-upAWTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2926 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M-upAmTUEe2qdtyPWAtoxA" x="1608" y="312" width="135" height="100"/> 3098 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M-upAmTUEe2qdtyPWAtoxA" x="1776" y="312" width="135" height="100"/>
2927 </children> 3099 </children>
2928 <children xmi:type="notation:Node" xmi:id="_QkXS8GTUEe2qdtyPWAtoxA" type="2003" element="_QkP-MGTUEe2qdtyPWAtoxA"> 3100 <children xmi:type="notation:Node" xmi:id="_QkXS8GTUEe2qdtyPWAtoxA" type="2003" element="_QkP-MGTUEe2qdtyPWAtoxA">
2929 <children xmi:type="notation:Node" xmi:id="_QkXS82TUEe2qdtyPWAtoxA" type="5007"/> 3101 <children xmi:type="notation:Node" xmi:id="_QkXS82TUEe2qdtyPWAtoxA" type="5007"/>
@@ -2968,7 +3140,7 @@
2968 <styles xmi:type="notation:FilteringStyle" xmi:id="_QkXS9mTUEe2qdtyPWAtoxA"/> 3140 <styles xmi:type="notation:FilteringStyle" xmi:id="_QkXS9mTUEe2qdtyPWAtoxA"/>
2969 </children> 3141 </children>
2970 <styles xmi:type="notation:ShapeStyle" xmi:id="_QkXS8WTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/> 3142 <styles xmi:type="notation:ShapeStyle" xmi:id="_QkXS8WTUEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8"/>
2971 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QkXS8mTUEe2qdtyPWAtoxA" x="1954" y="448" height="179"/> 3143 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QkXS8mTUEe2qdtyPWAtoxA" x="2122" y="448" height="179"/>
2972 </children> 3144 </children>
2973 <children xmi:type="notation:Node" xmi:id="_36XqIGTuEe2qdtyPWAtoxA" type="2003" element="_36CS8GTuEe2qdtyPWAtoxA"> 3145 <children xmi:type="notation:Node" xmi:id="_36XqIGTuEe2qdtyPWAtoxA" type="2003" element="_36CS8GTuEe2qdtyPWAtoxA">
2974 <children xmi:type="notation:Node" xmi:id="_36YRMGTuEe2qdtyPWAtoxA" type="5007"/> 3146 <children xmi:type="notation:Node" xmi:id="_36YRMGTuEe2qdtyPWAtoxA" type="5007"/>
@@ -3017,7 +3189,7 @@
3017 <styles xmi:type="notation:FilteringStyle" xmi:id="_3ahdpmgpEe24RpwpWgpkFQ"/> 3189 <styles xmi:type="notation:FilteringStyle" xmi:id="_3ahdpmgpEe24RpwpWgpkFQ"/>
3018 </children> 3190 </children>
3019 <styles xmi:type="notation:ShapeStyle" xmi:id="_3ahdoWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/> 3191 <styles xmi:type="notation:ShapeStyle" xmi:id="_3ahdoWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8"/>
3020 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3ahdomgpEe24RpwpWgpkFQ" x="2120" y="312" width="120" height="100"/> 3192 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3ahdomgpEe24RpwpWgpkFQ" x="2288" y="312" width="120" height="100"/>
3021 </children> 3193 </children>
3022 <children xmi:type="notation:Node" xmi:id="_ZjfaEGkGEe24rIYSlCjKHA" type="2003" element="_Zi8AcGkGEe24rIYSlCjKHA"> 3194 <children xmi:type="notation:Node" xmi:id="_ZjfaEGkGEe24rIYSlCjKHA" type="2003" element="_Zi8AcGkGEe24rIYSlCjKHA">
3023 <children xmi:type="notation:Node" xmi:id="_ZjkSkGkGEe24rIYSlCjKHA" type="5007"/> 3195 <children xmi:type="notation:Node" xmi:id="_ZjkSkGkGEe24rIYSlCjKHA" type="5007"/>
@@ -3030,7 +3202,7 @@
3030 <styles xmi:type="notation:FilteringStyle" xmi:id="_ZjkSk2kGEe24rIYSlCjKHA"/> 3202 <styles xmi:type="notation:FilteringStyle" xmi:id="_ZjkSk2kGEe24rIYSlCjKHA"/>
3031 </children> 3203 </children>
3032 <styles xmi:type="notation:ShapeStyle" xmi:id="_ZjfaEWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/> 3204 <styles xmi:type="notation:ShapeStyle" xmi:id="_ZjfaEWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
3033 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZjfaEmkGEe24rIYSlCjKHA" x="3120" y="312" width="120" height="100"/> 3205 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZjfaEmkGEe24rIYSlCjKHA" x="3288" y="312" width="120" height="100"/>
3034 </children> 3206 </children>
3035 <children xmi:type="notation:Node" xmi:id="_fdU7QGkGEe24rIYSlCjKHA" type="2003" element="_fdLKQGkGEe24rIYSlCjKHA"> 3207 <children xmi:type="notation:Node" xmi:id="_fdU7QGkGEe24rIYSlCjKHA" type="2003" element="_fdLKQGkGEe24rIYSlCjKHA">
3036 <children xmi:type="notation:Node" xmi:id="_fdViUGkGEe24rIYSlCjKHA" type="5007"/> 3208 <children xmi:type="notation:Node" xmi:id="_fdViUGkGEe24rIYSlCjKHA" type="5007"/>
@@ -3055,7 +3227,7 @@
3055 <styles xmi:type="notation:FilteringStyle" xmi:id="_fdViU2kGEe24rIYSlCjKHA"/> 3227 <styles xmi:type="notation:FilteringStyle" xmi:id="_fdViU2kGEe24rIYSlCjKHA"/>
3056 </children> 3228 </children>
3057 <styles xmi:type="notation:ShapeStyle" xmi:id="_fdU7QWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/> 3229 <styles xmi:type="notation:ShapeStyle" xmi:id="_fdU7QWkGEe24rIYSlCjKHA" fontName="Noto Sans" fontHeight="8"/>
3058 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fdU7QmkGEe24rIYSlCjKHA" x="3120" y="449"/> 3230 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fdU7QmkGEe24rIYSlCjKHA" x="3288" y="449"/>
3059 </children> 3231 </children>
3060 <children xmi:type="notation:Node" xmi:id="_IYGPgNZUEe69IbObpvsypA" type="2003" element="_IXrYwNZUEe69IbObpvsypA"> 3232 <children xmi:type="notation:Node" xmi:id="_IYGPgNZUEe69IbObpvsypA" type="2003" element="_IXrYwNZUEe69IbObpvsypA">
3061 <children xmi:type="notation:Node" xmi:id="_IYGPg9ZUEe69IbObpvsypA" type="5007"/> 3233 <children xmi:type="notation:Node" xmi:id="_IYGPg9ZUEe69IbObpvsypA" type="5007"/>
@@ -3068,7 +3240,7 @@
3068 <styles xmi:type="notation:FilteringStyle" xmi:id="_IYGPhtZUEe69IbObpvsypA"/> 3240 <styles xmi:type="notation:FilteringStyle" xmi:id="_IYGPhtZUEe69IbObpvsypA"/>
3069 </children> 3241 </children>
3070 <styles xmi:type="notation:ShapeStyle" xmi:id="_IYGPgdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/> 3242 <styles xmi:type="notation:ShapeStyle" xmi:id="_IYGPgdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/>
3071 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IYGPgtZUEe69IbObpvsypA" x="1784" y="312" width="120" height="100"/> 3243 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IYGPgtZUEe69IbObpvsypA" x="1952" y="312" width="120" height="100"/>
3072 </children> 3244 </children>
3073 <children xmi:type="notation:Node" xmi:id="_Nm2zYNZUEe69IbObpvsypA" type="2003" element="_Nmg1INZUEe69IbObpvsypA"> 3245 <children xmi:type="notation:Node" xmi:id="_Nm2zYNZUEe69IbObpvsypA" type="2003" element="_Nmg1INZUEe69IbObpvsypA">
3074 <children xmi:type="notation:Node" xmi:id="_Nm2zY9ZUEe69IbObpvsypA" type="5007"/> 3246 <children xmi:type="notation:Node" xmi:id="_Nm2zY9ZUEe69IbObpvsypA" type="5007"/>
@@ -3085,7 +3257,7 @@
3085 <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm3actZUEe69IbObpvsypA"/> 3257 <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm3actZUEe69IbObpvsypA"/>
3086 </children> 3258 </children>
3087 <styles xmi:type="notation:ShapeStyle" xmi:id="_Nm2zYdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/> 3259 <styles xmi:type="notation:ShapeStyle" xmi:id="_Nm2zYdZUEe69IbObpvsypA" fontName="Noto Sans" fontHeight="8"/>
3088 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm2zYtZUEe69IbObpvsypA" x="1784" y="449" width="120" height="100"/> 3260 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm2zYtZUEe69IbObpvsypA" x="1952" y="449" width="120" height="100"/>
3089 </children> 3261 </children>
3090 <children xmi:type="notation:Node" xmi:id="_FTa2MNZXEe69IbObpvsypA" type="2003" element="_FTH7QNZXEe69IbObpvsypA"> 3262 <children xmi:type="notation:Node" xmi:id="_FTa2MNZXEe69IbObpvsypA" type="2003" element="_FTH7QNZXEe69IbObpvsypA">
3091 <children xmi:type="notation:Node" xmi:id="_FTbdQNZXEe69IbObpvsypA" type="5007"/> 3263 <children xmi:type="notation:Node" xmi:id="_FTbdQNZXEe69IbObpvsypA" type="5007"/>
@@ -3103,7 +3275,7 @@
3103 <styles xmi:type="notation:FilteringStyle" xmi:id="_c0zXctcIEe6pjNxdSs0E0Q"/> 3275 <styles xmi:type="notation:FilteringStyle" xmi:id="_c0zXctcIEe6pjNxdSs0E0Q"/>
3104 </children> 3276 </children>
3105 <styles xmi:type="notation:ShapeStyle" xmi:id="_c0ue8NcIEe6pjNxdSs0E0Q" fontName="Noto Sans" fontHeight="8"/> 3277 <styles xmi:type="notation:ShapeStyle" xmi:id="_c0ue8NcIEe6pjNxdSs0E0Q" fontName="Noto Sans" fontHeight="8"/>
3106 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c0ue8dcIEe6pjNxdSs0E0Q" x="2288" y="312" width="120" height="100"/> 3278 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c0ue8dcIEe6pjNxdSs0E0Q" x="2456" y="312" width="120" height="100"/>
3107 </children> 3279 </children>
3108 <children xmi:type="notation:Node" xmi:id="_hOS68NjvEe66mJJuF_pPGg" type="2003" element="_hNitANjvEe66mJJuF_pPGg"> 3280 <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"/> 3281 <children xmi:type="notation:Node" xmi:id="_hOYagNjvEe66mJJuF_pPGg" type="5007"/>
@@ -3112,7 +3284,7 @@
3112 <styles xmi:type="notation:FilteringStyle" xmi:id="_hOZBktjvEe66mJJuF_pPGg"/> 3284 <styles xmi:type="notation:FilteringStyle" xmi:id="_hOZBktjvEe66mJJuF_pPGg"/>
3113 </children> 3285 </children>
3114 <styles xmi:type="notation:ShapeStyle" xmi:id="_hOS68djvEe66mJJuF_pPGg" fontName="Noto Sans" fontHeight="8"/> 3286 <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"/> 3287 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hOS68tjvEe66mJJuF_pPGg" x="3132" y="312" width="120" height="100"/>
3116 </children> 3288 </children>
3117 <children xmi:type="notation:Node" xmi:id="_tkOK4NsVEe6c9ehqpe3s7A" type="2003" element="_tkAvgNsVEe6c9ehqpe3s7A"> 3289 <children xmi:type="notation:Node" xmi:id="_tkOK4NsVEe6c9ehqpe3s7A" type="2003" element="_tkAvgNsVEe6c9ehqpe3s7A">
3118 <children xmi:type="notation:Node" xmi:id="_tkOK49sVEe6c9ehqpe3s7A" type="5007"/> 3290 <children xmi:type="notation:Node" xmi:id="_tkOK49sVEe6c9ehqpe3s7A" type="5007"/>
@@ -3123,6 +3295,61 @@
3123 <styles xmi:type="notation:ShapeStyle" xmi:id="_tkOK4dsVEe6c9ehqpe3s7A" fontName="Noto Sans" fontHeight="8"/> 3295 <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"/> 3296 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tkOK4tsVEe6c9ehqpe3s7A" x="919" y="448" width="147"/>
3125 </children> 3297 </children>
3298 <children xmi:type="notation:Node" xmi:id="_c_yWgBOwEe-4k7CzzL6IsA" type="2003" element="_c_NHsBOwEe-4k7CzzL6IsA">
3299 <children xmi:type="notation:Node" xmi:id="_c_3PABOwEe-4k7CzzL6IsA" type="5007"/>
3300 <children xmi:type="notation:Node" xmi:id="_c_32EBOwEe-4k7CzzL6IsA" type="7004">
3301 <children xmi:type="notation:Node" xmi:id="_npv-0BOwEe-4k7CzzL6IsA" type="3010" element="_npF3gBOwEe-4k7CzzL6IsA">
3302 <styles xmi:type="notation:FontStyle" xmi:id="_npv-0ROwEe-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
3303 <layoutConstraint xmi:type="notation:Location" xmi:id="_npv-0hOwEe-4k7CzzL6IsA"/>
3304 </children>
3305 <children xmi:type="notation:Node" xmi:id="_96Pv8BOxEe-4k7CzzL6IsA" type="3010" element="_95pTABOxEe-4k7CzzL6IsA">
3306 <styles xmi:type="notation:FontStyle" xmi:id="_96Pv8ROxEe-4k7CzzL6IsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
3307 <layoutConstraint xmi:type="notation:Location" xmi:id="_96Pv8hOxEe-4k7CzzL6IsA"/>
3308 </children>
3309 <styles xmi:type="notation:SortingStyle" xmi:id="_c_32EROwEe-4k7CzzL6IsA"/>
3310 <styles xmi:type="notation:FilteringStyle" xmi:id="_c_32EhOwEe-4k7CzzL6IsA"/>
3311 </children>
3312 <styles xmi:type="notation:ShapeStyle" xmi:id="_c_yWgROwEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3313 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c_yWghOwEe-4k7CzzL6IsA" x="1608" y="312" width="120" height="123"/>
3314 </children>
3315 <children xmi:type="notation:Node" xmi:id="_gNr14BOwEe-4k7CzzL6IsA" type="2003" element="_gNJqYBOwEe-4k7CzzL6IsA">
3316 <children xmi:type="notation:Node" xmi:id="_gNr14xOwEe-4k7CzzL6IsA" type="5007"/>
3317 <children xmi:type="notation:Node" xmi:id="_gNr15BOwEe-4k7CzzL6IsA" type="7004">
3318 <children xmi:type="notation:Node" xmi:id="_huzqYBOwEe-4k7CzzL6IsA" type="3010" element="_huUiMBOwEe-4k7CzzL6IsA">
3319 <styles xmi:type="notation:FontStyle" xmi:id="_huzqYROwEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3320 <layoutConstraint xmi:type="notation:Location" xmi:id="_huzqYhOwEe-4k7CzzL6IsA"/>
3321 </children>
3322 <children xmi:type="notation:Node" xmi:id="_iW6zQBOwEe-4k7CzzL6IsA" type="3010" element="_iWYAsBOwEe-4k7CzzL6IsA">
3323 <styles xmi:type="notation:FontStyle" xmi:id="_iW6zQROwEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3324 <layoutConstraint xmi:type="notation:Location" xmi:id="_iW6zQhOwEe-4k7CzzL6IsA"/>
3325 </children>
3326 <children xmi:type="notation:Node" xmi:id="_nKNtsBOxEe-4k7CzzL6IsA" type="3010" element="_nJq7IBOxEe-4k7CzzL6IsA">
3327 <styles xmi:type="notation:FontStyle" xmi:id="_nKNtsROxEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3328 <layoutConstraint xmi:type="notation:Location" xmi:id="_nKNtshOxEe-4k7CzzL6IsA"/>
3329 </children>
3330 <styles xmi:type="notation:SortingStyle" xmi:id="_gNr15ROwEe-4k7CzzL6IsA"/>
3331 <styles xmi:type="notation:FilteringStyle" xmi:id="_gNr15hOwEe-4k7CzzL6IsA"/>
3332 </children>
3333 <styles xmi:type="notation:ShapeStyle" xmi:id="_gNr14ROwEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3334 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gNr14hOwEe-4k7CzzL6IsA" x="1608" y="600" width="120" height="100"/>
3335 </children>
3336 <children xmi:type="notation:Node" xmi:id="_4aF6EBOxEe-4k7CzzL6IsA" type="2003" element="_4ZutsBOxEe-4k7CzzL6IsA">
3337 <children xmi:type="notation:Node" xmi:id="_4aF6ExOxEe-4k7CzzL6IsA" type="5007"/>
3338 <children xmi:type="notation:Node" xmi:id="_4aF6FBOxEe-4k7CzzL6IsA" type="7004">
3339 <children xmi:type="notation:Node" xmi:id="_50fbgBOxEe-4k7CzzL6IsA" type="3010" element="_50L5gBOxEe-4k7CzzL6IsA">
3340 <styles xmi:type="notation:FontStyle" xmi:id="_50fbgROxEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3341 <layoutConstraint xmi:type="notation:Location" xmi:id="_50fbghOxEe-4k7CzzL6IsA"/>
3342 </children>
3343 <children xmi:type="notation:Node" xmi:id="_6dbDxhOxEe-4k7CzzL6IsA" type="3010" element="_6c108BOxEe-4k7CzzL6IsA">
3344 <styles xmi:type="notation:FontStyle" xmi:id="_6dbDxxOxEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3345 <layoutConstraint xmi:type="notation:Location" xmi:id="_6dbDyBOxEe-4k7CzzL6IsA"/>
3346 </children>
3347 <styles xmi:type="notation:SortingStyle" xmi:id="_4aF6FROxEe-4k7CzzL6IsA"/>
3348 <styles xmi:type="notation:FilteringStyle" xmi:id="_4aF6FhOxEe-4k7CzzL6IsA"/>
3349 </children>
3350 <styles xmi:type="notation:ShapeStyle" xmi:id="_4aF6EROxEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3351 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4aF6EhOxEe-4k7CzzL6IsA" x="1608" y="468" width="120" height="100"/>
3352 </children>
3126 <styles xmi:type="notation:DiagramStyle" xmi:id="_z1ff0l3lEe2LuOZzJ_LhLg"/> 3353 <styles xmi:type="notation:DiagramStyle" xmi:id="_z1ff0l3lEe2LuOZzJ_LhLg"/>
3127 <edges xmi:type="notation:Edge" xmi:id="_C-b04F3mEe2LuOZzJ_LhLg" type="4001" element="_C9_I8F3mEe2LuOZzJ_LhLg" source="_9ZUmgF3lEe2LuOZzJ_LhLg" target="_8bUtMF3lEe2LuOZzJ_LhLg"> 3354 <edges xmi:type="notation:Edge" xmi:id="_C-b04F3mEe2LuOZzJ_LhLg" type="4001" element="_C9_I8F3mEe2LuOZzJ_LhLg" source="_9ZUmgF3lEe2LuOZzJ_LhLg" target="_8bUtMF3lEe2LuOZzJ_LhLg">
3128 <children xmi:type="notation:Node" xmi:id="_C-cb8F3mEe2LuOZzJ_LhLg" type="6001"> 3355 <children xmi:type="notation:Node" xmi:id="_C-cb8F3mEe2LuOZzJ_LhLg" type="6001">
@@ -3158,33 +3385,33 @@
3158 </edges> 3385 </edges>
3159 <edges xmi:type="notation:Edge" xmi:id="_oAifgF3vEe2LuOZzJ_LhLg" type="4001" element="_oARZ0l3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3386 <edges xmi:type="notation:Edge" xmi:id="_oAifgF3vEe2LuOZzJ_LhLg" type="4001" element="_oARZ0l3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3160 <children xmi:type="notation:Node" xmi:id="_oAifhF3vEe2LuOZzJ_LhLg" type="6001"> 3387 <children xmi:type="notation:Node" xmi:id="_oAifhF3vEe2LuOZzJ_LhLg" type="6001">
3161 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifhV3vEe2LuOZzJ_LhLg" x="-281" y="-38"/> 3388 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifhV3vEe2LuOZzJ_LhLg" x="-365" y="-38"/>
3162 </children> 3389 </children>
3163 <children xmi:type="notation:Node" xmi:id="_oAifhl3vEe2LuOZzJ_LhLg" type="6002"> 3390 <children xmi:type="notation:Node" xmi:id="_oAifhl3vEe2LuOZzJ_LhLg" type="6002">
3164 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifh13vEe2LuOZzJ_LhLg" x="-26" y="-68"/> 3391 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifh13vEe2LuOZzJ_LhLg" x="-51" y="-68"/>
3165 </children> 3392 </children>
3166 <children xmi:type="notation:Node" xmi:id="_oAifiF3vEe2LuOZzJ_LhLg" type="6003"> 3393 <children xmi:type="notation:Node" xmi:id="_oAifiF3vEe2LuOZzJ_LhLg" type="6003">
3167 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifiV3vEe2LuOZzJ_LhLg" x="-324" y="-10"/> 3394 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oAifiV3vEe2LuOZzJ_LhLg" x="-299" y="-10"/>
3168 </children> 3395 </children>
3169 <styles xmi:type="notation:ConnectorStyle" xmi:id="_oAifgV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/> 3396 <styles xmi:type="notation:ConnectorStyle" xmi:id="_oAifgV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/>
3170 <styles xmi:type="notation:FontStyle" xmi:id="_oAifgl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 3397 <styles xmi:type="notation:FontStyle" xmi:id="_oAifgl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
3171 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_oAifg13vEe2LuOZzJ_LhLg" points="[6, 0, 802, 50]$[6, -96, 802, -46]$[-714, -96, 82, -46]"/> 3398 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_oAifg13vEe2LuOZzJ_LhLg" points="[6, 0, 970, 50]$[6, -96, 970, -46]$[-882, -96, 82, -46]"/>
3172 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifil3vEe2LuOZzJ_LhLg" id="(0.3050847457627119,0.0)"/> 3399 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifil3vEe2LuOZzJ_LhLg" id="(0.3050847457627119,0.0)"/>
3173 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifi13vEe2LuOZzJ_LhLg" id="(0.3050847457627119,1.0)"/> 3400 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oAifi13vEe2LuOZzJ_LhLg" id="(0.3050847457627119,1.0)"/>
3174 </edges> 3401 </edges>
3175 <edges xmi:type="notation:Edge" xmi:id="_qyMHwF3vEe2LuOZzJ_LhLg" type="4001" element="_qx9eWF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg"> 3402 <edges xmi:type="notation:Edge" xmi:id="_qyMHwF3vEe2LuOZzJ_LhLg" type="4001" element="_qx9eWF3vEe2LuOZzJ_LhLg" source="_bTgeJl3tEe2LuOZzJ_LhLg" target="_3xZUsF3lEe2LuOZzJ_LhLg">
3176 <children xmi:type="notation:Node" xmi:id="_qyMHxF3vEe2LuOZzJ_LhLg" type="6001"> 3403 <children xmi:type="notation:Node" xmi:id="_qyMHxF3vEe2LuOZzJ_LhLg" type="6001">
3177 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHxV3vEe2LuOZzJ_LhLg" x="-354" y="-62"/> 3404 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHxV3vEe2LuOZzJ_LhLg" x="-438" y="-62"/>
3178 </children> 3405 </children>
3179 <children xmi:type="notation:Node" xmi:id="_qyMHxl3vEe2LuOZzJ_LhLg" type="6002"> 3406 <children xmi:type="notation:Node" xmi:id="_qyMHxl3vEe2LuOZzJ_LhLg" type="6002">
3180 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHx13vEe2LuOZzJ_LhLg" x="-10" y="-83"/> 3407 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHx13vEe2LuOZzJ_LhLg" x="-35" y="-83"/>
3181 </children> 3408 </children>
3182 <children xmi:type="notation:Node" xmi:id="_qyMHyF3vEe2LuOZzJ_LhLg" type="6003"> 3409 <children xmi:type="notation:Node" xmi:id="_qyMHyF3vEe2LuOZzJ_LhLg" type="6003">
3183 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHyV3vEe2LuOZzJ_LhLg" x="-330" y="-10"/> 3410 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qyMHyV3vEe2LuOZzJ_LhLg" x="-305" y="-10"/>
3184 </children> 3411 </children>
3185 <styles xmi:type="notation:ConnectorStyle" xmi:id="_qyMHwV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/> 3412 <styles xmi:type="notation:ConnectorStyle" xmi:id="_qyMHwV3vEe2LuOZzJ_LhLg" routing="Rectilinear"/>
3186 <styles xmi:type="notation:FontStyle" xmi:id="_qyMHwl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 3413 <styles xmi:type="notation:FontStyle" xmi:id="_qyMHwl3vEe2LuOZzJ_LhLg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
3187 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qyMHw13vEe2LuOZzJ_LhLg" points="[0, 0, 796, 50]$[0, -120, 796, -70]$[-750, -120, 46, -70]"/> 3414 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qyMHw13vEe2LuOZzJ_LhLg" points="[0, 0, 964, 50]$[0, -120, 964, -70]$[-918, -120, 46, -70]"/>
3188 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHyl3vEe2LuOZzJ_LhLg" id="(0.6101694915254238,0.0)"/> 3415 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHyl3vEe2LuOZzJ_LhLg" id="(0.6101694915254238,0.0)"/>
3189 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHy13vEe2LuOZzJ_LhLg" id="(0.6101694915254238,1.0)"/> 3416 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_qyMHy13vEe2LuOZzJ_LhLg" id="(0.6101694915254238,1.0)"/>
3190 </edges> 3417 </edges>
@@ -3732,6 +3959,22 @@
3732 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vaGudtsVEe6c9ehqpe3s7A" id="(0.503448275862069,1.0)"/> 3959 <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)"/> 3960 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vaGud9sVEe6c9ehqpe3s7A" id="(0.503448275862069,0.0)"/>
3734 </edges> 3961 </edges>
3962 <edges xmi:type="notation:Edge" xmi:id="_nOVOIBOwEe-4k7CzzL6IsA" type="4001" element="_nN6XfhOwEe-4k7CzzL6IsA" source="_c_yWgBOwEe-4k7CzzL6IsA" target="_meWJcF3uEe2LuOZzJ_LhLg">
3963 <children xmi:type="notation:Node" xmi:id="_nOZfkBOwEe-4k7CzzL6IsA" type="6001">
3964 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nOZfkROwEe-4k7CzzL6IsA" y="-10"/>
3965 </children>
3966 <children xmi:type="notation:Node" xmi:id="_nOaGoBOwEe-4k7CzzL6IsA" type="6002">
3967 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nOaGoROwEe-4k7CzzL6IsA" y="10"/>
3968 </children>
3969 <children xmi:type="notation:Node" xmi:id="_nOaGohOwEe-4k7CzzL6IsA" type="6003">
3970 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nOaGoxOwEe-4k7CzzL6IsA" y="10"/>
3971 </children>
3972 <styles xmi:type="notation:ConnectorStyle" xmi:id="_nOVOIROwEe-4k7CzzL6IsA" routing="Tree"/>
3973 <styles xmi:type="notation:FontStyle" xmi:id="_nOVOIhOwEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
3974 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nOVOIxOwEe-4k7CzzL6IsA" points="[0, 0, 199, 72]$[-199, -72, 0, 0]"/>
3975 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nOb70BOwEe-4k7CzzL6IsA" id="(0.5084745762711864,0.0)"/>
3976 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nOb70ROwEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
3977 </edges>
3735 </data> 3978 </data>
3736 </ownedAnnotationEntries> 3979 </ownedAnnotationEntries>
3737 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_z1k_YV3lEe2LuOZzJ_LhLg" source="DANNOTATION_CUSTOMIZATION_KEY"> 3980 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_z1k_YV3lEe2LuOZzJ_LhLg" source="DANNOTATION_CUSTOMIZATION_KEY">
@@ -3808,7 +4051,7 @@
3808 </ownedStyle> 4051 </ownedStyle>
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']"/> 4052 <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']"/>
3810 </ownedDiagramElements> 4053 </ownedDiagramElements>
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"> 4054 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mdrbEF3uEe2LuOZzJ_LhLg" name="UnaryExpr" tooltipText="" outgoingEdges="_FMB-xl3vEe2LuOZzJ_LhLg _uSiCAF3vEe2LuOZzJ_LhLg" incomingEdges="_vB8OTF4GEe2LuOZzJ_LhLg _EUlvyF4LEe2m7IaHDkh2Xg _nN6XfhOwEe-4k7CzzL6IsA" width="12" height="10">
3812 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/> 4055 <target 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"/> 4056 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UnaryExpr"/>
3814 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 4057 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -4852,6 +5095,107 @@
4852 </ownedStyle> 5095 </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']"/> 5096 <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> 5097 </ownedDiagramElements>
5098 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_c_NHsBOwEe-4k7CzzL6IsA" name="ModalExpr" tooltipText="" outgoingEdges="_nN6XfhOwEe-4k7CzzL6IsA" width="12" height="10">
5099 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
5100 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
5101 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5102 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5103 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5104 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_-VI8ShOxEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
5105 <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"/>
5106 </ownedStyle>
5107 <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']"/>
5108 <ownedElements xmi:type="diagram:DNodeListElement" uid="_npF3gBOwEe-4k7CzzL6IsA" name="concreteness : Concreteness = PARTIAL" tooltipText="">
5109 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/concreteness"/>
5110 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/concreteness"/>
5111 <ownedStyle xmi:type="diagram:BundledImage" uid="_oXtRAROwEe-4k7CzzL6IsA" labelAlignment="LEFT">
5112 <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"/>
5113 </ownedStyle>
5114 <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']"/>
5115 </ownedElements>
5116 <ownedElements xmi:type="diagram:DNodeListElement" uid="_95pTABOxEe-4k7CzzL6IsA" name="modality : Modality = NONE" tooltipText="">
5117 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/modality"/>
5118 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//ModalExpr/modality"/>
5119 <ownedStyle xmi:type="diagram:BundledImage" uid="_-VKxYROxEe-4k7CzzL6IsA" labelAlignment="LEFT">
5120 <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"/>
5121 </ownedStyle>
5122 <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']"/>
5123 </ownedElements>
5124 </ownedDiagramElements>
5125 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_gNJqYBOwEe-4k7CzzL6IsA" name="Modality" tooltipText="" width="12" height="10">
5126 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
5127 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Modality"/>
5128 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5129 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5130 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5131 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_gNJqYROwEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
5132 <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"/>
5133 </ownedStyle>
5134 <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']"/>
5135 <ownedElements xmi:type="diagram:DNodeListElement" uid="_huUiMBOwEe-4k7CzzL6IsA" name="NONE" tooltipText="">
5136 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/NONE"/>
5137 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/NONE"/>
5138 <ownedStyle xmi:type="diagram:BundledImage" uid="_huUiMROwEe-4k7CzzL6IsA" labelAlignment="LEFT">
5139 <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"/>
5140 </ownedStyle>
5141 <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']"/>
5142 </ownedElements>
5143 <ownedElements xmi:type="diagram:DNodeListElement" uid="_iWYAsBOwEe-4k7CzzL6IsA" name="MUST" tooltipText="">
5144 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
5145 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MUST"/>
5146 <ownedStyle xmi:type="diagram:BundledImage" uid="_iWYAsROwEe-4k7CzzL6IsA" labelAlignment="LEFT">
5147 <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"/>
5148 </ownedStyle>
5149 <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']"/>
5150 </ownedElements>
5151 <ownedElements xmi:type="diagram:DNodeListElement" uid="_nJq7IBOxEe-4k7CzzL6IsA" name="MAY" tooltipText="">
5152 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
5153 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Modality/MAY"/>
5154 <ownedStyle xmi:type="diagram:BundledImage" uid="_nJq7IROxEe-4k7CzzL6IsA" labelAlignment="LEFT">
5155 <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"/>
5156 </ownedStyle>
5157 <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']"/>
5158 </ownedElements>
5159 </ownedDiagramElements>
5160 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_nN6XfhOwEe-4k7CzzL6IsA" sourceNode="_c_NHsBOwEe-4k7CzzL6IsA" targetNode="_mdrbEF3uEe2LuOZzJ_LhLg">
5161 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
5162 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ModalExpr"/>
5163 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_-VPp5hOxEe-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
5164 <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"/>
5165 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_-VPp5xOxEe-4k7CzzL6IsA" showIcon="false">
5166 <labelFormat>italic</labelFormat>
5167 </beginLabelStyle>
5168 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_-VPp6BOxEe-4k7CzzL6IsA" showIcon="false"/>
5169 </ownedStyle>
5170 <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']"/>
5171 </ownedDiagramElements>
5172 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_4ZutsBOxEe-4k7CzzL6IsA" name="Concreteness" tooltipText="" width="12" height="10">
5173 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Concreteness"/>
5174 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//Concreteness"/>
5175 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5176 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5177 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5178 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_4ZutsROxEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
5179 <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"/>
5180 </ownedStyle>
5181 <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']"/>
5182 <ownedElements xmi:type="diagram:DNodeListElement" uid="_50L5gBOxEe-4k7CzzL6IsA" name="PARTIAL" tooltipText="">
5183 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Concreteness/PARTIAL"/>
5184 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Concreteness/PARTIAL"/>
5185 <ownedStyle xmi:type="diagram:BundledImage" uid="_50L5gROxEe-4k7CzzL6IsA" labelAlignment="LEFT">
5186 <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"/>
5187 </ownedStyle>
5188 <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']"/>
5189 </ownedElements>
5190 <ownedElements xmi:type="diagram:DNodeListElement" uid="_6c108BOxEe-4k7CzzL6IsA" name="CANDIDATE" tooltipText="">
5191 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Concreteness/CANDIDATE"/>
5192 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//Concreteness/CANDIDATE"/>
5193 <ownedStyle xmi:type="diagram:BundledImage" uid="_6c108ROxEe-4k7CzzL6IsA" labelAlignment="LEFT">
5194 <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"/>
5195 </ownedStyle>
5196 <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']"/>
5197 </ownedElements>
5198 </ownedDiagramElements>
4855 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 5199 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
4856 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_z1aAQF3lEe2LuOZzJ_LhLg"/> 5200 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_z1aAQF3lEe2LuOZzJ_LhLg"/>
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"/> 5201 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
@@ -4869,20 +5213,16 @@
4869 <styles xmi:type="notation:FilteringStyle" xmi:id="_yj6zVl4eEe2rXNsIDUvqhw"/> 5213 <styles xmi:type="notation:FilteringStyle" xmi:id="_yj6zVl4eEe2rXNsIDUvqhw"/>
4870 </children> 5214 </children>
4871 <styles xmi:type="notation:ShapeStyle" xmi:id="_yj6zUV4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 5215 <styles xmi:type="notation:ShapeStyle" xmi:id="_yj6zUV4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
4872 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yj6zUl4eEe2rXNsIDUvqhw" x="357" y="24"/> 5216 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yj6zUl4eEe2rXNsIDUvqhw" x="786" y="48"/>
4873 </children> 5217 </children>
4874 <children xmi:type="notation:Node" xmi:id="_z9rbk14eEe2rXNsIDUvqhw" type="2003" element="_z9nxMF4eEe2rXNsIDUvqhw"> 5218 <children xmi:type="notation:Node" xmi:id="_z9rbk14eEe2rXNsIDUvqhw" type="2003" element="_z9nxMF4eEe2rXNsIDUvqhw">
4875 <children xmi:type="notation:Node" xmi:id="_z9rbll4eEe2rXNsIDUvqhw" type="5007"/> 5219 <children xmi:type="notation:Node" xmi:id="_z9rbll4eEe2rXNsIDUvqhw" type="5007"/>
4876 <children xmi:type="notation:Node" xmi:id="_z9rbl14eEe2rXNsIDUvqhw" type="7004"> 5220 <children xmi:type="notation:Node" xmi:id="_z9rbl14eEe2rXNsIDUvqhw" type="7004">
4877 <children xmi:type="notation:Node" xmi:id="_z9sCql4eEe2rXNsIDUvqhw" type="3010" element="_z9qNcF4eEe2rXNsIDUvqhw">
4878 <styles xmi:type="notation:FontStyle" xmi:id="_z9sCq14eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
4879 <layoutConstraint xmi:type="notation:Location" xmi:id="_z9sCrF4eEe2rXNsIDUvqhw"/>
4880 </children>
4881 <styles xmi:type="notation:SortingStyle" xmi:id="_z9rbmF4eEe2rXNsIDUvqhw"/> 5221 <styles xmi:type="notation:SortingStyle" xmi:id="_z9rbmF4eEe2rXNsIDUvqhw"/>
4882 <styles xmi:type="notation:FilteringStyle" xmi:id="_z9rbmV4eEe2rXNsIDUvqhw"/> 5222 <styles xmi:type="notation:FilteringStyle" xmi:id="_z9rbmV4eEe2rXNsIDUvqhw"/>
4883 </children> 5223 </children>
4884 <styles xmi:type="notation:ShapeStyle" xmi:id="_z9rblF4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5224 <styles xmi:type="notation:ShapeStyle" xmi:id="_z9rblF4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
4885 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9rblV4eEe2rXNsIDUvqhw" x="336" y="180"/> 5225 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9rblV4eEe2rXNsIDUvqhw" x="328" y="48"/>
4886 </children> 5226 </children>
4887 <children xmi:type="notation:Node" xmi:id="_z9sCoF4eEe2rXNsIDUvqhw" type="2003" element="_z9oYQF4eEe2rXNsIDUvqhw"> 5227 <children xmi:type="notation:Node" xmi:id="_z9sCoF4eEe2rXNsIDUvqhw" type="2003" element="_z9oYQF4eEe2rXNsIDUvqhw">
4888 <children xmi:type="notation:Node" xmi:id="_z9sCo14eEe2rXNsIDUvqhw" type="5007"/> 5228 <children xmi:type="notation:Node" xmi:id="_z9sCo14eEe2rXNsIDUvqhw" type="5007"/>
@@ -4891,9 +5231,9 @@
4891 <styles xmi:type="notation:FilteringStyle" xmi:id="_z9sCpl4eEe2rXNsIDUvqhw"/> 5231 <styles xmi:type="notation:FilteringStyle" xmi:id="_z9sCpl4eEe2rXNsIDUvqhw"/>
4892 </children> 5232 </children>
4893 <styles xmi:type="notation:ShapeStyle" xmi:id="_z9sCoV4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 5233 <styles xmi:type="notation:ShapeStyle" xmi:id="_z9sCoV4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
4894 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9sCol4eEe2rXNsIDUvqhw" x="166" y="356"/> 5234 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9sCol4eEe2rXNsIDUvqhw" x="158" y="224"/>
4895 </children> 5235 </children>
4896 <children xmi:type="notation:Node" xmi:id="_A-j38F4fEe2rXNsIDUvqhw" type="2003" element="_A-fmgF4fEe2rXNsIDUvqhw"> 5236 <children xmi:type="notation:Node" xmi:id="_A-j38F4fEe2rXNsIDUvqhw" visible="false" type="2003" element="_A-fmgF4fEe2rXNsIDUvqhw">
4897 <children xmi:type="notation:Node" xmi:id="_A-j3814fEe2rXNsIDUvqhw" type="5007"/> 5237 <children xmi:type="notation:Node" xmi:id="_A-j3814fEe2rXNsIDUvqhw" type="5007"/>
4898 <children xmi:type="notation:Node" xmi:id="_A-j39F4fEe2rXNsIDUvqhw" type="7004"> 5238 <children xmi:type="notation:Node" xmi:id="_A-j39F4fEe2rXNsIDUvqhw" type="7004">
4899 <styles xmi:type="notation:SortingStyle" xmi:id="_A-j39V4fEe2rXNsIDUvqhw"/> 5239 <styles xmi:type="notation:SortingStyle" xmi:id="_A-j39V4fEe2rXNsIDUvqhw"/>
@@ -4909,7 +5249,7 @@
4909 <styles xmi:type="notation:FilteringStyle" xmi:id="_ChaKzV4fEe2rXNsIDUvqhw"/> 5249 <styles xmi:type="notation:FilteringStyle" xmi:id="_ChaKzV4fEe2rXNsIDUvqhw"/>
4910 </children> 5250 </children>
4911 <styles xmi:type="notation:ShapeStyle" xmi:id="_ChaKyF4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5251 <styles xmi:type="notation:ShapeStyle" xmi:id="_ChaKyF4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
4912 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChaKyV4fEe2rXNsIDUvqhw" x="240" y="516" width="159"/> 5252 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChaKyV4fEe2rXNsIDUvqhw" x="232" y="384" width="159"/>
4913 </children> 5253 </children>
4914 <children xmi:type="notation:Node" xmi:id="_ChaKzl4fEe2rXNsIDUvqhw" type="2003" element="_ChVSQF4fEe2rXNsIDUvqhw"> 5254 <children xmi:type="notation:Node" xmi:id="_ChaKzl4fEe2rXNsIDUvqhw" type="2003" element="_ChVSQF4fEe2rXNsIDUvqhw">
4915 <children xmi:type="notation:Node" xmi:id="_Chax0F4fEe2rXNsIDUvqhw" type="5007"/> 5255 <children xmi:type="notation:Node" xmi:id="_Chax0F4fEe2rXNsIDUvqhw" type="5007"/>
@@ -4918,7 +5258,7 @@
4918 <styles xmi:type="notation:FilteringStyle" xmi:id="_Chax014fEe2rXNsIDUvqhw"/> 5258 <styles xmi:type="notation:FilteringStyle" xmi:id="_Chax014fEe2rXNsIDUvqhw"/>
4919 </children> 5259 </children>
4920 <styles xmi:type="notation:ShapeStyle" xmi:id="_ChaKz14fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5260 <styles xmi:type="notation:ShapeStyle" xmi:id="_ChaKz14fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
4921 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChaK0F4fEe2rXNsIDUvqhw" x="20" y="516"/> 5261 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChaK0F4fEe2rXNsIDUvqhw" x="27" y="384"/>
4922 </children> 5262 </children>
4923 <children xmi:type="notation:Node" xmi:id="_85Kp8GTvEe2qdtyPWAtoxA" type="2003" element="_85G_kGTvEe2qdtyPWAtoxA"> 5263 <children xmi:type="notation:Node" xmi:id="_85Kp8GTvEe2qdtyPWAtoxA" type="2003" element="_85G_kGTvEe2qdtyPWAtoxA">
4924 <children xmi:type="notation:Node" xmi:id="_85Kp82TvEe2qdtyPWAtoxA" type="5007"/> 5264 <children xmi:type="notation:Node" xmi:id="_85Kp82TvEe2qdtyPWAtoxA" type="5007"/>
@@ -4927,7 +5267,7 @@
4927 <styles xmi:type="notation:FilteringStyle" xmi:id="_85Kp9mTvEe2qdtyPWAtoxA"/> 5267 <styles xmi:type="notation:FilteringStyle" xmi:id="_85Kp9mTvEe2qdtyPWAtoxA"/>
4928 </children> 5268 </children>
4929 <styles xmi:type="notation:ShapeStyle" xmi:id="_85Kp8WTvEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8" italic="true"/> 5269 <styles xmi:type="notation:ShapeStyle" xmi:id="_85Kp8WTvEe2qdtyPWAtoxA" fontName="Noto Sans" fontHeight="8" italic="true"/>
4930 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_85Kp8mTvEe2qdtyPWAtoxA" x="44" y="180"/> 5270 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_85Kp8mTvEe2qdtyPWAtoxA" x="36" y="48"/>
4931 </children> 5271 </children>
4932 <children xmi:type="notation:Node" xmi:id="_IhNHMGgpEe24RpwpWgpkFQ" type="2003" element="_IhJc0GgpEe24RpwpWgpkFQ"> 5272 <children xmi:type="notation:Node" xmi:id="_IhNHMGgpEe24RpwpWgpkFQ" type="2003" element="_IhJc0GgpEe24RpwpWgpkFQ">
4933 <children xmi:type="notation:Node" xmi:id="_IhNHM2gpEe24RpwpWgpkFQ" type="5007"/> 5273 <children xmi:type="notation:Node" xmi:id="_IhNHM2gpEe24RpwpWgpkFQ" type="5007"/>
@@ -4936,7 +5276,29 @@
4936 <styles xmi:type="notation:FilteringStyle" xmi:id="_IhNHNmgpEe24RpwpWgpkFQ"/> 5276 <styles xmi:type="notation:FilteringStyle" xmi:id="_IhNHNmgpEe24RpwpWgpkFQ"/>
4937 </children> 5277 </children>
4938 <styles xmi:type="notation:ShapeStyle" xmi:id="_IhNHMWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8" italic="true"/> 5278 <styles xmi:type="notation:ShapeStyle" xmi:id="_IhNHMWgpEe24RpwpWgpkFQ" fontName="Noto Sans" fontHeight="8" italic="true"/>
4939 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IhNHMmgpEe24RpwpWgpkFQ" x="636" y="356"/> 5279 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IhNHMmgpEe24RpwpWgpkFQ" x="459" y="224"/>
5280 </children>
5281 <children xmi:type="notation:Node" xmi:id="_dZ_BIBReEe-4k7CzzL6IsA" type="2003" element="_dZ46gBReEe-4k7CzzL6IsA">
5282 <children xmi:type="notation:Node" xmi:id="_dZ_BIxReEe-4k7CzzL6IsA" type="5007"/>
5283 <children xmi:type="notation:Node" xmi:id="_dZ_BJBReEe-4k7CzzL6IsA" type="7004">
5284 <styles xmi:type="notation:SortingStyle" xmi:id="_dZ_BJRReEe-4k7CzzL6IsA"/>
5285 <styles xmi:type="notation:FilteringStyle" xmi:id="_dZ_BJhReEe-4k7CzzL6IsA"/>
5286 </children>
5287 <styles xmi:type="notation:ShapeStyle" xmi:id="_dZ_BIRReEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8" italic="true"/>
5288 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dZ_BIhReEe-4k7CzzL6IsA" x="252" y="576"/>
5289 </children>
5290 <children xmi:type="notation:Node" xmi:id="_W77iOBRqEe-4k7CzzL6IsA" type="2003" element="_W7ZWoBRqEe-4k7CzzL6IsA">
5291 <children xmi:type="notation:Node" xmi:id="_W77iOxRqEe-4k7CzzL6IsA" type="5007"/>
5292 <children xmi:type="notation:Node" xmi:id="_W77iPBRqEe-4k7CzzL6IsA" type="7004">
5293 <children xmi:type="notation:Node" xmi:id="_bZwYUBRqEe-4k7CzzL6IsA" type="3010" element="_bZWIoBRqEe-4k7CzzL6IsA">
5294 <styles xmi:type="notation:FontStyle" xmi:id="_bZwYURRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5295 <layoutConstraint xmi:type="notation:Location" xmi:id="_bZwYUhRqEe-4k7CzzL6IsA"/>
5296 </children>
5297 <styles xmi:type="notation:SortingStyle" xmi:id="_W77iPRRqEe-4k7CzzL6IsA"/>
5298 <styles xmi:type="notation:FilteringStyle" xmi:id="_W77iPhRqEe-4k7CzzL6IsA"/>
5299 </children>
5300 <styles xmi:type="notation:ShapeStyle" xmi:id="_W77iORRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5301 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W77iOhRqEe-4k7CzzL6IsA" x="786" y="432" width="120" height="100"/>
4940 </children> 5302 </children>
4941 <styles xmi:type="notation:DiagramStyle" xmi:id="_xkD40l4eEe2rXNsIDUvqhw"/> 5303 <styles xmi:type="notation:DiagramStyle" xmi:id="_xkD40l4eEe2rXNsIDUvqhw"/>
4942 <edges xmi:type="notation:Edge" xmi:id="_z9sps14eEe2rXNsIDUvqhw" type="4001" element="_z9q0gF4eEe2rXNsIDUvqhw" source="_z9rbk14eEe2rXNsIDUvqhw" target="_z9sCoF4eEe2rXNsIDUvqhw"> 5304 <edges xmi:type="notation:Edge" xmi:id="_z9sps14eEe2rXNsIDUvqhw" type="4001" element="_z9q0gF4eEe2rXNsIDUvqhw" source="_z9rbk14eEe2rXNsIDUvqhw" target="_z9sCoF4eEe2rXNsIDUvqhw">
@@ -4955,38 +5317,6 @@
4955 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9spvV4eEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5317 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9spvV4eEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
4956 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9spvl4eEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5318 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9spvl4eEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
4957 </edges> 5319 </edges>
4958 <edges xmi:type="notation:Edge" xmi:id="_z9spv14eEe2rXNsIDUvqhw" type="4001" element="_z9q0il4eEe2rXNsIDUvqhw" source="_z9rbk14eEe2rXNsIDUvqhw" target="_yj6zUF4eEe2rXNsIDUvqhw">
4959 <children xmi:type="notation:Node" xmi:id="_z9spw14eEe2rXNsIDUvqhw" type="6001">
4960 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9spxF4eEe2rXNsIDUvqhw" y="-10"/>
4961 </children>
4962 <children xmi:type="notation:Node" xmi:id="_z9tQwF4eEe2rXNsIDUvqhw" type="6002">
4963 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9tQwV4eEe2rXNsIDUvqhw" y="10"/>
4964 </children>
4965 <children xmi:type="notation:Node" xmi:id="_z9tQwl4eEe2rXNsIDUvqhw" type="6003">
4966 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z9tQw14eEe2rXNsIDUvqhw" y="10"/>
4967 </children>
4968 <styles xmi:type="notation:ConnectorStyle" xmi:id="_z9spwF4eEe2rXNsIDUvqhw" routing="Tree"/>
4969 <styles xmi:type="notation:FontStyle" xmi:id="_z9spwV4eEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
4970 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_z9spwl4eEe2rXNsIDUvqhw" points="[0, 0, -71, 555]$[71, -555, 0, 0]"/>
4971 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9tQxF4eEe2rXNsIDUvqhw" id="(0.3522012578616352,0.05102040816326531)"/>
4972 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_z9tQxV4eEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
4973 </edges>
4974 <edges xmi:type="notation:Edge" xmi:id="_ChbY4l4fEe2rXNsIDUvqhw" type="4001" element="_ChYVqV4fEe2rXNsIDUvqhw" source="_ChaKx14fEe2rXNsIDUvqhw" target="_A-j38F4fEe2rXNsIDUvqhw">
4975 <children xmi:type="notation:Node" xmi:id="_ChbY5l4fEe2rXNsIDUvqhw" type="6001">
4976 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChbY514fEe2rXNsIDUvqhw" x="-5" y="34"/>
4977 </children>
4978 <children xmi:type="notation:Node" xmi:id="_ChbY6F4fEe2rXNsIDUvqhw" type="6002">
4979 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChbY6V4fEe2rXNsIDUvqhw" x="25" y="-4"/>
4980 </children>
4981 <children xmi:type="notation:Node" xmi:id="_ChbY6l4fEe2rXNsIDUvqhw" type="6003">
4982 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChbY614fEe2rXNsIDUvqhw" x="-19" y="-10"/>
4983 </children>
4984 <styles xmi:type="notation:ConnectorStyle" xmi:id="_ChbY414fEe2rXNsIDUvqhw" routing="Rectilinear"/>
4985 <styles xmi:type="notation:FontStyle" xmi:id="_ChbY5F4fEe2rXNsIDUvqhw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
4986 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ChbY5V4fEe2rXNsIDUvqhw" points="[5, 49, 24, -74]$[5, 119, 24, -4]"/>
4987 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ChbY7F4fEe2rXNsIDUvqhw" id="(0.4681528662420382,0.5)"/>
4988 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ChbY7V4fEe2rXNsIDUvqhw" id="(0.288135593220339,0.04081632653061224)"/>
4989 </edges>
4990 <edges xmi:type="notation:Edge" xmi:id="_ChcnBF4fEe2rXNsIDUvqhw" type="4001" element="_ChY8uV4fEe2rXNsIDUvqhw" source="_ChaKx14fEe2rXNsIDUvqhw" target="_z9sCoF4eEe2rXNsIDUvqhw"> 5320 <edges xmi:type="notation:Edge" xmi:id="_ChcnBF4fEe2rXNsIDUvqhw" type="4001" element="_ChY8uV4fEe2rXNsIDUvqhw" source="_ChaKx14fEe2rXNsIDUvqhw" target="_z9sCoF4eEe2rXNsIDUvqhw">
4991 <children xmi:type="notation:Node" xmi:id="_ChcnCF4fEe2rXNsIDUvqhw" type="6001"> 5321 <children xmi:type="notation:Node" xmi:id="_ChcnCF4fEe2rXNsIDUvqhw" type="6001">
4992 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChcnCV4fEe2rXNsIDUvqhw" y="-10"/> 5322 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ChcnCV4fEe2rXNsIDUvqhw" y="-10"/>
@@ -5037,20 +5367,84 @@
5037 </edges> 5367 </edges>
5038 <edges xmi:type="notation:Edge" xmi:id="_jkascGkGEe24rIYSlCjKHA" type="4001" element="_CxoVTGgpEe24RpwpWgpkFQ" source="_z9rbk14eEe2rXNsIDUvqhw" target="_IhNHMGgpEe24RpwpWgpkFQ"> 5368 <edges xmi:type="notation:Edge" xmi:id="_jkascGkGEe24rIYSlCjKHA" type="4001" element="_CxoVTGgpEe24RpwpWgpkFQ" source="_z9rbk14eEe2rXNsIDUvqhw" target="_IhNHMGgpEe24RpwpWgpkFQ">
5039 <children xmi:type="notation:Node" xmi:id="_jkbTg2kGEe24rIYSlCjKHA" type="6001"> 5369 <children xmi:type="notation:Node" xmi:id="_jkbTg2kGEe24rIYSlCjKHA" type="6001">
5040 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbThGkGEe24rIYSlCjKHA" x="-72" y="-16"/> 5370 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbThGkGEe24rIYSlCjKHA" x="22" y="-16"/>
5041 </children> 5371 </children>
5042 <children xmi:type="notation:Node" xmi:id="_jkbThWkGEe24rIYSlCjKHA" type="6002"> 5372 <children xmi:type="notation:Node" xmi:id="_jkbThWkGEe24rIYSlCjKHA" type="6002">
5043 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbThmkGEe24rIYSlCjKHA" x="52" y="10"/> 5373 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbThmkGEe24rIYSlCjKHA" x="30" y="-73"/>
5044 </children> 5374 </children>
5045 <children xmi:type="notation:Node" xmi:id="_jkbTh2kGEe24rIYSlCjKHA" type="6003"> 5375 <children xmi:type="notation:Node" xmi:id="_jkbTh2kGEe24rIYSlCjKHA" type="6003">
5046 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbTiGkGEe24rIYSlCjKHA" x="6" y="23"/> 5376 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jkbTiGkGEe24rIYSlCjKHA" x="18" y="11"/>
5047 </children> 5377 </children>
5048 <styles xmi:type="notation:ConnectorStyle" xmi:id="_jkbTgGkGEe24rIYSlCjKHA" routing="Rectilinear"/> 5378 <styles xmi:type="notation:ConnectorStyle" xmi:id="_jkbTgGkGEe24rIYSlCjKHA" routing="Rectilinear"/>
5049 <styles xmi:type="notation:FontStyle" xmi:id="_jkbTgWkGEe24rIYSlCjKHA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 5379 <styles xmi:type="notation:FontStyle" xmi:id="_jkbTgWkGEe24rIYSlCjKHA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5050 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jkbTgmkGEe24rIYSlCjKHA" points="[13, 0, -225, -91]$[13, 46, -225, -45]$[251, 46, 13, -45]$[251, 78, 13, -13]"/> 5380 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jkbTgmkGEe24rIYSlCjKHA" points="[3, 0, -93, -91]$[3, 46, -93, -45]$[100, 46, 4, -45]$[100, 78, 4, -13]"/>
5051 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jkchoGkGEe24rIYSlCjKHA" id="(0.6792452830188679,1.0)"/> 5381 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jkchoGkGEe24rIYSlCjKHA" id="(0.6792452830188679,1.0)"/>
5052 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jkchoWkGEe24rIYSlCjKHA" id="(0.3813559322033898,0.1326530612244898)"/> 5382 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jkchoWkGEe24rIYSlCjKHA" id="(0.3813559322033898,0.1326530612244898)"/>
5053 </edges> 5383 </edges>
5384 <edges xmi:type="notation:Edge" xmi:id="_dZ_BJxReEe-4k7CzzL6IsA" visible="false" type="4001" element="_dZ9zEhReEe-4k7CzzL6IsA" source="_A-j38F4fEe2rXNsIDUvqhw" target="_dZ_BIBReEe-4k7CzzL6IsA">
5385 <children xmi:type="notation:Node" xmi:id="_dZ_oMBReEe-4k7CzzL6IsA" type="6001">
5386 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dZ_oMRReEe-4k7CzzL6IsA" y="-10"/>
5387 </children>
5388 <children xmi:type="notation:Node" xmi:id="_dZ_oMhReEe-4k7CzzL6IsA" type="6002">
5389 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dZ_oMxReEe-4k7CzzL6IsA" y="10"/>
5390 </children>
5391 <children xmi:type="notation:Node" xmi:id="_dZ_oNBReEe-4k7CzzL6IsA" type="6003">
5392 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dZ_oNRReEe-4k7CzzL6IsA" y="10"/>
5393 </children>
5394 <styles xmi:type="notation:ConnectorStyle" xmi:id="_dZ_BKBReEe-4k7CzzL6IsA" routing="Tree"/>
5395 <styles xmi:type="notation:FontStyle" xmi:id="_dZ_BKRReEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5396 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dZ_BKhReEe-4k7CzzL6IsA" points="[3, 1, -806, -254]$[749, 236, -60, -19]"/>
5397 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_daFu0BReEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5398 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_daFu0RReEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5399 </edges>
5400 <edges xmi:type="notation:Edge" xmi:id="_eIo27BReEe-4k7CzzL6IsA" type="4001" element="_ChYVqV4fEe2rXNsIDUvqhw" source="_ChaKx14fEe2rXNsIDUvqhw" target="_dZ_BIBReEe-4k7CzzL6IsA">
5401 <children xmi:type="notation:Node" xmi:id="_eIo28BReEe-4k7CzzL6IsA" type="6001">
5402 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eIo28RReEe-4k7CzzL6IsA" x="7" y="1"/>
5403 </children>
5404 <children xmi:type="notation:Node" xmi:id="_eIpd8BReEe-4k7CzzL6IsA" type="6002">
5405 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eIpd8RReEe-4k7CzzL6IsA" x="17"/>
5406 </children>
5407 <children xmi:type="notation:Node" xmi:id="_eIpd8hReEe-4k7CzzL6IsA" type="6003">
5408 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eIpd8xReEe-4k7CzzL6IsA" x="5" y="10"/>
5409 </children>
5410 <styles xmi:type="notation:ConnectorStyle" xmi:id="_eIo27RReEe-4k7CzzL6IsA" routing="Rectilinear"/>
5411 <styles xmi:type="notation:FontStyle" xmi:id="_eIo27hReEe-4k7CzzL6IsA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5412 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eIo27xReEe-4k7CzzL6IsA" points="[6, 49, 0, -143]$[6, 143, 0, -49]"/>
5413 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_eIpd9BReEe-4k7CzzL6IsA" id="(0.4681528662420382,0.5)"/>
5414 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YahnEBRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5415 </edges>
5416 <edges xmi:type="notation:Edge" xmi:id="_aTR4cBRqEe-4k7CzzL6IsA" type="4001" element="_z9q0il4eEe2rXNsIDUvqhw" source="_W77iOBRqEe-4k7CzzL6IsA" target="_yj6zUF4eEe2rXNsIDUvqhw">
5417 <children xmi:type="notation:Node" xmi:id="_aTR4dBRqEe-4k7CzzL6IsA" type="6001">
5418 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aTR4dRRqEe-4k7CzzL6IsA" x="-109" y="-38"/>
5419 </children>
5420 <children xmi:type="notation:Node" xmi:id="_aTR4dhRqEe-4k7CzzL6IsA" type="6002">
5421 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aTR4dxRqEe-4k7CzzL6IsA" x="-1" y="10"/>
5422 </children>
5423 <children xmi:type="notation:Node" xmi:id="_aTR4eBRqEe-4k7CzzL6IsA" type="6003">
5424 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aTR4eRRqEe-4k7CzzL6IsA" x="-69" y="19"/>
5425 </children>
5426 <styles xmi:type="notation:ConnectorStyle" xmi:id="_aTR4cRRqEe-4k7CzzL6IsA" routing="Tree"/>
5427 <styles xmi:type="notation:FontStyle" xmi:id="_aTR4chRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5428 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_aTR4cxRqEe-4k7CzzL6IsA" points="[0, -5, 36, 335]$[0, -185, 36, 155]$[-37, -185, -1, 155]$[-37, -291, -1, 49]"/>
5429 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_aTSfgBRqEe-4k7CzzL6IsA" id="(0.8050847457627118,0.05102040816326531)"/>
5430 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_aTSfgRRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5431 </edges>
5432 <edges xmi:type="notation:Edge" xmi:id="_kJDqwBRqEe-4k7CzzL6IsA" type="4001" element="_kInl-BRqEe-4k7CzzL6IsA" source="_W77iOBRqEe-4k7CzzL6IsA" target="_z9rbk14eEe2rXNsIDUvqhw">
5433 <children xmi:type="notation:Node" xmi:id="_kJDqxBRqEe-4k7CzzL6IsA" type="6001">
5434 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kJDqxRRqEe-4k7CzzL6IsA" x="-184" y="-10"/>
5435 </children>
5436 <children xmi:type="notation:Node" xmi:id="_kJDqxhRqEe-4k7CzzL6IsA" type="6002">
5437 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kJDqxxRqEe-4k7CzzL6IsA" x="-38" y="-48"/>
5438 </children>
5439 <children xmi:type="notation:Node" xmi:id="_kJDqyBRqEe-4k7CzzL6IsA" type="6003">
5440 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kJDqyRRqEe-4k7CzzL6IsA" x="-79" y="95"/>
5441 </children>
5442 <styles xmi:type="notation:ConnectorStyle" xmi:id="_kJDqwRRqEe-4k7CzzL6IsA" routing="Tree"/>
5443 <styles xmi:type="notation:FontStyle" xmi:id="_kJDqwhRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5444 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kJDqwxRqEe-4k7CzzL6IsA" points="[0, -24, 466, 335]$[0, -108, 466, 251]$[-465, -108, 1, 251]$[-465, -310, 1, 49]"/>
5445 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kJER0BRqEe-4k7CzzL6IsA" id="(0.22033898305084745,0.061224489795918366)"/>
5446 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kJER0RRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5447 </edges>
5054 </data> 5448 </data>
5055 </ownedAnnotationEntries> 5449 </ownedAnnotationEntries>
5056 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_xkO38F4eEe2rXNsIDUvqhw" source="DANNOTATION_CUSTOMIZATION_KEY"> 5450 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_xkO38F4eEe2rXNsIDUvqhw" source="DANNOTATION_CUSTOMIZATION_KEY">
@@ -5078,24 +5472,17 @@
5078 </ownedStyle> 5472 </ownedStyle>
5079 <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']"/> 5473 <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']"/>
5080 </ownedDiagramElements> 5474 </ownedDiagramElements>
5081 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_z9nxMF4eEe2rXNsIDUvqhw" name="Assertion" tooltipText="" outgoingEdges="_z9q0gF4eEe2rXNsIDUvqhw _z9q0il4eEe2rXNsIDUvqhw _AUF41GTwEe2qdtyPWAtoxA _CxoVTGgpEe24RpwpWgpkFQ" width="12" height="10"> 5475 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_z9nxMF4eEe2rXNsIDUvqhw" name="AbstractAssertion" tooltipText="" outgoingEdges="_z9q0gF4eEe2rXNsIDUvqhw _AUF41GTwEe2qdtyPWAtoxA _CxoVTGgpEe24RpwpWgpkFQ" incomingEdges="_kInl-BRqEe-4k7CzzL6IsA" width="12" height="10">
5082 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 5476 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AbstractAssertion"/>
5083 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 5477 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AbstractAssertion"/>
5084 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5478 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5085 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 5479 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5086 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 5480 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5087 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_F1pf42gpEe24RpwpWgpkFQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 5481 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_hH94XxRqEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
5088 <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"/> 5482 <labelFormat>italic</labelFormat>
5483 <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']/@conditionnalStyles.1/@style"/>
5089 </ownedStyle> 5484 </ownedStyle>
5090 <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']"/> 5485 <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']"/>
5091 <ownedElements xmi:type="diagram:DNodeListElement" uid="_z9qNcF4eEe2rXNsIDUvqhw" name="default : EBoolean = false" tooltipText="">
5092 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
5093 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
5094 <ownedStyle xmi:type="diagram:BundledImage" uid="_z9qNcV4eEe2rXNsIDUvqhw" labelAlignment="LEFT">
5095 <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"/>
5096 </ownedStyle>
5097 <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']"/>
5098 </ownedElements>
5099 </ownedDiagramElements> 5486 </ownedDiagramElements>
5100 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_z9oYQF4eEe2rXNsIDUvqhw" name="AssertionArgument" tooltipText="" incomingEdges="_z9q0gF4eEe2rXNsIDUvqhw _ChY8uV4fEe2rXNsIDUvqhw _ChZjtl4fEe2rXNsIDUvqhw" width="12" height="10"> 5487 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_z9oYQF4eEe2rXNsIDUvqhw" name="AssertionArgument" tooltipText="" incomingEdges="_z9q0gF4eEe2rXNsIDUvqhw _ChY8uV4fEe2rXNsIDUvqhw _ChZjtl4fEe2rXNsIDUvqhw" width="12" height="10">
5101 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/> 5488 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/>
@@ -5110,8 +5497,8 @@
5110 <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']"/> 5497 <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']"/>
5111 </ownedDiagramElements> 5498 </ownedDiagramElements>
5112 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_z9q0gF4eEe2rXNsIDUvqhw" name="[0..*] arguments" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_z9oYQF4eEe2rXNsIDUvqhw"> 5499 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_z9q0gF4eEe2rXNsIDUvqhw" name="[0..*] arguments" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_z9oYQF4eEe2rXNsIDUvqhw">
5113 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/arguments"/> 5500 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
5114 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/arguments"/> 5501 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
5115 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_z9q0hF4eEe2rXNsIDUvqhw" description="_z9q0gV4eEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0"> 5502 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_z9q0hF4eEe2rXNsIDUvqhw" description="_z9q0gV4eEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
5116 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_z9q0hl4eEe2rXNsIDUvqhw" showIcon="false"> 5503 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_z9q0hl4eEe2rXNsIDUvqhw" showIcon="false">
5117 <customFeatures>labelSize</customFeatures> 5504 <customFeatures>labelSize</customFeatures>
@@ -5122,7 +5509,7 @@
5122 </ownedStyle> 5509 </ownedStyle>
5123 <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']"/> 5510 <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']"/>
5124 </ownedDiagramElements> 5511 </ownedDiagramElements>
5125 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_z9q0il4eEe2rXNsIDUvqhw" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_yj4-IF4eEe2rXNsIDUvqhw"> 5512 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_z9q0il4eEe2rXNsIDUvqhw" sourceNode="_W7ZWoBRqEe-4k7CzzL6IsA" targetNode="_yj4-IF4eEe2rXNsIDUvqhw">
5126 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 5513 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5127 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 5514 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5128 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_F1rVImgpEe24RpwpWgpkFQ" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> 5515 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_F1rVImgpEe24RpwpWgpkFQ" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
@@ -5134,9 +5521,10 @@
5134 </ownedStyle> 5521 </ownedStyle>
5135 <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']"/> 5522 <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']"/>
5136 </ownedDiagramElements> 5523 </ownedDiagramElements>
5137 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_A-fmgF4fEe2rXNsIDUvqhw" name="Node" tooltipText="" incomingEdges="_ChYVqV4fEe2rXNsIDUvqhw" width="12" height="10"> 5524 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_A-fmgF4fEe2rXNsIDUvqhw" name="Node" visible="false" tooltipText="" outgoingEdges="_dZ9zEhReEe-4k7CzzL6IsA" width="12" height="10">
5138 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/> 5525 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
5139 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/> 5526 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
5527 <graphicalFilters xmi:type="diagram:HideFilter" uid="_GLUFoBRfEe-4k7CzzL6IsA"/>
5140 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5528 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5141 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 5529 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5142 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 5530 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
@@ -5167,7 +5555,7 @@
5167 </ownedStyle> 5555 </ownedStyle>
5168 <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']"/> 5556 <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']"/>
5169 </ownedDiagramElements> 5557 </ownedDiagramElements>
5170 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ChYVqV4fEe2rXNsIDUvqhw" name="[0..1] node" sourceNode="_ChUrMl4fEe2rXNsIDUvqhw" targetNode="_A-fmgF4fEe2rXNsIDUvqhw"> 5558 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ChYVqV4fEe2rXNsIDUvqhw" name="[0..1] node" sourceNode="_ChUrMl4fEe2rXNsIDUvqhw" targetNode="_dZ46gBReEe-4k7CzzL6IsA">
5171 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeAssertionArgument/node"/> 5559 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeAssertionArgument/node"/>
5172 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeAssertionArgument/node"/> 5560 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeAssertionArgument/node"/>
5173 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_ChY8oF4fEe2rXNsIDUvqhw" routingStyle="manhattan" strokeColor="0,0,0"> 5561 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_ChY8oF4fEe2rXNsIDUvqhw" routingStyle="manhattan" strokeColor="0,0,0">
@@ -5218,8 +5606,8 @@
5218 <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']"/> 5606 <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']"/>
5219 </ownedDiagramElements> 5607 </ownedDiagramElements>
5220 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_AUF41GTwEe2qdtyPWAtoxA" name="[0..1] relation" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_85G_kGTvEe2qdtyPWAtoxA"> 5608 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_AUF41GTwEe2qdtyPWAtoxA" name="[0..1] relation" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_85G_kGTvEe2qdtyPWAtoxA">
5221 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/relation"/> 5609 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
5222 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/relation"/> 5610 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
5223 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_AUGfwGTwEe2qdtyPWAtoxA" routingStyle="manhattan" strokeColor="0,0,0"> 5611 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_AUGfwGTwEe2qdtyPWAtoxA" routingStyle="manhattan" strokeColor="0,0,0">
5224 <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"/> 5612 <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"/>
5225 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_AUGfwmTwEe2qdtyPWAtoxA" showIcon="false"> 5613 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_AUGfwmTwEe2qdtyPWAtoxA" showIcon="false">
@@ -5232,8 +5620,8 @@
5232 <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']"/> 5620 <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']"/>
5233 </ownedDiagramElements> 5621 </ownedDiagramElements>
5234 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_CxoVTGgpEe24RpwpWgpkFQ" name="[0..1] value" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_IhJc0GgpEe24RpwpWgpkFQ"> 5622 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_CxoVTGgpEe24RpwpWgpkFQ" name="[0..1] value" sourceNode="_z9nxMF4eEe2rXNsIDUvqhw" targetNode="_IhJc0GgpEe24RpwpWgpkFQ">
5235 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/value"/> 5623 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
5236 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/value"/> 5624 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
5237 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_Gl7GTGgpEe24RpwpWgpkFQ" description="_z9q0gV4eEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0"> 5625 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_Gl7GTGgpEe24RpwpWgpkFQ" description="_z9q0gV4eEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
5238 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_Gl7GTmgpEe24RpwpWgpkFQ" showIcon="false"> 5626 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_Gl7GTmgpEe24RpwpWgpkFQ" showIcon="false">
5239 <customFeatures>labelSize</customFeatures> 5627 <customFeatures>labelSize</customFeatures>
@@ -5256,6 +5644,61 @@
5256 </ownedStyle> 5644 </ownedStyle>
5257 <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']"/> 5645 <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']"/>
5258 </ownedDiagramElements> 5646 </ownedDiagramElements>
5647 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_dZ46gBReEe-4k7CzzL6IsA" name="VariableOrNode" tooltipText="" incomingEdges="_dZ9zEhReEe-4k7CzzL6IsA _ChYVqV4fEe2rXNsIDUvqhw" width="12" height="10">
5648 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/>
5649 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/>
5650 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5651 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5652 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5653 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_dZ5hkBReEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
5654 <labelFormat>italic</labelFormat>
5655 <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']/@conditionnalStyles.1/@style"/>
5656 </ownedStyle>
5657 <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']"/>
5658 </ownedDiagramElements>
5659 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_dZ9zEhReEe-4k7CzzL6IsA" visible="false" sourceNode="_A-fmgF4fEe2rXNsIDUvqhw" targetNode="_dZ46gBReEe-4k7CzzL6IsA">
5660 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
5661 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
5662 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_dZ9zExReEe-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
5663 <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"/>
5664 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_dZ9zFBReEe-4k7CzzL6IsA" showIcon="false">
5665 <labelFormat>italic</labelFormat>
5666 </beginLabelStyle>
5667 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_dZ9zFRReEe-4k7CzzL6IsA" showIcon="false"/>
5668 </ownedStyle>
5669 <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']"/>
5670 </ownedDiagramElements>
5671 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_W7ZWoBRqEe-4k7CzzL6IsA" name="Assertion" tooltipText="" outgoingEdges="_z9q0il4eEe2rXNsIDUvqhw _kInl-BRqEe-4k7CzzL6IsA" width="12" height="10">
5672 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5673 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5674 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5675 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5676 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5677 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_W7ZWoRRqEe-4k7CzzL6IsA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
5678 <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"/>
5679 </ownedStyle>
5680 <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']"/>
5681 <ownedElements xmi:type="diagram:DNodeListElement" uid="_bZWIoBRqEe-4k7CzzL6IsA" name="default : EBoolean = false" tooltipText="">
5682 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
5683 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
5684 <ownedStyle xmi:type="diagram:BundledImage" uid="_bZWIoRRqEe-4k7CzzL6IsA" labelAlignment="LEFT">
5685 <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"/>
5686 </ownedStyle>
5687 <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']"/>
5688 </ownedElements>
5689 </ownedDiagramElements>
5690 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_kInl-BRqEe-4k7CzzL6IsA" sourceNode="_W7ZWoBRqEe-4k7CzzL6IsA" targetNode="_z9nxMF4eEe2rXNsIDUvqhw">
5691 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5692 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
5693 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_kIoM8BRqEe-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
5694 <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"/>
5695 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_kIoM8RRqEe-4k7CzzL6IsA" showIcon="false">
5696 <labelFormat>italic</labelFormat>
5697 </beginLabelStyle>
5698 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_kIoM8hRqEe-4k7CzzL6IsA" showIcon="false"/>
5699 </ownedStyle>
5700 <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']"/>
5701 </ownedDiagramElements>
5259 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 5702 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
5260 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_xj8kEF4eEe2rXNsIDUvqhw"/> 5703 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_xj8kEF4eEe2rXNsIDUvqhw"/>
5261 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 5704 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
@@ -5273,94 +5716,63 @@
5273 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-y3k14fEe2rXNsIDUvqhw"/> 5716 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-y3k14fEe2rXNsIDUvqhw"/>
5274 </children> 5717 </children>
5275 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-yQi14fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 5718 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-yQi14fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
5276 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-yQjF4fEe2rXNsIDUvqhw" x="356" y="20"/> 5719 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-yQjF4fEe2rXNsIDUvqhw" x="36" y="36"/>
5277 </children> 5720 </children>
5278 <children xmi:type="notation:Node" xmi:id="_x-y3lF4fEe2rXNsIDUvqhw" type="2003" element="_x-t_EF4fEe2rXNsIDUvqhw"> 5721 <children xmi:type="notation:Node" xmi:id="_x-y3lF4fEe2rXNsIDUvqhw" type="2003" element="_x-t_EF4fEe2rXNsIDUvqhw">
5279 <children xmi:type="notation:Node" xmi:id="_x-y3l14fEe2rXNsIDUvqhw" type="5007"/> 5722 <children xmi:type="notation:Node" xmi:id="_x-y3l14fEe2rXNsIDUvqhw" type="5007"/>
5280 <children xmi:type="notation:Node" xmi:id="_x-y3mF4fEe2rXNsIDUvqhw" type="7004"> 5723 <children xmi:type="notation:Node" xmi:id="_x-y3mF4fEe2rXNsIDUvqhw" type="7004">
5281 <children xmi:type="notation:Node" xmi:id="_x-0FtF4fEe2rXNsIDUvqhw" type="3010" element="_x-wbWF4fEe2rXNsIDUvqhw">
5282 <styles xmi:type="notation:FontStyle" xmi:id="_x-0FtV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5283 <layoutConstraint xmi:type="notation:Location" xmi:id="_x-0Ftl4fEe2rXNsIDUvqhw"/>
5284 </children>
5285 <children xmi:type="notation:Node" xmi:id="_x-0Ft14fEe2rXNsIDUvqhw" type="3010" element="_x-wbWl4fEe2rXNsIDUvqhw">
5286 <styles xmi:type="notation:FontStyle" xmi:id="_x-0FuF4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5287 <layoutConstraint xmi:type="notation:Location" xmi:id="_x-0FuV4fEe2rXNsIDUvqhw"/>
5288 </children>
5289 <styles xmi:type="notation:SortingStyle" xmi:id="_x-y3mV4fEe2rXNsIDUvqhw"/> 5724 <styles xmi:type="notation:SortingStyle" xmi:id="_x-y3mV4fEe2rXNsIDUvqhw"/>
5290 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-y3ml4fEe2rXNsIDUvqhw"/> 5725 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-y3ml4fEe2rXNsIDUvqhw"/>
5291 </children> 5726 </children>
5292 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-y3lV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5727 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-y3lV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5293 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-y3ll4fEe2rXNsIDUvqhw" x="116" y="176"/> 5728 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-y3ll4fEe2rXNsIDUvqhw" x="120" y="192"/>
5294 </children>
5295 <children xmi:type="notation:Node" xmi:id="_x-y3m14fEe2rXNsIDUvqhw" type="2003" element="_x-t_E14fEe2rXNsIDUvqhw">
5296 <children xmi:type="notation:Node" xmi:id="_x-zeoF4fEe2rXNsIDUvqhw" type="5007"/>
5297 <children xmi:type="notation:Node" xmi:id="_x-zeoV4fEe2rXNsIDUvqhw" type="7004">
5298 <styles xmi:type="notation:SortingStyle" xmi:id="_x-zeol4fEe2rXNsIDUvqhw"/>
5299 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-zeo14fEe2rXNsIDUvqhw"/>
5300 </children>
5301 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-y3nF4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5302 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-y3nV4fEe2rXNsIDUvqhw" x="608" y="176"/>
5303 </children>
5304 <children xmi:type="notation:Node" xmi:id="_x-zepF4fEe2rXNsIDUvqhw" type="2003" element="_x-umIF4fEe2rXNsIDUvqhw">
5305 <children xmi:type="notation:Node" xmi:id="_x-0FsF4fEe2rXNsIDUvqhw" type="5007"/>
5306 <children xmi:type="notation:Node" xmi:id="_x-0FsV4fEe2rXNsIDUvqhw" type="7004">
5307 <styles xmi:type="notation:SortingStyle" xmi:id="_x-0Fsl4fEe2rXNsIDUvqhw"/>
5308 <styles xmi:type="notation:FilteringStyle" xmi:id="_x-0Fs14fEe2rXNsIDUvqhw"/>
5309 </children>
5310 <styles xmi:type="notation:ShapeStyle" xmi:id="_x-zepV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5311 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-zepl4fEe2rXNsIDUvqhw" x="356" y="176"/>
5312 </children>
5313 <children xmi:type="notation:Node" xmi:id="_1WZFgF4fEe2rXNsIDUvqhw" type="2003" element="_1WVbIF4fEe2rXNsIDUvqhw">
5314 <children xmi:type="notation:Node" xmi:id="_1WZFg14fEe2rXNsIDUvqhw" type="5007"/>
5315 <children xmi:type="notation:Node" xmi:id="_1WZFhF4fEe2rXNsIDUvqhw" type="7004">
5316 <styles xmi:type="notation:SortingStyle" xmi:id="_1WZFhV4fEe2rXNsIDUvqhw"/>
5317 <styles xmi:type="notation:FilteringStyle" xmi:id="_1WZFhl4fEe2rXNsIDUvqhw"/>
5318 </children>
5319 <styles xmi:type="notation:ShapeStyle" xmi:id="_1WZFgV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5320 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1WZFgl4fEe2rXNsIDUvqhw" x="404" y="584"/>
5321 </children> 5729 </children>
5322 <children xmi:type="notation:Node" xmi:id="_mjEJMF4hEe2rXNsIDUvqhw" type="2003" element="_mi_QsF4hEe2rXNsIDUvqhw"> 5730 <children xmi:type="notation:Node" xmi:id="_mjEJMF4hEe2rXNsIDUvqhw" visible="false" type="2003" element="_mi_QsF4hEe2rXNsIDUvqhw">
5323 <children xmi:type="notation:Node" xmi:id="_mjEJM14hEe2rXNsIDUvqhw" type="5007"/> 5731 <children xmi:type="notation:Node" xmi:id="_mjEJM14hEe2rXNsIDUvqhw" type="5007"/>
5324 <children xmi:type="notation:Node" xmi:id="_mjEJNF4hEe2rXNsIDUvqhw" type="7004"> 5732 <children xmi:type="notation:Node" xmi:id="_mjEJNF4hEe2rXNsIDUvqhw" type="7004">
5325 <styles xmi:type="notation:SortingStyle" xmi:id="_mjEJNV4hEe2rXNsIDUvqhw"/> 5733 <styles xmi:type="notation:SortingStyle" xmi:id="_mjEJNV4hEe2rXNsIDUvqhw"/>
5326 <styles xmi:type="notation:FilteringStyle" xmi:id="_mjEJNl4hEe2rXNsIDUvqhw"/> 5734 <styles xmi:type="notation:FilteringStyle" xmi:id="_mjEJNl4hEe2rXNsIDUvqhw"/>
5327 </children> 5735 </children>
5328 <styles xmi:type="notation:ShapeStyle" xmi:id="_mjEJMV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/> 5736 <styles xmi:type="notation:ShapeStyle" xmi:id="_mjEJMV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8" italic="true"/>
5329 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEJMl4hEe2rXNsIDUvqhw" x="608" y="368"/> 5737 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEJMl4hEe2rXNsIDUvqhw" x="684" y="372"/>
5330 </children> 5738 </children>
5331 <children xmi:type="notation:Node" xmi:id="_vYOzEF4hEe2rXNsIDUvqhw" type="2003" element="_vYLvwF4hEe2rXNsIDUvqhw"> 5739 <children xmi:type="notation:Node" xmi:id="_vYOzEF4hEe2rXNsIDUvqhw" visible="false" type="2003" element="_vYLvwF4hEe2rXNsIDUvqhw">
5332 <children xmi:type="notation:Node" xmi:id="_vYOzE14hEe2rXNsIDUvqhw" type="5007"/> 5740 <children xmi:type="notation:Node" xmi:id="_vYOzE14hEe2rXNsIDUvqhw" type="5007"/>
5333 <children xmi:type="notation:Node" xmi:id="_vYOzFF4hEe2rXNsIDUvqhw" type="7004"> 5741 <children xmi:type="notation:Node" xmi:id="_vYOzFF4hEe2rXNsIDUvqhw" type="7004">
5334 <children xmi:type="notation:Node" xmi:id="_vYOzF14hEe2rXNsIDUvqhw" type="3010" element="_vYM9414hEe2rXNsIDUvqhw"> 5742 <children xmi:type="notation:Node" xmi:id="_vYOzF14hEe2rXNsIDUvqhw" visible="false" type="3010" element="_vYM9414hEe2rXNsIDUvqhw">
5335 <styles xmi:type="notation:FontStyle" xmi:id="_vYOzGF4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5743 <styles xmi:type="notation:FontStyle" xmi:id="_vYOzGF4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5336 <layoutConstraint xmi:type="notation:Location" xmi:id="_vYOzGV4hEe2rXNsIDUvqhw"/> 5744 <layoutConstraint xmi:type="notation:Location" xmi:id="_vYOzGV4hEe2rXNsIDUvqhw"/>
5337 </children> 5745 </children>
5338 <children xmi:type="notation:Node" xmi:id="_3vtKMF63Ee2rXNsIDUvqhw" type="3010" element="_3vrVA163Ee2rXNsIDUvqhw"> 5746 <children xmi:type="notation:Node" xmi:id="_wueTIBRqEe-4k7CzzL6IsA" visible="false" type="3010" element="_wuaowBRqEe-4k7CzzL6IsA">
5339 <styles xmi:type="notation:FontStyle" xmi:id="_3vtKMV63Ee2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5747 <styles xmi:type="notation:FontStyle" xmi:id="_wueTIRRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5340 <layoutConstraint xmi:type="notation:Location" xmi:id="_3vtKMl63Ee2rXNsIDUvqhw"/> 5748 <layoutConstraint xmi:type="notation:Location" xmi:id="_wueTIhRqEe-4k7CzzL6IsA"/>
5749 </children>
5750 <children xmi:type="notation:Node" xmi:id="_wueTIxRqEe-4k7CzzL6IsA" visible="false" type="3010" element="_wuaowhRqEe-4k7CzzL6IsA">
5751 <styles xmi:type="notation:FontStyle" xmi:id="_wueTJBRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5752 <layoutConstraint xmi:type="notation:Location" xmi:id="_wueTJRRqEe-4k7CzzL6IsA"/>
5341 </children> 5753 </children>
5342 <styles xmi:type="notation:SortingStyle" xmi:id="_vYOzFV4hEe2rXNsIDUvqhw"/> 5754 <styles xmi:type="notation:SortingStyle" xmi:id="_vYOzFV4hEe2rXNsIDUvqhw"/>
5343 <styles xmi:type="notation:FilteringStyle" xmi:id="_vYOzFl4hEe2rXNsIDUvqhw"/> 5755 <styles xmi:type="notation:FilteringStyle" xmi:id="_vYOzFl4hEe2rXNsIDUvqhw"/>
5344 </children> 5756 </children>
5345 <styles xmi:type="notation:ShapeStyle" xmi:id="_vYOzEV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5757 <styles xmi:type="notation:ShapeStyle" xmi:id="_vYOzEV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5346 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYOzEl4hEe2rXNsIDUvqhw" x="92" y="380"/> 5758 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYOzEl4hEe2rXNsIDUvqhw" x="168" y="384"/>
5347 </children> 5759 </children>
5348 <children xmi:type="notation:Node" xmi:id="_4xYTwF4hEe2rXNsIDUvqhw" type="2003" element="_4xTbQF4hEe2rXNsIDUvqhw"> 5760 <children xmi:type="notation:Node" xmi:id="_4xYTwF4hEe2rXNsIDUvqhw" visible="false" type="2003" element="_4xTbQF4hEe2rXNsIDUvqhw">
5349 <children xmi:type="notation:Node" xmi:id="_4xYTw14hEe2rXNsIDUvqhw" type="5007"/> 5761 <children xmi:type="notation:Node" xmi:id="_4xYTw14hEe2rXNsIDUvqhw" type="5007"/>
5350 <children xmi:type="notation:Node" xmi:id="_4xYTxF4hEe2rXNsIDUvqhw" type="7004"> 5762 <children xmi:type="notation:Node" xmi:id="_4xYTxF4hEe2rXNsIDUvqhw" type="7004">
5351 <children xmi:type="notation:Node" xmi:id="_4xYTx14hEe2rXNsIDUvqhw" type="3010" element="_4xV3g14hEe2rXNsIDUvqhw"> 5763 <children xmi:type="notation:Node" xmi:id="_4xYTx14hEe2rXNsIDUvqhw" visible="false" type="3010" element="_4xV3g14hEe2rXNsIDUvqhw">
5352 <styles xmi:type="notation:FontStyle" xmi:id="_4xYTyF4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5764 <styles xmi:type="notation:FontStyle" xmi:id="_4xYTyF4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5353 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xYTyV4hEe2rXNsIDUvqhw"/> 5765 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xYTyV4hEe2rXNsIDUvqhw"/>
5354 </children> 5766 </children>
5355 <children xmi:type="notation:Node" xmi:id="_4xYTyl4hEe2rXNsIDUvqhw" type="3010" element="_4xV3hV4hEe2rXNsIDUvqhw"> 5767 <children xmi:type="notation:Node" xmi:id="_4xYTyl4hEe2rXNsIDUvqhw" visible="false" type="3010" element="_4xV3hV4hEe2rXNsIDUvqhw">
5356 <styles xmi:type="notation:FontStyle" xmi:id="_4xYTy14hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5768 <styles xmi:type="notation:FontStyle" xmi:id="_4xYTy14hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5357 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xYTzF4hEe2rXNsIDUvqhw"/> 5769 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xYTzF4hEe2rXNsIDUvqhw"/>
5358 </children> 5770 </children>
5359 <children xmi:type="notation:Node" xmi:id="_4xY60F4hEe2rXNsIDUvqhw" type="3010" element="_4xWekF4hEe2rXNsIDUvqhw"> 5771 <children xmi:type="notation:Node" xmi:id="_4xY60F4hEe2rXNsIDUvqhw" visible="false" type="3010" element="_4xWekF4hEe2rXNsIDUvqhw">
5360 <styles xmi:type="notation:FontStyle" xmi:id="_4xY60V4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5772 <styles xmi:type="notation:FontStyle" xmi:id="_4xY60V4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5361 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xY60l4hEe2rXNsIDUvqhw"/> 5773 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xY60l4hEe2rXNsIDUvqhw"/>
5362 </children> 5774 </children>
5363 <children xmi:type="notation:Node" xmi:id="_4xY6014hEe2rXNsIDUvqhw" type="3010" element="_4xWekl4hEe2rXNsIDUvqhw"> 5775 <children xmi:type="notation:Node" xmi:id="_4xY6014hEe2rXNsIDUvqhw" visible="false" type="3010" element="_4xWekl4hEe2rXNsIDUvqhw">
5364 <styles xmi:type="notation:FontStyle" xmi:id="_4xY61F4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5776 <styles xmi:type="notation:FontStyle" xmi:id="_4xY61F4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5365 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xY61V4hEe2rXNsIDUvqhw"/> 5777 <layoutConstraint xmi:type="notation:Location" xmi:id="_4xY61V4hEe2rXNsIDUvqhw"/>
5366 </children> 5778 </children>
@@ -5368,7 +5780,55 @@
5368 <styles xmi:type="notation:FilteringStyle" xmi:id="_4xYTxl4hEe2rXNsIDUvqhw"/> 5780 <styles xmi:type="notation:FilteringStyle" xmi:id="_4xYTxl4hEe2rXNsIDUvqhw"/>
5369 </children> 5781 </children>
5370 <styles xmi:type="notation:ShapeStyle" xmi:id="_4xYTwV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5782 <styles xmi:type="notation:ShapeStyle" xmi:id="_4xYTwV4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5371 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4xYTwl4hEe2rXNsIDUvqhw" x="144" y="20"/> 5783 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4xYTwl4hEe2rXNsIDUvqhw" x="360" y="24"/>
5784 </children>
5785 <children xmi:type="notation:Node" xmi:id="_nWw4wBOtEe-xzrPFjBSxRw" visible="false" type="2003" element="_nWhBIBOtEe-xzrPFjBSxRw">
5786 <children xmi:type="notation:Node" xmi:id="_nWxf0BOtEe-xzrPFjBSxRw" type="5007"/>
5787 <children xmi:type="notation:Node" xmi:id="_nWyG4BOtEe-xzrPFjBSxRw" type="7004">
5788 <styles xmi:type="notation:SortingStyle" xmi:id="_nWyG4ROtEe-xzrPFjBSxRw"/>
5789 <styles xmi:type="notation:FilteringStyle" xmi:id="_nWyG4hOtEe-xzrPFjBSxRw"/>
5790 </children>
5791 <styles xmi:type="notation:ShapeStyle" xmi:id="_nWw4wROtEe-xzrPFjBSxRw" fontName="Noto Sans" fontHeight="8" italic="true"/>
5792 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nWw4whOtEe-xzrPFjBSxRw" x="360" y="480"/>
5793 </children>
5794 <children xmi:type="notation:Node" xmi:id="_e75ZcBRWEe-4k7CzzL6IsA" visible="false" type="2003" element="_e7zS0BRWEe-4k7CzzL6IsA">
5795 <children xmi:type="notation:Node" xmi:id="_e75ZcxRWEe-4k7CzzL6IsA" type="5007"/>
5796 <children xmi:type="notation:Node" xmi:id="_e75ZdBRWEe-4k7CzzL6IsA" type="7004">
5797 <styles xmi:type="notation:SortingStyle" xmi:id="_e75ZdRRWEe-4k7CzzL6IsA"/>
5798 <styles xmi:type="notation:FilteringStyle" xmi:id="_e75ZdhRWEe-4k7CzzL6IsA"/>
5799 </children>
5800 <styles xmi:type="notation:ShapeStyle" xmi:id="_e75ZcRRWEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8" italic="true"/>
5801 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_e75ZchRWEe-4k7CzzL6IsA" x="492" y="180"/>
5802 </children>
5803 <children xmi:type="notation:Node" xmi:id="_mJXFsBRWEe-4k7CzzL6IsA" visible="false" type="2003" element="_mJSNMBRWEe-4k7CzzL6IsA">
5804 <children xmi:type="notation:Node" xmi:id="_mJXFsxRWEe-4k7CzzL6IsA" type="5007"/>
5805 <children xmi:type="notation:Node" xmi:id="_mJXFtBRWEe-4k7CzzL6IsA" type="7004">
5806 <styles xmi:type="notation:SortingStyle" xmi:id="_mJXFtRRWEe-4k7CzzL6IsA"/>
5807 <styles xmi:type="notation:FilteringStyle" xmi:id="_mJXFthRWEe-4k7CzzL6IsA"/>
5808 </children>
5809 <styles xmi:type="notation:ShapeStyle" xmi:id="_mJXFsRRWEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8" italic="true"/>
5810 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mJXFshRWEe-4k7CzzL6IsA" x="95" y="480"/>
5811 </children>
5812 <children xmi:type="notation:Node" xmi:id="_wudsFhRqEe-4k7CzzL6IsA" type="2003" element="_wuYMgBRqEe-4k7CzzL6IsA">
5813 <children xmi:type="notation:Node" xmi:id="_wudsGRRqEe-4k7CzzL6IsA" type="5007"/>
5814 <children xmi:type="notation:Node" xmi:id="_wudsGhRqEe-4k7CzzL6IsA" type="7004">
5815 <children xmi:type="notation:Node" xmi:id="_wueTJhRqEe-4k7CzzL6IsA" type="3010" element="_wubP0BRqEe-4k7CzzL6IsA">
5816 <styles xmi:type="notation:FontStyle" xmi:id="_wueTJxRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5817 <layoutConstraint xmi:type="notation:Location" xmi:id="_wueTKBRqEe-4k7CzzL6IsA"/>
5818 </children>
5819 <children xmi:type="notation:Node" xmi:id="_wueTKRRqEe-4k7CzzL6IsA" type="3010" element="_wubP0hRqEe-4k7CzzL6IsA">
5820 <styles xmi:type="notation:FontStyle" xmi:id="_wueTKhRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5821 <layoutConstraint xmi:type="notation:Location" xmi:id="_wueTKxRqEe-4k7CzzL6IsA"/>
5822 </children>
5823 <children xmi:type="notation:Node" xmi:id="_wueTLBRqEe-4k7CzzL6IsA" type="3010" element="_wubP1BRqEe-4k7CzzL6IsA">
5824 <styles xmi:type="notation:FontStyle" xmi:id="_wueTLRRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5825 <layoutConstraint xmi:type="notation:Location" xmi:id="_wueTLhRqEe-4k7CzzL6IsA"/>
5826 </children>
5827 <styles xmi:type="notation:SortingStyle" xmi:id="_wudsGxRqEe-4k7CzzL6IsA"/>
5828 <styles xmi:type="notation:FilteringStyle" xmi:id="_wudsHBRqEe-4k7CzzL6IsA"/>
5829 </children>
5830 <styles xmi:type="notation:ShapeStyle" xmi:id="_wudsFxRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8" italic="true"/>
5831 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wudsGBRqEe-4k7CzzL6IsA" x="240" y="36"/>
5372 </children> 5832 </children>
5373 <styles xmi:type="notation:DiagramStyle" xmi:id="_sCFolF4fEe2rXNsIDUvqhw"/> 5833 <styles xmi:type="notation:DiagramStyle" xmi:id="_sCFolF4fEe2rXNsIDUvqhw"/>
5374 <edges xmi:type="notation:Edge" xmi:id="_x-0sw14fEe2rXNsIDUvqhw" type="4001" element="_x-xpcV4fEe2rXNsIDUvqhw" source="_x-y3lF4fEe2rXNsIDUvqhw" target="_x-yQil4fEe2rXNsIDUvqhw"> 5834 <edges xmi:type="notation:Edge" xmi:id="_x-0sw14fEe2rXNsIDUvqhw" type="4001" element="_x-xpcV4fEe2rXNsIDUvqhw" source="_x-y3lF4fEe2rXNsIDUvqhw" target="_x-yQil4fEe2rXNsIDUvqhw">
@@ -5384,149 +5844,101 @@
5384 <styles xmi:type="notation:ConnectorStyle" xmi:id="_x-0sxF4fEe2rXNsIDUvqhw" routing="Tree"/> 5844 <styles xmi:type="notation:ConnectorStyle" xmi:id="_x-0sxF4fEe2rXNsIDUvqhw" routing="Tree"/>
5385 <styles xmi:type="notation:FontStyle" xmi:id="_x-0sxV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5845 <styles xmi:type="notation:FontStyle" xmi:id="_x-0sxV4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5386 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_x-0sxl4fEe2rXNsIDUvqhw" points="[0, 0, 12, 12]$[-12, -12, 0, 0]"/> 5846 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_x-0sxl4fEe2rXNsIDUvqhw" points="[0, 0, 12, 12]$[-12, -12, 0, 0]"/>
5387 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-0szV4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5847 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_STXQEBOwEe-4k7CzzL6IsA" id="(0.2627118644067797,0.10204081632653061)"/>
5388 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-0szl4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5848 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-0szl4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5389 </edges> 5849 </edges>
5390 <edges xmi:type="notation:Edge" xmi:id="_x-0sz14fEe2rXNsIDUvqhw" type="4001" element="_x-xpeF4fEe2rXNsIDUvqhw" source="_x-y3m14fEe2rXNsIDUvqhw" target="_x-yQil4fEe2rXNsIDUvqhw"> 5850 <edges xmi:type="notation:Edge" xmi:id="_wue6MBRqEe-4k7CzzL6IsA" visible="false" type="4001" element="_wub25hRqEe-4k7CzzL6IsA" source="_wudsFhRqEe-4k7CzzL6IsA" target="_mJXFsBRWEe-4k7CzzL6IsA">
5391 <children xmi:type="notation:Node" xmi:id="_x-0s014fEe2rXNsIDUvqhw" type="6001"> 5851 <children xmi:type="notation:Node" xmi:id="_wue6NBRqEe-4k7CzzL6IsA" type="6001">
5392 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-0s1F4fEe2rXNsIDUvqhw" y="-10"/> 5852 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wue6NRRqEe-4k7CzzL6IsA" y="-10"/>
5393 </children>
5394 <children xmi:type="notation:Node" xmi:id="_x-0s1V4fEe2rXNsIDUvqhw" type="6002">
5395 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-0s1l4fEe2rXNsIDUvqhw" y="10"/>
5396 </children>
5397 <children xmi:type="notation:Node" xmi:id="_x-0s114fEe2rXNsIDUvqhw" type="6003">
5398 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-0s2F4fEe2rXNsIDUvqhw" y="10"/>
5399 </children>
5400 <styles xmi:type="notation:ConnectorStyle" xmi:id="_x-0s0F4fEe2rXNsIDUvqhw" routing="Tree"/>
5401 <styles xmi:type="notation:FontStyle" xmi:id="_x-0s0V4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5402 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_x-0s0l4fEe2rXNsIDUvqhw" points="[0, 0, 24, 24]$[-24, -24, 0, 0]"/>
5403 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-1T0F4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5404 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-1T0V4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5405 </edges>
5406 <edges xmi:type="notation:Edge" xmi:id="_x-1T0l4fEe2rXNsIDUvqhw" type="4001" element="_x-yQg14fEe2rXNsIDUvqhw" source="_x-zepF4fEe2rXNsIDUvqhw" target="_x-yQil4fEe2rXNsIDUvqhw">
5407 <children xmi:type="notation:Node" xmi:id="_x-1T1l4fEe2rXNsIDUvqhw" type="6001">
5408 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-1T114fEe2rXNsIDUvqhw" y="-10"/>
5409 </children>
5410 <children xmi:type="notation:Node" xmi:id="_x-1T2F4fEe2rXNsIDUvqhw" type="6002">
5411 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-1T2V4fEe2rXNsIDUvqhw" y="10"/>
5412 </children>
5413 <children xmi:type="notation:Node" xmi:id="_x-1T2l4fEe2rXNsIDUvqhw" type="6003">
5414 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x-1T214fEe2rXNsIDUvqhw" y="10"/>
5415 </children>
5416 <styles xmi:type="notation:ConnectorStyle" xmi:id="_x-1T014fEe2rXNsIDUvqhw" routing="Tree"/>
5417 <styles xmi:type="notation:FontStyle" xmi:id="_x-1T1F4fEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/>
5418 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_x-1T1V4fEe2rXNsIDUvqhw" points="[0, 0, 36, 36]$[-36, -36, 0, 0]"/>
5419 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-1T3F4fEe2rXNsIDUvqhw" id="(0.3389830508474576,0.0)"/>
5420 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_x-1T3V4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5421 </edges>
5422 <edges xmi:type="notation:Edge" xmi:id="_1WZFh14fEe2rXNsIDUvqhw" type="4001" element="_1WX3YF4fEe2rXNsIDUvqhw" source="_x-zepF4fEe2rXNsIDUvqhw" target="_1WZFgF4fEe2rXNsIDUvqhw">
5423 <children xmi:type="notation:Node" xmi:id="_1WZFi14fEe2rXNsIDUvqhw" type="6001">
5424 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1WZFjF4fEe2rXNsIDUvqhw" x="-76" y="-100"/>
5425 </children>
5426 <children xmi:type="notation:Node" xmi:id="_1WZskF4fEe2rXNsIDUvqhw" type="6002">
5427 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1WZskV4fEe2rXNsIDUvqhw" x="-25"/>
5428 </children>
5429 <children xmi:type="notation:Node" xmi:id="_1WZskl4fEe2rXNsIDUvqhw" type="6003">
5430 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1WZsk14fEe2rXNsIDUvqhw" x="-86"/>
5431 </children>
5432 <styles xmi:type="notation:ConnectorStyle" xmi:id="_1WZFiF4fEe2rXNsIDUvqhw" routing="Rectilinear"/>
5433 <styles xmi:type="notation:FontStyle" xmi:id="_1WZFiV4fEe2rXNsIDUvqhw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5434 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_1WZFil4fEe2rXNsIDUvqhw" points="[4, 49, -44, -359]$[4, 191, -44, -217]$[43, 191, -5, -217]$[43, 359, -5, -49]"/>
5435 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_1WZslF4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5436 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_1WZslV4fEe2rXNsIDUvqhw" id="(0.5,0.5)"/>
5437 </edges>
5438 <edges xmi:type="notation:Edge" xmi:id="_mjEwQF4hEe2rXNsIDUvqhw" type="4001" element="_mjCUBl4hEe2rXNsIDUvqhw" source="_x-y3m14fEe2rXNsIDUvqhw" target="_mjEJMF4hEe2rXNsIDUvqhw">
5439 <children xmi:type="notation:Node" xmi:id="_mjEwRF4hEe2rXNsIDUvqhw" type="6001">
5440 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEwRV4hEe2rXNsIDUvqhw" x="-17" y="1"/>
5441 </children> 5853 </children>
5442 <children xmi:type="notation:Node" xmi:id="_mjEwRl4hEe2rXNsIDUvqhw" type="6002"> 5854 <children xmi:type="notation:Node" xmi:id="_wufhQBRqEe-4k7CzzL6IsA" type="6002">
5443 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEwR14hEe2rXNsIDUvqhw" x="10"/> 5855 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wufhQRRqEe-4k7CzzL6IsA" y="10"/>
5444 </children> 5856 </children>
5445 <children xmi:type="notation:Node" xmi:id="_mjEwSF4hEe2rXNsIDUvqhw" type="6003"> 5857 <children xmi:type="notation:Node" xmi:id="_wufhQhRqEe-4k7CzzL6IsA" type="6003">
5446 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEwSV4hEe2rXNsIDUvqhw" x="10"/> 5858 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wufhQxRqEe-4k7CzzL6IsA" y="10"/>
5447 </children> 5859 </children>
5448 <styles xmi:type="notation:ConnectorStyle" xmi:id="_mjEwQV4hEe2rXNsIDUvqhw" routing="Rectilinear"/> 5860 <styles xmi:type="notation:ConnectorStyle" xmi:id="_wue6MRRqEe-4k7CzzL6IsA" routing="Rectilinear"/>
5449 <styles xmi:type="notation:FontStyle" xmi:id="_mjEwQl4hEe2rXNsIDUvqhw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 5861 <styles xmi:type="notation:FontStyle" xmi:id="_wue6MhRqEe-4k7CzzL6IsA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5450 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mjEwQ14hEe2rXNsIDUvqhw" points="[1, 49, 1, -143]$[1, 143, 1, -49]"/> 5862 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_wue6MxRqEe-4k7CzzL6IsA" points="[-60, 0, 1322, 63]$[-710, 0, 672, 63]$[-710, -63, 672, 0]$[-1361, -63, 21, 0]"/>
5451 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjEwSl4hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5863 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wufhRBRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5452 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjEwS14hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5864 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wufhRRRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5453 </edges> 5865 </edges>
5454 <edges xmi:type="notation:Edge" xmi:id="_mjEwTF4hEe2rXNsIDUvqhw" type="4001" element="_mjCUDV4hEe2rXNsIDUvqhw" source="_x-zepF4fEe2rXNsIDUvqhw" target="_mjEJMF4hEe2rXNsIDUvqhw"> 5866 <edges xmi:type="notation:Edge" xmi:id="_wufhRhRqEe-4k7CzzL6IsA" visible="false" type="4001" element="_wucd8xRqEe-4k7CzzL6IsA" source="_wudsFhRqEe-4k7CzzL6IsA" target="_e75ZcBRWEe-4k7CzzL6IsA">
5455 <children xmi:type="notation:Node" xmi:id="_mjEwUF4hEe2rXNsIDUvqhw" type="6001"> 5867 <children xmi:type="notation:Node" xmi:id="_wugIUxRqEe-4k7CzzL6IsA" type="6001">
5456 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEwUV4hEe2rXNsIDUvqhw" x="-131" y="5"/> 5868 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugIVBRqEe-4k7CzzL6IsA" y="-10"/>
5457 </children> 5869 </children>
5458 <children xmi:type="notation:Node" xmi:id="_mjEwUl4hEe2rXNsIDUvqhw" type="6002"> 5870 <children xmi:type="notation:Node" xmi:id="_wugIVRRqEe-4k7CzzL6IsA" type="6002">
5459 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjEwU14hEe2rXNsIDUvqhw" x="-25" y="10"/> 5871 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugIVhRqEe-4k7CzzL6IsA" y="10"/>
5460 </children> 5872 </children>
5461 <children xmi:type="notation:Node" xmi:id="_mjFXUF4hEe2rXNsIDUvqhw" type="6003"> 5873 <children xmi:type="notation:Node" xmi:id="_wugIVxRqEe-4k7CzzL6IsA" type="6003">
5462 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjFXUV4hEe2rXNsIDUvqhw" x="-36" y="-100"/> 5874 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugIWBRqEe-4k7CzzL6IsA" y="10"/>
5463 </children> 5875 </children>
5464 <styles xmi:type="notation:ConnectorStyle" xmi:id="_mjEwTV4hEe2rXNsIDUvqhw" routing="Rectilinear"/> 5876 <styles xmi:type="notation:ConnectorStyle" xmi:id="_wugIUBRqEe-4k7CzzL6IsA" routing="Rectilinear"/>
5465 <styles xmi:type="notation:FontStyle" xmi:id="_mjEwTl4hEe2rXNsIDUvqhw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 5877 <styles xmi:type="notation:FontStyle" xmi:id="_wugIURRqEe-4k7CzzL6IsA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5466 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mjEwT14hEe2rXNsIDUvqhw" points="[59, 11, -193, -181]$[109, 11, -143, -181]$[109, 193, -143, 1]$[193, 193, -59, 1]"/> 5878 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_wugIUhRqEe-4k7CzzL6IsA" points="[-60, 0, 925, 363]$[-521, 0, 464, 363]$[-521, -363, 464, 0]$[-983, -363, 2, 0]"/>
5467 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjFXUl4hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5879 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wugvYBRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5468 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjFXU14hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5880 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wugvYRRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5469 </edges> 5881 </edges>
5470 <edges xmi:type="notation:Edge" xmi:id="_mjFXVF4hEe2rXNsIDUvqhw" type="4001" element="_mjC7Il4hEe2rXNsIDUvqhw" source="_1WZFgF4fEe2rXNsIDUvqhw" target="_mjEJMF4hEe2rXNsIDUvqhw"> 5882 <edges xmi:type="notation:Edge" xmi:id="_wugvYhRqEe-4k7CzzL6IsA" visible="false" type="4001" element="_wudFAxRqEe-4k7CzzL6IsA" source="_wudsFhRqEe-4k7CzzL6IsA" target="_nWw4wBOtEe-xzrPFjBSxRw">
5471 <children xmi:type="notation:Node" xmi:id="_mjFXWF4hEe2rXNsIDUvqhw" type="6001"> 5883 <children xmi:type="notation:Node" xmi:id="_wugvZhRqEe-4k7CzzL6IsA" type="6001">
5472 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjFXWV4hEe2rXNsIDUvqhw" y="-10"/> 5884 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugvZxRqEe-4k7CzzL6IsA" y="-10"/>
5473 </children> 5885 </children>
5474 <children xmi:type="notation:Node" xmi:id="_mjFXWl4hEe2rXNsIDUvqhw" type="6002"> 5886 <children xmi:type="notation:Node" xmi:id="_wugvaBRqEe-4k7CzzL6IsA" type="6002">
5475 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjFXW14hEe2rXNsIDUvqhw" y="10"/> 5887 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugvaRRqEe-4k7CzzL6IsA" y="10"/>
5476 </children> 5888 </children>
5477 <children xmi:type="notation:Node" xmi:id="_mjFXXF4hEe2rXNsIDUvqhw" type="6003"> 5889 <children xmi:type="notation:Node" xmi:id="_wugvahRqEe-4k7CzzL6IsA" type="6003">
5478 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mjFXXV4hEe2rXNsIDUvqhw" y="10"/> 5890 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wugvaxRqEe-4k7CzzL6IsA" y="10"/>
5479 </children> 5891 </children>
5480 <styles xmi:type="notation:ConnectorStyle" xmi:id="_mjFXVV4hEe2rXNsIDUvqhw" routing="Tree"/> 5892 <styles xmi:type="notation:ConnectorStyle" xmi:id="_wugvYxRqEe-4k7CzzL6IsA" routing="Rectilinear"/>
5481 <styles xmi:type="notation:FontStyle" xmi:id="_mjFXVl4hEe2rXNsIDUvqhw" fontName="Noto Sans" fontHeight="8"/> 5893 <styles xmi:type="notation:FontStyle" xmi:id="_wugvZBRqEe-4k7CzzL6IsA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
5482 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mjFXV14hEe2rXNsIDUvqhw" points="[26, 1, -688, -26]$[654, 24, -60, -3]"/> 5894 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_wugvZRRqEe-4k7CzzL6IsA" points="[-60, 0, 1057, 63]$[-580, 0, 537, 63]$[-580, -63, 537, 0]$[-1100, -63, 17, 0]"/>
5483 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjFXXl4hEe2rXNsIDUvqhw" id="(0.7966101694915254,0.11224489795918367)"/> 5895 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wuhWcBRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5484 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mjFXX14hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5896 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wuhWcRRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5485 </edges> 5897 </edges>
5486 <edges xmi:type="notation:Edge" xmi:id="_vYOzIF4hEe2rXNsIDUvqhw" type="4001" element="_vYNlAl4hEe2rXNsIDUvqhw" source="_x-y3lF4fEe2rXNsIDUvqhw" target="_vYOzEF4hEe2rXNsIDUvqhw"> 5898 <edges xmi:type="notation:Edge" xmi:id="_xsGZBhRqEe-4k7CzzL6IsA" type="4001" element="_xrullhRqEe-4k7CzzL6IsA" source="_x-y3lF4fEe2rXNsIDUvqhw" target="_wudsFhRqEe-4k7CzzL6IsA">
5487 <children xmi:type="notation:Node" xmi:id="_vYPaIF4hEe2rXNsIDUvqhw" type="6001"> 5899 <children xmi:type="notation:Node" xmi:id="_xsGZChRqEe-4k7CzzL6IsA" type="6001">
5488 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYPaIV4hEe2rXNsIDUvqhw" x="-10"/> 5900 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xsGZCxRqEe-4k7CzzL6IsA" y="-10"/>
5489 </children> 5901 </children>
5490 <children xmi:type="notation:Node" xmi:id="_vYPaIl4hEe2rXNsIDUvqhw" type="6002"> 5902 <children xmi:type="notation:Node" xmi:id="_xsGZDBRqEe-4k7CzzL6IsA" type="6002">
5491 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYPaI14hEe2rXNsIDUvqhw" x="10"/> 5903 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xsGZDRRqEe-4k7CzzL6IsA" y="10"/>
5492 </children> 5904 </children>
5493 <children xmi:type="notation:Node" xmi:id="_vYPaJF4hEe2rXNsIDUvqhw" type="6003"> 5905 <children xmi:type="notation:Node" xmi:id="_xsGZDhRqEe-4k7CzzL6IsA" type="6003">
5494 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYPaJV4hEe2rXNsIDUvqhw" x="10"/> 5906 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xsGZDxRqEe-4k7CzzL6IsA" y="10"/>
5495 </children> 5907 </children>
5496 <styles xmi:type="notation:ConnectorStyle" xmi:id="_vYOzIV4hEe2rXNsIDUvqhw" routing="Rectilinear"/> 5908 <styles xmi:type="notation:ConnectorStyle" xmi:id="_xsGZBxRqEe-4k7CzzL6IsA" routing="Tree"/>
5497 <styles xmi:type="notation:FontStyle" xmi:id="_vYOzIl4hEe2rXNsIDUvqhw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 5909 <styles xmi:type="notation:FontStyle" xmi:id="_xsGZCBRqEe-4k7CzzL6IsA" fontName="Noto Sans" fontHeight="8"/>
5498 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vYOzI14hEe2rXNsIDUvqhw" points="[0, 49, 7, -155]$[0, 155, 7, -49]"/> 5910 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_xsGZCRRqEe-4k7CzzL6IsA" points="[0, 0, -72, 144]$[72, -144, 0, 0]"/>
5499 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vYPaJl4hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5911 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xsGZEBRqEe-4k7CzzL6IsA" id="(0.7627118644067796,0.14285714285714285)"/>
5500 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vYPaJ14hEe2rXNsIDUvqhw" id="(0.5,0.5)"/> 5912 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xsGZERRqEe-4k7CzzL6IsA" id="(0.5,0.5)"/>
5501 </edges> 5913 </edges>
5502 </data> 5914 </data>
5503 </ownedAnnotationEntries> 5915 </ownedAnnotationEntries>
5504 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_sCG2sV4fEe2rXNsIDUvqhw" source="DANNOTATION_CUSTOMIZATION_KEY"> 5916 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_sCG2sV4fEe2rXNsIDUvqhw" source="DANNOTATION_CUSTOMIZATION_KEY">
5505 <data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_sCG2sl4fEe2rXNsIDUvqhw"> 5917 <data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_sCG2sl4fEe2rXNsIDUvqhw">
5506 <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_1WX3YV4fEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan"> 5918 <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_wub25xRqEe-4k7CzzL6IsA" sourceArrow="FillDiamond" routingStyle="manhattan">
5507 <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> 5919 <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
5508 <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_1WX3Yl4fEe2rXNsIDUvqhw" showIcon="false" labelExpression="service:render"> 5920 <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_wub26BRqEe-4k7CzzL6IsA" showIcon="false" labelExpression="service:render">
5509 <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> 5921 <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
5510 </centerLabelStyleDescription> 5922 </centerLabelStyleDescription>
5511 <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_1WX3Y14fEe2rXNsIDUvqhw" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel"> 5923 <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_wub26RRqEe-4k7CzzL6IsA" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
5512 <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/> 5924 <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
5513 </endLabelStyleDescription> 5925 </endLabelStyleDescription>
5514 </computedStyleDescriptions> 5926 </computedStyleDescriptions>
5515 </data> 5927 </data>
5516 </ownedAnnotationEntries> 5928 </ownedAnnotationEntries>
5517 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-tYAF4fEe2rXNsIDUvqhw" name="Action" tooltipText="" incomingEdges="_x-xpcV4fEe2rXNsIDUvqhw _x-xpeF4fEe2rXNsIDUvqhw _x-yQg14fEe2rXNsIDUvqhw" width="12" height="10"> 5929 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-tYAF4fEe2rXNsIDUvqhw" name="Action" tooltipText="" incomingEdges="_x-xpcV4fEe2rXNsIDUvqhw" width="12" height="10">
5518 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Action"/> 5930 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Action"/>
5519 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Action"/> 5931 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Action"/>
5520 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5932 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5521 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 5933 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5522 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 5934 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5523 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_x-tYAV4fEe2rXNsIDUvqhw" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228"> 5935 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_tGqe8RRqEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
5524 <labelFormat>italic</labelFormat> 5936 <labelFormat>italic</labelFormat>
5525 <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']/@conditionnalStyles.1/@style"/> 5937 <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']/@conditionnalStyles.0/@style"/>
5526 </ownedStyle> 5938 </ownedStyle>
5527 <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']"/> 5939 <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']"/>
5528 </ownedDiagramElements> 5940 </ownedDiagramElements>
5529 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-t_EF4fEe2rXNsIDUvqhw" name="AssertionAction" tooltipText="" outgoingEdges="_x-xpcV4fEe2rXNsIDUvqhw _vYNlAl4hEe2rXNsIDUvqhw" width="12" height="10"> 5941 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-t_EF4fEe2rXNsIDUvqhw" name="AssertionAction" tooltipText="" outgoingEdges="_x-xpcV4fEe2rXNsIDUvqhw _xrullhRqEe-4k7CzzL6IsA" width="12" height="10">
5530 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/> 5942 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
5531 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/> 5943 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
5532 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5944 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -5536,108 +5948,23 @@
5536 <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"/> 5948 <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"/>
5537 </ownedStyle> 5949 </ownedStyle>
5538 <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']"/> 5950 <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']"/>
5539 <ownedElements xmi:type="diagram:DNodeListElement" uid="_x-wbWF4fEe2rXNsIDUvqhw" name="value : LogicValue = TRUE" tooltipText="">
5540 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AssertionAction/value"/>
5541 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AssertionAction/value"/>
5542 <ownedStyle xmi:type="diagram:BundledImage" uid="_x-wbWV4fEe2rXNsIDUvqhw" labelAlignment="LEFT">
5543 <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"/>
5544 </ownedStyle>
5545 <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']"/>
5546 </ownedElements>
5547 <ownedElements xmi:type="diagram:DNodeListElement" uid="_x-wbWl4fEe2rXNsIDUvqhw" name="overwrite : EBoolean = FALSE" tooltipText="">
5548 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AssertionAction/overwrite"/>
5549 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//AssertionAction/overwrite"/>
5550 <ownedStyle xmi:type="diagram:BundledImage" uid="_x-xCYF4fEe2rXNsIDUvqhw" labelAlignment="LEFT">
5551 <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"/>
5552 </ownedStyle>
5553 <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']"/>
5554 </ownedElements>
5555 </ownedDiagramElements>
5556 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-t_E14fEe2rXNsIDUvqhw" name="DeleteAction" tooltipText="" outgoingEdges="_x-xpeF4fEe2rXNsIDUvqhw _mjCUBl4hEe2rXNsIDUvqhw" width="12" height="10">
5557 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//DeleteAction"/>
5558 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//DeleteAction"/>
5559 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5560 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5561 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5562 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_x-t_FF4fEe2rXNsIDUvqhw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
5563 <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"/>
5564 </ownedStyle>
5565 <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']"/>
5566 </ownedDiagramElements>
5567 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_x-umIF4fEe2rXNsIDUvqhw" name="NewAction" tooltipText="" outgoingEdges="_x-yQg14fEe2rXNsIDUvqhw _1WX3YF4fEe2rXNsIDUvqhw _mjCUDV4hEe2rXNsIDUvqhw" width="12" height="10">
5568 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewAction"/>
5569 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewAction"/>
5570 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5571 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5572 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5573 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_x-umIV4fEe2rXNsIDUvqhw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
5574 <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"/>
5575 </ownedStyle>
5576 <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']"/>
5577 </ownedDiagramElements> 5951 </ownedDiagramElements>
5578 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_x-xpcV4fEe2rXNsIDUvqhw" sourceNode="_x-t_EF4fEe2rXNsIDUvqhw" targetNode="_x-tYAF4fEe2rXNsIDUvqhw"> 5952 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_x-xpcV4fEe2rXNsIDUvqhw" sourceNode="_x-t_EF4fEe2rXNsIDUvqhw" targetNode="_x-tYAF4fEe2rXNsIDUvqhw">
5579 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/> 5953 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
5580 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/> 5954 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
5581 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_x-xpcl4fEe2rXNsIDUvqhw" targetArrow="InputClosedArrow" routingStyle="tree"> 5955 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_tGrGBhRqEe-4k7CzzL6IsA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
5582 <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"/> 5956 <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"/>
5583 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_x-xpc14fEe2rXNsIDUvqhw" showIcon="false"> 5957 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_tGrGBxRqEe-4k7CzzL6IsA" showIcon="false">
5584 <labelFormat>italic</labelFormat>
5585 </beginLabelStyle>
5586 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_x-xpdF4fEe2rXNsIDUvqhw" showIcon="false"/>
5587 </ownedStyle>
5588 <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']"/>
5589 </ownedDiagramElements>
5590 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_x-xpeF4fEe2rXNsIDUvqhw" sourceNode="_x-t_E14fEe2rXNsIDUvqhw" targetNode="_x-tYAF4fEe2rXNsIDUvqhw">
5591 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//DeleteAction"/>
5592 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//DeleteAction"/>
5593 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_x-xpeV4fEe2rXNsIDUvqhw" targetArrow="InputClosedArrow" routingStyle="tree">
5594 <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"/>
5595 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_x-xpel4fEe2rXNsIDUvqhw" showIcon="false">
5596 <labelFormat>italic</labelFormat>
5597 </beginLabelStyle>
5598 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_x-xpe14fEe2rXNsIDUvqhw" showIcon="false"/>
5599 </ownedStyle>
5600 <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']"/>
5601 </ownedDiagramElements>
5602 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_x-yQg14fEe2rXNsIDUvqhw" sourceNode="_x-umIF4fEe2rXNsIDUvqhw" targetNode="_x-tYAF4fEe2rXNsIDUvqhw">
5603 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewAction"/>
5604 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewAction"/>
5605 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_x-yQhF4fEe2rXNsIDUvqhw" targetArrow="InputClosedArrow" routingStyle="tree">
5606 <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"/>
5607 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_x-yQhV4fEe2rXNsIDUvqhw" showIcon="false">
5608 <labelFormat>italic</labelFormat> 5958 <labelFormat>italic</labelFormat>
5609 </beginLabelStyle> 5959 </beginLabelStyle>
5610 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_x-yQhl4fEe2rXNsIDUvqhw" showIcon="false"/> 5960 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_tGrGCBRqEe-4k7CzzL6IsA" showIcon="false"/>
5611 </ownedStyle> 5961 </ownedStyle>
5612 <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']"/> 5962 <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']"/>
5613 </ownedDiagramElements> 5963 </ownedDiagramElements>
5614 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_1WVbIF4fEe2rXNsIDUvqhw" name="NewVariable" tooltipText="" outgoingEdges="_mjC7Il4hEe2rXNsIDUvqhw" incomingEdges="_1WX3YF4fEe2rXNsIDUvqhw" width="12" height="10"> 5964 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mi_QsF4hEe2rXNsIDUvqhw" name="VariableOrNode" visible="false" tooltipText="" width="12" height="10">
5615 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewVariable"/>
5616 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewVariable"/>
5617 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5618 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5619 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
5620 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_1WVbIV4fEe2rXNsIDUvqhw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
5621 <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"/>
5622 </ownedStyle>
5623 <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']"/>
5624 </ownedDiagramElements>
5625 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_1WX3YF4fEe2rXNsIDUvqhw" name="[0..1] variable" sourceNode="_x-umIF4fEe2rXNsIDUvqhw" targetNode="_1WVbIF4fEe2rXNsIDUvqhw">
5626 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NewAction/variable"/>
5627 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NewAction/variable"/>
5628 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_1WX3ZF4fEe2rXNsIDUvqhw" description="_1WX3YV4fEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
5629 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_1WX3Zl4fEe2rXNsIDUvqhw" showIcon="false">
5630 <customFeatures>labelSize</customFeatures>
5631 </centerLabelStyle>
5632 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_1WX3ZV4fEe2rXNsIDUvqhw" showIcon="false" labelColor="39,76,114">
5633 <customFeatures>labelSize</customFeatures>
5634 </endLabelStyle>
5635 </ownedStyle>
5636 <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']"/>
5637 </ownedDiagramElements>
5638 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mi_QsF4hEe2rXNsIDUvqhw" name="VariableOrNode" tooltipText="" incomingEdges="_mjCUBl4hEe2rXNsIDUvqhw _mjCUDV4hEe2rXNsIDUvqhw _mjC7Il4hEe2rXNsIDUvqhw" width="12" height="10">
5639 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/> 5965 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/>
5640 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/> 5966 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//VariableOrNode"/>
5967 <graphicalFilters xmi:type="diagram:HideFilter" uid="_IgckgBOwEe-4k7CzzL6IsA"/>
5641 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5968 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5642 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 5969 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5643 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 5970 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
@@ -5647,49 +5974,10 @@
5647 </ownedStyle> 5974 </ownedStyle>
5648 <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']"/> 5975 <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']"/>
5649 </ownedDiagramElements> 5976 </ownedDiagramElements>
5650 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_mjCUBl4hEe2rXNsIDUvqhw" name="[0..1] variableOrNode" sourceNode="_x-t_E14fEe2rXNsIDUvqhw" targetNode="_mi_QsF4hEe2rXNsIDUvqhw"> 5977 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_vYLvwF4hEe2rXNsIDUvqhw" name="Atom" visible="false" tooltipText="" width="12" height="10">
5651 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//DeleteAction/variableOrNode"/>
5652 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//DeleteAction/variableOrNode"/>
5653 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_mjCUB14hEe2rXNsIDUvqhw" routingStyle="manhattan" strokeColor="0,0,0">
5654 <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"/>
5655 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_mjCUCV4hEe2rXNsIDUvqhw" showIcon="false">
5656 <customFeatures>labelSize</customFeatures>
5657 </centerLabelStyle>
5658 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_mjCUCF4hEe2rXNsIDUvqhw" showIcon="false" labelColor="39,76,114">
5659 <customFeatures>labelSize</customFeatures>
5660 </endLabelStyle>
5661 </ownedStyle>
5662 <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']"/>
5663 </ownedDiagramElements>
5664 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_mjCUDV4hEe2rXNsIDUvqhw" name="[0..1] parent" sourceNode="_x-umIF4fEe2rXNsIDUvqhw" targetNode="_mi_QsF4hEe2rXNsIDUvqhw">
5665 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NewAction/parent"/>
5666 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NewAction/parent"/>
5667 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_mjCUDl4hEe2rXNsIDUvqhw" routingStyle="manhattan" strokeColor="0,0,0">
5668 <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"/>
5669 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_mjCUEF4hEe2rXNsIDUvqhw" showIcon="false">
5670 <customFeatures>labelSize</customFeatures>
5671 </centerLabelStyle>
5672 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_mjCUD14hEe2rXNsIDUvqhw" showIcon="false" labelColor="39,76,114">
5673 <customFeatures>labelSize</customFeatures>
5674 </endLabelStyle>
5675 </ownedStyle>
5676 <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']"/>
5677 </ownedDiagramElements>
5678 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_mjC7Il4hEe2rXNsIDUvqhw" sourceNode="_1WVbIF4fEe2rXNsIDUvqhw" targetNode="_mi_QsF4hEe2rXNsIDUvqhw">
5679 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewVariable"/>
5680 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NewVariable"/>
5681 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_mjC7I14hEe2rXNsIDUvqhw" lineStyle="dot" targetArrow="InputClosedArrow" routingStyle="tree" strokeColor="125,125,125">
5682 <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.1/@style"/>
5683 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_mjC7JF4hEe2rXNsIDUvqhw" showIcon="false">
5684 <labelFormat>italic</labelFormat>
5685 </beginLabelStyle>
5686 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_mjC7JV4hEe2rXNsIDUvqhw" showIcon="false"/>
5687 </ownedStyle>
5688 <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']"/>
5689 </ownedDiagramElements>
5690 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_vYLvwF4hEe2rXNsIDUvqhw" name="Atom" tooltipText="" incomingEdges="_vYNlAl4hEe2rXNsIDUvqhw" width="12" height="10">
5691 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/> 5978 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/>
5692 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/> 5979 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Atom"/>
5980 <graphicalFilters xmi:type="diagram:HideFilter" uid="_c74pgBRWEe-4k7CzzL6IsA"/>
5693 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 5981 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5694 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 5982 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5695 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 5983 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
@@ -5697,7 +5985,7 @@
5697 <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"/> 5985 <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"/>
5698 </ownedStyle> 5986 </ownedStyle>
5699 <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']"/> 5987 <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']"/>
5700 <ownedElements xmi:type="diagram:DNodeListElement" uid="_vYM9414hEe2rXNsIDUvqhw" name="transitiveClosure : EBoolean = false" tooltipText=""> 5988 <ownedElements xmi:type="diagram:DNodeListElement" uid="_vYM9414hEe2rXNsIDUvqhw" name="transitiveClosure : EBoolean = false" visible="false" tooltipText="">
5701 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Atom/transitiveClosure"/> 5989 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Atom/transitiveClosure"/>
5702 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Atom/transitiveClosure"/> 5990 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Atom/transitiveClosure"/>
5703 <ownedStyle xmi:type="diagram:BundledImage" uid="_vYM95F4hEe2rXNsIDUvqhw" labelAlignment="LEFT"> 5991 <ownedStyle xmi:type="diagram:BundledImage" uid="_vYM95F4hEe2rXNsIDUvqhw" labelAlignment="LEFT">
@@ -5705,31 +5993,27 @@
5705 </ownedStyle> 5993 </ownedStyle>
5706 <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']"/> 5994 <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']"/>
5707 </ownedElements> 5995 </ownedElements>
5708 <ownedElements xmi:type="diagram:DNodeListElement" uid="_3vrVA163Ee2rXNsIDUvqhw" name=" arguments : Expr" tooltipText=""> 5996 <ownedElements xmi:type="diagram:DNodeListElement" uid="_wuaowBRqEe-4k7CzzL6IsA" name=" arguments : Expr" visible="false" tooltipText="">
5709 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/arguments"/> 5997 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/arguments"/>
5710 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/arguments"/> 5998 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/arguments"/>
5711 <ownedStyle xmi:type="diagram:BundledImage" uid="_3vrVBF63Ee2rXNsIDUvqhw" labelAlignment="LEFT" color="114,159,207"> 5999 <ownedStyle xmi:type="diagram:BundledImage" uid="_wuaowRRqEe-4k7CzzL6IsA" labelAlignment="LEFT" color="114,159,207">
6000 <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%20EReferenceNode']/@style"/>
6001 </ownedStyle>
6002 <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%20EReferenceNode']"/>
6003 </ownedElements>
6004 <ownedElements xmi:type="diagram:DNodeListElement" uid="_wuaowhRqEe-4k7CzzL6IsA" name=" relation : Relation" visible="false" tooltipText="">
6005 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/relation"/>
6006 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Atom/relation"/>
6007 <ownedStyle xmi:type="diagram:BundledImage" uid="_wuaowxRqEe-4k7CzzL6IsA" labelAlignment="LEFT" color="114,159,207">
5712 <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%20EReferenceNode']/@style"/> 6008 <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%20EReferenceNode']/@style"/>
5713 </ownedStyle> 6009 </ownedStyle>
5714 <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%20EReferenceNode']"/> 6010 <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%20EReferenceNode']"/>
5715 </ownedElements> 6011 </ownedElements>
5716 </ownedDiagramElements> 6012 </ownedDiagramElements>
5717 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_vYNlAl4hEe2rXNsIDUvqhw" name="[0..1] atom" sourceNode="_x-t_EF4fEe2rXNsIDUvqhw" targetNode="_vYLvwF4hEe2rXNsIDUvqhw"> 6013 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_4xTbQF4hEe2rXNsIDUvqhw" name="LogicValue" visible="false" tooltipText="" width="12" height="10">
5718 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AssertionAction/atom"/>
5719 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AssertionAction/atom"/>
5720 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_vYNlA14hEe2rXNsIDUvqhw" description="_1WX3YV4fEe2rXNsIDUvqhw" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
5721 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_vYNlBV4hEe2rXNsIDUvqhw" showIcon="false">
5722 <customFeatures>labelSize</customFeatures>
5723 </centerLabelStyle>
5724 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_vYNlBF4hEe2rXNsIDUvqhw" showIcon="false" labelColor="39,76,114">
5725 <customFeatures>labelSize</customFeatures>
5726 </endLabelStyle>
5727 </ownedStyle>
5728 <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']"/>
5729 </ownedDiagramElements>
5730 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_4xTbQF4hEe2rXNsIDUvqhw" name="LogicValue" tooltipText="" width="12" height="10">
5731 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//LogicValue"/> 6014 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//LogicValue"/>
5732 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//LogicValue"/> 6015 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//LogicValue"/>
6016 <graphicalFilters xmi:type="diagram:HideFilter" uid="_lpamIBOtEe-xzrPFjBSxRw"/>
5733 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 6017 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
5734 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 6018 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
5735 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 6019 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
@@ -5737,7 +6021,7 @@
5737 <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"/> 6021 <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"/>
5738 </ownedStyle> 6022 </ownedStyle>
5739 <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']"/> 6023 <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']"/>
5740 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xV3g14hEe2rXNsIDUvqhw" name="TRUE" tooltipText=""> 6024 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xV3g14hEe2rXNsIDUvqhw" name="TRUE" visible="false" tooltipText="">
5741 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/TRUE"/> 6025 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/TRUE"/>
5742 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/TRUE"/> 6026 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/TRUE"/>
5743 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xV3hF4hEe2rXNsIDUvqhw" labelAlignment="LEFT"> 6027 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xV3hF4hEe2rXNsIDUvqhw" labelAlignment="LEFT">
@@ -5745,7 +6029,7 @@
5745 </ownedStyle> 6029 </ownedStyle>
5746 <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']"/> 6030 <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']"/>
5747 </ownedElements> 6031 </ownedElements>
5748 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xV3hV4hEe2rXNsIDUvqhw" name="FALSE" tooltipText=""> 6032 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xV3hV4hEe2rXNsIDUvqhw" name="FALSE" visible="false" tooltipText="">
5749 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/FALSE"/> 6033 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/FALSE"/>
5750 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/FALSE"/> 6034 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/FALSE"/>
5751 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xV3hl4hEe2rXNsIDUvqhw" labelAlignment="LEFT"> 6035 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xV3hl4hEe2rXNsIDUvqhw" labelAlignment="LEFT">
@@ -5753,7 +6037,7 @@
5753 </ownedStyle> 6037 </ownedStyle>
5754 <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']"/> 6038 <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']"/>
5755 </ownedElements> 6039 </ownedElements>
5756 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xWekF4hEe2rXNsIDUvqhw" name="UNKNOWN" tooltipText=""> 6040 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xWekF4hEe2rXNsIDUvqhw" name="UNKNOWN" visible="false" tooltipText="">
5757 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/UNKNOWN"/> 6041 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/UNKNOWN"/>
5758 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/UNKNOWN"/> 6042 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/UNKNOWN"/>
5759 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xWekV4hEe2rXNsIDUvqhw" labelAlignment="LEFT"> 6043 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xWekV4hEe2rXNsIDUvqhw" labelAlignment="LEFT">
@@ -5761,7 +6045,7 @@
5761 </ownedStyle> 6045 </ownedStyle>
5762 <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']"/> 6046 <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']"/>
5763 </ownedElements> 6047 </ownedElements>
5764 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xWekl4hEe2rXNsIDUvqhw" name="ERROR" tooltipText=""> 6048 <ownedElements xmi:type="diagram:DNodeListElement" uid="_4xWekl4hEe2rXNsIDUvqhw" name="ERROR" visible="false" tooltipText="">
5765 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/> 6049 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/>
5766 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/> 6050 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/>
5767 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xWek14hEe2rXNsIDUvqhw" labelAlignment="LEFT"> 6051 <ownedStyle xmi:type="diagram:BundledImage" uid="_4xWek14hEe2rXNsIDUvqhw" labelAlignment="LEFT">
@@ -5770,6 +6054,121 @@
5770 <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']"/> 6054 <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']"/>
5771 </ownedElements> 6055 </ownedElements>
5772 </ownedDiagramElements> 6056 </ownedDiagramElements>
6057 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_nWhBIBOtEe-xzrPFjBSxRw" name="Expr" visible="false" tooltipText="" incomingEdges="_wudFAxRqEe-4k7CzzL6IsA" width="12" height="10">
6058 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Expr"/>
6059 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Expr"/>
6060 <graphicalFilters xmi:type="diagram:HideFilter" uid="_t6GuERRqEe-4k7CzzL6IsA"/>
6061 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
6062 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
6063 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
6064 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_nWhBIROtEe-xzrPFjBSxRw" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
6065 <labelFormat>italic</labelFormat>
6066 <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']/@conditionnalStyles.1/@style"/>
6067 </ownedStyle>
6068 <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']"/>
6069 </ownedDiagramElements>
6070 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_e7zS0BRWEe-4k7CzzL6IsA" name="Relation" visible="false" tooltipText="" incomingEdges="_wucd8xRqEe-4k7CzzL6IsA" width="12" height="10">
6071 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/>
6072 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/>
6073 <graphicalFilters xmi:type="diagram:HideFilter" uid="_t6GuEBRqEe-4k7CzzL6IsA"/>
6074 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
6075 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
6076 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
6077 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_e7zS0RRWEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
6078 <labelFormat>italic</labelFormat>
6079 <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']/@conditionnalStyles.1/@style"/>
6080 </ownedStyle>
6081 <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']"/>
6082 </ownedDiagramElements>
6083 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_mJSNMBRWEe-4k7CzzL6IsA" name="AssertionArgument" visible="false" tooltipText="" incomingEdges="_wub25hRqEe-4k7CzzL6IsA" width="12" height="10">
6084 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/>
6085 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/>
6086 <graphicalFilters xmi:type="diagram:HideFilter" uid="_ug9SsBRqEe-4k7CzzL6IsA"/>
6087 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
6088 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
6089 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
6090 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_mJSNMRRWEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
6091 <labelFormat>italic</labelFormat>
6092 <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']/@conditionnalStyles.1/@style"/>
6093 </ownedStyle>
6094 <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']"/>
6095 </ownedDiagramElements>
6096 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_wuYMgBRqEe-4k7CzzL6IsA" name="AbstractAssertion" tooltipText="" outgoingEdges="_wub25hRqEe-4k7CzzL6IsA _wucd8xRqEe-4k7CzzL6IsA _wudFAxRqEe-4k7CzzL6IsA" incomingEdges="_xrullhRqEe-4k7CzzL6IsA" width="12" height="10">
6097 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AbstractAssertion"/>
6098 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AbstractAssertion"/>
6099 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
6100 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
6101 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
6102 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_wuYMgRRqEe-4k7CzzL6IsA" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
6103 <labelFormat>italic</labelFormat>
6104 <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']/@conditionnalStyles.1/@style"/>
6105 </ownedStyle>
6106 <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']"/>
6107 <ownedElements xmi:type="diagram:DNodeListElement" uid="_wubP0BRqEe-4k7CzzL6IsA" name=" arguments : AssertionArgument" tooltipText="">
6108 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
6109 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
6110 <ownedStyle xmi:type="diagram:BundledImage" uid="_wubP0RRqEe-4k7CzzL6IsA" labelAlignment="LEFT" color="114,159,207">
6111 <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%20EReferenceNode']/@style"/>
6112 </ownedStyle>
6113 <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%20EReferenceNode']"/>
6114 </ownedElements>
6115 <ownedElements xmi:type="diagram:DNodeListElement" uid="_wubP0hRqEe-4k7CzzL6IsA" name=" relation : Relation" tooltipText="">
6116 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
6117 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
6118 <ownedStyle xmi:type="diagram:BundledImage" uid="_wubP0xRqEe-4k7CzzL6IsA" labelAlignment="LEFT" color="114,159,207">
6119 <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%20EReferenceNode']/@style"/>
6120 </ownedStyle>
6121 <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%20EReferenceNode']"/>
6122 </ownedElements>
6123 <ownedElements xmi:type="diagram:DNodeListElement" uid="_wubP1BRqEe-4k7CzzL6IsA" name=" value : Expr" tooltipText="">
6124 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
6125 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
6126 <ownedStyle xmi:type="diagram:BundledImage" uid="_wubP1RRqEe-4k7CzzL6IsA" labelAlignment="LEFT" color="114,159,207">
6127 <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%20EReferenceNode']/@style"/>
6128 </ownedStyle>
6129 <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%20EReferenceNode']"/>
6130 </ownedElements>
6131 </ownedDiagramElements>
6132 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_wub25hRqEe-4k7CzzL6IsA" name="[0..*] arguments" visible="false" sourceNode="_wuYMgBRqEe-4k7CzzL6IsA" targetNode="_mJSNMBRWEe-4k7CzzL6IsA">
6133 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
6134 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/arguments"/>
6135 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_wub26hRqEe-4k7CzzL6IsA" description="_wub25xRqEe-4k7CzzL6IsA" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
6136 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_wub27BRqEe-4k7CzzL6IsA" showIcon="false"/>
6137 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_wub26xRqEe-4k7CzzL6IsA" labelSize="6" showIcon="false" labelColor="39,76,114"/>
6138 </ownedStyle>
6139 <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']"/>
6140 </ownedDiagramElements>
6141 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_wucd8xRqEe-4k7CzzL6IsA" name="[0..1] relation" visible="false" sourceNode="_wuYMgBRqEe-4k7CzzL6IsA" targetNode="_e7zS0BRWEe-4k7CzzL6IsA">
6142 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
6143 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/relation"/>
6144 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_wucd9BRqEe-4k7CzzL6IsA" routingStyle="manhattan" strokeColor="0,0,0">
6145 <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"/>
6146 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_wucd9hRqEe-4k7CzzL6IsA" showIcon="false"/>
6147 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_wucd9RRqEe-4k7CzzL6IsA" labelSize="6" showIcon="false" labelColor="39,76,114"/>
6148 </ownedStyle>
6149 <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']"/>
6150 </ownedDiagramElements>
6151 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_wudFAxRqEe-4k7CzzL6IsA" name="[0..1] value" visible="false" sourceNode="_wuYMgBRqEe-4k7CzzL6IsA" targetNode="_nWhBIBOtEe-xzrPFjBSxRw">
6152 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
6153 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//AbstractAssertion/value"/>
6154 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_wudFBBRqEe-4k7CzzL6IsA" description="_wub25xRqEe-4k7CzzL6IsA" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
6155 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_wudFBhRqEe-4k7CzzL6IsA" showIcon="false"/>
6156 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_wudFBRRqEe-4k7CzzL6IsA" labelSize="6" showIcon="false" labelColor="39,76,114"/>
6157 </ownedStyle>
6158 <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']"/>
6159 </ownedDiagramElements>
6160 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_xrullhRqEe-4k7CzzL6IsA" sourceNode="_x-t_EF4fEe2rXNsIDUvqhw" targetNode="_wuYMgBRqEe-4k7CzzL6IsA">
6161 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
6162 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionAction"/>
6163 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_xrullxRqEe-4k7CzzL6IsA" targetArrow="InputClosedArrow" routingStyle="tree">
6164 <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"/>
6165 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_xrulmBRqEe-4k7CzzL6IsA" showIcon="false">
6166 <labelFormat>italic</labelFormat>
6167 </beginLabelStyle>
6168 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_xrulmRRqEe-4k7CzzL6IsA" showIcon="false"/>
6169 </ownedStyle>
6170 <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']"/>
6171 </ownedDiagramElements>
5773 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 6172 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
5774 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_sCFBgV4fEe2rXNsIDUvqhw"/> 6173 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_sCFBgV4fEe2rXNsIDUvqhw"/>
5775 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 6174 <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 9a349490..e830c724 100644
--- a/subprojects/language-model/src/main/resources/model/problem.ecore
+++ b/subprojects/language-model/src/main/resources/model/problem.ecore
@@ -38,6 +38,9 @@
38 </eClassifiers> 38 </eClassifiers>
39 <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//Variable"> 39 <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//Variable">
40 <eStructuralFeatures xsi:type="ecore:EReference" name="parameterType" eType="#//Relation"/> 40 <eStructuralFeatures xsi:type="ecore:EReference" name="parameterType" eType="#//Relation"/>
41 <eStructuralFeatures xsi:type="ecore:EAttribute" name="concreteness" eType="#//Concreteness"/>
42 <eStructuralFeatures xsi:type="ecore:EAttribute" name="modality" eType="#//Modality"/>
43 <eStructuralFeatures xsi:type="ecore:EAttribute" name="binding" eType="#//ParameterBinding"/>
41 </eClassifiers> 44 </eClassifiers>
42 <eClassifiers xsi:type="ecore:EClass" name="Variable" abstract="true" eSuperTypes="#//VariableOrNode"/> 45 <eClassifiers xsi:type="ecore:EClass" name="Variable" abstract="true" eSuperTypes="#//VariableOrNode"/>
43 <eClassifiers xsi:type="ecore:EClass" name="Atom" eSuperTypes="#//Expr"> 46 <eClassifiers xsi:type="ecore:EClass" name="Atom" eSuperTypes="#//Expr">
@@ -52,11 +55,9 @@
52 <eStructuralFeatures xsi:type="ecore:EReference" name="implicitVariables" upperBound="-1" 55 <eStructuralFeatures xsi:type="ecore:EReference" name="implicitVariables" upperBound="-1"
53 eType="#//ImplicitVariable" transient="true" containment="true"/> 56 eType="#//ImplicitVariable" transient="true" containment="true"/>
54 </eClassifiers> 57 </eClassifiers>
55 <eClassifiers xsi:type="ecore:EClass" name="Assertion" eSuperTypes="#//Statement"> 58 <eClassifiers xsi:type="ecore:EClass" name="AbstractAssertion" abstract="true">
56 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1" 59 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1"
57 eType="#//AssertionArgument" containment="true"/> 60 eType="#//AssertionArgument" containment="true"/>
58 <eStructuralFeatures xsi:type="ecore:EAttribute" name="default" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
59 defaultValueLiteral="false"/>
60 <eStructuralFeatures xsi:type="ecore:EReference" name="relation" eType="#//Relation"/> 61 <eStructuralFeatures xsi:type="ecore:EReference" name="relation" eType="#//Relation"/>
61 <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//Expr" 62 <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//Expr"
62 containment="true"/> 63 containment="true"/>
@@ -109,7 +110,7 @@
109 <eStructuralFeatures xsi:type="ecore:EAttribute" name="stringValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> 110 <eStructuralFeatures xsi:type="ecore:EAttribute" name="stringValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
110 </eClassifiers> 111 </eClassifiers>
111 <eClassifiers xsi:type="ecore:EClass" name="NodeAssertionArgument" eSuperTypes="#//AssertionArgument"> 112 <eClassifiers xsi:type="ecore:EClass" name="NodeAssertionArgument" eSuperTypes="#//AssertionArgument">
112 <eStructuralFeatures xsi:type="ecore:EReference" name="node" eType="#//Node"/> 113 <eStructuralFeatures xsi:type="ecore:EReference" name="node" eType="#//VariableOrNode"/>
113 </eClassifiers> 114 </eClassifiers>
114 <eClassifiers xsi:type="ecore:EClass" name="AssertionArgument" abstract="true"/> 115 <eClassifiers xsi:type="ecore:EClass" name="AssertionArgument" abstract="true"/>
115 <eClassifiers xsi:type="ecore:EClass" name="NodeDeclaration" eSuperTypes="#//Statement"> 116 <eClassifiers xsi:type="ecore:EClass" name="NodeDeclaration" eSuperTypes="#//Statement">
@@ -128,28 +129,14 @@
128 eType="#//Consequent" containment="true"/> 129 eType="#//Consequent" containment="true"/>
129 <eStructuralFeatures xsi:type="ecore:EReference" name="preconditions" upperBound="-1" 130 <eStructuralFeatures xsi:type="ecore:EReference" name="preconditions" upperBound="-1"
130 eType="#//Conjunction" containment="true"/> 131 eType="#//Conjunction" containment="true"/>
132 <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//RuleKind"/>
131 </eClassifiers> 133 </eClassifiers>
132 <eClassifiers xsi:type="ecore:EClass" name="Consequent"> 134 <eClassifiers xsi:type="ecore:EClass" name="Consequent">
133 <eStructuralFeatures xsi:type="ecore:EReference" name="actions" upperBound="-1" 135 <eStructuralFeatures xsi:type="ecore:EReference" name="actions" upperBound="-1"
134 eType="#//Action" containment="true"/> 136 eType="#//Action" containment="true"/>
135 </eClassifiers> 137 </eClassifiers>
136 <eClassifiers xsi:type="ecore:EClass" name="Action" abstract="true"/> 138 <eClassifiers xsi:type="ecore:EClass" name="Action" abstract="true" interface="true"/>
137 <eClassifiers xsi:type="ecore:EClass" name="AssertionAction" eSuperTypes="#//Action"> 139 <eClassifiers xsi:type="ecore:EClass" name="AssertionAction" eSuperTypes="#//Action #//AbstractAssertion"/>
138 <eStructuralFeatures xsi:type="ecore:EReference" name="atom" eType="#//Atom" containment="true"/>
139 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//LogicValue"
140 defaultValueLiteral="TRUE"/>
141 <eStructuralFeatures xsi:type="ecore:EAttribute" name="overwrite" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
142 defaultValueLiteral="FALSE"/>
143 </eClassifiers>
144 <eClassifiers xsi:type="ecore:EClass" name="DeleteAction" eSuperTypes="#//Action">
145 <eStructuralFeatures xsi:type="ecore:EReference" name="variableOrNode" eType="#//VariableOrNode"/>
146 </eClassifiers>
147 <eClassifiers xsi:type="ecore:EClass" name="NewAction" eSuperTypes="#//Action">
148 <eStructuralFeatures xsi:type="ecore:EReference" name="variable" eType="#//NewVariable"
149 containment="true"/>
150 <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//VariableOrNode"/>
151 </eClassifiers>
152 <eClassifiers xsi:type="ecore:EClass" name="NewVariable" eSuperTypes="#//Variable"/>
153 <eClassifiers xsi:type="ecore:EEnum" name="ComparisonOp"> 140 <eClassifiers xsi:type="ecore:EEnum" name="ComparisonOp">
154 <eLiterals name="LESS"/> 141 <eLiterals name="LESS"/>
155 <eLiterals name="LESS_EQ" value="1"/> 142 <eLiterals name="LESS_EQ" value="1"/>
@@ -166,6 +153,7 @@
166 <eLiterals name="REFERENCE" value="2"/> 153 <eLiterals name="REFERENCE" value="2"/>
167 <eLiterals name="CONTAINMENT" value="3"/> 154 <eLiterals name="CONTAINMENT" value="3"/>
168 <eLiterals name="CONTAINER" value="3"/> 155 <eLiterals name="CONTAINER" value="3"/>
156 <eLiterals name="PARTIAL" value="4"/>
169 </eClassifiers> 157 </eClassifiers>
170 <eClassifiers xsi:type="ecore:EClass" name="Expr" abstract="true"/> 158 <eClassifiers xsi:type="ecore:EClass" name="Expr" abstract="true"/>
171 <eClassifiers xsi:type="ecore:EClass" name="VariableOrNodeExpr" eSuperTypes="#//Expr"> 159 <eClassifiers xsi:type="ecore:EClass" name="VariableOrNodeExpr" eSuperTypes="#//Expr">
@@ -264,4 +252,31 @@
264 <eClassifiers xsi:type="ecore:EClass" name="AssignmentExpr" eSuperTypes="#//BinaryExpr"/> 252 <eClassifiers xsi:type="ecore:EClass" name="AssignmentExpr" eSuperTypes="#//BinaryExpr"/>
265 <eClassifiers xsi:type="ecore:EClass" name="InfiniteConstant" eSuperTypes="#//Constant"/> 253 <eClassifiers xsi:type="ecore:EClass" name="InfiniteConstant" eSuperTypes="#//Constant"/>
266 <eClassifiers xsi:type="ecore:EClass" name="AggregatorDeclaration" eSuperTypes="#//Statement #//NamedElement"/> 254 <eClassifiers xsi:type="ecore:EClass" name="AggregatorDeclaration" eSuperTypes="#//Statement #//NamedElement"/>
255 <eClassifiers xsi:type="ecore:EClass" name="ModalExpr" eSuperTypes="#//UnaryExpr">
256 <eStructuralFeatures xsi:type="ecore:EAttribute" name="concreteness" eType="#//Concreteness"/>
257 <eStructuralFeatures xsi:type="ecore:EAttribute" name="modality" eType="#//Modality"/>
258 </eClassifiers>
259 <eClassifiers xsi:type="ecore:EEnum" name="Modality">
260 <eLiterals name="NONE"/>
261 <eLiterals name="MUST" value="1"/>
262 <eLiterals name="MAY" value="2"/>
263 </eClassifiers>
264 <eClassifiers xsi:type="ecore:EEnum" name="Concreteness">
265 <eLiterals name="PARTIAL"/>
266 <eLiterals name="CANDIDATE" value="1"/>
267 </eClassifiers>
268 <eClassifiers xsi:type="ecore:EEnum" name="RuleKind">
269 <eLiterals name="REFINEMENT"/>
270 <eLiterals name="PROPAGATION" value="1"/>
271 <eLiterals name="DECISION" value="2"/>
272 </eClassifiers>
273 <eClassifiers xsi:type="ecore:EEnum" name="ParameterBinding">
274 <eLiterals name="SINGLE"/>
275 <eLiterals name="FOCUS" value="1"/>
276 <eLiterals name="MULTI" value="2"/>
277 </eClassifiers>
278 <eClassifiers xsi:type="ecore:EClass" name="Assertion" eSuperTypes="#//Statement #//AbstractAssertion">
279 <eStructuralFeatures xsi:type="ecore:EAttribute" name="default" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
280 defaultValueLiteral="false"/>
281 </eClassifiers>
267</ecore:EPackage> 282</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 2a1d8522..2ceb74a6 100644
--- a/subprojects/language-model/src/main/resources/model/problem.genmodel
+++ b/subprojects/language-model/src/main/resources/model/problem.genmodel
@@ -32,6 +32,7 @@
32 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/REFERENCE"/> 32 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/REFERENCE"/>
33 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINMENT"/> 33 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINMENT"/>
34 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINER"/> 34 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINER"/>
35 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/PARTIAL"/>
35 </genEnums> 36 </genEnums>
36 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//UnaryOp"> 37 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//UnaryOp">
37 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/PLUS"/> 38 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/PLUS"/>
@@ -60,6 +61,25 @@
60 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LatticeBinaryOp/MEET"/> 61 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LatticeBinaryOp/MEET"/>
61 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LatticeBinaryOp/JOIN"/> 62 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LatticeBinaryOp/JOIN"/>
62 </genEnums> 63 </genEnums>
64 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//Modality">
65 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/NONE"/>
66 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/MUST"/>
67 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Modality/MAY"/>
68 </genEnums>
69 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//Concreteness">
70 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Concreteness/PARTIAL"/>
71 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//Concreteness/CANDIDATE"/>
72 </genEnums>
73 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//RuleKind">
74 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//RuleKind/REFINEMENT"/>
75 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//RuleKind/PROPAGATION"/>
76 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//RuleKind/DECISION"/>
77 </genEnums>
78 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ParameterBinding">
79 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ParameterBinding/SINGLE"/>
80 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ParameterBinding/FOCUS"/>
81 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ParameterBinding/MULTI"/>
82 </genEnums>
63 <genClasses ecoreClass="problem.ecore#//Problem"> 83 <genClasses ecoreClass="problem.ecore#//Problem">
64 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/> 84 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/>
65 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/statements"/> 85 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/statements"/>
@@ -88,6 +108,9 @@
88 </genClasses> 108 </genClasses>
89 <genClasses ecoreClass="problem.ecore#//Parameter"> 109 <genClasses ecoreClass="problem.ecore#//Parameter">
90 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Parameter/parameterType"/> 110 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Parameter/parameterType"/>
111 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Parameter/concreteness"/>
112 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Parameter/modality"/>
113 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Parameter/binding"/>
91 </genClasses> 114 </genClasses>
92 <genClasses ecoreClass="problem.ecore#//Variable"/> 115 <genClasses ecoreClass="problem.ecore#//Variable"/>
93 <genClasses ecoreClass="problem.ecore#//Atom"> 116 <genClasses ecoreClass="problem.ecore#//Atom">
@@ -99,11 +122,10 @@
99 <genClasses ecoreClass="problem.ecore#//ExistentialQuantifier"> 122 <genClasses ecoreClass="problem.ecore#//ExistentialQuantifier">
100 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//ExistentialQuantifier/implicitVariables"/> 123 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//ExistentialQuantifier/implicitVariables"/>
101 </genClasses> 124 </genClasses>
102 <genClasses ecoreClass="problem.ecore#//Assertion"> 125 <genClasses ecoreClass="problem.ecore#//AbstractAssertion">
103 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/arguments"/> 126 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AbstractAssertion/arguments"/>
104 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Assertion/default"/> 127 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//AbstractAssertion/relation"/>
105 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/relation"/> 128 <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//AbstractAssertion/value"/>
106 <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/value"/>
107 </genClasses> 129 </genClasses>
108 <genClasses ecoreClass="problem.ecore#//Node"/> 130 <genClasses ecoreClass="problem.ecore#//Node"/>
109 <genClasses ecoreClass="problem.ecore#//ScopeDeclaration"> 131 <genClasses ecoreClass="problem.ecore#//ScopeDeclaration">
@@ -153,24 +175,13 @@
153 <genClasses ecoreClass="problem.ecore#//RuleDefinition"> 175 <genClasses ecoreClass="problem.ecore#//RuleDefinition">
154 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//RuleDefinition/consequents"/> 176 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//RuleDefinition/consequents"/>
155 <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//RuleDefinition/preconditions"/> 177 <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//RuleDefinition/preconditions"/>
178 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//RuleDefinition/kind"/>
156 </genClasses> 179 </genClasses>
157 <genClasses ecoreClass="problem.ecore#//Consequent"> 180 <genClasses ecoreClass="problem.ecore#//Consequent">
158 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Consequent/actions"/> 181 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Consequent/actions"/>
159 </genClasses> 182 </genClasses>
160 <genClasses ecoreClass="problem.ecore#//Action"/> 183 <genClasses ecoreClass="problem.ecore#//Action"/>
161 <genClasses ecoreClass="problem.ecore#//AssertionAction"> 184 <genClasses ecoreClass="problem.ecore#//AssertionAction"/>
162 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//AssertionAction/atom"/>
163 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//AssertionAction/value"/>
164 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//AssertionAction/overwrite"/>
165 </genClasses>
166 <genClasses ecoreClass="problem.ecore#//DeleteAction">
167 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//DeleteAction/variableOrNode"/>
168 </genClasses>
169 <genClasses ecoreClass="problem.ecore#//NewAction">
170 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//NewAction/variable"/>
171 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//NewAction/parent"/>
172 </genClasses>
173 <genClasses ecoreClass="problem.ecore#//NewVariable"/>
174 <genClasses ecoreClass="problem.ecore#//Expr"/> 185 <genClasses ecoreClass="problem.ecore#//Expr"/>
175 <genClasses ecoreClass="problem.ecore#//VariableOrNodeExpr"> 186 <genClasses ecoreClass="problem.ecore#//VariableOrNodeExpr">
176 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//VariableOrNodeExpr/variableOrNode"/> 187 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//VariableOrNodeExpr/variableOrNode"/>
@@ -232,5 +243,12 @@
232 <genClasses ecoreClass="problem.ecore#//AssignmentExpr"/> 243 <genClasses ecoreClass="problem.ecore#//AssignmentExpr"/>
233 <genClasses ecoreClass="problem.ecore#//InfiniteConstant"/> 244 <genClasses ecoreClass="problem.ecore#//InfiniteConstant"/>
234 <genClasses ecoreClass="problem.ecore#//AggregatorDeclaration"/> 245 <genClasses ecoreClass="problem.ecore#//AggregatorDeclaration"/>
246 <genClasses ecoreClass="problem.ecore#//ModalExpr">
247 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ModalExpr/concreteness"/>
248 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ModalExpr/modality"/>
249 </genClasses>
250 <genClasses ecoreClass="problem.ecore#//Assertion">
251 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Assertion/default"/>
252 </genClasses>
235 </genPackages> 253 </genPackages>
236</genmodel:GenModel> 254</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 ccfb630f..486eb89b 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
@@ -6,6 +6,7 @@
6package tools.refinery.language.semantics; 6package tools.refinery.language.semantics;
7 7
8import com.google.inject.Inject; 8import com.google.inject.Inject;
9import org.jetbrains.annotations.Nullable;
9import tools.refinery.language.library.BuiltinLibrary; 10import tools.refinery.language.library.BuiltinLibrary;
10import tools.refinery.language.model.problem.*; 11import tools.refinery.language.model.problem.*;
11import tools.refinery.language.scoping.imports.ImportAdapterProvider; 12import tools.refinery.language.scoping.imports.ImportAdapterProvider;
@@ -13,10 +14,9 @@ import tools.refinery.language.scoping.imports.ImportCollector;
13import tools.refinery.language.semantics.internal.MutableSeed; 14import tools.refinery.language.semantics.internal.MutableSeed;
14import tools.refinery.language.utils.BuiltinSymbols; 15import tools.refinery.language.utils.BuiltinSymbols;
15import tools.refinery.language.utils.ProblemUtil; 16import tools.refinery.language.utils.ProblemUtil;
17import tools.refinery.language.validation.ActionTargetCollector;
16import tools.refinery.logic.Constraint; 18import tools.refinery.logic.Constraint;
17import tools.refinery.logic.dnf.InvalidClauseException; 19import tools.refinery.logic.dnf.*;
18import tools.refinery.logic.dnf.Query;
19import tools.refinery.logic.dnf.RelationalQuery;
20import tools.refinery.logic.literal.*; 20import tools.refinery.logic.literal.*;
21import tools.refinery.logic.term.NodeVariable; 21import tools.refinery.logic.term.NodeVariable;
22import tools.refinery.logic.term.Variable; 22import tools.refinery.logic.term.Variable;
@@ -25,8 +25,18 @@ import tools.refinery.logic.term.cardinalityinterval.CardinalityIntervals;
25import tools.refinery.logic.term.truthvalue.TruthValue; 25import tools.refinery.logic.term.truthvalue.TruthValue;
26import tools.refinery.logic.term.uppercardinality.UpperCardinalities; 26import tools.refinery.logic.term.uppercardinality.UpperCardinalities;
27import tools.refinery.store.dse.propagation.PropagationBuilder; 27import tools.refinery.store.dse.propagation.PropagationBuilder;
28import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder;
29import tools.refinery.store.dse.transition.Rule;
30import tools.refinery.store.dse.transition.RuleBuilder;
31import tools.refinery.store.dse.transition.actions.ActionLiteral;
32import tools.refinery.store.dse.transition.actions.ActionLiterals;
28import tools.refinery.store.model.ModelStoreBuilder; 33import tools.refinery.store.model.ModelStoreBuilder;
29import tools.refinery.store.reasoning.ReasoningAdapter; 34import tools.refinery.store.reasoning.ReasoningAdapter;
35import tools.refinery.store.reasoning.actions.PartialActionLiterals;
36import tools.refinery.store.reasoning.literal.Concreteness;
37import tools.refinery.store.reasoning.literal.ModalConstraint;
38import tools.refinery.store.reasoning.literal.Modality;
39import tools.refinery.store.reasoning.literal.PartialLiterals;
30import tools.refinery.store.reasoning.representation.PartialRelation; 40import tools.refinery.store.reasoning.representation.PartialRelation;
31import tools.refinery.store.reasoning.scope.ScopePropagator; 41import tools.refinery.store.reasoning.scope.ScopePropagator;
32import tools.refinery.store.reasoning.seed.ModelSeed; 42import tools.refinery.store.reasoning.seed.ModelSeed;
@@ -59,6 +69,9 @@ public class ModelInitializer {
59 @Inject 69 @Inject
60 private ImportAdapterProvider importAdapterProvider; 70 private ImportAdapterProvider importAdapterProvider;
61 71
72 @Inject
73 private ActionTargetCollector actionTargetCollector;
74
62 private Problem problem; 75 private Problem problem;
63 76
64 private final Set<Problem> importedProblems = new HashSet<>(); 77 private final Set<Problem> importedProblems = new HashSet<>();
@@ -87,6 +100,8 @@ public class ModelInitializer {
87 100
88 private ModelSeed modelSeed; 101 private ModelSeed modelSeed;
89 102
103 private int ruleCount;
104
90 public void readProblem(Problem problem) { 105 public void readProblem(Problem problem) {
91 if (this.problem != null) { 106 if (this.problem != null) {
92 throw new IllegalArgumentException("Problem was already set"); 107 throw new IllegalArgumentException("Problem was already set");
@@ -174,6 +189,7 @@ public class ModelInitializer {
174 storeBuilder.with(scopePropagator); 189 storeBuilder.with(scopePropagator);
175 } 190 }
176 collectPredicates(storeBuilder); 191 collectPredicates(storeBuilder);
192 collectRules(storeBuilder);
177 } catch (TranslationException e) { 193 } catch (TranslationException e) {
178 throw problemTrace.wrapException(e); 194 throw problemTrace.wrapException(e);
179 } 195 }
@@ -336,6 +352,7 @@ public class ModelInitializer {
336 var target = getPartialRelation(referenceDeclaration.getReferenceType()); 352 var target = getPartialRelation(referenceDeclaration.getReferenceType());
337 targetTypes.add(target); 353 targetTypes.add(target);
338 boolean containment = referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT; 354 boolean containment = referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT;
355 boolean partial = referenceDeclaration.getKind() == ReferenceKind.PARTIAL;
339 var opposite = referenceDeclaration.getOpposite(); 356 var opposite = referenceDeclaration.getOpposite();
340 PartialRelation oppositeRelation = null; 357 PartialRelation oppositeRelation = null;
341 if (opposite != null) { 358 if (opposite != null) {
@@ -356,6 +373,7 @@ public class ModelInitializer {
356 .target(target) 373 .target(target)
357 .opposite(oppositeRelation) 374 .opposite(oppositeRelation)
358 .defaultValue(defaultValue) 375 .defaultValue(defaultValue)
376 .partial(partial)
359 .build()); 377 .build());
360 } catch (RuntimeException e) { 378 } catch (RuntimeException e) {
361 throw TracedException.addTrace(classDeclaration, e); 379 throw TracedException.addTrace(classDeclaration, e);
@@ -379,14 +397,16 @@ public class ModelInitializer {
379 397
380 private static CardinalityInterval getCardinalityInterval( 398 private static CardinalityInterval getCardinalityInterval(
381 tools.refinery.language.model.problem.Multiplicity problemMultiplicity) { 399 tools.refinery.language.model.problem.Multiplicity problemMultiplicity) {
382 if (problemMultiplicity instanceof ExactMultiplicity exactMultiplicity) { 400 switch (problemMultiplicity) {
401 case ExactMultiplicity exactMultiplicity -> {
383 return CardinalityIntervals.exactly(exactMultiplicity.getExactValue()); 402 return CardinalityIntervals.exactly(exactMultiplicity.getExactValue());
384 } else if (problemMultiplicity instanceof RangeMultiplicity rangeMultiplicity) { 403 }
404 case RangeMultiplicity rangeMultiplicity -> {
385 var upperBound = rangeMultiplicity.getUpperBound(); 405 var upperBound = rangeMultiplicity.getUpperBound();
386 return CardinalityIntervals.between(rangeMultiplicity.getLowerBound(), 406 return CardinalityIntervals.between(rangeMultiplicity.getLowerBound(),
387 upperBound < 0 ? UpperCardinalities.UNBOUNDED : UpperCardinalities.atMost(upperBound)); 407 upperBound < 0 ? UpperCardinalities.UNBOUNDED : UpperCardinalities.atMost(upperBound));
388 } else { 408 }
389 throw new TracedException(problemMultiplicity, "Unknown multiplicity"); 409 default -> throw new TracedException(problemMultiplicity, "Unknown multiplicity");
390 } 410 }
391 } 411 }
392 412
@@ -521,7 +541,12 @@ public class ModelInitializer {
521 for (int i = 0; i < arity; i++) { 541 for (int i = 0; i < arity; i++) {
522 var argument = arguments.get(i); 542 var argument = arguments.get(i);
523 if (argument instanceof NodeAssertionArgument nodeArgument) { 543 if (argument instanceof NodeAssertionArgument nodeArgument) {
524 nodes[i] = getNodeId(nodeArgument.getNode()); 544 var variableOrNode = nodeArgument.getNode();
545 if (variableOrNode instanceof Node node) {
546 nodes[i] = getNodeId(node);
547 } else {
548 throw new TracedException(argument, "Invalid assertion argument: " + variableOrNode);
549 }
525 } else if (argument instanceof WildcardAssertionArgument) { 550 } else if (argument instanceof WildcardAssertionArgument) {
526 nodes[i] = -1; 551 nodes[i] = -1;
527 } else { 552 } else {
@@ -573,7 +598,7 @@ public class ModelInitializer {
573 private void collectPredicateDefinition(PredicateDefinition predicateDefinition, ModelStoreBuilder storeBuilder) { 598 private void collectPredicateDefinition(PredicateDefinition predicateDefinition, ModelStoreBuilder storeBuilder) {
574 var partialRelation = getPartialRelation(predicateDefinition); 599 var partialRelation = getPartialRelation(predicateDefinition);
575 var query = toQuery(partialRelation.name(), predicateDefinition); 600 var query = toQuery(partialRelation.name(), predicateDefinition);
576 boolean mutable = targetTypes.contains(partialRelation); 601 boolean mutable = targetTypes.contains(partialRelation) || isActionTarget(predicateDefinition);
577 TruthValue defaultValue; 602 TruthValue defaultValue;
578 if (predicateDefinition.isError()) { 603 if (predicateDefinition.isError()) {
579 defaultValue = TruthValue.FALSE; 604 defaultValue = TruthValue.FALSE;
@@ -588,6 +613,15 @@ public class ModelInitializer {
588 storeBuilder.with(translator); 613 storeBuilder.with(translator);
589 } 614 }
590 615
616 private boolean isActionTarget(PredicateDefinition predicateDefinition) {
617 for (var importedProblem : importedProblems) {
618 if (actionTargetCollector.isActionTarget(importedProblem, predicateDefinition)) {
619 return true;
620 }
621 }
622 return false;
623 }
624
591 private RelationalQuery toQuery(String name, PredicateDefinition predicateDefinition) { 625 private RelationalQuery toQuery(String name, PredicateDefinition predicateDefinition) {
592 var problemParameters = predicateDefinition.getParameters(); 626 var problemParameters = predicateDefinition.getParameters();
593 int arity = problemParameters.size(); 627 int arity = problemParameters.size();
@@ -607,23 +641,29 @@ public class ModelInitializer {
607 } 641 }
608 var builder = Query.builder(name).parameters(parameters); 642 var builder = Query.builder(name).parameters(parameters);
609 for (var body : predicateDefinition.getBodies()) { 643 for (var body : predicateDefinition.getBodies()) {
610 try { 644 buildConjunction(body, parameterMap, commonLiterals, builder);
611 var localScope = extendScope(parameterMap, body.getImplicitVariables());
612 var problemLiterals = body.getLiterals();
613 var literals = new ArrayList<>(commonLiterals);
614 for (var problemLiteral : problemLiterals) {
615 toLiteralsTraced(problemLiteral, localScope, literals);
616 }
617 builder.clause(literals);
618 } catch (RuntimeException e) {
619 throw TracedException.addTrace(body, e);
620 }
621 } 645 }
622 return builder.build(); 646 return builder.build();
623 } 647 }
624 648
625 private Map<tools.refinery.language.model.problem.Variable, Variable> extendScope( 649 private void buildConjunction(
626 Map<tools.refinery.language.model.problem.Variable, Variable> existing, 650 Conjunction body, HashMap<tools.refinery.language.model.problem.Variable, ? extends Variable> parameterMap,
651 List<Literal> commonLiterals, AbstractQueryBuilder<?> builder) {
652 try {
653 var localScope = extendScope(parameterMap, body.getImplicitVariables());
654 var problemLiterals = body.getLiterals();
655 var literals = new ArrayList<>(commonLiterals);
656 for (var problemLiteral : problemLiterals) {
657 toLiteralsTraced(problemLiteral, localScope, literals);
658 }
659 builder.clause(literals);
660 } catch (RuntimeException e) {
661 throw TracedException.addTrace(body, e);
662 }
663 }
664
665 private Map<tools.refinery.language.model.problem.Variable, ? extends Variable> extendScope(
666 Map<tools.refinery.language.model.problem.Variable, ? extends Variable> existing,
627 Collection<? extends tools.refinery.language.model.problem.Variable> newVariables) { 667 Collection<? extends tools.refinery.language.model.problem.Variable> newVariables) {
628 if (newVariables.isEmpty()) { 668 if (newVariables.isEmpty()) {
629 return existing; 669 return existing;
@@ -637,8 +677,9 @@ public class ModelInitializer {
637 return localScope; 677 return localScope;
638 } 678 }
639 679
640 private void toLiteralsTraced(Expr expr, Map<tools.refinery.language.model.problem.Variable, Variable> localScope, 680 private void toLiteralsTraced(
641 List<Literal> literals) { 681 Expr expr, Map<tools.refinery.language.model.problem.Variable, ? extends Variable> localScope,
682 List<Literal> literals) {
642 try { 683 try {
643 toLiterals(expr, localScope, literals); 684 toLiterals(expr, localScope, literals);
644 } catch (RuntimeException e) { 685 } catch (RuntimeException e) {
@@ -646,9 +687,12 @@ public class ModelInitializer {
646 } 687 }
647 } 688 }
648 689
649 private void toLiterals(Expr expr, Map<tools.refinery.language.model.problem.Variable, Variable> localScope, 690 private void toLiterals(
650 List<Literal> literals) { 691 Expr expr, Map<tools.refinery.language.model.problem.Variable, ? extends Variable> localScope,
651 switch (expr) { 692 List<Literal> literals) {
693 var extractedOuter = extractModalExpr(expr);
694 var outerModality = extractedOuter.modality();
695 switch (extractedOuter.body()) {
652 case LogicConstant logicConstant -> { 696 case LogicConstant logicConstant -> {
653 switch (logicConstant.getLogicValue()) { 697 switch (logicConstant.getLogicValue()) {
654 case TRUE -> literals.add(BooleanLiteral.TRUE); 698 case TRUE -> literals.add(BooleanLiteral.TRUE);
@@ -658,27 +702,22 @@ public class ModelInitializer {
658 } 702 }
659 case Atom atom -> { 703 case Atom atom -> {
660 var target = getPartialRelation(atom.getRelation()); 704 var target = getPartialRelation(atom.getRelation());
661 var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; 705 var constraint = atom.isTransitiveClosure() ? getTransitiveWrapper(target) : target;
662 var argumentList = toArgumentList(atom.getArguments(), localScope, literals); 706 var argumentList = toArgumentList(atom.getArguments(), localScope, literals);
663 literals.add(target.call(polarity, argumentList)); 707 literals.add(extractedOuter.modality.wrapConstraint(constraint).call(CallPolarity.POSITIVE, argumentList));
664 } 708 }
665 case NegationExpr negationExpr -> { 709 case NegationExpr negationExpr -> {
666 var body = negationExpr.getBody(); 710 var body = negationExpr.getBody();
667 if (!(body instanceof Atom atom)) { 711 var extractedInner = extractModalExpr(body);
668 throw new TracedException(body, "Cannot negate literal"); 712 if (!(extractedInner.body() instanceof Atom atom)) {
713 throw new TracedException(extractedInner.body(), "Cannot negate literal");
669 } 714 }
670 var target = getPartialRelation(atom.getRelation()); 715 var target = getPartialRelation(atom.getRelation());
671 Constraint constraint; 716 Constraint constraint = atom.isTransitiveClosure() ? getTransitiveWrapper(target) : target;
672 if (atom.isTransitiveClosure()) {
673 constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause(
674 target.callTransitive(p1, p2)
675 )).getDnf();
676 } else {
677 constraint = target;
678 }
679 var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); 717 var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables());
680 var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); 718 List<Variable> argumentList = toArgumentList(atom.getArguments(), negatedScope, literals);
681 literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); 719 var innerModality = extractedInner.modality().merge(outerModality.negate());
720 literals.add(createNegationLiteral(innerModality, constraint, argumentList, localScope));
682 } 721 }
683 case ComparisonExpr comparisonExpr -> { 722 case ComparisonExpr comparisonExpr -> {
684 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), 723 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()),
@@ -689,14 +728,117 @@ public class ModelInitializer {
689 default -> throw new TracedException( 728 default -> throw new TracedException(
690 comparisonExpr, "Unsupported operator"); 729 comparisonExpr, "Unsupported operator");
691 }; 730 };
692 literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); 731 literals.add(createEquivalenceLiteral(outerModality, positive, argumentList.get(0), argumentList.get(1),
732 localScope));
733 }
734 default -> throw new TracedException(extractedOuter.body(), "Unsupported literal");
735 }
736 }
737
738 private Constraint getTransitiveWrapper(Constraint target) {
739 return Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause(
740 target.callTransitive(p1, p2)
741 )).getDnf();
742 }
743
744 private static Literal createNegationLiteral(
745 ConcreteModality innerModality, Constraint constraint, List<Variable> argumentList,
746 Map<tools.refinery.language.model.problem.Variable, ? extends Variable> localScope) {
747 if (innerModality.isSet()) {
748 boolean needsQuantification = false;
749 var filteredArguments = new LinkedHashSet<Variable>();
750 for (var argument : argumentList) {
751 if (localScope.containsValue(argument)) {
752 filteredArguments.add(argument);
753 } else {
754 needsQuantification = true;
755 }
756 }
757 // If there are any quantified arguments, set a helper pattern to be lifted so that the appropriate
758 // {@code EXISTS} call are added by the {@code DnfLifter}.
759 if (needsQuantification) {
760 var filteredArgumentList = List.copyOf(filteredArguments);
761 var quantifiedConstraint = Dnf.builder(constraint.name() + "#quantified")
762 .parameters(filteredArgumentList)
763 .clause(
764 constraint.call(CallPolarity.POSITIVE, argumentList)
765 )
766 .build();
767 return innerModality.wrapConstraint(quantifiedConstraint)
768 .call(CallPolarity.NEGATIVE, filteredArgumentList);
769 }
693 } 770 }
694 default -> throw new TracedException(expr, "Unsupported literal"); 771 return innerModality.wrapConstraint(constraint).call(CallPolarity.NEGATIVE, argumentList);
772 }
773
774 private Literal createEquivalenceLiteral(
775 ConcreteModality outerModality, boolean positive, Variable left, Variable right,
776 Map<tools.refinery.language.model.problem.Variable, ? extends Variable> localScope) {
777 if (!outerModality.isSet()) {
778 return new EquivalenceLiteral(positive, left, right);
695 } 779 }
780 if (positive) {
781 return outerModality.wrapConstraint(ReasoningAdapter.EQUALS_SYMBOL).call(left, right);
782 }
783 // Interpret {@code x != y} as {@code !equals(x, y)} at all times, even in modal operators.
784 return createNegationLiteral(outerModality.negate(), ReasoningAdapter.EQUALS_SYMBOL, List.of(left, right),
785 localScope);
786 }
787
788 private record ConcreteModality(@Nullable Concreteness concreteness, @Nullable Modality modality) {
789 public static final ConcreteModality NULL = new ConcreteModality((Concreteness) null, null);
790
791 public ConcreteModality(tools.refinery.language.model.problem.Concreteness concreteness,
792 tools.refinery.language.model.problem.Modality modality) {
793 this(
794 switch (concreteness) {
795 case PARTIAL -> Concreteness.PARTIAL;
796 case CANDIDATE -> Concreteness.CANDIDATE;
797 },
798 switch (modality) {
799 case MUST -> Modality.MUST;
800 case MAY -> Modality.MAY;
801 case NONE -> throw new IllegalArgumentException("Invalid modality");
802 }
803 );
804 }
805
806 public ConcreteModality negate() {
807 var negatedModality = modality == null ? null : modality.negate();
808 return new ConcreteModality(concreteness, negatedModality);
809 }
810
811 public ConcreteModality merge(ConcreteModality outer) {
812 var mergedConcreteness = concreteness == null ? outer.concreteness() : concreteness;
813 var mergedModality = modality == null ? outer.modality() : modality;
814 return new ConcreteModality(mergedConcreteness, mergedModality);
815 }
816
817 public Constraint wrapConstraint(Constraint inner) {
818 if (isSet()) {
819 return new ModalConstraint(modality, concreteness, inner);
820 }
821 return inner;
822 }
823
824 public boolean isSet() {
825 return concreteness != null || modality != null;
826 }
827 }
828
829 private record ExtractedModalExpr(ConcreteModality modality, Expr body) {
830 }
831
832 private ExtractedModalExpr extractModalExpr(Expr expr) {
833 if (expr instanceof ModalExpr modalExpr) {
834 return new ExtractedModalExpr(new ConcreteModality(modalExpr.getConcreteness(), modalExpr.getModality()),
835 modalExpr.getBody());
836 }
837 return new ExtractedModalExpr(ConcreteModality.NULL, expr);
696 } 838 }
697 839
698 private List<Variable> toArgumentList( 840 private List<Variable> toArgumentList(
699 List<Expr> expressions, Map<tools.refinery.language.model.problem.Variable, Variable> localScope, 841 List<Expr> expressions, Map<tools.refinery.language.model.problem.Variable, ? extends Variable> localScope,
700 List<Literal> literals) { 842 List<Literal> literals) {
701 var argumentList = new ArrayList<Variable>(expressions.size()); 843 var argumentList = new ArrayList<Variable>(expressions.size());
702 for (var expr : expressions) { 844 for (var expr : expressions) {
@@ -704,12 +846,14 @@ public class ModelInitializer {
704 throw new TracedException(expr, "Unsupported argument"); 846 throw new TracedException(expr, "Unsupported argument");
705 } 847 }
706 var variableOrNode = variableOrNodeExpr.getVariableOrNode(); 848 var variableOrNode = variableOrNodeExpr.getVariableOrNode();
707 if (variableOrNode instanceof Node node) { 849 switch (variableOrNode) {
850 case Node node -> {
708 int nodeId = getNodeId(node); 851 int nodeId = getNodeId(node);
709 var tempVariable = Variable.of(semanticsUtils.getNameWithoutRootPrefix(node).orElse("_" + nodeId)); 852 var tempVariable = Variable.of(semanticsUtils.getNameWithoutRootPrefix(node).orElse("_" + nodeId));
710 literals.add(new ConstantLiteral(tempVariable, nodeId)); 853 literals.add(new ConstantLiteral(tempVariable, nodeId));
711 argumentList.add(tempVariable); 854 argumentList.add(tempVariable);
712 } else if (variableOrNode instanceof tools.refinery.language.model.problem.Variable problemVariable) { 855 }
856 case tools.refinery.language.model.problem.Variable problemVariable -> {
713 if (variableOrNodeExpr.getSingletonVariable() == problemVariable) { 857 if (variableOrNodeExpr.getSingletonVariable() == problemVariable) {
714 argumentList.add(Variable.of(problemVariable.getName())); 858 argumentList.add(Variable.of(problemVariable.getName()));
715 } else { 859 } else {
@@ -719,8 +863,8 @@ public class ModelInitializer {
719 } 863 }
720 argumentList.add(variable); 864 argumentList.add(variable);
721 } 865 }
722 } else { 866 }
723 throw new TracedException(variableOrNode, "Unknown argument"); 867 default -> throw new TracedException(variableOrNode, "Unknown argument");
724 } 868 }
725 } 869 }
726 return argumentList; 870 return argumentList;
@@ -796,4 +940,157 @@ public class ModelInitializer {
796 return defaultAssertions; 940 return defaultAssertions;
797 } 941 }
798 } 942 }
943
944 private void collectRules(ModelStoreBuilder storeBuilder) {
945 for (var importedProblem : importedProblems) {
946 for (var statement : importedProblem.getStatements()) {
947 if (statement instanceof RuleDefinition ruleDefinition) {
948 collectRule(ruleDefinition, storeBuilder);
949 }
950 }
951 }
952 }
953
954 private void collectRule(RuleDefinition ruleDefinition, ModelStoreBuilder storeBuilder) {
955 try {
956 var name = semanticsUtils.getNameWithoutRootPrefix(ruleDefinition)
957 .orElseGet(() -> "::rule" + ruleCount);
958 ruleCount++;
959 var rule = toRule(name, ruleDefinition);
960 switch (ruleDefinition.getKind()) {
961 case DECISION -> storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class)
962 .ifPresent(dseBuilder -> dseBuilder.transformation(rule));
963 case PROPAGATION -> storeBuilder.tryGetAdapter(PropagationBuilder.class)
964 .ifPresent(propagationBuilder -> propagationBuilder.rule(rule));
965 case REFINEMENT -> {
966 // Rules not marked for decision or propagation are not invoked automatically.
967 }
968 }
969 } catch (InvalidClauseException e) {
970 int clauseIndex = e.getClauseIndex();
971 var bodies = ruleDefinition.getPreconditions();
972 if (clauseIndex < bodies.size()) {
973 throw new TracedException(bodies.get(clauseIndex), e);
974 } else {
975 throw new TracedException(ruleDefinition, e);
976 }
977 } catch (RuntimeException e) {
978 throw TracedException.addTrace(ruleDefinition, e);
979 }
980 }
981
982 private Rule toRule(String name, RuleDefinition ruleDefinition) {
983 var problemParameters = ruleDefinition.getParameters();
984 int arity = problemParameters.size();
985 var parameters = new NodeVariable[arity];
986 var parameterMap = HashMap.<tools.refinery.language.model.problem.Variable, NodeVariable>newHashMap(arity);
987 var commonLiterals = new ArrayList<Literal>();
988 var parametersToFocus = new ArrayList<tools.refinery.language.model.problem.Variable>();
989 for (int i = 0; i < arity; i++) {
990 var problemParameter = problemParameters.get(i);
991 var parameter = Variable.of(problemParameter.getName());
992 parameters[i] = parameter;
993 parameterMap.put(problemParameter, parameter);
994 var parameterType = problemParameter.getParameterType();
995 if (parameterType != null) {
996 var partialType = getPartialRelation(parameterType);
997 var modality = new ConcreteModality(problemParameter.getConcreteness(),
998 problemParameter.getModality());
999 commonLiterals.add(modality.wrapConstraint(partialType).call(parameter));
1000 }
1001 if (ruleDefinition.getKind() == RuleKind.DECISION &&
1002 problemParameter.getBinding() == ParameterBinding.SINGLE) {
1003 commonLiterals.add(MultiObjectTranslator.MULTI_VIEW.call(CallPolarity.NEGATIVE, parameter));
1004 }
1005 if (problemParameter.getBinding() == ParameterBinding.FOCUS) {
1006 parametersToFocus.add(problemParameter);
1007 }
1008 }
1009 toMonomorphicMatchingLiterals(parametersToFocus, parameterMap, commonLiterals);
1010 var builder = Rule.builder(name).parameters(parameters);
1011 var preconditions = ruleDefinition.getPreconditions();
1012 if (preconditions.isEmpty()) {
1013 builder.clause(commonLiterals);
1014 } else {
1015 for (var precondition : preconditions) {
1016 buildConjunction(precondition, parameterMap, commonLiterals, builder);
1017 }
1018 }
1019 for (var consequent : ruleDefinition.getConsequents()) {
1020 buildConsequent(consequent, parameterMap, parametersToFocus, builder);
1021 }
1022 return builder.build();
1023 }
1024
1025 private static void toMonomorphicMatchingLiterals(
1026 ArrayList<tools.refinery.language.model.problem.Variable> parametersToFocus,
1027 HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> parameterMap,
1028 ArrayList<Literal> commonLiterals) {
1029 int focusCount = parametersToFocus.size();
1030 for (int i = 0; i < focusCount; i++) {
1031 var leftFocus = parameterMap.get(parametersToFocus.get(i));
1032 for (int j = i + 1; j < focusCount; j++) {
1033 var rightFocus = parameterMap.get(parametersToFocus.get(j));
1034 commonLiterals.add(Literals.not(PartialLiterals.must(
1035 ReasoningAdapter.EQUALS_SYMBOL.call(leftFocus, rightFocus))));
1036 }
1037 }
1038 }
1039
1040 private void buildConsequent(
1041 Consequent body, HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> parameterMap,
1042 Collection<tools.refinery.language.model.problem.Variable> parametersToFocus, RuleBuilder builder) {
1043 try {
1044 var actionLiterals = new ArrayList<ActionLiteral>();
1045 HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> localScope;
1046 if (parametersToFocus.isEmpty()) {
1047 localScope = parameterMap;
1048 } else {
1049 localScope = new LinkedHashMap<>(parameterMap);
1050 for (var parameterToFocus : parametersToFocus) {
1051 var originalParameter = parameterMap.get(parameterToFocus);
1052 var focusedParameter = Variable.of(originalParameter.getName() + "#focused");
1053 localScope.put(parameterToFocus, focusedParameter);
1054 actionLiterals.add(PartialActionLiterals.focus(originalParameter, focusedParameter));
1055 }
1056 }
1057 for (var action : body.getActions()) {
1058 toActionLiterals(action, localScope, actionLiterals);
1059 }
1060 builder.action(actionLiterals);
1061 } catch (RuntimeException e) {
1062 throw TracedException.addTrace(body, e);
1063 }
1064 }
1065
1066 private void toActionLiterals(
1067 Action action, HashMap<tools.refinery.language.model.problem.Variable, NodeVariable> localScope,
1068 List<ActionLiteral> actionLiterals) {
1069 if (!(action instanceof AssertionAction assertionAction)) {
1070 throw new TracedException(action, "Unknown action");
1071 }
1072 var partialRelation = getPartialRelation(assertionAction.getRelation());
1073 var truthValue = getTruthValue(assertionAction.getValue());
1074 var problemArguments = assertionAction.getArguments();
1075 var arguments = new NodeVariable[problemArguments.size()];
1076 for (int i = 0; i < arguments.length; i++) {
1077 var problemArgument = problemArguments.get(i);
1078 if (!(problemArgument instanceof NodeAssertionArgument nodeAssertionArgument)) {
1079 throw new TracedException(problemArgument, "Invalid argument");
1080 }
1081 var variableOrNode = nodeAssertionArgument.getNode();
1082 switch (variableOrNode) {
1083 case tools.refinery.language.model.problem.Variable problemVariable ->
1084 arguments[i] = localScope.get(problemVariable);
1085 case Node node -> {
1086 int nodeId = getNodeId(node);
1087 var tempVariable = Variable.of(semanticsUtils.getNameWithoutRootPrefix(node).orElse("_" + nodeId));
1088 actionLiterals.add(ActionLiterals.constant(tempVariable, nodeId));
1089 arguments[i] = tempVariable;
1090 }
1091 default -> throw new TracedException(problemArgument, "Invalid argument");
1092 }
1093 }
1094 actionLiterals.add(PartialActionLiterals.merge(partialRelation, truthValue, arguments));
1095 }
799} 1096}
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java
index aef0fd89..3a979bf0 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java
@@ -152,7 +152,7 @@ class ProblemTraceImpl implements ProblemTrace {
152 152
153 @Override 153 @Override
154 public PartialRelation getPartialRelation(QualifiedName qualifiedName) { 154 public PartialRelation getPartialRelation(QualifiedName qualifiedName) {
155 var relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION); 155 var relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION);
156 return getPartialRelation(getElement(relationScope, qualifiedName, Relation.class)); 156 return getPartialRelation(getElement(relationScope, qualifiedName, Relation.class));
157 } 157 }
158 158
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 f097143f..ed4841c4 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
@@ -310,7 +310,7 @@ public class SolutionSerializer {
310 var relation = findPartialRelation(partialRelation); 310 var relation = findPartialRelation(partialRelation);
311 var cursor = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, partialRelation).getAll(); 311 var cursor = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, partialRelation).getAll();
312 // Make sure to output assertions in a deterministic order. 312 // Make sure to output assertions in a deterministic order.
313 var sortedTuples = new TreeSet<Tuple>(); 313 var sortedTuples = new TreeMap<Tuple, LogicValue>();
314 while (cursor.move()) { 314 while (cursor.move()) {
315 var tuple = cursor.getKey(); 315 var tuple = cursor.getKey();
316 var from = nodes.get(tuple.get(0)); 316 var from = nodes.get(tuple.get(0));
@@ -320,17 +320,20 @@ public class SolutionSerializer {
320 continue; 320 continue;
321 } 321 }
322 var value = cursor.getValue(); 322 var value = cursor.getValue();
323 if (!value.isConcrete()) { 323 var logicValue = switch (value) {
324 throw new IllegalStateException("Invalid %s %s for tuple %s".formatted(partialRelation, value, tuple)); 324 case TRUE -> LogicValue.TRUE;
325 } 325 case FALSE -> throw new IllegalStateException("Invalid %s %s for tuple %s"
326 if (value.may()) { 326 .formatted(partialRelation, value, tuple));
327 sortedTuples.add(tuple); 327 case UNKNOWN -> LogicValue.UNKNOWN;
328 } 328 case ERROR -> LogicValue.ERROR;
329 };
330 sortedTuples.put(tuple, logicValue);
329 } 331 }
330 for (var tuple : sortedTuples) { 332 for (var entry : sortedTuples.entrySet()) {
333 var tuple = entry.getKey();
331 var from = nodes.get(tuple.get(0)); 334 var from = nodes.get(tuple.get(0));
332 var to = nodes.get(tuple.get(1)); 335 var to = nodes.get(tuple.get(1));
333 addAssertion(relation, LogicValue.TRUE, from, to); 336 addAssertion(relation, entry.getValue(), from, to);
334 } 337 }
335 } 338 }
336 339
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 91008919..29f8ab8b 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
@@ -51,7 +51,7 @@ public class MetadataCreator {
51 this.problemTrace = problemTrace; 51 this.problemTrace = problemTrace;
52 var problem = problemTrace.getProblem(); 52 var problem = problemTrace.getProblem();
53 nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); 53 nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE);
54 relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION); 54 relationScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION);
55 } 55 }
56 56
57 public List<NodeMetadata> getNodesMetadata(Model model, Concreteness concreteness) { 57 public List<NodeMetadata> getNodesMetadata(Model model, Concreteness concreteness) {
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 08f7a585..10e994a0 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
+++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
@@ -18,7 +18,7 @@ enum ModuleKind:
18Statement: 18Statement:
19 ImportStatement | Assertion | ClassDeclaration | EnumDeclaration | 19 ImportStatement | Assertion | ClassDeclaration | EnumDeclaration |
20 DatatypeDeclaration | AggregatorDeclaration | PredicateDefinition | 20 DatatypeDeclaration | AggregatorDeclaration | PredicateDefinition |
21 /* FunctionDefinition | RuleDefinition | */ 21 /* FunctionDefinition | */ RuleDefinition |
22 ScopeDeclaration | NodeDeclaration; 22 ScopeDeclaration | NodeDeclaration;
23 23
24ImportStatement: 24ImportStatement:
@@ -45,7 +45,7 @@ AggregatorDeclaration:
45 "extern" "aggregator" name=Identifier "."; 45 "extern" "aggregator" name=Identifier ".";
46 46
47enum ReferenceKind: 47enum ReferenceKind:
48 REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container"; 48 REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container" | PARTIAL="partial";
49 49
50ReferenceDeclaration: 50ReferenceDeclaration:
51 (referenceType=[Relation|NonContainmentQualifiedName] | 51 (referenceType=[Relation|NonContainmentQualifiedName] |
@@ -75,35 +75,40 @@ Conjunction:
75// 75//
76//Case: 76//Case:
77// Conjunction ({Match.condition=current} "->" value=Expr)?; 77// Conjunction ({Match.condition=current} "->" value=Expr)?;
78//RuleDefinition: 78
79// "rule" 79enum RuleKind:
80// name=Identifier 80 DECISION="decision" | PROPAGATION="propagation";
81// "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" 81
82// (":" preconditions+=Conjunction (";" preconditions+=Conjunction)*)? 82RuleDefinition:
83// "==>" consequents+=Consequent (";" consequents+=Consequent)*)? 83 kind=RuleKind? "rule"
84// "."; 84 name=Identifier
85 "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")"
86 ("<->" preconditions+=Conjunction (";" preconditions+=Conjunction)*)?
87 ("==>" consequents+=Consequent (";" consequents+=Consequent)*)?
88 ".";
89
90enum ParameterBinding:
91 FOCUS="&" | MULTI="*";
85 92
86Parameter: 93Parameter:
87 parameterType=[Relation|QualifiedName]? name=Identifier; 94 (
95 (concreteness=Concreteness? modality=Modality)?
96 parameterType=[Relation|QualifiedName]
97 )? binding=ParameterBinding? name=Identifier;
88 98
89//Consequent: 99Consequent:
90// actions+=Action ("," actions+=Action)*; 100 actions+=Action ("," actions+=Action)*;
91// 101
92//Action: 102Action:
93// AssertionAction | DeleteAction | NewAction; 103 AssertionAction;
94// 104
95//AssertionAction: 105AssertionAction:
96// value=ShortLogicValue? atom=Atom | 106 relation=[Relation|QualifiedName]
97// atom=Atom (overwrite?=":=" | "<:") value=LogicValue; 107 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")"
98// 108 ":" value=Expr |
99//DeleteAction: 109 value=ShortLogicConstant
100// "delete" variableOrNode=[VariableOrNode|QualifiedName]; 110 relation=[Relation|QualifiedName]
101// 111 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")";
102//NewAction:
103// "new" variable=NewVariable ("<:" parent=[VariableOrNode|QualifiedName])?;
104//
105//NewVariable:
106// name=Identifier;
107 112
108Expr: 113Expr:
109 AssignmentExpr; 114 AssignmentExpr;
@@ -159,7 +164,7 @@ RangeExpr returns Expr:
159 164
160UnaryExpr returns Expr: 165UnaryExpr returns Expr:
161 ArithmeticUnaryExpr | NegationExpr | 166 ArithmeticUnaryExpr | NegationExpr |
162 CountExpr | AggregationExpr | CastExpr; 167 CountExpr | AggregationExpr | ModalExpr | CastExpr;
163 168
164enum UnaryOp: 169enum UnaryOp:
165 PLUS="+" | MINUS="-"; 170 PLUS="+" | MINUS="-";
@@ -177,6 +182,15 @@ AggregationExpr:
177 aggregator=[AggregatorDeclaration|QualifiedName] 182 aggregator=[AggregatorDeclaration|QualifiedName]
178 "{" value=Expr "|" condition=ComparisonExpr "}"; 183 "{" value=Expr "|" condition=ComparisonExpr "}";
179 184
185enum Concreteness:
186 CANDIDATE="candidate";
187
188enum Modality:
189 MUST="must" | MAY="may";
190
191ModalExpr:
192 concreteness=Concreteness? modality=Modality body=UnaryExpr;
193
180CastExpr returns Expr: 194CastExpr returns Expr:
181 CastExprBody ({CastExpr.body=current} "as" targetType=[Relation|QualifiedName])?; 195 CastExprBody ({CastExpr.body=current} "as" targetType=[Relation|QualifiedName])?;
182 196
@@ -281,7 +295,7 @@ Identifier:
281 295
282NonContainmentIdentifier: 296NonContainmentIdentifier:
283 ID | "atom" | "multi" | "contained" | "problem" | "module" | 297 ID | "atom" | "multi" | "contained" | "problem" | "module" |
284 "datatype" | "aggregator"; 298 "datatype" | "aggregator" | "decision" | "propagation";
285 299
286Real returns ecore::EDouble: 300Real returns ecore::EDouble:
287 EXPONENTIAL | INT "." (INT | EXPONENTIAL); 301 EXPONENTIAL | INT "." (INT | EXPONENTIAL);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
index d6ece1ea..c6fca89a 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
@@ -35,7 +35,7 @@ public class ProblemFormatter extends AbstractJavaFormatter {
35 surroundNewLines(doc, assertion, this::singleNewLine); 35 surroundNewLines(doc, assertion, this::singleNewLine);
36 var region = regionFor(assertion); 36 var region = regionFor(assertion);
37 doc.append(region.feature(ProblemPackage.Literals.ASSERTION__DEFAULT), this::oneSpace); 37 doc.append(region.feature(ProblemPackage.Literals.ASSERTION__DEFAULT), this::oneSpace);
38 doc.append(region.feature(ProblemPackage.Literals.ASSERTION__RELATION), this::noSpace); 38 doc.append(region.feature(ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION), this::noSpace);
39 formatParenthesizedList(region, doc); 39 formatParenthesizedList(region, doc);
40 for (var argument : assertion.getArguments()) { 40 for (var argument : assertion.getArguments()) {
41 doc.format(argument); 41 doc.format(argument);
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 8fd60364..505c7787 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
@@ -154,6 +154,9 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
154 if (ProblemUtil.isTypeLike(relation)) { 154 if (ProblemUtil.isTypeLike(relation)) {
155 builder.put(TYPE_LIKE, TYPE_LIKE_TRUE); 155 builder.put(TYPE_LIKE, TYPE_LIKE_TRUE);
156 } 156 }
157 } else if (eObject instanceof RuleDefinition) {
158 // Rule definitions and predicates live in the same namespace.
159 builder.put(SHADOWING_KEY, SHADOWING_KEY_RELATION);
157 } else if (eObject instanceof AggregatorDeclaration) { 160 } else if (eObject instanceof AggregatorDeclaration) {
158 builder.put(SHADOWING_KEY, SHADOWING_KEY_AGGREGATOR); 161 builder.put(SHADOWING_KEY, SHADOWING_KEY_AGGREGATOR);
159 } 162 }
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 d94c9a13..21f64236 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
@@ -31,11 +31,11 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider {
31 public IScope getScope(EObject context, EReference reference) { 31 public IScope getScope(EObject context, EReference reference) {
32 var scope = super.getScope(context, reference); 32 var scope = super.getScope(context, reference);
33 if (reference == ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE) { 33 if (reference == ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE) {
34 return getNodesScope(context, scope); 34 // On the right side of a rule, assertion arguments may refer to variables.
35 var rule = EcoreUtil2.getContainerOfType(context, RuleDefinition.class);
36 return rule == null ? getNodesScope(context, scope) : getVariableScope(context, scope);
35 } 37 }
36 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE 38 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) {
37 || reference == ProblemPackage.Literals.NEW_ACTION__PARENT
38 || reference == ProblemPackage.Literals.DELETE_ACTION__VARIABLE_OR_NODE) {
39 return getVariableScope(context, scope); 39 return getVariableScope(context, scope);
40 } 40 }
41 if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { 41 if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) {
@@ -81,13 +81,6 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider {
81 switch (currentContext) { 81 switch (currentContext) {
82 case ExistentialQuantifier quantifier -> variables.addAll(quantifier.getImplicitVariables()); 82 case ExistentialQuantifier quantifier -> variables.addAll(quantifier.getImplicitVariables());
83 case Match match -> variables.addAll(match.getCondition().getImplicitVariables()); 83 case Match match -> variables.addAll(match.getCondition().getImplicitVariables());
84 case Consequent consequent -> {
85 for (var literal : consequent.getActions()) {
86 if (literal instanceof NewAction newAction && newAction.getVariable() != null) {
87 variables.add(newAction.getVariable());
88 }
89 }
90 }
91 default -> { 84 default -> {
92 // Nothing to add. 85 // Nothing to add.
93 } 86 }
diff --git a/subprojects/language/src/main/java/tools/refinery/language/serializer/PreferShortAssertionsProblemSemanticSequencer.java b/subprojects/language/src/main/java/tools/refinery/language/serializer/PreferShortAssertionsProblemSemanticSequencer.java
index 3432b2d8..225bf49d 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/serializer/PreferShortAssertionsProblemSemanticSequencer.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/serializer/PreferShortAssertionsProblemSemanticSequencer.java
@@ -12,9 +12,11 @@ import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransi
12import tools.refinery.language.model.problem.Assertion; 12import tools.refinery.language.model.problem.Assertion;
13import tools.refinery.language.model.problem.LogicConstant; 13import tools.refinery.language.model.problem.LogicConstant;
14import tools.refinery.language.model.problem.LogicValue; 14import tools.refinery.language.model.problem.LogicValue;
15import tools.refinery.language.model.problem.ProblemPackage;
16import tools.refinery.language.services.ProblemGrammarAccess; 15import tools.refinery.language.services.ProblemGrammarAccess;
17 16
17import static tools.refinery.language.model.problem.ProblemPackage.Literals.ABSTRACT_ASSERTION__ARGUMENTS;
18import static tools.refinery.language.model.problem.ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION;
19
18public class PreferShortAssertionsProblemSemanticSequencer extends ProblemSemanticSequencer { 20public class PreferShortAssertionsProblemSemanticSequencer extends ProblemSemanticSequencer {
19 @Inject 21 @Inject
20 private ProblemGrammarAccess grammarAccess; 22 private ProblemGrammarAccess grammarAccess;
@@ -27,13 +29,13 @@ public class PreferShortAssertionsProblemSemanticSequencer extends ProblemSemant
27 return; 29 return;
28 } 30 }
29 if (errorAcceptor != null) { 31 if (errorAcceptor != null) {
30 if (transientValues.isValueTransient(semanticObject, ProblemPackage.Literals.ASSERTION__RELATION) == ValueTransient.YES) { 32 if (transientValues.isValueTransient(semanticObject, ABSTRACT_ASSERTION__RELATION) == ValueTransient.YES) {
31 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, 33 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject,
32 ProblemPackage.Literals.ASSERTION__RELATION)); 34 ABSTRACT_ASSERTION__RELATION));
33 } 35 }
34 if (transientValues.isListTransient(semanticObject, ProblemPackage.Literals.ASSERTION__ARGUMENTS) == ListTransient.YES) { 36 if (transientValues.isListTransient(semanticObject, ABSTRACT_ASSERTION__ARGUMENTS) == ListTransient.YES) {
35 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, 37 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject,
36 ProblemPackage.Literals.ASSERTION__ARGUMENTS)); 38 ABSTRACT_ASSERTION__ARGUMENTS));
37 } 39 }
38 } 40 }
39 var feeder = createSequencerFeeder(context, semanticObject); 41 var feeder = createSequencerFeeder(context, semanticObject);
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
index 9e44063d..65721924 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ExprType.java
@@ -8,6 +8,7 @@ package tools.refinery.language.typesystem;
8public sealed interface ExprType permits FixedType, MutableType { 8public sealed interface ExprType permits FixedType, MutableType {
9 NodeType NODE = new NodeType(); 9 NodeType NODE = new NodeType();
10 LiteralType LITERAL = new LiteralType(); 10 LiteralType LITERAL = new LiteralType();
11 ModalLiteralType MODAL_LITERAL = new ModalLiteralType();
11 InvalidType INVALID = new InvalidType(); 12 InvalidType INVALID = new InvalidType();
12 13
13 FixedType getActualType(); 14 FixedType getActualType();
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
index 1b2ded48..f9e75f26 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/FixedType.java
@@ -5,7 +5,8 @@
5 */ 5 */
6package tools.refinery.language.typesystem; 6package tools.refinery.language.typesystem;
7 7
8public sealed interface FixedType extends ExprType permits NodeType, LiteralType, InvalidType, DataExprType { 8public sealed interface FixedType extends ExprType permits NodeType, LiteralType, ModalLiteralType, InvalidType,
9 DataExprType {
9 @Override 10 @Override
10 default FixedType getActualType() { 11 default FixedType getActualType() {
11 return this; 12 return this;
diff --git a/subprojects/language/src/main/java/tools/refinery/language/typesystem/ModalLiteralType.java b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ModalLiteralType.java
new file mode 100644
index 00000000..6b44977a
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/ModalLiteralType.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 ModalLiteralType implements FixedType {
9 ModalLiteralType() {
10 }
11
12 @Override
13 public String toString() {
14 return "modal constraint";
15 }
16}
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
index 6691f0ae..63815506 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/typesystem/TypedModule.java
@@ -63,6 +63,7 @@ public class TypedModule {
63 for (var statement : problem.getStatements()) { 63 for (var statement : problem.getStatements()) {
64 switch (statement) { 64 switch (statement) {
65 case PredicateDefinition predicateDefinition -> checkTypes(predicateDefinition); 65 case PredicateDefinition predicateDefinition -> checkTypes(predicateDefinition);
66 case RuleDefinition ruleDefinition -> checkTypes(ruleDefinition);
66 case Assertion assertion -> checkTypes(assertion); 67 case Assertion assertion -> checkTypes(assertion);
67 default -> { 68 default -> {
68 // Nothing to type check. 69 // Nothing to type check.
@@ -79,13 +80,33 @@ public class TypedModule {
79 } 80 }
80 } 81 }
81 82
83 private void checkTypes(RuleDefinition ruleDefinition) {
84 for (var conjunction : ruleDefinition.getPreconditions()) {
85 for (var literal : conjunction.getLiterals()) {
86 expectType(literal, ExprType.MODAL_LITERAL);
87 }
88 }
89 for (var consequent : ruleDefinition.getConsequents()) {
90 for (var action : consequent.getActions()) {
91 if (action instanceof AssertionAction assertionAction) {
92 checkTypes(assertionAction);
93 }
94 }
95 }
96 }
97
82 private void checkTypes(Assertion assertion) { 98 private void checkTypes(Assertion assertion) {
99 checkAssertionValueType(assertion);
100 checkNodeAssertionArgumentTypes(assertion, false);
101 }
102
103 private void checkAssertionValueType(AbstractAssertion assertion) {
83 var relation = assertion.getRelation(); 104 var relation = assertion.getRelation();
84 var value = assertion.getValue();
85 if (relation == null) { 105 if (relation == null) {
86 return; 106 return;
87 } 107 }
88 var type = signatureProvider.getSignature(relation).resultType(); 108 var type = signatureProvider.getSignature(relation).resultType();
109 var value = assertion.getValue();
89 if (type == ExprType.LITERAL) { 110 if (type == ExprType.LITERAL) {
90 if (value == null) { 111 if (value == null) {
91 return; 112 return;
@@ -95,11 +116,43 @@ public class TypedModule {
95 } 116 }
96 if (value == null) { 117 if (value == null) {
97 var message = "Assertion value of type %s is required.".formatted(type); 118 var message = "Assertion value of type %s is required.".formatted(type);
98 error(message, assertion, ProblemPackage.Literals.ASSERTION__RELATION, 0, ProblemValidator.TYPE_ERROR); 119 error(message, assertion, ProblemPackage.Literals.ABSTRACT_ASSERTION__VALUE, 0,
120 ProblemValidator.TYPE_ERROR);
99 } 121 }
100 expectType(value, type); 122 expectType(value, type);
101 } 123 }
102 124
125 private void checkNodeAssertionArgumentTypes(AbstractAssertion assertion, boolean allowVariables) {
126 for (var argument : assertion.getArguments()) {
127 if (argument instanceof NodeAssertionArgument nodeAssertionArgument) {
128 checkNodeAssertionArgumentType(nodeAssertionArgument, allowVariables);
129 }
130 }
131 }
132
133 private void checkNodeAssertionArgumentType(NodeAssertionArgument nodeAssertionArgument, boolean allowVariables) {
134 var variableOrNode = nodeAssertionArgument.getNode();
135 if (variableOrNode == null || variableOrNode.eIsProxy()) {
136 return;
137 }
138 if (allowVariables && variableOrNode instanceof Variable variable) {
139 var variableType = getVariableType(variable);
140 if (variableType == ExprType.INVALID || variableType == ExprType.NODE) {
141 return;
142 }
143 }
144 if (variableOrNode instanceof Node) {
145 return;
146 }
147 error("Assertion argument must be a node.", nodeAssertionArgument,
148 ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE, 0, ProblemValidator.TYPE_ERROR);
149 }
150
151 private void checkTypes(AssertionAction assertionAction) {
152 checkAssertionValueType(assertionAction);
153 checkNodeAssertionArgumentTypes(assertionAction, true);
154 }
155
103 public List<FeatureBasedDiagnostic> getDiagnostics() { 156 public List<FeatureBasedDiagnostic> getDiagnostics() {
104 return diagnostics; 157 return diagnostics;
105 } 158 }
@@ -202,6 +255,7 @@ public class TypedModule {
202 case RangeExpr rangeExpr -> computeExpressionType(rangeExpr); 255 case RangeExpr rangeExpr -> computeExpressionType(rangeExpr);
203 case ArithmeticBinaryExpr arithmeticBinaryExpr -> computeExpressionType(arithmeticBinaryExpr); 256 case ArithmeticBinaryExpr arithmeticBinaryExpr -> computeExpressionType(arithmeticBinaryExpr);
204 case CastExpr castExpr -> computeExpressionType(castExpr); 257 case CastExpr castExpr -> computeExpressionType(castExpr);
258 case ModalExpr modalExpr -> computeExpressionType(modalExpr);
205 default -> { 259 default -> {
206 error("Unknown expression: " + expr.getClass().getSimpleName(), expr, null, 0, 260 error("Unknown expression: " + expr.getClass().getSimpleName(), expr, null, 0,
207 ProblemValidator.UNKNOWN_EXPRESSION_ISSUE); 261 ProblemValidator.UNKNOWN_EXPRESSION_ISSUE);
@@ -290,6 +344,9 @@ public class TypedModule {
290 // Negation of literals yields another (non-enumerable) literal. 344 // Negation of literals yields another (non-enumerable) literal.
291 return ExprType.LITERAL; 345 return ExprType.LITERAL;
292 } 346 }
347 if (actualType == ExprType.MODAL_LITERAL) {
348 return ExprType.MODAL_LITERAL;
349 }
293 if (actualType == ExprType.INVALID) { 350 if (actualType == ExprType.INVALID) {
294 return ExprType.INVALID; 351 return ExprType.INVALID;
295 } 352 }
@@ -507,6 +564,28 @@ public class TypedModule {
507 return ExprType.INVALID; 564 return ExprType.INVALID;
508 } 565 }
509 566
567 @NotNull
568 private ExprType computeExpressionType(ModalExpr expr) {
569 var body = expr.getBody();
570 if (body == null) {
571 return ExprType.INVALID;
572 }
573 var actualType = getExpressionType(body);
574 if (actualType == ExprType.LITERAL || BuiltinTermInterpreter.BOOLEAN_TYPE.equals(actualType)) {
575 return ExprType.MODAL_LITERAL;
576 }
577 if (actualType == ExprType.INVALID) {
578 return ExprType.INVALID;
579 }
580 if (actualType instanceof MutableType) {
581 error(OPERAND_TYPE_ERROR_MESSAGE, body, null, 0, ProblemValidator.TYPE_ERROR);
582 return ExprType.INVALID;
583 }
584 var message = "Data type %s does not support modal operators.".formatted(actualType);
585 error(message, expr, null, 0, ProblemValidator.TYPE_ERROR);
586 return ExprType.INVALID;
587 }
588
510 private FixedType getCommonDataType(BinaryExpr expr) { 589 private FixedType getCommonDataType(BinaryExpr expr) {
511 var commonType = getCommonType(expr); 590 var commonType = getCommonType(expr);
512 if (!(commonType instanceof DataExprType) && commonType != ExprType.INVALID) { 591 if (!(commonType instanceof DataExprType) && commonType != ExprType.INVALID) {
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 9daa8f61..e1820261 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
@@ -42,13 +42,11 @@ public final class ProblemUtil {
42 } 42 }
43 43
44 public static boolean isImplicit(EObject eObject) { 44 public static boolean isImplicit(EObject eObject) {
45 if (eObject instanceof Node node) { 45 return switch (eObject) {
46 return isImplicitNode(node); 46 case Node node -> isImplicitNode(node);
47 } else if (eObject instanceof Variable variable) { 47 case Variable variable -> isImplicitVariable(variable);
48 return isImplicitVariable(variable); 48 default -> false;
49 } else { 49 };
50 return false;
51 }
52 } 50 }
53 51
54 public static boolean isError(EObject eObject) { 52 public static boolean isError(EObject eObject) {
@@ -119,7 +117,7 @@ public final class ProblemUtil {
119 return false; 117 return false;
120 } 118 }
121 return switch (kind) { 119 return switch (kind) {
122 case CONTAINMENT -> false; 120 case CONTAINMENT, PARTIAL -> false;
123 case CONTAINER -> true; 121 case CONTAINER -> true;
124 case DEFAULT, REFERENCE -> { 122 case DEFAULT, REFERENCE -> {
125 var opposite = referenceDeclaration.getOpposite(); 123 var opposite = referenceDeclaration.getOpposite();
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ActionTargetCollector.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ActionTargetCollector.java
new file mode 100644
index 00000000..67cd5777
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ActionTargetCollector.java
@@ -0,0 +1,73 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.validation;
7
8import com.google.inject.Inject;
9import com.google.inject.Singleton;
10import org.eclipse.xtext.EcoreUtil2;
11import org.eclipse.xtext.util.IResourceScopeCache;
12import org.eclipse.xtext.util.Tuples;
13import tools.refinery.language.model.problem.*;
14
15import java.util.HashSet;
16import java.util.Set;
17
18@Singleton
19public class ActionTargetCollector {
20 private static final String ACTION_TARGETS =
21 "tools.refinery.language.validation.ActionTargetCollector.ACTION_TARGETS";
22
23 @Inject
24 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
25
26 public boolean isActionTarget(Relation relation) {
27 var problem = EcoreUtil2.getContainerOfType(relation, Problem.class);
28 return problem != null && isActionTarget(problem, relation);
29 }
30
31 public boolean isActionTarget(Problem problem, Relation relation) {
32 var targets = getActionTargets(problem);
33 if (targets.contains(relation)) {
34 return true;
35 }
36 if (relation instanceof ReferenceDeclaration referenceDeclaration) {
37 var opposite = referenceDeclaration.getOpposite();
38 return opposite != null && targets.contains(opposite);
39 }
40 return false;
41 }
42
43 protected Set<Relation> getActionTargets(Problem problem) {
44 var resource = problem.eResource();
45 if (resource == null) {
46 return doGetActionTargets(problem);
47 }
48 return cache.get(Tuples.create(problem, ACTION_TARGETS), resource, () -> doGetActionTargets(problem));
49 }
50
51 protected Set<Relation> doGetActionTargets(Problem problem) {
52 var targets = new HashSet<Relation>();
53 for (var statement : problem.getStatements()) {
54 if (statement instanceof RuleDefinition ruleDefinition) {
55 collectTargets(ruleDefinition, targets);
56 }
57 }
58 return targets;
59 }
60
61 private static void collectTargets(RuleDefinition ruleDefinition, HashSet<Relation> targets) {
62 for (var consequent : ruleDefinition.getConsequents()) {
63 for (var action : consequent.getActions()) {
64 if (action instanceof AssertionAction assertionAction) {
65 var target = assertionAction.getRelation();
66 if (target != null) {
67 targets.add(target);
68 }
69 }
70 }
71 }
72 }
73}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ExistsVariableCollector.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ExistsVariableCollector.java
new file mode 100644
index 00000000..5812bdc4
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ExistsVariableCollector.java
@@ -0,0 +1,75 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.validation;
7
8import com.google.inject.Inject;
9import com.google.inject.Singleton;
10import org.eclipse.xtext.EcoreUtil2;
11import org.eclipse.xtext.util.IResourceScopeCache;
12import org.eclipse.xtext.util.Tuples;
13import tools.refinery.language.model.problem.*;
14import tools.refinery.language.scoping.imports.ImportAdapterProvider;
15import tools.refinery.language.utils.ProblemUtil;
16
17import java.util.HashSet;
18import java.util.Set;
19
20@Singleton
21public class ExistsVariableCollector {
22 private static final String EXISTS_VARIABLES =
23 "tools.refinery.language.validation.ExistsVariableCollector.EXISTS_VARIABLES";
24
25 @Inject
26 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
27
28 @Inject
29 private ImportAdapterProvider importAdapterProvider;
30
31 public boolean missingExistsConstraint(Variable variable) {
32 if (variable instanceof Parameter) {
33 return false;
34 }
35 if (ProblemUtil.isImplicitVariable(variable)) {
36 var negation = EcoreUtil2.getContainerOfType(variable, NegationExpr.class);
37 if (negation != null) {
38 // Negations are implicitly quantified.
39 return false;
40 }
41 }
42 var conjunction = EcoreUtil2.getContainerOfType(variable, Conjunction.class);
43 if (conjunction == null) {
44 return true;
45 }
46 var variables = getExistsVariables(conjunction);
47 return !variables.contains(variable);
48 }
49
50 protected Set<Variable> getExistsVariables(Conjunction conjunction) {
51 var resource = conjunction.eResource();
52 if (resource == null) {
53 return doGetExistsVariables(conjunction);
54 }
55 return cache.get(Tuples.create(conjunction, EXISTS_VARIABLES), resource,
56 () -> doGetExistsVariables(conjunction));
57 }
58
59 protected Set<Variable> doGetExistsVariables(Conjunction conjunction) {
60 var builtinSymbols = importAdapterProvider.getBuiltinSymbols(conjunction);
61 var existsRelation = builtinSymbols.exists();
62 var set = new HashSet<Variable>();
63 for (var atom : EcoreUtil2.getAllContentsOfType(conjunction, Atom.class)) {
64 if (existsRelation.equals(atom.getRelation())) {
65 for (var argument : atom.getArguments()) {
66 if (argument instanceof VariableOrNodeExpr variableOrNodeExpr &&
67 variableOrNodeExpr.getVariableOrNode() instanceof Variable variable) {
68 set.add(variable);
69 }
70 }
71 }
72 }
73 return set;
74 }
75}
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 745e2d2b..84218f17 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
@@ -24,10 +24,7 @@ import tools.refinery.language.typesystem.ProblemTypeAnalyzer;
24import tools.refinery.language.typesystem.SignatureProvider; 24import tools.refinery.language.typesystem.SignatureProvider;
25import tools.refinery.language.utils.ProblemUtil; 25import tools.refinery.language.utils.ProblemUtil;
26 26
27import java.util.ArrayList; 27import java.util.*;
28import java.util.LinkedHashMap;
29import java.util.LinkedHashSet;
30import java.util.Set;
31 28
32/** 29/**
33 * This class contains custom validation rules. 30 * This class contains custom validation rules.
@@ -49,17 +46,26 @@ public class ProblemValidator extends AbstractProblemValidator {
49 public static final String INVALID_SUPERTYPE_ISSUE = ISSUE_PREFIX + "INVALID_SUPERTYPE"; 46 public static final String INVALID_SUPERTYPE_ISSUE = ISSUE_PREFIX + "INVALID_SUPERTYPE";
50 public static final String INVALID_REFERENCE_TYPE_ISSUE = ISSUE_PREFIX + "INVALID_REFERENCE_TYPE"; 47 public static final String INVALID_REFERENCE_TYPE_ISSUE = ISSUE_PREFIX + "INVALID_REFERENCE_TYPE";
51 public static final String INVALID_ARITY_ISSUE = ISSUE_PREFIX + "INVALID_ARITY"; 48 public static final String INVALID_ARITY_ISSUE = ISSUE_PREFIX + "INVALID_ARITY";
49 public static final String INVALID_MODALITY_ISSUE = ISSUE_PREFIX + "INVALID_MODALITY";
50 public static final String INVALID_RULE_ISSUE = ISSUE_PREFIX + "INVALID_RULE";
52 public static final String INVALID_TRANSITIVE_CLOSURE_ISSUE = ISSUE_PREFIX + "INVALID_TRANSITIVE_CLOSURE"; 51 public static final String INVALID_TRANSITIVE_CLOSURE_ISSUE = ISSUE_PREFIX + "INVALID_TRANSITIVE_CLOSURE";
53 public static final String INVALID_VALUE_ISSUE = ISSUE_PREFIX + "INVALID_VALUE";
54 public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION"; 52 public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION";
55 public static final String UNKNOWN_EXPRESSION_ISSUE = ISSUE_PREFIX + "UNKNOWN_EXPRESSION"; 53 public static final String UNKNOWN_EXPRESSION_ISSUE = ISSUE_PREFIX + "UNKNOWN_EXPRESSION";
56 public static final String INVALID_ASSIGNMENT_ISSUE = ISSUE_PREFIX + "INVALID_ASSIGNMENT"; 54 public static final String INVALID_ASSIGNMENT_ISSUE = ISSUE_PREFIX + "INVALID_ASSIGNMENT";
57 public static final String TYPE_ERROR = ISSUE_PREFIX + "TYPE_ERROR"; 55 public static final String TYPE_ERROR = ISSUE_PREFIX + "TYPE_ERROR";
56 public static final String VARIABLE_WITHOUT_EXISTS = ISSUE_PREFIX + "VARIABLE_WITHOUT_EXISTS";
57 public static final String UNUSED_PARTIAL_RELATION = ISSUE_PREFIX + "UNUSED_PARTIAL_RELATION";
58 58
59 @Inject 59 @Inject
60 private ReferenceCounter referenceCounter; 60 private ReferenceCounter referenceCounter;
61 61
62 @Inject 62 @Inject
63 private ExistsVariableCollector existsVariableCollector;
64
65 @Inject
66 private ActionTargetCollector actionTargetCollector;
67
68 @Inject
63 private IQualifiedNameConverter qualifiedNameConverter; 69 private IQualifiedNameConverter qualifiedNameConverter;
64 70
65 @Inject 71 @Inject
@@ -128,6 +134,14 @@ public class ProblemValidator extends AbstractProblemValidator {
128 var variableOrNode = expr.getVariableOrNode(); 134 var variableOrNode = expr.getVariableOrNode();
129 if (variableOrNode instanceof Variable variable && ProblemUtil.isImplicitVariable(variable) 135 if (variableOrNode instanceof Variable variable && ProblemUtil.isImplicitVariable(variable)
130 && !ProblemUtil.isSingletonVariable(variable)) { 136 && !ProblemUtil.isSingletonVariable(variable)) {
137 if (EcoreUtil2.getContainerOfType(variable, ParametricDefinition.class) instanceof RuleDefinition &&
138 EcoreUtil2.getContainerOfType(variable, NegationExpr.class) == null &&
139 // If there is an exists constraint, it is the only constraint.
140 existsVariableCollector.missingExistsConstraint(variable)) {
141 // Existentially quantified variables in rules should not be singletons,
142 // because we have to add an {@code exists} constraint as well.
143 return;
144 }
131 var problem = EcoreUtil2.getContainerOfType(variable, Problem.class); 145 var problem = EcoreUtil2.getContainerOfType(variable, Problem.class);
132 if (problem != null && referenceCounter.countReferences(problem, variable) <= 1) { 146 if (problem != null && referenceCounter.countReferences(problem, variable) <= 1) {
133 var name = variable.getName(); 147 var name = variable.getName();
@@ -152,13 +166,32 @@ public class ProblemValidator extends AbstractProblemValidator {
152 } 166 }
153 167
154 @Check 168 @Check
169 public void checkNodeAssertionArgumentConstants(NodeAssertionArgument argument) {
170 var rule = EcoreUtil2.getContainerOfType(argument, RuleDefinition.class);
171 if (rule == null) {
172 return;
173 }
174 var variableOrNode = argument.getNode();
175 if (variableOrNode instanceof Node node && !ProblemUtil.isAtomNode(node)) {
176 var name = node.getName();
177 var message = ("Only atoms can be referenced in rule actions. " +
178 "Mark '%s' as an atom with the declaration 'atom %s.'").formatted(name, name);
179 error(message, argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE,
180 INSIGNIFICANT_INDEX, NODE_CONSTANT_ISSUE);
181 }
182 }
183
184 @Check
155 public void checkUniqueDeclarations(Problem problem) { 185 public void checkUniqueDeclarations(Problem problem) {
156 var relations = new ArrayList<Relation>(); 186 var relations = new ArrayList<NamedElement>();
157 var nodes = new ArrayList<Node>(); 187 var nodes = new ArrayList<Node>();
158 var aggregators = new ArrayList<AggregatorDeclaration>(); 188 var aggregators = new ArrayList<AggregatorDeclaration>();
159 for (var statement : problem.getStatements()) { 189 for (var statement : problem.getStatements()) {
160 if (statement instanceof Relation relation) { 190 if (statement instanceof Relation relation) {
161 relations.add(relation); 191 relations.add(relation);
192 } else if (statement instanceof RuleDefinition ruleDefinition) {
193 // Rule definitions and predicates live in the same namespace.
194 relations.add(ruleDefinition);
162 } else if (statement instanceof NodeDeclaration nodeDeclaration) { 195 } else if (statement instanceof NodeDeclaration nodeDeclaration) {
163 nodes.addAll(nodeDeclaration.getNodes()); 196 nodes.addAll(nodeDeclaration.getNodes());
164 } else if (statement instanceof AggregatorDeclaration aggregatorDeclaration) { 197 } else if (statement instanceof AggregatorDeclaration aggregatorDeclaration) {
@@ -298,6 +331,22 @@ public class ProblemValidator extends AbstractProblemValidator {
298 referenceDeclaration, ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE, 0, 331 referenceDeclaration, ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE, 0,
299 INVALID_OPPOSITE_ISSUE); 332 INVALID_OPPOSITE_ISSUE);
300 } 333 }
334 } else if (kind == ReferenceKind.PARTIAL && opposite != null && opposite.getKind() != ReferenceKind.PARTIAL) {
335 acceptError("Opposite '%s' of partial reference '%s' is not a partial reference."
336 .formatted(opposite.getName(), referenceDeclaration.getName()),
337 referenceDeclaration, ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE, 0,
338 INVALID_OPPOSITE_ISSUE);
339 }
340 }
341
342 @Check
343 public void checkPartialReference(ReferenceDeclaration referenceDeclaration) {
344 if (referenceDeclaration.getKind() == ReferenceKind.PARTIAL &&
345 !actionTargetCollector.isActionTarget(referenceDeclaration)) {
346 var message = "Add decision or propagation rules to refine partial relation '%s'."
347 .formatted(referenceDeclaration.getName());
348 acceptWarning(message, referenceDeclaration, ProblemPackage.Literals.REFERENCE_DECLARATION__KIND, 0,
349 UNUSED_PARTIAL_RELATION);
301 } 350 }
302 } 351 }
303 352
@@ -336,8 +385,33 @@ public class ProblemValidator extends AbstractProblemValidator {
336 } 385 }
337 386
338 @Check 387 @Check
339 public void checkParameterType(Parameter parameter) { 388 public void checkParameter(Parameter parameter) {
340 checkArity(parameter, ProblemPackage.Literals.PARAMETER__PARAMETER_TYPE, 1); 389 checkArity(parameter, ProblemPackage.Literals.PARAMETER__PARAMETER_TYPE, 1);
390 var parametricDefinition = EcoreUtil2.getContainerOfType(parameter, ParametricDefinition.class);
391 if (parametricDefinition instanceof RuleDefinition rule) {
392 if (parameter.getParameterType() != null && parameter.getModality() == Modality.NONE) {
393 acceptError("Parameter type modality must be specified.", parameter,
394 ProblemPackage.Literals.PARAMETER__PARAMETER_TYPE, 0, INVALID_MODALITY_ISSUE);
395 }
396 var kind = rule.getKind();
397 var binding = parameter.getBinding();
398 if (kind == RuleKind.PROPAGATION && binding != ParameterBinding.SINGLE) {
399 acceptError("Parameter binding annotations are not supported in propagation rules.", parameter,
400 ProblemPackage.Literals.PARAMETER__BINDING, 0, INVALID_MODALITY_ISSUE);
401 } else if (kind != RuleKind.DECISION && binding == ParameterBinding.MULTI) {
402 acceptError("Explicit multi-object bindings are only supported in decision rules.", parameter,
403 ProblemPackage.Literals.PARAMETER__BINDING, 0, INVALID_MODALITY_ISSUE);
404 }
405 } else {
406 if (parameter.getConcreteness() != Concreteness.PARTIAL || parameter.getModality() != Modality.NONE) {
407 acceptError("Modal parameter types are only supported in rule definitions.", parameter, null, 0,
408 INVALID_MODALITY_ISSUE);
409 }
410 if (parameter.getBinding() != ParameterBinding.SINGLE) {
411 acceptError("Parameter binding annotations are only supported in decision rules.", parameter,
412 ProblemPackage.PARAMETER__BINDING, 0, INVALID_MODALITY_ISSUE);
413 }
414 }
341 } 415 }
342 416
343 @Check 417 @Check
@@ -353,16 +427,46 @@ public class ProblemValidator extends AbstractProblemValidator {
353 } 427 }
354 428
355 @Check 429 @Check
356 public void checkAssertion(Assertion assertion) { 430 public void checkRuleDefinition(RuleDefinition ruleDefinition) {
431 if (ruleDefinition.getConsequents().size() != 1) {
432 acceptError("Rules must have exactly one consequent.", ruleDefinition,
433 ProblemPackage.Literals.NAMED_ELEMENT__NAME, 0, INVALID_RULE_ISSUE);
434 }
435 var unquantifiedVariables = new HashSet<Variable>();
436 for (var variable : EcoreUtil2.getAllContentsOfType(ruleDefinition, Variable.class)) {
437 if (existsVariableCollector.missingExistsConstraint(variable)) {
438 unquantifiedVariables.add(variable);
439 }
440 }
441 for (var expr : EcoreUtil2.getAllContentsOfType(ruleDefinition, VariableOrNodeExpr.class)) {
442 if (expr.getVariableOrNode() instanceof Variable variable && unquantifiedVariables.contains(variable)) {
443 unquantifiedVariables.remove(variable);
444 var name = variable.getName();
445 String message;
446 if (ProblemUtil.isSingletonVariable(variable)) {
447 message = ("Remove the singleton variable marker '_' and clarify the quantification of variable " +
448 "'%s'.").formatted(name);
449 } else {
450 message = ("Add a 'must exists(%s)', 'may exists(%s)', or 'may !exists(%s)' constraint to " +
451 "clarify the quantification of variable '%s'.").formatted(name, name, name, name);
452 }
453 acceptWarning(message, expr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, 0,
454 VARIABLE_WITHOUT_EXISTS);
455 }
456 }
457 }
458
459 @Check
460 public void checkAssertion(AbstractAssertion assertion) {
357 var relation = assertion.getRelation(); 461 var relation = assertion.getRelation();
358 if (relation instanceof DatatypeDeclaration) { 462 if (relation instanceof DatatypeDeclaration) {
359 var message = "Assertions for data types are not supported."; 463 var message = "Assertions for data types are not supported.";
360 acceptError(message, assertion, ProblemPackage.Literals.ASSERTION__RELATION, 0, 464 acceptError(message, assertion, ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION, 0,
361 UNSUPPORTED_ASSERTION_ISSUE); 465 UNSUPPORTED_ASSERTION_ISSUE);
362 return; 466 return;
363 } 467 }
364 int argumentCount = assertion.getArguments().size(); 468 int argumentCount = assertion.getArguments().size();
365 checkArity(assertion, ProblemPackage.Literals.ASSERTION__RELATION, argumentCount); 469 checkArity(assertion, ProblemPackage.Literals.ABSTRACT_ASSERTION__RELATION, argumentCount);
366 } 470 }
367 471
368 @Check 472 @Check
@@ -466,15 +570,17 @@ public class ProblemValidator extends AbstractProblemValidator {
466 570
467 @Nullable 571 @Nullable
468 private Node getNodeArgumentForMultiObjectAssertion(AssertionArgument argument) { 572 private Node getNodeArgumentForMultiObjectAssertion(AssertionArgument argument) {
469 if (argument instanceof WildcardAssertionArgument) { 573 return switch (argument) {
470 acceptError("Wildcard arguments for 'exists' are not supported.", argument, null, 0, 574 case null -> null;
471 UNSUPPORTED_ASSERTION_ISSUE); 575 case WildcardAssertionArgument ignoredWildcardAssertionArgument -> {
472 return null; 576 acceptError("Wildcard arguments for 'exists' are not supported.", argument, null, 0,
473 } 577 UNSUPPORTED_ASSERTION_ISSUE);
474 if (argument instanceof NodeAssertionArgument nodeAssertionArgument) { 578 yield null;
475 return nodeAssertionArgument.getNode(); 579 }
476 } 580 case NodeAssertionArgument nodeAssertionArgument ->
477 throw new IllegalArgumentException("Unknown assertion argument: " + argument); 581 nodeAssertionArgument.getNode() instanceof Node node ? node : null;
582 default -> throw new IllegalArgumentException("Unknown assertion argument: " + argument);
583 };
478 } 584 }
479 585
480 @Check 586 @Check
@@ -484,8 +590,10 @@ public class ProblemValidator extends AbstractProblemValidator {
484 } 590 }
485 for (var argument : assertion.getArguments()) { 591 for (var argument : assertion.getArguments()) {
486 if (argument instanceof NodeAssertionArgument nodeAssertionArgument) { 592 if (argument instanceof NodeAssertionArgument nodeAssertionArgument) {
487 var node = nodeAssertionArgument.getNode(); 593 var variableOrNode = nodeAssertionArgument.getNode();
488 if (node != null && !node.eIsProxy() && ProblemUtil.isImplicitNode(node)) { 594 if (variableOrNode instanceof Node node &&
595 !variableOrNode.eIsProxy() &&
596 ProblemUtil.isImplicitNode(node)) {
489 var name = node.getName(); 597 var name = node.getName();
490 var message = ("Implicit nodes are not allowed in modules. Explicitly declare '%s' as a node " + 598 var message = ("Implicit nodes are not allowed in modules. Explicitly declare '%s' as a node " +
491 "with the declaration 'declare %s.'").formatted(name, name); 599 "with the declaration 'declare %s.'").formatted(name, name);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ReferenceCounter.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ReferenceCounter.java
index 55cbd71d..40781168 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/validation/ReferenceCounter.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ReferenceCounter.java
@@ -5,20 +5,21 @@
5 */ 5 */
6package tools.refinery.language.validation; 6package tools.refinery.language.validation;
7 7
8import java.util.HashMap; 8import com.google.inject.Inject;
9import java.util.Map; 9import com.google.inject.Singleton;
10
11import org.eclipse.emf.ecore.EObject; 10import org.eclipse.emf.ecore.EObject;
12import org.eclipse.xtext.util.IResourceScopeCache; 11import org.eclipse.xtext.util.IResourceScopeCache;
13import org.eclipse.xtext.util.Tuples; 12import org.eclipse.xtext.util.Tuples;
14
15import com.google.inject.Inject;
16import com.google.inject.Singleton;
17
18import tools.refinery.language.model.problem.Problem; 13import tools.refinery.language.model.problem.Problem;
19 14
15import java.util.HashMap;
16import java.util.Map;
17
20@Singleton 18@Singleton
21public class ReferenceCounter { 19public class ReferenceCounter {
20 private static final String REFERENCE_COUNTS =
21 "tools.refinery.language.validation.ReferenceCounter.REFERENCE_COUNTS";
22
22 @Inject 23 @Inject
23 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE; 24 private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
24 25
@@ -35,7 +36,7 @@ public class ReferenceCounter {
35 if (resource == null) { 36 if (resource == null) {
36 return doGetReferenceCounts(problem); 37 return doGetReferenceCounts(problem);
37 } 38 }
38 return cache.get(Tuples.create(problem, "referenceCounts"), resource, () -> doGetReferenceCounts(problem)); 39 return cache.get(Tuples.create(problem, REFERENCE_COUNTS), resource, () -> doGetReferenceCounts(problem));
39 } 40 }
40 41
41 protected Map<EObject, Integer> doGetReferenceCounts(Problem problem) { 42 protected Map<EObject, Integer> doGetReferenceCounts(Problem problem) {
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/rules/RuleParsingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/rules/RuleParsingTest.java
index 56e65550..15636483 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/rules/RuleParsingTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/rules/RuleParsingTest.java
@@ -9,7 +9,6 @@ import com.google.inject.Inject;
9import org.eclipse.xtext.testing.InjectWith; 9import org.eclipse.xtext.testing.InjectWith;
10import org.eclipse.xtext.testing.extensions.InjectionExtension; 10import org.eclipse.xtext.testing.extensions.InjectionExtension;
11import org.junit.jupiter.api.Disabled; 11import org.junit.jupiter.api.Disabled;
12import org.junit.jupiter.api.Test;
13import org.junit.jupiter.api.extension.ExtendWith; 12import org.junit.jupiter.api.extension.ExtendWith;
14import org.junit.jupiter.params.ParameterizedTest; 13import org.junit.jupiter.params.ParameterizedTest;
15import org.junit.jupiter.params.provider.ValueSource; 14import org.junit.jupiter.params.provider.ValueSource;
@@ -17,7 +16,7 @@ import tools.refinery.language.model.tests.utils.ProblemParseHelper;
17import tools.refinery.language.tests.ProblemInjectorProvider; 16import tools.refinery.language.tests.ProblemInjectorProvider;
18 17
19import static org.hamcrest.MatcherAssert.assertThat; 18import static org.hamcrest.MatcherAssert.assertThat;
20import static org.hamcrest.Matchers.*; 19import static org.hamcrest.Matchers.empty;
21 20
22@Disabled("TODO: Rework transformation rules") 21@Disabled("TODO: Rework transformation rules")
23@ExtendWith(InjectionExtension.class) 22@ExtendWith(InjectionExtension.class)
@@ -29,62 +28,13 @@ class RuleParsingTest {
29 @ParameterizedTest 28 @ParameterizedTest
30 @ValueSource(strings = { """ 29 @ValueSource(strings = { """
31 pred Person(p). 30 pred Person(p).
32 rule r(p1): must Person(p1) ==> Person(p1) := false. 31 rule r(p1): must Person(p1) ==> Person(p1): false.
33 """, """
34 pred Person(p).
35 rule r(p1): must Person(p1) ==> Person(p1) <: false.
36 """, """ 32 """, """
37 pred Person(p). 33 pred Person(p).
38 rule r(p1): must Person(p1) ==> !Person(p1). 34 rule r(p1): must Person(p1) ==> !Person(p1).
39 """, """
40 pred Person(p).
41 rule r(p1): must Person(p1) ==> delete p1.
42 """ }) 35 """ })
43 void simpleTest(String text) { 36 void simpleTest(String text) {
44 var problem = parseHelper.parse(text); 37 var problem = parseHelper.parse(text);
45 assertThat(problem.getResourceErrors(), empty()); 38 assertThat(problem.getResourceErrors(), empty());
46 } 39 }
47
48 @Test
49 void newNodeTest() {
50 var problem = parseHelper.parse("""
51 pred Person(p).
52 rule r(p1): must Person(p1) ==> new p2, Person(p2) := unknown.
53 """);
54 assertThat(problem.getResourceErrors(), empty());
55 assertThat(problem.rule("r").param(0), equalTo(problem.rule("r").conj(0).lit(0).arg(0).variable()));
56 assertThat(problem.rule("r").consequent(0).action(0).newVar(),
57 equalTo(problem.rule("r").consequent(0).action(1).assertedAtom().arg(0).variable()));
58 }
59
60 @Test
61 void differentScopeTest() {
62 var problem = parseHelper.parse("""
63 pred Friend(a, b).
64 rule r(p1): !may Friend(p1, p2) ==> new p2, Friend(p1, p2) := true.
65 """);
66 assertThat(problem.getResourceErrors(), empty());
67 assertThat(problem.rule("r").conj(0).lit(0).negated().arg(1).variable(),
68 not(equalTo(problem.rule("r").consequent(0).action(1).assertedAtom().arg(1).variable())));
69 }
70
71 @Test
72 void parameterShadowingTest() {
73 var problem = parseHelper.parse("""
74 pred Friend(a, b).
75 rule r(p1, p2): !may Friend(p1, p2) ==> new p2, Friend(p1, p2) := true.
76 """);
77 assertThat(problem.getResourceErrors(), empty());
78 assertThat(problem.rule("r").param(1),
79 not(equalTo(problem.rule("r").consequent(0).action(1).assertedAtom().arg(1).variable())));
80 }
81
82 @Test
83 void deleteDifferentScopeNodeTest() {
84 var problem = parseHelper.parse("""
85 pred Person(p).
86 rule r(p1): must Friend(p1, p2) ==> delete p2.
87 """);
88 assertThat(problem.getResourceErrors(), not(empty()));
89 }
90} 40}
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/OppositeValidationTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/OppositeValidationTest.java
index 57602377..d73ef8e7 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/OppositeValidationTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/OppositeValidationTest.java
@@ -57,6 +57,18 @@ class OppositeValidationTest {
57 class Foo { 57 class Foo {
58 Foo foo[] opposite foo 58 Foo foo[] opposite foo
59 } 59 }
60 """, """
61 class Foo {
62 partial Bar bar opposite foo
63 }
64
65 class Bar {
66 partial Foo foo opposite bar
67 }
68 """, """
69 class Foo {
70 partial Foo foo[] opposite foo
71 }
60 """}) 72 """})
61 void validOppositeTest(String text) { 73 void validOppositeTest(String text) {
62 var problem = parseHelper.parse(text); 74 var problem = parseHelper.parse(text);
@@ -188,7 +200,7 @@ class OppositeValidationTest {
188 } 200 }
189 201
190 @ParameterizedTest 202 @ParameterizedTest
191 @ValueSource(strings = {"Foo foo", "container Foo foo"}) 203 @ValueSource(strings = {"Foo foo", "container Foo foo", "partial Foo foo"})
192 void containerInvalidOppositeTest(String reference) { 204 void containerInvalidOppositeTest(String reference) {
193 var problem = parseHelper.parse(""" 205 var problem = parseHelper.parse("""
194 class Foo { 206 class Foo {
@@ -203,7 +215,27 @@ class OppositeValidationTest {
203 assertThat(issues, hasItem(allOf( 215 assertThat(issues, hasItem(allOf(
204 hasProperty("severity", is(Diagnostic.ERROR)), 216 hasProperty("severity", is(Diagnostic.ERROR)),
205 hasProperty("issueCode", is(ProblemValidator.INVALID_OPPOSITE_ISSUE)), 217 hasProperty("issueCode", is(ProblemValidator.INVALID_OPPOSITE_ISSUE)),
206 hasProperty("message", stringContainsInOrder("foo", "bar")) 218 hasProperty("message", stringContainsInOrder("foo", "container", "bar"))
219 )));
220 }
221
222 @ParameterizedTest
223 @ValueSource(strings = {"Foo foo", "contains Foo foo", "container Foo foo"})
224 void partialWithConcreteOppositeTest(String reference) {
225 var problem = parseHelper.parse("""
226 class Foo {
227 partial Bar bar opposite foo
228 }
229
230 class Bar {
231 %s opposite bar
232 }
233 """.formatted(reference));
234 var issues = problem.validate();
235 assertThat(issues, hasItem(allOf(
236 hasProperty("severity", is(Diagnostic.ERROR)),
237 hasProperty("issueCode", is(ProblemValidator.INVALID_OPPOSITE_ISSUE)),
238 hasProperty("message", stringContainsInOrder("foo", "partial", "bar"))
207 ))); 239 )));
208 } 240 }
209} 241}
diff --git a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAction.java b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAction.java
index 3a49a0b9..4987cb89 100644
--- a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAction.java
+++ b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAction.java
@@ -6,25 +6,9 @@
6package tools.refinery.language.model.tests.utils; 6package tools.refinery.language.model.tests.utils;
7 7
8import tools.refinery.language.model.problem.Action; 8import tools.refinery.language.model.problem.Action;
9import tools.refinery.language.model.problem.AssertionAction;
10import tools.refinery.language.model.problem.DeleteAction;
11import tools.refinery.language.model.problem.NewAction;
12import tools.refinery.language.model.problem.VariableOrNode;
13 9
14public record WrappedAction(Action action) { 10public record WrappedAction(Action action) {
15 public Action get() { 11 public Action get() {
16 return action; 12 return action;
17 } 13 }
18
19 public VariableOrNode newVar() {
20 return ((NewAction) action).getVariable();
21 }
22
23 public VariableOrNode deleteVar() {
24 return ((DeleteAction) action).getVariableOrNode();
25 }
26
27 public WrappedAtom assertedAtom() {
28 return new WrappedAtom(((AssertionAction) action).getAtom());
29 }
30} 14}
diff --git a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAssertionArgument.java b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAssertionArgument.java
index b36f2506..50cb958d 100644
--- a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAssertionArgument.java
+++ b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedAssertionArgument.java
@@ -15,6 +15,6 @@ public record WrappedAssertionArgument(AssertionArgument assertionArgument) {
15 } 15 }
16 16
17 public Node node() { 17 public Node node() {
18 return ((NodeAssertionArgument) assertionArgument).getNode(); 18 return (Node) ((NodeAssertionArgument) assertionArgument).getNode();
19 } 19 }
20} 20}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/literal/ConstantLiteral.java b/subprojects/logic/src/main/java/tools/refinery/logic/literal/ConstantLiteral.java
index 688ddfa0..36cf4226 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/literal/ConstantLiteral.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/literal/ConstantLiteral.java
@@ -14,6 +14,8 @@ import tools.refinery.logic.term.Variable;
14import java.util.Objects; 14import java.util.Objects;
15import java.util.Set; 15import java.util.Set;
16 16
17// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}.
18@SuppressWarnings("squid:S2160")
17public class ConstantLiteral extends AbstractLiteral { 19public class ConstantLiteral extends AbstractLiteral {
18 private final NodeVariable variable; 20 private final NodeVariable variable;
19 private final int nodeId; 21 private final int nodeId;
@@ -31,7 +33,6 @@ public class ConstantLiteral extends AbstractLiteral {
31 return nodeId; 33 return nodeId;
32 } 34 }
33 35
34
35 @Override 36 @Override
36 public Set<Variable> getOutputVariables() { 37 public Set<Variable> getOutputVariables() {
37 return Set.of(variable); 38 return Set.of(variable);
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
index a70292ad..5f69b7a2 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
@@ -9,31 +9,54 @@ import tools.refinery.store.dse.propagation.PropagationResult;
9import tools.refinery.store.dse.transition.Rule; 9import tools.refinery.store.dse.transition.Rule;
10import tools.refinery.store.dse.transition.actions.BoundAction; 10import tools.refinery.store.dse.transition.actions.BoundAction;
11import tools.refinery.store.model.Model; 11import tools.refinery.store.model.Model;
12import tools.refinery.store.model.ModelListener;
12import tools.refinery.store.query.ModelQueryAdapter; 13import tools.refinery.store.query.ModelQueryAdapter;
13import tools.refinery.store.query.resultset.ResultSet; 14import tools.refinery.store.query.resultset.ResultSet;
15import tools.refinery.store.tuple.Tuple;
16
17import java.util.HashSet;
14 18
15class BoundPropagationRule { 19class BoundPropagationRule {
16 private final Model model; 20 private final Model model;
21 private final Rule rule;
17 private final ResultSet<Boolean> resultSet; 22 private final ResultSet<Boolean> resultSet;
18 private final BoundAction action; 23 private final BoundAction action;
24 private final HashSet<Tuple> firedActivations = new HashSet<>();
19 25
20 public BoundPropagationRule(Model model, Rule rule) { 26 public BoundPropagationRule(Model model, Rule rule) {
21 this.model = model; 27 this.model = model;
28 this.rule = rule;
22 resultSet = model.getAdapter(ModelQueryAdapter.class).getResultSet(rule.getPrecondition()); 29 resultSet = model.getAdapter(ModelQueryAdapter.class).getResultSet(rule.getPrecondition());
23 action = rule.createAction(model); 30 action = rule.createAction(model);
31 model.addListener(new ModelListener() {
32 @Override
33 public void afterRestore() {
34 firedActivations.clear();
35 }
36 });
37 resultSet.addListener((key, fromValue, toValue) -> {
38 if (Boolean.FALSE.equals(toValue)) {
39 firedActivations.remove(key);
40 }
41 });
24 } 42 }
25 43
26 public PropagationResult fireAll() { 44 public PropagationResult fireAll() {
45 if (!firedActivations.isEmpty()) {
46 throw new IllegalStateException("Stuck propagation rule '%s'.".formatted(rule.getName()));
47 }
27 if (resultSet.size() == 0) { 48 if (resultSet.size() == 0) {
28 return PropagationResult.UNCHANGED; 49 return PropagationResult.UNCHANGED;
29 } 50 }
30 var cursor = resultSet.getAll(); 51 var cursor = resultSet.getAll();
31 while (cursor.move()) { 52 while (cursor.move()) {
32 model.checkCancelled(); 53 model.checkCancelled();
33 var result = action.fire(cursor.getKey()); 54 var tuple = cursor.getKey();
55 var result = action.fire(tuple);
34 if (!result) { 56 if (!result) {
35 return PropagationResult.REJECTED; 57 return PropagationResult.REJECTED;
36 } 58 }
59 firedActivations.add(tuple);
37 } 60 }
38 return PropagationResult.PROPAGATED; 61 return PropagationResult.PROPAGATED;
39 } 62 }
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/Action.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/Action.java
index 0ce0c3a4..edcf9526 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/Action.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/Action.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 */
@@ -67,7 +67,7 @@ public class Action {
67 var outputVariables = actionLiteral.getOutputVariables(); 67 var outputVariables = actionLiteral.getOutputVariables();
68 int size = outputVariables.size(); 68 int size = outputVariables.size();
69 if (size == 0) { 69 if (size == 0) {
70 // Identity mappings use a {@code null} allocation to avoid iterating over the output tuple. 70 // Empty mappings use a {@code null} allocation to avoid iterating over the output tuple.
71 return; 71 return;
72 } 72 }
73 if (size >= 2 && new HashSet<>(outputVariables).size() != size) { 73 if (size >= 2 && new HashSet<>(outputVariables).size() != size) {
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ActionLiterals.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ActionLiterals.java
index d06e2479..6bd5075b 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ActionLiterals.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ActionLiterals.java
@@ -16,6 +16,10 @@ public final class ActionLiterals {
16 throw new IllegalArgumentException("This is a static utility class and should not be instantiated directly"); 16 throw new IllegalArgumentException("This is a static utility class and should not be instantiated directly");
17 } 17 }
18 18
19 public static ConstantActionLiteral constant(NodeVariable variable, int nodeId) {
20 return new ConstantActionLiteral(variable, nodeId);
21 }
22
19 public static <T> PutActionLiteral<T> put(Symbol<T> symbol, T value, NodeVariable... parameters) { 23 public static <T> PutActionLiteral<T> put(Symbol<T> symbol, T value, NodeVariable... parameters) {
20 return new PutActionLiteral<>(symbol, value, List.of(parameters)); 24 return new PutActionLiteral<>(symbol, value, List.of(parameters));
21 } 25 }
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ConstantActionLiteral.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ConstantActionLiteral.java
new file mode 100644
index 00000000..fecb2960
--- /dev/null
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/actions/ConstantActionLiteral.java
@@ -0,0 +1,45 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.dse.transition.actions;
7
8import tools.refinery.logic.term.NodeVariable;
9import tools.refinery.store.model.Model;
10import tools.refinery.store.tuple.Tuple;
11
12import java.util.List;
13
14public class ConstantActionLiteral extends AbstractActionLiteral {
15 private final NodeVariable variable;
16 private final int nodeId;
17
18 public ConstantActionLiteral(NodeVariable variable, int nodeId) {
19 this.variable = variable;
20 this.nodeId = nodeId;
21 }
22
23 public NodeVariable getVariable() {
24 return variable;
25 }
26
27 public int getNodeId() {
28 return nodeId;
29 }
30
31 @Override
32 public List<NodeVariable> getInputVariables() {
33 return List.of();
34 }
35
36 @Override
37 public List<NodeVariable> getOutputVariables() {
38 return List.of(variable);
39 }
40
41 @Override
42 public BoundActionLiteral bindToModel(Model model) {
43 return ignoredTuple -> Tuple.of(nodeId);
44 }
45}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/PartialClauseRewriter.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/PartialClauseRewriter.java
index dc508a7b..f7e86c44 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/PartialClauseRewriter.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/PartialClauseRewriter.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 */
@@ -53,38 +53,30 @@ class PartialClauseRewriter {
53 markAsDone(literal); 53 markAsDone(literal);
54 return; 54 return;
55 } 55 }
56 if (callLiteral instanceof CountLowerBoundLiteral countLowerBoundLiteral) { 56 switch (callLiteral) {
57 rewriteCountLowerBound(countLowerBoundLiteral); 57 case CountLowerBoundLiteral countLowerBoundLiteral -> rewriteCountLowerBound(countLowerBoundLiteral);
58 return; 58 case CountUpperBoundLiteral countUpperBoundLiteral -> rewriteCountUpperBound(countUpperBoundLiteral);
59 } 59 case CountCandidateLowerBoundLiteral countCandidateLowerBoundLiteral ->
60 if (callLiteral instanceof CountUpperBoundLiteral countUpperBoundLiteral) { 60 rewriteCountCandidateLowerBound(countCandidateLowerBoundLiteral);
61 rewriteCountUpperBound(countUpperBoundLiteral); 61 case CountCandidateUpperBoundLiteral countCandidateUpperBoundLiteral ->
62 return; 62 rewriteCountCandidateUpperBound(countCandidateUpperBoundLiteral);
63 } 63 default -> {
64 if (callLiteral instanceof CountCandidateLowerBoundLiteral countCandidateLowerBoundLiteral) { 64 var target = callLiteral.getTarget();
65 rewriteCountCandidateLowerBound(countCandidateLowerBoundLiteral); 65 switch (target) {
66 return; 66 case Dnf dnf -> rewriteRecursively(callLiteral, dnf);
67 } 67 case ModalConstraint modalConstraint -> {
68 if (callLiteral instanceof CountCandidateUpperBoundLiteral countCandidateUpperBoundLiteral) { 68 var modality = modalConstraint.modality();
69 rewriteCountCandidateUpperBound(countCandidateUpperBoundLiteral); 69 var concreteness = modalConstraint.concreteness();
70 return; 70 var constraint = modalConstraint.constraint();
71 } 71 switch (constraint) {
72 var target = callLiteral.getTarget(); 72 case Dnf dnf -> rewriteRecursively(callLiteral, modality, concreteness, dnf);
73 if (target instanceof Dnf dnf) { 73 case PartialRelation partialRelation -> rewrite(callLiteral, modality, concreteness, partialRelation);
74 rewriteRecursively(callLiteral, dnf); 74 default -> throw new IllegalArgumentException("Cannot interpret modal constraint: " + modalConstraint);
75 } else if (target instanceof ModalConstraint modalConstraint) { 75 }
76 var modality = modalConstraint.modality();
77 var concreteness = modalConstraint.concreteness();
78 var constraint = modalConstraint.constraint();
79 if (constraint instanceof Dnf dnf) {
80 rewriteRecursively(callLiteral, modality, concreteness, dnf);
81 } else if (constraint instanceof PartialRelation partialRelation) {
82 rewrite(callLiteral, modality, concreteness, partialRelation);
83 } else {
84 throw new IllegalArgumentException("Cannot interpret modal constraint: " + modalConstraint);
85 } 76 }
86 } else { 77 default -> markAsDone(literal);
87 markAsDone(literal); 78 }
79 }
88 } 80 }
89 } 81 }
90 82
@@ -111,11 +103,11 @@ class PartialClauseRewriter {
111 .call(CallPolarity.POSITIVE, countResult.rewrittenArguments())); 103 .call(CallPolarity.POSITIVE, countResult.rewrittenArguments()));
112 switch (variablesToCount.size()) { 104 switch (variablesToCount.size()) {
113 case 0 -> literals.add(outputVariable.assign(new ConstantTerm<>(type, one))); 105 case 0 -> literals.add(outputVariable.assign(new ConstantTerm<>(type, one)));
114 case 1 -> literals.add(view.call(variablesToCount.get(0), 106 case 1 -> literals.add(view.call(variablesToCount.getFirst(),
115 outputVariable)); 107 outputVariable));
116 default -> { 108 default -> {
117 var firstCount = Variable.of(type); 109 var firstCount = Variable.of(type);
118 literals.add(view.call(variablesToCount.get(0), firstCount)); 110 literals.add(view.call(variablesToCount.getFirst(), firstCount));
119 int length = variablesToCount.size(); 111 int length = variablesToCount.size();
120 Term<T> accumulator = firstCount; 112 Term<T> accumulator = firstCount;
121 for (int i = 1; i < length; i++) { 113 for (int i = 1; i < length; i++) {
@@ -137,11 +129,11 @@ class PartialClauseRewriter {
137 } 129 }
138 130
139 private void rewriteCountCandidateLowerBound(CountCandidateLowerBoundLiteral literal) { 131 private void rewriteCountCandidateLowerBound(CountCandidateLowerBoundLiteral literal) {
140 rewriteCandidateCount(literal, "lower", Modality.MAY); 132 rewriteCandidateCount(literal, "lower", Modality.MUST);
141 } 133 }
142 134
143 private void rewriteCountCandidateUpperBound(CountCandidateUpperBoundLiteral literal) { 135 private void rewriteCountCandidateUpperBound(CountCandidateUpperBoundLiteral literal) {
144 rewriteCandidateCount(literal, "upper", Modality.MUST); 136 rewriteCandidateCount(literal, "upper", Modality.MAY);
145 } 137 }
146 138
147 private void rewriteCandidateCount(AbstractCountLiteral<Integer> literal, String name, Modality modality) { 139 private void rewriteCandidateCount(AbstractCountLiteral<Integer> literal, String name, Modality modality) {
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialNeighbourhoodCalculator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialNeighbourhoodCalculator.java
new file mode 100644
index 00000000..859cf7c1
--- /dev/null
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialNeighbourhoodCalculator.java
@@ -0,0 +1,63 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.reasoning.interpretation;
7
8import org.eclipse.collections.api.set.primitive.IntSet;
9import tools.refinery.store.map.Cursor;
10import tools.refinery.store.model.Model;
11import tools.refinery.store.query.ModelQueryAdapter;
12import tools.refinery.store.reasoning.ReasoningAdapter;
13import tools.refinery.store.reasoning.literal.Concreteness;
14import tools.refinery.store.reasoning.representation.PartialSymbol;
15import tools.refinery.store.statecoding.StateCodeCalculatorFactory;
16import tools.refinery.store.statecoding.StateCoderResult;
17import tools.refinery.store.statecoding.neighbourhood.AbstractNeighbourhoodCalculator;
18import tools.refinery.store.tuple.Tuple;
19
20import java.util.List;
21
22public class PartialNeighbourhoodCalculator extends AbstractNeighbourhoodCalculator<PartialInterpretation<?, ?>> {
23 private final ModelQueryAdapter queryAdapter;
24
25 public static final StateCodeCalculatorFactory FACTORY =
26 (model, ignoredInterpretations, individuals) -> new PartialNeighbourhoodCalculator(model, individuals);
27
28 protected PartialNeighbourhoodCalculator(Model model, IntSet individuals) {
29 super(model, individuals);
30 queryAdapter = model.getAdapter(ModelQueryAdapter.class);
31 }
32
33 @Override
34 public StateCoderResult calculateCodes() {
35 queryAdapter.flushChanges();
36 return super.calculateCodes();
37 }
38
39 @Override
40 protected List<PartialInterpretation<?, ?>> getInterpretations() {
41 var adapter = getModel().getAdapter(ReasoningAdapter.class);
42 var partialSymbols = adapter.getStoreAdapter().getPartialSymbols();
43 return partialSymbols.stream()
44 .<PartialInterpretation<?, ?>>map(partialSymbol ->
45 adapter.getPartialInterpretation(Concreteness.PARTIAL, (PartialSymbol<?, ?>) partialSymbol))
46 .toList();
47 }
48
49 @Override
50 protected int getArity(PartialInterpretation<?, ?> interpretation) {
51 return interpretation.getPartialSymbol().arity();
52 }
53
54 @Override
55 protected Object getNullValue(PartialInterpretation<?, ?> interpretation) {
56 return interpretation.get(Tuple.of());
57 }
58
59 @Override
60 protected Cursor<Tuple, ?> getCursor(PartialInterpretation<?, ?> interpretation) {
61 return interpretation.getAll();
62 }
63}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialRelationTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialRelationTranslator.java
index 75fb3397..a9031f4c 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialRelationTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialRelationTranslator.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 */
@@ -52,6 +52,8 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
52 private RelationalQuery must; 52 private RelationalQuery must;
53 private RelationalQuery candidateMay; 53 private RelationalQuery candidateMay;
54 private RelationalQuery candidateMust; 54 private RelationalQuery candidateMust;
55 private RelationalQuery candidateMayMerged;
56 private RelationalQuery candidateMustMerged;
55 private RoundingMode roundingMode; 57 private RoundingMode roundingMode;
56 58
57 private PartialRelationTranslator(PartialRelation partialRelation) { 59 private PartialRelationTranslator(PartialRelation partialRelation) {
@@ -202,6 +204,7 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
202 liftQueries(storeBuilder); 204 liftQueries(storeBuilder);
203 createFallbackQueriesFromSymbol(); 205 createFallbackQueriesFromSymbol();
204 setFallbackCandidateQueries(); 206 setFallbackCandidateQueries();
207 mergeCandidateQueries();
205 createFallbackRewriter(); 208 createFallbackRewriter();
206 createFallbackInterpretation(); 209 createFallbackInterpretation();
207 createFallbackRefiner(); 210 createFallbackRefiner();
@@ -272,9 +275,11 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
272 } 275 }
273 if (candidateMay == null) { 276 if (candidateMay == null) {
274 candidateMay = queryBasedRelationRewriter.getCandidateMay(); 277 candidateMay = queryBasedRelationRewriter.getCandidateMay();
278 candidateMayMerged = candidateMay;
275 } 279 }
276 if (candidateMust == null) { 280 if (candidateMust == null) {
277 candidateMust = queryBasedRelationRewriter.getCandidateMust(); 281 candidateMust = queryBasedRelationRewriter.getCandidateMust();
282 candidateMustMerged = candidateMust;
278 } 283 }
279 } 284 }
280 285
@@ -290,7 +295,7 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
290 candidateMay = reasoningBuilder.lift(Modality.MAY, Concreteness.CANDIDATE, query); 295 candidateMay = reasoningBuilder.lift(Modality.MAY, Concreteness.CANDIDATE, query);
291 } 296 }
292 if (candidateMust == null) { 297 if (candidateMust == null) {
293 candidateMust = reasoningBuilder.lift(Modality.MAY, Concreteness.CANDIDATE, query); 298 candidateMust = reasoningBuilder.lift(Modality.MUST, Concreteness.CANDIDATE, query);
294 } 299 }
295 } 300 }
296 301
@@ -309,15 +314,31 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
309 } 314 }
310 } 315 }
311 316
317 private void mergeCandidateQueries() {
318 if (candidateMayMerged == null) {
319 candidateMayMerged = createQuery("candidateMayMerged", (builder, arguments) -> builder
320 .clause(
321 candidateMay.call(arguments),
322 may.call(arguments)
323 ));
324 }
325 if (candidateMustMerged == null) {
326 candidateMustMerged = createQuery("candidateMustMerged", (builder, arguments) -> builder
327 .clause(candidateMust.call(arguments))
328 .clause(must.call(arguments)));
329 }
330 }
331
312 private void createFallbackRewriter() { 332 private void createFallbackRewriter() {
313 if (rewriter == null) { 333 if (rewriter == null) {
314 rewriter = new QueryBasedRelationRewriter(may, must, candidateMay, candidateMust); 334 rewriter = new QueryBasedRelationRewriter(may, must, candidateMayMerged, candidateMustMerged);
315 } 335 }
316 } 336 }
317 337
318 private void createFallbackInterpretation() { 338 private void createFallbackInterpretation() {
319 if (interpretationFactory == null) { 339 if (interpretationFactory == null) {
320 interpretationFactory = new QueryBasedRelationInterpretationFactory(may, must, candidateMay, candidateMust); 340 interpretationFactory = new QueryBasedRelationInterpretationFactory(may, must, candidateMayMerged,
341 candidateMustMerged);
321 } 342 }
322 } 343 }
323 344
@@ -354,14 +375,6 @@ public final class PartialRelationTranslator extends PartialSymbolTranslator<Tru
354 .clause( 375 .clause(
355 PartialLiterals.candidateMust(partialRelation.call(parameters)), 376 PartialLiterals.candidateMust(partialRelation.call(parameters)),
356 not(PartialLiterals.candidateMay(partialRelation.call(parameters))) 377 not(PartialLiterals.candidateMay(partialRelation.call(parameters)))
357 )
358 .clause(
359 PartialLiterals.candidateMust(partialRelation.call(parameters)),
360 not(PartialLiterals.may(partialRelation.call(parameters)))
361 )
362 .clause(
363 PartialLiterals.must(partialRelation.call(parameters)),
364 not(PartialLiterals.candidateMay(partialRelation.call(parameters)))
365 )); 378 ));
366 var reject = createQuery("reject", (builder, parameters) -> { 379 var reject = createQuery("reject", (builder, parameters) -> {
367 var literals = new ArrayList<Literal>(parameters.length + 1); 380 var literals = new ArrayList<Literal>(parameters.length + 1);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
index 26449df5..56c9d682 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
@@ -1,16 +1,18 @@
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 */
6package tools.refinery.store.reasoning.translator.crossreference; 6package tools.refinery.store.reasoning.translator.crossreference;
7 7
8import tools.refinery.logic.dnf.Query; 8import tools.refinery.logic.dnf.Query;
9import tools.refinery.logic.dnf.QueryBuilder;
9import tools.refinery.logic.dnf.RelationalQuery; 10import tools.refinery.logic.dnf.RelationalQuery;
10import tools.refinery.logic.literal.Literal; 11import tools.refinery.logic.literal.Literal;
11import tools.refinery.logic.term.NodeVariable; 12import tools.refinery.logic.term.NodeVariable;
12import tools.refinery.logic.term.Variable; 13import tools.refinery.logic.term.Variable;
13import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; 14import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality;
15import tools.refinery.store.reasoning.literal.CountCandidateLowerBoundLiteral;
14import tools.refinery.store.reasoning.literal.CountLowerBoundLiteral; 16import tools.refinery.store.reasoning.literal.CountLowerBoundLiteral;
15import tools.refinery.store.reasoning.representation.PartialRelation; 17import tools.refinery.store.reasoning.representation.PartialRelation;
16import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity; 18import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity;
@@ -21,6 +23,7 @@ import java.util.List;
21import static tools.refinery.logic.literal.Literals.check; 23import static tools.refinery.logic.literal.Literals.check;
22import static tools.refinery.logic.term.int_.IntTerms.constant; 24import static tools.refinery.logic.term.int_.IntTerms.constant;
23import static tools.refinery.logic.term.int_.IntTerms.less; 25import static tools.refinery.logic.term.int_.IntTerms.less;
26import static tools.refinery.store.reasoning.literal.PartialLiterals.candidateMay;
24import static tools.refinery.store.reasoning.literal.PartialLiterals.may; 27import static tools.refinery.store.reasoning.literal.PartialLiterals.may;
25 28
26class CrossReferenceUtils { 29class CrossReferenceUtils {
@@ -30,6 +33,34 @@ class CrossReferenceUtils {
30 33
31 public static RelationalQuery createMayHelper(PartialRelation linkType, PartialRelation type, 34 public static RelationalQuery createMayHelper(PartialRelation linkType, PartialRelation type,
32 Multiplicity multiplicity, boolean inverse) { 35 Multiplicity multiplicity, boolean inverse) {
36 var preparedBuilder = prepareBuilder(linkType, inverse);
37 var literals = new ArrayList<Literal>();
38 literals.add(may(type.call(preparedBuilder.variable())));
39 if (multiplicity.multiplicity().upperBound() instanceof FiniteUpperCardinality(var finiteUpperBound)) {
40 var existingLinks = Variable.of("existingLinks", Integer.class);
41 literals.add(new CountLowerBoundLiteral(existingLinks, linkType, preparedBuilder.arguments()));
42 literals.add(check(less(existingLinks, constant(finiteUpperBound))));
43 }
44 return preparedBuilder.builder().clause(literals).build();
45 }
46
47 public static RelationalQuery createCandidateMayHelper(PartialRelation linkType, PartialRelation type,
48 Multiplicity multiplicity, boolean inverse) {
49 var preparedBuilder = prepareBuilder(linkType, inverse);
50 var literals = new ArrayList<Literal>();
51 literals.add(candidateMay(type.call(preparedBuilder.variable())));
52 if (multiplicity.multiplicity().upperBound() instanceof FiniteUpperCardinality(var finiteUpperBound)) {
53 var existingLinks = Variable.of("existingLinks", Integer.class);
54 literals.add(new CountCandidateLowerBoundLiteral(existingLinks, linkType, preparedBuilder.arguments()));
55 literals.add(check(less(existingLinks, constant(finiteUpperBound))));
56 }
57 return preparedBuilder.builder().clause(literals).build();
58 }
59
60 private record PreparedBuilder(QueryBuilder builder, NodeVariable variable, List<Variable> arguments) {
61 }
62
63 private static PreparedBuilder prepareBuilder(PartialRelation linkType, boolean inverse) {
33 String name; 64 String name;
34 NodeVariable variable; 65 NodeVariable variable;
35 List<Variable> arguments; 66 List<Variable> arguments;
@@ -44,14 +75,6 @@ class CrossReferenceUtils {
44 } 75 }
45 var builder = Query.builder(linkType.name() + "#mayNew" + name); 76 var builder = Query.builder(linkType.name() + "#mayNew" + name);
46 builder.parameter(variable); 77 builder.parameter(variable);
47 var literals = new ArrayList<Literal>(); 78 return new PreparedBuilder(builder, variable, arguments);
48 literals.add(may(type.call(variable)));
49 if (multiplicity.multiplicity().upperBound() instanceof FiniteUpperCardinality finiteUpperCardinality) {
50 var existingLinks = Variable.of("existingLinks", Integer.class);
51 literals.add(new CountLowerBoundLiteral(existingLinks, linkType, arguments));
52 literals.add(check(less(existingLinks, constant(finiteUpperCardinality.finiteUpperBound()))));
53 }
54 builder.clause(literals);
55 return builder.build();
56 } 79 }
57} 80}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceInfo.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceInfo.java
index 982f835f..ef5bcebb 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceInfo.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceInfo.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 */
@@ -11,7 +11,7 @@ import tools.refinery.logic.term.truthvalue.TruthValue;
11 11
12public record DirectedCrossReferenceInfo(PartialRelation sourceType, Multiplicity sourceMultiplicity, 12public record DirectedCrossReferenceInfo(PartialRelation sourceType, Multiplicity sourceMultiplicity,
13 PartialRelation targetType, Multiplicity targetMultiplicity, 13 PartialRelation targetType, Multiplicity targetMultiplicity,
14 TruthValue defaultValue) { 14 TruthValue defaultValue, boolean partial) {
15 public boolean isConstrained() { 15 public boolean isConstrained() {
16 return sourceMultiplicity.isConstrained() || targetMultiplicity.isConstrained(); 16 return sourceMultiplicity.isConstrained() || targetMultiplicity.isConstrained();
17 } 17 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceTranslator.java
index 5bf1f5ab..1985a43f 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/DirectedCrossReferenceTranslator.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 */
@@ -18,6 +18,7 @@ import tools.refinery.store.reasoning.literal.Concreteness;
18import tools.refinery.store.reasoning.literal.Modality; 18import tools.refinery.store.reasoning.literal.Modality;
19import tools.refinery.store.reasoning.representation.PartialRelation; 19import tools.refinery.store.reasoning.representation.PartialRelation;
20import tools.refinery.store.reasoning.translator.PartialRelationTranslator; 20import tools.refinery.store.reasoning.translator.PartialRelationTranslator;
21import tools.refinery.store.reasoning.translator.RoundingMode;
21import tools.refinery.store.reasoning.translator.TranslationException; 22import tools.refinery.store.reasoning.translator.TranslationException;
22import tools.refinery.store.reasoning.translator.multiplicity.InvalidMultiplicityErrorTranslator; 23import tools.refinery.store.reasoning.translator.multiplicity.InvalidMultiplicityErrorTranslator;
23import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity; 24import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity;
@@ -42,27 +43,77 @@ public class DirectedCrossReferenceTranslator implements ModelStoreConfiguration
42 43
43 @Override 44 @Override
44 public void apply(ModelStoreBuilder storeBuilder) { 45 public void apply(ModelStoreBuilder storeBuilder) {
45 var name = linkType.name();
46 var sourceType = info.sourceType(); 46 var sourceType = info.sourceType();
47 var targetType = info.targetType(); 47 var targetType = info.targetType();
48 var mayNewSource = createMayHelper(sourceType, info.sourceMultiplicity(), false);
49 var mayNewTarget = createMayHelper(targetType, info.targetMultiplicity(), true);
50 var mayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.PARTIAL);
51
52 var defaultValue = info.defaultValue(); 48 var defaultValue = info.defaultValue();
53 if (defaultValue.must()) { 49 if (defaultValue.must()) {
54 throw new TranslationException(linkType, "Unsupported default value %s for directed cross references %s" 50 throw new TranslationException(linkType, "Unsupported default value %s for directed cross references %s"
55 .formatted(defaultValue, linkType)); 51 .formatted(defaultValue, linkType));
56 } 52 }
57
58 var translator = PartialRelationTranslator.of(linkType); 53 var translator = PartialRelationTranslator.of(linkType);
59 translator.symbol(symbol); 54 translator.symbol(symbol);
60 if (defaultValue.may()) { 55 if (defaultValue.may()) {
61 var forbiddenView = new ForbiddenView(symbol); 56 configureWithDefaultUnknown(translator);
62 translator.may(Query.of(mayName, (builder, source, target) -> { 57 } else {
58 configureWithDefaultFalse(storeBuilder);
59 }
60 translator.refiner(DirectedCrossReferenceRefiner.of(symbol, sourceType, targetType));
61 translator.initializer(new DirectedCrossReferenceInitializer(linkType, sourceType, targetType, symbol));
62 if (info.partial()) {
63 translator.roundingMode(RoundingMode.NONE);
64 } else {
65 translator.decision(Rule.of(linkType.name(), (builder, source, target) -> builder
66 .clause(
67 may(linkType.call(source, target)),
68 not(candidateMust(linkType.call(source, target))),
69 not(MULTI_VIEW.call(source)),
70 not(MULTI_VIEW.call(target))
71 )
72 .action(
73 add(linkType, source, target)
74 )));
75 }
76 storeBuilder.with(translator);
77 storeBuilder.with(new InvalidMultiplicityErrorTranslator(sourceType, linkType, false,
78 info.sourceMultiplicity()));
79 storeBuilder.with(new InvalidMultiplicityErrorTranslator(targetType, linkType, true,
80 info.targetMultiplicity()));
81 }
82
83 private void configureWithDefaultUnknown(PartialRelationTranslator translator) {
84 var name = linkType.name();
85 var sourceType = info.sourceType();
86 var targetType = info.targetType();
87 var mayNewSource = createMayHelper(sourceType, info.sourceMultiplicity(), false);
88 var mayNewTarget = createMayHelper(targetType, info.targetMultiplicity(), true);
89 var mayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.PARTIAL);
90 var forbiddenView = new ForbiddenView(symbol);
91 translator.may(Query.of(mayName, (builder, source, target) -> {
92 builder.clause(
93 mayNewSource.call(source),
94 mayNewTarget.call(target),
95 not(forbiddenView.call(source, target))
96 );
97 if (info.isConstrained()) {
98 // Violation of monotonicity:
99 // Edges violating upper multiplicity will not be marked as {@code ERROR}, but the
100 // corresponding error pattern will already mark the node as invalid.
101 builder.clause(
102 must(linkType.call(source, target)),
103 not(forbiddenView.call(source, target)),
104 may(sourceType.call(source)),
105 may(targetType.call(target))
106 );
107 }
108 }));
109 if (info.partial()) {
110 var candidateMayNewSource = createCandidateMayHelper(sourceType, info.sourceMultiplicity(), false);
111 var candidateMayNewTarget = createCandidateMayHelper(targetType, info.targetMultiplicity(), true);
112 var candidateMayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.CANDIDATE);
113 translator.candidateMay(Query.of(candidateMayName, (builder, source, target) -> {
63 builder.clause( 114 builder.clause(
64 mayNewSource.call(source), 115 candidateMayNewSource.call(source),
65 mayNewTarget.call(target), 116 candidateMayNewTarget.call(target),
66 not(forbiddenView.call(source, target)) 117 not(forbiddenView.call(source, target))
67 ); 118 );
68 if (info.isConstrained()) { 119 if (info.isConstrained()) {
@@ -70,63 +121,56 @@ public class DirectedCrossReferenceTranslator implements ModelStoreConfiguration
70 // Edges violating upper multiplicity will not be marked as {@code ERROR}, but the 121 // Edges violating upper multiplicity will not be marked as {@code ERROR}, but the
71 // corresponding error pattern will already mark the node as invalid. 122 // corresponding error pattern will already mark the node as invalid.
72 builder.clause( 123 builder.clause(
73 must(linkType.call(source, target)), 124 candidateMust(linkType.call(source, target)),
74 not(forbiddenView.call(source, target)), 125 not(forbiddenView.call(source, target)),
75 may(sourceType.call(source)), 126 candidateMay(sourceType.call(source)),
76 may(targetType.call(target)) 127 candidateMay(targetType.call(target))
77 ); 128 );
78 } 129 }
79 })); 130 }));
80 } else { 131 }
81 var propagationBuilder = storeBuilder.getAdapter(PropagationBuilder.class); 132 }
82 propagationBuilder.rule(Rule.of(name + "#invalidLink", (builder, p1, p2) -> { 133
134 private RelationalQuery createMayHelper(PartialRelation type, Multiplicity multiplicity, boolean inverse) {
135 return CrossReferenceUtils.createMayHelper(linkType, type, multiplicity, inverse);
136 }
137
138 private RelationalQuery createCandidateMayHelper(PartialRelation type, Multiplicity multiplicity, boolean inverse) {
139 return CrossReferenceUtils.createCandidateMayHelper(linkType, type, multiplicity, inverse);
140 }
141
142 private void configureWithDefaultFalse(ModelStoreBuilder storeBuilder) {
143 var name = linkType.name();
144 var sourceType = info.sourceType();
145 var targetType = info.targetType();
146 var mayNewSource = createMayHelper(sourceType, info.sourceMultiplicity(), false);
147 var mayNewTarget = createMayHelper(targetType, info.targetMultiplicity(), true);
148 var propagationBuilder = storeBuilder.getAdapter(PropagationBuilder.class);
149 propagationBuilder.rule(Rule.of(name + "#invalidLink", (builder, p1, p2) -> {
150 builder.clause(
151 may(linkType.call(p1, p2)),
152 not(may(sourceType.call(p1)))
153 );
154 builder.clause(
155 may(linkType.call(p1, p2)),
156 not(may(targetType.call(p2)))
157 );
158 if (info.isConstrained()) {
83 builder.clause( 159 builder.clause(
84 may(linkType.call(p1, p2)), 160 may(linkType.call(p1, p2)),
85 not(may(sourceType.call(p1))) 161 not(must(linkType.call(p1, p2))),
162 not(mayNewSource.call(p1))
86 ); 163 );
87 builder.clause( 164 builder.clause(
88 may(linkType.call(p1, p2)), 165 may(linkType.call(p1, p2)),
89 not(may(targetType.call(p2))) 166 not(must(linkType.call(p1, p2))),
167 not(mayNewTarget.call(p2))
90 ); 168 );
91 if (info.isConstrained()) { 169 }
92 builder.clause( 170 builder.action(
93 may(linkType.call(p1, p2)), 171 merge(linkType, TruthValue.FALSE, p1, p2)
94 not(must(linkType.call(p1, p2))), 172 );
95 not(mayNewSource.call(p1)) 173 }));
96 );
97 builder.clause(
98 may(linkType.call(p1, p2)),
99 not(must(linkType.call(p1, p2))),
100 not(mayNewTarget.call(p2))
101 );
102 }
103 builder.action(
104 merge(linkType, TruthValue.FALSE, p1, p2)
105 );
106 }));
107 }
108 translator.refiner(DirectedCrossReferenceRefiner.of(symbol, sourceType, targetType));
109 translator.initializer(new DirectedCrossReferenceInitializer(linkType, sourceType, targetType, symbol));
110 translator.decision(Rule.of(linkType.name(), (builder, source, target) -> builder
111 .clause(
112 may(linkType.call(source, target)),
113 not(candidateMust(linkType.call(source, target))),
114 not(MULTI_VIEW.call(source)),
115 not(MULTI_VIEW.call(target))
116 )
117 .action(
118 add(linkType, source, target)
119 )));
120 storeBuilder.with(translator);
121
122 storeBuilder.with(new InvalidMultiplicityErrorTranslator(sourceType, linkType, false,
123 info.sourceMultiplicity()));
124
125 storeBuilder.with(new InvalidMultiplicityErrorTranslator(targetType, linkType, true,
126 info.targetMultiplicity()));
127 } 174 }
128 175
129 private RelationalQuery createMayHelper(PartialRelation type, Multiplicity multiplicity, boolean inverse) {
130 return CrossReferenceUtils.createMayHelper(linkType, type, multiplicity, inverse);
131 }
132} 176}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInfo.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInfo.java
index 560eb04a..78b9cd86 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInfo.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInfo.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 */
@@ -9,7 +9,8 @@ import tools.refinery.store.reasoning.representation.PartialRelation;
9import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity; 9import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity;
10import tools.refinery.logic.term.truthvalue.TruthValue; 10import tools.refinery.logic.term.truthvalue.TruthValue;
11 11
12public record UndirectedCrossReferenceInfo(PartialRelation type, Multiplicity multiplicity, TruthValue defaultValue) { 12public record UndirectedCrossReferenceInfo(PartialRelation type, Multiplicity multiplicity, TruthValue defaultValue,
13 boolean partial) {
13 public boolean isConstrained() { 14 public boolean isConstrained() {
14 return multiplicity.isConstrained(); 15 return multiplicity.isConstrained();
15 } 16 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceTranslator.java
index 97c0b800..af0ddd2e 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceTranslator.java
@@ -1,25 +1,26 @@
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 */
6package tools.refinery.store.reasoning.translator.crossreference; 6package tools.refinery.store.reasoning.translator.crossreference;
7 7
8import tools.refinery.logic.dnf.Query;
9import tools.refinery.logic.term.truthvalue.TruthValue;
8import tools.refinery.store.dse.propagation.PropagationBuilder; 10import tools.refinery.store.dse.propagation.PropagationBuilder;
9import tools.refinery.store.dse.transition.Rule; 11import tools.refinery.store.dse.transition.Rule;
10import tools.refinery.store.model.ModelStoreBuilder; 12import tools.refinery.store.model.ModelStoreBuilder;
11import tools.refinery.store.model.ModelStoreConfiguration; 13import tools.refinery.store.model.ModelStoreConfiguration;
12import tools.refinery.logic.dnf.Query;
13import tools.refinery.store.query.view.ForbiddenView; 14import tools.refinery.store.query.view.ForbiddenView;
14import tools.refinery.store.reasoning.lifting.DnfLifter; 15import tools.refinery.store.reasoning.lifting.DnfLifter;
15import tools.refinery.store.reasoning.literal.Concreteness; 16import tools.refinery.store.reasoning.literal.Concreteness;
16import tools.refinery.store.reasoning.literal.Modality; 17import tools.refinery.store.reasoning.literal.Modality;
17import tools.refinery.store.reasoning.representation.PartialRelation; 18import tools.refinery.store.reasoning.representation.PartialRelation;
18import tools.refinery.store.reasoning.translator.PartialRelationTranslator; 19import tools.refinery.store.reasoning.translator.PartialRelationTranslator;
20import tools.refinery.store.reasoning.translator.RoundingMode;
19import tools.refinery.store.reasoning.translator.TranslationException; 21import tools.refinery.store.reasoning.translator.TranslationException;
20import tools.refinery.store.reasoning.translator.multiplicity.InvalidMultiplicityErrorTranslator; 22import tools.refinery.store.reasoning.translator.multiplicity.InvalidMultiplicityErrorTranslator;
21import tools.refinery.store.representation.Symbol; 23import tools.refinery.store.representation.Symbol;
22import tools.refinery.logic.term.truthvalue.TruthValue;
23 24
24import static tools.refinery.logic.literal.Literals.not; 25import static tools.refinery.logic.literal.Literals.not;
25import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add; 26import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add;
@@ -40,73 +41,106 @@ public class UndirectedCrossReferenceTranslator implements ModelStoreConfigurati
40 41
41 @Override 42 @Override
42 public void apply(ModelStoreBuilder storeBuilder) { 43 public void apply(ModelStoreBuilder storeBuilder) {
43 var name = linkType.name();
44 var type = info.type(); 44 var type = info.type();
45 var mayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.PARTIAL);
46
47 var defaultValue = info.defaultValue(); 45 var defaultValue = info.defaultValue();
48 if (defaultValue.must()) { 46 if (defaultValue.must()) {
49 throw new TranslationException(linkType, "Unsupported default value %s for directed cross references %s" 47 throw new TranslationException(linkType, "Unsupported default value %s for directed cross references %s"
50 .formatted(defaultValue, linkType)); 48 .formatted(defaultValue, linkType));
51 } 49 }
52
53 var mayNewSource = CrossReferenceUtils.createMayHelper(linkType, type, info.multiplicity(), false);
54
55 var translator = PartialRelationTranslator.of(linkType); 50 var translator = PartialRelationTranslator.of(linkType);
56 translator.symbol(symbol); 51 translator.symbol(symbol);
57 if (defaultValue.may()) { 52 if (defaultValue.may()) {
58 var forbiddenView = new ForbiddenView(symbol); 53 configureWithDefaultUnknown(translator);
59 translator.may(Query.of(mayName, (builder, source, target) -> { 54 } else {
55 configureWithDefaultFalse(storeBuilder);
56 }
57 translator.refiner(UndirectedCrossReferenceRefiner.of(symbol, type));
58 translator.initializer(new UndirectedCrossReferenceInitializer(linkType, type, symbol));
59 if (info.partial()) {
60 translator.roundingMode(RoundingMode.NONE);
61 } else {
62 translator.decision(Rule.of(linkType.name(), (builder, source, target) -> builder
63 .clause(
64 may(linkType.call(source, target)),
65 not(candidateMust(linkType.call(source, target))),
66 not(MULTI_VIEW.call(source)),
67 not(MULTI_VIEW.call(target))
68 )
69 .action(
70 add(linkType, source, target)
71 )));
72 }
73 storeBuilder.with(translator);
74 storeBuilder.with(new InvalidMultiplicityErrorTranslator(type, linkType, false, info.multiplicity()));
75 }
76
77 private void configureWithDefaultUnknown(PartialRelationTranslator translator) {
78 var name = linkType.name();
79 var type = info.type();
80 var multiplicity = info.multiplicity();
81 var mayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.PARTIAL);
82 var mayNewSource = CrossReferenceUtils.createMayHelper(linkType, type, multiplicity, false);
83 var forbiddenView = new ForbiddenView(symbol);
84 translator.may(Query.of(mayName, (builder, source, target) -> {
85 builder.clause(
86 mayNewSource.call(source),
87 mayNewSource.call(target),
88 not(forbiddenView.call(source, target))
89 );
90 if (info.isConstrained()) {
91 // Violation of monotonicity:
92 // Edges violating upper multiplicity will not be marked as {@code ERROR}, but the
93 // corresponding error pattern will already mark the node as invalid.
94 builder.clause(
95 must(linkType.call(source, target)),
96 not(forbiddenView.call(source, target)),
97 may(type.call(source)),
98 may(type.call(target))
99 );
100 }
101 }));
102 if (info.partial()) {
103 var candidateMayName = DnfLifter.decorateName(name, Modality.MAY, Concreteness.CANDIDATE);
104 var candidateMayNewSource = CrossReferenceUtils.createCandidateMayHelper(linkType, type, multiplicity,
105 false);
106 translator.candidateMay(Query.of(candidateMayName, (builder, source, target) -> {
60 builder.clause( 107 builder.clause(
61 mayNewSource.call(source), 108 candidateMayNewSource.call(source),
62 mayNewSource.call(target), 109 candidateMayNewSource.call(target),
63 not(forbiddenView.call(source, target)) 110 not(forbiddenView.call(source, target))
64 ); 111 );
65 if (info.isConstrained()) { 112 if (info.isConstrained()) {
66 // Violation of monotonicity:
67 // Edges violating upper multiplicity will not be marked as {@code ERROR}, but the
68 // corresponding error pattern will already mark the node as invalid.
69 builder.clause( 113 builder.clause(
70 must(linkType.call(source, target)), 114 candidateMust(linkType.call(source, target)),
71 not(forbiddenView.call(source, target)), 115 not(forbiddenView.call(source, target)),
72 may(type.call(source)), 116 candidateMay(type.call(source)),
73 may(type.call(target)) 117 candidateMay(type.call(target))
74 ); 118 );
75 } 119 }
76 })); 120 }));
77 } else { 121 }
78 var propagationBuilder = storeBuilder.getAdapter(PropagationBuilder.class); 122 }
79 propagationBuilder.rule(Rule.of(name + "#invalidLink", (builder, p1, p2) -> { 123
124 private void configureWithDefaultFalse(ModelStoreBuilder storeBuilder) {
125 var name = linkType.name();
126 var type = info.type();
127 var mayNewSource = CrossReferenceUtils.createMayHelper(linkType, type, info.multiplicity(), false);
128 var propagationBuilder = storeBuilder.getAdapter(PropagationBuilder.class);
129 propagationBuilder.rule(Rule.of(name + "#invalidLink", (builder, p1, p2) -> {
130 builder.clause(
131 may(linkType.call(p1, p2)),
132 not(may(type.call(p1)))
133 );
134 if (info.isConstrained()) {
80 builder.clause( 135 builder.clause(
81 may(linkType.call(p1, p2)), 136 may(linkType.call(p1, p2)),
82 not(may(type.call(p1))) 137 not(must(linkType.call(p1, p2))),
83 ); 138 not(mayNewSource.call(p1))
84 if (info.isConstrained()) {
85 builder.clause(
86 may(linkType.call(p1, p2)),
87 not(must(linkType.call(p1, p2))),
88 not(mayNewSource.call(p1))
89 );
90 }
91 builder.action(
92 merge(linkType, TruthValue.FALSE, p1, p2)
93 ); 139 );
94 })); 140 }
95 } 141 builder.action(
96 translator.refiner(UndirectedCrossReferenceRefiner.of(symbol, type)); 142 merge(linkType, TruthValue.FALSE, p1, p2)
97 translator.initializer(new UndirectedCrossReferenceInitializer(linkType, type, symbol)); 143 );
98 translator.decision(Rule.of(linkType.name(), (builder, source, target) -> builder 144 }));
99 .clause(
100 may(linkType.call(source, target)),
101 not(candidateMust(linkType.call(source, target))),
102 not(MULTI_VIEW.call(source)),
103 not(MULTI_VIEW.call(target))
104 )
105 .action(
106 add(linkType, source, target)
107 )));
108 storeBuilder.with(translator);
109
110 storeBuilder.with(new InvalidMultiplicityErrorTranslator(type, linkType, false, info.multiplicity()));
111 } 145 }
112} 146}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java
index d1979b8c..94bf1c5d 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.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 */
@@ -143,7 +143,7 @@ public class MetamodelBuilder {
143 targetType, linkType, sourceType)); 143 targetType, linkType, sourceType));
144 } 144 }
145 undirectedCrossReferences.put(linkType, new UndirectedCrossReferenceInfo(sourceType, 145 undirectedCrossReferences.put(linkType, new UndirectedCrossReferenceInfo(sourceType,
146 info.multiplicity(), defaultValue)); 146 info.multiplicity(), defaultValue, info.partial()));
147 return; 147 return;
148 } 148 }
149 oppositeReferences.put(opposite, linkType); 149 oppositeReferences.put(opposite, linkType);
@@ -153,7 +153,7 @@ public class MetamodelBuilder {
153 return; 153 return;
154 } 154 }
155 directedCrossReferences.put(linkType, new DirectedCrossReferenceInfo(sourceType, info.multiplicity(), 155 directedCrossReferences.put(linkType, new DirectedCrossReferenceInfo(sourceType, info.multiplicity(),
156 targetType, targetMultiplicity, defaultValue)); 156 targetType, targetMultiplicity, defaultValue, info.partial()));
157 } 157 }
158 158
159 private void processContainmentInfo(PartialRelation linkType, ReferenceInfo info, 159 private void processContainmentInfo(PartialRelation linkType, ReferenceInfo info,
@@ -197,5 +197,9 @@ public class MetamodelBuilder {
197 throw new TranslationException(opposite, "Opposite %s of containment %s cannot be containment" 197 throw new TranslationException(opposite, "Opposite %s of containment %s cannot be containment"
198 .formatted(opposite, linkType)); 198 .formatted(opposite, linkType));
199 } 199 }
200 if (info.partial() != oppositeInfo.partial()) {
201 throw new TranslationException(opposite, "Either both %s and %s have to be partial or neither of them"
202 .formatted(opposite, linkType));
203 }
200 } 204 }
201} 205}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfo.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfo.java
index 47a2e95f..94050dc0 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfo.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfo.java
@@ -10,7 +10,14 @@ import tools.refinery.store.reasoning.translator.multiplicity.Multiplicity;
10import tools.refinery.logic.term.truthvalue.TruthValue; 10import tools.refinery.logic.term.truthvalue.TruthValue;
11 11
12public record ReferenceInfo(boolean containment, PartialRelation sourceType, Multiplicity multiplicity, 12public record ReferenceInfo(boolean containment, PartialRelation sourceType, Multiplicity multiplicity,
13 PartialRelation targetType, PartialRelation opposite, TruthValue defaultValue) { 13 PartialRelation targetType, PartialRelation opposite, TruthValue defaultValue,
14 boolean partial) {
15 public ReferenceInfo {
16 if (containment && partial) {
17 throw new IllegalArgumentException("Containment references cannot be partial");
18 }
19 }
20
14 public static ReferenceInfoBuilder builder() { 21 public static ReferenceInfoBuilder builder() {
15 return new ReferenceInfoBuilder(); 22 return new ReferenceInfoBuilder();
16 } 23 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfoBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfoBuilder.java
index 39240d6b..90fb22b5 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfoBuilder.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ReferenceInfoBuilder.java
@@ -21,6 +21,7 @@ public final class ReferenceInfoBuilder {
21 private PartialRelation targetType; 21 private PartialRelation targetType;
22 private PartialRelation opposite; 22 private PartialRelation opposite;
23 private TruthValue defaultValue = TruthValue.UNKNOWN; 23 private TruthValue defaultValue = TruthValue.UNKNOWN;
24 private boolean partial;
24 25
25 ReferenceInfoBuilder() { 26 ReferenceInfoBuilder() {
26 } 27 }
@@ -72,6 +73,11 @@ public final class ReferenceInfoBuilder {
72 return this; 73 return this;
73 } 74 }
74 75
76 public ReferenceInfoBuilder partial(boolean partial) {
77 this.partial = partial;
78 return this;
79 }
80
75 public ReferenceInfo build() { 81 public ReferenceInfo build() {
76 if (sourceType == null) { 82 if (sourceType == null) {
77 throw new IllegalStateException("Source type is required"); 83 throw new IllegalStateException("Source type is required");
@@ -79,6 +85,6 @@ public final class ReferenceInfoBuilder {
79 if (targetType == null) { 85 if (targetType == null) {
80 throw new IllegalStateException("Target type is required"); 86 throw new IllegalStateException("Target type is required");
81 } 87 }
82 return new ReferenceInfo(containment, sourceType, multiplicity, targetType, opposite, defaultValue); 88 return new ReferenceInfo(containment, sourceType, multiplicity, targetType, opposite, defaultValue, partial);
83 } 89 }
84} 90}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiplicity/InvalidMultiplicityErrorTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiplicity/InvalidMultiplicityErrorTranslator.java
index 0ca6eac2..e2eff921 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiplicity/InvalidMultiplicityErrorTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiplicity/InvalidMultiplicityErrorTranslator.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 20232-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 */
@@ -52,12 +52,11 @@ public class InvalidMultiplicityErrorTranslator implements ModelStoreConfigurati
52 52
53 @Override 53 @Override
54 public void apply(ModelStoreBuilder storeBuilder) { 54 public void apply(ModelStoreBuilder storeBuilder) {
55 if (!(multiplicity instanceof ConstrainedMultiplicity constrainedMultiplicity)) { 55 if (!(multiplicity instanceof ConstrainedMultiplicity(var cardinalityInterval, var errorSymbol))) {
56 return; 56 return;
57 } 57 }
58 58
59 var name = constrainedMultiplicity.errorSymbol().name(); 59 var name = errorSymbol.name();
60 var cardinalityInterval = constrainedMultiplicity.multiplicity();
61 var node = Variable.of("node"); 60 var node = Variable.of("node");
62 var other = Variable.of("other"); 61 var other = Variable.of("other");
63 List<Variable> arguments = inverse ? List.of(other, node) : List.of(node, other); 62 List<Variable> arguments = inverse ? List.of(other, node) : List.of(node, other);
@@ -98,8 +97,7 @@ public class InvalidMultiplicityErrorTranslator implements ModelStoreConfigurati
98 )); 97 ));
99 } 98 }
100 99
101 if (cardinalityInterval.upperBound() instanceof FiniteUpperCardinality finiteUpperCardinality) { 100 if (cardinalityInterval.upperBound() instanceof FiniteUpperCardinality(int upperBound)) {
102 int upperBound = finiteUpperCardinality.finiteUpperBound();
103 mustBuilder.clause(Integer.class, existingContents -> List.of( 101 mustBuilder.clause(Integer.class, existingContents -> List.of(
104 must(nodeType.call(node)), 102 must(nodeType.call(node)),
105 new CountLowerBoundLiteral(existingContents, linkType, arguments), 103 new CountLowerBoundLiteral(existingContents, linkType, arguments),
@@ -128,7 +126,7 @@ public class InvalidMultiplicityErrorTranslator implements ModelStoreConfigurati
128 output.assign(missingBuilder.build().aggregate(INT_SUM, Variable.of())) 126 output.assign(missingBuilder.build().aggregate(INT_SUM, Variable.of()))
129 )); 127 ));
130 128
131 storeBuilder.with(PartialRelationTranslator.of(constrainedMultiplicity.errorSymbol()) 129 storeBuilder.with(PartialRelationTranslator.of(errorSymbol)
132 .mayNever() 130 .mayNever()
133 .must(mustBuilder.build()) 131 .must(mustBuilder.build())
134 .candidateMay(candidateMayBuilder.build()) 132 .candidateMay(candidateMayBuilder.build())
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyPartialModelTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyPartialModelTest.java
index e87b2684..85147921 100644
--- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyPartialModelTest.java
+++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyPartialModelTest.java
@@ -149,7 +149,7 @@ class TypeHierarchyPartialModelTest {
149 149
150 var personCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, person); 150 var personCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, person);
151 assertThat(personCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE)); 151 assertThat(personCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE));
152 assertThat(personCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.FALSE)); 152 assertThat(personCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.ERROR));
153 153
154 var memberInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, member); 154 var memberInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, member);
155 assertThat(memberInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE)); 155 assertThat(memberInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE));
@@ -157,7 +157,7 @@ class TypeHierarchyPartialModelTest {
157 157
158 var memberCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, member); 158 var memberCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, member);
159 assertThat(memberCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE)); 159 assertThat(memberCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE));
160 assertThat(memberCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.FALSE)); 160 assertThat(memberCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.ERROR));
161 161
162 var studentInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, student); 162 var studentInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, student);
163 assertThat(studentInterpretation.get(Tuple.of(1)), is(TruthValue.FALSE)); 163 assertThat(studentInterpretation.get(Tuple.of(1)), is(TruthValue.FALSE));
@@ -165,7 +165,7 @@ class TypeHierarchyPartialModelTest {
165 165
166 var studentCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, student); 166 var studentCandidateInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, student);
167 assertThat(studentCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.FALSE)); 167 assertThat(studentCandidateInterpretation.get(Tuple.of(1)), is(TruthValue.FALSE));
168 assertThat(studentCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.FALSE)); 168 assertThat(studentCandidateInterpretation.get(Tuple.of(3)), is(TruthValue.ERROR));
169 169
170 var teacherInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, teacher); 170 var teacherInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, teacher);
171 assertThat(teacherInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE)); 171 assertThat(teacherInterpretation.get(Tuple.of(1)), is(TruthValue.TRUE));
diff --git a/subprojects/store/build.gradle.kts b/subprojects/store/build.gradle.kts
index f96922a9..e48c0088 100644
--- a/subprojects/store/build.gradle.kts
+++ b/subprojects/store/build.gradle.kts
@@ -10,6 +10,6 @@ plugins {
10} 10}
11 11
12dependencies { 12dependencies {
13 implementation(libs.eclipseCollections.api) 13 api(libs.eclipseCollections.api)
14 runtimeOnly(libs.eclipseCollections) 14 runtimeOnly(libs.eclipseCollections)
15} 15}
diff --git a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/AbstractNeighbourhoodCalculator.java b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/AbstractNeighbourhoodCalculator.java
index 4cef6786..5bfc4725 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/AbstractNeighbourhoodCalculator.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/AbstractNeighbourhoodCalculator.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 */
@@ -8,39 +8,87 @@ package tools.refinery.store.statecoding.neighbourhood;
8import org.eclipse.collections.api.factory.primitive.IntLongMaps; 8import org.eclipse.collections.api.factory.primitive.IntLongMaps;
9import org.eclipse.collections.api.map.primitive.MutableIntLongMap; 9import org.eclipse.collections.api.map.primitive.MutableIntLongMap;
10import org.eclipse.collections.api.set.primitive.IntSet; 10import org.eclipse.collections.api.set.primitive.IntSet;
11import tools.refinery.store.model.AnyInterpretation; 11import tools.refinery.store.map.Cursor;
12import tools.refinery.store.model.Interpretation;
13import tools.refinery.store.model.Model; 12import tools.refinery.store.model.Model;
14import tools.refinery.store.statecoding.ObjectCode; 13import tools.refinery.store.statecoding.ObjectCode;
14import tools.refinery.store.statecoding.StateCodeCalculator;
15import tools.refinery.store.statecoding.StateCoderResult;
15import tools.refinery.store.tuple.Tuple; 16import tools.refinery.store.tuple.Tuple;
16import tools.refinery.store.tuple.Tuple0;
17 17
18import java.util.*; 18import java.util.*;
19 19
20public abstract class AbstractNeighbourhoodCalculator { 20public abstract class AbstractNeighbourhoodCalculator<T> implements StateCodeCalculator {
21 protected final Model model; 21 private final Model model;
22 protected final List<AnyInterpretation> nullImpactValues; 22 private final IntSet individuals;
23 protected final LinkedHashMap<AnyInterpretation, long[]> impactValues; 23 private List<T> nullImpactValues;
24 protected final MutableIntLongMap individualHashValues = IntLongMaps.mutable.empty(); 24 private LinkedHashMap<T, long[]> impactValues;
25 private MutableIntLongMap individualHashValues;
26 private ObjectCodeImpl previousObjectCode = new ObjectCodeImpl();
27 private ObjectCodeImpl nextObjectCode = new ObjectCodeImpl();
25 28
26 protected static final long PRIME = 31; 29 protected static final long PRIME = 31;
27 30
28 protected AbstractNeighbourhoodCalculator(Model model, List<? extends AnyInterpretation> interpretations, 31 protected AbstractNeighbourhoodCalculator(Model model, IntSet individuals) {
29 IntSet individuals) {
30 this.model = model; 32 this.model = model;
31 this.nullImpactValues = new ArrayList<>(); 33 this.individuals = individuals;
32 this.impactValues = new LinkedHashMap<>(); 34 }
35
36 protected Model getModel() {
37 return model;
38 }
39
40 protected abstract List<T> getInterpretations();
41
42 protected abstract int getArity(T interpretation);
43
44 protected abstract Object getNullValue(T interpretation);
45
46 // We need the wildcard here, because we don't know the value type.
47 @SuppressWarnings("squid:S1452")
48 protected abstract Cursor<Tuple, ?> getCursor(T interpretation);
49
50 @Override
51 public StateCoderResult calculateCodes() {
52 model.checkCancelled();
53 ensureInitialized();
54 previousObjectCode.clear();
55 nextObjectCode.clear();
56 initializeWithIndividuals(previousObjectCode);
57
58 int rounds = 0;
59 do {
60 model.checkCancelled();
61 constructNextObjectCodes(previousObjectCode, nextObjectCode);
62 var tempObjectCode = previousObjectCode;
63 previousObjectCode = nextObjectCode;
64 nextObjectCode = tempObjectCode;
65 nextObjectCode.clear();
66 rounds++;
67 } while (rounds <= 7 && rounds <= previousObjectCode.getEffectiveSize());
68
69 long result = calculateLastSum(previousObjectCode);
70 return new StateCoderResult((int) result, previousObjectCode);
71 }
72
73 private void ensureInitialized() {
74 if (impactValues != null) {
75 return;
76 }
77
78 nullImpactValues = new ArrayList<>();
79 impactValues = new LinkedHashMap<>();
80 individualHashValues = IntLongMaps.mutable.empty();
33 // Random isn't used for cryptographical purposes but just to assign distinguishable identifiers to symbols. 81 // Random isn't used for cryptographical purposes but just to assign distinguishable identifiers to symbols.
34 @SuppressWarnings("squid:S2245") 82 @SuppressWarnings("squid:S2245")
35 Random random = new Random(1); 83 Random random = new Random(1);
36 84
37 var individualsInOrder = individuals.toSortedList(Integer::compare); 85 var individualsInOrder = individuals.toSortedList(Integer::compare);
38 for(int i = 0; i<individualsInOrder.size(); i++) { 86 for (int i = 0; i < individualsInOrder.size(); i++) {
39 individualHashValues.put(individualsInOrder.get(i), random.nextLong()); 87 individualHashValues.put(individualsInOrder.get(i), random.nextLong());
40 } 88 }
41 89
42 for (AnyInterpretation interpretation : interpretations) { 90 for (var interpretation : getInterpretations()) {
43 int arity = interpretation.getSymbol().arity(); 91 int arity = getArity(interpretation);
44 if (arity == 0) { 92 if (arity == 0) {
45 nullImpactValues.add(interpretation); 93 nullImpactValues.add(interpretation);
46 } else { 94 } else {
@@ -50,6 +98,88 @@ public abstract class AbstractNeighbourhoodCalculator {
50 } 98 }
51 impactValues.put(interpretation, impact); 99 impactValues.put(interpretation, impact);
52 } 100 }
101
102 }
103 }
104
105 private long calculateLastSum(ObjectCode codes) {
106 long result = 0;
107 for (var nullImpactValue : nullImpactValues) {
108 result = result * PRIME + Objects.hashCode(getNullValue(nullImpactValue));
109 }
110
111 for (int i = 0; i < codes.getSize(); i++) {
112 final long hash = codes.get(i);
113 result += hash*PRIME;
114 }
115
116 return result;
117 }
118
119 private void constructNextObjectCodes(ObjectCodeImpl previous, ObjectCodeImpl next) {
120 for (var impactValueEntry : this.impactValues.entrySet()) {
121 model.checkCancelled();
122 var interpretation = impactValueEntry.getKey();
123 var cursor = getCursor(interpretation);
124 int arity = getArity(interpretation);
125 long[] impactValue = impactValueEntry.getValue();
126 impactCalculation(previous, next, impactValue, cursor, arity);
127 }
128 }
129
130 protected void impactCalculation(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValue,
131 Cursor<Tuple, ?> cursor, int arity) {
132 switch (arity) {
133 case 1 -> {
134 while (cursor.move()) {
135 impactCalculation1(previous, next, impactValue, cursor);
136 }
137 }
138 case 2 -> {
139 while (cursor.move()) {
140 impactCalculation2(previous, next, impactValue, cursor);
141 }
142 }
143 default -> {
144 while (cursor.move()) {
145 impactCalculationN(previous, next, impactValue, cursor);
146 }
147 }
148 }
149 }
150
151 private void impactCalculation1(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues,
152 Cursor<Tuple, ?> cursor) {
153
154 Tuple tuple = cursor.getKey();
155 int o = tuple.get(0);
156 Object value = cursor.getValue();
157 long tupleHash = getTupleHash1(tuple, value, previous);
158 addHash(next, o, impactValues[0], tupleHash);
159 }
160
161 private void impactCalculation2(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues,
162 Cursor<Tuple, ?> cursor) {
163 final Tuple tuple = cursor.getKey();
164 final int o1 = tuple.get(0);
165 final int o2 = tuple.get(1);
166
167 Object value = cursor.getValue();
168 long tupleHash = getTupleHash2(tuple, value, previous);
169
170 addHash(next, o1, impactValues[0], tupleHash);
171 addHash(next, o2, impactValues[1], tupleHash);
172 }
173
174 private void impactCalculationN(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues,
175 Cursor<Tuple, ?> cursor) {
176 final Tuple tuple = cursor.getKey();
177
178 Object value = cursor.getValue();
179 long tupleHash = getTupleHashN(tuple, value, previous);
180
181 for (int i = 0; i < tuple.getSize(); i++) {
182 addHash(next, tuple.get(i), impactValues[i], tupleHash);
53 } 183 }
54 } 184 }
55 185
@@ -88,13 +218,4 @@ public abstract class AbstractNeighbourhoodCalculator {
88 long x = tupleHash * impact; 218 long x = tupleHash * impact;
89 objectCodeImpl.set(o, objectCodeImpl.get(o) + x); 219 objectCodeImpl.set(o, objectCodeImpl.get(o) + x);
90 } 220 }
91
92 protected long calculateModelCode(long lastSum) {
93 long result = 0;
94 for (var nullImpactValue : nullImpactValues) {
95 result = result * PRIME + Objects.hashCode(((Interpretation<?>) nullImpactValue).get(Tuple0.INSTANCE));
96 }
97 result += lastSum;
98 return result;
99 }
100} 221}
diff --git a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/LazyNeighbourhoodCalculator.java b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/LazyNeighbourhoodCalculator.java
deleted file mode 100644
index 04335141..00000000
--- a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/LazyNeighbourhoodCalculator.java
+++ /dev/null
@@ -1,195 +0,0 @@
1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.statecoding.neighbourhood;
7
8import org.eclipse.collections.api.factory.primitive.LongIntMaps;
9import org.eclipse.collections.api.map.primitive.LongIntMap;
10import org.eclipse.collections.api.map.primitive.MutableLongIntMap;
11import org.eclipse.collections.api.set.primitive.IntSet;
12import tools.refinery.store.map.Cursor;
13import tools.refinery.store.model.AnyInterpretation;
14import tools.refinery.store.model.Interpretation;
15import tools.refinery.store.model.Model;
16import tools.refinery.store.statecoding.StateCodeCalculator;
17import tools.refinery.store.statecoding.StateCoderResult;
18import tools.refinery.store.tuple.Tuple;
19
20import java.util.List;
21
22public class LazyNeighbourhoodCalculator extends AbstractNeighbourhoodCalculator implements StateCodeCalculator {
23 public LazyNeighbourhoodCalculator(Model model, List<? extends AnyInterpretation> interpretations,
24 IntSet individuals) {
25 super(model, interpretations, individuals);
26 }
27
28 public StateCoderResult calculateCodes() {
29 ObjectCodeImpl previousObjectCode = new ObjectCodeImpl();
30 MutableLongIntMap prevHash2Amount = LongIntMaps.mutable.empty();
31
32 long lastSum;
33 // All hash code is 0, except to the individuals.
34 int lastSize = 1;
35 boolean first = true;
36
37 boolean grows;
38 int rounds = 0;
39 do {
40 final ObjectCodeImpl nextObjectCode;
41 if (first) {
42 nextObjectCode = new ObjectCodeImpl();
43 initializeWithIndividuals(nextObjectCode);
44 } else {
45 nextObjectCode = new ObjectCodeImpl(previousObjectCode);
46 }
47 constructNextObjectCodes(previousObjectCode, nextObjectCode, prevHash2Amount);
48
49 MutableLongIntMap nextHash2Amount = LongIntMaps.mutable.empty();
50 lastSum = calculateLastSum(previousObjectCode, nextObjectCode, prevHash2Amount, nextHash2Amount);
51
52 int nextSize = nextHash2Amount.size();
53 grows = nextSize > lastSize;
54 lastSize = nextSize;
55 first = false;
56
57 previousObjectCode = nextObjectCode;
58 prevHash2Amount = nextHash2Amount;
59 } while (grows && rounds++ < 4/*&& lastSize < previousObjectCode.getSize()*/);
60
61 long result = calculateModelCode(lastSum);
62
63 return new StateCoderResult((int) result, previousObjectCode);
64 }
65
66 private long calculateLastSum(ObjectCodeImpl previous, ObjectCodeImpl next, LongIntMap hash2Amount,
67 MutableLongIntMap nextHash2Amount) {
68 long lastSum = 0;
69 for (int i = 0; i < next.getSize(); i++) {
70 final long hash;
71 if (isUnique(hash2Amount, previous, i)) {
72 hash = previous.get(i);
73 next.set(i, hash);
74 } else {
75 hash = next.get(i);
76 }
77
78 final int amount = nextHash2Amount.get(hash);
79 nextHash2Amount.put(hash, amount + 1);
80
81 final long shifted1 = hash >>> 8;
82 final long shifted2 = hash << 8;
83 final long shifted3 = hash >> 2;
84 lastSum += shifted1 * shifted3 + shifted2;
85 }
86 return lastSum;
87 }
88
89 private void constructNextObjectCodes(ObjectCodeImpl previous, ObjectCodeImpl next, LongIntMap hash2Amount) {
90 for (var impactValueEntry : this.impactValues.entrySet()) {
91 Interpretation<?> interpretation = (Interpretation<?>) impactValueEntry.getKey();
92 var cursor = interpretation.getAll();
93 int arity = interpretation.getSymbol().arity();
94 long[] impactValue = impactValueEntry.getValue();
95
96 if (arity == 1) {
97 while (cursor.move()) {
98 lazyImpactCalculation1(hash2Amount, previous, next, impactValue, cursor);
99 }
100 } else if (arity == 2) {
101 while (cursor.move()) {
102 lazyImpactCalculation2(hash2Amount, previous, next, impactValue, cursor);
103 }
104 } else {
105 while (cursor.move()) {
106 lazyImpactCalculationN(hash2Amount, previous, next, impactValue, cursor);
107 }
108 }
109 }
110 }
111
112 private boolean isUnique(LongIntMap hash2Amount, ObjectCodeImpl objectCodeImpl, int object) {
113 final long hash = objectCodeImpl.get(object);
114 if (hash == 0) {
115 return false;
116 }
117 final int amount = hash2Amount.get(hash);
118 return amount == 1;
119 }
120
121 private void lazyImpactCalculation1(LongIntMap hash2Amount, ObjectCodeImpl previous, ObjectCodeImpl next,
122 long[] impactValues, Cursor<Tuple, ?> cursor) {
123
124 Tuple tuple = cursor.getKey();
125 int o = tuple.get(0);
126
127 if (isUnique(hash2Amount, previous, o)) {
128 next.ensureSize(o);
129 } else {
130 Object value = cursor.getValue();
131 long tupleHash = getTupleHash1(tuple, value, previous);
132
133 addHash(next, o, impactValues[0], tupleHash);
134 }
135 }
136
137 private void lazyImpactCalculation2(LongIntMap hash2Amount, ObjectCodeImpl previous, ObjectCodeImpl next,
138 long[] impactValues, Cursor<Tuple, ?> cursor) {
139 final Tuple tuple = cursor.getKey();
140 final int o1 = tuple.get(0);
141 final int o2 = tuple.get(1);
142
143 final boolean u1 = isUnique(hash2Amount, previous, o1);
144 final boolean u2 = isUnique(hash2Amount, previous, o2);
145
146 if (u1 && u2) {
147 next.ensureSize(o1);
148 next.ensureSize(o2);
149 } else {
150 Object value = cursor.getValue();
151 long tupleHash = getTupleHash2(tuple, value, previous);
152
153 if (!u1) {
154 addHash(next, o1, impactValues[0], tupleHash);
155 next.ensureSize(o2);
156 }
157 if (!u2) {
158 next.ensureSize(o1);
159 addHash(next, o2, impactValues[1], tupleHash);
160 }
161 }
162 }
163
164 private void lazyImpactCalculationN(LongIntMap hash2Amount, ObjectCodeImpl previous, ObjectCodeImpl next,
165 long[] impactValues, Cursor<Tuple, ?> cursor) {
166 final Tuple tuple = cursor.getKey();
167
168 final boolean[] uniques = new boolean[tuple.getSize()];
169 boolean allUnique = true;
170 for (int i = 0; i < tuple.getSize(); i++) {
171 final boolean isUnique = isUnique(hash2Amount, previous, tuple.get(i));
172 uniques[i] = isUnique;
173 allUnique &= isUnique;
174 }
175
176 if (allUnique) {
177 for (int i = 0; i < tuple.getSize(); i++) {
178 next.ensureSize(tuple.get(i));
179 }
180 } else {
181 Object value = cursor.getValue();
182 long tupleHash = getTupleHashN(tuple, value, previous);
183
184 for (int i = 0; i < tuple.getSize(); i++) {
185 int o = tuple.get(i);
186 if (!uniques[i]) {
187 addHash(next, o, impactValues[i], tupleHash);
188 } else {
189 next.ensureSize(o);
190 }
191 }
192 }
193 }
194
195}
diff --git a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java
index 5e6de53b..f6071c5b 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.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 */
@@ -9,115 +9,36 @@ import org.eclipse.collections.api.set.primitive.IntSet;
9import tools.refinery.store.map.Cursor; 9import tools.refinery.store.map.Cursor;
10import tools.refinery.store.model.Interpretation; 10import tools.refinery.store.model.Interpretation;
11import tools.refinery.store.model.Model; 11import tools.refinery.store.model.Model;
12import tools.refinery.store.statecoding.ObjectCode;
13import tools.refinery.store.statecoding.StateCodeCalculator;
14import tools.refinery.store.statecoding.StateCoderResult;
15import tools.refinery.store.tuple.Tuple; 12import tools.refinery.store.tuple.Tuple;
16import tools.refinery.store.tuple.Tuple0;
17 13
18import java.util.List; 14import java.util.List;
19import java.util.Objects;
20 15
21public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator implements StateCodeCalculator { 16public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator<Interpretation<?>> {
22 private ObjectCodeImpl previousObjectCode = new ObjectCodeImpl(); 17 private final List<Interpretation<?>> interpretations;
23 private ObjectCodeImpl nextObjectCode = new ObjectCodeImpl();
24 18
25 public NeighbourhoodCalculator(Model model, List<? extends Interpretation<?>> interpretations, IntSet individuals) { 19 public NeighbourhoodCalculator(Model model, List<? extends Interpretation<?>> interpretations,
26 super(model, interpretations, individuals); 20 IntSet individuals) {
21 super(model, individuals);
22 this.interpretations = List.copyOf(interpretations);
27 } 23 }
28 24
29 public StateCoderResult calculateCodes() { 25 @Override
30 model.checkCancelled(); 26 public List<Interpretation<?>> getInterpretations() {
31 previousObjectCode.clear(); 27 return interpretations;
32 nextObjectCode.clear();
33 initializeWithIndividuals(previousObjectCode);
34
35 int rounds = 0;
36 do {
37 model.checkCancelled();
38 constructNextObjectCodes(previousObjectCode, nextObjectCode);
39 var tempObjectCode = previousObjectCode;
40 previousObjectCode = nextObjectCode;
41 nextObjectCode = tempObjectCode;
42 nextObjectCode.clear();
43 rounds++;
44 } while (rounds <= 7 && rounds <= previousObjectCode.getEffectiveSize());
45
46 long result = calculateLastSum(previousObjectCode);
47 return new StateCoderResult((int) result, previousObjectCode);
48 } 28 }
49 29
50 private long calculateLastSum(ObjectCode codes) { 30 @Override
51 long result = 0; 31 protected int getArity(Interpretation<?> interpretation) {
52 for (var nullImpactValue : nullImpactValues) { 32 return interpretation.getSymbol().arity();
53 result = result * PRIME + Objects.hashCode(((Interpretation<?>) nullImpactValue).get(Tuple0.INSTANCE));
54 }
55
56 for (int i = 0; i < codes.getSize(); i++) {
57 final long hash = codes.get(i);
58 result += hash*PRIME;
59 }
60
61 return result;
62 } 33 }
63 34
64 private void constructNextObjectCodes(ObjectCodeImpl previous, ObjectCodeImpl next) { 35 @Override
65 for (var impactValueEntry : this.impactValues.entrySet()) { 36 protected Object getNullValue(Interpretation<?> interpretation) {
66 model.checkCancelled(); 37 return interpretation.get(Tuple.of());
67 Interpretation<?> interpretation = (Interpretation<?>) impactValueEntry.getKey();
68 var cursor = interpretation.getAll();
69 int arity = interpretation.getSymbol().arity();
70 long[] impactValue = impactValueEntry.getValue();
71
72 if (arity == 1) {
73 while (cursor.move()) {
74 impactCalculation1(previous, next, impactValue, cursor);
75 }
76 } else if (arity == 2) {
77 while (cursor.move()) {
78 impactCalculation2(previous, next, impactValue, cursor);
79 }
80 } else {
81 while (cursor.move()) {
82 impactCalculationN(previous, next, impactValue, cursor);
83 }
84 }
85 }
86 } 38 }
87 39
88 40 @Override
89 private void impactCalculation1(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues, 41 protected Cursor<Tuple, ?> getCursor(Interpretation<?> interpretation) {
90 Cursor<Tuple, ?> cursor) { 42 return interpretation.getAll();
91
92 Tuple tuple = cursor.getKey();
93 int o = tuple.get(0);
94 Object value = cursor.getValue();
95 long tupleHash = getTupleHash1(tuple, value, previous);
96 addHash(next, o, impactValues[0], tupleHash);
97 }
98
99 private void impactCalculation2(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues,
100 Cursor<Tuple, ?> cursor) {
101 final Tuple tuple = cursor.getKey();
102 final int o1 = tuple.get(0);
103 final int o2 = tuple.get(1);
104
105 Object value = cursor.getValue();
106 long tupleHash = getTupleHash2(tuple, value, previous);
107
108 addHash(next, o1, impactValues[0], tupleHash);
109 addHash(next, o2, impactValues[1], tupleHash);
110 }
111
112 private void impactCalculationN(ObjectCodeImpl previous, ObjectCodeImpl next, long[] impactValues,
113 Cursor<Tuple, ?> cursor) {
114 final Tuple tuple = cursor.getKey();
115
116 Object value = cursor.getValue();
117 long tupleHash = getTupleHashN(tuple, value, previous);
118
119 for (int i = 0; i < tuple.getSize(); i++) {
120 addHash(next, tuple.get(i), impactValues[i], tupleHash);
121 }
122 } 43 }
123} 44}