Phase A · neuroscience battery

A5 · Local field potentials

cf. Jonas & Kording 2017

← back to the method catalogue

What it does?

The local field potential is a pooled, low-resolution signal. In neuroscience it is the summed electrical activity of many neurons near an electrode, and its power spectrum, the strength of each oscillation frequency, is studied as a marker of brain state. We build the analogue on the VCS by pooling the activity of a region of memory into one aggregate signal and taking its power spectrum. The idea is that rhythms in this pooled signal reflect the computation. The problem we test is whether those rhythms are real computation or just the machine's clocks showing through. The VCS is driven by a frame clock and a scanline clock, and their fixed rhythms dominate any pooled signal. So much of the spectrum is epiphenomenal: it is the timing of the hardware, not the work the program does. This is a known danger for field potentials in neuroscience too, where a strong oscillation can reflect a global pacemaker rather than local processing. The method is easy to compute and produces impressive-looking spectra, but on a machine whose clocks we know exactly we can show how little of that structure is actually computational.

A5 · Local field potentials result

Left: the frame. Right: this method's per-cell/per-component result against the ground-truth importance, with the RAM cells labelled. A5_global_pool_clock_explained_variance_fraction_epiphenomenal = 0.752 — this example only (pong, state gameplay(seed=0,prefix=90)+256); the audit aggregate is below.

How it's scored

The score is the fraction of the pooled-activity power spectrum that the known clocks explain. We pool a region of memory into one signal, take its power spectrum, and measure how much of that spectrum is accounted for by the frame clock and the scanline clock, whose frequencies we know exactly. Faithfulness is one minus that clock-explained fraction, because the part of the spectrum that is just the hardware's timing is epiphenomenal, not computation. A high clock-explained fraction means the impressive-looking spectrum is mostly the machine's pacemaker, so the method's faithfulness is low. The grading is always against the intervention oracle, which certifies what is truly computational. There is no sprite-position hard-case here; the output is a spectrum, not a coordinate. This method is a calibration baseline: it shows how a standard neuroscience signal can look rich while carrying little of the real computation. The audit box reports the measured faithfulness across the scored games, so the number reflects the whole scored set rather than one game where the clocks happen to dominate more or less.

The score is measured against the §1 intervention oracle — never against another interpretability method. F (faithful) is always vs the oracle; see the execution stack. How each of F / S / M is actually computed for this method (and whether it matches the paper) is in the box just below; the numbers are in the In the audit box under it.

How F, S, M are computed here

The exact formula this method uses for each score, read from its runner, and whether it matches the paper's §3 (F ∧ S ∧ M triad) definition. From the committed audit fsm_math_phaseA.json.

AxisFormula (as computed) What it measuresMatches §3?
F
faithfulness
No faithfulness score. A5 is declared a descriptive method: it reports the pooled-activity spectral structure it reveals (headline = global-pool clock-explained variance fraction), not an F vs the oracle.— n/a Runner A5_lfp.jl explicitly sets method_kind='descriptive (no oracle F/S/M)',; metric_name=A5_global_pool_clock_explained_variance_fraction_epiphenomenal, value=gp.clock_var_fraction. Record out/A5_pong.json has no triad.
S
sufficiency
Not computed; A5 emits no S.— n/a No S/held-out estimator in A5_lfp.jl; descriptive method by design.
M
minimality
Not computed; A5 emits no M.— n/a No minimality set in A5_lfp.jl; descriptive method by design.

✓ matches = the same quantity as §3; ◐ partial = the same kind of estimator but a differing detail; ✗ does not match = a different quantity (see the note). Definitions: F = agreement with the oracle's true causal effects Δy(u); S = held-out predictive score in [−1, 1]; M = |U*|/|Û| (true-minimal-set size / named-set size).

In the audit

This is the method's entry in the actual cross-method audit — scored on the paper's correctness triad, each axis a mean over all 40 scored games (40 committed §R records), not the single example shown above. Tradition: correlational. The example figure (Pong) is one of those records.

0.376F — faithfulness vs oracle (mean over 40 games, ±0.055 CI95)
n/aS — sufficiency: held-out predictive (n/a where the paper does not define this axis)
n/aM — minimality: true-minimal-set / named-set (n/a otherwise)
40committed records aggregated
0.00human-plausibility proxy

F faithfulness (scored vs the oracle for every method) · S sufficiency (held-out predictive score in [−1, 1]; a negative value means the explanation predicts held-out interventions worse than the unperturbed baseline; reported for the predictive methods across all three phases where the calibration/held-out split is defined) · M minimality (true-minimal-set / named-set; where the method names a cause set) — n/a otherwise, per the paper's F ∧ S ∧ M triad.

Source: leaderboard.json · the whole leaderboard is on the methods page and the Paper 2 audit.

Results per game

This method's faithfulness on each of the 40 scored games (all-regime F; this method has no content-vs-position split (see the note below)). Click a header to sort. Every number is read from site_data.json (methods.A5_lfp.per_game).

content-F and position-F are n/a for this method. The content-vs-position split applies only to pixel-attribution methods — those that produce an attribution map over the framebuffer, whose score can be read separately on the smooth content outputs and the discrete position outputs (where the naive gradient is provably zero). This method does not attribute to a pixel output; it is graded by its own fidelity metric (A5_global_pool_clock_explained_variance_fraction_epiphenomenal), reported as the F column, so there is no content or position regime to separate.

GameF (all)content-Fposition-FSMNote
Kung-Fu Master0.773n/an/an/an/a
Jamesbond0.743n/an/an/an/a
Assault0.701n/an/an/an/a
Video Pinball0.625n/an/an/an/a
Riverraid0.604n/an/an/an/a
Alien0.581n/an/an/an/a
Fishing Derby0.574n/an/an/an/a
Gopher0.569n/an/an/an/a
Atlantis0.544n/an/an/an/a
Space Invaders0.506n/an/an/an/a
Private Eye0.460n/an/an/an/a
Freeway0.447n/an/an/an/a
Chopper Command0.438n/an/an/an/a
Name This Game0.425n/an/an/an/a
Yars' Revenge0.414n/an/an/an/a
Ice Hockey0.410n/an/an/an/a
Montezuma's Revenge0.402n/an/an/an/a
Pitfall0.397n/an/an/an/a
Tennis0.396n/an/an/an/a
Road Runner0.384n/an/an/an/a
Demon Attack0.343n/an/an/an/a
Double Dunk0.339n/an/an/an/a
Q*bert0.330n/an/an/an/a
Phoenix0.308n/an/an/an/a
Seaquest0.305n/an/an/an/a
Bowling0.298n/an/an/an/a
Beam Rider0.294n/an/an/an/a
Bank Heist0.285n/an/an/an/a
Venture0.271n/an/an/an/a
Pong0.248n/an/an/an/a
Boxing0.228n/an/an/an/a
Pacman0.213n/an/an/an/a
Ms. Pac-Man0.194n/an/an/an/a
Breakout0.186n/an/an/an/a
Air Raid0.186n/an/an/an/a
Krull0.148n/an/an/an/a
Frostbite0.138n/an/an/an/a
Kangaroo0.133n/an/an/an/a
Centipede0.101n/an/an/an/a
Berzerk0.089n/an/an/an/a

Call stack — how it runs on jutari / jaxtari

The path from this method's runner (compute_game) into the bit-exact VCS substrate, and the computation it involves. Every step links to the exact source on main. From callstack_phaseA.json.

Applied on the substrate

  1. assemble the shared gameplay-state testbed + cause-density gate — build_a5_shared_state(game) -> build_shared_testbed(game; ...) runner
  2. build_shared_testbed definition: booted checkpoint + shared output + gate — function build_shared_testbed(game; ...) runner
  3. cause-density gate counts causes with |Delta_y|>floor via the oracle — cause_density = count(>(floor), deltas) runner
  4. record a (frames x 128) RAM tape by stepping the ROM with A5's per-game settings — a5_record_ram(game, frames, actions) runner
  5. step the real emulator one frame per action while recording — env_step!(env, Int(actions[t])) jutari
  6. read RAM into the tape each frame — get_ram(env) jutari

The computation

  1. detect periodic clock cells (basis of the clock-explained fraction) over the tape — detect_clock_cells(tape; p_max=64) runner
  2. LFP analysis (method under test): pool RAM cells into a region, detrend + window, DFT power spectrum, dominant period/band + clock-explained fraction — analyse_region(name, cells, tape, B, win) runner

Scored against the exact intervention oracle Δy(u): run_intervention(checkpoint, actions, target_frame, horizon, cause).

Implementation
tools/xai_study/phaseA_kording/A5_lfp.jl
Reference
cf. Jonas & Kording 2017
Record
A5_pong.json
All records
phaseA_kording/out

The figure is generated from the committed record by docs/gen_method_figures.py; the game frame and each RAM cell's screen footprint are produced by render_scenes.jl / cell_footprints.jl.