Files
digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_plan.py
T
2026-09-30 21:00:33 +08:00

200 lines
11 KiB
Python

"""Pure normal-only adapter of the AO-pinned, master-20260930 inventory.
No sampling, brain execution, file writes, biological identity certification,
or execution authorization. Import reads and SHA-checks six frozen sources.
The trial argument must reproduce the ORIGINAL AO saved-file bytes under its
documented JSON encoding. The evaluation argument is a new exact expansion of
the old pinned policy, NOT an independently archived AO evaluation artifact.
Physical inputs, actual DAN mapping, checkpoints, model and process receipts
remain the registering executor's responsibility. No scientific gate changes.
"""
from __future__ import annotations
import builtins
from collections import Counter
import hashlib
import json
from pathlib import Path
import types
SCHEMA = "normal-conditioning-plan-v1"
MASTER = 20260930
AO_TRIAL_FILE_SHA256 = "a7bda850ee87df4d9f647994e1a1a4074dfea5793184edb1822ab3d8c02e8216"
AO_REGISTRATION_SHA256 = "9e2ed05879ce279da7dc0b4cac09a44d67665c230b56db94e2ca39c645bdc250"
AP_REGISTRATION_SHA256 = "02a03b536a9f14196ad4b92fa9565b592732c6c863e72eeaee89b3b0ea8ed37d"
AO_TRIAL_PATH = "/data/digital-drosophila/experiments/phase4ao-conditioning-interface/protocol/full-trial-plan.json"
FROZEN_DIRECTORY = Path(__file__).resolve().parent.parent / "olfactory-conditioning-lab-v1"
SOURCE_PINS = {
"seed_registry.py": "0da033b132095ec3087b5d9f64e53c2e391fa50ab0b7653b31296eeb84799b7e",
"trial_plan.py": "6fed3f494d075339a7e5b001d43b2598640b189e038952fbd4d41200bacac587",
"evaluation_plan.py": "991c813ff3322b230947f302b12b04ec382c3b632817f94b698101e4b17efa7d",
"evaluation_policy.py": "21331a9ff3567dc6f6399e16bb91ef486d74231f5db51799beb6dd1bf71d022b",
"PROTOCOL_DRAFT.md": "8ebecb1f3d012ddc29a1cb727269dd277629c53565e09978bf9dbf7140cb8508",
"EVALUATION_POLICY_DRAFT.md": "a84170a61564715a1532f20df4c6a330f0f9725c383db48b8f3e1a4b5fba0bc8",
}
def _require(condition, message):
if not condition:
raise ValueError(message)
def _canonical(value):
return json.dumps(value, sort_keys=True, separators=(",", ":"),
ensure_ascii=False, allow_nan=False)
def _sha(value):
return hashlib.sha256(_canonical(value).encode("utf-8")).hexdigest()
def _load_frozen():
"""Private module graph; never change sys.path or ordinary module caches."""
sources = {}
for filename, expected in SOURCE_PINS.items():
raw = (FROZEN_DIRECTORY / filename).read_bytes()
_require(hashlib.sha256(raw).hexdigest() == expected,
"Frozen source pin mismatch: " + filename)
sources[filename] = raw
modules = {}
ordinary_import = builtins.__import__
def private_import(name, globals=None, locals=None, fromlist=(), level=0):
if level == 0 and name in modules:
return modules[name]
return ordinary_import(name, globals, locals, fromlist, level)
for name in ("seed_registry", "trial_plan", "evaluation_plan", "evaluation_policy"):
module = types.ModuleType("_normal_frozen_" + name)
module.__file__ = str(FROZEN_DIRECTORY / (name + ".py"))
module.__dict__["__builtins__"] = dict(vars(builtins), __import__=private_import)
exec(compile(sources[name + ".py"], module.__file__, "exec"), module.__dict__)
modules[name] = module
return modules
_FROZEN = _load_frozen()
def _validate_original_trial(trial):
_require(type(trial) is dict and set(trial) ==
{"plan", "seed_manifest", "budget", "payload_sha256"}, "Full original trial payload required")
_require(type(trial["plan"]["master"]) is int and trial["plan"]["master"] == MASTER,
"Original AO master is fixed; no seed selection")
# This is the exact LF serialization used by AO engineering_prepare.save.
# Its registered file pin is stronger than reconstructing with a new seed.
encoded = json.dumps(trial, sort_keys=True, indent=2, ensure_ascii=False,
allow_nan=False) + "\n"
_require(hashlib.sha256(encoded.encode("utf-8")).hexdigest() == AO_TRIAL_FILE_SHA256,
"Trial does not reproduce the AO registered full-trial-plan file")
_require(_sha({k: v for k, v in trial.items() if k != "payload_sha256"}) ==
trial["payload_sha256"], "Original trial self-hash mismatch")
def _expand_validated_trial(trial):
# Private frozen assembly is safe AFTER the exact archived-file pin above;
# avoid the old public APIs' redundant 68,000-epoch trial reconstruction.
policy = _FROZEN["evaluation_policy"]._assemble(trial)
return _FROZEN["evaluation_plan"]._assemble(trial, policy["config"])
def expand_pinned_evaluation(full_trial_payload):
"""Expand the fixed historical policy; no new choices or sampled inputs."""
_validate_original_trial(full_trial_payload)
return _expand_validated_trial(full_trial_payload)
def build_normal_plan(full_trial_payload, full_evaluation_payload):
"""Return 33,920 ordered tasks; caller supplies both complete authorities."""
trial, evaluation = full_trial_payload, full_evaluation_payload
_validate_original_trial(trial)
expected_evaluation = _expand_validated_trial(trial)
_require(_canonical(evaluation) == _canonical(expected_evaluation),
"Evaluation must exactly expand the AO-pinned evaluation policy")
snapshots = {(s["block_id"], s["arm"], s["completed_epochs"]): s
for s in evaluation["snapshots"] if s["assay"] == "normal"}
probes = {(p["snapshot_id"], p["cue"]): p
for p in evaluation["probes"] if p["assay"] == "normal"}
tasks, inputs, blocks = [], [], []
for block in trial["plan"]["blocks"]:
common = dict(block_id=block["block_id"], mode=block["mode"], dan_type=block["dan_type"],
compartment_verbatim=block["compartment_verbatim"],
reinforced_cue=block["initial_reinforced_cue"], replicate=block["replicate"],
assay="normal", steps=1200, artifact_validation_required=True)
blocks.append(dict(common, DAN_target_binding=block["DAN_target_binding"]))
for cue in ("A", "B"):
sid = block["block_id"] + "/normal/paired/checkpoint-00"
inputs.append(dict(block_id=block["block_id"], cue=cue, **probes[(sid, cue)]["input"]))
suite = next(s for s in block["suites"] if s["assay"] == "normal")
for arm in suite["arms"]:
name = arm["arm"]
delta = dict(arm["delta_start"])
def append_probes(completed):
snapshot = snapshots.get((block["block_id"], name, completed))
if snapshot is None:
return
_require(snapshot["delta_source"] == delta, "Snapshot delta dependency differs")
for cue in ("A", "B"):
recipe = probes[(snapshot["snapshot_id"], cue)]
tasks.append(dict(common, kind="probe", arm=name, task_id=recipe["probe_id"],
probe_id=recipe["probe_id"], snapshot_id=snapshot["snapshot_id"],
checkpoint=snapshot["checkpoint"], completed_epochs=completed,
evaluation_input_id=recipe["input"]["input_id"], delta_dependency=dict(delta),
delta_output_id=None, neural_state_policy="common_frozen_reset_independent_probe",
carry_between_epochs=[], original_E_required=False, cpu_validation_required=False,
feedback_to_training_or_idle=False, recipe=recipe, snapshot_binding=snapshot,
source_binding=dict(payload_sha256=evaluation["payload_sha256"],
record_id=recipe["probe_id"], record_sha256=_sha(recipe))))
append_probes(0)
for completed, epoch in enumerate(arm["epochs"], 1):
tasks.append(dict(common, kind="train", arm=name, task_id=epoch["epoch_id"],
epoch_id=epoch["epoch_id"], epoch_index=epoch["epoch_index"],
delta_dependency=dict(delta), delta_output_id=epoch["epoch_id"] + "/delta-after",
neural_state_policy=epoch["initial_neural_state"],
carry_between_epochs=list(arm["carry_between_epochs"]),
original_E_required=True, cpu_validation_required=True,
feedback_to_training_or_idle=True, recipe=epoch,
source_binding=dict(payload_sha256=trial["payload_sha256"],
record_id=epoch["epoch_id"], record_sha256=_sha(epoch))))
delta = dict(kind="epoch_delta_after", source=epoch["epoch_id"] + "/delta-after")
append_probes(completed)
counts = Counter(row["kind"] for row in tasks)
_require(counts == {"train": 30000, "probe": 3920} and len(inputs) == 80 and len(blocks) == 40,
"Normal inventory changed")
_require(len({t["task_id"] for t in tasks}) == len(tasks), "Task IDs must be unique")
result = dict(schema=SCHEMA, master=MASTER, assay="normal", blocks=blocks,
tasks=tasks, evaluation_inputs=inputs,
inventory=dict(blocks=40, training_replicates_per_cell=5, arms_per_block=7,
nominal_reinforcements=50, checkpoints=[0, 1, 2, 5, 10, 20, 50],
train_calls=30000, probe_calls=3920, brain_calls=33920,
original_E_calls=30000, training_cpu_validation_calls=30000,
brain_steps=40704000, biological_seconds=4070.4, evaluation_inputs=80,
baseline_execution="execute_each_snapshot", baseline_output_deduplication=False),
provenance=dict(trial_payload_sha256=trial["payload_sha256"],
seed_manifest_sha256=trial["seed_manifest"]["payload_sha256"],
evaluation_payload_sha256=evaluation["payload_sha256"],
evaluation_config_sha256=evaluation["config_sha256"],
ao_trial_file_sha256=AO_TRIAL_FILE_SHA256, ao_trial_path=AO_TRIAL_PATH,
ao_registration_sha256=AO_REGISTRATION_SHA256, ap_registration_sha256=AP_REGISTRATION_SHA256,
frozen_source_sha256=SOURCE_PINS,
evaluation_authority="exact expansion of AO-pinned policy; not a historical saved evaluation artifact",
external_inputs_mapping_processes_and_physical_source_files_verified=False),
execution_authorized=False, inputs_generated=False, new_seed_streams=0,
learning_pass_claimed=False, subsequent_assays_included=False)
result["payload_sha256"] = _sha(result)
# No returned nested structure aliases either caller argument or module pins.
return json.loads(_canonical(result))
def validate_normal_plan(payload, full_trial_payload, full_evaluation_payload):
"""Fail closed even if a modified plan has been given a fresh self-hash."""
_require(type(payload) is dict and "payload_sha256" in payload, "Normal payload required")
_require(_sha({k: v for k, v in payload.items() if k != "payload_sha256"}) ==
payload["payload_sha256"], "Normal plan self-hash mismatch")
expected = build_normal_plan(full_trial_payload, full_evaluation_payload)
_require(_canonical(payload) == _canonical(expected), "Normal plan exact reconstruction mismatch")
return True