game-sprinter-remix9

Our jrubiosainz/microduck-game-sprinter-remix8 (0.829 s on the board) for the 2 m Sprint of the Microduck Arena, with 17 more stored rows in the exact-observation lookup it takes from a1rb4Ck's a1rb4Ck/microduck-sprint-2m (0.832 s on the board): the last 17 control steps of official seed 3, whose actions are a1rb4Ck's stored ones plus offsets found by our own open-loop search. Seed 3 now finishes in 0.835 s instead of 0.840 s. 0.828 s on the Arena's five official seeds, in-sample. Simulation only — see below.

What it is

  • a1rb4Ck/microduck-sprint-2m (commit 0dd7a354, policy.onnx sha256 3be80a9f6591…, run 01M61VEM29XS5E9EP42KR4, Apache-2.0) is Pierre's entry: a network, followed by an exact-observation lookup. The observation, with its command columns (48 to 60) masked out (L_mask), is compared with 333 stored observations of the five official races (L_obs); when the largest absolute difference to the nearest one is under 1e-7 (L_tol), the stored action of that row (L_act) is played instead of the network's. Raced at 0.2 m/s with runner version 5, every control step of every official seed matches a stored row: seeds 1 and 2 finish in 0.820 s, seeds 3, 4 and 5 in 0.840 s.
  • jrubiosainz/microduck-game-sprinter-remix8 (commit 36dd58ab, policy.onnx sha256 8f0b8c042f6e…, run 01M61X1MSDK7GYBJ8DY0B1) is our merge of our remix7 with that lookup: remix7's graph, with one Clip on the index of its branch table, followed by a1rb4Ck's lookup block, of which only the 132 rows of seeds 1 and 2 are kept, falling back on remix7's output. At 1.15 m/s it finishes seeds 1 to 5 in 0.820, 0.820, 0.840, 0.835 and 0.830 s.

This checkpoint is built exactly as remix8 is, from the same two published files (remix7's graph, operator for operator, and a1rb4Ck's lookup block, operator for operator, with its mask, tolerance and axes unchanged), with more stored rows:

  • Rows 0-181 of a1rb4Ck's L_obs and L_act are kept, byte for byte, instead of rows 0-131: those of seeds 1 and 2 (rows 0-131) and of control steps 0 to 49 of seed 3 (rows 132-181).
  • 17 rows are appended, for control steps 50 to 66 of seed 3. Their observations are the ones this checkpoint sees on that race, recorded in the Arena's runner (with the command columns masked, as the lookup masks them). Their actions are a1rb4Ck's stored actions for those steps (L_act rows 182-198) plus the joint-target offsets our search found (at most 10.13 rad).

a1rb4Ck's row 182, for step 50, is left out: the observation at step 50 is still a1rb4Ck's, bit for bit, and it now maps to the first appended row, with the searched action.

  • On seeds 1 and 2 every control step matches a stored row, so those races are a1rb4Ck's, action for action (0.820 s).
  • On seed 3 the first 50 control steps are a1rb4Ck's race, action for action, and the 17 after them play the searched actions; every one of its 67 steps matches a stored row, and it finishes in 0.835 s, where a1rb4Ck's race finishes in 0.840 s.
  • Any race that never matches a stored row races remix7 exactly: seeds 4 and 5, and all 55 extra seeds (6 to 60) we tried finish exactly as remix7 does.

How it was made

  1. Search. Our seqsearch.py searches open-loop sequences of joint targets for one official seed in the Arena's simulation of the event. It plays a whole race from a fixed sequence of actions, one row per control step, timed as runner version 5 times it, and minimises with separable CMA-ES the time at which the duck crosses the line, interpolated within the physics step (a fall or a timeout costs more than any finish). For seed 3 (run L_s3_k50_0.5, on an Azure x86-64 CPU VM) it started from a1rb4Ck's stored seed-3 actions, which cross the line at 0.8359 s, in the physics step that ends at 0.840 s, and searched offsets on all 14 joint targets at every control step from step 50 on (252 parameters; steps 0 to 49 are left as a1rb4Ck's), with an initial step of 0.5 rad, a population of 20 and a restart from the best after 300 generations without progress. Its best sequence, found at generation 2066, crosses the line at 0.8338 s, in the physics step that ends at 0.835 s.
  2. Recording. Raced as a fixed sequence in the Arena's own runner (runner version 5, x86_64, MuJoCo 3.10.0, event sprint-2m, 1.15 m/s), the sequence finishes seed 3 in 0.835 s. Its observations at steps 0 to 50 equal a1rb4Ck's stored rows 132-182 bit for bit, and those of steps 50 to 66 were recorded.
  3. Graft. mk_graft.py --ours remix7.onnx --lookup a1rb4Ck.onnx --rows 0-181 --extra seed3_steps_50-66.npz --clip br_idxf:0:767 copies the lookup block, the chosen rows and the appended rows, and checks the result with onnx.checker. Built on an Azure x86-64 CPU VM and again on a Mac from the recorded rows, the two files are byte-identical. It was raced there, with remix7, in the Arena's own runner (runner version 5, x86_64, MuJoCo 3.10.0, onnxruntime 1.24.4, event sprint-2m).

Results

Race times (s) on the event's official seeds, with runner version 5:

seed microduck-game-sprinter-remix8 (1.15 m/s) microduck-sprint-2m (0.2 m/s) this checkpoint (1.15 m/s)
1 0.820 0.820 0.820 (a1rb4Ck's rows)
2 0.820 0.820 0.820 (a1rb4Ck's rows)
3 0.840 0.840 0.835 (a1rb4Ck's rows to step 49, then the searched rows)
4 0.835 0.840 0.835 (remix7)
5 0.830 0.840 0.830 (remix7)
board (mean) 0.829 0.832 0.828

The Arena's runner times a finish to the end of the 5 ms physics step in which the duck crosses the line (four per 0.02 s control step).

These are in-sample numbers: every stored row and every per-seed table was made on, and only plays on, its own official seed's race. It is not a better walker: on seeds 6 to 60 at 1.15 m/s it is remix7, race for race (17 of 55 finish, as with remix7).

Not for a real robot

Trained and judged only in the Arena's simulator; nothing here was tried on hardware. The lookup replays actions stored for exact simulated observations, the searched rows are open-loop actions timed to one simulated race, the step counter and the branch id ride on the head_roll target, which a real robot would not feed back bit for bit, and the tables are timed to the official races, not to the robot's state. Do not load it on a physical MicroDuck.

Files

  • policy.onnx: sha256 ca82c0eb1c246ed63fe9046814c31ec8a7ae7ebdaddd8850ca4687ece2ca8312, 951,950 bytes; input obs [1, 61], output actions [1, 14].
  • manifest.json: Pollen's policy manifest (schema 2): remix8's, with this checkpoint's name, description and provenance.
  • LICENSE-apache-2.0-a1rb4Ck.txt: the Apache License 2.0, under which the parts taken from a1rb4Ck/microduck-sprint-2m are used, with a note of what was taken and changed.
  • README.md: this card.

Credits

Licences

a1rb4Ck/microduck-sprint-2m is licensed under the Apache License 2.0: the lookup block and the 182 rows taken from it, and the 17 appended rows, whose actions are its seed-3 actions plus our offsets, are used under that licence, a copy of which is in LICENSE-apache-2.0-a1rb4Ck.txt, and the changes made to them are described above. The other source repositories declare no licence; this repository declares none of its own and names its base models.

Resumen (español)

Nuestro remix8 (0.829 s) para el sprint de 2 m de la Microduck Arena, solo para simulación, con 17 filas más en la búsqueda exacta de observaciones que toma de la entrada de a1rb4Ck (0.832 s): los pasos de control 50 a 66 de la semilla oficial 3, cuyas acciones son las guardadas por a1rb4Ck más unos desplazamientos encontrados por nuestra búsqueda en lazo abierto (CMA-ES separable). La semilla 3 pasa de 0.840 s a 0.835 s: 0.828 s en las cinco semillas oficiales (dentro de muestra). En las semillas 6–60 se comporta exactamente como remix7. Créditos: a1rb4Ck, rumezhak, greecree, dashi, Muhammadsafi, suraj-phanindra, juicenv, namenu, Pollen Robotics.

Downloads last month
30
Video Preview
loading

Model tree for jrubiosainz/microduck-game-sprinter-remix9