Buckets:
| # Glossary | |
| Every term used in this repo, defined once. Grouped by concept, not alphabetised — terms that are | |
| easy to confuse sit next to each other on purpose. | |
| --- | |
| ## Naming | |
| **ONF** — the Python package name (`src/onf`), expanding to "Oriented Neural Field". Historical. | |
| The current method is not a neural field. Treat `onf` as an opaque package name. | |
| **cleanliness field** — the one component that is still a field: a 136,216-parameter MLP mapping a | |
| joint configuration to a scalar distance-to-manifold. Stored as `onf_head.npz`. | |
| → [technical/02 §2.1](technical/02-retrieval-head.md) | |
| --- | |
| ## The graph | |
| **node** — one run of up to `COARSEN = 5` consecutive raw frames from a single demonstration, cut | |
| short at any gripper state change so that every node has exactly one gripper state. `long` suite: | |
| 28,476 nodes over 500 demos. → [technical/01 §1.2](technical/01-data-and-graph.md) | |
| **raw frame** — one timestep of the original LIBERO HDF5 trajectory. `long` suite: ~131,000 raw | |
| frames total, ~4.6 raw frames per node (below `COARSEN` because gripper flips force early cuts). | |
| **strand** (`owner`, `[V] i4`) — which *demonstration* a node came from. 500 strands in `long`. | |
| **lane** (`task_id`, `[V] i2`) — which *task* a node came from. 10 lanes in `long`. Strands nest | |
| inside lanes: 50 strands per lane. | |
| **phase** (`[V] f4`) — position within an episode in **raw-frame** space: `arange(T)/(T−1)` evaluated | |
| at the node's first frame. `0.0` = first frame, `1.0` = last. Comparable across demos of different | |
| lengths. Used for binning, masking and cross-demo comparison. | |
| **t_frac** (`[V] f4`) — position within an episode in **node** space: | |
| `t_idx / (n_nodes_in_demo − 1)`. Fed to the network through `psi(t_frac)`. | |
| > `phase` and `t_frac` are both in [0,1] and both mean "how far along". They are **not** | |
| > interchangeable. They differ because coarsening is not uniform. Using one where the other is meant | |
| > selects the wrong nodes with no error raised. | |
| > → [technical/01 §1.3, "Easy to get wrong"](technical/01-data-and-graph.md) | |
| **phase bin** — one of `NBINS_ALIGN = 20` equal buckets over `phase ∈ [0,1]`. The single bucketing | |
| every phase histogram in the subsystem agrees on (`onf/graph/core/binning.py`). | |
| **phase_conv** — a string stamped into `g_nodes.npz` recording which phase convention produced it | |
| (`"arange(T)/(T-1) full"`). Re-checked on load; a mismatch raises. | |
| **relation** — one of the `R = 12` edge types. The GNN embeds relation *types*, not nodes, so a | |
| relation that happens to be empty in some graph is legal and must still run. | |
| **dilation** — the hop length of a `next`/`prev` relation, in node steps: `DILATIONS = (1,2,4,8,16)`. | |
| Load-bearing: with `next1` only, 3 message-passing layers reach 3 nodes ≈ 15 raw frames, while a | |
| pre-grasp approach spans ~80 raw frames. | |
| **sibling** — kNN edge to a *different demo, same task, same gripper state*. Out-degree | |
| `K_SIBLING = 8`. Relation index 10. | |
| **align** — kNN edge to a *different task, same phase bin, same gripper state*. Out-degree | |
| `K_ALIGN = 4`. Relation index 11. | |
| **stage** (`[V] i2`) — cumulative count of gripper releases along a demo. Diagnostic only. Nothing in | |
| edge construction, training or retrieval reads it, and there is deliberately no `stage` relation. | |
| → [technical/01 §1.5](technical/01-data-and-graph.md) | |
| **log_idf** (`[V] f4`) — an additive prior on the output logit, computed from sibling degree | |
| (GFM-RAG eq. 15–16). Stored in `g_edges.npz`. | |
| **graph_hash** — a hash of the `(g_nodes, g_edges)` pair, stamped into `g_head.npz` and | |
| `g_track.npz`. Node ids are positional and meaningless across builds, so a head loaded against a | |
| foreign graph returns confident, correctly-shaped logits on the wrong strands. The hash check is the | |
| only thing that catches this. → [technical/05](technical/05-artifacts.md) | |
| --- | |
| ## Two heads, similar filenames, different models | |
| | | `g_head.npz` | `onf_head.npz` | | |
| |---|---|---| | |
| | what | the **GNN retrieval head** | the **cleanliness field** | | |
| | input | a window of 8 joint states `[8,7]` | one joint config `[7]` | | |
| | output | a distribution over all 28,476 nodes | one scalar | | |
| | trained by | `onf.graph.train` | `onf.field.train` | | |
| | params | independent of `\|V\|` (inductive) | 136,216 | | |
| | read by | `GraphRetriever`, `GraphTracker` | `ONFField.f_value` → query pooling weights | | |
| These are two different models in two different files. `g_head` scores nodes. `onf_head` scores how | |
| much to trust each frame of the query. | |
| --- | |
| ## Query and retrieval | |
| **query** (`Q`) — a window of `HIST_H = 8` consecutive joint states, plus their finite-differenced | |
| velocities and gripper flags. `HIST_H` equals one policy action chunk. | |
| **cleanliness weight** (`w`, `[8]`) — `sigmoid(−f(q_i))` where `f` is the cleanliness field. | |
| Pooled through `softmax(log w)`, not `w / sum(w)`, so that `w_i == 0` gives a hard zero rather | |
| than `0/0`. | |
| **seed set** — the `SEED_TOPK = 256` nodes given non-zero initial state `h0`. Everything outside the | |
| seed set starts at exactly zero, preserving the NBFNet semantics of "representation of `v` | |
| conditioned on a seeded source set". | |
| **reachability** — whether message passing ever delivered a message to a node from a seeded source. | |
| Tracked explicitly, not inferred from `h == 0` (`layer_norm` can zero a reached node's state). | |
| Unreached nodes get logit `−inf`. | |
| **abstain** — a scalar logit produced by a separate head, compared against | |
| `logits[reached].max()`. Trained on the same comparison performed at deploy time, with the node | |
| term detached so it never drags the ranking logits. | |
| **entry stratum** — the mask applied when `GR_ENTRY_BAND > 0`: `task lane ∩ phase ≤ band (0.05) ∩ | |
| reachable`, with the current demo's own strand excluded (leave-one-demo-out). ~229 of 28,476 nodes | |
| on the `long` graph. | |
| **move cost** — `‖q_node − q_now‖`, passed as the third input to the readout MLP instead of being | |
| applied as a hand-written argmin. The network learns how much to penalise motion, including | |
| accepting a longer move when it is more confident. | |
| --- | |
| ## Training | |
| **pretext task** — given a window ending at raw frame `T`, predict the node at `T + ADVANCE` | |
| (0 raw frames, i.e. the window's own end) on the same demo. Requires traversal, not lookup: the | |
| window is a trajectory, and the transition kernel — not the head — owns how far forward to look. | |
| **TRAVERSAL / ENTRY / ENTRY_STATIC / DRIFT** — the four query classes drawn by `make_queries`. | |
| `ENTRY_STATIC` (share 0.15) produces `repeat(q0, 8)` — velocity identically zero — because that is | |
| the exact input shape a settled arm produces at deploy time and no other class generates it. | |
| `DRIFT` (share 0.15) is the only class with a clean-to-perturbed breakpoint inside the window; every | |
| other class is uniformly clean or uniformly perturbed, so none of them poses the question of which | |
| rows of a history are still trustworthy. | |
| → [technical/02 §2.4](technical/02-retrieval-head.md) | |
| **provenance vs consequence** — `is_clean` records which branch generated a query. | |
| `abstain_is_correct` records whether abstaining is the right behaviour for it. An ENTRY sample with a | |
| tiny perturbation is still on-support, so the loss label uses consequence, not provenance. | |
| **INTER_DEMO_SPACING** — the median leave-one-demo-out nearest-neighbour distance between nodes: | |
| "how far apart independent demos usually sit". Measured, not chosen — ~0.054 rad on the `long` graph. | |
| **LODO** — leave-one-demo-out. Used for the perturbation floor, `INTER_DEMO_SPACING`, and the basin | |
| geometry quantiles. | |
| **hard negative** — a mined distractor, `N_NEG = 16` per query across three buckets: same `t_idx` | |
| different strand; near in `q` but far in `phase` (self-intersection, ~4.1% of frames); and the | |
| query's own nearest neighbour when it is not the answer. | |
| --- | |
| ## Sentinel (t > 0) | |
| **belief** (`b_t`, `[V]`) — a distribution over graph nodes maintained across checks. | |
| `b_t ∝ [(1 − ε)·P·b_{t−1} + ε·L_t] · L_t`. | |
| **check** — one sentinel evaluation, every `SN_CHUNK = 8` env steps (one policy action chunk), over a | |
| window whose rows are `SN_GRAPH_STRIDE = 1` env step apart. A check advances ~1.65 nodes at ~4.85 raw | |
| frames per node. | |
| **transition kernel** (`P`) — `[(1−β)I + β·M_sib] · Σ_a π_a S_a`. Sibling-mix laterally, then push | |
| forward along the advance mixture. Built from `TRACK_KERNEL_RELATIONS = next1..next16 + sibling`; | |
| `align` and all `prev` relations are excluded on purpose. | |
| **advance set** — `TRACK_ADVANCE_SET = (0,1,2,4,6,8,12,16)` raw frames. Mixed over, not | |
| point-estimated, because a check advances a fractional number of nodes and rollouts run slower than | |
| demos. `a = 0` (the stall self-loop) is mandatory. | |
| **leak** (`ε`) — the restart weight. Restarts toward the *current observation* `L_t`, not toward | |
| uniform. A uniform restart puts mass on impossible phases and discards the aliasing suppression the | |
| filter exists to buy. | |
| **basin** — the certified region around a node, fitted per `(task, phase-bin)` from held-out clean | |
| demo replays: radius `r` = p95 and KDE bandwidth `h` = p50 of LODO nearest-neighbour distances. | |
| **r_eff** — `max(r − h, 0)`. The sentinel target is | |
| `q* = q_now + max(0, 1 − r_eff/‖q_b − q_now‖)·(q_b − q_now)`: exactly `q_now` when already inside, | |
| otherwise the point on the segment at distance `r_eff` from the anchor. Undoes drift down to the | |
| boundary and stops. | |
| --- | |
| ## The blend | |
| **tracking chunk** (`a_track`, `[K, 6]`) — the reference segment restated in the policy's own action | |
| units. Row 0 is measured against the LIVE pose (feedback), row `k` against `ee_ref[k-1]` | |
| (feedforward). → [technical/03 §3.2](technical/03-action-chunk-blend.md) | |
| **action scale** — metres per action unit for dims 0:3 and radians per action unit for dims 3:6, | |
| fitted off the demos into `action_scale.json`. Two scalars, not one: they differ by 8.8×. Rotation is | |
| *composed* in the world frame, never subtracted. | |
| **blend** — `a_exec[:, 0:6] = (1−α)·a_policy + α·a_track`, applied once per chunk at the refill line. | |
| Dim 6, the gripper, passes through untouched — the command is binary. | |
| **alpha** (`α`) — the blend weight. Either a fixed scalar (`SN_BLEND_ALPHA`) or, under | |
| `SN_BLEND_LEARNED`, a `[K, 6]` array from `AlphaNet`: one weight per chunk row and per pose block. | |
| **`SN_BLEND_SCALE`** — a multiplier on the learned alpha. The chunk-MSE objective fits the right | |
| per-check *shape* at too confident a *level*, so the head is rescaled onto the average authority a | |
| fixed weight was measured to work at. Derived per head, not swept. | |
| → [technical/03 §3.6](technical/03-action-chunk-blend.md) | |
| **bound** / **`ACTION_LIMIT`** — the row-0 saturation, `bound·tanh(row0/bound)`, at 1.0 action unit. | |
| Row 0 is an unbounded pose error and the simulator clips actions to `[-1, 1]`; this is the deleted | |
| servo's gain limit restated in action space. A constant, not a learned parameter — the one run that | |
| learned it drove it to 24.5. | |
| **corrupted retrieval** — a training row given a deliberately wrong retrieval (`WRONG_TASK`, `OFFSET`, | |
| `WRONG_PHASE`) with the regression target left correct. The only rows on which alpha's gradient can | |
| point down. → [technical/03 §3.7](technical/03-action-chunk-blend.md) | |
| --- | |
| ## Evaluation | |
| **base** — the frozen policy, untouched. The only definition of a mode is `evals/common/modes.sh`; | |
| both benchmark drivers parse that file so the recipes cannot drift apart. The other modes are | |
| `blend` (alpha 0, a plumbing check), a family of fixed-alpha probes (`blend_a05`, `blend_a015`, | |
| `blend_bounded`, `blend_a015_bounded`, …) and the learned-weight arms (`blend_scaled015`, | |
| `blend_full`). `blend_full` is the current recipe. | |
| **suite** — one of `object`, `spatial`, `goal`, `long`. Maps to a LIBERO dataset directory | |
| (`long` → `libero_10`, **not** `libero_long`). | |
| **axis** — one perturbation axis in LIBERO-Plus: `Robot_Initial_States`, `Light_Conditions`, | |
| `Background_Textures`, `Sensor_Noise`, `Language_Instructions`, `Objects_Layout`, | |
| `Camera_Viewpoints`. | |
| **cell** — one (suite × axis × mode × policy) result. | |
| **rung** — one step of the eval ladder in `configs/sr_ladder.yaml`. `R1` is the 24-episode smoke test. | |
| **churn** — the fraction of episodes that flip outcome between two identical runs. GR00T-N1.7 is | |
| flow-matching and unseeded: ~11.2% churn. StableVLA: 0 churn measured over 393 episodes. | |
| **dead artifact** — written to disk but read by nothing: `q_manifold.npz`, `q_manifold_full.npz`. | |
| Verified by grepping `np.load` across `src/`, `tests/`, `scripts/`, `evals/`. | |
| --- | |
| ## Constants quick reference | |
| Full table with CHOSEN / DERIVED provenance: [`technical/06-config-reference.md`](technical/06-config-reference.md). | |
| | constant | value | where | | |
| |---|---|---| | |
| | `COARSEN` | 5 raw frames per node | graph build | | |
| | `DILATIONS` | (1,2,4,8,16) node steps | graph build | | |
| | `K_SIBLING` / `K_ALIGN` | 8 / 4 | graph build | | |
| | `NBINS_ALIGN` | 20 phase bins | everywhere | | |
| | `KERNEL_BW` | 0.15 rad | Gaussian edge-weight default; INIT of the learned seed `sigma` | | |
| | `HIST_H` / `SEG_K` | 8 / 8 | one policy action chunk | | |
| | `SEED_TOPK` | 256 nodes | seeding | | |
| | `LAYERS` | 3, weights shared | GNN | | |
| | `GR_ENTRY_BAND` | 0.05 phase | entry stratum mask | | |
| | `SN_CHUNK` | 8 env steps | sentinel check spacing | | |
| | `SN_GRAPH_STRIDE` | 1 env step | sentinel window row spacing | | |
Xet Storage Details
- Size:
- 13.5 kB
- Xet hash:
- eb8e318ea0d19024437b4b4e1869235c71fe7bc3ae57efcf810952cf81af91d1
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.