Phase A · neuroscience battery

A4 · Pairwise correlations

cf. Jonas & Kording 2017

← back to the method catalogue

What it does?

This method studies the correlation structure across the machine's cells. In neuroscience the 'spike-word' or pairwise-correlation analysis looks at which units fire together, and reads coordinated firing as evidence of shared function or coupling. We compute the same statistics over RAM. For every pair of cells we measure how their values co-vary across the trajectory, and we also measure the global, population-level correlation. The familiar finding in neural data is weak pairwise but strong global correlation, and the VCS reproduces that signature. The idea is that cells which move together are functionally linked, so the correlation matrix should approximate the true coupling. The method is purely observational: it never intervenes, it only watches. That is its limit. On a clock-locked machine almost everything co-varies with almost everything else, driven by shared timing signals rather than by direct influence. So the correlation structure is real but mostly reflects common drivers, not causal links. It detects that the machine is active and coordinated, but it does not separate a true dependency from two cells that merely share a clock.

A4 · Pairwise correlations result

Two adjacency matrices over the candidate RAM cells: the true data-flow graph and the graph this method recovered. A bright cell (row = cause, column = effect) is an edge; the difference between the two panels is the error. A4_faithfulness_spearman_corr_vs_oracle_coupling = 0.633 — this example only (pong, state gameplay(seed=0,prefix=90)+15); the audit aggregate is below.

How it's scored

The score is a rank correlation between the measured cell-to-cell correlation structure and the oracle's true coupling. We compute how each pair of cells co-varies across the trajectory, assemble that into a coupling matrix, and compare it, by Spearman correlation, to the true coupling the oracle certifies. Faithfulness for this method is that correlation. It is only partial, because the method never intervenes; it only watches. On a clock-locked machine two cells can be strongly correlated because they share a driver, not because one influences the other. So the correlation matrix conflates true coupling with common drivers, and the score reflects that confusion. Sufficiency, whether the recovered structure can predict held-out interventions, is near zero for this method, because a correlation matrix carries no mechanism to re-generate behaviour. The grading is always against the oracle, not against another method. There is no sprite-position hard-case here; the output is a coupling matrix. The audit box reports the measured faithfulness and, where the paper defines it, the sufficiency, each aggregated across the scored games so no single game dominates the number.

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
\(F = \rho_{\mathrm{Spearman}}\!\left(|\mathrm{corr}|_{\mathrm{pairs}},\ \mathrm{coupling}_{\mathrm{pairs}}\right)\)Spearman correlation between absolute pairwise data correlations and the oracle intervention-based cell-cell coupling over candidate-cell pairs.✓ matches Oracle 'coupling' is a bit-exact intervention effect (not a data correlation); F correlates the method's |corr| map against it. Correlation primitive on pairs. Runner A4_correlations.jl,; record out/A4_pong.json triad.F=0.633.
how it's measured — call stack:
  1. F = Spearman(|corr| pairs, oracle coupling pairs) — A4_correlations.jl:655
  2. score_triad over the candidate-cell pairs — A4_correlations.jl:650
  3. true causal effect Δy(u) by bit-exact re-run — oracle_intervene.jl:242
S
sufficiency
\(S = \rho_{\mathrm{Pearson}}\!\left(|\mathrm{corr}|_{\mathrm{pairs}},\ \mathrm{coupling}^{\mathrm{held\text{-}out}}_{\mathrm{pairs}}\right) \in [-1,1]\)Pearson correlation of the pairwise-correlation map vs the held-out do(base+37) coupling.✓ matches Held-out predictive correlation in [-1,1] of the pairwise-correlation map vs the held-out do(base+37) coupling: the §3 (sec:triad) form (can be negative). A4_correlations.jl; record S=-0.170.
how it's measured — call stack:
  1. S = Pearson(|corr| pairs, held-out do(base+37) coupling) — A4_correlations.jl:657
  2. true causal effect Δy(u) by bit-exact re-run — oracle_intervene.jl:242
M
minimality
\(M = |U^{\star}| / |\hat{U}| \in (0,1]\quad(\text{over candidate-cell pairs})\)Number of oracle-coupled cell pairs over the number of high-correlation pairs the method names.✓ matches Runner now emits M = |U*|/|U_hat| over pairs (M_note '|U*|=4 (oracle movers) / |U_hat|=6'), the paper's set-size ratio at the pair level. Record out/A4_pong.json extra.triad.M=0.667. Replaced the former 1 − correlation-overgrouping rate.
how it's measured — call stack:
  1. minimality_score(|corr| pairs, oracle coupling) — A4_correlations.jl:670
  2. minimality_score: |U*| coupled pairs / |U_hat| named pairs — triad_sm.jl:57
  3. true causal effect Δy(u) by bit-exact re-run — oracle_intervene.jl:242

✓ 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 34 scored games (34 committed §R records), not the single example shown above. Tradition: correlational. The example figure (Pong) is one of those records.

0.225F — faithfulness vs oracle (mean over 34 games, ±0.060 CI95)
0.133S — sufficiency: held-out predictive (n/a where the paper does not define this axis)
0.363M — minimality: true-minimal-set / named-set (n/a otherwise)
34committed 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 34 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.A4_correlations.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 (A4_faithfulness_spearman_corr_vs_oracle_coupling), reported as the F column, so there is no content or position regime to separate.

M is n/a on 1 of these games. Minimality is M = |U*|/|Û|, the size of the true minimal cause set over the size of the set the method actually names. On a game where the method names nothing (|Û| = 0 — it discovers no circuit, its attribution map is all-zero, or it decodes no cell), that ratio is undefined, so M is left blank rather than scored. The aggregate M is the mean over the 33 games where the method did name a cause set.

S is negative on 8 of these games. Sufficiency asks whether the explanation can predict the outcome of held-out interventions it was not fit on; for this method S is the held-out predictive correlation between its claim and the true effect, so it lies in [−1, 1]. A value near 0 means the explanation predicts no better than the unperturbed output; a negative value means it predicts worse — its held-out claim is anti-correlated with the truth (named yet causally unused). The aggregate S is the mean over the scored games.

GameF (all)content-Fposition-FSMNote
Pong0.633n/an/a-0.1700.667
Bowling0.609n/an/a0.5270.667
Atlantis0.503n/an/a0.0000.200
Boxing0.469n/an/a0.1440.464
Video Pinball0.463n/an/a0.5440.167
Chopper Command0.416n/an/a0.1790.256
Frostbite0.362n/an/a-0.0390.821
Venture0.354n/an/a0.1410.396
Pitfall0.344n/an/a0.3320.141
Seaquest0.304n/an/a0.0330.429
Montezuma's Revenge0.280n/an/a0.3220.867
Berzerk0.280n/an/a0.2370.317
Demon Attack0.280n/an/a0.0080.197
Jamesbond0.272n/an/a0.3450.107
Carnival0.254n/an/a0.2440.178
Ice Hockey0.230n/an/a0.3290.321
Phoenix0.221n/an/a0.3000.036
Breakout0.219n/an/a-0.0461.000
Yars' Revenge0.191n/an/a0.0720.111
Double Dunk0.158n/an/a0.0190.200
Riverraid0.136n/an/a-0.0270.110
Centipede0.129n/an/a0.1430.143
Krull0.124n/an/a0.0050.500
Space Invaders0.117n/an/a0.0450.400
Assault0.107n/an/a0.2470.222
Road Runner0.082n/an/a-0.0570.077
Q*bert0.048n/an/a0.0810.009no true-cause signal
Private Eye0.028n/an/a0.1340.429no true-cause signal
Tennis0.023n/an/a0.1000.393no true-cause signal
Air Raid0.000n/an/a-0.0690.095no true-cause signal
Alien0.000n/an/a0.0001.000no true-cause signal
Hero0.000n/an/a-0.0081.000no true-cause signal
Kangaroo0.000n/an/a0.000n/ano true-cause signal
Ms. Pac-Man0.000n/an/a-0.1550.077no true-cause signal

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_a4_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 A4's per-game settings — a4_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. compute the pairwise correlation matrix over candidate-cell time series (method under test) — pairwise_corr(tape, cands) runner
  2. extract global structure from the correlation matrix (clustering/summary over varying cells) — global_structure(C, varying, tape) runner

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

Implementation
tools/xai_study/phaseA_kording/A4_correlations.jl
Reference
cf. Jonas & Kording 2017
Record
A4_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.