Seal Phase 4AM whole-brain plastic interface audit without learning claim
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
"""Complete paired static-overlay effects; no learned-memory inference."""
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from context import EXP, CFG, read, save, digest, bit_equal
|
||||
from run_suite import verify_completed
|
||||
|
||||
|
||||
def load(path):
|
||||
with np.load(path, allow_pickle=False) as data:
|
||||
return {k: data[k].copy() for k in data.files}
|
||||
|
||||
|
||||
def first_ticks(state, n=166700):
|
||||
out = np.full(n, np.iinfo(np.int32).max, np.int32)
|
||||
np.minimum.at(out, state['neuron_idx'], state['step'])
|
||||
out[out == np.iinfo(np.int32).max] = -1
|
||||
return out
|
||||
|
||||
|
||||
def metrics(base, changed, population):
|
||||
a, b = base['counts'][population], changed['counts'][population]
|
||||
af, bf = first_ticks(base)[population], first_ticks(changed)[population]
|
||||
ae = np.isin(base['neuron_idx'], population); be = np.isin(changed['neuron_idx'], population)
|
||||
same = bit_equal(base['step'][ae], changed['step'][be]) and bit_equal(base['neuron_idx'][ae], changed['neuron_idx'][be])
|
||||
ax = base['step'][ae].astype(np.int64) * 166700 + base['neuron_idx'][ae]
|
||||
bx = changed['step'][be].astype(np.int64) * 166700 + changed['neuron_idx'][be]
|
||||
different = np.setxor1d(ax, bx, assume_unique=True)
|
||||
return dict(cells=len(population), base_active=int(np.count_nonzero(a)), changed_active=int(np.count_nonzero(b)),
|
||||
base_spikes=int(a.sum()), changed_spikes=int(b.sum()),
|
||||
recruited_cells=int(np.count_nonzero((a == 0) & (b > 0))), lost_cells=int(np.count_nonzero((a > 0) & (b == 0))),
|
||||
count_changed_cells=int(np.count_nonzero(a != b)), first_spike_changed_cells=int(np.count_nonzero(af != bf)),
|
||||
count_l1=int(np.abs(a.astype(np.int64) - b.astype(np.int64)).sum()), event_sequence_changed=not same,
|
||||
first_event_divergence_ms=None if not len(different) else float(different.min() // 166700 * .1),
|
||||
final_v_max_abs_SI=float(np.max(np.abs(base['v'][population] - changed['v'][population]))) if len(population) else None,
|
||||
final_g_max_abs_SI=float(np.max(np.abs(base['g'][population] - changed['g'][population]))) if len(population) else None)
|
||||
|
||||
|
||||
def run(verify_only=False):
|
||||
def emit(path, value):
|
||||
if verify_only:
|
||||
assert read(path) == value, str(path)
|
||||
else:
|
||||
save(path, value)
|
||||
reg = read(EXP / 'protocol/preregistered.json')
|
||||
for stage in CFG['stages']:
|
||||
receipt = read(EXP / 'audit' / (stage + '-complete.json'))
|
||||
assert receipt['pass_all'] and receipt['trials'] == 144
|
||||
assert len(receipt['completed']) == 144
|
||||
for row, entry in zip(reg['planned'], receipt['completed']):
|
||||
assert entry['name'] == row['name'] and entry['repeat'] == row['repeat']
|
||||
folder = EXP / 'gpu' / stage / (row['name'] + '-r' + str(row['repeat']))
|
||||
verify_completed(folder, stage, row, recompute=True)
|
||||
assert digest(folder / 'output-hashes.json') == entry['output_hashes_sha256']
|
||||
assert digest(folder / 'comparison.json') == entry['comparison_sha256']
|
||||
pops = load(EXP / 'protocol/populations.npz')
|
||||
rows, cellrows, times, peaks = [], [], [], []
|
||||
for row in reg['planned']:
|
||||
if row['repeat']:
|
||||
continue
|
||||
key = row['name'] + '-r0'
|
||||
base, changed = [load(EXP / 'gpu' / stage / key / 'state.npz') for stage in CFG['stages']]
|
||||
effects = {name: metrics(base, changed, nodes) for name, nodes in pops.items()}
|
||||
result = dict(**row, effects=effects, whole_brain=metrics(base, changed, np.arange(166700, dtype=np.int32)))
|
||||
emit(EXP / 'summaries' / (row['name'] + '.json'), result); rows.append(result)
|
||||
af, bf = first_ticks(base), first_ticks(changed)
|
||||
for neuron in pops['MBON']:
|
||||
n = int(neuron)
|
||||
cellrows.append(dict(case=row['name'], cohort=row['cohort'], mode=row['mode'], seed=row['seed'],
|
||||
neuron_idx=n, base_count=int(base['counts'][n]), static25_count=int(changed['counts'][n]),
|
||||
base_first_tick=int(af[n]), static25_first_tick=int(bf[n]),
|
||||
base_final_v_SI=float(base['v'][n]), static25_final_v_SI=float(changed['v'][n]),
|
||||
base_final_g_SI=float(base['g'][n]), static25_final_g_SI=float(changed['g'][n])))
|
||||
for stage in CFG['stages']:
|
||||
s = read(EXP / 'gpu' / stage / key / 'summary.json')
|
||||
times.append(dict(stage=stage, case=row['name'], wall_seconds=s['wall_seconds'],
|
||||
simulation_seconds=s['diagnostic_simulation_seconds']))
|
||||
peaks.append(s['peak_allocated_vram_bytes'])
|
||||
table = pd.DataFrame(cellrows)
|
||||
table_path = EXP / 'summaries/per-MBON-static-effects.parquet'
|
||||
if verify_only:
|
||||
pd.testing.assert_frame_equal(table, pd.read_parquet(table_path), check_exact=True)
|
||||
else:
|
||||
assert not table_path.exists(); table.to_parquet(table_path, index=False)
|
||||
blocks = {}
|
||||
for cohort in sorted({r['cohort'] for r in rows}):
|
||||
for mode in sorted({r['mode'] for r in rows}):
|
||||
block = [r for r in rows if r['cohort'] == cohort and r['mode'] == mode]
|
||||
assert len(block) == 30
|
||||
blocks[cohort + '/' + mode] = dict(trials=30, populations={name: dict(
|
||||
trials_event_change=sum(r['effects'][name]['event_sequence_changed'] for r in block),
|
||||
trials_count_change=sum(r['effects'][name]['count_changed_cells'] > 0 for r in block),
|
||||
mean_count_l1=float(np.mean([r['effects'][name]['count_l1'] for r in block])),
|
||||
mean_recruited_cells=float(np.mean([r['effects'][name]['recruited_cells'] for r in block])),
|
||||
mean_lost_cells=float(np.mean([r['effects'][name]['lost_cells'] for r in block]))) for name in pops})
|
||||
summary = dict(status='PASS-EXACT-WHOLEBRAIN-PLASTIC-INTERFACE-NOT-LEARNING',
|
||||
primary_trials_per_stage=120, technical_repeats_per_stage=24, zero_overlay_exact=True,
|
||||
static25_repeat_exact=True, blocks=blocks, peak_allocated_vram_bytes=max(peaks),
|
||||
timing=times, per_MBON_sha256=digest(table_path), training=False, learned_candidate=False,
|
||||
conditional_AL_not_a_nonzero_arithmetic_oracle=True,
|
||||
scope='Valid interface and recording; reported static response is not an associative learning PASS')
|
||||
emit(EXP / 'audit/scientific-summary.json', summary)
|
||||
return summary
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(run()['status'], flush=True)
|
||||
Reference in New Issue
Block a user