The illustrative example of Dimensional Analysis for Software Architecture (DASA), worked end to end on a hospital Picture Archiving and Communication System (PACS): a service-oriented medical image archive whose archival, retrieval, and metadata services scale independently to absorb burst clinical traffic. Two design iterations model the archive first as a single M/M/c/K queue and then as a seven-node Jackson open queueing network, re-express both in a custom dimensional basis of Time, Structure, and Data, and read the resulting design trade-offs off a Yoly Chart. This repository is a reproducible deliverable, not a library: it produces the figures and coefficient datasets that ground the example, consuming the PyDASA library.
The docs/ folder holds the example in three parts, read in order:
- docs/case-study.md - what the example is: the archive, its workload and modality payload profile, the dimensional framework, the single-node archival service of iteration 1, and the seven-node broker-mediated read/write network of iteration 2 with its routing matrix, five workload scenarios, and per-node parameters.
- docs/procedure.md - how it runs: the DASA method, its four-stage cycle and seven steps, the Component-Connector Matrix and Enhanced Quality Scenario artefacts, and the idea behind each of the two notebooks.
- docs/report.md - what it shows: the DASA modelling derivation (relevance list, dimensional matrix, Pi-groups, the four coefficients, the viable region), then the results at component, functionality, and architectural level, the design consequences, and the threats to validity.
The archive is modelled dimensionally and evaluated against five design goals. The Pi-theorem reduces ten relevant variables over three fundamental dimensions to seven dimensionless groups, from which four operational coefficients are derived:
| Coefficient | Definition | Reads |
|---|---|---|
| Occupancy |
queue fullness | |
| Stall |
delay-throughput coupling | |
| Effective Yield |
error-aware resource effectiveness | |
| Memory Use |
buffer saturation |
PACS uses the delivered throughput convention
| Design goal | Predicate | Outcome |
|---|---|---|
| Latency |
|
met, approximately 1 ms to 2 ms per node |
| Throughput |
|
approached; error compounding costs approximately 1 % |
| Utilisation | met at every node | |
| Memory | met at every node | |
| Shared database |
|
met without saturation |
The DB node is the shared bottleneck under every workload mix, and the write path is
the binding design case despite carrying the smaller share of traffic.
| Notebook | Model | What it does |
|---|---|---|
| PACS-Ex-Iter1.ipynb | single M/M/c/K node | establishes the Time / Structure / Data basis, derives the four coefficients, sweeps 27 configurations, plots the first Yoly Chart |
| PACS-Ex-Iter2.ipynb | 7-node Jackson network | scales the same coefficients to IB, IW, IR, DB, WN, RN, OB over 216 configurations in each of 5 routing scenarios, and aggregates to end-to-end paths |
Requires Python 3.12+.
python -m venv venv
source venv/Scripts/activate # Git Bash on Windows; use venv/bin/activate on Linux/macOS
# 1. Install PyDASA (not on public PyPI) from source:
pip install "git+https://github.com/DASA-Design/PyDASA.git@v0.7.1"
# 2. Install the rest:
pip install -r requirements.txtIf the PyDASA tag or location differs, adjust the first command; the pin in
requirements.txt (pydasa==0.7.1) documents the expected version.
Both notebooks run top to bottom with no arguments. Executing them regenerates every
figure under img/:
jupyter nbconvert --to notebook --execute --inplace PACS-Ex-Iter1.ipynb
jupyter nbconvert --to notebook --execute --inplace PACS-Ex-Iter2.ipynbThe notebooks are shipped with their outputs, so they read self-contained on GitHub without being run.
├── PACS-Ex-Iter1.ipynb # iteration 1: single M/M/c/K archival service
├── PACS-Ex-Iter2.ipynb # iteration 2: 7-node Jackson network
├── src/
│ ├── analytic/ # M/M/c/K queues, Jackson solver, PACS network simulation
│ ├── view/ # Yoly Chart plotters + shared figure primitives
│ └── utils/ # shared numerical helpers
├── data/config/ # single source of truth for the parameters of both iterations
├── img/
│ ├── iter1/ # iteration 1 figures (PNG + SVG)
│ └── iter2/ # iteration 2 figures (PNG + SVG)
├── docs/ # case study, procedure, report + architecture diagrams
└── tests/ # pytest, mirrors src/
data/config/ is the single source of truth. Both configs use the PyDASA Variable-dict
schema keyed by LaTeX symbol, carrying each variable's dimension, units, setpoint, and
sweep grid. PACS-vars-iter2.json additionally holds the seven artifact blocks and the
five per-scenario routing matrices. The notebooks read these and write their figures to
img/; every figure is emitted as both PNG and SVG.
pytest tests/ -qGPL-3.0. See LICENSE.