← Latent physics world modelsDocumentation indexGlossaryCode

stage three (C) — real-environment evaluation by occlusion

150 episodes x 200 steps, seeds 5000..5149, identical starts for every row. Band (0.13, 0.63), paddle width 0.16.

oracle has perfect vision and perfect memory; wait_and_see has perfect vision and NO memory (it tracks the true ball only while ball_visible > 0.5 and STAYs otherwise). Every trained row should be read as a position between those two, and the single most important fact about any row is which side of wait_and_see it falls on: above it is memory, below it is not. Any row whose name contains poshead is a PRIVILEGED CEILING — its dynamics model was trained with a supervised head on the simulator’s true ball position — and is not a world-model result.

The two numbers everything is graded against, measured here on these 150 episodes: oracle 0.99, memoryless (wait-and-see) bound **0.51, stand still 0.38.**

Each controller is driven by the (V, M) it was trained with; the policy reads h, so M is part of the policy:

controller M (dynamics) V (encoder)
ctrl_v31_tau0.5 runs/rnn_v31/rnn.pt runs/vae_v31/vae.pt
ctrl_v31_tau0.5_lastdream runs/rnn_v31/rnn.pt runs/vae_v31/vae.pt
ctrl_v31_z_only_tau1 runs/rnn_v31/rnn.pt runs/vae_v31/vae.pt
ctrl_v31_z_only_tau1_lastdream runs/rnn_v31/rnn.pt runs/vae_v31/vae.pt

The headline: every row against the memoryless bound

wait_and_see = 0.51 is the best a policy with perfect vision and no memory can do in this world. A row above it is using memory; a row below it is not, whatever else it is doing well.

controller interceptions/visit vs the bound above it?
oracle 0.99 [0.98, 1.00] +0.48 yes
ctrl_v31_z_only_tau1_lastdream 0.62 [0.55, 0.70] +0.11 yes
ctrl_v31_tau0.5 0.61 [0.55, 0.68] +0.10 yes
wait_and_see 0.51 [0.44, 0.58] +0.00 no
ctrl_v31_z_only_tau1 0.51 [0.44, 0.57] -0.00 no
ctrl_v31_tau0.5_lastdream 0.43 [0.37, 0.50] -0.08 no
stay 0.38 [0.33, 0.44] -0.13 no
random 0.31 [0.25, 0.37] -0.20 no

The CI is a 4000-sample bootstrap over EPISODES, the unit of independence; “above the bound” is read off the point estimate, so a row whose interval straddles the bound is not a claim.

Interceptions per floor visit, by required move

The required move is the distance between the paddle’s x at the moment the ball became fully hidden on its way down and the ball’s landing x. Flat across the bins = object permanence; collapsing on long = memoryless.

controller overall short medium long
stay 0.38 [0.33, 0.44] 0.99 [0.96, 1.00] 0.13 [0.06, 0.21] 0.00 [0.00, 0.00]
random 0.31 [0.25, 0.37] 0.54 [0.43, 0.65] 0.30 [0.20, 0.42] 0.18 [0.11, 0.26]
oracle 0.99 [0.98, 1.00] 1.00 [1.00, 1.00] 1.00 [1.00, 1.00] 0.97 [0.93, 1.00]
wait_and_see 0.51 [0.44, 0.58] 1.00 [1.00, 1.00] 0.57 [0.47, 0.68] 0.04 [0.00, 0.09]
ctrl_v31_tau0.5 0.61 [0.55, 0.68] 0.91 [0.85, 0.98] 0.50 [0.40, 0.61] 0.37 [0.22, 0.54]
ctrl_v31_tau0.5_lastdream 0.43 [0.37, 0.50] 0.80 [0.70, 0.88] 0.39 [0.28, 0.50] 0.07 [0.02, 0.14]
ctrl_v31_z_only_tau1 0.51 [0.44, 0.57] 0.93 [0.88, 0.98] 0.41 [0.30, 0.52] 0.06 [0.00, 0.13]
ctrl_v31_z_only_tau1_lastdream 0.62 [0.55, 0.70] 0.89 [0.81, 0.96] 0.54 [0.45, 0.65] 0.43 [0.26, 0.63]

The bins are policy-dependent and that is not a bug to hide. The required move is measured from this policy’s own paddle position, so a policy that already tends to stand near the ball generates few long visits and a policy that parks in a corner generates many. The counts are therefore reported per row, and a row with a handful of long visits should be read as noise. The episodes and seeds are identical throughout; only the paddle differs.

controller visits (short / medium / long) mean required move (short / medium / long) visits with no occlusion on the descent
stay 91 / 91 / 82 0.069 / 0.239 / 0.496 2
random 68 / 79 / 114 0.084 / 0.242 / 0.541 2
oracle 72 / 102 / 76 0.075 / 0.234 / 0.486 2
wait_and_see 63 / 112 / 78 0.072 / 0.244 / 0.500 2
ctrl_v31_tau0.5 91 / 101 / 63 0.075 / 0.242 / 0.471 2
ctrl_v31_tau0.5_lastdream 84 / 98 / 70 0.072 / 0.252 / 0.480 2
ctrl_v31_z_only_tau1 88 / 123 / 54 0.066 / 0.243 / 0.471 2
ctrl_v31_z_only_tau1_lastdream 83 / 112 / 69 0.068 / 0.241 / 0.494 2

The reach curve (interceptions per visit at 0.1 resolution)

A required move is covered once the paddle’s centre is within half a paddle-width (0.08) of the landing x, plus whatever the visible frames between the band’s bottom edge and contact height buy. On v3’s geometry that came to ~0.43 and wait_and_see was at the ceiling out to 0.6; v3.1 halves both terms, which is the whole point of the re-design. This table says where wait_and_see actually falls off, and therefore which bins above carry any information about object permanence.

controller <0.1 0.1-0.2 0.2-0.3 0.3-0.4 0.4-0.5 0.5-0.6 >0.6
stay 1.00 0.67 0.02 0.00 0.00 0.00 0.00
random 0.58 0.43 0.25 0.26 0.20 0.04 0.25
oracle 1.00 1.00 1.00 0.97 0.96 1.00 1.00
wait_and_see 1.00 0.96 0.50 0.24 0.00 0.00 0.00
ctrl_v31_tau0.5 0.95 0.71 0.45 0.43 0.21 0.69 0.25
ctrl_v31_tau0.5_lastdream 0.81 0.67 0.40 0.14 0.17 0.00 0.00
ctrl_v31_z_only_tau1 0.96 0.69 0.39 0.21 0.05 0.00 0.00
ctrl_v31_z_only_tau1_lastdream 0.97 0.76 0.43 0.42 0.31 0.47 0.83
controller visits per slice
stay 62 / 58 / 44 / 38 / 28 / 18 / 16
random 38 / 58 / 32 / 43 / 30 / 24 / 36
oracle 48 / 64 / 39 / 40 / 26 / 22 / 11
wait_and_see 48 / 46 / 58 / 37 / 36 / 11 / 17
ctrl_v31_tau0.5 64 / 58 / 49 / 35 / 29 / 16 / 4
ctrl_v31_tau0.5_lastdream 58 / 48 / 50 / 43 / 29 / 12 / 12
ctrl_v31_z_only_tau1 67 / 51 / 72 / 34 / 21 / 19 / 1
ctrl_v31_z_only_tau1_lastdream 58 / 55 / 61 / 33 / 26 / 19 / 12

Paddle motion during occlusion

Over the descending hidden runs: the fraction of hidden frames whose ACTION moved the paddle toward the eventual landing x (chance 1/3 — three actions, STAY counts as not-toward), and the displacement the paddle actually achieved toward the landing point while blind, as a fraction of the required move.

oracle is not the ceiling for these two columns and should not be read as one: it chases the ball’s CURRENT x rather than its landing x, and it is usually already inside its dead zone when the ball vanishes, so it STAYs. The references that mean something here are chance (1/3) and wait_and_see (0.000 by construction).

controller hidden runs mean hidden frames mean required move moved on (frac. of hidden frames) toward / all hidden frames (chance 1/3) toward / moving frames (chance 1/2) displacement fraction
stay 264 21.8 0.260 0.000 0.000 [0.000, 0.000] – [–, –] 0.000 [0.000, 0.000]
random 261 21.7 0.331 0.671 0.278 [0.234, 0.322] 0.414 [0.355, 0.476] 0.202 [0.125, 0.284]
oracle 250 22.3 0.265 0.509 0.456 [0.434, 0.480] 0.897 [0.868, 0.926] 0.793 [0.747, 0.843]
wait_and_see 253 21.9 0.280 0.000 0.000 [0.000, 0.000] – [–, –] 0.000 [0.000, 0.000]
ctrl_v31_tau0.5 255 21.6 0.239 0.113 0.075 [0.061, 0.091] 0.663 [0.591, 0.734] 0.074 [0.040, 0.110]
ctrl_v31_tau0.5_lastdream 252 22.2 0.256 0.508 0.249 [0.240, 0.259] 0.490 [0.472, 0.509] -0.019 [-0.053, 0.017]
ctrl_v31_z_only_tau1 265 22.0 0.231 0.091 0.046 [0.027, 0.068] 0.513 [0.438, 0.579] 0.018 [0.005, 0.033]
ctrl_v31_z_only_tau1_lastdream 264 21.7 0.253 0.372 0.177 [0.141, 0.213] 0.475 [0.430, 0.511] 0.022 [0.008, 0.037]

Overall

controller interceptions/visit interceptions/ep floor visits/ep gap at floor approach sign agreement left/stay/right
stay 0.38 [0.33, 0.44] 0.68 1.77 0.261 0.00/1.00/0.00
random 0.31 [0.25, 0.37] 0.55 1.75 0.327 0.337 0.35/0.32/0.33
oracle 0.99 [0.98, 1.00] 1.67 1.68 0.039 1.000 0.26/0.48/0.26
wait_and_see 0.51 [0.44, 0.58] 0.87 1.70 0.222 1.000 0.11/0.77/0.12
ctrl_v31_tau0.5 0.61 [0.55, 0.68] 1.05 1.71 0.174 0.516 0.23/0.55/0.23
ctrl_v31_tau0.5_lastdream 0.43 [0.37, 0.50] 0.73 1.69 0.260 0.547 0.31/0.41/0.28
ctrl_v31_z_only_tau1 0.51 [0.44, 0.57] 0.90 1.78 0.209 0.597 0.11/0.81/0.08
ctrl_v31_z_only_tau1_lastdream 0.62 [0.55, 0.70] 1.11 1.77 0.173 0.621 0.23/0.56/0.21

VAE reconstruction on each band

The frozen encoder+decoder on frames from datasets collected at each band height, so an other-band drop can be attributed to V or to C.

dataset band recon MSE mean hidden run (frames)
data/v31/val [0.13, 0.63] 0.00006 24.6

Dream-vs-real transfer

Pearson r between the smoothed best-of-generation dream fitness and the periodic real interception count, per training run (dream_vs_real_all.png, and dream_vs_real.png in each run directory).

run r (smoothed) r (raw) best real int./ep final dream fitness dream env steps real env steps wall clock (s)
ctrl_v31_tau0.5 -0.47 -0.41 1.29 152.6 15,360,000 196,800 727
ctrl_v31_z_only_tau1 0.35 0.31 0.96 136.2 15,360,000 196,800 708