@memoarchitect/ontology 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +148 -0
- package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +301 -0
- package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +229 -0
- package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +200 -0
- package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +188 -0
- package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +173 -0
- package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +180 -0
- package/examples/gpca-pump/analysis/Samples/README.md +37 -0
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +21 -11
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +7 -1
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +34 -5
- package/examples/gpca-pump/model/catalog/gpca_risk.sysml +9 -0
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +32 -8
- package/examples/gpca-pump/model/views/logical_device_interconnect_view.sysml +3 -3
- package/package.json +2 -2
- package/src/rules/ontology/ontology_invariants.sysml +13 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +2 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "memo-1",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Model overview\n",
|
|
9
|
+
"\n",
|
|
10
|
+
"Visual summary of model size, semantic content, and diagnostics.\n",
|
|
11
|
+
"\n",
|
|
12
|
+
"This sample uses only standard SysML v2 concepts and automatically discovers the project's `model/` or `src/` directory."
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"cell_type": "code",
|
|
17
|
+
"execution_count": 1,
|
|
18
|
+
"id": "memo-2",
|
|
19
|
+
"metadata": {
|
|
20
|
+
"execution": {
|
|
21
|
+
"iopub.execute_input": "2026-07-29T22:31:46.345732Z",
|
|
22
|
+
"iopub.status.busy": "2026-07-29T22:31:46.345598Z",
|
|
23
|
+
"iopub.status.idle": "2026-07-29T22:31:46.699014Z",
|
|
24
|
+
"shell.execute_reply": "2026-07-29T22:31:46.698564Z"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"outputs": [
|
|
28
|
+
{
|
|
29
|
+
"name": "stdout",
|
|
30
|
+
"output_type": "stream",
|
|
31
|
+
"text": [
|
|
32
|
+
"Loaded 42 SysML files from /Users/poojakashyap/sandbox/memo-meta/memo/examples/gpca-pump/model\n"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"source": [
|
|
37
|
+
"from pathlib import Path\n",
|
|
38
|
+
"from collections import Counter, defaultdict\n",
|
|
39
|
+
"import syside\n",
|
|
40
|
+
"\n",
|
|
41
|
+
"def find_sysml_root(start=Path.cwd()):\n",
|
|
42
|
+
" \"\"\"Find the nearest model/ or src/ folder containing textual SysML.\"\"\"\n",
|
|
43
|
+
" for directory in (start, *start.parents):\n",
|
|
44
|
+
" for folder_name in ('model', 'src'):\n",
|
|
45
|
+
" candidate = directory / folder_name\n",
|
|
46
|
+
" if candidate.is_dir() and next(candidate.rglob('*.sysml'), None):\n",
|
|
47
|
+
" return candidate\n",
|
|
48
|
+
" raise FileNotFoundError('No model/ or src/ directory containing .sysml files was found')\n",
|
|
49
|
+
"\n",
|
|
50
|
+
"SYSML_ROOT = find_sysml_root()\n",
|
|
51
|
+
"SYSML_FILES = sorted(SYSML_ROOT.rglob('*.sysml'))\n",
|
|
52
|
+
"model, diagnostics = syside.try_load_model([str(path) for path in SYSML_FILES])\n",
|
|
53
|
+
"print(f'Loaded {len(SYSML_FILES)} SysML files from {SYSML_ROOT}')"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"cell_type": "code",
|
|
58
|
+
"execution_count": 2,
|
|
59
|
+
"id": "memo-3",
|
|
60
|
+
"metadata": {
|
|
61
|
+
"execution": {
|
|
62
|
+
"iopub.execute_input": "2026-07-29T22:31:46.700004Z",
|
|
63
|
+
"iopub.status.busy": "2026-07-29T22:31:46.699937Z",
|
|
64
|
+
"iopub.status.idle": "2026-07-29T22:31:46.707568Z",
|
|
65
|
+
"shell.execute_reply": "2026-07-29T22:31:46.707310Z"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"outputs": [
|
|
69
|
+
{
|
|
70
|
+
"data": {
|
|
71
|
+
"text/html": [
|
|
72
|
+
"<h3>Semantic inventory</h3><table><tr><th>Element type</th><th>Count</th><th>Relative size</th></tr><tr><td>AttributeUsage</td><td>5,056</td><td><div style=\"background:#2d8d70;height:12px;width:320px\"></div></td></tr><tr><td>ConnectionUsage</td><td>691</td><td><div style=\"background:#2d8d70;height:12px;width:44px\"></div></td></tr><tr><td>PartUsage</td><td>425</td><td><div style=\"background:#2d8d70;height:12px;width:27px\"></div></td></tr><tr><td>RequirementUsage</td><td>105</td><td><div style=\"background:#2d8d70;height:12px;width:7px\"></div></td></tr><tr><td>ActionUsage</td><td>44</td><td><div style=\"background:#2d8d70;height:12px;width:3px\"></div></td></tr><tr><td>Package</td><td>42</td><td><div style=\"background:#2d8d70;height:12px;width:3px\"></div></td></tr><tr><td>StateUsage</td><td>10</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>ActionDefinition</td><td>6</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>PortDefinition</td><td>1</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>PartDefinition</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>RequirementDefinition</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>PortUsage</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>ConnectionDefinition</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>StateDefinition</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr><tr><td>AttributeDefinition</td><td>0</td><td><div style=\"background:#2d8d70;height:12px;width:2px\"></div></td></tr></table>"
|
|
73
|
+
],
|
|
74
|
+
"text/plain": [
|
|
75
|
+
"<IPython.core.display.HTML object>"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"metadata": {},
|
|
79
|
+
"output_type": "display_data"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"data": {
|
|
83
|
+
"text/plain": [
|
|
84
|
+
"{'SysML files': 42, 'Errors': 8009, 'Warnings': 0, 'Information': 0}"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"execution_count": 2,
|
|
88
|
+
"metadata": {},
|
|
89
|
+
"output_type": "execute_result"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"source": [
|
|
93
|
+
"from IPython.display import HTML, display\n",
|
|
94
|
+
"\n",
|
|
95
|
+
"semantic_types = [\n",
|
|
96
|
+
" 'Package', 'PartDefinition', 'PartUsage', 'RequirementDefinition',\n",
|
|
97
|
+
" 'RequirementUsage', 'ActionDefinition', 'ActionUsage', 'PortDefinition',\n",
|
|
98
|
+
" 'PortUsage', 'ConnectionDefinition', 'ConnectionUsage', 'StateDefinition',\n",
|
|
99
|
+
" 'StateUsage', 'AttributeDefinition', 'AttributeUsage'\n",
|
|
100
|
+
"]\n",
|
|
101
|
+
"counts = {}\n",
|
|
102
|
+
"for type_name in semantic_types:\n",
|
|
103
|
+
" node_type = getattr(syside, type_name, None)\n",
|
|
104
|
+
" if node_type is not None:\n",
|
|
105
|
+
" counts[type_name] = len(list(model.elements(node_type)))\n",
|
|
106
|
+
"\n",
|
|
107
|
+
"largest = max(counts.values(), default=1)\n",
|
|
108
|
+
"rows = ''.join(\n",
|
|
109
|
+
" f'<tr><td>{name}</td><td>{count:,}</td><td><div style=\"background:#2d8d70;height:12px;width:{max(2, count * 320 / largest):.0f}px\"></div></td></tr>'\n",
|
|
110
|
+
" for name, count in sorted(counts.items(), key=lambda item: item[1], reverse=True)\n",
|
|
111
|
+
")\n",
|
|
112
|
+
"display(HTML(f'<h3>Semantic inventory</h3><table><tr><th>Element type</th><th>Count</th><th>Relative size</th></tr>{rows}</table>'))\n",
|
|
113
|
+
"\n",
|
|
114
|
+
"{\n",
|
|
115
|
+
" 'SysML files': len(SYSML_FILES),\n",
|
|
116
|
+
" 'Errors': len(list(diagnostics.errors)),\n",
|
|
117
|
+
" 'Warnings': len(list(diagnostics.warnings)),\n",
|
|
118
|
+
" 'Information': len(list(diagnostics.infos)),\n",
|
|
119
|
+
"}"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
"metadata": {
|
|
124
|
+
"kernelspec": {
|
|
125
|
+
"display_name": "Python 3 (ipykernel)",
|
|
126
|
+
"language": "python",
|
|
127
|
+
"name": "python3"
|
|
128
|
+
},
|
|
129
|
+
"language_info": {
|
|
130
|
+
"codemirror_mode": {
|
|
131
|
+
"name": "ipython",
|
|
132
|
+
"version": 3
|
|
133
|
+
},
|
|
134
|
+
"file_extension": ".py",
|
|
135
|
+
"mimetype": "text/x-python",
|
|
136
|
+
"name": "python",
|
|
137
|
+
"nbconvert_exporter": "python",
|
|
138
|
+
"pygments_lexer": "ipython3",
|
|
139
|
+
"version": "3.12.13"
|
|
140
|
+
},
|
|
141
|
+
"memo": {
|
|
142
|
+
"description": "Visual summary of model size, semantic content, and diagnostics.",
|
|
143
|
+
"starter": true
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"nbformat": 4,
|
|
147
|
+
"nbformat_minor": 5
|
|
148
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "memo-1",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Architecture hotspots\n",
|
|
9
|
+
"\n",
|
|
10
|
+
"Find busy containers, deep ownership paths, and dominant semantic types.\n",
|
|
11
|
+
"\n",
|
|
12
|
+
"This sample uses only standard SysML v2 concepts and automatically discovers the project's `model/` or `src/` directory."
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"cell_type": "code",
|
|
17
|
+
"execution_count": 1,
|
|
18
|
+
"id": "memo-2",
|
|
19
|
+
"metadata": {
|
|
20
|
+
"execution": {
|
|
21
|
+
"iopub.execute_input": "2026-07-29T22:31:48.480637Z",
|
|
22
|
+
"iopub.status.busy": "2026-07-29T22:31:48.480406Z",
|
|
23
|
+
"iopub.status.idle": "2026-07-29T22:31:48.765461Z",
|
|
24
|
+
"shell.execute_reply": "2026-07-29T22:31:48.765134Z"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"outputs": [
|
|
28
|
+
{
|
|
29
|
+
"name": "stdout",
|
|
30
|
+
"output_type": "stream",
|
|
31
|
+
"text": [
|
|
32
|
+
"Loaded 42 SysML files from /Users/poojakashyap/sandbox/memo-meta/memo/examples/gpca-pump/model\n"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"source": [
|
|
37
|
+
"from pathlib import Path\n",
|
|
38
|
+
"from collections import Counter, defaultdict\n",
|
|
39
|
+
"import syside\n",
|
|
40
|
+
"\n",
|
|
41
|
+
"def find_sysml_root(start=Path.cwd()):\n",
|
|
42
|
+
" \"\"\"Find the nearest model/ or src/ folder containing textual SysML.\"\"\"\n",
|
|
43
|
+
" for directory in (start, *start.parents):\n",
|
|
44
|
+
" for folder_name in ('model', 'src'):\n",
|
|
45
|
+
" candidate = directory / folder_name\n",
|
|
46
|
+
" if candidate.is_dir() and next(candidate.rglob('*.sysml'), None):\n",
|
|
47
|
+
" return candidate\n",
|
|
48
|
+
" raise FileNotFoundError('No model/ or src/ directory containing .sysml files was found')\n",
|
|
49
|
+
"\n",
|
|
50
|
+
"SYSML_ROOT = find_sysml_root()\n",
|
|
51
|
+
"SYSML_FILES = sorted(SYSML_ROOT.rglob('*.sysml'))\n",
|
|
52
|
+
"model, diagnostics = syside.try_load_model([str(path) for path in SYSML_FILES])\n",
|
|
53
|
+
"print(f'Loaded {len(SYSML_FILES)} SysML files from {SYSML_ROOT}')"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"cell_type": "code",
|
|
58
|
+
"execution_count": 2,
|
|
59
|
+
"id": "memo-3",
|
|
60
|
+
"metadata": {
|
|
61
|
+
"execution": {
|
|
62
|
+
"iopub.execute_input": "2026-07-29T22:31:48.768663Z",
|
|
63
|
+
"iopub.status.busy": "2026-07-29T22:31:48.768585Z",
|
|
64
|
+
"iopub.status.idle": "2026-07-29T22:31:48.814237Z",
|
|
65
|
+
"shell.execute_reply": "2026-07-29T22:31:48.813848Z"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"outputs": [
|
|
69
|
+
{
|
|
70
|
+
"name": "stdout",
|
|
71
|
+
"output_type": "stream",
|
|
72
|
+
"text": [
|
|
73
|
+
"Top containers by directly owned semantic elements\n"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"data": {
|
|
78
|
+
"text/plain": [
|
|
79
|
+
"[(19,\n",
|
|
80
|
+
" 'RequirementUsage',\n",
|
|
81
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_requirements::reqWatchdogSafeState'),\n",
|
|
82
|
+
" (19,\n",
|
|
83
|
+
" 'RequirementUsage',\n",
|
|
84
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_requirements::reqDoorOpen'),\n",
|
|
85
|
+
" (18,\n",
|
|
86
|
+
" 'RequirementUsage',\n",
|
|
87
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_requirements::reqPowerLossRetention'),\n",
|
|
88
|
+
" (18,\n",
|
|
89
|
+
" 'RequirementUsage',\n",
|
|
90
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_requirements::reqPost'),\n",
|
|
91
|
+
" (18,\n",
|
|
92
|
+
" 'RequirementUsage',\n",
|
|
93
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_requirements::reqDrugLibraryLimits'),\n",
|
|
94
|
+
" (18,\n",
|
|
95
|
+
" 'ActionUsage',\n",
|
|
96
|
+
" 'memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow'),\n",
|
|
97
|
+
" (17,\n",
|
|
98
|
+
" 'ViewUsage',\n",
|
|
99
|
+
" 'memo_examples_gpca_pump_model_views_logical_system_decomposition_view::gpcaSystemDecompositionView'),\n",
|
|
100
|
+
" (16,\n",
|
|
101
|
+
" 'ViewUsage',\n",
|
|
102
|
+
" 'memo_examples_gpca_pump_model_views_software_software_architecture_view::gpcaSoftwareArchitectureView'),\n",
|
|
103
|
+
" (16,\n",
|
|
104
|
+
" 'ViewUsage',\n",
|
|
105
|
+
" 'memo_examples_gpca_pump_model_views_risk_risk_chain_view::gpcaRiskChainView'),\n",
|
|
106
|
+
" (16,\n",
|
|
107
|
+
" 'ViewUsage',\n",
|
|
108
|
+
" 'memo_examples_gpca_pump_model_views_operational_use_case_view::gpcaUseCaseView'),\n",
|
|
109
|
+
" (16,\n",
|
|
110
|
+
" 'ViewUsage',\n",
|
|
111
|
+
" 'memo_examples_gpca_pump_model_views_logical_mode_state_view::gpcaModeStateView'),\n",
|
|
112
|
+
" (16,\n",
|
|
113
|
+
" 'ViewUsage',\n",
|
|
114
|
+
" 'memo_examples_gpca_pump_model_views_logical_logical_architecture_view::gpcaLogicalArchitectureView'),\n",
|
|
115
|
+
" (16,\n",
|
|
116
|
+
" 'ViewUsage',\n",
|
|
117
|
+
" 'memo_examples_gpca_pump_model_views_logical_device_interconnect_view::gpcaDeviceInterconnectView'),\n",
|
|
118
|
+
" (16,\n",
|
|
119
|
+
" 'ViewUsage',\n",
|
|
120
|
+
" 'memo_examples_gpca_pump_model_views_document_dhf_index_view::dhfIndexView'),\n",
|
|
121
|
+
" (16,\n",
|
|
122
|
+
" 'ViewUsage',\n",
|
|
123
|
+
" 'memo_examples_gpca_pump_model_views_document_architecture_description_view::architectureDescriptionView'),\n",
|
|
124
|
+
" (16,\n",
|
|
125
|
+
" 'ViewUsage',\n",
|
|
126
|
+
" 'memo_examples_gpca_pump_model_views_cybersecurity_cybersecurity_view::gpcaCybersecurityView'),\n",
|
|
127
|
+
" (16,\n",
|
|
128
|
+
" 'ViewUsage',\n",
|
|
129
|
+
" 'memo_examples_gpca_pump_model_views_context_system_context_view::gpcaSystemContextView'),\n",
|
|
130
|
+
" (16,\n",
|
|
131
|
+
" 'ViewUsage',\n",
|
|
132
|
+
" 'memo_examples_gpca_pump_model_views_behavior_action_flow_view::gpcaActionFlowView'),\n",
|
|
133
|
+
" (15,\n",
|
|
134
|
+
" 'ViewUsage',\n",
|
|
135
|
+
" 'memo_examples_gpca_pump_model_views_verification_verification_coverage_view::gpcaVerificationCoverageView'),\n",
|
|
136
|
+
" (15,\n",
|
|
137
|
+
" 'ViewUsage',\n",
|
|
138
|
+
" 'memo_examples_gpca_pump_model_views_risk_fmea_view::gpcaFmeaView'),\n",
|
|
139
|
+
" (15,\n",
|
|
140
|
+
" 'ViewUsage',\n",
|
|
141
|
+
" 'memo_examples_gpca_pump_model_views_requirements_requirements_trace_view::gpcaRequirementsTraceView'),\n",
|
|
142
|
+
" (15,\n",
|
|
143
|
+
" 'ViewUsage',\n",
|
|
144
|
+
" 'memo_examples_gpca_pump_model_views_physical_physical_bom_view::gpcaPhysicalBomView'),\n",
|
|
145
|
+
" (15,\n",
|
|
146
|
+
" 'ViewUsage',\n",
|
|
147
|
+
" 'memo_examples_gpca_pump_model_views_operational_scenario_sequence_view::gpcaScenarioSequenceView'),\n",
|
|
148
|
+
" (15,\n",
|
|
149
|
+
" 'ViewUsage',\n",
|
|
150
|
+
" 'memo_examples_gpca_pump_model_views_functional_function_browser_view::gpcaFunctionBrowserView'),\n",
|
|
151
|
+
" (15,\n",
|
|
152
|
+
" 'ViewUsage',\n",
|
|
153
|
+
" 'memo_examples_gpca_pump_model_views_functional_function_allocation_view::gpcaFunctionAllocationView')]"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
"metadata": {},
|
|
157
|
+
"output_type": "display_data"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"name": "stdout",
|
|
161
|
+
"output_type": "stream",
|
|
162
|
+
"text": [
|
|
163
|
+
"Deepest ownership paths\n"
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"data": {
|
|
168
|
+
"text/plain": [
|
|
169
|
+
"[(5, 'ReferenceUsage', 'sensorStatus'),\n",
|
|
170
|
+
" (5, 'ReferenceUsage', 'sensorStatus'),\n",
|
|
171
|
+
" (5, 'ReferenceUsage', 'flowCommand'),\n",
|
|
172
|
+
" (5, 'ReferenceUsage', 'flowCommand'),\n",
|
|
173
|
+
" (5, 'ReferenceUsage', 'authorizedBolus'),\n",
|
|
174
|
+
" (5, 'ReferenceUsage', 'authorizedBolus'),\n",
|
|
175
|
+
" (5, 'ReferenceUsage', 'alarmSignal'),\n",
|
|
176
|
+
" (5, 'ReferenceUsage', 'alarmSignal'),\n",
|
|
177
|
+
" (5, 'ReferenceUsage', 'actuation'),\n",
|
|
178
|
+
" (5, 'ReferenceUsage', 'actuation'),\n",
|
|
179
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
180
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
181
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
182
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
183
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
184
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
185
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
186
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
187
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
188
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
189
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
190
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
191
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
192
|
+
" (4, 'AttributeUsage', '<unnamed>'),\n",
|
|
193
|
+
" (4, 'AttributeUsage', '<unnamed>')]"
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
"metadata": {},
|
|
197
|
+
"output_type": "display_data"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "stdout",
|
|
201
|
+
"output_type": "stream",
|
|
202
|
+
"text": [
|
|
203
|
+
"Most common semantic types\n"
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"data": {
|
|
208
|
+
"text/plain": [
|
|
209
|
+
"[('AttributeUsage', 5056),\n",
|
|
210
|
+
" ('ConnectionUsage', 691),\n",
|
|
211
|
+
" ('PartUsage', 425),\n",
|
|
212
|
+
" ('ReferenceUsage', 174),\n",
|
|
213
|
+
" ('RequirementUsage', 105),\n",
|
|
214
|
+
" ('ItemUsage', 49),\n",
|
|
215
|
+
" ('ActionUsage', 44),\n",
|
|
216
|
+
" ('SuccessionAsUsage', 29),\n",
|
|
217
|
+
" ('VerificationCaseUsage', 27),\n",
|
|
218
|
+
" ('ViewUsage', 26),\n",
|
|
219
|
+
" ('InterfaceUsage', 14),\n",
|
|
220
|
+
" ('StateUsage', 10),\n",
|
|
221
|
+
" ('AllocationUsage', 6),\n",
|
|
222
|
+
" ('ActionDefinition', 6),\n",
|
|
223
|
+
" ('FlowUsage', 5),\n",
|
|
224
|
+
" ('ItemDefinition', 5),\n",
|
|
225
|
+
" ('UseCaseUsage', 1),\n",
|
|
226
|
+
" ('PortDefinition', 1),\n",
|
|
227
|
+
" ('ConjugatedPortDefinition', 1),\n",
|
|
228
|
+
" ('InterfaceDefinition', 1)]"
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"execution_count": 2,
|
|
232
|
+
"metadata": {},
|
|
233
|
+
"output_type": "execute_result"
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
"source": [
|
|
237
|
+
"from IPython.display import display\n",
|
|
238
|
+
"\n",
|
|
239
|
+
"semantic_elements = (\n",
|
|
240
|
+
" list(model.elements(syside.Usage, include_subtypes=True))\n",
|
|
241
|
+
" + list(model.elements(syside.Definition, include_subtypes=True))\n",
|
|
242
|
+
")\n",
|
|
243
|
+
"\n",
|
|
244
|
+
"def safe_name(element):\n",
|
|
245
|
+
" value = element.qualified_name or element.name or element.declared_name\n",
|
|
246
|
+
" return str(value) if value else '<unnamed>'\n",
|
|
247
|
+
"\n",
|
|
248
|
+
"def ownership_depth(element):\n",
|
|
249
|
+
" depth, current, seen = 0, element.owner, set()\n",
|
|
250
|
+
" while current is not None and id(current) not in seen:\n",
|
|
251
|
+
" seen.add(id(current))\n",
|
|
252
|
+
" depth += 1\n",
|
|
253
|
+
" current = getattr(current, 'owner', None)\n",
|
|
254
|
+
" return depth\n",
|
|
255
|
+
"\n",
|
|
256
|
+
"containers = []\n",
|
|
257
|
+
"for element in semantic_elements:\n",
|
|
258
|
+
" children = [child for child in element.owned_elements if isinstance(child, (syside.Usage, syside.Definition))]\n",
|
|
259
|
+
" if children:\n",
|
|
260
|
+
" containers.append((len(children), type(element).__name__, safe_name(element)))\n",
|
|
261
|
+
"\n",
|
|
262
|
+
"print('Top containers by directly owned semantic elements')\n",
|
|
263
|
+
"display(sorted(containers, reverse=True)[:25])\n",
|
|
264
|
+
"\n",
|
|
265
|
+
"print('Deepest ownership paths')\n",
|
|
266
|
+
"display(sorted(\n",
|
|
267
|
+
" ((ownership_depth(item), type(item).__name__, safe_name(item)) for item in semantic_elements),\n",
|
|
268
|
+
" reverse=True,\n",
|
|
269
|
+
")[:25])\n",
|
|
270
|
+
"\n",
|
|
271
|
+
"print('Most common semantic types')\n",
|
|
272
|
+
"Counter(type(item).__name__ for item in semantic_elements).most_common(30)"
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
"metadata": {
|
|
277
|
+
"kernelspec": {
|
|
278
|
+
"display_name": "Python 3 (ipykernel)",
|
|
279
|
+
"language": "python",
|
|
280
|
+
"name": "python3"
|
|
281
|
+
},
|
|
282
|
+
"language_info": {
|
|
283
|
+
"codemirror_mode": {
|
|
284
|
+
"name": "ipython",
|
|
285
|
+
"version": 3
|
|
286
|
+
},
|
|
287
|
+
"file_extension": ".py",
|
|
288
|
+
"mimetype": "text/x-python",
|
|
289
|
+
"name": "python",
|
|
290
|
+
"nbconvert_exporter": "python",
|
|
291
|
+
"pygments_lexer": "ipython3",
|
|
292
|
+
"version": "3.12.13"
|
|
293
|
+
},
|
|
294
|
+
"memo": {
|
|
295
|
+
"description": "Find busy containers, deep ownership paths, and dominant semantic types.",
|
|
296
|
+
"starter": true
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
"nbformat": 4,
|
|
300
|
+
"nbformat_minor": 5
|
|
301
|
+
}
|