@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,173 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "memo-1",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Ownership graph\n",
|
|
9
|
+
"\n",
|
|
10
|
+
"Draw an SVG network of model elements and their ownership relationships.\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:35:03.359159Z",
|
|
22
|
+
"iopub.status.busy": "2026-07-29T22:35:03.359073Z",
|
|
23
|
+
"iopub.status.idle": "2026-07-29T22:35:04.055958Z",
|
|
24
|
+
"shell.execute_reply": "2026-07-29T22:35:04.055425Z"
|
|
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:35:04.060045Z",
|
|
63
|
+
"iopub.status.busy": "2026-07-29T22:35:04.059950Z",
|
|
64
|
+
"iopub.status.idle": "2026-07-29T22:35:04.079755Z",
|
|
65
|
+
"shell.execute_reply": "2026-07-29T22:35:04.079003Z"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"outputs": [
|
|
69
|
+
{
|
|
70
|
+
"data": {
|
|
71
|
+
"image/svg+xml": [
|
|
72
|
+
"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" viewBox=\"0 0 500 3550\" style=\"background:#fbfcfc;border:1px solid #d9e3e8;border-radius:10px\"><g><rect x=\"30\" y=\"30\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"47\" font-size=\"11\" font-weight=\"700\">reqDoorOpen</text><text x=\"39\" y=\"62\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"88\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"105\" font-size=\"11\" font-weight=\"700\">reqWatchdogSafeState</text><text x=\"39\" y=\"120\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"146\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#fff0dc\" stroke=\"#547180\"/><text x=\"39\" y=\"163\" font-size=\"11\" font-weight=\"700\">infusionDeliveryFlow</text><text x=\"39\" y=\"178\" font-size=\"9\" fill=\"#587487\">ActionUsage</text></g><g><rect x=\"30\" y=\"204\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"221\" font-size=\"11\" font-weight=\"700\">reqDrugLibraryLimits</text><text x=\"39\" y=\"236\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"262\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"279\" font-size=\"11\" font-weight=\"700\">reqPost</text><text x=\"39\" y=\"294\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"320\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"337\" font-size=\"11\" font-weight=\"700\">reqPowerLossRetention</text><text x=\"39\" y=\"352\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"378\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"395\" font-size=\"11\" font-weight=\"700\">gpcaSystemDecompositionView</text><text x=\"39\" y=\"410\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"436\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"453\" font-size=\"11\" font-weight=\"700\">gpcaActionFlowView</text><text x=\"39\" y=\"468\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"494\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"511\" font-size=\"11\" font-weight=\"700\">gpcaSystemContextView</text><text x=\"39\" y=\"526\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"552\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"569\" font-size=\"11\" font-weight=\"700\">gpcaCybersecurityView</text><text x=\"39\" y=\"584\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"610\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"627\" font-size=\"11\" font-weight=\"700\">architectureDescriptionView</text><text x=\"39\" y=\"642\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"668\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"685\" font-size=\"11\" font-weight=\"700\">dhfIndexView</text><text x=\"39\" y=\"700\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"726\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"743\" font-size=\"11\" font-weight=\"700\">gpcaDeviceInterconnectView</text><text x=\"39\" y=\"758\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"784\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"801\" font-size=\"11\" font-weight=\"700\">gpcaLogicalArchitectureView</text><text x=\"39\" y=\"816\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"842\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"859\" font-size=\"11\" font-weight=\"700\">gpcaModeStateView</text><text x=\"39\" y=\"874\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"900\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"917\" font-size=\"11\" font-weight=\"700\">gpcaUseCaseView</text><text x=\"39\" y=\"932\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"958\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"975\" font-size=\"11\" font-weight=\"700\">gpcaRiskChainView</text><text x=\"39\" y=\"990\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1016\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1033\" font-size=\"11\" font-weight=\"700\">gpcaSoftwareArchitectureVie</text><text x=\"39\" y=\"1048\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1074\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1091\" font-size=\"11\" font-weight=\"700\">reqAuthenticatedServiceAcce</text><text x=\"39\" y=\"1106\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1132\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1149\" font-size=\"11\" font-weight=\"700\">gpcaFunctionAllocationView</text><text x=\"39\" y=\"1164\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1190\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1207\" font-size=\"11\" font-weight=\"700\">gpcaFunctionBrowserView</text><text x=\"39\" y=\"1222\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1248\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1265\" font-size=\"11\" font-weight=\"700\">gpcaScenarioSequenceView</text><text x=\"39\" y=\"1280\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1306\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1323\" font-size=\"11\" font-weight=\"700\">gpcaPhysicalBomView</text><text x=\"39\" y=\"1338\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1364\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1381\" font-size=\"11\" font-weight=\"700\">gpcaRequirementsTraceView</text><text x=\"39\" y=\"1396\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1422\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1439\" font-size=\"11\" font-weight=\"700\">gpcaFmeaView</text><text x=\"39\" y=\"1454\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1480\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"1497\" font-size=\"11\" font-weight=\"700\">gpcaVerificationCoverageVie</text><text x=\"39\" y=\"1512\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"1538\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1555\" font-size=\"11\" font-weight=\"700\">reqOcclusion</text><text x=\"39\" y=\"1570\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1596\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1613\" font-size=\"11\" font-weight=\"700\">reqMaxHourlyDose</text><text x=\"39\" y=\"1628\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1654\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1671\" font-size=\"11\" font-weight=\"700\">reqEventLogging</text><text x=\"39\" y=\"1686\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1712\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1729\" font-size=\"11\" font-weight=\"700\">reqStuckButton</text><text x=\"39\" y=\"1744\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1770\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1787\" font-size=\"11\" font-weight=\"700\">reqFlowCrossCheck</text><text x=\"39\" y=\"1802\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1828\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1845\" font-size=\"11\" font-weight=\"700\">reqPumpAccuracy</text><text x=\"39\" y=\"1860\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1886\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1903\" font-size=\"11\" font-weight=\"700\">reqAlarmLoudness</text><text x=\"39\" y=\"1918\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"1944\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"1961\" font-size=\"11\" font-weight=\"700\">reqBatteryBackup</text><text x=\"39\" y=\"1976\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"2002\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#e8eefb\" stroke=\"#547180\"/><text x=\"39\" y=\"2019\" font-size=\"11\" font-weight=\"700\">reqFreeFlowPrevention</text><text x=\"39\" y=\"2034\" font-size=\"9\" fill=\"#587487\">RequirementUsage</text></g><g><rect x=\"30\" y=\"2060\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2077\" font-size=\"11\" font-weight=\"700\">hazardAnalysisView</text><text x=\"39\" y=\"2092\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2118\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2135\" font-size=\"11\" font-weight=\"700\">rmfView</text><text x=\"39\" y=\"2150\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2176\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2193\" font-size=\"11\" font-weight=\"700\">sddView</text><text x=\"39\" y=\"2208\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2234\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2251\" font-size=\"11\" font-weight=\"700\">vvView</text><text x=\"39\" y=\"2266\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2292\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2309\" font-size=\"11\" font-weight=\"700\">ddPrescription</text><text x=\"39\" y=\"2324\" font-size=\"9\" fill=\"#587487\">ItemUsage</text></g><g><rect x=\"30\" y=\"2350\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2367\" font-size=\"11\" font-weight=\"700\">cyberAssessmentView</text><text x=\"39\" y=\"2382\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2408\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2425\" font-size=\"11\" font-weight=\"700\">threatModelView</text><text x=\"39\" y=\"2440\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2466\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#f4f6f7\" stroke=\"#547180\"/><text x=\"39\" y=\"2483\" font-size=\"11\" font-weight=\"700\">usabilityView</text><text x=\"39\" y=\"2498\" font-size=\"9\" fill=\"#587487\">ViewUsage</text></g><g><rect x=\"30\" y=\"2524\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2541\" font-size=\"11\" font-weight=\"700\">gpcaIntendedUse</text><text x=\"39\" y=\"2556\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2582\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2599\" font-size=\"11\" font-weight=\"700\">configurationTamperingRisk</text><text x=\"39\" y=\"2614\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2640\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2657\" font-size=\"11\" font-weight=\"700\">exSensorVector</text><text x=\"39\" y=\"2672\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2698\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2715\" font-size=\"11\" font-weight=\"700\">exFlowCommand</text><text x=\"39\" y=\"2730\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2756\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2773\" font-size=\"11\" font-weight=\"700\">exAlarmAnnunciation</text><text x=\"39\" y=\"2788\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2814\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2831\" font-size=\"11\" font-weight=\"700\">exPrescriptionEntry</text><text x=\"39\" y=\"2846\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2872\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2889\" font-size=\"11\" font-weight=\"700\">osNominalTherapy</text><text x=\"39\" y=\"2904\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2930\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"2947\" font-size=\"11\" font-weight=\"700\">osLockoutBolus</text><text x=\"39\" y=\"2962\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"2988\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3005\" font-size=\"11\" font-weight=\"700\">osOcclusionAlarm</text><text x=\"39\" y=\"3020\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3046\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3063\" font-size=\"11\" font-weight=\"700\">osAirInLine</text><text x=\"39\" y=\"3078\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3104\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3121\" font-size=\"11\" font-weight=\"700\">osEmptyReservoir</text><text x=\"39\" y=\"3136\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3162\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3179\" font-size=\"11\" font-weight=\"700\">osPowerLoss</text><text x=\"39\" y=\"3194\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3220\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3237\" font-size=\"11\" font-weight=\"700\">notifDrugSafeValueNotPresen</text><text x=\"39\" y=\"3252\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3278\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3295\" font-size=\"11\" font-weight=\"700\">riskBefore</text><text x=\"39\" y=\"3310\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3336\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3353\" font-size=\"11\" font-weight=\"700\">riskBeforeUnderdose</text><text x=\"39\" y=\"3368\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3394\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3411\" font-size=\"11\" font-weight=\"700\">riskBeforeAir</text><text x=\"39\" y=\"3426\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g><g><rect x=\"30\" y=\"3452\" width=\"190\" height=\"40\" rx=\"7\" fill=\"#dff4ee\" stroke=\"#547180\"/><text x=\"39\" y=\"3469\" font-size=\"11\" font-weight=\"700\">riskBeforeWrongDose</text><text x=\"39\" y=\"3484\" font-size=\"9\" fill=\"#587487\">PartUsage</text></g></svg>"
|
|
73
|
+
],
|
|
74
|
+
"text/plain": [
|
|
75
|
+
"<IPython.core.display.SVG object>"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"metadata": {},
|
|
79
|
+
"output_type": "display_data"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "stdout",
|
|
83
|
+
"output_type": "stream",
|
|
84
|
+
"text": [
|
|
85
|
+
"Displayed 60 elements and 0 ownership edges\n"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"source": [
|
|
90
|
+
"from html import escape\n",
|
|
91
|
+
"from IPython.display import SVG, display\n",
|
|
92
|
+
"\n",
|
|
93
|
+
"semantic_elements = (\n",
|
|
94
|
+
" list(model.elements(syside.Usage, include_subtypes=True))\n",
|
|
95
|
+
" + list(model.elements(syside.Definition, include_subtypes=True))\n",
|
|
96
|
+
")\n",
|
|
97
|
+
"\n",
|
|
98
|
+
"def node_name(element):\n",
|
|
99
|
+
" value = element.name or element.declared_name or element.qualified_name\n",
|
|
100
|
+
" return str(value) if value else '<unnamed>'\n",
|
|
101
|
+
"\n",
|
|
102
|
+
"# Prefer named elements with semantic children, then fill with other named elements.\n",
|
|
103
|
+
"ranked = sorted(\n",
|
|
104
|
+
" (item for item in semantic_elements if item.name or item.declared_name),\n",
|
|
105
|
+
" key=lambda item: sum(isinstance(child, (syside.Usage, syside.Definition)) for child in item.owned_elements),\n",
|
|
106
|
+
" reverse=True,\n",
|
|
107
|
+
")\n",
|
|
108
|
+
"selected = ranked[:60]\n",
|
|
109
|
+
"selected_ids = {id(item) for item in selected}\n",
|
|
110
|
+
"\n",
|
|
111
|
+
"def depth(element):\n",
|
|
112
|
+
" value, current, seen = 0, element.owner, set()\n",
|
|
113
|
+
" while current is not None and id(current) not in seen:\n",
|
|
114
|
+
" seen.add(id(current)); value += 1; current = getattr(current, 'owner', None)\n",
|
|
115
|
+
" return value\n",
|
|
116
|
+
"\n",
|
|
117
|
+
"columns = defaultdict(list)\n",
|
|
118
|
+
"for item in selected:\n",
|
|
119
|
+
" columns[depth(item)].append(item)\n",
|
|
120
|
+
"depths = sorted(columns)\n",
|
|
121
|
+
"positions = {}\n",
|
|
122
|
+
"for column_index, level in enumerate(depths):\n",
|
|
123
|
+
" for row_index, item in enumerate(columns[level]):\n",
|
|
124
|
+
" positions[id(item)] = (30 + column_index * 240, 30 + row_index * 58)\n",
|
|
125
|
+
"\n",
|
|
126
|
+
"width = max(500, 260 * max(1, len(depths)))\n",
|
|
127
|
+
"height = max(240, 70 + 58 * max((len(items) for items in columns.values()), default=1))\n",
|
|
128
|
+
"edges = []\n",
|
|
129
|
+
"nodes = []\n",
|
|
130
|
+
"colors = {'PartUsage':'#dff4ee', 'RequirementUsage':'#e8eefb', 'ActionUsage':'#fff0dc', 'PortUsage':'#efe5fa'}\n",
|
|
131
|
+
"for item in selected:\n",
|
|
132
|
+
" x, y = positions[id(item)]\n",
|
|
133
|
+
" owner = getattr(item, 'owner', None)\n",
|
|
134
|
+
" if owner is not None and id(owner) in selected_ids:\n",
|
|
135
|
+
" ox, oy = positions[id(owner)]\n",
|
|
136
|
+
" edges.append(f'<path d=\"M {ox + 190} {oy + 20} C {ox + 215} {oy + 20}, {x - 25} {y + 20}, {x} {y + 20}\" fill=\"none\" stroke=\"#91a7b3\" stroke-width=\"1.5\"/>')\n",
|
|
137
|
+
" kind = type(item).__name__\n",
|
|
138
|
+
" fill = colors.get(kind, '#f4f6f7')\n",
|
|
139
|
+
" label = escape(node_name(item)[:27])\n",
|
|
140
|
+
" nodes.append(f'<g><rect x=\"{x}\" y=\"{y}\" width=\"190\" height=\"40\" rx=\"7\" fill=\"{fill}\" stroke=\"#547180\"/><text x=\"{x + 9}\" y=\"{y + 17}\" font-size=\"11\" font-weight=\"700\">{label}</text><text x=\"{x + 9}\" y=\"{y + 32}\" font-size=\"9\" fill=\"#587487\">{kind}</text></g>')\n",
|
|
141
|
+
"\n",
|
|
142
|
+
"svg = f'''<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" viewBox=\"0 0 {width} {height}\" style=\"background:#fbfcfc;border:1px solid #d9e3e8;border-radius:10px\">{''.join(edges)}{''.join(nodes)}</svg>'''\n",
|
|
143
|
+
"display(SVG(svg))\n",
|
|
144
|
+
"print(f'Displayed {len(selected)} elements and {len(edges)} ownership edges')"
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
"metadata": {
|
|
149
|
+
"kernelspec": {
|
|
150
|
+
"display_name": "Python 3 (ipykernel)",
|
|
151
|
+
"language": "python",
|
|
152
|
+
"name": "python3"
|
|
153
|
+
},
|
|
154
|
+
"language_info": {
|
|
155
|
+
"codemirror_mode": {
|
|
156
|
+
"name": "ipython",
|
|
157
|
+
"version": 3
|
|
158
|
+
},
|
|
159
|
+
"file_extension": ".py",
|
|
160
|
+
"mimetype": "text/x-python",
|
|
161
|
+
"name": "python",
|
|
162
|
+
"nbconvert_exporter": "python",
|
|
163
|
+
"pygments_lexer": "ipython3",
|
|
164
|
+
"version": "3.12.13"
|
|
165
|
+
},
|
|
166
|
+
"memo": {
|
|
167
|
+
"description": "Draw an SVG network of model elements and their ownership relationships.",
|
|
168
|
+
"starter": true
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"nbformat": 4,
|
|
172
|
+
"nbformat_minor": 5
|
|
173
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "memo-1",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Model inventory table\n",
|
|
9
|
+
"\n",
|
|
10
|
+
"Filter a model-independent element table and export the current result to CSV.\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:35:06.617815Z",
|
|
22
|
+
"iopub.status.busy": "2026-07-29T22:35:06.617748Z",
|
|
23
|
+
"iopub.status.idle": "2026-07-29T22:35:06.932238Z",
|
|
24
|
+
"shell.execute_reply": "2026-07-29T22:35:06.931715Z"
|
|
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:35:06.933891Z",
|
|
63
|
+
"iopub.status.busy": "2026-07-29T22:35:06.933794Z",
|
|
64
|
+
"iopub.status.idle": "2026-07-29T22:35:06.948150Z",
|
|
65
|
+
"shell.execute_reply": "2026-07-29T22:35:06.947725Z"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"outputs": [
|
|
69
|
+
{
|
|
70
|
+
"data": {
|
|
71
|
+
"text/html": [
|
|
72
|
+
"<p><strong>6,676</strong> matching elements; showing 250.</p>\n",
|
|
73
|
+
"<div style=\"max-height:620px;overflow:auto\"><table style=\"font-size:12px\"><thead style=\"position:sticky;top:0;background:white\"><tr><th>Kind</th><th>Name</th><th>Qualified name</th><th>Owner</th></tr></thead><tbody><tr><td>ActionDefinition</td><td>AcquireSensorData</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::AcquireSensorData</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionDefinition</td><td>ActuatePumpMotor</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::ActuatePumpMotor</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionDefinition</td><td>ComputeFlowCommand</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::ComputeFlowCommand</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionDefinition</td><td>EnforceDoseLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::EnforceDoseLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionDefinition</td><td>EvaluateAlarmConditions</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::EvaluateAlarmConditions</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionDefinition</td><td>LogTherapyEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::LogTherapyEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionUsage</td><td>infusionDeliveryFlow</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>ActionUsage</td><td>acquireSensors</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::acquireSensors</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>actuateMotor</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::actuateMotor</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>computeFlow</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::computeFlow</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>enforceLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::enforceLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>evaluateAlarms</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::evaluateAlarms</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>logEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow::logEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions::infusionDeliveryFlow</td></tr><tr><td>ActionUsage</td><td>oaCompleteNominalTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaCompleteNominalTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>deliverWithinLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaCompleteNominalTherapy::deliverWithinLimits</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaCompleteNominalTherapy</td></tr><tr><td>ActionUsage</td><td>recordTherapyEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaCompleteNominalTherapy::recordTherapyEvent</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaCompleteNominalTherapy</td></tr><tr><td>ActionUsage</td><td>oaLoadReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaLoadReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaMaintain</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaMaintain</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaPrescribe</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaPrescribe</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaProgram</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaProgram</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaRecoverAfterPowerLoss</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>confirmRestart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss::confirmRestart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss</td></tr><tr><td>ActionUsage</td><td>restorePrescription</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss::restorePrescription</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss</td></tr><tr><td>ActionUsage</td><td>switchToBattery</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss::switchToBattery</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRecoverAfterPowerLoss</td></tr><tr><td>ActionUsage</td><td>oaRejectBolusDuringLockout</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRejectBolusDuringLockout</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>checkLockout</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRejectBolusDuringLockout::checkLockout</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRejectBolusDuringLockout</td></tr><tr><td>ActionUsage</td><td>rejectAndLog</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRejectBolusDuringLockout::rejectAndLog</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRejectBolusDuringLockout</td></tr><tr><td>ActionUsage</td><td>oaReplaceEmptyReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>replaceReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir::replaceReservoir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir</td></tr><tr><td>ActionUsage</td><td>resumeTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir::resumeTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir</td></tr><tr><td>ActionUsage</td><td>stopAndAnnunciate</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir::stopAndAnnunciate</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReplaceEmptyReservoir</td></tr><tr><td>ActionUsage</td><td>oaRequestBolus</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRequestBolus</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaRespondAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaRespondToAirInLine</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>annunciateAir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine::annunciateAir</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine</td></tr><tr><td>ActionUsage</td><td>reprimeAndRestart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine::reprimeAndRestart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine</td></tr><tr><td>ActionUsage</td><td>stopOrKvo</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine::stopOrKvo</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToAirInLine</td></tr><tr><td>ActionUsage</td><td>oaRespondToOcclusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>annunciateOcclusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion::annunciateOcclusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion</td></tr><tr><td>ActionUsage</td><td>pauseInfusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion::pauseInfusion</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion</td></tr><tr><td>ActionUsage</td><td>resolveAndResume</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion::resolveAndResume</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaRespondToOcclusion</td></tr><tr><td>ActionUsage</td><td>oaReviewLog</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaReviewLog</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>oaStartTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::oaStartTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wfManageActiveTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wfManageActiveTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wfPrepareAndStartTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wfPrepareAndStartTherapy</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wfRespondToTherapyAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wfRespondToTherapyAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wsProgram</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wsProgram</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wsRequestBolus</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wsRequestBolus</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wsRespondAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wsRespondAlarm</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>ActionUsage</td><td>wsStart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational::wsStart</td><td>memo_examples_gpca_pump_model_catalog_gpca_operational</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AllocationUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_behavior_actions</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmAirSensorSilent</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmOcclusionDrift</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmStuckBolusButton</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmBatteryEarlyDepletion</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feAirDelivered</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::feTherapyInterrupted</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcMotorDriverFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcTransducerAging</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fcPendantAbuse</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmFlowCrossCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmFlowCrossCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmFlowCrossCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmFlowCrossCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmFlowCrossCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmPostSensorCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmPostSensorCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmPostSensorCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmPostSensorCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmPostSensorCheck</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmStuckInputMonitor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmStuckInputMonitor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmStuckInputMonitor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmStuckInputMonitor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::dmStuckInputMonitor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fmeaActionAirSensor</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftaOverdose</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteOverdoseTop</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteOverdoseTop</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteOverdoseTop</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteOverdoseTop</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteMotorRunaway</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteCrossCheckFails</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteLockoutFault</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::fteStuckButtonUndetected</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgOverdoseOr</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgOverdoseOr</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgOverdoseOr</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgMotorAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgMotorAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgMotorAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgBolusAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgBolusAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::ftgBolusAnd</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsMotorPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsMotorPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsMotorPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsMotorPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsMotorPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsBolusPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsBolusPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsBolusPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsBolusPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_analysis::mcsBolusPath</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcTherapyControl</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcTherapyControl</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcTherapyControl</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcTherapyControl</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcTherapyControl</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcSafetyMonitoring</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcSafetyMonitoring</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcSafetyMonitoring</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcSafetyMonitoring</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcSafetyMonitoring</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcOperatorInterface</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcOperatorInterface</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcOperatorInterface</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcOperatorInterface</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcOperatorInterface</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcDrugDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcDrugDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcDrugDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcDrugDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcDrugDelivery</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcPowerSubsystem</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcPowerSubsystem</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcPowerSubsystem</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcPowerSubsystem</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::lcPowerSubsystem</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::gpcaDeviceSensors</td></tr><tr><td>AttributeUsage</td><td></td><td></td><td>memo_examples_gpca_pump_model_catalog_gpca_architecture::gpcaDeviceSensors</td></tr></tbody></table></div>"
|
|
74
|
+
],
|
|
75
|
+
"text/plain": [
|
|
76
|
+
"<IPython.core.display.HTML object>"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"metadata": {},
|
|
80
|
+
"output_type": "display_data"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"source": [
|
|
84
|
+
"from html import escape\n",
|
|
85
|
+
"from IPython.display import HTML, display\n",
|
|
86
|
+
"\n",
|
|
87
|
+
"KIND_FILTER = '' # Example: 'PartUsage' or 'Requirement'\n",
|
|
88
|
+
"NAME_FILTER = '' # Case-insensitive name fragment\n",
|
|
89
|
+
"ROW_LIMIT = 250\n",
|
|
90
|
+
"\n",
|
|
91
|
+
"semantic_elements = (\n",
|
|
92
|
+
" list(model.elements(syside.Usage, include_subtypes=True))\n",
|
|
93
|
+
" + list(model.elements(syside.Definition, include_subtypes=True))\n",
|
|
94
|
+
")\n",
|
|
95
|
+
"\n",
|
|
96
|
+
"def text(value):\n",
|
|
97
|
+
" return str(value) if value else ''\n",
|
|
98
|
+
"\n",
|
|
99
|
+
"records = []\n",
|
|
100
|
+
"for item in semantic_elements:\n",
|
|
101
|
+
" kind = type(item).__name__\n",
|
|
102
|
+
" name = text(item.name or item.declared_name)\n",
|
|
103
|
+
" qualified_name = text(item.qualified_name)\n",
|
|
104
|
+
" owner = getattr(item, 'owner', None)\n",
|
|
105
|
+
" owner_name = text(getattr(owner, 'qualified_name', None) or getattr(owner, 'name', None))\n",
|
|
106
|
+
" if KIND_FILTER and KIND_FILTER.casefold() not in kind.casefold():\n",
|
|
107
|
+
" continue\n",
|
|
108
|
+
" if NAME_FILTER and NAME_FILTER.casefold() not in (name + ' ' + qualified_name).casefold():\n",
|
|
109
|
+
" continue\n",
|
|
110
|
+
" records.append({'kind': kind, 'name': name, 'qualified_name': qualified_name, 'owner': owner_name})\n",
|
|
111
|
+
"\n",
|
|
112
|
+
"records.sort(key=lambda row: (row['kind'], row['qualified_name'], row['name']))\n",
|
|
113
|
+
"visible = records[:ROW_LIMIT]\n",
|
|
114
|
+
"rows = ''.join(\n",
|
|
115
|
+
" '<tr>' + ''.join(f'<td>{escape(row[key])}</td>' for key in ('kind', 'name', 'qualified_name', 'owner')) + '</tr>'\n",
|
|
116
|
+
" for row in visible\n",
|
|
117
|
+
")\n",
|
|
118
|
+
"display(HTML(f'''<p><strong>{len(records):,}</strong> matching elements; showing {len(visible):,}.</p>\n",
|
|
119
|
+
"<div style=\"max-height:620px;overflow:auto\"><table style=\"font-size:12px\"><thead style=\"position:sticky;top:0;background:white\"><tr><th>Kind</th><th>Name</th><th>Qualified name</th><th>Owner</th></tr></thead><tbody>{rows}</tbody></table></div>'''))"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"cell_type": "code",
|
|
124
|
+
"execution_count": 3,
|
|
125
|
+
"id": "memo-4",
|
|
126
|
+
"metadata": {
|
|
127
|
+
"execution": {
|
|
128
|
+
"iopub.execute_input": "2026-07-29T22:35:06.949118Z",
|
|
129
|
+
"iopub.status.busy": "2026-07-29T22:35:06.949060Z",
|
|
130
|
+
"iopub.status.idle": "2026-07-29T22:35:06.961470Z",
|
|
131
|
+
"shell.execute_reply": "2026-07-29T22:35:06.961042Z"
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"outputs": [
|
|
135
|
+
{
|
|
136
|
+
"name": "stdout",
|
|
137
|
+
"output_type": "stream",
|
|
138
|
+
"text": [
|
|
139
|
+
"Exported 6,676 rows to /Users/poojakashyap/sandbox/memo-meta/memo/examples/gpca-pump/analysis/Samples/model-inventory.csv\n"
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"source": [
|
|
144
|
+
"import csv\n",
|
|
145
|
+
"\n",
|
|
146
|
+
"OUTPUT = Path('model-inventory.csv')\n",
|
|
147
|
+
"with OUTPUT.open('w', newline='', encoding='utf-8') as stream:\n",
|
|
148
|
+
" writer = csv.DictWriter(stream, fieldnames=['kind', 'name', 'qualified_name', 'owner'])\n",
|
|
149
|
+
" writer.writeheader()\n",
|
|
150
|
+
" writer.writerows(records)\n",
|
|
151
|
+
"print(f'Exported {len(records):,} rows to {OUTPUT.resolve()}')"
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
],
|
|
155
|
+
"metadata": {
|
|
156
|
+
"kernelspec": {
|
|
157
|
+
"display_name": "Python 3 (ipykernel)",
|
|
158
|
+
"language": "python",
|
|
159
|
+
"name": "python3"
|
|
160
|
+
},
|
|
161
|
+
"language_info": {
|
|
162
|
+
"codemirror_mode": {
|
|
163
|
+
"name": "ipython",
|
|
164
|
+
"version": 3
|
|
165
|
+
},
|
|
166
|
+
"file_extension": ".py",
|
|
167
|
+
"mimetype": "text/x-python",
|
|
168
|
+
"name": "python",
|
|
169
|
+
"nbconvert_exporter": "python",
|
|
170
|
+
"pygments_lexer": "ipython3",
|
|
171
|
+
"version": "3.12.13"
|
|
172
|
+
},
|
|
173
|
+
"memo": {
|
|
174
|
+
"description": "Filter a model-independent element table and export the current result to CSV.",
|
|
175
|
+
"starter": true
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"nbformat": 4,
|
|
179
|
+
"nbformat_minor": 5
|
|
180
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# MEMO analysis samples
|
|
2
|
+
|
|
3
|
+
These notebooks are created by `memo init` and are designed to work with any
|
|
4
|
+
MEMO textual SysML v2 project. They locate the nearest `model/` or `src/`
|
|
5
|
+
directory automatically and query it through the typed Syside API.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
Use Python 3.12 or newer with JupyterLab and Syside installed and licensed:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
python -m venv analysis/.venv
|
|
13
|
+
source analysis/.venv/bin/activate
|
|
14
|
+
python -m pip install jupyterlab syside
|
|
15
|
+
cd analysis
|
|
16
|
+
jupyter lab --port 8888
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Configure the Syside license using its supported keyring or environment setup.
|
|
20
|
+
MEMO Architect's **Analysis → Jupyter Notebooks** menu opens the local server at
|
|
21
|
+
`http://127.0.0.1:8888`.
|
|
22
|
+
|
|
23
|
+
## Included notebooks
|
|
24
|
+
|
|
25
|
+
| Notebook | Purpose |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `01-model-overview.ipynb` | Model size, semantic composition, and diagnostic summary. |
|
|
28
|
+
| `02-architecture-hotspots.ipynb` | Busy containers, deep ownership paths, and dominant types. |
|
|
29
|
+
| `03-model-quality.ipynb` | Diagnostics, unnamed elements, repeated names, and empty definitions. |
|
|
30
|
+
| `04-change-impact-explorer.ipynb` | Search an element and inspect its structural neighborhood. |
|
|
31
|
+
| `05-model-charts.ipynb` | Bar and donut charts rendered without extra plotting packages. |
|
|
32
|
+
| `06-ownership-graph.ipynb` | SVG network graph of model ownership relationships. |
|
|
33
|
+
| `07-model-inventory-table.ipynb` | Filterable inventory parameters, HTML table, and CSV export. |
|
|
34
|
+
|
|
35
|
+
The notebooks use `syside.try_load_model()`, so partial analysis remains
|
|
36
|
+
available while the project contains parser or semantic diagnostics. Review the
|
|
37
|
+
reported diagnostics before treating analysis results as release evidence.
|
|
@@ -44,6 +44,17 @@ package memo_examples_gpca_pump_model_catalog_gpca_architecture {
|
|
|
44
44
|
attribute :>> safetyPartition = "supporting partition";
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
// ── Device (UMN AADL architectural model) ───────────────────
|
|
48
|
+
// The AADL top-level `GPCA_Device` system. GPCA_Device.Impl declares only
|
|
49
|
+
// GPCA_HW_Sensors, GPCA_SW, and GPCA_HW_Actuators as subcomponents.
|
|
50
|
+
part gpcaDevice : PhysicalAssembly {
|
|
51
|
+
attribute :>> id = "HW-000";
|
|
52
|
+
attribute :>> name = "GPCA_Device";
|
|
53
|
+
attribute :>> responsibility = "AADL device boundary containing the sensor wrapper, GPCA software, and actuator wrapper.";
|
|
54
|
+
attribute :>> safetyRole = "device boundary carrying the intended use and the risk-control architecture";
|
|
55
|
+
attribute :>> partNumber = "GPCA-DEV-001";
|
|
56
|
+
}
|
|
57
|
+
|
|
47
58
|
// ── Hardware: aggregates (UMN AADL architectural model) ─────
|
|
48
59
|
part gpcaDeviceSensors : HardwareAssembly {
|
|
49
60
|
attribute :>> id = "HW-001";
|
|
@@ -250,17 +261,16 @@ package memo_examples_gpca_pump_model_catalog_gpca_architecture {
|
|
|
250
261
|
}
|
|
251
262
|
|
|
252
263
|
// ── Structural composition ──────────────────────────────────
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
connection : Composes connect parent ::>
|
|
256
|
-
connection : Composes connect parent ::>
|
|
257
|
-
connection : Composes connect parent ::>
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
connection : Composes connect parent ::> gpcaActuators to child ::> operatorDisplay;
|
|
264
|
+
// Device level (GPCA_Device.aadl): the assemblies and the software system
|
|
265
|
+
// the device is built from.
|
|
266
|
+
connection : Composes connect parent ::> gpcaDevice to child ::> gpcaDeviceSensors;
|
|
267
|
+
connection : Composes connect parent ::> gpcaDevice to child ::> gpcaActuators;
|
|
268
|
+
connection : Composes connect parent ::> gpcaDevice to child ::> gpcaSoftware;
|
|
269
|
+
|
|
270
|
+
// The physical parts below are MEMO design extensions derived from system
|
|
271
|
+
// requirements and hazard analysis, not subcomponents in the published
|
|
272
|
+
// AADL packages. They intentionally remain outside this AADL composition
|
|
273
|
+
// until a project authority defines their interfaces and ownership.
|
|
264
274
|
connection : Composes connect parent ::> gpcaSoftware to child ::> tlm;
|
|
265
275
|
connection : Composes connect parent ::> gpcaSoftware to child ::> config;
|
|
266
276
|
connection : Composes connect parent ::> gpcaSoftware to child ::> alarm;
|