Skip to content

material: torch twin of the bicycle material rollout; parity with libcvc; trainer on the bicycle - #118

Merged
transfix merged 1 commit into
mainfrom
feat/material-bike-twin
Oct 17, 2026
Merged

transfix merged 1 commit into
mainfrom
feat/material-bike-twin

Conversation

@transfix

Copy link
Copy Markdown
Contributor

The Python side of libcvc P8b (transfix/libcvc#642): training the material model (CoefEnergyNetMaterial) through the deployed kinematic bicycle instead of the point-mass surrogate.

What

  • grl_snam/material_bike.py: integrate_bicycle_material in torch, with the material surrogate's force law driven through drive.cpp's controller:

    • pure pursuit plus the (F_rep + F_mat) steering bias;
    • the corner, stop, creep and reverse governors;
    • d_cap and the kinematic update.

    Every branch is a torch.where, so autograd follows the branch each step took, as libcvc's hand-written adjoint does. Guarded sqrt/norms keep an unselected zero from producing NaN gradients.

  • nav_native: integrate_bicycle_material / integrate_bicycle_material_vjp over the new pycvc entry points, behind HAS_BICYCLE_MATERIAL_ROLLOUT.

  • MaterialTrainer(bicycle=BicycleParams(...)): takes the loss through the bicycle, behind HAS_MATERIAL_TRAINER_BICYCLE; .integrator reports which rollout is in use. The module still imports without torch.

Tests

  • tests/test_material_bike_parity.py:
    • forward parity (rtol 1e-4) and gradient parity (torch autograd vs the C++ adjoint, rtol 1e-3) on two batches;
    • a pure-torch check that the twin drives to its goal within its speed limit.
  • tests/test_material_train_native.py: the trainer descends on the bicycle, and a zero wheelbase is refused.

Measured locally against a pycvc built from transfix/libcvc#642: forward within 5e-7 relative and gradient within 3e-6. Two independent derivations (hand-written reverse mode and autograd) agree to float precision. The GRL-SNAM material suites pass (42 passed; the 4 skips are a missing CUDA device and the pure-mode tests).

The native tests skip in CI until a pycvc with the bindings is installed; the pure-torch test runs now.

…cvc; trainer on the bicycle

libcvc P8b moves the material trainer off the point mass: integrate_bicycle_material
keeps the surrogate's force law and drives the deployed kinematic bicycle
(transfix/libcvc#642).
- grl_snam/material_bike.py: integrate_bicycle_material in torch, the same
  controller with every branch a torch.where. Autograd follows the branch
  each step took, as the C++ adjoint does. Guarded sqrt/norm keep an
  unselected zero from producing NaN gradients.
- nav_native: integrate_bicycle_material / _vjp wrappers over the new
  pycvc entry points, gated by HAS_BICYCLE_MATERIAL_ROLLOUT.
- MaterialTrainer(bicycle=BicycleParams(...)) takes the loss through the
  bicycle, gated by HAS_MATERIAL_TRAINER_BICYCLE; .integrator reports which.
  The module still imports without torch.
- tests/test_material_bike_parity.py:
  - forward (rtol 1e-4) and gradient (rtol 1e-3) parity against libcvc;
  - a pure-torch check that the twin drives to its goal.
  Measured against a local libcvc build: forward within 5e-7 relative,
  gradient within 3e-6, so two independent derivations agree.
- tests/test_material_train_native.py: the trainer descends on the bicycle,
  and a zero wheelbase is refused.

The native tests skip until a pycvc with the bindings is installed.
@transfix
transfix merged commit 73e7496 into main Oct 17, 2026
4 of 7 checks passed
@transfix
transfix deleted the feat/material-bike-twin branch October 17, 2026 05:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant