ADR-096 train integration. Additive — does NOT modify model.rs. The
existing WiFiDensePoseModel forward stays bit-equivalent for back-compat.
New code lives in temporal_aether.rs behind the `aether-sparse-temporal`
feature flag (which itself requires `tch-backend`).
Architecture:
tch::Tensor [T, in_dim] ──── tch nn::Linear (q/k/v projections)
↓
[T, q_heads*head_dim] etc
↓
tch_to_tensor3 (CPU, f32, 1× copy)
↓
ruvllm_sparse_attention::Tensor3
↓
AetherTemporalHead::forward()
↓
Tensor3 [T, q_heads, head_dim]
↓
tensor3_to_tch (1× copy)
↓
tch::Tensor [T, q_heads*head_dim]
↓
tch nn::Linear (output projection)
↓
tch::Tensor [T, in_dim]
Why additive rather than swapping `apply_antenna_attention` /
`apply_spatial_attention` in model.rs: those are over antenna and
spatial axes, not temporal — ADR-096 §8.1 was right that AETHER
doesn't currently HAVE a temporal-axis attention. This commit adds
that path without disturbing the others, so the §5 validation gate
can A/B the two options before flipping the production default.
Scope notes:
- B=1 prefill only this version. Multi-batch lands when §5 turns
green and we need to take perf seriously. The forward expects
`[T, in_dim]` not `[B, T, in_dim]`; documented in the file.
- Streaming step() bridge deferred — KvCache lifecycle ties to
PoseTrack per ADR-096 §8.5, which is signal-side not train-side.
- Two CPU memory copies per call (in + out). For training-rate
forwards (~100/sec at batch 16) this is negligible vs the actual
attention work; for inference-rate streaming it'd be the
bottleneck and a zero-copy path is the natural follow-up.
Build verification:
- Source compiles cleanly with cargo check on the host crate
(`-p wifi-densepose-temporal`, 21/21 tests still passing).
- The train crate's tch-backend build is environmentally blocked
on this Windows machine — torch-sys fails to link against the
system PyTorch 2.11 + MSVC 14.50 toolchain. This predates this
commit and affects all tch-bound code paths in the workspace.
CI runners with working libtorch will verify the new module
builds; the source follows the same nn::Linear / Module patterns
the existing model.rs uses.
Feature gating ensures default builds are byte-equivalent. Off by
default; enable with `--features aether-sparse-temporal`.
Co-Authored-By: claude-flow <ruv@ruv.net>
The Rust port lived two directories deep (rust-port/wifi-densepose-rs/)
without any sibling under rust-port/ that warranted the extra level.
Move the whole workspace up to v2/ to match v1/ (Python) at the same
depth and shorten every cd / build command across the repo.
git mv preserves history for all tracked files. 60 files updated for
path references (CI workflows, ADRs, docs, scripts, READMEs, internal
.claude-flow state). Two manual fixes for relative-cd paths in
CLAUDE.md and ADR-043 that became wrong after the depth change
(cd ../.. → cd ..).
Validated:
- cargo check --workspace --no-default-features → clean (after target/
nuke; the gitignored target/ was carried by the OS rename and had
hard-coded old paths in build scripts)
- cargo test --workspace --no-default-features → 1,539 passed, 0 failed,
8 ignored (same totals as pre-rename)
- ESP32-S3 on COM7 → still streaming live CSI (cb #40300, RSSI -64 dBm)
After-merge follow-up: contributors should `rm -rf v2/target` once and
let cargo regenerate from the new path.