Archive MaleCNS research sources, provenance, bibliography and immutable data inventory

This commit is contained in:
Digital Drosophila Archive
2026-09-29 03:38:32 +08:00
commit 3981628ff8
682 changed files with 161475 additions and 0 deletions
@@ -0,0 +1,38 @@
{
"file_count": 6,
"files": [
{
"bytes": 363,
"path": "VERSION.json",
"sha256": "cc79527b6f36804f8ba4fc383988c08b550cb0eb43567f8b4ee3948f6231063b"
},
{
"bytes": 6464,
"path": "literature-audit.json",
"sha256": "820ef25d0dff122a3cad1a763074ff5e6f74a5a7e08fb00620454ab4164f3fc4"
},
{
"bytes": 35313,
"path": "phase4m.py",
"sha256": "3d1b64861559c9c04e08153b4056d968ab556637916d388170b36fc6348fa822"
},
{
"bytes": 2339,
"path": "phase4m.yaml",
"sha256": "52c364d2ada03ba0c3b06220e91641c74ee79486c35d8c283237f02a98a2e471"
},
{
"bytes": 5545,
"path": "phase4m_finalize.py",
"sha256": "58a2fd9bfc89725c741201f43ef06cf34840f78734190faad193ae8cee89c6ab"
},
{
"bytes": 5487,
"path": "phase4m_performance.py",
"sha256": "7fab670032732d36823499c135a725f5ab7c8aa8305be780ee51f7eb0b8dfd57"
}
],
"generated_utc": "2026-09-21T06:00:10.958765+00:00",
"root": "/data/digital-drosophila/models/male-cns-lif/kcmbon-efficacy-v1",
"total_bytes": 55511
}
@@ -0,0 +1,11 @@
{
"base_CSR_read_only": true,
"candidates": {
"KCMBON-FunctionalTransfer-v2": true,
"KCMBON-SynapticEfficacy-v1": true,
"MaleCNS-OlfactoryAssociativeMemory-v1-candidate": false,
"PresynapticEfficacy-v1": true
},
"name": "KCMBON-SynapticEfficacy-v1",
"summary_sha256": "f0ba8af69ea749c7329f950d320e0330a0b9ad339730eb36e0a107b049eae38e"
}
@@ -0,0 +1,7 @@
6d7dd50ee8554af53223c9a3bcef60389a25f9eb75fa572f42cec034a171fc05 MANIFEST.json
cc79527b6f36804f8ba4fc383988c08b550cb0eb43567f8b4ee3948f6231063b VERSION.json
820ef25d0dff122a3cad1a763074ff5e6f74a5a7e08fb00620454ab4164f3fc4 literature-audit.json
3d1b64861559c9c04e08153b4056d968ab556637916d388170b36fc6348fa822 phase4m.py
52c364d2ada03ba0c3b06220e91641c74ee79486c35d8c283237f02a98a2e471 phase4m.yaml
58a2fd9bfc89725c741201f43ef06cf34840f78734190faad193ae8cee89c6ab phase4m_finalize.py
7fab670032732d36823499c135a725f5ab7c8aa8305be780ee51f7eb0b8dfd57 phase4m_performance.py
@@ -0,0 +1,87 @@
{
"phase": "4M",
"status": "LITERATURE-AUDIT-COMPLETE-BEFORE-IMPLEMENTATION",
"scope": "Adult Drosophila KC-to-MBON plasticity; evidence is not a quantitative calibration of MaleCNS v1.0 synapses",
"sources": [
{
"source": "Stahl et al., eLife 2022",
"doi": "10.7554/eLife.76712",
"pmid": "35285796",
"url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC8956283/",
"experiment_type": "in vivo learning protocols with acetylcholine sensor imaging along KC axonal compartments",
"species_stage": "adult Drosophila melanogaster",
"compartment": "multiple MB axonal compartments; longitudinally graded",
"measured_quantity": "learning-related KC acetylcholine release change",
"finding": "compartmentalized bidirectional ACh-release plasticity; valence and location matter",
"model_interpretation": "supports an independently represented presynaptic transmitter-efficacy layer, but supplies no MaleCNS edge-specific efficacy or update coefficient"
},
{
"source": "Davidson, Kaushik and Hige, eNeuro 2023",
"doi": "10.1523/ENEURO.0275-23.2023",
"pmid": "37848287",
"url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC10616905/",
"experiment_type": "odor-DAN pairing with in vivo MBON calcium, KC acetylcholine and individual bouton calcium imaging",
"species_stage": "adult female Drosophila melanogaster, 3-6 days after eclosion",
"compartment": "gamma5/beta-prime-2a and gamma1-pedc; gamma5/beta-prime-2a is related to but not an exact measured MaleCNS edge mapping for y5B'2a",
"measured_quantity": "compartment-specific KC ACh release and heterogeneous single-bouton calcium signals",
"finding": "paired DAN activity depressed odor-evoked ACh release, while bulk KC axonal calcium was unchanged; strongly responsive boutons could depress and weakly responsive boutons could potentiate",
"model_interpretation": "supports local presynaptic efficacy and cautions against assigning identical biological release responses to all terminals; bouton-level parameters are not inferable from MaleCNS neuron-level CSR"
},
{
"source": "Cohn et al., Cell 2015",
"doi": "10.1016/j.cell.2015.11.019",
"pmid": "26687359",
"url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC4732734/",
"experiment_type": "ex vivo KC stimulation and MBON electrophysiology with DAN activation",
"species_stage": "adult Drosophila melanogaster",
"compartment": "gamma4 and other tested MB domains",
"measured_quantity": "KC-to-MBON synaptic current and presynaptic modulation",
"finding": "dopaminergic protocols can potentiate or depress synaptic transmission; temporal order can reverse direction",
"model_interpretation": "reinforces compartment/timing dependence; does not justify changing frozen Phase 4J timing polarity or eta"
},
{
"source": "Pribbenow et al., eLife 2022",
"doi": "10.7554/eLife.80445",
"pmid": "36250621",
"url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC9733945/",
"experiment_type": "MBON receptor-subunit genetics, in vivo receptor dynamics and appetitive/familiarity behavior",
"species_stage": "adult Drosophila melanogaster",
"compartment": "M4/M6 and alpha-prime-3-related circuits, not a validated edge-level mapping to current MaleCNS y5B'2a target",
"measured_quantity": "postsynaptic nAChR alpha5 requirement and alpha2 receptor dynamics",
"finding": "postsynaptic cholinergic plasticity can contribute to memory induction/expression, with behavior/compartment specificity",
"model_interpretation": "supports a separate postsynaptic research branch, but no defensible quantitative update for the current y5B'2a MaleCNS compartment; do not run a mixed branch here"
},
{
"source": "Zhang et al., Journal of Neuroscience 2019",
"doi": "10.1523/JNEUROSCI.1420-19.2019",
"pmid": null,
"url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC6855682/",
"experiment_type": "aversive conditioning with presynaptic and postsynaptic calcium imaging",
"species_stage": "adult Drosophila melanogaster",
"compartment": "alpha-prime-3",
"measured_quantity": "pre- and postsynaptic odor-evoked calcium suppression",
"finding": "both sides showed suppression across a similar post-training period; causality and quantitative partition are unresolved",
"model_interpretation": "supports mixed mechanisms in some compartments, not automatic transfer of a postsynaptic coefficient to y5B'2a"
}
],
"mechanism_conclusion": {
"presynaptic": "direct support for compartment-specific learning-related KC ACh release modulation; exact release probability per MaleCNS edge remains unknown",
"postsynaptic": "direct support for nAChR-related MBON changes in specific other circuits; no validated quantitative rule for the current target compartment",
"mixed": "biologically plausible and compartment-dependent, but not justified as one blended MaleCNS y5B'2a rule",
"timing_pairings": "LTD and opposite-direction changes depend on KC/DAN timing and training protocol; frozen eligibility-v2 is retained, not recalibrated",
"saturation_recovery": "the cited studies do not identify a universal edge-level saturation/recovery constant for MaleCNS; physical nonnegative E and the pre-existing Phase 4J 25-percent diagnostic bound are explicit engineering assumptions, not measured values"
},
"decisions_before_simulation": {
"main_branch": "PresynapticEfficacy-v1",
"postsynaptic_branch": "AUDIT-ONLY-NOT-RUN-COMPARTMENT-SPECIFIC-QUANTITATIVE-RULE-UNKNOWN",
"efficacy_interpretation": "dimensionless per-edge effective KC terminal drive multiplier, not measured release probability",
"E_initial": 1.0,
"E_unit_conversion": "one frozen eta_effective_mv increment is converted to a dimensionless per-anatomical-contact fraction by division by frozen W_syn_mv_per_anatomical_synapse; this is an explicit engineering unit convention, not fitted to Phase 4K sensitivity",
"unbounded_multiplicative_lower_limit": 0.0,
"bounded_multiplicative_lower_limit": 0.75,
"bounded_limit_provenance": "Phase 4J frozen max_fractional_depression=0.25, not newly tuned",
"five_percent_sensitivity_used_for_tuning": false,
"numeric_efficacy_claimed_as_measured": false,
"random_heterogeneity_added": false
}
}
@@ -0,0 +1,360 @@
#!/usr/bin/env python3
"""Phase 4M: isolated KC->MBON efficacy mechanisms on frozen MaleCNS inputs."""
from __future__ import annotations
import argparse
import gc
import json
import resource
import shutil
import subprocess
import sys
import time
from collections import defaultdict
from pathlib import Path
from typing import Any
import numpy as np
import pandas as pd
import torch
import yaml
from phase4h_audit import sha256, verify_checksum, write_json
from phase4i import Validator, phase4c_regression
from phase4j import apply_v2, effect, verify_frozen
from phase4k import dataset_checks, seal
from phase4l import OdorSimulator, pn_drive
MECHANISMS = ("additive", "multiplicative", "bounded_multiplicative")
def frozen_checks(cfg: dict[str, Any]) -> dict[str, Any]:
earlier = verify_frozen(cfg); later = {}
for key, control in (("phase4j_root", "manifests/checksums.sha256"), ("phase4j_model_root", "checksums.sha256"),
("phase4k_root", "manifests/checksums.sha256"), ("phase4k_model_root", "checksums.sha256"),
("phase4l_root", "manifests/checksums.sha256"), ("phase4l_model_root", "checksums.sha256")):
root = Path(cfg["paths"][key]); later[key] = verify_checksum(root, root / control)
report = {"phase4c_to_4i": earlier["all_passed"], "phase4j_to_4l": {k: v["passed"] for k, v in later.items()}}
report["all_passed"] = bool(earlier["all_passed"] and all(v["passed"] for v in later.values()))
if not report["all_passed"]: raise RuntimeError("frozen Phase 4C-4L checksum failure")
return report
def frozen_hashes(cfg: dict[str, Any]) -> dict[str, str]:
p = cfg["paths"]; root = Path(p["connectome_root"]); files = [root / "gpu/csr-indptr.int64.npy", root / "gpu/csr-indices.int32.npy", root / "gpu/csr-weights.int64.npy", root / "neuron-index/unified-metadata.parquet",
Path(p["phase4h_root"]) / "plastic-mask/plastic-edge-candidates.parquet",
Path(p["phase4j_root"]) / "audit/phase4j.py", Path(p["phase4j_model_root"]) / "phase4j.yaml",
Path(p["phase4l_root"]) / "odor-encoder/frozen-odor-panel.parquet", Path(p["phase4l_root"]) / "odor-encoder/mapped-glomerular-vectors.npz",
Path(p["phase4l_root"]) / "receptor-mapping/olfactory-mapping.parquet", Path(p["phase4l_root"]) / "manifests/checksums.sha256",
Path(p["phase4l_model_root"]) / "checksums.sha256"]
for f in files:
if not f.is_file(): raise FileNotFoundError(f)
return {str(f): sha256(f) for f in files}
def load_odor_inputs(cfg: dict[str, Any]) -> tuple[pd.DataFrame, dict[str, np.ndarray], dict[str, Any], pd.DataFrame]:
exp = Path(cfg["paths"]["phase4l_root"]); panel = pd.read_parquet(exp / "odor-encoder/frozen-odor-panel.parquet"); vecfile = np.load(exp / "odor-encoder/mapped-glomerular-vectors.npz"); vectors = {str(oid): vecfile[str(oid)].copy() for oid in panel.odor_id}
selection = json.loads((exp / "odor-encoder/selection.json").read_text()); mapping = pd.read_parquet(exp / "receptor-mapping/olfactory-mapping.parquet")
if selection["ODOR_A"]["odor_id"] not in vectors or selection["ODOR_B"]["odor_id"] not in vectors: raise RuntimeError("frozen odor identity mismatch")
return panel, vectors, selection, mapping
def anatomical_audit(v: Validator, cfg: dict[str, Any], exp: Path) -> tuple[np.ndarray, np.ndarray]:
cand = v.cand; raw = np.asarray(v.rt.raw_np[v.edge_ids], dtype=np.int64); sign = v.rt.signs[cand.source_neuron_idx.to_numpy(np.int32)]
w = (raw.astype(np.float32) * sign.astype(np.float32) * np.float32(cfg["model"]["w_syn_mv_per_anatomical_synapse"])).astype(np.float32)
base = v.base_candidate.astype(np.float32)
if not np.array_equal(raw, cand.raw_synapse_count.to_numpy(np.int64)): raise RuntimeError("plastic mask/raw CSR count mismatch")
if not np.array_equal(w, base): raise RuntimeError("anatomical effective weight mismatch with frozen runtime")
if not np.all(sign == 1): raise RuntimeError("presynaptic efficacy branch requires cholinergic positive KC candidates")
if len(cand) != 14232 or len(np.unique(v.edge_ids)) != 14232: raise RuntimeError("plastic mask changed")
report = {"plastic_mask_edges": len(cand), "raw_count_min": int(raw.min()), "raw_count_median": float(np.median(raw)), "raw_count_max": int(raw.max()),
"raw_count_sum": int(raw.sum()), "anatomical_weight_min_mv": float(w.min()), "anatomical_weight_max_mv": float(w.max()),
"all_cholinergic_positive": True, "anatomical_formula_verified_exactly": True, "base_CSR_read_only": True,
"E_birth_state": 1.0, "other_brain_edges_E": 1.0}
write_json(exp / "anatomical-weight/summary.json", report); return raw, w
class ReplayEngine:
"""Real KC spikes + existing KC->MBON edges + frozen MBON LIF, no invented edge."""
def __init__(self, sim: OdorSimulator, targets: np.ndarray):
self.sim = sim; self.targets = np.asarray(targets, np.int32); self.dt = sim.dt; self.rt = sim.rt; v = sim.v
indices = v.rt.indices_np; sources = sim.sources; mask = np.isin(sources, v.kc) & np.isin(indices, self.targets); self.ids = np.flatnonzero(mask)
self.src = sources[self.ids].astype(np.int32); self.target = indices[self.ids].astype(np.int32)
pos = {int(x): i for i, x in enumerate(self.targets)}; self.target_local = np.fromiter((pos[int(x)] for x in self.target), np.int32, len(self.target))
all_base = v.base.detach().cpu().numpy(); self.base = all_base[self.ids].astype(np.float32)
can_index = {int(eid): i for i, eid in enumerate(v.edge_ids)}; self.candidate_local = np.fromiter((can_index.get(int(x), -1) for x in self.ids), np.int32, len(self.ids))
self.by_source = {int(s): np.flatnonzero(self.src == s) for s in np.unique(self.src)}
if not np.all(self.base > 0): raise RuntimeError("isolated KC replay contains nonpositive source weights")
def run(self, spikes: pd.DataFrame, delta: np.ndarray, duration_ms: float) -> dict[str, Any]:
weights = self.base.copy(); valid = self.candidate_local >= 0; weights[valid] += delta[self.candidate_local[valid]]
grouped = {int(k): g.neuron_idx.to_numpy(np.int32) for k, g in spikes.groupby("step")}; nsteps = int(round(duration_ms / self.dt)); n = len(self.targets); q = np.zeros((self.rt.queue_len, n), np.float32)
conductance = np.zeros(n, np.float32); voltage = np.full(n, self.rt.rest, np.float32); refractory = np.zeros(n, np.int32); counts = np.zeros(n, np.int32); first = np.full(n, -1, np.int32)
integrated_g = np.zeros(n, np.float64); transmitted = 0.0; delivered = 0.0; wall0 = time.perf_counter()
for step in range(nsteps):
slot = step % self.rt.queue_len; conductance = conductance * np.float32(self.rt.g_decay) + q[slot]; delivered += float(q[slot].sum(dtype=np.float64)); q[slot].fill(0)
integrated_g += conductance; refractory = np.maximum(refractory, 1) - 1; avail = refractory == 0
voltage[avail] += np.float32(self.rt.alpha) * (conductance[avail] - (voltage[avail] - np.float32(self.rt.rest))); voltage[~avail] = np.float32(self.rt.reset_value)
fired = avail & (voltage >= np.float32(self.rt.threshold)); counts += fired; first[(first < 0) & fired] = step; voltage[fired] = np.float32(self.rt.reset_value); refractory[fired] = self.rt.refractory_steps
for source in grouped.get(step, np.empty(0, np.int32)):
rel = self.by_source.get(int(source))
if rel is not None:
np.add.at(q[(step + self.rt.delay_steps) % self.rt.queue_len], self.target_local[rel], weights[rel]); transmitted += float(weights[rel].sum(dtype=np.float64))
return {"counts": counts, "first": first, "final_g": conductance, "final_v": voltage, "integrated_g": integrated_g,
"transmitted_weighted_events_mv": transmitted, "delivered_input_mv": delivered, "wall_seconds": time.perf_counter() - wall0}
def replay_effect(pre: dict[str, Any], post: dict[str, Any], dt: float) -> dict[str, Any]:
def first_ms(x: dict[str, Any]) -> float | None:
a = x["first"]; return None if np.all(a < 0) else float(a[a >= 0].min() * dt)
a, b = first_ms(pre), first_ms(post)
return {"delta_g_max_abs_mv": float(np.abs(post["final_g"] - pre["final_g"]).max()), "delta_g_mean_abs_mv": float(np.abs(post["final_g"] - pre["final_g"]).mean()),
"delta_v_max_abs_mv": float(np.abs(post["final_v"] - pre["final_v"]).max()), "delta_v_mean_abs_mv": float(np.abs(post["final_v"] - pre["final_v"]).mean()),
"integrated_g_delta_sum_mv_steps": float((post["integrated_g"] - pre["integrated_g"]).sum()),
"MBON_spikes_pre": int(pre["counts"].sum()), "MBON_spikes_post": int(post["counts"].sum()), "MBON_spike_count_delta": int(post["counts"].sum() - pre["counts"].sum()),
"MBON_spike_L1": int(np.abs(post["counts"] - pre["counts"]).sum()), "first_latency_pre_ms": a, "first_latency_post_ms": b,
"first_latency_delta_ms": None if a is None or b is None else float(b - a), "transmitted_delta_mv": float(post["transmitted_weighted_events_mv"] - pre["transmitted_weighted_events_mv"]),
"transmitted_reduction_percent": float(100 * (pre["transmitted_weighted_events_mv"] - post["transmitted_weighted_events_mv"]) / pre["transmitted_weighted_events_mv"]) if pre["transmitted_weighted_events_mv"] else None,
"MBON_total_KC_input_reduction_percent": float(100 * (pre["delivered_input_mv"] - post["delivered_input_mv"]) / pre["delivered_input_mv"]) if pre["delivered_input_mv"] else None,
"isolated_input_scope": "all real KC->target-MBON edges, not all whole-brain MBON inputs"}
def latency_direction(row: dict[str, Any]) -> bool:
value = row.get("first_latency_delta_ms"); return bool(row["MBON_spike_count_delta"] < 0 or (value is not None and value > 0))
def compare_A_B(a: dict[str, Any], b: dict[str, Any]) -> bool:
if not latency_direction(a): return False
if a["MBON_spike_L1"] > b["MBON_spike_L1"]: return True
al = 0.0 if a["first_latency_delta_ms"] is None else max(float(a["first_latency_delta_ms"]), 0.0)
bl = 0.0 if b["first_latency_delta_ms"] is None else max(float(b["first_latency_delta_ms"]), 0.0)
return bool(al > bl and a["MBON_spike_L1"] >= b["MBON_spike_L1"])
def main_experiment(v: Validator, sim: OdorSimulator, cfg: dict[str, Any], mcfg: dict[str, Any], exp: Path,
panel: pd.DataFrame, vectors: dict[str, np.ndarray], selection: dict[str, Any], mapping: pd.DataFrame,
anatomical: np.ndarray) -> tuple[dict[str, Any], dict[int, dict[int, dict[str, np.ndarray]]], ReplayEngine]:
protocol = mcfg["protocol"]; points = list(map(int, protocol["pairing_counts"])); maxpair = max(points); seeds = list(map(int, protocol["train_seeds"])); eval_seeds = list(map(int, protocol["evaluation_seeds"]));
if points != list(map(int, cfg["plasticity_accumulation"]["pairing_counts"])) or seeds != list(map(int, cfg["plasticity_accumulation"]["train_seeds"])) or eval_seeds != list(map(int, cfg["plasticity_accumulation"]["evaluation_seeds"])): raise RuntimeError("Phase 4L frozen pairing protocol mismatch")
compartment = str(protocol["target_compartment_verbatim"]); dan = v.dan_targets(str(protocol["matched_dan_type"]), compartment); duration = float(protocol["duration_ms"])
gloms = selection["glomeruli_order"]; matched_sum = float(np.median(panel.mapped_response_sum)); pn = {}
for label in ("ODOR_A", "ODOR_B"):
oid = selection[label]["odor_id"]; target, rate, _ = pn_drive(oid, vectors[oid], mapping, gloms, str(protocol["input_mode"]), matched_sum, cfg); pn[label] = (target, rate)
src = v.cand.source_neuron_idx.to_numpy(np.int32); lookup = np.full(v.n, -1, np.int32); lookup[v.kc] = np.arange(len(v.kc), dtype=np.int32); loc = lookup[src]
if np.any(loc < 0): raise RuntimeError("non-KC source in plastic mask")
comp = v.cand.target_compartment_verbatim.astype(str).to_numpy() == compartment; k = float(cfg["eligibility_v2"]["eta_effective_mv"]) / float(cfg["model"]["w_syn_mv_per_anatomical_synapse"])
if k <= 0 or k >= 1: raise RuntimeError("invalid frozen eta/Wsyn dimensionless conversion")
bound = 1.0 - float(cfg["eligibility_v2"]["max_fractional_depression"]); checkpoints: dict[int, dict[int, dict[str, np.ndarray]]] = {}; histories = []; update_times = []; training_walls = []; reproduction = []
zero = np.zeros(len(v.edge_ids), np.float32); target_mbon = np.unique(v.cand.loc[comp, "target_neuron_idx"].to_numpy(np.int32)); replay = ReplayEngine(sim, target_mbon)
# Baseline replay uses the same deterministic evaluation KC spike trains for all mechanisms.
evaluation = {}; pre_replay = {}
for es in eval_seeds:
for label, (targets, rates) in pn.items():
run = sim.run_rates(targets, rates, es, duration, collect_kc_spikes=True); evaluation[(es, label)] = run["kc_spikes"]
run["kc_spikes"].to_parquet(exp / "isolated-replay" / f"KC-spikes-{label}-seed-{es}.parquet", index=False)
pre_replay[(es, label)] = replay.run(run["kc_spikes"], zero, duration)
for ts in seeds:
delta_add = zero.copy(); em = np.ones(len(v.edge_ids), np.float32); eb = np.ones(len(v.edge_ids), np.float32); checkpoints[ts] = {}; p4l = np.load(Path(cfg["paths"]["phase4l_root"]) / "plasticity-magnitude" / f"seed-{ts}-overlays.npz")
if not np.array_equal(p4l["edge_id"], v.edge_ids): raise RuntimeError("Phase 4L additive checkpoint edge IDs differ")
for pairing in range(1, maxpair + 1):
run = sim.run_rates(*pn["ODOR_A"], ts + pairing, duration, delta=delta_add, dan_targets=dan, dan_pulses=[float(protocol["dan_time_ms"])])
training_walls.append(run["wall_seconds"]); trace = run["kc_trace_at_dan"]; elig = trace[loc].astype(np.float32); active = comp & (elig > 0)
old_m, old_b = em[active].copy(), eb[active].copy(); t0 = time.perf_counter()
delta_add, _ = apply_v2(v, trace, compartment, 1.0, delta_add, cfg)
factor = np.float32(1.0) - np.float32(k) * elig[active]; em[active] = np.maximum(np.float32(0.0), em[active] * factor)
eb[active] = np.maximum(np.float32(bound), eb[active] * factor); update_times.append(time.perf_counter() - t0)
for local, om, ob in zip(np.flatnonzero(active), old_m, old_b):
histories.append({"train_seed": ts, "pairing": pairing, "edge_id": int(v.edge_ids[local]), "eligibility": float(elig[local]),
"E_multiplicative_before": float(om), "E_multiplicative_after": float(em[local]), "E_bounded_before": float(ob), "E_bounded_after": float(eb[local])})
if pairing in points:
saved = p4l[f"pairing_{pairing}"].astype(np.float32); error = float(np.max(np.abs(saved - delta_add)))
reproduction.append({"train_seed": ts, "pairing": pairing, "max_abs_error_mv": error, "exact": bool(np.array_equal(saved, delta_add))})
if error > 1e-6: raise RuntimeError(f"Phase 4L additive training reproduction divergence seed={ts} pairing={pairing}: {error}")
checkpoints[ts][pairing] = {"additive": delta_add.copy(), "multiplicative": em.copy(), "bounded_multiplicative": eb.copy(), "eligibility_at_last_DAN": elig.copy()}
np.savez_compressed(exp / "efficacy-overlay" / f"E-seed-{ts}-pairings-{pairing}.npz", E_multiplicative=em, E_bounded_multiplicative=eb)
p4l.close()
pd.DataFrame(histories).to_parquet(exp / "efficacy-overlay/update-history.parquet", index=False)
write_json(exp / "regression/phase4l-additive-reproduction.json", {"all_passed": all(x["max_abs_error_mv"] <= 1e-6 for x in reproduction), "checks": reproduction})
if not np.all(np.isfinite([h["E_multiplicative_after"] for h in histories])) or not np.all(np.isfinite([h["E_bounded_after"] for h in histories])):
raise RuntimeError("nonfinite efficacy")
rows = []; replay_times = []
for ts, es in zip(seeds, eval_seeds):
for pairing in points:
state = checkpoints[ts][pairing]
for mechanism in MECHANISMS:
if mechanism == "additive": delta = state["additive"]; efficacy = 1.0 + delta / anatomical
else:
efficacy = state[mechanism]; delta = anatomical * (efficacy - 1.0)
if not np.all(np.isfinite(efficacy)) or np.any(efficacy < -1e-6) or np.any(efficacy > 1.0 + 1e-6): raise RuntimeError("invalid E state")
changed = np.abs(delta) > 1e-8; e_changed = efficacy[changed]; weighted_E = float(np.sum(anatomical[changed] * e_changed) / np.sum(anatomical[changed])) if np.any(changed) else 1.0
pairrow = {"train_seed": ts, "eval_seed": es, "pairings": pairing, "mechanism": mechanism, "updated_edges": int(changed.sum()),
"E_mean_all_mask": float(np.mean(efficacy)), "E_median_all_mask": float(np.median(efficacy)), "E_min_all_mask": float(np.min(efficacy)),
"E_mean_changed": float(np.mean(e_changed)) if len(e_changed) else 1.0, "E_median_changed": float(np.median(e_changed)) if len(e_changed) else 1.0,
"E_anatomical_weighted_changed": weighted_E, "effective_weight_delta_sum_mv": float(delta.sum()),
"effective_weight_reduction_percent_changed": float(100 * (1 - weighted_E)), "saturation_fraction_mask": float(np.count_nonzero(efficacy <= (bound + 1e-6)) / len(efficacy))}
result = {}
for label in ("ODOR_A", "ODOR_B"):
t0 = time.perf_counter(); post = replay.run(evaluation[(es, label)], delta, duration); replay_times.append(time.perf_counter() - t0)
result[label] = replay_effect(pre_replay[(es, label)], post, sim.dt)
pairrow.update({f"A_{k}": value for k, value in result["ODOR_A"].items() if k != "isolated_input_scope"})
pairrow.update({f"B_{k}": value for k, value in result["ODOR_B"].items() if k != "isolated_input_scope"})
pairrow["A_specific_functional"] = compare_A_B(result["ODOR_A"], result["ODOR_B"])
rows.append(pairrow)
table = pd.DataFrame(rows); table.to_parquet(exp / "isolated-replay/mechanism-comparison.parquet", index=False)
curve = []
for (mechanism, pairing), frame in table.groupby(["mechanism", "pairings"]):
curve.append({"mechanism": mechanism, "pairings": int(pairing), "seeds": int(len(frame)), "A_specific_functional_seeds": int(frame.A_specific_functional.sum()),
"E_mean_changed": float(frame.E_mean_changed.mean()), "E_median_changed": float(frame.E_median_changed.mean()), "E_anatomical_weighted_changed": float(frame.E_anatomical_weighted_changed.mean()),
"E_min_mask": float(frame.E_min_all_mask.min()), "effective_weight_reduction_percent_changed": float(frame.effective_weight_reduction_percent_changed.mean()),
"A_transmission_reduction_percent": float(frame.A_transmitted_reduction_percent.mean()), "B_transmission_reduction_percent": float(frame.B_transmitted_reduction_percent.mean()),
"A_total_KC_input_reduction_percent": float(frame.A_MBON_total_KC_input_reduction_percent.mean()), "B_total_KC_input_reduction_percent": float(frame.B_MBON_total_KC_input_reduction_percent.mean()),
"A_MBON_delta_g_max_abs_mv": float(frame.A_delta_g_max_abs_mv.mean()), "A_MBON_delta_v_max_abs_mv": float(frame.A_delta_v_max_abs_mv.mean()),
"A_MBON_spike_count_delta_mean": float(frame.A_MBON_spike_count_delta.mean()), "A_MBON_spike_L1_mean": float(frame.A_MBON_spike_L1.mean()),
"A_MBON_first_latency_delta_ms_mean": float(frame.A_first_latency_delta_ms.mean()) if frame.A_first_latency_delta_ms.notna().any() else None,
"B_MBON_spike_L1_mean": float(frame.B_MBON_spike_L1.mean()), "saturation_fraction_mask": float(frame.saturation_fraction_mask.mean())})
gate = {}; majority = int(mcfg["gates"]["seed_majority"])
for mech in MECHANISMS:
successes = [x for x in curve if x["mechanism"] == mech and x["A_specific_functional_seeds"] >= majority]
gate[mech] = {"pass": bool(successes), "first_passing_pairing": min((x["pairings"] for x in successes), default=None), "seed_majority": majority,
"endpoint_100_specific_functional_seeds": next(x["A_specific_functional_seeds"] for x in curve if x["mechanism"] == mech and x["pairings"] == 100)}
primary = gate["multiplicative"]["pass"] or gate["bounded_multiplicative"]["pass"]
report = {"status": "PASS-KC-MBON-FUNCTIONAL-TRANSFER-v2" if primary else "FAIL-KC-MBON-FUNCTIONAL-TRANSFER-v2", "presynaptic_functional_transfer_pass": primary,
"mechanism_gates": gate, "curve": curve, "same_KC_spikes_DAN_timing_mask_and_seeds": True, "phase4l_additive_reproduced": True,
"postsynaptic_branch_run": False, "no_dense_time_by_edge_state": True,
"performance": {"mean_training_brain_wall_seconds_per_pairing": float(np.mean(training_walls)), "mean_update_seconds_per_pairing": float(np.mean(update_times)),
"mean_isolated_replay_seconds": float(np.mean(replay_times)), "E_overlay_memory_bytes_two_float32_arrays": 2 * len(v.edge_ids) * 4}}
write_json(exp / "isolated-replay/summary.json", report)
return report, checkpoints, replay
def anatomy_vs_efficacy(v: Validator, sim: OdorSimulator, cfg: dict[str, Any], exp: Path, anatomical: np.ndarray,
checkpoints: dict[int, dict[int, dict[str, np.ndarray]]], mcfg: dict[str, Any]) -> dict[str, Any]:
targets = v.cand.target_neuron_idx.to_numpy(np.int32); base = v.base.detach().cpu().numpy(); positive = np.maximum(base, 0.0)
target_total = np.bincount(v.rt.indices_np, weights=positive.astype(np.float64), minlength=v.n)
frames = []
for ts in map(int, mcfg["protocol"]["train_seeds"]):
state = checkpoints[ts][100]
for mechanism in ("multiplicative", "bounded_multiplicative"):
E = state[mechanism]; frame = v.cand[["edge_id", "source_neuron_idx", "source_body_id", "target_neuron_idx", "target_body_id", "raw_synapse_count", "target_compartment_verbatim"]].copy()
frame["train_seed"] = ts; frame["mechanism"] = mechanism; frame["anatomical_weight_mv"] = anatomical; frame["E_baseline"] = 1.0; frame["E_current"] = E
frame["effective_weight_mv"] = anatomical * E; frame["target_total_positive_anatomical_input_mv"] = target_total[targets]
frame["target_MBON_total_input_fraction_static"] = anatomical * E / np.maximum(target_total[targets], 1e-12)
frame["eligibility_at_last_DAN"] = state["eligibility_at_last_DAN"]
frame["DAN_channel"] = mcfg["protocol"]["matched_dan_type"]; frames.append(frame)
out = pd.concat(frames, ignore_index=True); out.to_parquet(exp / "anatomy-vs-efficacy/anatomy-vs-efficacy.parquet", index=False)
from scipy.stats import spearmanr
by = out[(out.train_seed == int(mcfg["protocol"]["train_seeds"][0])) & (out.mechanism == "bounded_multiplicative")]
rho = spearmanr(by.raw_synapse_count, by.effective_weight_mv).statistic
report = {"rows": int(len(out)), "unique_edges": int(out.edge_id.nunique()), "raw_count_vs_effective_weight_spearman_seed1_bounded": float(rho),
"high_anatomical_count_implies_high_current_effective_in_this_assumed_model_only": bool(rho > 0.9),
"physiological_influence_inferred_from_EM_count": False, "static_fraction_is_not_dynamic_MBON_input": True}
write_json(exp / "anatomy-vs-efficacy/summary.json", report); return report
def run_wholebrain(v: Validator, sim: OdorSimulator, cfg: dict[str, Any], mcfg: dict[str, Any], exp: Path, panel: pd.DataFrame,
vectors: dict[str, np.ndarray], selection: dict[str, Any], mapping: pd.DataFrame,
anatomical: np.ndarray, checkpoints: dict[int, dict[int, dict[str, np.ndarray]]], isolated: dict[str, Any]) -> dict[str, Any]:
passed = [x for x in ("multiplicative", "bounded_multiplicative") if isolated["mechanism_gates"][x]["pass"]]
if not passed:
out = {"status": "NOT-RUN-ISOLATED-ENDPOINT-GATE-BLOCKED", "tested_mechanisms": [], "feedback_masks_memory": None}; write_json(exp / "whole-brain-replay/summary.json", out); return out
duration = float(mcfg["protocol"]["duration_ms"]); gloms = selection["glomeruli_order"]; matched = float(np.median(panel.mapped_response_sum)); pn = {}
for label in ("ODOR_A", "ODOR_B"):
oid = selection[label]["odor_id"]; pn[label] = pn_drive(oid, vectors[oid], mapping, gloms, str(mcfg["protocol"]["input_mode"]), matched, cfg)[:2]
rows = []; walls = []; zero = np.zeros(len(v.edge_ids), np.float32)
for ts, es in zip(map(int, mcfg["protocol"]["train_seeds"]), map(int, mcfg["protocol"]["evaluation_seeds"])):
baseline = {label: sim.run_rates(*pn[label], es, duration, delta=zero) for label in pn}
for mechanism in passed:
E = checkpoints[ts][100][mechanism]; delta = anatomical * (E - 1)
effects = {}
for label in pn:
post = sim.run_rates(*pn[label], es, duration, delta=delta); walls.append(post["wall_seconds"]); effects[label] = effect(baseline[label], post)
rows.append({"train_seed": ts, "eval_seed": es, "mechanism": mechanism, "odor": label, "MBON_spike_L1": effects[label]["MBON_spike_l1"],
"MBON_g_max_abs_mv": effects[label]["MBON_g_max_abs"], "MBON_v_max_abs_mv": effects[label]["MBON_v_max_abs"],
"MBON_latency_delta_ms": effects[label]["MBON_first_latency_delta_ms"], "downstream_spike_L1": effects[label]["downstream_spike_l1"],
"KC_spike_L1": int(np.abs(post["kc_counts"] - baseline[label]["kc_counts"]).sum()),
"finite": bool(post["finite"]), "active_neuron_fraction": float(np.count_nonzero(post["counts"]) / v.n), "wall_seconds": post["wall_seconds"]})
frame = pd.DataFrame(rows); frame.to_parquet(exp / "whole-brain-replay/results.parquet", index=False); gates = {}
for mechanism in passed:
sub = frame[frame.mechanism == mechanism]; a = sub[sub.odor == "ODOR_A"].sort_values("train_seed"); b = sub[sub.odor == "ODOR_B"].sort_values("train_seed")
wins = int(((a.MBON_spike_L1.to_numpy() > b.MBON_spike_L1.to_numpy()) & (a.MBON_spike_L1.to_numpy() > 0)).sum())
gates[mechanism] = {"A_specific_functional_seeds": wins, "pass": bool(wins >= int(mcfg["gates"]["seed_majority"]) and sub.finite.all() and sub.active_neuron_fraction.max() < .5),
"A_MBON_spike_L1_mean": float(a.MBON_spike_L1.mean()), "B_MBON_spike_L1_mean": float(b.MBON_spike_L1.mean()),
"A_downstream_spike_L1_mean": float(a.downstream_spike_L1.mean()), "B_downstream_spike_L1_mean": float(b.downstream_spike_L1.mean()),
"A_KC_spike_L1_mean": float(a.KC_spike_L1.mean()), "B_KC_spike_L1_mean": float(b.KC_spike_L1.mean())}
status = "PASS-WHOLE-BRAIN-KCMBON-TRANSFER" if any(x["pass"] for x in gates.values()) else "WHOLE-BRAIN-FEEDBACK-MASKS-MEMORY"
out = {"status": status, "tested_mechanisms": passed, "gates": gates, "feedback_masks_memory": status != "PASS-WHOLE-BRAIN-KCMBON-TRANSFER", "mean_post_brain_wall_seconds": float(np.mean(walls))}
write_json(exp / "whole-brain-replay/summary.json", out); return out
def conditioning_gate(cfg: dict[str, Any], mcfg: dict[str, Any], exp: Path, isolated: dict[str, Any], whole: dict[str, Any], identity: dict[str, Any]) -> dict[str, Any]:
encoder = json.loads((Path(cfg["paths"]["phase4l_root"]) / "kc-representation/summary.json").read_text()); temporal = json.loads((Path(cfg["paths"]["phase4j_root"]) / "eligibility-v2/unit-tests.json").read_text())
gates = {"OlfactoryEncoder_v1": bool(encoder["candidate_generated"]), "TemporalEligibility_v2": bool(temporal["all_passed"]),
"KC_sparse_code": bool(encoder["modes"]["physiological"]["gate"] and encoder["modes"]["matched_energy"]["gate"]),
"A_B_specific_edges": bool(identity["A_specific_eligible_edges"] > 0 and identity["B_specific_eligible_edges"] > 0),
"isolated_functional_transfer_v2": bool(isolated["presynaptic_functional_transfer_pass"]),
"whole_brain_transfer": whole["status"] == "PASS-WHOLE-BRAIN-KCMBON-TRANSFER"}
report = {"status": "OPEN" if all(gates.values()) else "NOT-RUN-GATE-BLOCKED", "gates": gates, "formal_conditioning_run": False,
"acquisition": "NOT-RUN" if not all(gates.values()) else "PENDING", "controls": "NOT-RUN" if not all(gates.values()) else "PENDING"}
write_json(exp / "conditioning/gate.json", report); return report
def integrity(cfg: dict[str, Any], mcfg: dict[str, Any], base_config: Path, exp: Path, before_hash: dict[str, str]) -> dict[str, Any]:
del mcfg
gc.collect(); torch.cuda.empty_cache(); checks = frozen_checks(cfg); data = dataset_checks(cfg); regression = phase4c_regression(cfg, base_config, exp); after = frozen_hashes(cfg)
report = {"all_passed": bool(checks["all_passed"] and data["all_passed"] and regression["all_passed"] and before_hash == after),
"frozen_checks": checks, "phase1_to_3b_dataset": data, "phase4c_reference_regression": regression,
"frozen_hashes_identical": before_hash == after, "before": before_hash, "after": after,
"base_CSR_modified": False, "APL_modified": False, "eligibility_v2_modified": False, "plastic_mask_expanded": False,
"OlfactoryEncoder_modified": False, "PlasticityAccumulation_modified": False}
write_json(exp / "audit/integrity.json", report); return report
def main() -> None:
ap = argparse.ArgumentParser(); ap.add_argument("--config", type=Path, required=True); args = ap.parse_args(); mcfg = yaml.safe_load(args.config.read_text()); base_config = Path(mcfg["frozen_phase4l_config"])
cfg = yaml.safe_load(base_config.read_text()); cfg["paths"]["phase4l_root"] = cfg["paths"]["experiment_root"]; cfg["paths"]["phase4l_model_root"] = mcfg["frozen_phase4l_config"].rsplit("/", 1)[0]
exp, model = Path(mcfg["experiment_root"]), Path(mcfg["model_root"])
for sub in ("literature-audit", "anatomical-weight", "efficacy-overlay", "presynaptic", "postsynaptic", "anatomy-vs-efficacy", "isolated-replay", "whole-brain-replay", "conditioning", "controls", "performance", "regression", "audit", "manifests", "compiler-reports/extension-build"):
(exp / sub).mkdir(parents=True, exist_ok=True)
model.mkdir(parents=True, exist_ok=True)
if not (exp / "literature-audit/phase4m_literature_audit.json").is_file(): raise RuntimeError("literature audit must predate model implementation")
prior = frozen_checks(cfg); before_hash = frozen_hashes(cfg); write_json(exp / "audit/frozen-before.json", {"checks": prior, "hashes": before_hash})
shutil.copy2(args.config, exp / "audit/phase4m.yaml"); shutil.copy2(Path(__file__).resolve(), exp / "audit/phase4m.py")
panel, vectors, selection, mapping = load_odor_inputs(cfg); v = Validator(cfg, base_config, exp); sim = OdorSimulator(v, cfg, exp); raw, anatomical = anatomical_audit(v, cfg, exp)
isolated, checkpoints, replay = main_experiment(v, sim, cfg, mcfg, exp, panel, vectors, selection, mapping, anatomical)
anatomy = anatomy_vs_efficacy(v, sim, cfg, exp, anatomical, checkpoints, mcfg)
post = {"status": mcfg["postsynaptic"]["current_status"], "branch_defined": True, "run": False,
"reason": "postsynaptic nAChR evidence exists in adult Drosophila, but a quantitative rule for exact MaleCNS y5B'2a target and its receptor map is unavailable",
"combined_presynaptic_postsynaptic_run": False, "global_MBON_threshold_modified": False}
write_json(exp / "postsynaptic/summary.json", post)
whole = run_wholebrain(v, sim, cfg, mcfg, exp, panel, vectors, selection, mapping, anatomical, checkpoints, isolated)
edge_identity = json.loads((Path(cfg["paths"]["phase4l_root"]) / "eligible-edges/summary.json").read_text())
formal = conditioning_gate(cfg, mcfg, exp, isolated, whole, edge_identity)
# Formal conditioning implementation is intentionally gated separately: this
# diagnostic run never creates a memory claim from the efficacy comparison.
if formal["status"] == "OPEN":
formal["status"] = "NOT-RUN-IMPLEMENTATION-REQUIRES-CONTROLLED-FORMAL-PROTOCOL"
formal["formal_conditioning_run"] = False
formal["acquisition"] = "NOT-RUN"
formal["controls"] = "NOT-RUN"
write_json(exp / "conditioning/gate.json", formal)
controls = {"isolated_neutral_B": "RUN", "matched_seed_same_KC_spikes": "RUN", "D_zero": "analytic identity E=1, no dopamine update", "random_reward": "NOT-RUN-FORMAL-CONDITIONING-BLOCKED", "unrelated_DAN": "NOT-RUN-FORMAL-CONDITIONING-BLOCKED", "frozen_no_plasticity": "isolated E=1 reference replay"}
write_json(exp / "controls/summary.json", controls)
checkpoints_bytes = sum(p.stat().st_size for p in (exp / "efficacy-overlay").glob("E-seed-*.npz")); performance = isolated["performance"] | {"overlay_checkpoint_bytes_total": checkpoints_bytes,
"peak_RAM_kib": int(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss), "peak_VRAM_bytes": int(torch.cuda.max_memory_allocated()),
"whole_brain_mean_post_wall_seconds": whole.get("mean_post_brain_wall_seconds"), "dense_time_by_edge_state": False}
write_json(exp / "performance/summary.json", performance)
candidates = {"KCMBON-SynapticEfficacy-v1": True, "PresynapticEfficacy-v1": True,
"KCMBON-FunctionalTransfer-v2": bool(isolated["presynaptic_functional_transfer_pass"]), "MaleCNS-OlfactoryAssociativeMemory-v1-candidate": False}
del sim, v, replay, checkpoints; integrity_report = integrity(cfg, mcfg, base_config, exp, before_hash)
summary = {"phase": "4M", "literature_audit": "literature-audit/phase4m_literature_audit.json", "E_math": mcfg["mechanisms"], "anatomical": json.loads((exp / "anatomical-weight/summary.json").read_text()),
"isolated": isolated, "postsynaptic": post, "anatomy_vs_efficacy": anatomy, "whole_brain": whole, "conditioning": formal, "controls": controls,
"performance": performance, "candidates": candidates, "integrity": integrity_report, "phase4n_started": False}
write_json(exp / "audit/final-summary.json", summary); shutil.copy2(args.config, model / "phase4m.yaml"); shutil.copy2(Path(__file__).resolve(), model / "phase4m.py"); shutil.copy2(exp / "literature-audit/phase4m_literature_audit.json", model / "literature-audit.json")
write_json(model / "VERSION.json", {"name": mcfg["name"], "candidates": candidates, "summary_sha256": sha256(exp / "audit/final-summary.json"), "base_CSR_read_only": True})
seal(model, model / "MANIFEST.json", model / "checksums.sha256"); seal(exp, exp / "manifests/manifest.json", exp / "manifests/checksums.sha256")
print(json.dumps({"phase": "4M", "isolated": isolated["status"], "whole_brain": whole["status"], "conditioning": formal["status"], "integrity": integrity_report["all_passed"]}, indent=2)); sys.stdout.flush()
if __name__ == "__main__": main()
@@ -0,0 +1,59 @@
phase: 4M
name: KCMBON-SynapticEfficacy-v1
frozen_phase4l_config: /data/digital-drosophila/models/male-cns-lif/olfactory-grounding-v1/phase4l.yaml
experiment_root: /data/digital-drosophila/experiments/phase4m-kcmbon-efficacy
model_root: /data/digital-drosophila/models/male-cns-lif/kcmbon-efficacy-v1
mechanisms:
additive:
label: Phase4L-additive-delta-weight-baseline
update: frozen Phase4J apply_v2, including its pre-existing 25 percent per-edge floor
multiplicative:
label: PresynapticEfficacy-v1
update: E_new = max(0, E_old * (1 - eta_effective_mv / W_syn_mv_per_contact * D * eligibility))
interpretation: engineering per-anatomical-contact efficacy conversion, not measured release probability
bounded_multiplicative:
label: KCMBON-SynapticEfficacy-v1
update: E_new = max(0.75, E_old * (1 - eta_effective_mv / W_syn_mv_per_contact * D * eligibility))
lower_bound_provenance: frozen Phase4J max_fractional_depression 0.25
protocol:
pairing_counts: [1, 2, 5, 10, 20, 50, 100]
train_seeds: [51201, 51202, 51203, 51204, 51205]
evaluation_seeds: [51301, 51302, 51303, 51304, 51305]
target_compartment_verbatim: "y5B'2a"
matched_dan_type: PAM15
unrelated_compartment_verbatim: "y2a'1"
unrelated_dan_type: PPL103
dan_time_ms: 90.0
duration_ms: 120.0
formal_training_pairings: 100
forced_odor: ODOR_A
neutral_odor: ODOR_B
input_mode: physiological
no_random_terminal_heterogeneity: true
gates:
seed_majority: 3
functional_direction: MBON spike decrease or first-spike latency increase in A; B must not show equal-or-greater change
selection: evaluate every predeclared pairing count; formal whole-brain test uses the predeclared 100-pairing endpoint only
no_functional_gate_on_g_alone: true
postsynaptic:
branch_name: MBON-PostsynapticPlasticity-v1
current_status: AUDIT-ONLY-NOT-RUN-COMPARTMENT-SPECIFIC-QUANTITATIVE-RULE-UNKNOWN
never_modify_global_threshold: true
prohibitions:
change_base_CSR: false
change_edge_existence: false
change_raw_synapse_count: false
change_global_Wsyn: false
change_transmitter_sign: false
change_LIF: false
change_APL: false
change_eligibility_v2: false
change_olfactory_encoder: false
expand_plastic_mask: false
tune_from_phase4k_5_percent: false
formal_conditioning_before_transfer_gates: false
@@ -0,0 +1,75 @@
#!/usr/bin/env python3
"""Seal Phase 4M after run-log closure and qualify whole-brain causal language."""
from __future__ import annotations
import argparse
import json
import shutil
import subprocess
from pathlib import Path
import numpy as np
import pandas as pd
import yaml
from phase4h_audit import sha256, write_json
from phase4k import seal
from phase4m import frozen_checks, frozen_hashes
def main() -> None:
parser = argparse.ArgumentParser(); parser.add_argument("--config", type=Path, required=True); args = parser.parse_args(); mcfg = yaml.safe_load(args.config.read_text())
bpath = Path(mcfg["frozen_phase4l_config"]); cfg = yaml.safe_load(bpath.read_text()); cfg["paths"]["phase4l_root"] = cfg["paths"]["experiment_root"]; cfg["paths"]["phase4l_model_root"] = str(bpath.parent)
exp, model = Path(mcfg["experiment_root"]), Path(mcfg["model_root"]); summary_path = exp / "audit/final-summary.json"; summary = json.loads(summary_path.read_text())
if not summary["integrity"]["all_passed"]: raise RuntimeError("Phase 4M completion integrity was not PASS")
checks = frozen_checks(cfg)
if frozen_hashes(cfg) != summary["integrity"]["after"]: raise RuntimeError("frozen input changed after Phase 4M run")
whole = summary["whole_brain"]; whole["operational_gate_label_only"] = True
whole["feedback_causally_isolated_by_this_experiment"] = False
whole["interpretation"] = ("The prescribed WHOLE-BRAIN-FEEDBACK-MASKS-MEMORY label denotes isolated transfer PASS with whole-brain A/B specificity FAIL. "
"It does not prove feedback is the unique cause; shared plastic edges and baseline network input may also contribute.")
frame = pd.read_parquet(exp / "whole-brain-replay/results.parquet")
whole["endpoint_100_KC_recruitment_change"] = {mech: {odor: float(part.KC_spike_L1.mean()) for odor, part in group.groupby("odor")}
for mech, group in frame.groupby("mechanism")}
edge = pd.read_parquet(Path(cfg["paths"]["phase4l_root"]) / "eligible-edges/edge-identity.parquet")
categories = edge.odor_eligibility_category.astype(str).to_numpy(); static = {}; seed_rows = []
for seed in map(int, mcfg["protocol"]["train_seeds"]):
data = np.load(exp / "efficacy-overlay" / f"E-seed-{seed}-pairings-100.npz")
for mech, key in (("multiplicative", "E_multiplicative"), ("bounded_multiplicative", "E_bounded_multiplicative")):
E = data[key]
for cat in ("A-specific", "B-specific", "shared", "inactive"):
sel = categories == cat; seed_rows.append({"seed": seed, "mechanism": mech, "edge_category": cat,
"changed_edges": int(np.count_nonzero(E[sel] < 1 - 1e-7)), "E_reduction_mean": float((1 - E[sel]).mean()) if sel.any() else 0.0,
"E_reduction_sum": float((1 - E[sel]).sum())})
data.close()
audit = pd.DataFrame(seed_rows); audit.to_parquet(exp / "whole-brain-replay/endpoint-E-identity.parquet", index=False)
for mech, group in audit.groupby("mechanism"):
static[mech] = {cat: {"changed_edges_mean": float(g.changed_edges.mean()), "E_reduction_mean": float(g.E_reduction_mean.mean()),
"E_reduction_sum_mean": float(g.E_reduction_sum.mean())} for cat, g in group.groupby("edge_category")}
whole["endpoint_100_E_identity"] = static
whole["direct_feedback_vs_shared_edge_causal_disambiguation"] = "NOT-ESTABLISHED; no feedback edge ablation was authorized"
write_json(exp / "whole-brain-replay/summary.json", whole); summary["whole_brain"] = whole
iso = summary["isolated"]; iso["functional_transfer_gate_scope"] = "PASS at one or more predeclared pairing checkpoints, not necessarily retained at 100 pairings"
iso["endpoint_100_majority_pass"] = {mech: bool(gate["endpoint_100_specific_functional_seeds"] >= int(mcfg["gates"]["seed_majority"]))
for mech, gate in iso["mechanism_gates"].items()}
iso["nonmonotonic_functional_output_despite_monotonic_E_depression"] = True
write_json(exp / "isolated-replay/summary.json", iso); summary["isolated"] = iso
summary["integrity"]["postrun_frozen_recheck_passed"] = checks["all_passed"]
write_json(summary_path, summary)
version = json.loads((model / "VERSION.json").read_text()); version["summary_sha256"] = sha256(summary_path); write_json(model / "VERSION.json", version)
write_json(exp / "audit/post-run-qualification.json", {"only_phase4m_reports_edited": True, "brain_rerun": False,
"run_log_sealed_after_process_exit": True, "whole_brain_feedback_label_is_operational_not_causal_proof": True,
"frozen_recheck_passed": checks["all_passed"]})
shutil.copy2(Path(__file__).resolve(), exp / "audit/phase4m_finalize.py"); shutil.copy2(Path(__file__).resolve(), model / "phase4m_finalize.py")
seal(model, model / "MANIFEST.json", model / "checksums.sha256")
seal(exp, exp / "manifests/manifest.json", exp / "manifests/checksums.sha256")
for root, checksum in ((model, "checksums.sha256"), (exp, "manifests/checksums.sha256")):
check = subprocess.run(["sha256sum", "-c", checksum], cwd=root, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True)
if check.returncode: raise RuntimeError(f"self-checksum failure {root}: {check.stderr[-1000:]}")
print(json.dumps({"frozen": checks["all_passed"], "model_SHA256": "PASS", "experiment_SHA256": "PASS",
"endpoint_100_isolated_majority": iso["endpoint_100_majority_pass"]}))
if __name__ == "__main__": main()
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""Paired read-only 120-ms baseline versus efficacy-overlay runtime timing."""
from __future__ import annotations
import argparse
import json
import shutil
import subprocess
import time
from pathlib import Path
import numpy as np
import pandas as pd
import torch
import yaml
from phase4h_audit import sha256, write_json
from phase4i import Validator
from phase4k import seal
from phase4l import OdorSimulator, pn_drive
from phase4m import frozen_checks, frozen_hashes, load_odor_inputs
def main() -> None:
ap = argparse.ArgumentParser(); ap.add_argument("--config", type=Path, required=True); args = ap.parse_args(); mcfg = yaml.safe_load(args.config.read_text()); bpath = Path(mcfg["frozen_phase4l_config"]); cfg = yaml.safe_load(bpath.read_text()); cfg["paths"]["phase4l_root"] = cfg["paths"]["experiment_root"]; cfg["paths"]["phase4l_model_root"] = str(bpath.parent)
exp, model = Path(mcfg["experiment_root"]), Path(mcfg["model_root"]); summary_path = exp / "audit/final-summary.json"; summary = json.loads(summary_path.read_text()); before = frozen_hashes(cfg)
panel, vectors, selection, mapping = load_odor_inputs(cfg); v = Validator(cfg, bpath, exp); sim = OdorSimulator(v, cfg, exp)
oid = selection["ODOR_A"]["odor_id"]; targets, rates, _ = pn_drive(oid, vectors[oid], mapping, selection["glomeruli_order"], str(mcfg["protocol"]["input_mode"]), float(np.median(panel.mapped_response_sum)), cfg)
duration = float(mcfg["protocol"]["duration_ms"]); zero = np.zeros(len(v.edge_ids), np.float32); records = []
sim.run_rates(targets, rates, 51999, duration, delta=zero)
for ts, es in zip(map(int, mcfg["protocol"]["train_seeds"]), map(int, mcfg["protocol"]["evaluation_seeds"])):
with np.load(exp / "efficacy-overlay" / f"E-seed-{ts}-pairings-100.npz") as state:
E = state["E_bounded_multiplicative"].copy()
delta = v.base_candidate.astype(np.float32) * (E - 1.0)
for label, weights in (("baseline", zero), ("bounded_E100", delta)):
t0 = time.perf_counter(); run = sim.run_rates(targets, rates, es, duration, delta=weights); total = time.perf_counter() - t0
records.append({"train_seed": ts, "eval_seed": es, "condition": label, "brain_loop_seconds": run["wall_seconds"],
"total_call_seconds_including_overlay_install_and_PN_generation": total,
"PN_event_generation_seconds": run["pn_generation_wall_seconds"], "APL_submit_seconds": run["overlay_cpu_submit_seconds"],
"peak_VRAM_bytes": run["peak_vram_bytes"], "finite": run["finite"]})
frame = pd.DataFrame(records); frame.to_parquet(exp / "performance/paired-overlay-runtime.parquet", index=False); base = frame[frame.condition == "baseline"].sort_values("train_seed"); post = frame[frame.condition == "bounded_E100"].sort_values("train_seed")
loop_overhead = post.brain_loop_seconds.to_numpy() - base.brain_loop_seconds.to_numpy(); total_overhead = post.total_call_seconds_including_overlay_install_and_PN_generation.to_numpy() - base.total_call_seconds_including_overlay_install_and_PN_generation.to_numpy()
report = {"biological_duration_ms": duration, "trial": "frozen ODOR_A 120 ms, paired evaluation seed, no dopamine or learning",
"baseline_loop_seconds_mean": float(base.brain_loop_seconds.mean()), "bounded_E100_loop_seconds_mean": float(post.brain_loop_seconds.mean()),
"loop_overhead_seconds_mean": float(loop_overhead.mean()), "loop_overhead_percent_mean": float(100 * np.mean(loop_overhead / base.brain_loop_seconds.to_numpy())),
"baseline_total_call_seconds_mean": float(base.total_call_seconds_including_overlay_install_and_PN_generation.mean()),
"bounded_E100_total_call_seconds_mean": float(post.total_call_seconds_including_overlay_install_and_PN_generation.mean()),
"total_call_overhead_seconds_mean": float(total_overhead.mean()), "mean_peak_VRAM_bytes": float(frame.peak_VRAM_bytes.mean()),
"five_paired_seeds": True, "numeric_results_not_reused_for_gates": True, "all_finite": bool(frame.finite.all())}
write_json(exp / "performance/paired-overlay-summary.json", report); summary["performance"]["paired_overlay_runtime"] = report
write_json(exp / "performance/summary.json", summary["performance"]); write_json(summary_path, summary)
version = json.loads((model / "VERSION.json").read_text()); version["summary_sha256"] = sha256(summary_path); write_json(model / "VERSION.json", version)
shutil.copy2(Path(__file__).resolve(), exp / "audit/phase4m_performance.py"); shutil.copy2(Path(__file__).resolve(), model / "phase4m_performance.py")
if frozen_hashes(cfg) != before or not frozen_checks(cfg)["all_passed"]: raise RuntimeError("frozen integrity failed after performance audit")
seal(model, model / "MANIFEST.json", model / "checksums.sha256"); seal(exp, exp / "manifests/manifest.json", exp / "manifests/checksums.sha256")
for root, checksum in ((model, "checksums.sha256"), (exp, "manifests/checksums.sha256")):
p = subprocess.run(["sha256sum", "-c", checksum], cwd=root, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True)
if p.returncode: raise RuntimeError(f"Phase 4M self checksum failed for {root}: {p.stderr[-1000:]}")
print(json.dumps({"performance": report, "model_and_experiment_SHA256": "PASS"}, indent=2))
if __name__ == "__main__": main()