Examples › robotparts › Model lineage
Model lineage
The GIM4305-10 actuator model ladder, M0 to M5, as a tree of life: x is the rung, each model hangs off the model it adds physics to, the c1 soft-friction twin splices in M2's soft friction, the four models with bench runs stay alive and the five with none fold into "+N". Labels instead of pictures: the same lineage view as the brand case, over another kind of data.
The .base file and its data
Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.
# The GIM4305-10 actuator model ladder (M0 -> M5) as a lineage: x is the rung, each model hangs off the one it adds
# physics to, labels instead of pictures. The same view as the brand case's, over other data: the view is generic.
# Check it: node bin/data-ui.mjs check <this file> --data ladder.json
data: ladder.json
facets:
- family
- status
views:
- type: lineage
name: Ladder
order: [variant, family, backend, about, runs, q_rms_median, parents_why]
lineage:
parents: parents
x: rung
xLabel: rung_name
label: variant
focus: m4-ripple-c1
kept: { status: [measured] }
extinct: collapse
- type: lineage
name: Ladder, radial
order: [variant, family, backend, about, runs, q_rms_median, parents_why]
lineage:
parents: parents
x: rung
xLabel: rung_name
label: variant
focus: m4-ripple-c1-soft
kept: { status: [measured] }
extinct: show
layout: radial
- type: table
name: Table
order: [variant, rung_name, family, status, runs, q_rms_median, parents, parents_why]
// ladder.json: 11 rows, 6 KB; the first 3
{
"id": "model-lineage",
"title": "GIM4305-10 actuator model ladder",
"titleProperty": "variant",
"source": "models-benches/models.json (robotparts lane/datasheet @ ec9a13c); parents from robotparts lane/datasheet docs/proposals/models-2026-10-25.md",
"properties": {
"variant": {
"type": "text",
"width": 240
},
"rung": {
"type": "number",
"width": 60,
"note": "how much physics the model captures (M0-M5)"
},
"rung_name": {
"type": "text",
"width": 60
},
"family": {
"type": "text",
"width": 230
},
"backend": {
"type": "text",
"width": 250
},
"about": {
"type": "text",
"width": 260
},
"runs": {
"type": "number",
"width": 60
},
"q_rms_median": {
"type": "number",
"unitText": "mrad",
"decimals": 2,
"width": 110,
"better": "lower"
},
"status": {
"type": "text",
"width": 90,
"display": "badge",
"colors": {
"measured": 1,
"no runs": 0
}
},
"parents": {
"type": "list",
"width": 200,
"relation": true,
"note": "the model this one adds physics to; two = a splice"
},
"parents_why": {
"type": "text",
"width": 320,
"note": "the sentence in robotparts lane/datasheet docs/proposals/models-2026-10-25.md that names the parent"
}
},
"rows": [
{
"id": "m0-ideal",
"variant": "M0.ideal",
"rung": 0,
"rung_name": "M0",
"family": "M0 · ideal",
"backend": "MuJoCo native",
"about": "no friction, datasheet inertia",
"runs": 0,
"q_rms_median": {
"value": null,
"why": "no run on the bench yet"
},
"status": "no runs",
"parents": [],
"parents_why": "heads every ladder as the ablation baseline"
},
{
"id": "m1-datasheet",
"variant": "M1.datasheet",
"rung": 1,
"rung_name": "M1",
"family": "M1 · datasheet",
"backend": "MuJoCo native",
"about": "the stated values",
"runs": 0,
"q_rms_median": {
"value": null,
"why": "no run on the bench yet"
},
"status": "no runs",
"parents": [
"m0-ideal"
],
"parents_why": "M1 adds the stated values (Kt, any stated friction and backlash) to M0's gear ratio and inertia"
},
{
"id": "m2-coulomb-viscous",
"variant": "M2.coulomb_viscous",
"rung": 2,
"rung_name": "M2",
"family": "M2 · fitted constant friction",
"backend": "MuJoCo native, soft friction",
"about": "Coulomb + viscous",
"runs": 19,
"q_rms_median": 2.102,
"status": "measured",
"parents": [
"m1-datasheet"
],
"parents_why": "M2 adds fitted constant friction: Coulomb, viscous"
}
]
}README.md
# Model lineage
The GIM4305-10 actuator model ladder, M0 to M5, as a tree of life: x is the rung, each model hangs off the model it
adds physics to, the c1 soft-friction twin splices in M2's soft friction, the four models with bench runs stay alive
and the five with none fold into "+N". Labels instead of pictures: the same lineage view as the brand case, over
another kind of data.
- **App:** robotparts
- **Replaces:** the ladder drawn in prose in robotparts' models proposal (`docs/proposals/models-2026-10-25.md`, "Rung k
adds a layer of physics") and the rung column of the models-benches pivot.
- **Shows:** `type: lineage` with label nodes (no `image`), `x: rung` with `xLabel`, a splice, `kept: {status:
[measured]}` with `extinct: collapse`, the radial layout, and the peek's `parents_why` saying where each edge comes from.
- **Data:** `ladder.json`, written by `source/make.py` from the models-benches case's runs (robotparts lane/datasheet @
ec9a13c), one row per model variant with its run count and median q RMS. `parents` is authored in `make.py`, each
edge with the sentence of the models proposal that names it; M5.dcmotor's base is never named, so it has none.
The original UI it replaces
the ladder drawn in prose in robotparts' models proposal (docs/proposals/models-2026-10-25.md, "Rung k adds a layer of physics") and the rung column of the models-benches pivot.
What it shows
type: lineage with label nodes (no image), x: rung with xLabel, a splice, kept: {status: [measured]} with extinct: collapse, the radial layout, and the peek's parents_why saying where each edge comes from.
Data
ladder.json, written by source/make.py from the models-benches case's runs (robotparts lane/datasheet @ ec9a13c), one row per model variant with its run count and median q RMS. parents is authored in make.py, each edge with the sentence of the models proposal that names it; M5.dcmotor's base is never named, so it has none.