Seal Phase 4AN exact continuation engineering evidence
This commit is contained in:
+13
-1
@@ -4,6 +4,16 @@
|
|||||||
|
|
||||||
## 最近已封存结果
|
## 最近已封存结果
|
||||||
|
|
||||||
|
Phase 4AN:**PASS-EXACT-LIGHT-CONTINUATION-ENGINEERING-NOT-LEARNING**。
|
||||||
|
|
||||||
|
固定 zero/static25 输入下,32/32 次运行及 74 项比较通过;分段续跑保留精确事件、末态和延迟队列,独立 CSR 审计覆盖真实非零跨段到达。AM 双封存及 28 套旧完整性记录再次通过。没有训练,未生成 learned candidate;结论只覆盖注册的 100 ms 输入及固定切点,不是普遍动力学证明。
|
||||||
|
|
||||||
|
light 的 100 ms 核心模拟约 2.15–2.19 s,单条输出约 2.60 MB,尚未达到实时。整个 32-call 执行流程约 433.97 s;首次编译、校验和保存都包含在该流程时间内。
|
||||||
|
|
||||||
|
[AN 结果及预算边界](docs/progress/phase4an-interpretation.md)。注册 SHA:`7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945`;实验 manifest SHA:`e8952a48cd3ea6a93c811a1183a1f7b79e19646299924e7688e5f393737a9aa2`。
|
||||||
|
|
||||||
|
## 全脑固定权重接口
|
||||||
|
|
||||||
Phase 4AM:**PASS-EXACT-WHOLEBRAIN-PLASTIC-INTERFACE-NOT-LEARNING**。
|
Phase 4AM:**PASS-EXACT-WHOLEBRAIN-PLASTIC-INTERFACE-NOT-LEARNING**。
|
||||||
|
|
||||||
独立建立 D18 whole-brain plastic-overlay 接口,不覆盖或替换旧 reference/runtime。
|
独立建立 D18 whole-brain plastic-overlay 接口,不覆盖或替换旧 reference/runtime。
|
||||||
@@ -32,7 +42,9 @@ Phase 4AK D18 表征验证 PASS 原样保留。1.8 ms 为工程 APL 时序假设
|
|||||||
|
|
||||||
## 当前准备与学习边界
|
## 当前准备与学习边界
|
||||||
|
|
||||||
Phase 4AN 工程计划仍为 **UNREGISTERED**:32 calls / 11,074 ticks,拟比较精简报告运行及 checkpoint 连续性。实际脑运行数为 **0**。学习草案未登记,没有候选;这些工程测试不是条件化实验。
|
Phase 4AN 的有限工程门已封存;21 份实际使用源码已按 SHA 锁定,lab 整个目录未封存。科学学习草案仍未登记,没有候选;工程测试不是条件化实验。
|
||||||
|
|
||||||
|
完整 conditioning 草案已有 68,000 epochs 与合计 10,760 生物秒(含 idle),但 evaluation/probe 库存未完整。按当前 100 ms 样本算术外推,仅核心模拟约 64–66 小时,不能直接作为完整工期或预算。先补齐评估/控制/保持集成与有限预算,再登记小规模机制验证,不直接启动大批量训练。
|
||||||
|
|
||||||
目标仍是“学习可以使用”,当前没有达到。接口验证或静态权重效果不能替代真实条件化。
|
目标仍是“学习可以使用”,当前没有达到。接口验证或静态权重效果不能替代真实条件化。
|
||||||
后续须预注册固定 olfactory A/B、具体 DAN type/compartment、至少五个互不重叠训练种子流及独立 evaluation streams;保留原 eligibility-v2、人工 US 与实际 DAN 放电的明确区分,以及配对/控制、反转、延迟奖励、保持等功能验证。
|
后续须预注册固定 olfactory A/B、具体 DAN type/compartment、至少五个互不重叠训练种子流及独立 evaluation streams;保留原 eligibility-v2、人工 US 与实际 DAN 放电的明确区分,以及配对/控制、反转、延迟奖励、保持等功能验证。
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Phase 4AN — 有限轻记录与连续状态工程验证
|
||||||
|
|
||||||
|
日期:2026-09-30。正式状态:`PASS-EXACT-LIGHT-CONTINUATION-ENGINEERING-NOT-LEARNING`。
|
||||||
|
|
||||||
|
这是独立 D18 分支上的有限运行器验证,不是学习、记忆保持或生理模型通过。全部注册的 32 次 GPU 调用已执行,74 项比较通过;最终重新计算分析结果完全相同,AM 双封存与 28 套旧完整性记录运行后通过。AN 没有重新执行五组旧 reference,而是保留 AM 本轮已重新运行并通过的封存证据。
|
||||||
|
|
||||||
|
## 固定范围
|
||||||
|
|
||||||
|
166,700 neurons、25,582,938 edges,原图和 mask 不变。只使用 AM 原计划第一条 primary 的 100 ms 输入及其精确切片,分别保持 `zero`、`static25` 固定 overlay;没有新抽气味/seed、训练或试验内权重更新。
|
||||||
|
|
||||||
|
每个 overlay 包括完整 reference、两次完整 light、三个 reference 前缀,以及 reference/light 各一条段长 `[5,13,1,481,500]` 的连续链。共 11,074 ticks、1.1074 累计生物秒。完整执行流程墙时 433.968245 秒,包括首次编译、校验、进程启动、保存与续跑封存,不包括之后的分析和最终封存。
|
||||||
|
|
||||||
|
## 一致性与非空覆盖
|
||||||
|
|
||||||
|
两种 overlay 的完整新 reference 与各自 AM 输出精确一致。完整 light、技术重复和分段链的事件、计数、最终 V/g/ref、APL 末态、规范化 spike ring 和 APL pending 均符合注册比较。reference 另比较完整逐步状态哈希、APL history 和队列,并用原 CSR 独立重建队列顺序、接受掩码、局部时钟哈希和不应期状态。
|
||||||
|
|
||||||
|
两种 overlay 均有真实跨切点且非零权重、被接受的突触到达。例如 canonical edge 783780:source neuron_idx 522 在 tick 7 发放,target neuron_idx 82 在 tick 25 接收到达,跨过 tick 18 切点;原 SI effective weight 为 0.006875 V。该记录仅证明测试覆盖真实 carry,不证明唯一因果或生物学必要性。另核实同一预定切点存在 spike carry 与非零 APL pending。
|
||||||
|
|
||||||
|
light 不记录完整逐步 V/g/ref/APL/队列 history,未将缺失观测补为零或假称逐步浮点全量独立验证。该结论只适用于本次固定输入、固定 overlay 和预定切点,不是所有气味、任意长度或任意 parent 状态的普遍等价证明。
|
||||||
|
|
||||||
|
## 实测成本
|
||||||
|
|
||||||
|
| 100 ms 完整试验 | reference | light |
|
||||||
|
|---|---:|---:|
|
||||||
|
| 核心模拟墙时 | 5.456–5.509 s | 2.153–2.192 s |
|
||||||
|
| 每条封存输出 | 35.688–35.697 MB | 2.597–2.606 MB |
|
||||||
|
| 分配显存峰值 | 518,003,712 bytes | 518,003,712 bytes |
|
||||||
|
|
||||||
|
light 的运行加即时检查点封存约 5.827–5.854 s;这个数不含随后进程外核验。首次 reference 编译约 59.231 s,后续 build/cache 约 0.46 s。以上是小规模顺序试验,未测 GPU/CPU utilization,不能写成零。一次只读 CPU 比较与早期 light 运行有时间重叠,因此这不是隔离式或普适性能 benchmark,也未达到实时运行。
|
||||||
|
|
||||||
|
`state.npz` 与 terminal queue 的 ZIP entry 均实际检查为无损压缩。封存前输出预算计数为 221,057,911 bytes,低于注册的 8 GiB 上限;该数字不包含随后生成的最终 manifest/checksum 控制文件。
|
||||||
|
|
||||||
|
## 继续学习前的边界
|
||||||
|
|
||||||
|
仅本工程实验被封存;lab 整个目录未封存,实际使用的 21 份源码/测试/协议已按 SHA 锁定并保存快照。后续不得改写它们后沿用此结论。scientific conditioning 草案尚未登记、没有训练、没有 learned candidate。
|
||||||
|
|
||||||
|
当前草案已有 68,000 epochs:30,000×120 ms、30,000×180 ms 和 8,000×120 ms,总计 9,960 生物秒;另有 80 条 10 s 连续 idle,总计 10,760 生物秒。evaluation/probe inventory 尚未完整,所以这仍不是全量预算。仅按本次 100 ms 样本线性算术外推,核心模拟约 64.35–65.52 小时,运行及即时封存约 174.16–174.97 小时;气味活动、长度、缓存和 I/O 不同可能改变成本,不能当作可靠工期承诺。
|
||||||
|
|
||||||
|
下一步须先补齐 evaluation/reversal/retention 集成与有限预算,再登记小规模机制验证。小规模验证不能代替五个训练 seeds、独立 evaluation seeds、全部控制及完整科学门。不得调整参数挽救 PASS;没有自动解锁游戏、RL、decoder 或视觉。
|
||||||
|
|
||||||
|
## 锚点
|
||||||
|
|
||||||
|
- 注册:`7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945`
|
||||||
|
- 分析:`d5ad47a85e4c22e8a482b26330957a821e394022658531a914c9080187454d03`
|
||||||
|
- 正式状态:`16630d0d666a2467c56b647d021cbdb627a553795f6afcd7f7eb496a2737d815`
|
||||||
|
- 实验 manifest:`e8952a48cd3ea6a93c811a1183a1f7b79e19646299924e7688e5f393737a9aa2`
|
||||||
|
- checksums:`7c22aee142affae52dd5792d655e5839db14380ae84993f99a50bdce53a4135c`
|
||||||
|
|
||||||
|
服务器目录:`experiments/phase4an-engineering-validation/`。原始大数组和轨迹仍保存在服务器;小证据/Git 交付不等于全量异机备份。
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# Phase 4AN GPU 工程验证门草案
|
||||||
|
|
||||||
|
状态:**未注册 DRAFT;不是执行授权,尚未运行本门。** 日期:2026-09-30。
|
||||||
|
|
||||||
|
本门只验证新的轻记录执行器和连续状态接口是否保存冻结 D18 动力学。它不是 conditioning、retention 学习结论,也不产生 learned candidate。AM 是否已正式完成、其最终状态和 seal SHA,必须在本门预注册时从真实证据核验,本文不代填成功状态或哈希。
|
||||||
|
|
||||||
|
## 1. 固定范围与最小库存
|
||||||
|
|
||||||
|
只使用一个 AM 已准备的 100 ms 全脑输入,分别安装其原有 `zero` 与 `static25` 固定 overlay。选择规则先于本门任何新 GPU 输出:从 AM `protocol/preregistered.json` 的原 `planned` 顺序取第一条 `repeat == 0` 的记录,保存其完整行、序号、case 路径及 SHA;不得按活动强弱、旧 static25 效果或运行快慢挑 case。其原始 case 实际位于 AK `cases/<cohort>/<name>`;AM `run_suite.py` 没有另造一套 case。若预注册者希望改变此规则,应先修订草案并锁定,不得在看新输出后换输入。
|
||||||
|
|
||||||
|
每个 overlay 固定以下库存,所有行均使用同一原始 1000 tick 请求序列或其精确前缀/分段:
|
||||||
|
|
||||||
|
| 行组 | 固定执行内容 | 新执行调用数/overlay |
|
||||||
|
|---|---|---:|
|
||||||
|
| Fresh 对照 | 完整 1000 tick reference r0、light r0、light r1 | 3 |
|
||||||
|
| 连续链 | reference、light 各一条,段长 `[5, 13, 1, 481, 500]` | 10 |
|
||||||
|
| 切点前缀 | 从初态独立运行 reference 至绝对 tick 数 18、19、500 | 3 |
|
||||||
|
|
||||||
|
合计 32 次短执行,11,074 个全脑 tick,即累计 1.1074 生物秒;不是 68,000 个训练 epoch。两条链的第一段均为 fresh 5 tick,其中 reference 第一段兼作第一个切点的前缀参照,不重复运行。切点为累计 tick 数 5、18、19、500,终点为 1000:覆盖短于 18 tick 的父/子段、在绝对 tick 18 的首次合法延迟到达、19-slot 环的相位,以及较晚的活动边界。不得把部分库存完成称作完整门通过。
|
||||||
|
|
||||||
|
固定参数:166,700 neurons、25,582,938 edges、`dt_ms=0.1`、18 tick synaptic delay、19 行 spike ring、18 行 graded-APL ring、LIF float64 SI 状态与旧 APL float32 操作。保留 14,232 mask、5845 fast-APL 出边置零规则及原 APL 全形矩阵。`static25` 是 AM 原 float32-mV 候选基值的固定 `-0.25 * base` overlay,经原 SI bridge 安装;不是声称 float64 原权重每项恰减 25%。两条 overlay 分别与自己的 AM 参照比较,不能要求 zero 与 static25 相等。
|
||||||
|
|
||||||
|
禁止:weight updates、eligibility 推进/应用、eta 改动、DAN/US 新请求、odor/seed 新抽样、动力学调参、训练、额外 tail ticks。这里的连续链只检验工程续接,不检验记忆保留。
|
||||||
|
|
||||||
|
## 2. 当前真实接口与输入派生
|
||||||
|
|
||||||
|
以下是底层 Python API;本门的独立 coordinator 使用它们,不改旧模块 globals:
|
||||||
|
|
||||||
|
```python
|
||||||
|
runtime_light.run_light(case_dir, out_dir, build_root, overlay_file, overlay_manifest)
|
||||||
|
runtime_light.run_reference(case_dir, out_dir, build_root, overlay_file, overlay_manifest)
|
||||||
|
runtime_continuation.seal_checkpoint(checkpoint_dir)
|
||||||
|
runtime_continuation.load_checkpoint(checkpoint_dir, expected_sha)
|
||||||
|
runtime_continuation.run_continued(
|
||||||
|
case_dir, out_dir, build_root, overlay_file, overlay_manifest,
|
||||||
|
checkpoint_dir, mode='light' # 或 'reference'
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
本门的 comparator、有限库存 coordinator、预注册/执行 receipt 已在独立 engineering 模块实现;必须在服务器通过纯合成测试、完成只读代码审查并锁定全部源码后,才能注册执行。现有 AM comparator 对 AM adapter/provenance 和完整 1000 tick 有硬 schema 约束,不应直接冒充 AN comparator 或修改其旧 globals。
|
||||||
|
|
||||||
|
在新的独占输入目录派生 spec,不改 AK/AM 原文件。完整 fresh case 保留原 `name`、model、APL、图、系数和请求;增加显式 `max_steps=1000`,仅调整新的输出预算根及已列明的非科学标签。要求 `record_history=False`。新旧 spec 的逐字段差异必须列入 receipt,不能用“大致相同”或整类忽略代替。
|
||||||
|
|
||||||
|
前缀保留原请求中 `tick < end` 的行。分段 `[start, stop)` 只保留该区间原请求,局部 tick 精确减 `start`;全局 neuron_idx 不变。每段 `steps=stop-start`、`duration_ms=steps*0.1`、`max_steps=1000`。将各段请求恢复绝对 tick 后拼接,必须与原请求两个 int32 数组逐位相同、顺序相同、无丢失/重复;不能重抽随机输入。NPZ 容器 SHA 可以因新文件而不同,但数组语义必须 exact,并同时保留文件 SHA。
|
||||||
|
|
||||||
|
第一段完成后立即 `seal_checkpoint`;外部 coordinator 把返回的实际 manifest SHA 绑定到下一段新 spec 的 `parent_checkpoint_manifest_sha256`,可同时写准确 `global_tick_offset`。此 SHA 是运行后产出的数据依赖,预注册应锁定派生规则而不是预造值。后续 `run_continued` 自身会产生并封存 checkpoint;父 SHA 仍须外部绑定。fresh seal 是 `state.npz` 的首次新增封存绑定,不能声称它追溯证明 seal 前文件未改:应在同一受控流程中立即比较、封存,保存前后 inventory,期间不允许第三方写入。
|
||||||
|
|
||||||
|
AN overlay manifest 使用现有 `phase4an-overlay-v1` 精确键:`schema, overlay_name, overlay_sha256, mask_path, mask_sha256, base_candidate_path, base_candidate_sha256, aj_model_dir, am_overlay_path, am_overlay_sha256`。复用 AM 原 overlay 数组字节及实际 SHA,仅新建 manifest;不能把 AM 原 manifest 的额外字段直接塞给 AN,也不使用 `learned` 模式。
|
||||||
|
|
||||||
|
## 3. 预注册必须完整绑定的证据
|
||||||
|
|
||||||
|
在任何本门 GPU 执行前,保存不可覆盖的 input/source inventory 与其外部 SHA。至少包括:
|
||||||
|
|
||||||
|
- AM 最终状态、model/experiment seal、`protocol/preregistered.json`、`prepared-hashes.json`、所选原 case spec/requests,以及 `gpu/zero/<name>-r0`、`gpu/static25/<name>-r0` 的完整 `output-hashes.json`、comparison、adapter provenance 与全部待比较 artifact。核验完整 AM seal,而非只相信单个 `pass_all`。
|
||||||
|
- 图的 `nodes/edge_id/src/dst/ptr/signed_raw/weights.npy` 全部文件;APL `input_matrix/output_matrix/kc_globals/apl_globals.npy`;AF 原 `coefficients.json`;AM `protocol/base-candidate.float32-mV.npy`、两个 overlay NPZ/manifest、原 H mask。图和 bundle 的所有 SHA 来自外部锚定的 AM prereg inputs,不是仅由 AN 本次读入后自报。
|
||||||
|
- AN `runtime_light.py`、`runtime_continuation.py`、对应 tests、即将实现的本门 coordinator/comparator/tests,以及本草案最终注册版。固定其实际 SHA 和源 AST 审计;不得在跑到一半后修改源代码继续使用同一 prereg。
|
||||||
|
- `runtime_light.PINS` 的整个依赖链:AJ GPU/timing queue、AG-r2 GPU/legacy APL worker、AE backend/C++/CUDA、AF queue helper,以及 `AM_OVERLAY_SHA` 对应原 `overlay.py`。记录 `runtime_continuation.LIGHT_SHA` 与实际 light 文件一致。运行前后都重验旧来源与静态输入,不依赖时间戳缓存来替代字节哈希。
|
||||||
|
- 新输入每份 spec/requests/manifest 的 SHA,原始记录到前缀/分段的确定性映射,以及库版本、科学 Python 原 venv 入口、GPU UUID/driver/CUDA/Torch/NumPy、编译标志和 extension 来源。Python 用 `-B`;不可通过 resolve venv executable 改变包环境。Torch import 前完成 GPU/CUDA 环境设置;仅记录并核对原 TF32/CuBLAS/确定性配置,不为追求一致或速度偷偷改默认值。
|
||||||
|
|
||||||
|
AM 已完成封存并取得小证据下载包;该下载包不含全部大型轨迹,因此预注册仍必须在服务器完整校验 AM 两个 seal。实际 case 名与 seal SHA 依照上述确定规则写入预注册,不以本文代填。缺失 authority、旧输入变化或 AM 不完整时停止,不进入 GPU 门。
|
||||||
|
|
||||||
|
## 4. Exact 比较,不把摘要布尔当证明
|
||||||
|
|
||||||
|
所有浮点比较按原 dtype 的连续 little-endian raw bits,包括正负零;禁止 tolerance、round、只比均值或把压缩 NPZ 文件字节相等误作数组相等。所有状态要求 finite,事件、计数和请求库存必须完整。
|
||||||
|
|
||||||
|
### Fresh light/reference ↔ 同 overlay AM
|
||||||
|
|
||||||
|
逐数组比 `state.npz` 六键:`step/neuron_idx/counts/ref` 为 int32,`v/g` 为 float64;全部 N 个末态和全部稀疏事件相同,events 自身排序唯一且 bincount 等于 counts。light 与 reference 都保留 `requests.csv`,其五字段 `tick, neuron_idx, attempted, accepted, rejected` 必须与 AM 原输出逐行 exact;不能只比较请求总数。reference 另比每 tick `v_sha256/g_sha256/ref_sha256`、全部 APL drive/state/generated inhibition/applied h float32、pending tail 和每 tick queue。来源标签、新 spec SHA、记录范围和计时等确有差异的字段须显式白名单,不能整份忽略 provenance。
|
||||||
|
|
||||||
|
AN 新 `terminal-queues.npz` 没有对应 AM 原文件时,只从 AM 已记录事实独立重建:1000 tick 最后 19 tick 的全局 sparse events 决定 raw spike ring;末行 `apl-state.float32.npy` 决定 APL state;原 `apl-pending-tail.float32.npy` 决定 chronological pending。比较全部数组及 `next_tick=1000`,不补跑 AM。
|
||||||
|
|
||||||
|
light 没有全 APL trace、逐 tick V/g/ref hash 或 queue.jsonl;不能把这些缺文件当空记录、不能称 light 已做这些逐 tick 对照。但 `ReportingOnly.visit_With` 只移除 queue/hash 的两个 context item,留下 `request_output`,也保留 `writer.writerows` 和请求接受判定的 GPU→CPU 拷贝。因此 light 的门包括完整 events/counts/终态、逐行五字段请求接受记录、APL state、完整两种 pending queue、有限值覆盖、总到达/接受计数及固定权重身份与 reference exact;不能把它描述为完全无逐请求记录或完全无逐 tick CPU 同步。reference 承担完整逐 tick 状态/队列观测。light r1 要与 r0 的科学数组、请求 CSV、终态队列及有限值/总量一致,计时不是 exact 字段。
|
||||||
|
|
||||||
|
### Monolithic ↔ segmented
|
||||||
|
|
||||||
|
每个 overlay、每种模式分别比自己的完整 1000 tick fresh 基线,不跨 overlay 借结果。拼接所有段的 sparse events,并按 receipt offset 恢复绝对 tick;逐段 counts 用 int64 求和、验证范围后与单体 counts exact。末态 V/g/ref、最终 APL state/pending、effective weights raw SHA 必须一致;每个中间切点还与相同绝对长度的 fresh reference 前缀末态对照。切点 5 使用已记录的首段 reference,切点 18/19/500 使用预定前缀,终点使用完整基线。
|
||||||
|
|
||||||
|
spike ring 不能直接比较物理行号:各自按 `terminal.next_tick % 19` 转成“下一写 slot 起”的 19 行顺序后逐位比较;continued 的 `next_tick` 是本段局部相位,绝对时间来自 receipt。APL pending 已按下一次应用顺序保存,直接逐位比较;不得把它当未来脑活动或继续衰减的完整尾迹。短段未覆盖的 spike slots 和未消费 APL prefix 还须精确等于父 carry。
|
||||||
|
|
||||||
|
reference 的全部逐 tick 状态 hashes 和 APL 四种 trace 按全局时间拼接后与 monolithic 对照;不重复/跳过边界 tick。`queue.jsonl` 的 `joint_sha256` 编码了局部 tick,不能直接跨段相等比较:按全局 tick 对齐,精确比较 `count, accepted_count, ordered_edge_sha256, accepted_mask_sha256`;用完整事件、原 CSR、原 ref 规则独立重建原 source-order queue,并分别验证每份文件自己的 local-header joint hash。不能对 queue 重新按 target 排序后才声称原队列相同。**light 和 reference 两条链的请求 CSV 均须**按 offset 还原 tick、保持其余四字段和行序,拼接后与各自 monolithic CSV 逐行 exact;同时与预定请求库存对应,不能漏掉拒收请求。
|
||||||
|
|
||||||
|
上述门可证明 reference 完整记录和 light 已记录状态的一致;**不能据此声称不可观测的 light 每 tick 内部 V/g bits 已被直接逐项比较。** 若正式注册要求这一更强结论,须先单独批准新只读观测器和相应 source pin,而不是运行后扩大结论。
|
||||||
|
|
||||||
|
## 5. 防真空和故障门
|
||||||
|
|
||||||
|
每个 overlay 都必须从当前 reference 实际记录证明:事件非空;generated 与 applied APL h 至少有非零样本;至少一个预定内部切点同时出现非空 spike carry 和非零 APL pending。还须保存至少一个真实跨边界 synaptic witness:源 spike 在边界之前、`arrival_tick=source_spike_tick+18` 位于边界之后且小于 1000;其真实 canonical edge 权重非零、到达被接受,并包含在原队列哈希重建中。记录 boundary、source/target、edge_id、spike/arrival tick、接受标志及权重,不把这个工程 witness 解释为单一生物学原因。
|
||||||
|
|
||||||
|
这些仅是“确实测试过 live carry”的覆盖条件,不是调参阈值。不得强迫所有边界都有活动,也不得用空队列 exact 当作 live-carry PASS。固定 case/切点不满足时,结果为 coverage INCOMPLETE,保存全部输出;不可临时加 pulse、选另一个效果强的 case 或后移边界救场。任何扩展需新草案修订及新 prereg,明确看过既有结果。
|
||||||
|
|
||||||
|
故障检查以纯临时合成测试完成:错误外部 SHA、祖先 state 篡改、局部/绝对时钟错配、未写 ring slot 或未消费 APL prefix 改值、输入数组 dtype/NaN/Inf、重复/遗漏事件、拒收被错算接受、输出/编译目录越入任一祖先或冻结输入、已有目录重用。不要故意破坏 AM 或 GPU 正式输出来造负例。
|
||||||
|
|
||||||
|
## 6. 计时、压缩与磁盘预算
|
||||||
|
|
||||||
|
建议注册一个独立新实验输出根,新增 artifact/build 合计硬上限 **8 GiB**,启动前另保留 **10 GiB** 空闲余量;这是待批准的工程资源上限,不是神经科学门。所有图/APL/旧输出仅只读引用,不复制大型图或全脑 dense history。每次运行前后核实已写字节和剩余空间;不足则停止并保留 partial,不删证据续跑,也不缩短注册 tick 数。
|
||||||
|
|
||||||
|
32 次调用共享新的 extension build cache,但不共享可变神经/APL状态,只有声明的父 checkpoint 传状态。记录每次 wall time、已有 `diagnostic_simulation_seconds`、build/cache 时间、完整校验/压缩在 wall 中的费用及峰值 VRAM。reference r0 先行、light r0/r1 随后;明确首次编译/文件缓存顺序造成的影响,不能把一次差值称为普适性能 benchmark。可报告实测 100 ms trial 的耗时/压缩字节,不以此承诺 conditioning 大库存的总成本。
|
||||||
|
|
||||||
|
压缩格式按实际来源逐项核对:当前固定 SHA 的 AJ `gpu_timing.py::run_gpu` 写 `state.npz` 的语句是 `np.savez_compressed(target, **state)`,不是 `np.savez`;AN 的 light/reference AST 派生没有替换该语句。`terminal-queues.npz` 则由 AN `_Runtime.finish` 明确使用 `np.savez_compressed`。记录各数组 uncompressed `nbytes`、这两种 NPZ 的实际压缩 bytes、全部 JSONL/CSV/NPY 及 build bytes,并在执行 receipt 核验各 NPZ entry 的实际压缩方式;不得仅凭 `.npz` 扩展名判断。不能只按 NPZ 小体积漏掉 reference APL 原始 `.npy`。reference 四种 APL trace 的主体约为每 tick 32,528 bytes;完整 1000 tick 约 32.528 MB,尚未含事件/末态/队列/头部。所有估计与最终实际 inventory 同报,不预称已节省多少磁盘;不改原输出格式或移除证据以追求预算。
|
||||||
|
|
||||||
|
## 7. 执行 receipt 与停止结论
|
||||||
|
|
||||||
|
新 coordinator 须 exclusive 写每行执行 receipt 和全门 inventory:注册 SHA、行 ID/overlay/mode/repeat/区间、case/requests/代码输入 SHA、进程退出码、完整 stdout/stderr、开始/结束记录、实际 completed ticks、原始 output inventory SHA、独立 comparator 结果/输入 SHA、finite coverage、weight identity、父 checkpoint 路径/外部 SHA、全局时钟、计时及磁盘字节。单独的 `summary.complete/pass_all` 不足:它可能先于 wrapper 后置核验失败写出;必须有完整 runtime provenance、无 error/failure marker,并重新验证 input/old integrity。
|
||||||
|
|
||||||
|
checkpoint manifest、continuation receipt 和外部执行 inventory 各自按现有排除自身的规则封存,不能自哈希循环。新比较报告和 coordinator receipt 放在被封存 checkpoint 目录之外,避免为加报告改坏父链。恢复只可跳过经完整库存/输入/独立比较重验的已完成行;存在 partial、故障 marker 或不完整祖先则停止,不覆盖、不自动科学重试。
|
||||||
|
|
||||||
|
全部库存、exact 比较、live-carry 覆盖和前后 integrity 均通过时,最高结论仅为“固定 zero/static25 的 GPU 记录模式与连续状态工程等价门通过”;`learning_pass_claimed=False`、`candidate_generated=False`、`weights_updated_during_run=False`。数值不一致为 FAIL;缺证据、预算中断或 live-carry 未覆盖为 INCOMPLETE;不把未执行项记 PASS。任何结果都不自动授权 conditioning,后续训练协议、独立输入/种子/控制与科学门仍需另行审定。
|
||||||
|
|
||||||
|
## 8. 未来可另行注册的补充,不属于当前库存
|
||||||
|
|
||||||
|
以下来自独立审查者的工程提案,**不自动追加到本门、不授权执行,也不是当前 32 次调用的 PASS 条件**。需要分别固定新输入、代码/比较器、父 checkpoint 来源和资源预算后重新审定;不可把本草案悄然扩为 90 次调用。
|
||||||
|
|
||||||
|
第一项是独立全图 synthetic live-carry 短矩阵。可从冻结 mask 的最低 canonical KC source 及其最低 global edge ID 的真实 MBON target 定义 K、M;从冻结 APL input matrix 的非零列按预定 canonical 规则选 Q,不按新输出选人。拟定 80 tick 的两种请求表:K 在 0/1/22/44/66;必要时 Q 在 0;另一表额外 M 在 18,以覆盖到达接收/不应期拒收、child local tick 0 请求及 tick 84 尚未到期的 spike tail。Q 的实际身份和非零列须静态核验,不能仅凭前缀猜 PN/KC;预期 live/accept/reject 条件也须由实际记录证明。zero/static25 × 两表,各比 reference monolithic 与 reference/light 分段 `[5,12,1,1,18,43]`,提案合计 52 次短调用、960 tick(0.096 生物秒)。它测试人工工程请求,不是新增 odor conditioning;本门固定 AM case 的覆盖不足不能未经新注册就用该矩阵救成 PASS。
|
||||||
|
|
||||||
|
第二项是在上述另注册短矩阵通过并得到明确绑定的 active checkpoint 后,再注册较长的连续 idle 工程门:zero/static25 各比较 light 一段 100,000 tick 与连续 10,000 + 90,000 tick,均零新输入、零权重更新,提案合计 6 次 continuation 调用。比较全部 sparse events、分段 counts 总和、终态 V/g/ref/APL state 及规范化 queues;不记录 10 秒逐 tick CPU hash 时,不能宣称逐 tick 浮点状态已独立对照。1 秒 checkpoint 沿同一 idle 主链续到 10 秒;任何测试 probe 必须另 fork,不能把 probe 插入主轨迹,其调用数和预算另列。所有祖先 manifest 在 fork 前后不变。即使通过,也仅证明较长时钟/状态接口,不是记忆保持或 learning PASS。
|
||||||
|
|
||||||
|
源码依据:本目录 `runtime_light.py` 的 `validate_spec/load_overlay/derive_ast/_Runtime.finish/_run`;`runtime_continuation.py` 的 `rotate_spike_ring/validate_state/load_checkpoint/run_continued/audit_carried_sequence`;封存 AM `prepare.py/run_suite.py/adapter.py/comparison.py`;封存 AJ `gpu_timing.py` 与 AF `oracle_full.py::queue_summary`。本文只读这些来源,未运行 GPU、未注册或修改其内容。
|
||||||
@@ -0,0 +1,373 @@
|
|||||||
|
"""Deterministic, read-only CPU analysis of the registered 32-call AN gate.
|
||||||
|
|
||||||
|
analyze(reg, reg_sha, verified_records) accepts the actual runtime receipts
|
||||||
|
already verified by engineering_workflow.verify_execution. It does not run
|
||||||
|
that workflow, publish, seal, save, retry or import a GPU runtime. All external
|
||||||
|
AM seals/checkpoint chains/process receipts remain the caller's prior duty.
|
||||||
|
This module rehashes the files it reads, executes every canonical descriptor,
|
||||||
|
and independently reconstructs the reference queues and effective SI weights.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import math
|
||||||
|
from pathlib import Path
|
||||||
|
import types
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_compare as compare
|
||||||
|
import engineering_plan as plan_module
|
||||||
|
import engineering_queue_audit as queue_audit
|
||||||
|
import engineering_scopes as scopes
|
||||||
|
|
||||||
|
|
||||||
|
N, E, K = 166700, 25582938, 4064
|
||||||
|
CANDIDATES, FAST_APL_EDGES = 14232, 5845
|
||||||
|
AM_OVERLAY_SHA = '7f891d0ba79b393c96e75fd2dee2eddc51e57d8213eaac2779703bc2c18712b4'
|
||||||
|
MASK_SHA = '8b0fb6eb2e6c31da4d17dc20d890aa3f367e514f05642de5bad6b42a1611c05b'
|
||||||
|
SUCCESS = 'PASS-EXACT-LIGHT-CONTINUATION-ENGINEERING-NOT-LEARNING'
|
||||||
|
|
||||||
|
|
||||||
|
def require(value, message):
|
||||||
|
if not value:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _canonical(value):
|
||||||
|
return json.dumps(value, sort_keys=True, separators=(',', ':'), ensure_ascii=False, allow_nan=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _sha_file(path):
|
||||||
|
h = hashlib.sha256()
|
||||||
|
with Path(path).open('rb') as stream:
|
||||||
|
for data in iter(lambda: stream.read(8 << 20), b''):
|
||||||
|
h.update(data)
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
class _Reader:
|
||||||
|
"""Fresh byte hashes, not stat caching; deterministic read manifest."""
|
||||||
|
def __init__(self, registered):
|
||||||
|
self.registered = registered
|
||||||
|
self.reads = {}
|
||||||
|
self.arrays = []
|
||||||
|
|
||||||
|
def bind(self, path, *, registered=True, expected=None):
|
||||||
|
path = Path(path)
|
||||||
|
require(path.is_absolute() and path.is_file() and not path.is_symlink(), 'Missing/linked/relative evidence: ' + str(path))
|
||||||
|
path = path.resolve(strict=True)
|
||||||
|
if registered:
|
||||||
|
require(str(path) in self.registered, 'Unregistered dependency: ' + str(path))
|
||||||
|
require(expected is None or expected == self.registered[str(path)], 'Conflicting external hash authority')
|
||||||
|
expected = self.registered[str(path)]
|
||||||
|
actual = _sha_file(path)
|
||||||
|
require(expected is None or (compare._sha(expected) and actual == expected), 'Evidence bytes changed: ' + str(path))
|
||||||
|
value = dict(path=str(path), bytes=path.stat().st_size, sha256=actual)
|
||||||
|
require(str(path) not in self.reads or self.reads[str(path)] == value, 'File changed during analysis')
|
||||||
|
self.reads[str(path)] = value
|
||||||
|
return path
|
||||||
|
|
||||||
|
def json(self, path, **kwargs):
|
||||||
|
return compare._json(self.bind(path, **kwargs))
|
||||||
|
|
||||||
|
def npy(self, path):
|
||||||
|
value = np.load(self.bind(path), mmap_mode='r', allow_pickle=False)
|
||||||
|
self.arrays.append(value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
def npz(self, path, keys):
|
||||||
|
with np.load(self.bind(path), allow_pickle=False) as archive:
|
||||||
|
require(len(archive.files) == len(keys) and set(archive.files) == set(keys), 'Unexpected input NPZ keys')
|
||||||
|
return {name: archive[name].copy() for name in keys}
|
||||||
|
|
||||||
|
def run(self, directory, *, legacy):
|
||||||
|
directory = Path(directory)
|
||||||
|
names = ['summary.json', 'state.npz', 'apl-timing-audit.json', 'apl-pending-tail.float32.npy', 'requests.csv']
|
||||||
|
if legacy:
|
||||||
|
names.append('adapter-provenance.json')
|
||||||
|
else:
|
||||||
|
names.append('terminal-queues.npz')
|
||||||
|
names += [name for name in [*compare.TRACE_FILES.values(), 'tick-state-hashes.jsonl', 'queue.jsonl']
|
||||||
|
if (directory / name).is_file()]
|
||||||
|
for name in names:
|
||||||
|
self.bind(directory / name, registered=legacy)
|
||||||
|
return compare.load_run(directory, allow_legacy_am=legacy)
|
||||||
|
|
||||||
|
def finish(self):
|
||||||
|
for row in self.reads.values():
|
||||||
|
path = Path(row['path'])
|
||||||
|
require(path.is_file() and path.stat().st_size == row['bytes'] and _sha_file(path) == row['sha256'],
|
||||||
|
'Read evidence changed during analysis: ' + str(path))
|
||||||
|
return [self.reads[key] for key in sorted(self.reads)]
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
for value in self.arrays:
|
||||||
|
mmap = getattr(value, '_mmap', None)
|
||||||
|
if mmap is not None:
|
||||||
|
mmap.close()
|
||||||
|
|
||||||
|
|
||||||
|
def _registration(reg, reg_sha, verified):
|
||||||
|
require(type(reg) is dict and reg.get('schema') == 'phase4an-engineering-registration-v1' and
|
||||||
|
reg.get('training') is False and compare._sha(reg_sha), 'Invalid engineering registration')
|
||||||
|
plan = plan_module.validate_plan(reg['plan'])
|
||||||
|
ids = [row['row_id'] for row in plan['rows']]
|
||||||
|
require(type(verified) is dict and set(verified) == set(ids) and set(reg['cases']) == set(ids),
|
||||||
|
'Exactly all 32 registered runtime receipts/cases are required')
|
||||||
|
exp = None
|
||||||
|
for row in plan['rows']:
|
||||||
|
identity = row['row_id']; path = Path(reg['cases'][identity]['case_dir'])
|
||||||
|
require(path.is_absolute() and path.name == identity and path.parent.name == 'cases', 'Invalid registered case layout')
|
||||||
|
if exp is None:
|
||||||
|
exp = path.parent.parent
|
||||||
|
require(path == exp / 'cases' / identity, 'Cases span inconsistent experiment roots')
|
||||||
|
receipt = verified[identity]
|
||||||
|
require(receipt.get('schema') == 'phase4an-engineering-runtime-record-v1' and receipt.get('complete') is True and
|
||||||
|
receipt.get('training') is False and receipt.get('registration_sha256') == reg_sha and
|
||||||
|
_canonical(receipt.get('row')) == _canonical(row) and compare._sha(receipt.get('checkpoint_manifest_sha256')),
|
||||||
|
'Runtime receipt is not the exact verified registered row: ' + identity)
|
||||||
|
require(exp.name == 'phase4an-engineering-validation' and exp.parent.name == 'experiments', 'Unexpected fixed engineering output root')
|
||||||
|
require(set(reg['overlays']) == set(reg['selected_case']['AM_outputs']) == {'zero', 'static25'}, 'Incomplete overlay/AM authority')
|
||||||
|
return plan, exp
|
||||||
|
|
||||||
|
|
||||||
|
def _materialize(reader, reg, graph, stage):
|
||||||
|
"""Use the exact pinned pure AM helper; no original globals are patched."""
|
||||||
|
declaration = reg['overlays'][stage]
|
||||||
|
meta = reader.json(declaration['overlay_manifest'])
|
||||||
|
require(meta.get('schema') == 'phase4an-overlay-v1' and meta.get('overlay_name') == stage and
|
||||||
|
meta.get('am_overlay_sha256') == AM_OVERLAY_SHA and meta.get('mask_sha256') == MASK_SHA,
|
||||||
|
'Original fixed overlay authority changed')
|
||||||
|
helper_path = reader.bind(meta['am_overlay_path'], expected=AM_OVERLAY_SHA)
|
||||||
|
module = types.ModuleType('phase4an_analysis_pinned_overlay')
|
||||||
|
module.__file__ = str(helper_path)
|
||||||
|
exec(compile(helper_path.read_bytes(), str(helper_path), 'exec'), module.__dict__)
|
||||||
|
mask = reader.npy(meta['mask_path']); base_candidate = reader.npy(meta['base_candidate_path'])
|
||||||
|
require(reader.reads[str(Path(meta['mask_path']).resolve())]['sha256'] == meta['mask_sha256'] and
|
||||||
|
reader.reads[str(Path(meta['base_candidate_path']).resolve())]['sha256'] == meta['base_candidate_sha256'],
|
||||||
|
'Overlay external mask/base hash mismatch')
|
||||||
|
overlay_file = reader.bind(declaration['overlay_file'], expected=meta['overlay_sha256'])
|
||||||
|
arrays = reader.npz(overlay_file, {'edge_id', 'plastic_delta_mv'})
|
||||||
|
require(mask.dtype == np.int64 and mask.shape == (CANDIDATES,), 'Complete frozen plastic mask required')
|
||||||
|
values = module.validate_arrays(arrays['edge_id'], arrays['plastic_delta_mv'], mask, base_candidate)
|
||||||
|
if stage == 'zero':
|
||||||
|
require(not np.any(values['plastic_delta_mv'] != 0), 'Zero overlay is nonzero')
|
||||||
|
else:
|
||||||
|
require(module.bit_equal(values['plastic_delta_mv'], np.multiply(np.float32(-.25), base_candidate)),
|
||||||
|
'static25 differs from the original float32-mV floor')
|
||||||
|
effective, mapping = module.materialize_numpy(graph['weights'], graph['edge_id'], graph['apl_out_mask'], values)
|
||||||
|
require(mapping['mapped_candidate_count'] == CANDIDATES and mapping['missing_candidate_count'] == 0 and
|
||||||
|
mapping['apl_overlap_count'] == 0, 'Incomplete/overlapping candidate mapping')
|
||||||
|
base_sha, effective_sha = module.expected_hashes(graph['weights'], graph['apl_out_mask'], mapping)
|
||||||
|
require(queue_audit._raw_sha(effective) == effective_sha, 'CPU materialization/hash disagreement')
|
||||||
|
return effective, dict(effective_weights_raw_sha256=effective_sha, base_weights_raw_sha256=base_sha,
|
||||||
|
candidate_count=CANDIDATES, installed_nonzero_count=mapping['installed_nonzero_count'],
|
||||||
|
apl_fast_edges_zeroed=FAST_APL_EDGES, bridge=module.BRIDGE,
|
||||||
|
helper_source_sha256=AM_OVERLAY_SHA, weights_updated_during_run=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _load_context(reg, reg_sha, plan, exp):
|
||||||
|
reader = _Reader(reg['input_sha256'])
|
||||||
|
records, legacy = {}, {}
|
||||||
|
try:
|
||||||
|
actual_reg = reader.json(exp / 'protocol/preregistered.json', registered=False, expected=reg_sha)
|
||||||
|
require(_canonical(actual_reg) == _canonical(reg), 'Supplied registration differs from actual registered bytes')
|
||||||
|
for path, expected in sorted(reg['source_sha256'].items()):
|
||||||
|
reader.bind(path, registered=False, expected=expected)
|
||||||
|
original = Path(reg['selected_case']['original_dir'])
|
||||||
|
spec = reader.json(original / 'spec.json')
|
||||||
|
require(spec.get('kind') == 'fullgraph' and spec.get('steps') == 1000 and spec.get('dt_ms') == .1 and
|
||||||
|
spec.get('apl_delay_steps') == 18, 'Original fixed fullgraph D18 spec changed')
|
||||||
|
requests = reader.npz(original / 'requests.npz', {'tick', 'neuron_idx'})
|
||||||
|
graph_dir, bundle = Path(spec['graph_dir']), Path(spec['apl_bundle_dir'])
|
||||||
|
graph = {key: reader.npy(graph_dir / (key + '.npy')) for key in ('nodes', 'ptr', 'dst', 'edge_id', 'weights')}
|
||||||
|
require(graph['nodes'].dtype == np.int32 and np.array_equal(graph['nodes'], np.arange(N, dtype=np.int32)),
|
||||||
|
'Graph is not the complete canonical neuron set')
|
||||||
|
n, e = queue_audit._graph(graph['ptr'], graph['dst'], graph['edge_id'], graph['weights'])
|
||||||
|
require((n, e) == (N, E), 'Original graph dimensions changed')
|
||||||
|
apl = reader.npy(bundle / 'apl_globals.npy')
|
||||||
|
require(apl.dtype == np.int32 and apl.shape == (2,) and np.all((apl >= 0) & (apl < N)) and
|
||||||
|
apl[0] < apl[1], 'Invalid canonical APL source identity')
|
||||||
|
mask = np.zeros(E, np.bool_)
|
||||||
|
for source in apl:
|
||||||
|
mask[graph['ptr'][source]:graph['ptr'][source + 1]] = True
|
||||||
|
require(int(mask.sum()) == FAST_APL_EDGES, 'Frozen fast-APL source-edge mask changed')
|
||||||
|
graph['apl_out_mask'] = mask
|
||||||
|
storage = {}
|
||||||
|
for row in plan['rows']:
|
||||||
|
identity = row['row_id']; folder = exp / 'runs' / identity
|
||||||
|
require(folder.is_dir() and folder.resolve() == folder and not any(p.is_symlink() for p in folder.rglob('*')),
|
||||||
|
'Missing/linked runtime evidence folder')
|
||||||
|
records[identity] = reader.run(folder, legacy=False)
|
||||||
|
storage[identity] = sum(p.stat().st_size for p in folder.rglob('*') if p.is_file())
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
legacy[stage] = reader.run(reg['selected_case']['AM_outputs'][stage], legacy=True)
|
||||||
|
return dict(reader=reader, records=records, legacy=legacy, graph=graph, requests=requests,
|
||||||
|
storage=storage, input_scope='read-only authenticated selected original inputs and AM outputs')
|
||||||
|
except BaseException:
|
||||||
|
for record in [*records.values(), *legacy.values()]:
|
||||||
|
compare.close_run(record)
|
||||||
|
reader.close()
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def _pair(candidate, reference):
|
||||||
|
checks, observed = compare._pair_checks(candidate, reference)
|
||||||
|
return dict(numerical_exact=all(checks.values()), checks=checks,
|
||||||
|
failed_checks=[key for key, value in checks.items() if not value],
|
||||||
|
reference_comparisons_available=observed, learning_pass_claimed=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _dispatch(descriptor, records, legacy, overlay):
|
||||||
|
candidates = [records[name] for name in descriptor['candidate_row_ids']]
|
||||||
|
reference = records[descriptor['reference_row_id']] if descriptor['reference_row_id'] is not None else None
|
||||||
|
kind = descriptor['check']
|
||||||
|
if kind == 'am_exact':
|
||||||
|
return compare.compare_fresh(candidates[0], legacy[overlay])
|
||||||
|
if kind == 'fresh_exact':
|
||||||
|
return compare.compare_fresh(candidates[0], reference)
|
||||||
|
if kind in ('prefix_of_reference', 'segment_of_reference'):
|
||||||
|
return scopes.compare_slice(candidates[0], reference)
|
||||||
|
if kind == 'segment_exact':
|
||||||
|
return _pair(candidates[0], reference)
|
||||||
|
if kind == 'checkpoint_exact':
|
||||||
|
return scopes.compare_checkpoint(candidates[0], reference)
|
||||||
|
if kind == 'parent_carry':
|
||||||
|
return scopes.compare_parent_carry(candidates[0], reference)
|
||||||
|
if kind == 'chain_exact':
|
||||||
|
return compare.compare_segments(reference, candidates)
|
||||||
|
raise ValueError('Unimplemented registered comparison: ' + str(kind))
|
||||||
|
|
||||||
|
|
||||||
|
def _number(value, name, integer=False):
|
||||||
|
if value is None:
|
||||||
|
return None
|
||||||
|
require((type(value) is int if integer else type(value) in (int, float)) and math.isfinite(value) and value >= 0,
|
||||||
|
'Malformed observed metric: ' + name)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def _run_checks(row, record, expected_hash, reference):
|
||||||
|
compare.validate_run(record)
|
||||||
|
summary = record['summary']; identity = row['row_id']
|
||||||
|
require(len(record['state']['v']) == N and record['terminal']['apl_pending'].shape == (18, K), 'Incomplete full brain state: ' + identity)
|
||||||
|
checks = {key: summary.get(key) is True for key in ('complete', 'pass_all', 'all_finite', 'counts_match_sparse_events')}
|
||||||
|
fixed = dict(nodes=N, edges=E, steps=row['steps'], completed_ticks=row['steps'], apl_delay_steps=18,
|
||||||
|
requested=len(record['requests']), total_spikes=len(record['state']['step']),
|
||||||
|
accepted_requests=int(record['requests'][:, 3].sum(dtype=np.int64)),
|
||||||
|
rejected_requests=int(record['requests'][:, 4].sum(dtype=np.int64)),
|
||||||
|
apl_fast_edges_zeroed=FAST_APL_EDGES, kc_targets_present=K)
|
||||||
|
for key, value in fixed.items():
|
||||||
|
checks[key] = type(summary.get(key)) is int and summary[key] == value
|
||||||
|
checks['registered_clock'] = record['steps'] == row['steps'] and record['global_tick_offset'] == row['start']
|
||||||
|
checks['recording_mode'] = summary.get('diagnostic_mode') == row['mode']
|
||||||
|
checks['effective_weight_bytes'] = summary.get('effective_weights_raw_sha256') == expected_hash
|
||||||
|
checks['within_trial_weights_fixed'] = summary.get('within_trial_weight_updates') is False
|
||||||
|
checks['learning_not_claimed'] = summary.get('learning_pass_claimed') is False
|
||||||
|
expected_queue = reference['queues'][row['start']:row['stop']]
|
||||||
|
for field, queue_key in [('arriving_edges', 'count'), ('accepted_arriving_edges', 'accepted_count')]:
|
||||||
|
expected = sum(q[queue_key] for q in expected_queue)
|
||||||
|
checks[field] = type(summary.get(field)) is int and summary[field] == expected
|
||||||
|
return {name: bool(value) for name, value in checks.items()}
|
||||||
|
|
||||||
|
|
||||||
|
def analyze(reg, reg_sha, verified_records):
|
||||||
|
"""No writes/runs. The caller rechecks registration and receipts afterward."""
|
||||||
|
plan, exp = _registration(reg, reg_sha, verified_records)
|
||||||
|
context = _load_context(reg, reg_sha, plan, exp)
|
||||||
|
records, legacy = context['records'], context['legacy']
|
||||||
|
try:
|
||||||
|
require(set(records) == {r['row_id'] for r in plan['rows']} and set(legacy) == {'zero', 'static25'},
|
||||||
|
'Loaded evidence inventory is incomplete')
|
||||||
|
comparisons = []
|
||||||
|
for row in plan['rows']:
|
||||||
|
for number, descriptor in enumerate(row['expected_comparisons']):
|
||||||
|
try:
|
||||||
|
result = _dispatch(descriptor, records, legacy, row['overlay'])
|
||||||
|
require(type(result.get('numerical_exact')) is bool, 'Comparator lacks an explicit Boolean numerical gate')
|
||||||
|
except (ValueError, KeyError, TypeError, IndexError, OverflowError) as error:
|
||||||
|
result = dict(numerical_exact=False, error_type=type(error).__name__, error=str(error),
|
||||||
|
incomplete_observation_not_fabricated=True)
|
||||||
|
comparisons.append(dict(descriptor_id=row['row_id'] + '/' + str(number),
|
||||||
|
descriptor=descriptor, result=result))
|
||||||
|
expected_descriptors = sum(len(r['expected_comparisons']) for r in plan['rows'])
|
||||||
|
require(len(comparisons) == expected_descriptors, 'Not every registered descriptor was evaluated')
|
||||||
|
overlay_reports, metric_rows, all_row_checks = {}, [], {}
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
effective, installation = _materialize(context['reader'], reg, context['graph'], stage)
|
||||||
|
stage_rows = [r for r in plan['rows'] if r['overlay'] == stage]
|
||||||
|
ref_row = next(r for r in stage_rows if r['kind'] == 'fresh' and r['mode'] == 'reference')
|
||||||
|
reference = records[ref_row['row_id']]
|
||||||
|
reference_chain = [records[r['row_id']] for r in stage_rows if r['kind'] == 'chain' and r['mode'] == 'reference']
|
||||||
|
cuts = [r['start'] for r in stage_rows if r['kind'] == 'chain' and r['mode'] == 'reference' and r['start'] > 0]
|
||||||
|
independent = queue_audit.audit_queues(reference, reference_chain, ptr=context['graph']['ptr'], dst=context['graph']['dst'],
|
||||||
|
edge_id=context['graph']['edge_id'], effective_weights=effective, requests=context['requests'], cuts=cuts)
|
||||||
|
del effective
|
||||||
|
reference_result = next(item['result'] for item in comparisons if item['descriptor']['check'] == 'chain_exact' and
|
||||||
|
item['descriptor']['reference_row_id'] == ref_row['row_id'])
|
||||||
|
light_result = next(item['result'] for item in comparisons if item['descriptor']['check'] == 'chain_exact' and
|
||||||
|
item['descriptor']['reference_row_id'] == plan_module._fresh_id(stage, 'light'))
|
||||||
|
coverage = reference_result.get('coverage', {})
|
||||||
|
apl_values = coverage.get('carried_APL_nonzero_applied_values')
|
||||||
|
simultaneous_carry = any(type(row.get('pending_source_spike_events')) is int and row['pending_source_spike_events'] > 0 and
|
||||||
|
type(row.get('carried_APL_nonzero_pending_values')) is int and row['carried_APL_nonzero_pending_values'] > 0
|
||||||
|
for row in coverage.get('boundaries', []))
|
||||||
|
coverage_pass = (reference_result.get('nonvacuous_temporal_coverage') is True and
|
||||||
|
type(apl_values) is int and apl_values > 0 and simultaneous_carry and
|
||||||
|
independent.get('accepted_nonzero_crossing_witness_verified') is True)
|
||||||
|
legacy_checks = dict(full_dimensions=type(legacy[stage]['summary'].get('nodes')) is int and legacy[stage]['summary']['nodes'] == N and
|
||||||
|
type(legacy[stage]['summary'].get('edges')) is int and legacy[stage]['summary']['edges'] == E,
|
||||||
|
effective_weight_bytes=legacy[stage]['summary'].get('effective_weights_raw_sha256') == installation['effective_weights_raw_sha256'])
|
||||||
|
overlay_reports[stage] = dict(installation=installation, independent_queue_audit=independent,
|
||||||
|
reference_numerical_exact=reference_result.get('numerical_exact') is True,
|
||||||
|
light_numerical_exact=light_result.get('numerical_exact') is True,
|
||||||
|
live_coverage_pass=coverage_pass, legacy_checks=legacy_checks,
|
||||||
|
same_internal_boundary_has_spike_and_APL_carry=simultaneous_carry,
|
||||||
|
carried_APL_nonzero_applied_values=apl_values,
|
||||||
|
light_standalone_coverage=light_result.get('coverage'),
|
||||||
|
light_per_tick_float_state_directly_observed=False,
|
||||||
|
reference_coverage_does_not_fabricate_light_observations=True)
|
||||||
|
for row in stage_rows:
|
||||||
|
identity = row['row_id']; record = records[identity]; summary = record['summary']; receipt = verified_records[identity]
|
||||||
|
checks = _run_checks(row, record, installation['effective_weights_raw_sha256'], reference)
|
||||||
|
all_row_checks[identity] = checks
|
||||||
|
metric_rows.append(dict(row_id=identity, overlay=stage, mode=row['mode'], start=row['start'], stop=row['stop'],
|
||||||
|
biological_time_ms=row['steps'] * .1, runtime_and_immediate_seal_wall_seconds=_number(receipt.get('runtime_and_immediate_seal_wall_seconds'), 'runtime wall'),
|
||||||
|
runtime_reported_wall_seconds=_number(summary.get('wall_seconds'), 'runtime reported wall'),
|
||||||
|
diagnostic_simulation_seconds=_number(summary.get('diagnostic_simulation_seconds'), 'simulation'),
|
||||||
|
build_or_cache_seconds=_number(summary.get('build_or_cache_seconds'), 'build/cache'),
|
||||||
|
peak_allocated_vram_bytes=_number(summary.get('peak_allocated_vram_bytes'), 'allocated VRAM', True),
|
||||||
|
peak_reserved_vram_bytes=_number(summary.get('peak_reserved_vram_bytes'), 'reserved VRAM', True),
|
||||||
|
sealed_output_file_bytes=context['storage'][identity], compressed_storage=receipt.get('storage'),
|
||||||
|
gpu_utilization=None, cpu_utilization=None, unobserved_metrics=['gpu_utilization', 'cpu_utilization'],
|
||||||
|
checkpoint_manifest_sha256=receipt['checkpoint_manifest_sha256'],
|
||||||
|
verified_runtime_receipt_canonical_sha256=hashlib.sha256(_canonical(receipt).encode('utf-8')).hexdigest()))
|
||||||
|
numerical = (all(item['result']['numerical_exact'] for item in comparisons) and
|
||||||
|
all(all(checks.values()) for checks in all_row_checks.values()) and
|
||||||
|
all(all(r['legacy_checks'].values()) and r['independent_queue_audit']['queue_ref_request_exact'] for r in overlay_reports.values()))
|
||||||
|
covered = all(row['live_coverage_pass'] for row in overlay_reports.values())
|
||||||
|
read_manifest = context['reader'].finish()
|
||||||
|
report = dict(schema='phase4an-engineering-analysis-v1', registration_sha256=reg_sha,
|
||||||
|
status='FAIL-NUMERICAL' if not numerical else (SUCCESS if covered else 'INCOMPLETE-COVERAGE'),
|
||||||
|
pass_all=bool(numerical and covered), numerical_exact=bool(numerical), nonvacuous_temporal_coverage=bool(covered),
|
||||||
|
expected_calls=32, analyzed_calls=len(records), executed_ticks=plan['total_ticks'],
|
||||||
|
expected_comparisons=expected_descriptors, evaluated_comparisons=len(comparisons), comparisons=comparisons,
|
||||||
|
run_checks=all_row_checks, failed_run_checks={identity: [k for k, ok in checks.items() if not ok] for identity, checks in all_row_checks.items() if not all(checks.values())},
|
||||||
|
overlay_reports=overlay_reports, metrics=metric_rows, read_manifest=read_manifest,
|
||||||
|
source_sha256=reg['source_sha256'], process_receipts_and_checkpoint_chains_verified_by_caller=True,
|
||||||
|
external_AM_full_seals_reverified_here=False, no_new_brain_runs_during_analysis=True,
|
||||||
|
GPU_used=False, training=False, learning_pass_claimed=False, candidate_generated=False,
|
||||||
|
physiology_or_memory_success_claimed=False,
|
||||||
|
limitations=['Fixed zero/static25 engineering trajectories only; not conditioning or learned memory.',
|
||||||
|
'Light intermediate V/g/ref, APL histories and per-tick queue arrays were not directly recorded.',
|
||||||
|
'Independent queue/ref reconstruction is conditional on recorded spikes; V/g dynamics are not independently re-simulated.',
|
||||||
|
'Missing performance metrics are null, not zero. No universal performance claim is made.',
|
||||||
|
'Caller verifies all process receipts, parent chains, registration authority and full AM/frozen seals.'])
|
||||||
|
_canonical(report) # Fail rather than return non-JSON/nonfinite output.
|
||||||
|
return report
|
||||||
|
finally:
|
||||||
|
for record in [*records.values(), *legacy.values()]:
|
||||||
|
compare.close_run(record)
|
||||||
|
context['reader'].close()
|
||||||
@@ -0,0 +1,413 @@
|
|||||||
|
"""Read-only CPU comparisons for the UNREGISTERED AN engineering gate.
|
||||||
|
|
||||||
|
load_run(path, allow_legacy_am=False) reads actual AJ/AM/AN artifact schemas.
|
||||||
|
Call close_run(record) after using explicitly loaded memory-mapped traces.
|
||||||
|
compare_fresh(left, right, legacy_am=None) and compare_segments(monolithic,
|
||||||
|
segments) accept loaded dictionaries or paths and return JSON-safe reports.
|
||||||
|
No report is written, no GPU is imported, no training/biological PASS is claimed.
|
||||||
|
The caller owns external source/input/root SHA pins and case selection. These
|
||||||
|
comparisons do not replace seal verification or prove unseen inputs unchanged.
|
||||||
|
|
||||||
|
AM did not save its raw spike ring: its fresh terminal ring is explicitly
|
||||||
|
reconstructed from sparse events, never described as independently recorded.
|
||||||
|
Reference queue joint hashes include LOCAL tick headers; cross-segment checks
|
||||||
|
compare the separate ordered-edge/accepted-mask hashes and counts instead.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
STATE_KEYS = ('step', 'neuron_idx', 'counts', 'v', 'g', 'ref')
|
||||||
|
REQUEST_FIELDS = ('tick', 'neuron_idx', 'attempted', 'accepted', 'rejected')
|
||||||
|
TRACE_FILES = {'drive': 'apl-drive.float32.npy', 'state': 'apl-state.float32.npy',
|
||||||
|
'generated': 'apl-inhibition.float32.npy', 'applied': 'apl-applied.float32.npy'}
|
||||||
|
HASH_FIELDS = ('v_sha256', 'g_sha256', 'ref_sha256')
|
||||||
|
QUEUE_FIELDS = ('count', 'accepted_count', 'ordered_edge_sha256', 'accepted_mask_sha256')
|
||||||
|
|
||||||
|
|
||||||
|
def require(ok, message):
|
||||||
|
if not ok:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def bit_equal(a, b):
|
||||||
|
return (isinstance(a, np.ndarray) and isinstance(b, np.ndarray) and a.dtype == b.dtype and a.shape == b.shape and
|
||||||
|
np.array_equal(np.ascontiguousarray(a).view(np.uint8), np.ascontiguousarray(b).view(np.uint8)))
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(value):
|
||||||
|
return isinstance(value, str) and re.fullmatch('[0-9a-f]{64}', value) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def _json(path):
|
||||||
|
def pairs(values):
|
||||||
|
result = {}
|
||||||
|
for key, value in values:
|
||||||
|
require(key not in result, 'Duplicate JSON key: ' + key)
|
||||||
|
result[key] = value
|
||||||
|
return result
|
||||||
|
return json.loads(Path(path).read_text(encoding='utf-8'), object_pairs_hook=pairs,
|
||||||
|
parse_constant=lambda value: (_ for _ in ()).throw(ValueError('Nonfinite JSON: ' + value)))
|
||||||
|
|
||||||
|
|
||||||
|
def _jsonl(path):
|
||||||
|
with Path(path).open(encoding='utf-8') as stream:
|
||||||
|
return [json.loads(line) for line in stream if line.strip()]
|
||||||
|
|
||||||
|
|
||||||
|
def _npz(path, keys):
|
||||||
|
with np.load(path, allow_pickle=False) as archive:
|
||||||
|
require(len(archive.files) == len(keys) and set(archive.files) == set(keys), 'Unexpected array keys: ' + str(path))
|
||||||
|
return {key: archive[key].copy() for key in keys}
|
||||||
|
|
||||||
|
|
||||||
|
def reconstructed_fresh_ring(state, steps, neurons):
|
||||||
|
ring = np.zeros((19, neurons), np.uint8)
|
||||||
|
for tick in range(max(0, steps - 19), steps):
|
||||||
|
first, last = np.searchsorted(state['step'], (tick, tick + 1))
|
||||||
|
ring[tick % 19, state['neuron_idx'][first:last]] = 1
|
||||||
|
return ring
|
||||||
|
|
||||||
|
|
||||||
|
def normalized_ring(terminal):
|
||||||
|
ring, phase = terminal['spike_ring'], int(terminal['next_tick'])
|
||||||
|
return ring[(np.arange(19) + phase % 19) % 19]
|
||||||
|
|
||||||
|
|
||||||
|
def _requests(path):
|
||||||
|
with Path(path).open(encoding='utf-8', newline='') as stream:
|
||||||
|
reader = csv.DictReader(stream)
|
||||||
|
require(tuple(reader.fieldnames or ()) == REQUEST_FIELDS, 'requests.csv must use the exact five AJ fields in order')
|
||||||
|
rows = []
|
||||||
|
for row in reader:
|
||||||
|
require(set(row) == set(REQUEST_FIELDS), 'Extra/missing request CSV field')
|
||||||
|
rows.append([int(row[key]) for key in REQUEST_FIELDS])
|
||||||
|
return np.asarray(rows, dtype=np.int64).reshape(-1, 5)
|
||||||
|
|
||||||
|
|
||||||
|
def load_run(directory, *, allow_legacy_am=False):
|
||||||
|
directory = Path(directory).resolve(strict=True)
|
||||||
|
require(directory.is_dir(), 'Output is not a directory')
|
||||||
|
require(not any('error' in p.name.lower() or 'failure' in p.name.lower() for p in directory.iterdir()),
|
||||||
|
'Run contains error/failure evidence')
|
||||||
|
summary = _json(directory / 'summary.json')
|
||||||
|
require(summary.get('complete') is True and summary.get('pass_all') is True and summary.get('all_finite') is True and
|
||||||
|
summary.get('steps') == summary.get('completed_ticks'), 'Run is incomplete or failed')
|
||||||
|
state = _npz(directory / 'state.npz', STATE_KEYS)
|
||||||
|
steps, neurons = summary['steps'], len(state['v'])
|
||||||
|
require(summary.get('nodes') == neurons and summary.get('precision') == 'float64' and
|
||||||
|
summary.get('apl_precision') == 'float32' and summary.get('apl_delay_steps') == 18, 'Unexpected AN/AM numerical schema')
|
||||||
|
timing = _json(directory / 'apl-timing-audit.json')
|
||||||
|
pending = np.load(directory / 'apl-pending-tail.float32.npy', mmap_mode='r', allow_pickle=False)
|
||||||
|
terminal_path = directory / 'terminal-queues.npz'
|
||||||
|
if terminal_path.is_file():
|
||||||
|
terminal = _npz(terminal_path, ('spike_ring', 'apl_state', 'apl_pending', 'next_tick'))
|
||||||
|
origin = 'recorded_terminal_queues'
|
||||||
|
else:
|
||||||
|
require(allow_legacy_am and (directory / 'adapter-provenance.json').is_file(), 'Recorded terminal queues are missing')
|
||||||
|
bits = timing.get('final_apl_state_u32_bits')
|
||||||
|
require(isinstance(bits, list) and len(bits) == 2 and all(type(v) is int and 0 <= v < 2**32 for v in bits),
|
||||||
|
'AM has no exact terminal APL bits')
|
||||||
|
terminal = {'spike_ring': reconstructed_fresh_ring(state, steps, neurons),
|
||||||
|
'apl_state': np.asarray(bits, dtype=np.uint32).view(np.float32), 'apl_pending': np.asarray(pending),
|
||||||
|
'next_tick': np.asarray(steps, np.int64)}
|
||||||
|
origin = 'AM_spike_ring_derived_from_fresh_events_APL_bits_from_timing'
|
||||||
|
require(bit_equal(terminal['apl_pending'], pending), 'Terminal/pending file mismatch')
|
||||||
|
require(timing.get('final_apl_state_u32_bits') == terminal['apl_state'].view(np.uint32).tolist(), 'Terminal APL bit metadata mismatch')
|
||||||
|
continued = summary.get('checkpoint_continuation_used', False)
|
||||||
|
require(type(continued) is bool, 'Invalid continuation scope flag')
|
||||||
|
offset = summary.get('global_tick_offset', 0)
|
||||||
|
require(not continued or (type(offset) is int and offset > 0 and summary.get('global_next_tick') == offset + steps),
|
||||||
|
'Continued output lacks an explicit global clock')
|
||||||
|
require(continued or offset == 0, 'Fresh output has a nonzero global offset')
|
||||||
|
traces = {name: np.load(directory / file, mmap_mode='r', allow_pickle=False)
|
||||||
|
for name, file in TRACE_FILES.items() if (directory / file).is_file()}
|
||||||
|
reference = summary.get('diagnostic_mode') == 'reference' or origin.startswith('AM_')
|
||||||
|
if reference or summary.get('full_APL_history_recorded') is True:
|
||||||
|
require(len(traces) == 4, 'Declared reference APL history is incomplete')
|
||||||
|
hashes = _jsonl(directory / 'tick-state-hashes.jsonl') if (directory / 'tick-state-hashes.jsonl').is_file() else None
|
||||||
|
queues = _jsonl(directory / 'queue.jsonl') if (directory / 'queue.jsonl').is_file() else None
|
||||||
|
if reference or summary.get('full_tick_state_hashes_recorded') is True:
|
||||||
|
require(hashes is not None, 'Declared state hashes are missing')
|
||||||
|
if reference or summary.get('full_queue_hashes_recorded') is True:
|
||||||
|
require(queues is not None, 'Declared queue hashes are missing')
|
||||||
|
result = {'source': str(directory), 'state': state, 'terminal': terminal, 'requests': _requests(directory / 'requests.csv'),
|
||||||
|
'steps': steps, 'global_tick_offset': offset, 'summary': summary, 'traces': traces,
|
||||||
|
'state_hashes': hashes, 'queues': queues, 'terminal_origin': origin}
|
||||||
|
validate_run(result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def close_run(run):
|
||||||
|
"""Release read-only mappings opened by load_run; no files are modified."""
|
||||||
|
arrays = [*run.get('traces', {}).values(), *run.get('terminal', {}).values()]
|
||||||
|
closed = set()
|
||||||
|
for array in arrays:
|
||||||
|
current = array
|
||||||
|
while current is not None:
|
||||||
|
mapping = getattr(current, '_mmap', None)
|
||||||
|
if mapping is not None and id(mapping) not in closed:
|
||||||
|
mapping.close(); closed.add(id(mapping))
|
||||||
|
current = getattr(current, 'base', None)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_run(run):
|
||||||
|
"""Array-level contract, also usable by synthetic tests without files."""
|
||||||
|
require(isinstance(run, dict), 'Run must be a dictionary')
|
||||||
|
steps, offset = run['steps'], run['global_tick_offset']
|
||||||
|
require(type(steps) is int and steps > 0 and type(offset) is int and offset >= 0, 'Invalid segment clock')
|
||||||
|
state, terminal = run['state'], run['terminal']
|
||||||
|
require(set(state) == set(STATE_KEYS), 'Expected exactly the six state keys')
|
||||||
|
n = len(state['v'])
|
||||||
|
require(n > 0, 'Empty neuron population')
|
||||||
|
for name, dtype in (('v', np.float64), ('g', np.float64), ('ref', np.int32), ('counts', np.int32)):
|
||||||
|
value = state[name]
|
||||||
|
require(value.dtype == dtype and value.shape == (n,) and np.isfinite(value).all(), 'Invalid state ' + name)
|
||||||
|
require(np.all((state['ref'] >= 0) & (state['ref'] <= 22)) and np.all(state['counts'] >= 0), 'Invalid ref/count values')
|
||||||
|
tick, node = state['step'], state['neuron_idx']
|
||||||
|
require(tick.dtype == node.dtype == np.int32 and tick.ndim == node.ndim == 1 and tick.shape == node.shape and
|
||||||
|
np.all((tick >= 0) & (tick < steps)) and np.all((node >= 0) & (node < n)), 'Invalid events')
|
||||||
|
keys = tick.astype(np.int64) * n + node
|
||||||
|
require(len(keys) < 2 or np.all(keys[1:] > keys[:-1]), 'Events must be sorted unique')
|
||||||
|
require(np.array_equal(np.bincount(node, minlength=n), state['counts']), 'Counts disagree with segment events')
|
||||||
|
request = run['requests']
|
||||||
|
require(isinstance(request, np.ndarray) and request.dtype == np.int64 and request.ndim == 2 and request.shape[1] == 5,
|
||||||
|
'Requests must be int64 rows in the five AJ fields')
|
||||||
|
require(np.all((request[:, 0] >= 0) & (request[:, 0] < steps)) and np.all((request[:, 1] >= 0) & (request[:, 1] < n)) and
|
||||||
|
np.all(request[:, 2] == 1) and np.all((request[:, 3] == 0) | (request[:, 3] == 1)) and
|
||||||
|
np.all(request[:, 4] == 1 - request[:, 3]), 'Invalid request values')
|
||||||
|
request_keys = request[:, 0] * n + request[:, 1]
|
||||||
|
require(len(request_keys) < 2 or np.all(request_keys[1:] > request_keys[:-1]), 'Requests must be sorted unique')
|
||||||
|
require(set(terminal) == {'spike_ring', 'apl_state', 'apl_pending', 'next_tick'}, 'Invalid terminal keys')
|
||||||
|
ring = terminal['spike_ring']
|
||||||
|
require(ring.dtype == np.uint8 and ring.shape == (19, n) and np.all(ring <= 1), 'Invalid spike ring')
|
||||||
|
phase = terminal['next_tick']
|
||||||
|
require(isinstance(phase, np.ndarray) and phase.dtype == np.int64 and phase.shape == () and int(phase) == steps,
|
||||||
|
'Terminal phase must be local segment length')
|
||||||
|
pending, apl_state = terminal['apl_pending'], terminal['apl_state']
|
||||||
|
require(pending.dtype == np.float32 and pending.ndim == 2 and pending.shape[0] == 18 and pending.shape[1] > 0 and
|
||||||
|
apl_state.dtype == np.float32 and apl_state.shape == (2,) and np.isfinite(pending).all() and np.isfinite(apl_state).all(),
|
||||||
|
'Invalid APL terminal state')
|
||||||
|
for t in range(max(0, steps - 19), steps):
|
||||||
|
expected = np.zeros(n, np.uint8)
|
||||||
|
first, last = np.searchsorted(tick, (t, t + 1)); expected[node[first:last]] = 1
|
||||||
|
require(bit_equal(ring[t % 19], expected), 'Written ring slot differs from sparse events')
|
||||||
|
if offset == 0 and steps < 19:
|
||||||
|
require(not np.any(ring[steps:]), 'Fresh uninitialized ring slots are not zero')
|
||||||
|
traces = run.get('traces', {})
|
||||||
|
require(not traces or set(traces) == set(TRACE_FILES), 'Partial APL trace set')
|
||||||
|
for key, trace in traces.items():
|
||||||
|
width = 2 if key in ('drive', 'state') else pending.shape[1]
|
||||||
|
require(trace.dtype == np.float32 and trace.shape == (steps, width) and np.isfinite(trace).all(), 'Invalid APL history: ' + key)
|
||||||
|
if traces:
|
||||||
|
require(bit_equal(traces['state'][-1], apl_state), 'Final APL history/state mismatch')
|
||||||
|
kept = min(steps, 18)
|
||||||
|
require(bit_equal(pending[-kept:], traces['generated'][-kept:]), 'Terminal APL queue does not retain generated suffix')
|
||||||
|
if steps > 18:
|
||||||
|
require(bit_equal(traces['applied'][18:], traces['generated'][:-18]), 'Within-segment APL delay differs from 18')
|
||||||
|
if offset == 0:
|
||||||
|
require(np.all(traces['applied'][:min(18, steps)].view(np.uint32) == 0), 'Fresh APL application padding is not positive zero')
|
||||||
|
hashes, queues = run.get('state_hashes'), run.get('queues')
|
||||||
|
if hashes is not None:
|
||||||
|
require(len(hashes) == steps, 'State hash coverage incomplete')
|
||||||
|
for t, row in enumerate(hashes):
|
||||||
|
require(set(row) == {'tick', *HASH_FIELDS} and type(row['tick']) is int and row['tick'] == t and
|
||||||
|
all(_sha(row[key]) for key in HASH_FIELDS), 'Invalid state hash row')
|
||||||
|
for name in ('v', 'g', 'ref'):
|
||||||
|
raw = np.ascontiguousarray(state[name], dtype=state[name].dtype.newbyteorder('<')).tobytes()
|
||||||
|
require(hashes[-1][name + '_sha256'] == hashlib.sha256(raw).hexdigest(), 'Last state hash differs from terminal ' + name)
|
||||||
|
if queues is not None:
|
||||||
|
require(len(queues) == steps, 'Queue coverage incomplete')
|
||||||
|
for t, row in enumerate(queues):
|
||||||
|
require(set(row) == {'tick', *QUEUE_FIELDS, 'joint_sha256'} and type(row['tick']) is int and row['tick'] == t and
|
||||||
|
type(row['count']) is int and type(row['accepted_count']) is int and 0 <= row['accepted_count'] <= row['count'] and
|
||||||
|
all(_sha(row[key]) for key in ('ordered_edge_sha256', 'accepted_mask_sha256', 'joint_sha256')), 'Invalid queue row')
|
||||||
|
return run
|
||||||
|
|
||||||
|
|
||||||
|
def _run(value, legacy=False):
|
||||||
|
return load_run(value, allow_legacy_am=legacy) if isinstance(value, (str, Path)) else validate_run(value)
|
||||||
|
|
||||||
|
|
||||||
|
def _activity(run):
|
||||||
|
terminal = run['terminal']
|
||||||
|
result = {'spikes': len(run['state']['step']), 'requested': len(run['requests']),
|
||||||
|
'accepted_requests': int(run['requests'][:, 3].sum(dtype=np.int64)),
|
||||||
|
'terminal_apl_state_nonzero_values': int(np.count_nonzero(terminal['apl_state'])),
|
||||||
|
'terminal_pending_nonzero_values': int(np.count_nonzero(terminal['apl_pending']))}
|
||||||
|
traces = run.get('traces', {})
|
||||||
|
result['generated_h_nonzero_values'] = int(np.count_nonzero(traces['generated'])) if traces else None
|
||||||
|
result['applied_h_nonzero_values'] = int(np.count_nonzero(traces['applied'])) if traces else None
|
||||||
|
result['apl_nonzero_observed'] = bool(result['terminal_apl_state_nonzero_values'] or result['terminal_pending_nonzero_values'] or
|
||||||
|
(result['generated_h_nonzero_values'] or 0) or (result['applied_h_nonzero_values'] or 0))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _pair_checks(left, right, prefix='pair'):
|
||||||
|
checks = {prefix + '.steps': left['steps'] == right['steps'], prefix + '.offset': left['global_tick_offset'] == right['global_tick_offset']}
|
||||||
|
for name in STATE_KEYS:
|
||||||
|
checks[prefix + '.state.' + name] = bit_equal(left['state'][name], right['state'][name])
|
||||||
|
checks[prefix + '.requests_five_fields'] = bit_equal(left['requests'], right['requests'])
|
||||||
|
for name in ('spike_ring', 'apl_state', 'apl_pending', 'next_tick'):
|
||||||
|
checks[prefix + '.terminal.' + name] = bit_equal(left['terminal'][name], right['terminal'][name])
|
||||||
|
for field in ('effective_weights_raw_sha256',):
|
||||||
|
a, b = left.get('summary', {}).get(field), right.get('summary', {}).get(field)
|
||||||
|
if a is not None or b is not None:
|
||||||
|
checks[prefix + '.' + field] = _sha(a) and a == b
|
||||||
|
availability = {'APL_traces': bool(left.get('traces')) and bool(right.get('traces')),
|
||||||
|
'state_hashes': left.get('state_hashes') is not None and right.get('state_hashes') is not None,
|
||||||
|
'queue_hashes': left.get('queues') is not None and right.get('queues') is not None}
|
||||||
|
if availability['APL_traces']:
|
||||||
|
for name in TRACE_FILES:
|
||||||
|
checks[prefix + '.trace.' + name] = bit_equal(left['traces'][name], right['traces'][name])
|
||||||
|
if availability['state_hashes']:
|
||||||
|
checks[prefix + '.state_hashes'] = left['state_hashes'] == right['state_hashes']
|
||||||
|
if availability['queue_hashes']:
|
||||||
|
checks[prefix + '.queues'] = left['queues'] == right['queues']
|
||||||
|
return checks, availability
|
||||||
|
|
||||||
|
|
||||||
|
def compare_fresh(left, right, legacy_am=None):
|
||||||
|
left, right = _run(left), _run(right)
|
||||||
|
require(left['global_tick_offset'] == right['global_tick_offset'] == 0, 'Fresh comparison requires fresh runs')
|
||||||
|
checks, available = _pair_checks(left, right)
|
||||||
|
origins = [left.get('terminal_origin', 'caller_arrays'), right.get('terminal_origin', 'caller_arrays')]
|
||||||
|
if legacy_am is not None:
|
||||||
|
legacy = _run(legacy_am, legacy=True)
|
||||||
|
require(legacy['global_tick_offset'] == 0, 'AM control must be fresh')
|
||||||
|
extra, legacy_available = _pair_checks(left, legacy, 'AM')
|
||||||
|
checks.update(extra); available['AM'] = legacy_available
|
||||||
|
# The left run may be light. Do not thereby skip the independent full
|
||||||
|
# diagnostic comparison between the right reference and sealed AM.
|
||||||
|
extra, reference_available = _pair_checks(right, legacy, 'reference_vs_AM')
|
||||||
|
checks.update(extra); available['reference_vs_AM'] = reference_available
|
||||||
|
origins.append(legacy.get('terminal_origin', 'caller_arrays'))
|
||||||
|
activity = _activity(left)
|
||||||
|
exact = bool(all(checks.values()))
|
||||||
|
nonvacuous = activity['spikes'] > 0 and activity['apl_nonzero_observed']
|
||||||
|
return {'schema': 'phase4an-fresh-engineering-comparison-v1', 'numerical_exact': exact,
|
||||||
|
'nonvacuous_activity': nonvacuous, 'pass_all': exact and nonvacuous,
|
||||||
|
'status': 'FAIL-NUMERICAL' if not exact else ('PASS-FRESH-SCOPE' if nonvacuous else 'INCOMPLETE-COVERAGE'),
|
||||||
|
'checks': checks, 'failed_checks': [key for key, value in checks.items() if not value], 'activity': activity,
|
||||||
|
'reference_comparisons_available': available, 'terminal_origins': origins,
|
||||||
|
'cross_segment_validation_performed': False, 'temporal_validation_complete': False,
|
||||||
|
'scope': 'Fresh event/state/request/terminal identity only; no continuation, learning, physiology or performance PASS',
|
||||||
|
'independent_CSR_queue_reconstruction_performed': False,
|
||||||
|
'accepted_nonzero_weight_edge_witness_verified': False,
|
||||||
|
'external_seals_and_input_authority_verified_here': False}
|
||||||
|
|
||||||
|
|
||||||
|
def compare_segments(monolithic, segments):
|
||||||
|
mono = _run(monolithic)
|
||||||
|
parts = [_run(value) for value in segments]
|
||||||
|
require(len(parts) >= 2, 'Need a monolithic run and at least two segments')
|
||||||
|
origin = mono['global_tick_offset']
|
||||||
|
if origin:
|
||||||
|
parent = mono.get('summary', {}).get('parent_checkpoint_manifest_sha256')
|
||||||
|
require(_sha(parent) and parts[0].get('summary', {}).get('parent_checkpoint_manifest_sha256') == parent,
|
||||||
|
'Nonzero-origin comparisons must bind the same starting parent checkpoint')
|
||||||
|
cursor = origin
|
||||||
|
for part in parts:
|
||||||
|
require(part['global_tick_offset'] == cursor, 'Segment clock gap/overlap/order error')
|
||||||
|
require(len(part['state']['v']) == len(mono['state']['v']), 'Segment population changed')
|
||||||
|
cursor += part['steps']
|
||||||
|
require(cursor == origin + mono['steps'], 'Segments do not cover the monolithic duration')
|
||||||
|
checks = {}
|
||||||
|
step = np.concatenate([part['state']['step'].astype(np.int64) + part['global_tick_offset'] for part in parts])
|
||||||
|
neuron = np.concatenate([part['state']['neuron_idx'] for part in parts])
|
||||||
|
checks['concatenated_global_events'] = np.array_equal(step, mono['state']['step'].astype(np.int64) + origin) and bit_equal(neuron, mono['state']['neuron_idx'])
|
||||||
|
counts = np.zeros_like(mono['state']['counts'], dtype=np.int64)
|
||||||
|
for part in parts:
|
||||||
|
counts += part['state']['counts'].astype(np.int64)
|
||||||
|
checks['sum_segment_counts'] = np.array_equal(counts, mono['state']['counts'].astype(np.int64))
|
||||||
|
requests = []
|
||||||
|
for part in parts:
|
||||||
|
rows = part['requests'].copy(); rows[:, 0] += part['global_tick_offset']; requests.append(rows)
|
||||||
|
mono_requests = mono['requests'].copy(); mono_requests[:, 0] += origin
|
||||||
|
checks['concatenated_requests_five_fields'] = bit_equal(np.concatenate(requests), mono_requests)
|
||||||
|
last = parts[-1]
|
||||||
|
for name in ('v', 'g', 'ref'):
|
||||||
|
checks['terminal.' + name] = bit_equal(last['state'][name], mono['state'][name])
|
||||||
|
checks['terminal.normalized_spike_ring'] = bit_equal(normalized_ring(last['terminal']), normalized_ring(mono['terminal']))
|
||||||
|
for name in ('apl_state', 'apl_pending'):
|
||||||
|
checks['terminal.' + name] = bit_equal(last['terminal'][name], mono['terminal'][name])
|
||||||
|
expected_weight = mono.get('summary', {}).get('effective_weights_raw_sha256')
|
||||||
|
if expected_weight is not None:
|
||||||
|
checks['unchanged_effective_weights'] = _sha(expected_weight) and all(part.get('summary', {}).get('effective_weights_raw_sha256') == expected_weight for part in parts)
|
||||||
|
trace_available = bool(mono.get('traces')) and all(part.get('traces') for part in parts)
|
||||||
|
hash_available = mono.get('state_hashes') is not None and all(part.get('state_hashes') is not None for part in parts)
|
||||||
|
queue_available = mono.get('queues') is not None and all(part.get('queues') is not None for part in parts)
|
||||||
|
if trace_available:
|
||||||
|
for name in TRACE_FILES:
|
||||||
|
checks['concatenated_APL.' + name] = all(bit_equal(part['traces'][name], mono['traces'][name][part['global_tick_offset'] - origin:part['global_tick_offset'] - origin + part['steps']]) for part in parts)
|
||||||
|
if hash_available:
|
||||||
|
checks['concatenated_per_tick_state_hashes'] = all(all(row[name] == mono['state_hashes'][part['global_tick_offset'] - origin + tick][name] for name in HASH_FIELDS)
|
||||||
|
for part in parts for tick, row in enumerate(part['state_hashes']))
|
||||||
|
if queue_available:
|
||||||
|
checks['concatenated_queue_order_and_acceptance'] = all(all(row[name] == mono['queues'][part['global_tick_offset'] - origin + tick][name] for name in QUEUE_FIELDS)
|
||||||
|
for part in parts for tick, row in enumerate(part['queues']))
|
||||||
|
boundary_rows = []
|
||||||
|
events = mono['state']['step'].astype(np.int64) + origin
|
||||||
|
for before, part in zip(parts, parts[1:]):
|
||||||
|
cut, stop = part['global_tick_offset'], part['global_tick_offset'] + part['steps']
|
||||||
|
emitted_before = (events < cut) & (events + 18 >= cut)
|
||||||
|
arriving_this_segment = emitted_before & (events + 18 < stop)
|
||||||
|
pending = before['terminal']['apl_pending']
|
||||||
|
consume = min(part['steps'], 18)
|
||||||
|
spike_carry = normalized_ring(before['terminal'])
|
||||||
|
# Future local arrival tick j consumes normalized slot j+1. This also
|
||||||
|
# covers spikes inherited from before a nonzero monolithic origin,
|
||||||
|
# which are legitimately absent from that run's local event log.
|
||||||
|
pending_spikes = int(spike_carry[1:].sum(dtype=np.int64))
|
||||||
|
arriving_spikes = int(spike_carry[1:consume + 1].sum(dtype=np.int64))
|
||||||
|
if cut - origin >= 18:
|
||||||
|
checks['boundary.' + str(cut) + '.ring_pending_event_count'] = pending_spikes == int(emitted_before.sum())
|
||||||
|
# Slots not overwritten by this short segment must remain bit-identical.
|
||||||
|
if part['steps'] < 19:
|
||||||
|
checks['boundary.' + str(cut) + '.unwritten_spike_slots'] = bit_equal(part['terminal']['spike_ring'][part['steps']:], spike_carry[part['steps']:])
|
||||||
|
if part['steps'] < 18:
|
||||||
|
checks['boundary.' + str(cut) + '.unconsumed_APL'] = bit_equal(part['terminal']['apl_pending'][:18 - part['steps']], pending[part['steps']:])
|
||||||
|
if part.get('traces'):
|
||||||
|
checks['boundary.' + str(cut) + '.applied_parent_APL'] = bit_equal(part['traces']['applied'][:consume], pending[:consume])
|
||||||
|
queue_rows = (part['queues'][:consume] if part.get('queues') is not None else
|
||||||
|
mono['queues'][cut - origin:cut - origin + consume] if mono.get('queues') is not None else None)
|
||||||
|
boundary_rows.append({'global_tick': cut, 'next_segment_steps': part['steps'],
|
||||||
|
'pending_source_spike_events': pending_spikes, 'source_spikes_arriving_in_next_segment': arriving_spikes,
|
||||||
|
'visible_local_log_source_spikes_arriving_in_next_segment': int(arriving_this_segment.sum()),
|
||||||
|
'pending_source_spike_origin': 'recorded normalized ring slots; includes pre-origin carry',
|
||||||
|
'observed_carried_arriving_edges': sum(row['count'] for row in queue_rows) if queue_rows is not None else None,
|
||||||
|
'observed_carried_accepted_edges': sum(row['accepted_count'] for row in queue_rows) if queue_rows is not None else None,
|
||||||
|
'carried_APL_nonzero_pending_values': int(np.count_nonzero(pending)),
|
||||||
|
'carried_APL_nonzero_values_applied_in_next_segment': int(np.count_nonzero(pending[:consume])),
|
||||||
|
'carried_APL_nonzero_rows_applied_in_next_segment': int(np.count_nonzero(np.any(pending[:consume] != 0, axis=1)))})
|
||||||
|
source_arrivals = sum(row['source_spikes_arriving_in_next_segment'] for row in boundary_rows)
|
||||||
|
edge_counts = [row['observed_carried_arriving_edges'] for row in boundary_rows]
|
||||||
|
observed_edges = sum(value for value in edge_counts if value is not None) if any(value is not None for value in edge_counts) else None
|
||||||
|
applied_values = sum(row['carried_APL_nonzero_values_applied_in_next_segment'] for row in boundary_rows)
|
||||||
|
activity = _activity(mono)
|
||||||
|
coverage = {'boundaries': boundary_rows, 'source_spikes_crossing_boundaries_and_due_in_receiver': source_arrivals,
|
||||||
|
'observed_carried_arriving_edges': observed_edges, 'carried_APL_nonzero_applied_values': applied_values,
|
||||||
|
'boundary_pending_event_counts_may_overlap_across_short_segments': True,
|
||||||
|
'actual_edge_arrival_coverage_known': observed_edges is not None}
|
||||||
|
nonvacuous = bool(activity['spikes'] > 0 and activity['apl_nonzero_observed'] and source_arrivals > 0 and
|
||||||
|
observed_edges is not None and observed_edges > 0 and applied_values > 0)
|
||||||
|
exact = bool(all(checks.values()))
|
||||||
|
return {'schema': 'phase4an-segment-engineering-comparison-v1', 'numerical_exact': exact,
|
||||||
|
'nonvacuous_temporal_coverage': nonvacuous, 'temporal_validation_complete': exact and nonvacuous,
|
||||||
|
'pass_all': exact and nonvacuous,
|
||||||
|
'status': 'FAIL-NUMERICAL' if not exact else ('PASS-SEGMENT-SCOPE' if nonvacuous else 'INCOMPLETE-COVERAGE'),
|
||||||
|
'checks': checks, 'failed_checks': [key for key, value in checks.items() if not value],
|
||||||
|
'activity': activity, 'coverage': coverage, 'segments': len(parts), 'steps': mono['steps'], 'global_tick_offset': origin,
|
||||||
|
'reference_comparisons_available': {'APL_traces': trace_available, 'state_hashes': hash_available, 'queue_hashes': queue_available},
|
||||||
|
'queue_joint_hash_compared': False, 'queue_joint_hash_exclusion_reason': 'local tick header differs; ordered-edge/mask hashes and counts compared when available',
|
||||||
|
'scope': 'Explicit finite engineering trajectory/terminal/carry checks only; no learning, physiology, or performance PASS',
|
||||||
|
'independent_CSR_queue_reconstruction_performed': False,
|
||||||
|
'accepted_nonzero_weight_edge_witness_verified': False,
|
||||||
|
'external_seals_and_input_authority_verified_here': False}
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
"""Pure exact input derivations for a future preregistered engineering gate.
|
||||||
|
|
||||||
|
No I/O, random draws, scientific execution or registration. The coordinator
|
||||||
|
must bind the original case/overlay and every static dependency to the sealed
|
||||||
|
AM manifest before using these helpers. A self-consistent dictionary is not
|
||||||
|
independent input authority. Derivation outputs are copies; validate_requests
|
||||||
|
only checks and returns its original, unmodified input.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import re
|
||||||
|
from pathlib import PurePosixPath
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
N = 166700
|
||||||
|
AM_HELPER_SHA = '7f891d0ba79b393c96e75fd2dee2eddc51e57d8213eaac2779703bc2c18712b4'
|
||||||
|
MASK_SHA = '8b0fb6eb2e6c31da4d17dc20d890aa3f367e514f05642de5bad6b42a1611c05b'
|
||||||
|
|
||||||
|
|
||||||
|
def require(ok, message):
|
||||||
|
if not ok:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _positive_int(value, name):
|
||||||
|
require(type(value) is int and 0 < value <= np.iinfo(np.int32).max, 'Invalid ' + name)
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(value):
|
||||||
|
return type(value) is str and re.fullmatch('[0-9a-f]{64}', value) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def _absolute(value):
|
||||||
|
return (type(value) is str and value.startswith('/') and not value.startswith('//') and
|
||||||
|
PurePosixPath(value).is_absolute() and
|
||||||
|
'..' not in PurePosixPath(value).parts)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_requests(requests, steps):
|
||||||
|
_positive_int(steps, 'steps')
|
||||||
|
require(type(requests) is dict and set(requests) == {'tick', 'neuron_idx'}, 'Exact sparse request schema required')
|
||||||
|
for key, value in requests.items():
|
||||||
|
require(isinstance(value, np.ndarray) and value.dtype == np.int32 and value.ndim == 1,
|
||||||
|
'Request requires int32 vector: ' + key)
|
||||||
|
tick, neuron = requests['tick'], requests['neuron_idx']
|
||||||
|
require(tick.shape == neuron.shape, 'Request shape mismatch')
|
||||||
|
require(np.all((tick >= 0) & (tick < steps)) and np.all((neuron >= 0) & (neuron < N)), 'Request outside fixed trial/canonical set')
|
||||||
|
key = tick.astype(np.int64) * N + neuron
|
||||||
|
require(len(key) < 2 or np.all(key[1:] > key[:-1]), 'Requests must be sorted and unique; no implicit deduplication')
|
||||||
|
return requests
|
||||||
|
|
||||||
|
|
||||||
|
def slice_requests(requests, steps, start, stop):
|
||||||
|
"""Half-open exact slice; translate ticks only, never redraw or reorder."""
|
||||||
|
validate_requests(requests, steps)
|
||||||
|
require(type(start) is int and type(stop) is int and 0 <= start < stop <= steps, 'Invalid half-open input interval')
|
||||||
|
lo, hi = np.searchsorted(requests['tick'], (start, stop))
|
||||||
|
result = {'tick': (requests['tick'][lo:hi] - np.int32(start)).copy(),
|
||||||
|
'neuron_idx': requests['neuron_idx'][lo:hi].copy()}
|
||||||
|
validate_requests(result, stop - start)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def verify_partition(original, steps, intervals, parts):
|
||||||
|
"""Verify complete coverage plus exact request reconstruction, even blanks."""
|
||||||
|
validate_requests(original, steps)
|
||||||
|
require(type(intervals) in (list, tuple) and type(parts) in (list, tuple) and
|
||||||
|
len(intervals) == len(parts) > 0, 'Partition needs all intervals and parts')
|
||||||
|
end, reconstructed = 0, {'tick': [], 'neuron_idx': []}
|
||||||
|
for interval, part in zip(intervals, parts):
|
||||||
|
require(type(interval) in (list, tuple) and len(interval) == 2, 'Invalid interval schema')
|
||||||
|
start, stop = interval
|
||||||
|
require(type(start) is int and type(stop) is int and start == end and start < stop <= steps,
|
||||||
|
'Partition gap/overlap/nonpositive interval')
|
||||||
|
validate_requests(part, stop - start)
|
||||||
|
expected = slice_requests(original, steps, start, stop)
|
||||||
|
require(all(part[k].tobytes() == expected[k].tobytes() for k in part), 'Partition changes actual requests')
|
||||||
|
reconstructed['tick'].append(part['tick'].astype(np.int64) + start)
|
||||||
|
reconstructed['neuron_idx'].append(part['neuron_idx'])
|
||||||
|
end = stop
|
||||||
|
require(end == steps, 'Partition omits the terminal interval')
|
||||||
|
require(np.array_equal(np.concatenate(reconstructed['tick']), original['tick']) and
|
||||||
|
np.array_equal(np.concatenate(reconstructed['neuron_idx']), original['neuron_idx']), 'Reconstructed input mismatch')
|
||||||
|
return {'complete': True, 'intervals': [list(x) for x in intervals], 'steps': steps,
|
||||||
|
'requests': len(original['tick']), 'random_draws': 0, 'input_reselected': False}
|
||||||
|
|
||||||
|
|
||||||
|
def derive_spec(original, *, start, stop, budget_root, output_budget_bytes, parent_sha=None):
|
||||||
|
"""Explicit new case admission/budget labels; frozen model fields unchanged.
|
||||||
|
|
||||||
|
New budget_root must be outside the OLD budget tree. Full source/data/
|
||||||
|
ancestor containment checks remain the runtime/coordinator's responsibility.
|
||||||
|
A nonzero interval requires the actual parent manifest's external SHA;
|
||||||
|
future parent hashes must not be fabricated during preregistration.
|
||||||
|
"""
|
||||||
|
require(type(original) is dict and original.get('kind') == 'fullgraph', 'Original fullgraph spec required')
|
||||||
|
steps = original.get('steps')
|
||||||
|
_positive_int(steps, 'original steps')
|
||||||
|
require(original.get('dt_ms') == .1 and original.get('duration_ms') == steps * .1 and
|
||||||
|
type(original.get('apl_delay_steps')) is int and original['apl_delay_steps'] == 18 and
|
||||||
|
original.get('record_history') is False and original.get('training') is False and
|
||||||
|
original.get('within_trial_weight_updates', False) is False, 'Original fixed D18 trial contract required')
|
||||||
|
require(not any('checkpoint' in k.lower() or k in ('global_tick_offset', 'resume', 'continuation', 'initial_state')
|
||||||
|
for k in original), 'Original must be a fresh case')
|
||||||
|
require(type(start) is int and type(stop) is int and 0 <= start < stop <= steps, 'Invalid case interval')
|
||||||
|
require(_absolute(budget_root) and _absolute(original.get('budget_root')), 'Explicit absolute budget roots required')
|
||||||
|
new, old = PurePosixPath(budget_root), PurePosixPath(original['budget_root'])
|
||||||
|
require(not new.is_relative_to(old) and not old.is_relative_to(new), 'New output budget must not overlap old experiment tree')
|
||||||
|
require(type(output_budget_bytes) is int and output_budget_bytes > 0, 'Explicit positive byte budget required')
|
||||||
|
require((start == 0 and parent_sha is None) or (start > 0 and _sha(parent_sha)), 'Only a continued interval needs a real parent SHA')
|
||||||
|
result = copy.deepcopy(original)
|
||||||
|
result.update(steps=stop - start, duration_ms=(stop - start) * .1, max_steps=steps,
|
||||||
|
budget_root=budget_root, output_budget_bytes=output_budget_bytes,
|
||||||
|
within_trial_weight_updates=False,
|
||||||
|
outer_protocol='phase4an-engineering-validation-no-training')
|
||||||
|
if start:
|
||||||
|
result.update(global_tick_offset=start, parent_checkpoint_manifest_sha256=parent_sha)
|
||||||
|
changes = {key: {'present_before': key in original, 'before': copy.deepcopy(original.get(key)),
|
||||||
|
'after': copy.deepcopy(value)} for key, value in result.items()
|
||||||
|
if key not in original or value != original[key]}
|
||||||
|
allowed = {'steps', 'duration_ms', 'max_steps', 'budget_root', 'output_budget_bytes',
|
||||||
|
'within_trial_weight_updates', 'outer_protocol', 'global_tick_offset',
|
||||||
|
'parent_checkpoint_manifest_sha256'}
|
||||||
|
require(set(changes) <= allowed and all(result[k] == v for k, v in original.items() if k not in allowed),
|
||||||
|
'Unexpected scientific spec edit')
|
||||||
|
return result, {'input_interval': [start, stop], 'explicit_field_changes': changes,
|
||||||
|
'all_other_fields_unchanged': True, 'random_draws': 0, 'training': False}
|
||||||
|
|
||||||
|
|
||||||
|
def adapt_overlay_manifest(original, am_helper_path):
|
||||||
|
"""Translate observed AM manifest fields; preserve original overlay bytes.
|
||||||
|
|
||||||
|
This function validates declarations only. Callers independently rehash
|
||||||
|
every referenced file against external AM/source authority before use.
|
||||||
|
"""
|
||||||
|
require(type(original) is dict and original.get('schema') == 'phase4am-overlay-v1' and
|
||||||
|
original.get('overlay_name') in ('zero', 'static25') and
|
||||||
|
original.get('training') is False and original.get('fixed_for_whole_trial') is True,
|
||||||
|
'Only the fixed AM zero/static25 overlays are in this engineering gate')
|
||||||
|
require(original.get('mask_sha256') == MASK_SHA and _absolute(am_helper_path), 'Original mask/helper identity required')
|
||||||
|
names = ('overlay_name', 'overlay_sha256', 'mask_path', 'mask_sha256',
|
||||||
|
'base_candidate_path', 'base_candidate_sha256', 'aj_model_dir')
|
||||||
|
require(all(k in original for k in names), 'Missing observed AM manifest field')
|
||||||
|
require(all(_sha(original[k]) for k in ('overlay_sha256', 'mask_sha256', 'base_candidate_sha256')),
|
||||||
|
'Invalid external overlay/base SHA')
|
||||||
|
require(all(_absolute(original[k]) for k in ('mask_path', 'base_candidate_path', 'aj_model_dir')),
|
||||||
|
'Invalid external overlay/base path')
|
||||||
|
return dict(schema='phase4an-overlay-v1', **{k: copy.deepcopy(original[k]) for k in names},
|
||||||
|
am_overlay_path=am_helper_path, am_overlay_sha256=AM_HELPER_SHA)
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
"""Pure fixed 32-call engineering inventory; no I/O, GPU or input preparation.
|
||||||
|
|
||||||
|
Rows describe required executions and comparisons, not evidence they occurred.
|
||||||
|
The external AM reference is a symbolic role: a coordinator must bind its actual
|
||||||
|
case, overlay, sealed outputs and hashes before execution. A validated plan does
|
||||||
|
not prove input authority, comparison success, conditioning or learning.
|
||||||
|
All public results are independently constructed mutable copies.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
SCHEMA = 'phase4an-engineering-plan-draft-v1'
|
||||||
|
OVERLAYS = ('zero', 'static25')
|
||||||
|
MODES = ('reference', 'light')
|
||||||
|
CHAIN_LENGTHS = (5, 13, 1, 481, 500)
|
||||||
|
PREFIX_ENDS = (18, 19, 500)
|
||||||
|
|
||||||
|
|
||||||
|
def _fresh_id(overlay, mode, repeat=0):
|
||||||
|
return f'{overlay}--fresh--{mode}-r{repeat}'
|
||||||
|
|
||||||
|
|
||||||
|
def _prefix_id(overlay, end):
|
||||||
|
return f'{overlay}--prefix--reference-t{end:04d}'
|
||||||
|
|
||||||
|
|
||||||
|
def _chain_id(overlay, mode, index):
|
||||||
|
return f'{overlay}--chain--{mode}-s{index:02d}'
|
||||||
|
|
||||||
|
|
||||||
|
def _comparison(check, row, *, reference=None, external=None, scope, candidates=None):
|
||||||
|
"""Exact descriptors; start/stop are always absolute, half-open ticks."""
|
||||||
|
return dict(check=check, reference_row_id=reference, external_reference=external,
|
||||||
|
candidate_row_ids=[row['row_id']] if candidates is None else list(candidates),
|
||||||
|
start=row['start'], stop=row['stop'], scope=scope)
|
||||||
|
|
||||||
|
|
||||||
|
def _row(identity, overlay, mode, kind, start, stop, parent=None):
|
||||||
|
return dict(row_id=identity, overlay=overlay, mode=mode, kind=kind,
|
||||||
|
start=start, stop=stop, steps=stop - start, parent_row_id=parent,
|
||||||
|
expected_comparisons=[])
|
||||||
|
|
||||||
|
|
||||||
|
def _terminal_reference(overlay, stop):
|
||||||
|
if stop == 5:
|
||||||
|
return _chain_id(overlay, 'reference', 0)
|
||||||
|
if stop == 1000:
|
||||||
|
return _fresh_id(overlay, 'reference')
|
||||||
|
return _prefix_id(overlay, stop)
|
||||||
|
|
||||||
|
|
||||||
|
def build_plan():
|
||||||
|
"""Return the sole current proposal: 32 calls / 11,074 full-graph ticks.
|
||||||
|
|
||||||
|
kind='chain' with parent_row_id=None is its fresh first segment, NOT a
|
||||||
|
continuation from an assumed zero checkpoint. Later segments explicitly
|
||||||
|
reference their predecessor. A chain's local request/event coordinates
|
||||||
|
are translated using start; terminal.next_tick remains its local phase.
|
||||||
|
|
||||||
|
All fresh/prefix rows globally precede chains. Reference chains precede
|
||||||
|
light chains, allowing the reference first segment to supply prefix 5.
|
||||||
|
No extra prefix-5 execution, synthetic 52-call matrix, long idle run,
|
||||||
|
input selection, training, parameter update or executor is implemented.
|
||||||
|
|
||||||
|
Comparison scopes:
|
||||||
|
reference_full/reference_prefix/reference_slice: include reference
|
||||||
|
tick-state hashes, APL traces, queues, requests, events and states;
|
||||||
|
light_recorded: requests.csv, events/counts, final state, APL state,
|
||||||
|
normalized pending queues and finite/weight/arrival accounting;
|
||||||
|
terminal_state_and_normalized_queues: no comparison of segment counts
|
||||||
|
against cumulative prefix counts; counts are handled by chain_exact;
|
||||||
|
parent_state_and_pending_queues: bound parent restoration/carry checks.
|
||||||
|
A comparator must implement these scopes from artifacts, not this plan's
|
||||||
|
existence. Shift local queue headers before comparing absolute timelines.
|
||||||
|
"""
|
||||||
|
rows = []
|
||||||
|
for overlay in OVERLAYS:
|
||||||
|
for mode, repeat in (('reference', 0), ('light', 0), ('light', 1)):
|
||||||
|
row = _row(_fresh_id(overlay, mode, repeat), overlay, mode, 'fresh', 0, 1000)
|
||||||
|
scope = 'reference_full' if mode == 'reference' else 'light_recorded'
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'am_exact', row, external='sealed_AM_selected_case_same_overlay_r0', scope=scope))
|
||||||
|
if mode == 'light':
|
||||||
|
reference = _fresh_id(overlay, 'reference' if repeat == 0 else 'light')
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'fresh_exact', row, reference=reference, scope='light_recorded'))
|
||||||
|
rows.append(row)
|
||||||
|
for end in PREFIX_ENDS:
|
||||||
|
row = _row(_prefix_id(overlay, end), overlay, 'reference', 'prefix', 0, end)
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'prefix_of_reference', row, reference=_fresh_id(overlay, 'reference'), scope='reference_prefix'))
|
||||||
|
rows.append(row)
|
||||||
|
|
||||||
|
for overlay in OVERLAYS:
|
||||||
|
for mode in MODES:
|
||||||
|
start, parent, members = 0, None, []
|
||||||
|
for index, length in enumerate(CHAIN_LENGTHS):
|
||||||
|
row = _row(_chain_id(overlay, mode, index), overlay, mode, 'chain', start, start + length, parent)
|
||||||
|
members.append(row['row_id'])
|
||||||
|
if mode == 'reference':
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'segment_of_reference', row, reference=_fresh_id(overlay, 'reference'), scope='reference_slice'))
|
||||||
|
else:
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'segment_exact', row, reference=_chain_id(overlay, 'reference', index), scope='light_recorded'))
|
||||||
|
terminal = _terminal_reference(overlay, row['stop'])
|
||||||
|
if terminal != row['row_id']:
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'checkpoint_exact', row, reference=terminal, scope='terminal_state_and_normalized_queues'))
|
||||||
|
if parent is not None:
|
||||||
|
row['expected_comparisons'].append(_comparison(
|
||||||
|
'parent_carry', row, reference=parent, scope='parent_state_and_pending_queues'))
|
||||||
|
if index == len(CHAIN_LENGTHS) - 1:
|
||||||
|
comparison = _comparison('chain_exact', row, reference=_fresh_id(overlay, mode),
|
||||||
|
scope='reference_full' if mode == 'reference' else 'light_recorded', candidates=members)
|
||||||
|
comparison['start'] = 0
|
||||||
|
row['expected_comparisons'].append(comparison)
|
||||||
|
rows.append(row)
|
||||||
|
start, parent = row['stop'], row['row_id']
|
||||||
|
|
||||||
|
return dict(schema=SCHEMA, overlays=list(OVERLAYS), chain_lengths=list(CHAIN_LENGTHS),
|
||||||
|
rows=rows, total_calls=32, total_ticks=11074,
|
||||||
|
training=False, candidate_generated=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _exact(actual, expected, path):
|
||||||
|
"""JSON-shaped values with exact Python types; True is not integer 1."""
|
||||||
|
if type(actual) is not type(expected):
|
||||||
|
raise ValueError(f'Plan type mismatch at {path}')
|
||||||
|
if type(expected) is dict:
|
||||||
|
if any(type(key) is not str for key in actual) or set(actual) != set(expected):
|
||||||
|
raise ValueError(f'Plan fields mismatch at {path}')
|
||||||
|
for key in expected:
|
||||||
|
_exact(actual[key], expected[key], path + '.' + key)
|
||||||
|
elif type(expected) is list:
|
||||||
|
if len(actual) != len(expected):
|
||||||
|
raise ValueError(f'Plan inventory length mismatch at {path}')
|
||||||
|
for index, (left, right) in enumerate(zip(actual, expected)):
|
||||||
|
_exact(left, right, f'{path}[{index}]')
|
||||||
|
elif actual != expected:
|
||||||
|
raise ValueError(f'Plan value mismatch at {path}')
|
||||||
|
|
||||||
|
|
||||||
|
def validate_plan(plan):
|
||||||
|
"""Reject any noncanonical plan; return a new copy, never a PASS receipt.
|
||||||
|
|
||||||
|
Exact canonical reconstruction rejects unknown fields, order changes,
|
||||||
|
omitted/extra overlays or calls, interval gaps, false parent links and
|
||||||
|
weakening/removal of required comparisons. No input files are read.
|
||||||
|
"""
|
||||||
|
canonical = build_plan()
|
||||||
|
_exact(plan, canonical, 'plan')
|
||||||
|
return canonical
|
||||||
@@ -0,0 +1,532 @@
|
|||||||
|
"""Read-only AM authority verification and exclusive AN engineering preparation.
|
||||||
|
|
||||||
|
Public prepare(model_manifest_sha, experiment_manifest_sha, final_sha) requires
|
||||||
|
three externally recorded, actual AM evidence hashes. It verifies both complete
|
||||||
|
AM seals once, checks their declared gates, then fixes the first planned r0 case.
|
||||||
|
It creates only templates/requests/overlay descriptors and a preregistration;
|
||||||
|
never a GPU trajectory or fictitious future checkpoint hash. The caller records
|
||||||
|
the returned preregistration SHA outside this experiment before execution.
|
||||||
|
|
||||||
|
read_registration(expected_sha) rehashes the exact used source/input inventory
|
||||||
|
and control anchors without rerunning either scientific gate or full AM seal.
|
||||||
|
Future spec.json/checkpoint receipts are runtime artifacts, not preregistered
|
||||||
|
bytes. No frozen model module globals are modified; no Torch is imported.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import importlib.util
|
||||||
|
import json
|
||||||
|
from pathlib import Path, PurePosixPath
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path('/data/digital-drosophila')
|
||||||
|
MODEL = Path(__file__).resolve().parent
|
||||||
|
EXP = ROOT / 'experiments/phase4an-engineering-validation'
|
||||||
|
AM_MODEL_REL = Path('models/male-cns-lif/wholebrain-plastic-interface-v1')
|
||||||
|
AM_EXP_REL = Path('experiments/phase4am-wholebrain-plastic-interface')
|
||||||
|
AK_REL = Path('experiments/phase4ak-apl-timing-validation')
|
||||||
|
AI_HELPER_REL = Path('models/male-cns-lif/pn-recruitment-audit-v1/publication.py')
|
||||||
|
AI_HELPER_SHA = '7a79c499098b74163e7bb16adabcbc54e7069dafa204d0b99c7f4c03d79f8016'
|
||||||
|
AM_PREREG_SHA = '465886b78ada08092c2c83de278844707499718977fb6dc6a7608391da0e5304'
|
||||||
|
AM_OVERLAY_SHA = '7f891d0ba79b393c96e75fd2dee2eddc51e57d8213eaac2779703bc2c18712b4'
|
||||||
|
FINAL_STATUS = 'PASS-EXACT-WHOLEBRAIN-PLASTIC-INTERFACE-NOT-LEARNING'
|
||||||
|
REG_SCHEMA = 'phase4an-engineering-registration-v1'
|
||||||
|
BUDGET = {'output_budget_bytes': 8 * 1024**3, 'minimum_free_reserve_bytes': 10 * 1024**3}
|
||||||
|
MODULES = ('runtime_light', 'runtime_continuation', 'engineering_inputs', 'engineering_plan',
|
||||||
|
'engineering_compare', 'engineering_queue_audit', 'engineering_prepare', 'engineering_workflow',
|
||||||
|
'engineering_scopes', 'engineering_analysis')
|
||||||
|
SOURCE_FILES = tuple(sorted([name + '.py' for name in MODULES] + ['test_' + name + '.py' for name in MODULES] + ['ENGINEERING_GATE_DRAFT.md']))
|
||||||
|
REFERENCES = ('auditory-10hz', 'auditory-100hz', 'olfactory-50hz', 'mechanosensory-50hz', 'gustatory-50hz')
|
||||||
|
GRAPH_FILES = ('nodes.npy', 'edge_id.npy', 'src.npy', 'dst.npy', 'signed_raw.npy', 'ptr.npy', 'weights.npy')
|
||||||
|
APL_FILES = ('input_matrix.npy', 'output_matrix.npy', 'kc_globals.npy', 'apl_globals.npy')
|
||||||
|
_MODULE_CACHE = {}
|
||||||
|
|
||||||
|
|
||||||
|
def require(ok, message):
|
||||||
|
if not ok:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def digest(path):
|
||||||
|
value = hashlib.sha256()
|
||||||
|
with Path(path).open('rb') as stream:
|
||||||
|
for block in iter(lambda: stream.read(8 << 20), b''):
|
||||||
|
value.update(block)
|
||||||
|
return value.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def sha(value):
|
||||||
|
return type(value) is str and re.fullmatch('[0-9a-f]{64}', value) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def read(path):
|
||||||
|
def unique(pairs):
|
||||||
|
result = {}
|
||||||
|
for key, value in pairs:
|
||||||
|
require(key not in result, 'Duplicate JSON key: ' + key)
|
||||||
|
result[key] = value
|
||||||
|
return result
|
||||||
|
return json.loads(Path(path).read_text(encoding='utf-8'), object_pairs_hook=unique,
|
||||||
|
parse_constant=lambda value: (_ for _ in ()).throw(ValueError('Nonfinite JSON: ' + value)))
|
||||||
|
|
||||||
|
|
||||||
|
def save(path, value):
|
||||||
|
path = Path(path)
|
||||||
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
with path.open('x', encoding='utf-8') as stream:
|
||||||
|
json.dump(value, stream, sort_keys=True, indent=2, ensure_ascii=False, allow_nan=False)
|
||||||
|
stream.write('\n')
|
||||||
|
|
||||||
|
|
||||||
|
def load_module(name, path, expected):
|
||||||
|
path = Path(path).resolve(strict=True)
|
||||||
|
raw = path.read_bytes()
|
||||||
|
require(hashlib.sha256(raw).hexdigest() == expected, 'Source pin mismatch: ' + str(path))
|
||||||
|
identity = str(path), expected
|
||||||
|
if name in sys.modules:
|
||||||
|
require(_MODULE_CACHE.get(name) == (identity, sys.modules[name]), 'Unverified module namespace collision')
|
||||||
|
return sys.modules[name]
|
||||||
|
spec = importlib.util.spec_from_file_location(name, path)
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[name] = module
|
||||||
|
try:
|
||||||
|
exec(compile(raw, str(path), 'exec'), module.__dict__)
|
||||||
|
except BaseException:
|
||||||
|
sys.modules.pop(name, None)
|
||||||
|
raise
|
||||||
|
_MODULE_CACHE[name] = identity, module
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
def source_inventory(model):
|
||||||
|
model = Path(model).resolve(strict=True)
|
||||||
|
result = {}
|
||||||
|
for name in SOURCE_FILES:
|
||||||
|
path = model / name
|
||||||
|
require(path.is_file() and not path.is_symlink() and path.resolve().parent == model, 'Required engineering source missing/linked: ' + name)
|
||||||
|
result[str(path)] = digest(path)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _relative(value):
|
||||||
|
require(type(value) is str and value and '\\' not in value, 'Invalid relative inventory path')
|
||||||
|
path = PurePosixPath(value)
|
||||||
|
require(not path.is_absolute() and str(path) == value and all(part not in ('', '.', '..') and ':' not in part for part in path.parts),
|
||||||
|
'Noncanonical relative inventory path')
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_file(root, relative):
|
||||||
|
relative = _relative(relative)
|
||||||
|
root = Path(root).resolve(strict=True)
|
||||||
|
path = root
|
||||||
|
for part in relative.parts:
|
||||||
|
path = path / part
|
||||||
|
require(not path.is_symlink(), 'Linked authority/input file')
|
||||||
|
require(path.is_file() and path.resolve().is_relative_to(root), 'Missing or escaping input file')
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def _index(rows):
|
||||||
|
require(type(rows) is list and rows, 'Missing sealed inventory rows')
|
||||||
|
result = {}
|
||||||
|
for row in rows:
|
||||||
|
require(type(row) is dict and set(row) == {'path', 'bytes', 'sha256'} and
|
||||||
|
type(row['bytes']) is int and row['bytes'] >= 0 and sha(row['sha256']), 'Invalid sealed inventory row')
|
||||||
|
_relative(row['path'])
|
||||||
|
require(row['path'] not in result, 'Duplicate sealed inventory row')
|
||||||
|
result[row['path']] = row
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _bind(inputs, path, expected=None):
|
||||||
|
path = Path(path).resolve(strict=True)
|
||||||
|
actual = digest(path)
|
||||||
|
require(expected is None or actual == expected, 'Authority/input SHA mismatch: ' + str(path))
|
||||||
|
require(str(path) not in inputs or inputs[str(path)] == actual, 'Conflicting authority for input')
|
||||||
|
inputs[str(path)] = actual
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def _sealed_json(experiment, index, relative):
|
||||||
|
require(relative in index, 'Required authority absent from AM seal: ' + relative)
|
||||||
|
path = _safe_file(experiment, relative)
|
||||||
|
require(digest(path) == index[relative]['sha256'], 'Sealed JSON changed: ' + relative)
|
||||||
|
return read(path)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_final_status(final, scientific, before, after, refs):
|
||||||
|
"""Check actual AM final/summary/report schemas, never infer scientific PASS."""
|
||||||
|
require(final.get('status') == scientific.get('status') == FINAL_STATUS, 'AM final status is not the required completed interface gate')
|
||||||
|
for key in ('zero_overlay_exact', 'static25_repeat_exact', 'old_integrity_pass', 'frozen_five_reference_pass',
|
||||||
|
'frozen_eligibility_and_mask_unchanged', 'base_weights_unchanged'):
|
||||||
|
require(final.get(key) is True, 'AM final gate failed/missing: ' + key)
|
||||||
|
require(final.get('primary_trials_per_stage') == 120 and final.get('repeats_per_stage') == 24 and
|
||||||
|
scientific.get('primary_trials_per_stage') == 120 and scientific.get('technical_repeats_per_stage') == 24,
|
||||||
|
'AM complete coverage counts changed')
|
||||||
|
for value in (final, scientific):
|
||||||
|
require(value.get('training') is False and value.get('learned_candidate') is False, 'AM interface must not claim training/learning')
|
||||||
|
require(scientific.get('zero_overlay_exact') is True and scientific.get('static25_repeat_exact') is True, 'Scientific summary gate mismatch')
|
||||||
|
require(type(before) is dict and type(after) is dict and len(before) == len(after) == 28 and set(before) == set(after),
|
||||||
|
'AM must retain the same complete 28-root old-integrity inventory')
|
||||||
|
for name in before:
|
||||||
|
for report in (before[name], after[name]):
|
||||||
|
require(type(report) is dict and report.get('pass') is True, 'Old-integrity gate failed: ' + name)
|
||||||
|
if 'mismatches' in report:
|
||||||
|
require(report['mismatches'] == [], 'Old-integrity mismatch list is nonempty')
|
||||||
|
for key in ('manifest_sha256', 'checksums_sha256'):
|
||||||
|
if key in before[name] or key in after[name]:
|
||||||
|
require(sha(before[name].get(key)) and before[name][key] == after[name].get(key), 'Old-root control changed: ' + name)
|
||||||
|
require(refs.get('pass_all') is True and type(refs.get('trials')) is list and
|
||||||
|
[row.get('trial') for row in refs['trials']] == list(REFERENCES), 'Five old deterministic references are incomplete or reordered')
|
||||||
|
for row in refs['trials']:
|
||||||
|
require(type(row.get('exact')) is dict and set(row['exact']) == {'step', 'neuron_idx', 'counts', 'v', 'g'} and
|
||||||
|
all(value is True for value in row['exact'].values()), 'Old reference arrays are not exact')
|
||||||
|
|
||||||
|
|
||||||
|
def validate_planned(planned):
|
||||||
|
require(type(planned) is list and len(planned) == 144, 'AM planned coverage must be 144')
|
||||||
|
keys = []
|
||||||
|
for row in planned:
|
||||||
|
require(type(row) is dict and type(row.get('name')) is str and re.fullmatch('[A-Za-z0-9_-]+', row['name']) and
|
||||||
|
row.get('cohort') in ('seed_validation', 'novel_to_aj') and type(row.get('repeat')) is int and row['repeat'] in (0, 1),
|
||||||
|
'Invalid AM planned row identity')
|
||||||
|
keys.append((row['name'], row['repeat']))
|
||||||
|
require(len(set(keys)) == 144 and sum(row['repeat'] == 0 for row in planned) == 120 and sum(row['repeat'] == 1 for row in planned) == 24,
|
||||||
|
'AM primary/repeat set incomplete')
|
||||||
|
require(all((name, 0) in set(keys) for name, repeat in keys if repeat == 1), 'AM repeat lacks primary')
|
||||||
|
return next(dict(row) for row in planned if row['repeat'] == 0)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_stage(experiment, index, stage, planned, root):
|
||||||
|
"""Validate all 144 declared results against the already verified AM seal."""
|
||||||
|
receipt = _sealed_json(experiment, index, 'audit/' + stage + '-complete.json')
|
||||||
|
require(receipt.get('stage') == stage and receipt.get('pass_all') is True and receipt.get('trials') == 144 and
|
||||||
|
receipt.get('primary_trials') == 120 and receipt.get('technical_repeats') == 24 and receipt.get('training') is False,
|
||||||
|
'AM stage is incomplete: ' + stage)
|
||||||
|
completed = receipt.get('completed')
|
||||||
|
require(type(completed) is list and len(completed) == 144, 'AM stage completion inventory truncated')
|
||||||
|
for row, done in zip(planned, completed):
|
||||||
|
require(done.get('name') == row['name'] and done.get('repeat') == row['repeat'], 'AM stage completion order/identity mismatch')
|
||||||
|
prefix = 'gpu/' + stage + '/' + row['name'] + '-r' + str(row['repeat']) + '/'
|
||||||
|
expected = [dict(path=key[len(prefix):], bytes=value['bytes'], sha256=value['sha256']) for key, value in sorted(index.items())
|
||||||
|
if key.startswith(prefix) and key != prefix + 'output-hashes.json']
|
||||||
|
inventory = _sealed_json(experiment, index, prefix + 'output-hashes.json')
|
||||||
|
require(inventory == expected and inventory, 'AM completed output inventory differs from sealed payload')
|
||||||
|
require(done.get('output_hashes_sha256') == index[prefix + 'output-hashes.json']['sha256'] and
|
||||||
|
done.get('comparison_sha256') == index[prefix + 'comparison.json']['sha256'], 'AM stage receipt SHA mismatch')
|
||||||
|
summary = _sealed_json(experiment, index, prefix + 'summary.json')
|
||||||
|
compare = _sealed_json(experiment, index, prefix + 'comparison.json')
|
||||||
|
folder, case = experiment / prefix.rstrip('/'), root / AK_REL / 'cases' / row['cohort'] / row['name']
|
||||||
|
require(summary.get('case') == row['name'] and summary.get('complete') is True and summary.get('pass_all') is True and
|
||||||
|
summary.get('all_finite') is True and summary.get('steps') == summary.get('completed_ticks') == 1000,
|
||||||
|
'AM selected stage contains a failed/truncated trial')
|
||||||
|
require(compare.get('pass_all') is True and compare.get('overlay_name') == stage and compare.get('case_dir') == str(case) and
|
||||||
|
compare.get('right') == str(folder), 'AM comparison identity/gate mismatch')
|
||||||
|
require(type(compare.get('checks')) is dict and compare['checks'] and all(value is True for value in compare['checks'].values()) and
|
||||||
|
compare.get('failed_checks') == [] and 'error' not in compare and 'read_manifest_error' not in compare and
|
||||||
|
compare.get('full_queue_reconstructed') is True, 'AM comparison has a hidden negative/missing numerical gate')
|
||||||
|
mode = 'zero' if stage == 'zero' else ('repeat' if row['repeat'] else 'self')
|
||||||
|
left = root / AK_REL / 'gpu' / row['cohort'] / (row['name'] + '-r' + str(row['repeat'])) if stage == 'zero' else (
|
||||||
|
experiment / 'gpu' / stage / (row['name'] + '-r0') if row['repeat'] else folder)
|
||||||
|
require(compare.get('mode') == mode and compare.get('left') == str(left), 'AM comparison reference/mode mismatch')
|
||||||
|
return receipt
|
||||||
|
|
||||||
|
|
||||||
|
def _layout(root, model, experiment):
|
||||||
|
root, model = Path(root).resolve(strict=True), Path(model).resolve(strict=True)
|
||||||
|
experiment = Path(experiment).resolve(strict=False)
|
||||||
|
require(experiment == root / 'experiments/phase4an-engineering-validation' and model.is_relative_to(root / 'models/male-cns-lif'),
|
||||||
|
'Unexpected project/output layout')
|
||||||
|
require(not experiment.exists() or (experiment.is_dir() and not any(experiment.iterdir())), 'Refusing populated experiment; preserve all partials')
|
||||||
|
return root, model, experiment
|
||||||
|
|
||||||
|
|
||||||
|
def _budget(experiment):
|
||||||
|
experiment = Path(experiment)
|
||||||
|
used = sum(path.stat().st_size for path in experiment.rglob('*') if path.is_file()) if experiment.exists() else 0
|
||||||
|
require(used < BUDGET['output_budget_bytes'], '8 GiB engineering budget exhausted; preserve partials')
|
||||||
|
free = shutil.disk_usage(experiment.parent).free
|
||||||
|
require(free >= BUDGET['minimum_free_reserve_bytes'] + BUDGET['output_budget_bytes'] - used,
|
||||||
|
'Insufficient capacity for remaining 8 GiB budget plus 10 GiB free reserve')
|
||||||
|
return dict(BUDGET, used_bytes=used, free_bytes=free)
|
||||||
|
|
||||||
|
|
||||||
|
def budget():
|
||||||
|
return _budget(EXP)
|
||||||
|
|
||||||
|
|
||||||
|
def verify_authority(anchors):
|
||||||
|
"""Full read-only AM seal recheck for the finalizer; no gate rerun."""
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B for immutable authority verification')
|
||||||
|
root = ROOT.resolve(strict=True)
|
||||||
|
values = [(root / AM_MODEL_REL, 'am_model_manifest_sha256'), (root / AM_EXP_REL, 'am_experiment_manifest_sha256')]
|
||||||
|
for directory, key in values:
|
||||||
|
require(sha(anchors.get(key)) and digest(directory / 'manifest.json') == anchors[key], 'External AM manifest anchor mismatch')
|
||||||
|
require(sha(anchors.get('am_final_sha256')) and digest(root / AM_EXP_REL / 'audit/final-status.json') == anchors['am_final_sha256'],
|
||||||
|
'External AM final anchor mismatch')
|
||||||
|
require(anchors.get('am_preregistration_sha256') == AM_PREREG_SHA and
|
||||||
|
digest(root / AM_EXP_REL / 'protocol/preregistered.json') == AM_PREREG_SHA, 'AM preregistration anchor mismatch')
|
||||||
|
require(anchors.get('AI_publication_helper_sha256') == AI_HELPER_SHA, 'Publication helper authority changed')
|
||||||
|
publication = load_module('phase4an_pinned_AI_publication', root / AI_HELPER_REL, AI_HELPER_SHA)
|
||||||
|
result = {'model': publication.verify_seal(values[0][0]), 'experiment': publication.verify_seal(values[1][0])}
|
||||||
|
require(result['model']['manifest_sha256'] == anchors['am_model_manifest_sha256'] and
|
||||||
|
result['experiment']['manifest_sha256'] == anchors['am_experiment_manifest_sha256'], 'AM seal changed during verification')
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _old_integrity(root, context_sha, expected):
|
||||||
|
"""Reuse the pinned AM read-only integrity chain, not a brain runtime."""
|
||||||
|
context_path = root / AM_MODEL_REL / 'context.py'
|
||||||
|
previous_path = list(sys.path)
|
||||||
|
torch_before = 'torch' in sys.modules
|
||||||
|
try:
|
||||||
|
context = load_module('phase4an_sealed_AM_integrity', context_path, context_sha)
|
||||||
|
require(context.ROOT.resolve() == root.resolve(), 'AM integrity helper belongs to another root')
|
||||||
|
result = context.integrity()
|
||||||
|
finally:
|
||||||
|
sys.path[:] = previous_path
|
||||||
|
require(torch_before or 'torch' not in sys.modules, 'Integrity unexpectedly imported Torch')
|
||||||
|
require(type(result) is dict and len(result) == 28 and set(result) == set(expected) and
|
||||||
|
all(type(row) is dict and row.get('pass') is True for row in result.values()), 'Current 28-root old-integrity gate failed')
|
||||||
|
for name, row in result.items():
|
||||||
|
if 'mismatches' in row:
|
||||||
|
require(row['mismatches'] == [], 'Current old-integrity mismatch list is nonempty')
|
||||||
|
for key in ('manifest_sha256', 'checksums_sha256', 'reference_sha256'):
|
||||||
|
if key in expected[name] or key in row:
|
||||||
|
require(sha(row.get(key)) and row[key] == expected[name].get(key), 'Old integrity authority changed: ' + name)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def verify_old_integrity(registration):
|
||||||
|
"""Rehash the pinned 28 old roots/snapshot via original CPU-only code."""
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B for old-integrity verification')
|
||||||
|
path = ROOT / AM_MODEL_REL / 'context.py'
|
||||||
|
expected_sha = registration['input_sha256'].get(str(path.resolve(strict=True)))
|
||||||
|
require(sha(expected_sha) and digest(path) == expected_sha, 'AM integrity source is not a registered input')
|
||||||
|
before_path = EXP / 'regression/old-integrity-before.json'
|
||||||
|
require(digest(before_path) == registration['input_sha256'].get(str(before_path.resolve(strict=True))), 'Before-integrity evidence changed')
|
||||||
|
return _old_integrity(ROOT, expected_sha, read(before_path))
|
||||||
|
|
||||||
|
|
||||||
|
def _prepare(root, model, experiment, am_model_manifest_sha, am_experiment_manifest_sha, am_final_sha):
|
||||||
|
require(sys.dont_write_bytecode, 'Preparation requires python -B; old sources must remain byte-for-byte read-only')
|
||||||
|
require(all(sha(value) for value in (am_model_manifest_sha, am_experiment_manifest_sha, am_final_sha)), 'Three actual external AM SHA-256 anchors are mandatory')
|
||||||
|
root, model, experiment = _layout(root, model, experiment)
|
||||||
|
_budget(experiment)
|
||||||
|
sources = source_inventory(model)
|
||||||
|
inputs_module = load_module('phase4an_prepare_inputs', model / 'engineering_inputs.py', sources[str(model / 'engineering_inputs.py')])
|
||||||
|
plan_module = load_module('phase4an_prepare_plan', model / 'engineering_plan.py', sources[str(model / 'engineering_plan.py')])
|
||||||
|
runtime = load_module('phase4an_prepare_light', model / 'runtime_light.py', sources[str(model / 'runtime_light.py')])
|
||||||
|
publication = load_module('phase4an_pinned_AI_publication', root / AI_HELPER_REL, AI_HELPER_SHA)
|
||||||
|
am_model, am = root / AM_MODEL_REL, root / AM_EXP_REL
|
||||||
|
require(digest(am_model / 'manifest.json') == am_model_manifest_sha and digest(am / 'manifest.json') == am_experiment_manifest_sha and
|
||||||
|
digest(am / 'audit/final-status.json') == am_final_sha, 'External AM authority mismatch')
|
||||||
|
verified = {'model': publication.verify_seal(am_model), 'experiment': publication.verify_seal(am)}
|
||||||
|
require(verified['model']['manifest_sha256'] == am_model_manifest_sha and verified['experiment']['manifest_sha256'] == am_experiment_manifest_sha,
|
||||||
|
'AM controls changed during full seal verification')
|
||||||
|
idx = _index(verified['experiment']['files']); midx = _index(verified['model']['files'])
|
||||||
|
reg = _sealed_json(am, idx, 'protocol/preregistered.json')
|
||||||
|
require(idx['protocol/preregistered.json']['sha256'] == AM_PREREG_SHA, 'AM preregistration authority differs from the fixed anchor')
|
||||||
|
planned = reg.get('planned'); selected = validate_planned(planned)
|
||||||
|
final = _sealed_json(am, idx, 'audit/final-status.json')
|
||||||
|
scientific = _sealed_json(am, idx, 'audit/scientific-summary.json')
|
||||||
|
require(final.get('scientific_summary_sha256') == idx['audit/scientific-summary.json']['sha256'], 'AM final does not bind scientific summary')
|
||||||
|
before = _sealed_json(am, idx, 'regression/old-integrity-before.json')
|
||||||
|
after = _sealed_json(am, idx, 'regression/old-integrity-after.json')
|
||||||
|
refs = _sealed_json(am, idx, 'regression/frozen-five.json')
|
||||||
|
validate_final_status(final, scientific, before, after, refs)
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
validate_stage(am, idx, stage, planned, root)
|
||||||
|
current_old = _old_integrity(root, midx['context.py']['sha256'], after)
|
||||||
|
inputs = {}
|
||||||
|
anchors = {'am_model_manifest_sha256': am_model_manifest_sha, 'am_experiment_manifest_sha256': am_experiment_manifest_sha,
|
||||||
|
'am_final_sha256': am_final_sha, 'am_preregistration_sha256': AM_PREREG_SHA, 'AI_publication_helper_sha256': AI_HELPER_SHA}
|
||||||
|
for path, expected in ((am_model / 'manifest.json', am_model_manifest_sha), (am / 'manifest.json', am_experiment_manifest_sha),
|
||||||
|
(am / 'audit/final-status.json', am_final_sha), (root / AI_HELPER_REL, AI_HELPER_SHA),
|
||||||
|
(am_model / 'overlay.py', AM_OVERLAY_SHA)):
|
||||||
|
_bind(inputs, path, expected)
|
||||||
|
require(midx.get('overlay.py', {}).get('sha256') == AM_OVERLAY_SHA, 'AM model seal does not contain the pinned overlay helper')
|
||||||
|
for name in ('context.py', 'config.json'):
|
||||||
|
_bind(inputs, am_model / name, midx[name]['sha256'])
|
||||||
|
for path in (am_model / 'checksums.sha256', am / 'checksums.sha256'):
|
||||||
|
_bind(inputs, path)
|
||||||
|
for relative in ('protocol/preregistered.json', 'protocol/prepared-hashes.json', 'audit/scientific-summary.json', 'audit/zero-complete.json', 'audit/static25-complete.json',
|
||||||
|
'regression/old-integrity-before.json', 'regression/old-integrity-after.json', 'regression/frozen-five.json'):
|
||||||
|
_bind(inputs, am / relative, idx[relative]['sha256'])
|
||||||
|
am_inputs = {}
|
||||||
|
for row in reg['inputs']:
|
||||||
|
require(set(row) == {'path', 'sha256'} and sha(row['sha256']), 'Invalid AM registered input row')
|
||||||
|
_relative(row['path']); require(row['path'] not in am_inputs, 'Duplicate AM registered input')
|
||||||
|
am_inputs[row['path']] = row['sha256']
|
||||||
|
def authority(path):
|
||||||
|
path = Path(path).resolve(strict=True)
|
||||||
|
require(path.is_relative_to(root), 'AM input leaves project root')
|
||||||
|
relative = path.relative_to(root).as_posix()
|
||||||
|
if path.is_relative_to(am):
|
||||||
|
expected = idx[path.relative_to(am).as_posix()]['sha256']
|
||||||
|
else:
|
||||||
|
require(relative in am_inputs, 'Dependency absent from AM preregistration: ' + relative)
|
||||||
|
expected = am_inputs[relative]
|
||||||
|
return _bind(inputs, path, expected)
|
||||||
|
original_dir = root / AK_REL / 'cases' / selected['cohort'] / selected['name']
|
||||||
|
authority(original_dir / 'spec.json'); authority(original_dir / 'requests.npz')
|
||||||
|
original = read(original_dir / 'spec.json')
|
||||||
|
require(original['steps'] == 1000 and original['kind'] == 'fullgraph' and original['name'] == selected['name'], 'Fixed selected AM case changed')
|
||||||
|
with np.load(original_dir / 'requests.npz', allow_pickle=False) as archive:
|
||||||
|
require(set(archive.files) == {'tick', 'neuron_idx'} and len(archive.files) == 2, 'Unexpected original request arrays')
|
||||||
|
requests = {key: archive[key].copy() for key in archive.files}
|
||||||
|
inputs_module.validate_requests(requests, 1000)
|
||||||
|
for name in GRAPH_FILES:
|
||||||
|
authority(Path(original['graph_dir']) / name)
|
||||||
|
for name in APL_FILES:
|
||||||
|
authority(Path(original['apl_bundle_dir']) / name)
|
||||||
|
authority(original['coefficients_path'])
|
||||||
|
selected_outputs = {}
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
prefix = 'gpu/' + stage + '/' + selected['name'] + '-r0/'
|
||||||
|
selected_outputs[stage] = str(am / prefix.rstrip('/'))
|
||||||
|
for relative, row in idx.items():
|
||||||
|
if relative.startswith(prefix):
|
||||||
|
_bind(inputs, am / relative, row['sha256'])
|
||||||
|
adapted = {}
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
old_manifest = authority(am / 'overlays' / (stage + '.json'))
|
||||||
|
overlay_file = authority(am / 'overlays' / (stage + '.npz'))
|
||||||
|
declaration = read(old_manifest)
|
||||||
|
require(declaration['overlay_name'] == stage and declaration['overlay_sha256'] == digest(overlay_file), 'AM overlay declaration mismatch')
|
||||||
|
for label in ('mask', 'base_candidate'):
|
||||||
|
require(digest(authority(declaration[label + '_path'])) == declaration[label + '_sha256'], 'Overlay external array authority mismatch')
|
||||||
|
adapted[stage] = inputs_module.adapt_overlay_manifest(declaration, str(am_model / 'overlay.py'))
|
||||||
|
require(adapted[stage]['am_overlay_sha256'] == AM_OVERLAY_SHA, 'Adapted helper pin differs')
|
||||||
|
for relative, expected in runtime.PINS.items():
|
||||||
|
_bind(inputs, model.parent / relative, expected)
|
||||||
|
plan = plan_module.validate_plan(plan_module.build_plan())
|
||||||
|
require(plan['total_calls'] == 32 and plan['total_ticks'] == 11074, 'Engineering plan matrix changed')
|
||||||
|
# No writes have occurred before all authority/source/space checks above.
|
||||||
|
experiment.mkdir(parents=True, exist_ok=True)
|
||||||
|
try:
|
||||||
|
for folder in ('protocol', 'cases', 'overlays', 'audit', 'runs', 'receipts', 'logs', 'regression', 'extension-build'):
|
||||||
|
(experiment / folder).mkdir(exist_ok=False)
|
||||||
|
save(experiment / 'regression/old-integrity-before.json', current_old)
|
||||||
|
_bind(inputs, experiment / 'regression/old-integrity-before.json')
|
||||||
|
for source, expected in sources.items():
|
||||||
|
target = experiment / 'protocol/source-snapshot' / Path(source).name
|
||||||
|
publication._copy_verified(Path(source), target, Path(source).stat().st_size, expected)
|
||||||
|
_bind(inputs, target, expected)
|
||||||
|
save(experiment / 'protocol/AM-seal-verification.json', verified)
|
||||||
|
save(experiment / 'protocol/AM-gate-authority.json', dict(anchors=anchors, all_144_per_stage_declared_gates_pass=True,
|
||||||
|
old_roots=28, old_references=list(REFERENCES), verification_scope='Full AM seals and finalized declared gate evidence; no new scientific execution'))
|
||||||
|
for name in ('AM-seal-verification.json', 'AM-gate-authority.json'):
|
||||||
|
_bind(inputs, experiment / 'protocol' / name)
|
||||||
|
overlays, cases = {}, {}
|
||||||
|
for stage, value in adapted.items():
|
||||||
|
manifest_path = experiment / 'overlays' / (stage + '.json')
|
||||||
|
save(manifest_path, value)
|
||||||
|
_bind(inputs, manifest_path)
|
||||||
|
overlays[stage] = {'overlay_file': str(am / 'overlays' / (stage + '.npz')), 'overlay_manifest': str(manifest_path)}
|
||||||
|
for row in plan['rows']:
|
||||||
|
case = experiment / 'cases' / row['row_id']; case.mkdir(exist_ok=False)
|
||||||
|
template = {'schema': 'phase4an-engineering-case-template-v1', 'row_id': row['row_id'], 'original_spec': original,
|
||||||
|
'start': row['start'], 'stop': row['stop'], 'budget_root': str(experiment), 'output_budget_bytes': BUDGET['output_budget_bytes']}
|
||||||
|
save(case / 'template-spec.json', template)
|
||||||
|
part = inputs_module.slice_requests(requests, 1000, row['start'], row['stop'])
|
||||||
|
with (case / 'requests.npz').open('xb') as stream:
|
||||||
|
np.savez_compressed(stream, **part)
|
||||||
|
_bind(inputs, case / 'template-spec.json'); _bind(inputs, case / 'requests.npz')
|
||||||
|
cases[row['row_id']] = {'case_dir': str(case), 'template_spec_sha256': digest(case / 'template-spec.json'),
|
||||||
|
'requests_sha256': digest(case / 'requests.npz')}
|
||||||
|
require(source_inventory(model) == sources and all(digest(path) == expected for path, expected in inputs.items()), 'Source/input changed during preparation')
|
||||||
|
# Repeat the full AM verification after producing only small new inputs.
|
||||||
|
after_verified = {'model': publication.verify_seal(am_model), 'experiment': publication.verify_seal(am)}
|
||||||
|
require(after_verified == verified, 'AM sealed payload changed during preparation')
|
||||||
|
_budget(experiment)
|
||||||
|
registration = {'schema': REG_SCHEMA, 'plan': plan, 'selected_case': {'row': selected, 'original_dir': str(original_dir), 'AM_outputs': selected_outputs},
|
||||||
|
'source_sha256': sources, 'input_sha256': inputs, 'cases': cases, 'overlays': overlays, 'budget': dict(BUDGET), 'anchors': anchors,
|
||||||
|
'training': False, 'new_brain_runs_during_preparation': 0, 'future_checkpoint_hashes_fabricated': False,
|
||||||
|
'runtime_spec_derivation': 'engineering_inputs.derive_spec(template.original_spec, interval, budget, actual verified parent SHA or None)',
|
||||||
|
'scope': 'Fixed 32-call engineering gate only; not conditioning or learning registration'}
|
||||||
|
save(experiment / 'protocol/preregistered.json', registration)
|
||||||
|
return {'prepared': True, 'registration_path': str(experiment / 'protocol/preregistered.json'),
|
||||||
|
'registration_sha256': digest(experiment / 'protocol/preregistered.json'), 'calls': 32, 'brain_runs': 0}
|
||||||
|
except Exception as error:
|
||||||
|
failure = experiment / 'audit/preparation-failure.json'
|
||||||
|
if not failure.exists():
|
||||||
|
save(failure, {'prepared': False, 'type': type(error).__name__, 'message': str(error), 'partial_outputs_preserved': True})
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def prepare(am_model_manifest_sha, am_experiment_manifest_sha, am_final_sha):
|
||||||
|
return _prepare(ROOT, MODEL, EXP, am_model_manifest_sha, am_experiment_manifest_sha, am_final_sha)
|
||||||
|
|
||||||
|
|
||||||
|
def row_path(registration, row_id):
|
||||||
|
require(type(row_id) is str and row_id in {row['row_id'] for row in registration['plan']['rows']}, 'Unknown engineering row ID')
|
||||||
|
expected = EXP.resolve(strict=True) / 'cases' / row_id
|
||||||
|
actual = Path(registration['cases'][row_id]['case_dir'])
|
||||||
|
require(actual == expected and actual.resolve(strict=True) == expected and actual.is_dir(), 'Row case path is not its fixed safe mapping')
|
||||||
|
return actual
|
||||||
|
|
||||||
|
|
||||||
|
def read_registration(expected_sha):
|
||||||
|
require(sys.dont_write_bytecode and sha(expected_sha), 'Require python -B and an external preregistration SHA')
|
||||||
|
path = EXP / 'protocol/preregistered.json'
|
||||||
|
require(digest(path) == expected_sha, 'Preregistration differs from external authority')
|
||||||
|
require(not (EXP / 'audit/preparation-failure.json').exists(), 'Preparation failed; preserve partials')
|
||||||
|
registration = read(path)
|
||||||
|
require(registration.get('schema') == REG_SCHEMA and registration.get('training') is False and registration.get('budget') == BUDGET,
|
||||||
|
'Unexpected registration schema/scope/budget')
|
||||||
|
require(registration['source_sha256'] == source_inventory(MODEL), 'Registered engineering sources changed or inventory incomplete')
|
||||||
|
for name, expected in registration['input_sha256'].items():
|
||||||
|
require(Path(name).is_absolute() and sha(expected) and digest(name) == expected, 'Registered input changed: ' + name)
|
||||||
|
plan_module = load_module('phase4an_read_plan', MODEL / 'engineering_plan.py', registration['source_sha256'][str(MODEL / 'engineering_plan.py')])
|
||||||
|
inputs_module = load_module('phase4an_read_inputs', MODEL / 'engineering_inputs.py', registration['source_sha256'][str(MODEL / 'engineering_inputs.py')])
|
||||||
|
plan_module.validate_plan(registration['plan'])
|
||||||
|
selected = validate_planned(read(ROOT / AM_EXP_REL / 'protocol/preregistered.json')['planned'])
|
||||||
|
original_dir = ROOT / AK_REL / 'cases' / selected['cohort'] / selected['name']
|
||||||
|
require(registration['selected_case']['row'] == selected and registration['selected_case']['original_dir'] == str(original_dir),
|
||||||
|
'Registered case is not the fixed first AM planned primary')
|
||||||
|
original = read(original_dir / 'spec.json')
|
||||||
|
with np.load(original_dir / 'requests.npz', allow_pickle=False) as archive:
|
||||||
|
require(set(archive.files) == {'tick', 'neuron_idx'} and len(archive.files) == 2, 'Unexpected original sparse request schema')
|
||||||
|
requests = {key: archive[key].copy() for key in archive.files}
|
||||||
|
inputs_module.validate_requests(requests, 1000)
|
||||||
|
require(set(registration['cases']) == {row['row_id'] for row in registration['plan']['rows']}, 'Registered case inventory differs from plan')
|
||||||
|
for row in registration['plan']['rows']:
|
||||||
|
case = row_path(registration, row['row_id']); entry = registration['cases'][row['row_id']]
|
||||||
|
require(entry['template_spec_sha256'] == digest(case / 'template-spec.json') and entry['requests_sha256'] == digest(case / 'requests.npz'),
|
||||||
|
'Template/request metadata does not bind registered bytes')
|
||||||
|
template = read(case / 'template-spec.json')
|
||||||
|
require(set(template) == {'schema', 'row_id', 'original_spec', 'start', 'stop', 'budget_root', 'output_budget_bytes'} and
|
||||||
|
template['schema'] == 'phase4an-engineering-case-template-v1' and template['original_spec'] == original and
|
||||||
|
template['row_id'] == row['row_id'] and template['start'] == row['start'] and template['stop'] == row['stop'] and
|
||||||
|
template['budget_root'] == str(EXP) and template['output_budget_bytes'] == BUDGET['output_budget_bytes'], 'Template rule differs from canonical row')
|
||||||
|
expected = inputs_module.slice_requests(requests, 1000, row['start'], row['stop'])
|
||||||
|
with np.load(case / 'requests.npz', allow_pickle=False) as archive:
|
||||||
|
require(len(archive.files) == 2 and set(archive.files) == set(expected) and
|
||||||
|
all(archive[key].dtype == expected[key].dtype and archive[key].shape == expected[key].shape and
|
||||||
|
archive[key].tobytes() == expected[key].tobytes() for key in expected), 'Registered request slice is not exact')
|
||||||
|
require(set(registration['overlays']) == {'zero', 'static25'}, 'Registered overlay inventory changed')
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
entry = registration['overlays'][stage]
|
||||||
|
expected_file = ROOT / AM_EXP_REL / 'overlays' / (stage + '.npz')
|
||||||
|
expected_manifest = EXP / 'overlays' / (stage + '.json')
|
||||||
|
require(entry == {'overlay_file': str(expected_file), 'overlay_manifest': str(expected_manifest)}, 'Overlay path mapping changed')
|
||||||
|
original_overlay = read(ROOT / AM_EXP_REL / 'overlays' / (stage + '.json'))
|
||||||
|
require(read(expected_manifest) == inputs_module.adapt_overlay_manifest(original_overlay, str(ROOT / AM_MODEL_REL / 'overlay.py')),
|
||||||
|
'Adapted overlay manifest is not the exact declared transformation')
|
||||||
|
anchors = registration['anchors']
|
||||||
|
for name, relative in (('am_model_manifest_sha256', AM_MODEL_REL / 'manifest.json'),
|
||||||
|
('am_experiment_manifest_sha256', AM_EXP_REL / 'manifest.json'),
|
||||||
|
('am_final_sha256', AM_EXP_REL / 'audit/final-status.json')):
|
||||||
|
require(sha(anchors[name]) and digest(ROOT / relative) == anchors[name], 'AM external anchor changed')
|
||||||
|
require(anchors['am_preregistration_sha256'] == AM_PREREG_SHA and digest(ROOT / AM_EXP_REL / 'protocol/preregistered.json') == AM_PREREG_SHA and
|
||||||
|
anchors['AI_publication_helper_sha256'] == AI_HELPER_SHA and digest(ROOT / AI_HELPER_REL) == AI_HELPER_SHA, 'Fixed AM/helper authority changed')
|
||||||
|
require(digest(path) == expected_sha, 'Registration changed during verification')
|
||||||
|
return registration
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
"""Independent, read-only CPU queue/ref audit for the draft AN 32-call gate.
|
||||||
|
|
||||||
|
The caller supplies externally authenticated records and CSR arrays. No file
|
||||||
|
I/O, runtime import, GPU, membrane integration, weight update or learning is
|
||||||
|
performed. Spikes are observed facts, not independently predicted here.
|
||||||
|
|
||||||
|
queue digest bytes independently implement frozen AF oracle_full.queue_summary
|
||||||
|
(source SHA below): header, little-endian signed int64 local tick/count, all
|
||||||
|
global edge IDs in source/CSR order, then uint8 post-threshold acceptance bits.
|
||||||
|
The function never target-sorts or drops zero-weight edges from the queue.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import struct
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
AF_QUEUE_SOURCE_SHA256 = 'd72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961'
|
||||||
|
QUEUE_HEADER = b'phase4af-queue-v1\0'
|
||||||
|
DELAY, REFRACTORY = 18, 22
|
||||||
|
CHUNK = 1 << 18
|
||||||
|
QUEUE_KEYS = {'tick', 'count', 'accepted_count', 'ordered_edge_sha256', 'accepted_mask_sha256', 'joint_sha256'}
|
||||||
|
|
||||||
|
|
||||||
|
def require(value, message):
|
||||||
|
if not value:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _array(value, dtype, shape, name):
|
||||||
|
require(isinstance(value, np.ndarray) and value.dtype == np.dtype(dtype) and value.shape == shape,
|
||||||
|
'Invalid dtype/shape: ' + name)
|
||||||
|
|
||||||
|
|
||||||
|
def _raw_sha(value):
|
||||||
|
result = hashlib.sha256()
|
||||||
|
for start in range(0, len(value), CHUNK):
|
||||||
|
result.update(np.ascontiguousarray(value[start:start + CHUNK], dtype=value.dtype.newbyteorder('<')).tobytes())
|
||||||
|
return result.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _event_schema(tick, node, steps, n, label):
|
||||||
|
require(isinstance(tick, np.ndarray) and tick.ndim == 1, 'Invalid event vector: ' + label)
|
||||||
|
_array(tick, np.int32, tick.shape, label + '.tick')
|
||||||
|
_array(node, np.int32, tick.shape, label + '.neuron_idx')
|
||||||
|
require(np.all((tick >= 0) & (tick < steps)) and np.all((node >= 0) & (node < n)),
|
||||||
|
'Out-of-range event: ' + label)
|
||||||
|
key = tick.astype(np.int64) * n + node
|
||||||
|
require(len(key) < 2 or np.all(key[1:] > key[:-1]), 'Events must be sorted/unique: ' + label)
|
||||||
|
|
||||||
|
|
||||||
|
def _record_schema(record, n, label):
|
||||||
|
require(isinstance(record, dict), 'Record must be a dictionary: ' + label)
|
||||||
|
steps, offset = record['steps'], record['global_tick_offset']
|
||||||
|
require(type(steps) is int and 0 < steps <= np.iinfo(np.int32).max and
|
||||||
|
type(offset) is int and offset >= 0, 'Invalid record clock: ' + label)
|
||||||
|
state = record['state']
|
||||||
|
require(set(state) == {'step', 'neuron_idx', 'counts', 'v', 'g', 'ref'}, 'Invalid state keys: ' + label)
|
||||||
|
_event_schema(state['step'], state['neuron_idx'], steps, n, label)
|
||||||
|
for name, dtype in [('counts', np.int32), ('ref', np.int32), ('v', np.float64), ('g', np.float64)]:
|
||||||
|
_array(state[name], dtype, (n,), label + '.' + name)
|
||||||
|
require(np.isfinite(state[name]).all(), 'Nonfinite state: ' + label + '.' + name)
|
||||||
|
require(np.all(state['counts'] >= 0) and np.all((state['ref'] >= 0) & (state['ref'] <= REFRACTORY)),
|
||||||
|
'Invalid state count/ref: ' + label)
|
||||||
|
rows = record['requests']
|
||||||
|
require(isinstance(rows, np.ndarray) and rows.ndim == 2 and rows.shape[1] == 5,
|
||||||
|
'Invalid request table: ' + label)
|
||||||
|
_array(rows, np.int64, rows.shape, label + '.requests')
|
||||||
|
queues, hashes = record.get('queues'), record.get('state_hashes')
|
||||||
|
require(isinstance(queues, list) and isinstance(hashes, list) and len(queues) == len(hashes) == steps,
|
||||||
|
'Complete reference queue and state hashes are required: ' + label)
|
||||||
|
for t, (queue, state_hash) in enumerate(zip(queues, hashes)):
|
||||||
|
require(isinstance(queue, dict) and set(queue) == QUEUE_KEYS and type(queue['tick']) is int and queue['tick'] == t,
|
||||||
|
'Invalid local queue row: ' + label)
|
||||||
|
require(isinstance(state_hash, dict) and set(state_hash) == {'tick', 'v_sha256', 'g_sha256', 'ref_sha256'} and
|
||||||
|
type(state_hash['tick']) is int and state_hash['tick'] == t,
|
||||||
|
'Invalid local state-hash row: ' + label)
|
||||||
|
return record
|
||||||
|
|
||||||
|
|
||||||
|
def _graph(ptr, dst, edge_id, effective_weights):
|
||||||
|
require(isinstance(ptr, np.ndarray) and ptr.ndim == 1 and len(ptr) > 1, 'Invalid CSR ptr')
|
||||||
|
n, e = len(ptr) - 1, len(dst)
|
||||||
|
_array(ptr, np.int64, (n + 1,), 'ptr')
|
||||||
|
_array(dst, np.int32, (e,), 'dst')
|
||||||
|
_array(edge_id, np.int64, (e,), 'edge_id')
|
||||||
|
_array(effective_weights, np.float64, (e,), 'effective_weights_SI')
|
||||||
|
require(ptr[0] == 0 and ptr[-1] == e and np.all(ptr[1:] >= ptr[:-1]), 'Invalid CSR pointers')
|
||||||
|
for start in range(0, e, CHUNK):
|
||||||
|
stop = min(start + CHUNK, e)
|
||||||
|
require(np.all((dst[start:stop] >= 0) & (dst[start:stop] < n)), 'CSR destination out of range')
|
||||||
|
require(np.all(edge_id[start:stop] >= 0) and
|
||||||
|
np.all(np.diff(edge_id[max(0, start - 1):stop]) > 0), 'Global edge IDs must preserve canonical increasing CSR order')
|
||||||
|
require(np.isfinite(effective_weights[start:stop]).all(), 'Nonfinite effective SI weight')
|
||||||
|
return n, e
|
||||||
|
|
||||||
|
|
||||||
|
def _queue(tick, local_tick, sources, ref, ptr, dst, edge_id, weights, boundaries):
|
||||||
|
"""Two headers, shared source-ordered payload; memory bounded by one chunk."""
|
||||||
|
count = sum(int(ptr[int(s) + 1] - ptr[int(s)]) for s in sources)
|
||||||
|
joints = [hashlib.sha256(QUEUE_HEADER + struct.pack('<qq', t, count)) for t in (tick, local_tick)]
|
||||||
|
edges_hash, accepted_hash = hashlib.sha256(), hashlib.sha256()
|
||||||
|
for source in sources:
|
||||||
|
for start in range(int(ptr[source]), int(ptr[source + 1]), CHUNK):
|
||||||
|
stop = min(start + CHUNK, int(ptr[source + 1]))
|
||||||
|
data = np.ascontiguousarray(edge_id[start:stop], dtype='<i8').tobytes()
|
||||||
|
edges_hash.update(data)
|
||||||
|
for joint in joints:
|
||||||
|
joint.update(data)
|
||||||
|
accepted_count, nonzero_count, first = 0, 0, None
|
||||||
|
for source in sources:
|
||||||
|
for start in range(int(ptr[source]), int(ptr[source + 1]), CHUNK):
|
||||||
|
stop = min(start + CHUNK, int(ptr[source + 1]))
|
||||||
|
mask = np.ascontiguousarray(ref[dst[start:stop]] == 0, dtype=np.uint8)
|
||||||
|
accepted_count += int(mask.sum(dtype=np.int64))
|
||||||
|
data = mask.tobytes(); accepted_hash.update(data)
|
||||||
|
for joint in joints:
|
||||||
|
joint.update(data)
|
||||||
|
if boundaries:
|
||||||
|
live = np.flatnonzero((mask != 0) & (weights[start:stop] != 0))
|
||||||
|
nonzero_count += len(live)
|
||||||
|
if first is None and len(live):
|
||||||
|
index = start + int(live[0])
|
||||||
|
first = {'source_neuron_idx': int(source), 'target_neuron_idx': int(dst[index]),
|
||||||
|
'global_edge_id': int(edge_id[index]), 'csr_edge_index': index,
|
||||||
|
'source_spike_tick': tick - DELAY, 'arrival_tick': tick,
|
||||||
|
'effective_weight_SI_volt': float(weights[index]),
|
||||||
|
'effective_weight_float64_le_hex': np.asarray(weights[index], dtype='<f8').tobytes().hex(),
|
||||||
|
'accepted': True, 'post_threshold_target_ref': 0,
|
||||||
|
'weight_is_nonzero': True, 'evidence_is_unique_cause_or_necessity': False}
|
||||||
|
rows = [{'tick': t, 'count': count, 'accepted_count': accepted_count,
|
||||||
|
'ordered_edge_sha256': edges_hash.hexdigest(), 'accepted_mask_sha256': accepted_hash.hexdigest(),
|
||||||
|
'joint_sha256': joint.hexdigest()} for t, joint in zip((tick, local_tick), joints)]
|
||||||
|
return rows, first, nonzero_count
|
||||||
|
|
||||||
|
|
||||||
|
def audit_queues(monolithic, segments, *, ptr, dst, edge_id, effective_weights, requests, cuts):
|
||||||
|
"""Audit a fresh reference plus its complete reference segmentation.
|
||||||
|
|
||||||
|
All inputs are read-only. Return PASS/FAIL/INCOMPLETE JSON-safe evidence.
|
||||||
|
Structural input damage raises ValueError; valid but differing artifacts
|
||||||
|
return FAIL. ``cuts`` must be the exact internal segment boundaries.
|
||||||
|
No initial state is inferred for arbitrary nonzero-origin experiments.
|
||||||
|
"""
|
||||||
|
n, e = _graph(ptr, dst, edge_id, effective_weights)
|
||||||
|
mono = _record_schema(monolithic, n, 'monolithic')
|
||||||
|
require(mono['global_tick_offset'] == 0, 'This audit requires the registered fresh monolithic origin')
|
||||||
|
require(isinstance(segments, (list, tuple)) and len(segments) >= 2, 'At least two reference segments required')
|
||||||
|
parts = [_record_schema(p, n, 'segment-' + str(i)) for i, p in enumerate(segments)]
|
||||||
|
cursor, actual_cuts = 0, []
|
||||||
|
for i, part in enumerate(parts):
|
||||||
|
require(part['global_tick_offset'] == cursor, 'Segment clock gap/overlap')
|
||||||
|
if i:
|
||||||
|
actual_cuts.append(cursor)
|
||||||
|
cursor += part['steps']
|
||||||
|
require(cursor == mono['steps'] and type(cuts) in (list, tuple) and all(type(t) is int for t in cuts) and
|
||||||
|
list(cuts) == actual_cuts, 'Cuts/segments must cover the exact complete monolithic interval')
|
||||||
|
require(isinstance(requests, dict) and set(requests) == {'tick', 'neuron_idx'}, 'Exact original request arrays required')
|
||||||
|
_event_schema(requests['tick'], requests['neuron_idx'], mono['steps'], n, 'original_requests')
|
||||||
|
records = [('monolithic', mono), *[('segment-' + str(i), p) for i, p in enumerate(parts)]]
|
||||||
|
differences, difference_count = [], 0
|
||||||
|
|
||||||
|
def check(value, field, **location):
|
||||||
|
nonlocal difference_count
|
||||||
|
if not value:
|
||||||
|
difference_count += 1
|
||||||
|
if len(differences) < 100:
|
||||||
|
differences.append({'field': field, **location})
|
||||||
|
|
||||||
|
tick, node = mono['state']['step'], mono['state']['neuron_idx']
|
||||||
|
for label, record in records:
|
||||||
|
start, stop = record['global_tick_offset'], record['global_tick_offset'] + record['steps']
|
||||||
|
lo, hi = np.searchsorted(tick, (start, stop))
|
||||||
|
check(np.array_equal(record['state']['step'].astype(np.int64) + start, tick[lo:hi]), 'events.tick', record=label)
|
||||||
|
check(np.array_equal(record['state']['neuron_idx'], node[lo:hi]), 'events.neuron_idx', record=label)
|
||||||
|
check(np.array_equal(record['state']['counts'], np.bincount(record['state']['neuron_idx'], minlength=n)), 'counts', record=label)
|
||||||
|
expected_requests = np.empty((len(requests['tick']), 5), np.int64)
|
||||||
|
if len(expected_requests):
|
||||||
|
expected_requests[:, 0] = requests['tick']; expected_requests[:, 1] = requests['neuron_idx']; expected_requests[:, 2] = 1
|
||||||
|
ref = np.zeros(n, np.int32)
|
||||||
|
boundary_report = {t: {'boundary_tick': t, 'accepted_nonzero_crossing_edge_events': 0, 'first_witness': None} for t in cuts}
|
||||||
|
due_total, accepted_total, segment_index = 0, 0, 0
|
||||||
|
for t in range(mono['steps']):
|
||||||
|
while t >= parts[segment_index]['global_tick_offset'] + parts[segment_index]['steps']:
|
||||||
|
segment_index += 1
|
||||||
|
part = parts[segment_index]; local = t - part['global_tick_offset']
|
||||||
|
rlo, rhi = np.searchsorted(requests['tick'], (t, t + 1))
|
||||||
|
requested = requests['neuron_idx'][rlo:rhi]
|
||||||
|
accepted_requests = ref[requested] <= 1
|
||||||
|
expected_requests[rlo:rhi, 3] = accepted_requests
|
||||||
|
expected_requests[rlo:rhi, 4] = ~accepted_requests
|
||||||
|
np.maximum(ref - np.int32(1), np.int32(0), out=ref)
|
||||||
|
slo, shi = np.searchsorted(tick, (t, t + 1)); fired = node[slo:shi]
|
||||||
|
check(np.all(ref[fired] == 0), 'spike_during_refractory', global_tick=t)
|
||||||
|
check(np.isin(requested[accepted_requests], fired, assume_unique=True).all(), 'accepted_request_without_spike', global_tick=t)
|
||||||
|
ref[fired] = REFRACTORY
|
||||||
|
sources = node[0:0]
|
||||||
|
if t >= DELAY:
|
||||||
|
dlo, dhi = np.searchsorted(tick, (t - DELAY, t - DELAY + 1)); sources = node[dlo:dhi]
|
||||||
|
crossing = [cut for cut in cuts if t - DELAY < cut <= t]
|
||||||
|
rows, witness, live_count = _queue(t, local, sources, ref, ptr, dst, edge_id, effective_weights, crossing)
|
||||||
|
due_total += rows[0]['count']; accepted_total += rows[0]['accepted_count']
|
||||||
|
ref_sha = _raw_sha(ref)
|
||||||
|
for label, record, at, expected in [('monolithic', mono, t, rows[0]), ('segment-' + str(segment_index), part, local, rows[1])]:
|
||||||
|
for key in sorted(QUEUE_KEYS):
|
||||||
|
check(type(record['queues'][at][key]) is type(expected[key]) and record['queues'][at][key] == expected[key],
|
||||||
|
'queue.' + key, record=label, local_tick=at, global_tick=t)
|
||||||
|
check(record['state_hashes'][at]['ref_sha256'] == ref_sha, 'state_hash.ref_sha256', record=label, local_tick=at, global_tick=t)
|
||||||
|
if at == record['steps'] - 1:
|
||||||
|
check(np.array_equal(record['state']['ref'], ref), 'terminal.ref', record=label)
|
||||||
|
for cut in crossing:
|
||||||
|
boundary_report[cut]['accepted_nonzero_crossing_edge_events'] += live_count
|
||||||
|
if witness is not None and boundary_report[cut]['first_witness'] is None:
|
||||||
|
boundary_report[cut]['first_witness'] = {'boundary_tick': cut, **witness}
|
||||||
|
for label, record in records:
|
||||||
|
start, stop = record['global_tick_offset'], record['global_tick_offset'] + record['steps']
|
||||||
|
lo, hi = np.searchsorted(requests['tick'], (start, stop))
|
||||||
|
expected = expected_requests[lo:hi].copy(); expected[:, 0] -= start
|
||||||
|
check(np.array_equal(record['requests'], expected), 'requests.five_fields', record=label)
|
||||||
|
first_witness = min((row['first_witness'] for row in boundary_report.values() if row['first_witness'] is not None),
|
||||||
|
key=lambda row: (row['arrival_tick'], row['source_neuron_idx'], row['csr_edge_index'], row['boundary_tick']), default=None)
|
||||||
|
exact, live = difference_count == 0, first_witness is not None
|
||||||
|
return {'schema': 'phase4an-independent-queue-audit-v1', 'pass_all': exact and live,
|
||||||
|
'status': 'FAIL-QUEUE-OR-REF' if not exact else ('PASS-QUEUE-WITNESS-SCOPE' if live else 'INCOMPLETE-NO-ACCEPTED-NONZERO-CROSSING'),
|
||||||
|
'queue_ref_request_exact': exact, 'accepted_nonzero_crossing_witness_verified': exact and live,
|
||||||
|
'difference_count': difference_count, 'differences': differences, 'differences_truncated': difference_count > len(differences),
|
||||||
|
'neurons': n, 'edges': e, 'steps': mono['steps'], 'segments': len(parts), 'cuts': list(cuts),
|
||||||
|
'arriving_edges': due_total, 'accepted_arriving_edges': accepted_total, 'rejected_arriving_edges': due_total - accepted_total,
|
||||||
|
'requests': len(expected_requests), 'accepted_requests': int(expected_requests[:, 3].sum(dtype=np.int64)),
|
||||||
|
'rejected_requests': int(expected_requests[:, 4].sum(dtype=np.int64)),
|
||||||
|
'first_witness': first_witness, 'boundaries': list(boundary_report.values()),
|
||||||
|
'same_edge_event_may_cross_multiple_boundaries': True,
|
||||||
|
'input_array_sha256': {name: _raw_sha(value) for name, value in [('ptr', ptr), ('dst', dst), ('edge_id', edge_id),
|
||||||
|
('effective_weights_float64_SI', effective_weights), ('request_tick', requests['tick']), ('request_neuron_idx', requests['neuron_idx'])]},
|
||||||
|
'digest_definition': {'AF_source_sha256': AF_QUEUE_SOURCE_SHA256, 'header_hex': QUEUE_HEADER.hex(),
|
||||||
|
'payload_order': 'local tick/count <qq; all canonical source/CSR edge IDs <i8; all post-threshold accepted u1'},
|
||||||
|
'delay_steps': DELAY, 'refractory_steps': REFRACTORY,
|
||||||
|
'scope': 'Conditional on recorded spikes: exact ref, original requests, source-ordered real-edge arrival queues and finite-cut witness only',
|
||||||
|
'membrane_dynamics_independently_replayed': False, 'v_g_hashes_independently_verified': False,
|
||||||
|
'unique_causal_or_necessity_claim': False, 'external_seals_and_input_authority_verified_here': False,
|
||||||
|
'training': False, 'GPU_used': False}
|
||||||
@@ -0,0 +1,219 @@
|
|||||||
|
"""Pure CPU comparisons of already-loaded engineering_compare run records.
|
||||||
|
|
||||||
|
No paths are accepted, no artifacts are opened, no GPU is imported. Structural
|
||||||
|
or missing-required-observation errors raise ValueError. Valid but different
|
||||||
|
records return numerical_exact=False. External seals, parent SHA authority and
|
||||||
|
independent CSR/local-header queue reconstruction remain coordinator duties.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_compare as ec
|
||||||
|
|
||||||
|
|
||||||
|
SCHEMA = 'phase4an-engineering-scopes-v1'
|
||||||
|
|
||||||
|
|
||||||
|
def _require(condition, message):
|
||||||
|
if not condition:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _raw_sha(value):
|
||||||
|
return hashlib.sha256(np.ascontiguousarray(value, dtype=value.dtype.newbyteorder('<')).tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _record(value, label):
|
||||||
|
_require(type(value) is dict, label + ' must be an already-loaded run dictionary, not a path')
|
||||||
|
try:
|
||||||
|
ec.validate_run(value)
|
||||||
|
summary = value['summary']
|
||||||
|
_require(type(summary) is dict, label + ' requires summary metadata')
|
||||||
|
steps, offset = value['steps'], value['global_tick_offset']
|
||||||
|
_require(steps <= np.iinfo(np.int32).max, label + ' steps exceed int32 event capacity')
|
||||||
|
for key in ('complete', 'pass_all', 'all_finite'):
|
||||||
|
_require(summary.get(key) is True, label + ' is incomplete or failed: ' + key)
|
||||||
|
for key in ('steps', 'completed_ticks'):
|
||||||
|
_require(type(summary.get(key)) is int and summary[key] == steps, label + ' summary clock mismatch')
|
||||||
|
_require(type(summary.get('nodes')) is int and summary['nodes'] == len(value['state']['v']),
|
||||||
|
label + ' summary node count mismatch')
|
||||||
|
_require(summary.get('precision') == 'float64' and summary.get('apl_precision') == 'float32' and
|
||||||
|
type(summary.get('apl_delay_steps')) is int and summary['apl_delay_steps'] == 18,
|
||||||
|
label + ' numerical metadata mismatch')
|
||||||
|
continued = summary.get('checkpoint_continuation_used', False)
|
||||||
|
_require(type(continued) is bool and continued == (offset > 0), label + ' continuation scope mismatch')
|
||||||
|
declared_offset = summary.get('global_tick_offset', 0)
|
||||||
|
_require(type(declared_offset) is int and declared_offset == offset, label + ' summary offset mismatch')
|
||||||
|
if continued or 'global_next_tick' in summary:
|
||||||
|
_require(type(summary.get('global_next_tick')) is int and summary['global_next_tick'] == offset + steps,
|
||||||
|
label + ' summary global end mismatch')
|
||||||
|
_require(ec._sha(summary.get('effective_weights_raw_sha256')), label + ' effective weight SHA is missing')
|
||||||
|
mode = summary.get('diagnostic_mode')
|
||||||
|
legacy = str(value.get('terminal_origin', '')).startswith('AM_')
|
||||||
|
_require(mode in ('light', 'reference') or (mode is None and legacy), label + ' recording mode is not declared')
|
||||||
|
observations = {'apl_traces': bool(value.get('traces')), 'state_hashes': value.get('state_hashes') is not None,
|
||||||
|
'queues': value.get('queues') is not None}
|
||||||
|
for name, field in (('apl_traces', 'full_APL_history_recorded'),
|
||||||
|
('state_hashes', 'full_tick_state_hashes_recorded'), ('queues', 'full_queue_hashes_recorded')):
|
||||||
|
if field in summary:
|
||||||
|
_require(type(summary[field]) is bool, label + ' observation flag must be Boolean')
|
||||||
|
if mode == 'reference' or legacy or summary.get(field) is True:
|
||||||
|
_require(observations[name], label + ' declared reference observation missing: ' + name)
|
||||||
|
return value, observations
|
||||||
|
except (KeyError, TypeError, AttributeError, IndexError, OverflowError) as error:
|
||||||
|
raise ValueError(label + ' has an invalid run-record schema') from error
|
||||||
|
|
||||||
|
|
||||||
|
def _common(left, right):
|
||||||
|
return {'same_neuron_count': len(left['state']['v']) == len(right['state']['v']),
|
||||||
|
'same_APL_width': left['terminal']['apl_pending'].shape[1] == right['terminal']['apl_pending'].shape[1],
|
||||||
|
'same_effective_weights': left['summary']['effective_weights_raw_sha256'] ==
|
||||||
|
right['summary']['effective_weights_raw_sha256']}
|
||||||
|
|
||||||
|
|
||||||
|
def _report(comparison, checks, observed, limitations):
|
||||||
|
# All predicates are JSON booleans, not array scalars or success claims.
|
||||||
|
checks = {key: bool(value) for key, value in checks.items()}
|
||||||
|
return dict(schema=SCHEMA, comparison=comparison, numerical_exact=all(checks.values()),
|
||||||
|
checks=checks, failed_checks=[key for key, value in checks.items() if not value],
|
||||||
|
observed_scope=observed, limitations=list(limitations), learning_pass_claimed=False,
|
||||||
|
complete_dynamical_equivalence_proven=False, external_authority_verified_here=False,
|
||||||
|
independent_CSR_queue_reconstruction_performed=False)
|
||||||
|
|
||||||
|
|
||||||
|
def compare_slice(candidate, monolithic):
|
||||||
|
"""Compare candidate's absolute [start,stop) with an origin-zero full reference.
|
||||||
|
|
||||||
|
The final candidate V/g/ref bytes must match the reference's tick stop-1
|
||||||
|
hashes even for light candidates. Missing light intermediate observations
|
||||||
|
are disclosed, never replaced by fabricated zero arrays or inferred hashes.
|
||||||
|
"""
|
||||||
|
candidate, observed = _record(candidate, 'candidate')
|
||||||
|
monolithic, full = _record(monolithic, 'monolithic')
|
||||||
|
_require(monolithic['global_tick_offset'] == 0, 'Monolithic slice reference must have origin zero')
|
||||||
|
_require(monolithic['summary'].get('diagnostic_mode') == 'reference' or
|
||||||
|
str(monolithic.get('terminal_origin', '')).startswith('AM_'),
|
||||||
|
'Monolithic slice source must be declared reference or loaded legacy AM')
|
||||||
|
_require(all(full.values()), 'Monolithic slice reference needs all four APL traces, state hashes and queues')
|
||||||
|
start, steps = candidate['global_tick_offset'], candidate['steps']
|
||||||
|
stop = start + steps
|
||||||
|
_require(stop <= monolithic['steps'], 'Candidate slice extends beyond monolithic reference')
|
||||||
|
checks = _common(candidate, monolithic)
|
||||||
|
state, whole = candidate['state'], monolithic['state']
|
||||||
|
lo, hi = np.searchsorted(whole['step'], (start, stop))
|
||||||
|
expected_ticks = (whole['step'][lo:hi].astype(np.int64) - start).astype(np.int32)
|
||||||
|
expected_nodes = whole['neuron_idx'][lo:hi]
|
||||||
|
checks['slice.event_steps'] = ec.bit_equal(state['step'], expected_ticks)
|
||||||
|
checks['slice.event_neurons'] = ec.bit_equal(state['neuron_idx'], expected_nodes)
|
||||||
|
counts = np.bincount(expected_nodes, minlength=len(whole['v'])).astype(np.int32)
|
||||||
|
checks['slice.segment_counts'] = ec.bit_equal(state['counts'], counts)
|
||||||
|
requests = monolithic['requests']
|
||||||
|
lo, hi = np.searchsorted(requests[:, 0], (start, stop))
|
||||||
|
expected_requests = requests[lo:hi].copy()
|
||||||
|
expected_requests[:, 0] -= start
|
||||||
|
checks['slice.requests_five_fields'] = ec.bit_equal(candidate['requests'], expected_requests)
|
||||||
|
for name in ('v', 'g', 'ref'):
|
||||||
|
checks['slice.final_' + name + '_raw_hash'] = _raw_sha(state[name]) == monolithic['state_hashes'][stop - 1][name + '_sha256']
|
||||||
|
raw_ring = ec.reconstructed_fresh_ring(whole, stop, len(whole['v']))
|
||||||
|
expected_ring = raw_ring[(np.arange(19) + stop % 19) % 19]
|
||||||
|
checks['slice.normalized_spike_ring'] = ec.bit_equal(ec.normalized_ring(candidate['terminal']), expected_ring)
|
||||||
|
traces = monolithic['traces']
|
||||||
|
checks['slice.APL_state'] = ec.bit_equal(candidate['terminal']['apl_state'], traces['state'][stop - 1])
|
||||||
|
pending = np.zeros((18, traces['generated'].shape[1]), dtype=np.float32)
|
||||||
|
kept = min(stop, 18)
|
||||||
|
pending[-kept:] = traces['generated'][stop - kept:stop]
|
||||||
|
checks['slice.APL_pending'] = ec.bit_equal(candidate['terminal']['apl_pending'], pending)
|
||||||
|
if observed['apl_traces']:
|
||||||
|
for name in ec.TRACE_FILES:
|
||||||
|
checks['slice.APL_trace.' + name] = ec.bit_equal(candidate['traces'][name], traces[name][start:stop])
|
||||||
|
if observed['state_hashes']:
|
||||||
|
checks['slice.per_tick_state_hashes'] = all(
|
||||||
|
all(left[key] == right[key] for key in ec.HASH_FIELDS)
|
||||||
|
for left, right in zip(candidate['state_hashes'], monolithic['state_hashes'][start:stop]))
|
||||||
|
if observed['queues']:
|
||||||
|
checks['slice.queue_order_and_acceptance'] = all(
|
||||||
|
all(left[key] == right[key] for key in ec.QUEUE_FIELDS)
|
||||||
|
for left, right in zip(candidate['queues'], monolithic['queues'][start:stop]))
|
||||||
|
limitations = ['External input/seal/case/parent authority is not established by these records.',
|
||||||
|
'Queue joint hashes contain local tick headers; their independent CSR reconstruction is not performed here.',
|
||||||
|
'Numerical equality of this observed slice is not a learning, live-coverage or complete dynamics proof.']
|
||||||
|
for key, label in (('apl_traces', 'APL histories'), ('state_hashes', 'intermediate V/g/ref state hashes'),
|
||||||
|
('queues', 'per-tick queue order/acceptance')):
|
||||||
|
if not observed[key]:
|
||||||
|
limitations.append('Candidate ' + label + ' are unobserved; no direct comparison is claimed.')
|
||||||
|
return _report('slice', checks, dict(start=start, stop=stop, segment_steps=steps,
|
||||||
|
events=True, segment_counts=True, requests_five_fields=True, final_state_against_reference_tick_hash=True,
|
||||||
|
normalized_spike_ring_from_reference_prefix_events=True, terminal_APL_state_and_pending=True,
|
||||||
|
candidate_APL_histories=observed['apl_traces'], candidate_per_tick_state_hashes=observed['state_hashes'],
|
||||||
|
candidate_per_tick_queue_fields=observed['queues'], queue_joint_hashes_compared=False), limitations)
|
||||||
|
|
||||||
|
|
||||||
|
def compare_checkpoint(candidate, prefix):
|
||||||
|
"""Compare equal absolute endpoints, not local phases or segment counts."""
|
||||||
|
candidate, _ = _record(candidate, 'candidate')
|
||||||
|
prefix, _ = _record(prefix, 'prefix')
|
||||||
|
checks = _common(candidate, prefix)
|
||||||
|
end = candidate['global_tick_offset'] + candidate['steps']
|
||||||
|
reference_end = prefix['global_tick_offset'] + prefix['steps']
|
||||||
|
checks['checkpoint.same_absolute_end'] = end == reference_end
|
||||||
|
for name in ('v', 'g', 'ref'):
|
||||||
|
checks['checkpoint.state.' + name] = ec.bit_equal(candidate['state'][name], prefix['state'][name])
|
||||||
|
checks['checkpoint.normalized_spike_ring'] = ec.bit_equal(
|
||||||
|
ec.normalized_ring(candidate['terminal']), ec.normalized_ring(prefix['terminal']))
|
||||||
|
for name in ('apl_state', 'apl_pending'):
|
||||||
|
checks['checkpoint.' + name] = ec.bit_equal(candidate['terminal'][name], prefix['terminal'][name])
|
||||||
|
return _report('checkpoint', checks, dict(candidate_absolute_end=end, reference_absolute_end=reference_end,
|
||||||
|
candidate_local_steps=candidate['steps'], reference_local_steps=prefix['steps'], terminal_v_g_ref=True,
|
||||||
|
normalized_spike_ring=True, terminal_APL_state_and_pending=True, counts_compared=False,
|
||||||
|
event_histories_compared=False, per_tick_state_histories_compared=False), [
|
||||||
|
'Segment counts and cumulative prefix counts are deliberately not compared in this endpoint scope.',
|
||||||
|
'Matching terminal records do not prove matching intermediate states or complete event histories.',
|
||||||
|
'External input/seal/parent authority and live-carry coverage remain separate gates.'])
|
||||||
|
|
||||||
|
|
||||||
|
def compare_parent_carry(candidate, parent):
|
||||||
|
"""Check recorded short-segment carry invariants, not unobserved restoration.
|
||||||
|
|
||||||
|
The parent ends where the candidate starts. Slots already overwritten by
|
||||||
|
this segment cannot be checked as initial carry from terminal data alone.
|
||||||
|
When present, the child's applied trace directly tests consumed APL rows.
|
||||||
|
"""
|
||||||
|
candidate, observed = _record(candidate, 'candidate')
|
||||||
|
parent, _ = _record(parent, 'parent')
|
||||||
|
_require(candidate['global_tick_offset'] > 0, 'Parent-carry candidate must be a continued segment')
|
||||||
|
checks = _common(candidate, parent)
|
||||||
|
start, steps = candidate['global_tick_offset'], candidate['steps']
|
||||||
|
parent_end = parent['global_tick_offset'] + parent['steps']
|
||||||
|
checks['parent.contiguous_absolute_clock'] = parent_end == start
|
||||||
|
restored_ring = ec.normalized_ring(parent['terminal'])
|
||||||
|
unconsumed_spikes, unconsumed_apl = steps < 19, steps < 18
|
||||||
|
if unconsumed_spikes:
|
||||||
|
checks['parent.unwritten_spike_slots'] = ec.bit_equal(
|
||||||
|
candidate['terminal']['spike_ring'][steps:], restored_ring[steps:])
|
||||||
|
pending = parent['terminal']['apl_pending']
|
||||||
|
if unconsumed_apl:
|
||||||
|
checks['parent.unconsumed_APL_prefix'] = ec.bit_equal(
|
||||||
|
candidate['terminal']['apl_pending'][:18 - steps], pending[steps:])
|
||||||
|
consume = min(18, steps)
|
||||||
|
if observed['apl_traces']:
|
||||||
|
checks['parent.applied_APL_prefix'] = ec.bit_equal(candidate['traces']['applied'][:consume], pending[:consume])
|
||||||
|
limitations = ['Initial V/g/ref/APL-state restoration is not directly observed by this terminal-only carry scope.',
|
||||||
|
'Overwritten spike slots and consumed pending slots require the separate full-reference slice/endpoint gates.',
|
||||||
|
'Parent manifest hashes and ancestor provenance must be independently bound by the coordinator.',
|
||||||
|
'No queue arrival/acceptance reconstruction, live-carry or learning success is claimed here.']
|
||||||
|
if not observed['apl_traces']:
|
||||||
|
limitations.append('Candidate applied APL history is unobserved; consumed parent APL values are not directly compared.')
|
||||||
|
carry_observed = unconsumed_spikes or unconsumed_apl or observed['apl_traces']
|
||||||
|
if not carry_observed:
|
||||||
|
limitations.append('No carry array remains directly observable in this long light segment; this scope checks clock/shape/weight identity only.')
|
||||||
|
return _report('parent_carry', checks, dict(parent_absolute_start=parent['global_tick_offset'],
|
||||||
|
parent_absolute_end=parent_end, candidate_absolute_start=start, candidate_absolute_end=start + steps,
|
||||||
|
candidate_local_steps=steps, unwritten_spike_slots_checked=unconsumed_spikes,
|
||||||
|
unwritten_spike_slot_count=max(19 - steps, 0), unconsumed_APL_prefix_checked=unconsumed_apl,
|
||||||
|
unconsumed_APL_row_count=max(18 - steps, 0), applied_parent_APL_prefix_checked=observed['apl_traces'],
|
||||||
|
applied_parent_APL_rows_compared=consume if observed['apl_traces'] else None,
|
||||||
|
any_carry_values_directly_compared=carry_observed,
|
||||||
|
initial_neural_state_restoration_directly_observed=False), limitations)
|
||||||
@@ -0,0 +1,421 @@
|
|||||||
|
"""Finite, no-training execution of the separately registered 32-call gate.
|
||||||
|
|
||||||
|
All files are exclusive creations. A partial/failed row is preserved and is
|
||||||
|
not retried. Runtime outputs are sealed before external reports are written.
|
||||||
|
The preparation module owns source/input authority; no summary Boolean alone
|
||||||
|
is accepted as proof that a subprocess or a complete engineering gate passed.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
import importlib
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
import urllib.request
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_inputs as I
|
||||||
|
import engineering_plan as PLAN
|
||||||
|
import runtime_light as R
|
||||||
|
import runtime_continuation as C
|
||||||
|
|
||||||
|
|
||||||
|
GPU = 'GPU-79f3a85d-adce-7833-7003-6488140ca596'
|
||||||
|
ROOT = Path('/data/digital-drosophila')
|
||||||
|
MODEL = Path(__file__).resolve().parent
|
||||||
|
EXP = ROOT / 'experiments/phase4an-engineering-validation'
|
||||||
|
require = R.require
|
||||||
|
|
||||||
|
|
||||||
|
def canonical(value):
|
||||||
|
return json.dumps(value, sort_keys=True, separators=(',', ':'), allow_nan=False)
|
||||||
|
|
||||||
|
|
||||||
|
def same_json(left, right):
|
||||||
|
return canonical(left) == canonical(right)
|
||||||
|
|
||||||
|
|
||||||
|
def preparation():
|
||||||
|
return importlib.import_module('engineering_prepare')
|
||||||
|
|
||||||
|
|
||||||
|
def row_from(registration, row_id):
|
||||||
|
plan = PLAN.validate_plan(registration['plan'])
|
||||||
|
rows = [row for row in plan['rows'] if row['row_id'] == row_id]
|
||||||
|
require(len(rows) == 1, 'Only an exact registered row may execute')
|
||||||
|
return rows[0]
|
||||||
|
|
||||||
|
|
||||||
|
def locations(row_id):
|
||||||
|
require(type(row_id) is str and row_id and all(ch.isalnum() or ch in '-_' for ch in row_id),
|
||||||
|
'Unsafe row identity')
|
||||||
|
return dict(output=EXP / 'runs' / row_id,
|
||||||
|
runtime=EXP / 'receipts' / (row_id + '.runtime.json'),
|
||||||
|
execution=EXP / 'receipts' / (row_id + '.json'),
|
||||||
|
derivation=EXP / 'receipts' / (row_id + '.derivation.json'),
|
||||||
|
stdout=EXP / 'logs' / (row_id + '.stdout.log'),
|
||||||
|
stderr=EXP / 'logs' / (row_id + '.stderr.log'))
|
||||||
|
|
||||||
|
|
||||||
|
def disk_budget(registration):
|
||||||
|
limit = registration['budget']['output_budget_bytes']
|
||||||
|
reserve = registration['budget']['minimum_free_reserve_bytes']
|
||||||
|
require(type(limit) is type(reserve) is int and limit > 0 and reserve > 0, 'Invalid registered budget')
|
||||||
|
files = [p for p in EXP.rglob('*') if p.is_file()]
|
||||||
|
require(not any(p.is_symlink() for p in EXP.rglob('*')), 'Experiment contains a linked output')
|
||||||
|
used = sum(p.stat().st_size for p in files)
|
||||||
|
free = shutil.disk_usage(EXP).free
|
||||||
|
require(used <= limit and free >= reserve + max(0, limit - used), 'Engineering budget/reserve exceeded; preserve partials')
|
||||||
|
return dict(used_bytes=used, free_bytes=free, hard_cap_bytes=limit, reserve_bytes=reserve)
|
||||||
|
|
||||||
|
|
||||||
|
def preflight():
|
||||||
|
"""Never evict an existing service; configure only this child process."""
|
||||||
|
os.environ['CUDA_VISIBLE_DEVICES'] = GPU
|
||||||
|
os.environ['CUDA_HOME'] = '/usr/local/cuda'
|
||||||
|
os.environ['PATH'] = str(ROOT / 'models/male-cns-lif/.venv/bin') + ':/usr/local/cuda/bin:' + os.environ['PATH']
|
||||||
|
os.environ['MAX_JOBS'] = '2'
|
||||||
|
os.environ['TORCH_CUDA_ARCH_LIST'] = '8.9'
|
||||||
|
for port in (8188, 8189, 8190):
|
||||||
|
with urllib.request.urlopen(f'http://192.168.10.51:{port}/queue', timeout=5) as response:
|
||||||
|
queue = json.load(response)
|
||||||
|
require(queue['queue_running'] == [] and queue['queue_pending'] == [],
|
||||||
|
'ComfyUI busy: defer rather than evict')
|
||||||
|
|
||||||
|
|
||||||
|
def derive_case(template, row, parent_sha):
|
||||||
|
require(type(template) is dict and set(template) == {'schema', 'row_id', 'original_spec', 'start', 'stop',
|
||||||
|
'budget_root', 'output_budget_bytes'}, 'Unexpected registered case template fields')
|
||||||
|
require(template['schema'] == 'phase4an-engineering-case-template-v1' and template['row_id'] == row['row_id'] and
|
||||||
|
type(template['start']) is int and type(template['stop']) is int and
|
||||||
|
(template['start'], template['stop']) == (row['start'], row['stop']), 'Template differs from exact plan')
|
||||||
|
require((row['parent_row_id'] is None) == (parent_sha is None), 'Parent linkage differs from registered plan')
|
||||||
|
return I.derive_spec(template['original_spec'], start=row['start'], stop=row['stop'],
|
||||||
|
budget_root=template['budget_root'], output_budget_bytes=template['output_budget_bytes'], parent_sha=parent_sha)
|
||||||
|
|
||||||
|
|
||||||
|
def npz_storage(path):
|
||||||
|
with zipfile.ZipFile(path) as archive:
|
||||||
|
rows = archive.infolist()
|
||||||
|
require(rows and all(r.compress_type == zipfile.ZIP_DEFLATED and r.filename.endswith('.npy') for r in rows),
|
||||||
|
'Declared lossless compressed state format differs from actual archive')
|
||||||
|
return dict(file_bytes=Path(path).stat().st_size,
|
||||||
|
uncompressed_entry_bytes=sum(r.file_size for r in rows),
|
||||||
|
compressed_entry_bytes=sum(r.compress_size for r in rows),
|
||||||
|
entries=[dict(name=r.filename, bytes=r.file_size, compressed_bytes=r.compress_size,
|
||||||
|
compression=r.compress_type) for r in rows])
|
||||||
|
|
||||||
|
|
||||||
|
def runtime_environment():
|
||||||
|
"""Read settings after the runtime imported Torch; change none of them."""
|
||||||
|
torch = sys.modules.get('torch')
|
||||||
|
require(torch is not None and os.environ.get('CUDA_VISIBLE_DEVICES') == GPU and
|
||||||
|
torch.cuda.device_count() == 1 and '4090' in torch.cuda.get_device_name(0),
|
||||||
|
'Actual runtime is not the registered single RTX4090')
|
||||||
|
properties = torch.cuda.get_device_properties(0)
|
||||||
|
inventory = subprocess.run(['nvidia-smi', '-i', GPU,
|
||||||
|
'--query-gpu=uuid,name,memory.total,driver_version', '--format=csv,noheader'],
|
||||||
|
check=True, capture_output=True, text=True, timeout=20).stdout.strip()
|
||||||
|
require(inventory.startswith(GPU + ','), 'GPU hardware inventory does not match the registered UUID')
|
||||||
|
return dict(python_executable=sys.executable, python_version=sys.version, numpy_version=np.__version__,
|
||||||
|
torch_version=str(torch.__version__), torch_cuda_version=torch.version.cuda,
|
||||||
|
device_name=properties.name, total_memory_bytes=int(properties.total_memory),
|
||||||
|
gpu_uuid=GPU, nvidia_smi_inventory=inventory,
|
||||||
|
matmul_allow_tf32=bool(torch.backends.cuda.matmul.allow_tf32),
|
||||||
|
cudnn_allow_tf32=bool(torch.backends.cudnn.allow_tf32),
|
||||||
|
deterministic_algorithms=bool(torch.are_deterministic_algorithms_enabled()),
|
||||||
|
cudnn_deterministic=bool(torch.backends.cudnn.deterministic),
|
||||||
|
cudnn_benchmark=bool(torch.backends.cudnn.benchmark),
|
||||||
|
float32_matmul_precision=torch.get_float32_matmul_precision(),
|
||||||
|
CUBLAS_WORKSPACE_CONFIG=os.environ.get('CUBLAS_WORKSPACE_CONFIG'),
|
||||||
|
TORCH_CUDA_ARCH_LIST=os.environ.get('TORCH_CUDA_ARCH_LIST'),
|
||||||
|
settings_changed_by_environment_recorder=False,
|
||||||
|
environment_recorder_adds_no_timing=True,
|
||||||
|
build_timing_source='Use inherited summary.build_or_cache_seconds; build/cache is also included in runtime wall time')
|
||||||
|
|
||||||
|
|
||||||
|
def verify_environment(recorded, component):
|
||||||
|
require(type(recorded) is type(component) is dict and
|
||||||
|
recorded.get('gpu_uuid') == GPU and recorded.get('settings_changed_by_environment_recorder') is False,
|
||||||
|
'Missing or invalid actual environment receipt')
|
||||||
|
require(component.get('cuda_matmul_allow_tf32') is False and
|
||||||
|
component.get('float32_matmul_precision') == 'highest' and
|
||||||
|
component.get('precision_configuration_changed_by_component') is False,
|
||||||
|
'Frozen AM precision configuration changed; never correct it automatically')
|
||||||
|
pairs = {'matmul_allow_tf32': 'cuda_matmul_allow_tf32', 'cudnn_allow_tf32': 'cudnn_allow_tf32',
|
||||||
|
'deterministic_algorithms': 'deterministic_algorithms', 'cudnn_deterministic': 'cudnn_deterministic',
|
||||||
|
'cudnn_benchmark': 'cudnn_benchmark', 'float32_matmul_precision': 'float32_matmul_precision',
|
||||||
|
'CUBLAS_WORKSPACE_CONFIG': 'CUBLAS_WORKSPACE_CONFIG', 'device_name': 'device_name',
|
||||||
|
'torch_version': 'torch', 'torch_cuda_version': 'cuda', 'numpy_version': 'numpy'}
|
||||||
|
for left, right in pairs.items():
|
||||||
|
require(left in recorded and right in component and same_json(recorded[left], component[right]),
|
||||||
|
'Actual runtime/APL environment disagreement: ' + left)
|
||||||
|
require(type(recorded['device_name']) is str and '4090' in recorded['device_name'], 'Wrong physical device class')
|
||||||
|
|
||||||
|
|
||||||
|
def check_runtime_record(reg, reg_sha, row, record):
|
||||||
|
"""Recheck actual bytes, runtime completion and parent chain, not intent."""
|
||||||
|
paths = locations(row['row_id'])
|
||||||
|
require(record.get('complete') is True and record.get('registration_sha256') == reg_sha and
|
||||||
|
same_json(record.get('row'), row) and record.get('training') is False,
|
||||||
|
'Runtime record is not bound to this registered row')
|
||||||
|
case = Path(reg['cases'][row['row_id']]['case_dir'])
|
||||||
|
checkpoint = C.load_checkpoint(paths['output'], record['checkpoint_manifest_sha256'])
|
||||||
|
summary = checkpoint['summary']
|
||||||
|
verify_environment(record['environment'], summary['apl_component']['environment'])
|
||||||
|
require(checkpoint['steps'] == row['steps'] and checkpoint['global_tick_offset'] == row['start'] and
|
||||||
|
checkpoint['global_next_tick'] == row['stop'] and summary['nodes'] == 166700 and summary['edges'] == 25582938 and
|
||||||
|
summary['diagnostic_mode'] == row['mode'], 'Runtime clock/population/mode differs from plan')
|
||||||
|
require(record['case_sha256'] == R.digest(case / 'spec.json') and
|
||||||
|
record['requests_sha256'] == R.digest(case / 'requests.npz') and
|
||||||
|
record['derivation_sha256'] == R.digest(paths['derivation']), 'Derived input/receipt bytes changed')
|
||||||
|
template = R._read_json(case / 'template-spec.json')
|
||||||
|
parent_pin = None
|
||||||
|
if row['parent_row_id'] is not None:
|
||||||
|
parent = verify_execution(reg, reg_sha, row_from(reg, row['parent_row_id']))
|
||||||
|
parent_pin = parent['checkpoint_manifest_sha256']
|
||||||
|
expected, derivation = derive_case(template, row, parent_pin)
|
||||||
|
require(same_json(R._read_json(case / 'spec.json'), expected) and
|
||||||
|
same_json(R._read_json(paths['derivation']), derivation), 'Case was not generated by the registered exact rule')
|
||||||
|
require(record['parent_checkpoint_manifest_sha256'] == parent_pin and
|
||||||
|
summary.get('parent_checkpoint_manifest_sha256') == parent_pin, 'Execution parent SHA mismatch')
|
||||||
|
require(record['checkpoint_inventory_sha256'] == R.digest(paths['output'] / C.MANIFEST), 'Checkpoint manifest changed')
|
||||||
|
for name in ('state.npz', 'terminal-queues.npz'):
|
||||||
|
require(same_json(record['storage'][name], npz_storage(paths['output'] / name)), 'Storage measurement changed')
|
||||||
|
return record
|
||||||
|
|
||||||
|
|
||||||
|
def verify_execution(reg, reg_sha, row):
|
||||||
|
paths = locations(row['row_id'])
|
||||||
|
receipt = R._read_json(paths['execution'])
|
||||||
|
require(receipt.get('complete') is True and type(receipt.get('process_exit_code')) is int and receipt['process_exit_code'] == 0 and
|
||||||
|
receipt.get('registration_sha256') == reg_sha and receipt.get('row_id') == row['row_id'],
|
||||||
|
'Missing completed process receipt')
|
||||||
|
for field, key in (('runtime_record_sha256', 'runtime'), ('stdout_sha256', 'stdout'), ('stderr_sha256', 'stderr')):
|
||||||
|
require(receipt[field] == R.digest(paths[key]), 'Execution log/runtime receipt changed')
|
||||||
|
require(not (EXP / 'audit/stopped.json').exists(), 'A failed/deferred run requires explicit review, not automatic retry')
|
||||||
|
record = check_runtime_record(reg, reg_sha, row, R._read_json(paths['runtime']))
|
||||||
|
require(receipt['checkpoint_manifest_sha256'] == record['checkpoint_manifest_sha256'], 'Execution/checkpoint linkage mismatch')
|
||||||
|
return record
|
||||||
|
|
||||||
|
|
||||||
|
def worker(reg_sha, row_id):
|
||||||
|
require(sys.dont_write_bytecode, 'Use the scientific venv with -B')
|
||||||
|
reg = preparation().read_registration(reg_sha)
|
||||||
|
row = row_from(reg, row_id)
|
||||||
|
paths = locations(row_id)
|
||||||
|
require(not paths['output'].exists() and not paths['runtime'].exists() and not paths['derivation'].exists(),
|
||||||
|
'Never overwrite/retry a partial row')
|
||||||
|
budget_before = disk_budget(reg)
|
||||||
|
preflight()
|
||||||
|
parent_sha = None
|
||||||
|
parent_dir = None
|
||||||
|
if row['parent_row_id'] is not None:
|
||||||
|
parent_record = verify_execution(reg, reg_sha, row_from(reg, row['parent_row_id']))
|
||||||
|
parent_sha = parent_record['checkpoint_manifest_sha256']
|
||||||
|
parent_dir = locations(row['parent_row_id'])['output']
|
||||||
|
case = Path(reg['cases'][row_id]['case_dir'])
|
||||||
|
template = R._read_json(case / 'template-spec.json')
|
||||||
|
spec, derivation = derive_case(template, row, parent_sha)
|
||||||
|
require(not (case / 'spec.json').exists(), 'Derived spec already exists; preserve partial instead of rerun')
|
||||||
|
R._save(case / 'spec.json', spec)
|
||||||
|
R._save(paths['derivation'], derivation)
|
||||||
|
overlay = reg['overlays'][row['overlay']]
|
||||||
|
start_utc = datetime.now(timezone.utc).isoformat()
|
||||||
|
start = time.perf_counter()
|
||||||
|
if parent_dir is None:
|
||||||
|
function = R.run_reference if row['mode'] == 'reference' else R.run_light
|
||||||
|
function(case, paths['output'], EXP / 'extension-build', overlay['overlay_file'], overlay['overlay_manifest'])
|
||||||
|
pin = C.seal_checkpoint(paths['output'])['sha256']
|
||||||
|
else:
|
||||||
|
result = C.run_continued(case, paths['output'], EXP / 'extension-build',
|
||||||
|
overlay['overlay_file'], overlay['overlay_manifest'], parent_dir, mode=row['mode'])
|
||||||
|
pin = result['checkpoint_manifest_sha256']
|
||||||
|
elapsed = time.perf_counter() - start
|
||||||
|
budget_after = disk_budget(reg)
|
||||||
|
record = dict(schema='phase4an-engineering-runtime-record-v1', complete=True, training=False,
|
||||||
|
registration_sha256=reg_sha, row=row, case_sha256=R.digest(case / 'spec.json'),
|
||||||
|
requests_sha256=R.digest(case / 'requests.npz'), derivation_sha256=R.digest(paths['derivation']),
|
||||||
|
checkpoint_manifest_sha256=pin, checkpoint_inventory_sha256=R.digest(paths['output'] / C.MANIFEST),
|
||||||
|
parent_checkpoint_manifest_sha256=parent_sha, runtime_and_immediate_seal_wall_seconds=elapsed,
|
||||||
|
started_utc=start_utc, completed_utc=datetime.now(timezone.utc).isoformat(),
|
||||||
|
environment=runtime_environment(),
|
||||||
|
budget_before=budget_before, budget_after=budget_after,
|
||||||
|
storage={name: npz_storage(paths['output'] / name) for name in ('state.npz', 'terminal-queues.npz')},
|
||||||
|
no_result_selected_retry=True, learning_pass_claimed=False)
|
||||||
|
# Do not write this or any later report INSIDE the sealed checkpoint.
|
||||||
|
check_runtime_record(reg, reg_sha, row, record)
|
||||||
|
preparation().read_registration(reg_sha)
|
||||||
|
R._save(paths['runtime'], record)
|
||||||
|
print('COMPLETED ENGINEERING ROW', row_id, flush=True)
|
||||||
|
|
||||||
|
|
||||||
|
def run_registered(reg_sha):
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B')
|
||||||
|
reg = preparation().read_registration(reg_sha)
|
||||||
|
require(not (EXP / 'audit/stopped.json').exists() and not (EXP / 'audit/execution-complete.json').exists(),
|
||||||
|
'Stopped/completed gate must not be restarted')
|
||||||
|
started = time.perf_counter()
|
||||||
|
completed = []
|
||||||
|
try:
|
||||||
|
for row in reg['plan']['rows']:
|
||||||
|
paths = locations(row['row_id'])
|
||||||
|
if paths['execution'].exists():
|
||||||
|
verify_execution(reg, reg_sha, row)
|
||||||
|
completed.append(dict(row_id=row['row_id'], execution_sha256=R.digest(paths['execution']),
|
||||||
|
reverified_existing=True))
|
||||||
|
continue
|
||||||
|
require(not any(paths[k].exists() for k in ('output', 'runtime', 'stdout', 'stderr', 'derivation')),
|
||||||
|
'Partial row present; no automatic retry')
|
||||||
|
disk_budget(reg)
|
||||||
|
preflight()
|
||||||
|
began = time.perf_counter()
|
||||||
|
print('START', row['row_id'], flush=True)
|
||||||
|
with paths['stdout'].open('xb') as out, paths['stderr'].open('xb') as err:
|
||||||
|
result = subprocess.run([sys.executable, '-B', str(Path(__file__)), 'worker',
|
||||||
|
'--registration-sha256', reg_sha, '--row-id', row['row_id']], cwd=MODEL, stdout=out, stderr=err)
|
||||||
|
require(result.returncode == 0, 'Worker failed; preserve its stdout/stderr and partial output')
|
||||||
|
record = check_runtime_record(reg, reg_sha, row, R._read_json(paths['runtime']))
|
||||||
|
receipt = dict(schema='phase4an-engineering-execution-receipt-v1', complete=True,
|
||||||
|
process_exit_code=result.returncode, row_id=row['row_id'], registration_sha256=reg_sha,
|
||||||
|
runtime_record_sha256=R.digest(paths['runtime']), stdout_sha256=R.digest(paths['stdout']),
|
||||||
|
stderr_sha256=R.digest(paths['stderr']), process_wall_seconds=time.perf_counter() - began,
|
||||||
|
checkpoint_manifest_sha256=record['checkpoint_manifest_sha256'], scientific_pass_claimed=False)
|
||||||
|
R._save(paths['execution'], receipt)
|
||||||
|
verify_execution(reg, reg_sha, row)
|
||||||
|
completed.append(dict(row_id=row['row_id'], execution_sha256=R.digest(paths['execution']),
|
||||||
|
reverified_existing=False))
|
||||||
|
print('COMPLETE', row['row_id'], flush=True)
|
||||||
|
require(len(completed) == 32, 'Incomplete registered inventory')
|
||||||
|
preparation().read_registration(reg_sha)
|
||||||
|
R._save(EXP / 'audit/execution-complete.json', dict(complete=True, registration_sha256=reg_sha,
|
||||||
|
completed=completed, expected_calls=32, executed_ticks=11074, wall_seconds=time.perf_counter() - started,
|
||||||
|
numerical_gate_evaluated=False, training=False, learning_pass_claimed=False))
|
||||||
|
except Exception as error:
|
||||||
|
R._save(EXP / 'audit/stopped.json', dict(complete=False, type=type(error).__name__, message=str(error),
|
||||||
|
traceback=traceback.format_exc(), completed_before_error=completed, partial_outputs_preserved=True,
|
||||||
|
no_automatic_retry=True, scientific_failure_not_inferred_from_engineering_failure=True))
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def verified_inventory(reg, reg_sha):
|
||||||
|
"""A completed child and every planned descriptor must remain auditable."""
|
||||||
|
plan = PLAN.validate_plan(reg['plan'])
|
||||||
|
receipt = R._read_json(EXP / 'audit/execution-complete.json')
|
||||||
|
require(receipt.get('complete') is True and receipt.get('registration_sha256') == reg_sha and
|
||||||
|
type(receipt.get('expected_calls')) is int and receipt['expected_calls'] == plan['total_calls'] and
|
||||||
|
type(receipt.get('executed_ticks')) is int and receipt['executed_ticks'] == plan['total_ticks'] and
|
||||||
|
receipt.get('training') is False and receipt.get('learning_pass_claimed') is False,
|
||||||
|
'Execution inventory is not a complete no-training registered gate')
|
||||||
|
require(type(receipt.get('completed')) is list and len(receipt['completed']) == plan['total_calls'],
|
||||||
|
'Execution inventory truncated')
|
||||||
|
records = {}
|
||||||
|
for row, entry in zip(plan['rows'], receipt['completed']):
|
||||||
|
require(entry.get('row_id') == row['row_id'] and
|
||||||
|
entry.get('execution_sha256') == R.digest(locations(row['row_id'])['execution']),
|
||||||
|
'Execution completion inventory reordered or receipt changed')
|
||||||
|
records[row['row_id']] = verify_execution(reg, reg_sha, row)
|
||||||
|
return records
|
||||||
|
|
||||||
|
|
||||||
|
def evaluate(reg_sha):
|
||||||
|
reg = preparation().read_registration(reg_sha)
|
||||||
|
records = verified_inventory(reg, reg_sha)
|
||||||
|
report = importlib.import_module('engineering_analysis').analyze(reg, reg_sha, records)
|
||||||
|
require(type(report) is dict and report.get('training') is False and report.get('learning_pass_claimed') is False,
|
||||||
|
'Engineering analysis must not claim training or learning')
|
||||||
|
preparation().read_registration(reg_sha)
|
||||||
|
return reg, report
|
||||||
|
|
||||||
|
|
||||||
|
def analyze(reg_sha):
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B')
|
||||||
|
target = EXP / 'audit/engineering-analysis.json'
|
||||||
|
require(not target.exists() and not (EXP / 'manifest.json').exists(), 'Analysis/seal already exists; do not overwrite')
|
||||||
|
began = time.perf_counter()
|
||||||
|
_, report = evaluate(reg_sha)
|
||||||
|
R._save(target, report)
|
||||||
|
R._save(EXP / 'audit/analysis-execution.json', dict(registration_sha256=reg_sha,
|
||||||
|
analysis_sha256=R.digest(target), wall_seconds=time.perf_counter() - began, GPU_used=False,
|
||||||
|
training=False, learning_pass_claimed=False))
|
||||||
|
print(report['status'], flush=True)
|
||||||
|
|
||||||
|
|
||||||
|
def seal_experiment():
|
||||||
|
"""Seal only the new engineering experiment, not the unfinished lab model."""
|
||||||
|
controls = ('manifest.json', 'checksums.sha256')
|
||||||
|
require(not any((EXP / name).exists() for name in controls), 'Do not replace an existing or partial seal')
|
||||||
|
paths = sorted(EXP.rglob('*'))
|
||||||
|
require(not any(path.is_symlink() for path in paths), 'Cannot seal linked artifacts')
|
||||||
|
require(not any('__pycache__' in path.relative_to(EXP).parts for path in paths), 'Unexpected bytecode cache in new experiment')
|
||||||
|
rows = [dict(path=path.relative_to(EXP).as_posix(), bytes=path.stat().st_size, sha256=R.digest(path))
|
||||||
|
for path in paths if path.is_file()]
|
||||||
|
require(rows, 'Cannot seal an empty experiment')
|
||||||
|
# Only ROOT controls are excluded from their own hash. Nested checkpoint
|
||||||
|
# manifests and source snapshots are ordinary payload and remain included.
|
||||||
|
R._save(EXP / controls[0], dict(root=str(EXP), files=rows))
|
||||||
|
with (EXP / controls[1]).open('x', encoding='utf-8', newline='\n') as stream:
|
||||||
|
stream.writelines(row['sha256'] + ' ' + row['path'] + '\n' for row in rows)
|
||||||
|
stream.write(R.digest(EXP / controls[0]) + ' manifest.json\n')
|
||||||
|
return dict(manifest_sha256=R.digest(EXP / controls[0]), checksums_sha256=R.digest(EXP / controls[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def finalize(reg_sha):
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B')
|
||||||
|
require(not (EXP / 'manifest.json').exists() and not (EXP / 'audit/final-status.json').exists(),
|
||||||
|
'Final/partial seal already exists; preserve it')
|
||||||
|
reg, actual = evaluate(reg_sha)
|
||||||
|
target = EXP / 'audit/engineering-analysis.json'
|
||||||
|
require(same_json(actual, R._read_json(target)), 'Recomputed analysis differs from saved evidence')
|
||||||
|
execution = R._read_json(EXP / 'audit/analysis-execution.json')
|
||||||
|
require(execution.get('registration_sha256') == reg_sha and execution.get('analysis_sha256') == R.digest(target),
|
||||||
|
'Saved analysis is not bound to its execution receipt')
|
||||||
|
authority = preparation().verify_authority(reg['anchors'])
|
||||||
|
old = preparation().verify_old_integrity(reg)
|
||||||
|
R._save(EXP / 'regression/AM-seals-after.json', authority)
|
||||||
|
R._save(EXP / 'regression/old-integrity-after.json', old)
|
||||||
|
preparation().read_registration(reg_sha)
|
||||||
|
final = dict(schema='phase4an-engineering-final-v1', status=actual['status'],
|
||||||
|
registration_sha256=reg_sha, analysis_sha256=R.digest(target),
|
||||||
|
analysis_recomputed_exactly=True, completed_calls=32, executed_ticks=11074,
|
||||||
|
old_integrity_pass=True, old_integrity_roots=len(old), AM_seals_preserved=True,
|
||||||
|
old_five_reference_evidence='Sealed AM five-trial evidence retained; not rerun by this engineering gate',
|
||||||
|
training=False, learning_pass_claimed=False, learned_candidate=False,
|
||||||
|
model_directory_sealed=False, used_engineering_source_snapshots_sealed=True,
|
||||||
|
budget=disk_budget(reg),
|
||||||
|
scope='Finite registered 100 ms input and fixed continuation cuts only; no universal determinism, learning or physiology claim')
|
||||||
|
R._save(EXP / 'audit/final-status.json', final)
|
||||||
|
pins = seal_experiment()
|
||||||
|
helper = preparation().load_module('phase4an_pinned_AI_publication',
|
||||||
|
ROOT / preparation().AI_HELPER_REL, preparation().AI_HELPER_SHA)
|
||||||
|
verified = helper.verify_seal(EXP)
|
||||||
|
require(verified['manifest_sha256'] == pins['manifest_sha256'] and
|
||||||
|
verified['checksums_sha256'] == pins['checksums_sha256'], 'Final experiment seal verification failed')
|
||||||
|
print(canonical(dict(status=final['status'], **pins)), flush=True)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
|
parser.add_argument('action', choices=('run', 'worker', 'analyze', 'finalize'))
|
||||||
|
parser.add_argument('--registration-sha256', required=True)
|
||||||
|
parser.add_argument('--row-id')
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.action == 'worker':
|
||||||
|
require(args.row_id is not None, 'Worker requires a row ID')
|
||||||
|
worker(args.registration_sha256, args.row_id)
|
||||||
|
else:
|
||||||
|
require(args.row_id is None, 'Full inventory run has no selected row')
|
||||||
|
{'run': run_registered, 'analyze': analyze, 'finalize': finalize}[args.action](args.registration_sha256)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -0,0 +1,478 @@
|
|||||||
|
"""Unregistered fixed-weight continuation of the reporting-only AN executor.
|
||||||
|
|
||||||
|
run_continued(case, out, build, overlay, manifest, checkpoint_dir, mode='light')
|
||||||
|
also accepts mode='reference'. Inputs/events/counts use segment-local ticks;
|
||||||
|
summary and receipts expose global_tick_offset/global_next_tick. No training,
|
||||||
|
weight update, early stopping, or implicit extra tail is performed.
|
||||||
|
|
||||||
|
The caller must externally pin spec.parent_checkpoint_manifest_sha256. A fresh
|
||||||
|
parent's original runtime receipt did NOT bind state.npz: seal_checkpoint adds
|
||||||
|
that binding, after checking the available original receipts and current bytes.
|
||||||
|
It cannot retroactively prove that an unsealed state file was never modified.
|
||||||
|
Full graph/APL/coefficient/preregistered-input authority remains the coordinator's
|
||||||
|
responsibility, as in runtime_light. No executable/venv path is resolved here.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import importlib.util
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
LIGHT_SHA = '522b8c31ea938890fe15364fccd25ccc5bded54101754909f255532e7ad01aae'
|
||||||
|
N = 166700
|
||||||
|
E = 25582938
|
||||||
|
MANIFEST = 'checkpoint-manifest.json'
|
||||||
|
RECEIPT = 'continuation-receipt.json'
|
||||||
|
RESTORE = '_continuation.restore(v, g, ref, counts, ring, apl_ring, apl, upload)'
|
||||||
|
CLOCK_OLD = 'tick >= 18'
|
||||||
|
CLOCK_NEW = 'tick + _continuation.global_offset >= 18'
|
||||||
|
|
||||||
|
|
||||||
|
def _light():
|
||||||
|
path = Path(__file__).resolve().parent / 'runtime_light.py'
|
||||||
|
raw = path.read_bytes()
|
||||||
|
if hashlib.sha256(raw).hexdigest() != LIGHT_SHA:
|
||||||
|
raise ValueError('Fresh runtime source pin changed')
|
||||||
|
name = 'phase4an_continuation_pinned_light'
|
||||||
|
existing = sys.modules.get(name)
|
||||||
|
if existing is not None:
|
||||||
|
if getattr(existing, '__continuation_pin__', None) != LIGHT_SHA or Path(existing.__file__).resolve() != path:
|
||||||
|
raise ValueError('Unverified runtime module binding')
|
||||||
|
return existing
|
||||||
|
spec = importlib.util.spec_from_file_location(name, path)
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[name] = module
|
||||||
|
try:
|
||||||
|
exec(compile(raw, str(path), 'exec'), module.__dict__)
|
||||||
|
except BaseException:
|
||||||
|
sys.modules.pop(name, None)
|
||||||
|
raise
|
||||||
|
module.__continuation_pin__ = LIGHT_SHA
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
R = _light() # Pure NumPy/stdlib; this does not import Torch or run a brain.
|
||||||
|
|
||||||
|
|
||||||
|
def rotate_spike_ring(raw_ring, phase_tick):
|
||||||
|
"""Parent's local next-write slot becomes the child's local slot zero."""
|
||||||
|
R.require(isinstance(raw_ring, np.ndarray) and raw_ring.dtype == np.uint8 and
|
||||||
|
raw_ring.ndim == 2 and raw_ring.shape[0] == 19, 'Invalid spike ring dtype/shape')
|
||||||
|
R.require(type(phase_tick) is int and phase_tick >= 0 and np.all(raw_ring <= 1), 'Invalid ring phase/content')
|
||||||
|
return raw_ring[(np.arange(19) + phase_tick % 19) % 19].copy()
|
||||||
|
|
||||||
|
|
||||||
|
def _tree_hashes(directory):
|
||||||
|
"""Exact regular-file inventory, no symlink/reparse escapes, no self-hash."""
|
||||||
|
directory = Path(directory).resolve(strict=True)
|
||||||
|
R.require(directory.is_dir(), 'Checkpoint must be a directory')
|
||||||
|
result = {}
|
||||||
|
for path in sorted(directory.rglob('*')):
|
||||||
|
R.require(not path.is_symlink() and path.resolve().is_relative_to(directory), 'Checkpoint contains a linked/escaping path')
|
||||||
|
if path.is_dir():
|
||||||
|
continue
|
||||||
|
R.require(path.is_file(), 'Checkpoint contains a nonregular entry')
|
||||||
|
relative = path.relative_to(directory).as_posix()
|
||||||
|
if relative == MANIFEST:
|
||||||
|
continue
|
||||||
|
R.require('error' not in path.name.lower() and 'failure' not in path.name.lower(), 'Parent has failure/error evidence')
|
||||||
|
result[relative] = R.digest(path)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _npz(path, keys):
|
||||||
|
with np.load(path, allow_pickle=False) as archive:
|
||||||
|
R.require(len(archive.files) == len(keys) and set(archive.files) == set(keys), 'Unexpected checkpoint array keys: ' + str(path))
|
||||||
|
return {name: archive[name].copy() for name in keys}
|
||||||
|
|
||||||
|
|
||||||
|
def validate_state(state, terminal, steps, *, fresh):
|
||||||
|
"""Validate local events/counts and the slots written by this segment."""
|
||||||
|
R.require(type(steps) is int and 0 < steps <= np.iinfo(np.int32).max, 'Invalid segment length')
|
||||||
|
for name in ('v', 'g'):
|
||||||
|
value = state[name]
|
||||||
|
R.require(value.dtype == np.float64 and value.shape == (N,) and np.isfinite(value).all(), 'Invalid parent ' + name)
|
||||||
|
for name in ('ref', 'counts'):
|
||||||
|
value = state[name]
|
||||||
|
R.require(value.dtype == np.int32 and value.shape == (N,) and np.all(value >= 0), 'Invalid parent ' + name)
|
||||||
|
R.require(np.all(state['ref'] <= 22), 'Parent refractory counter exceeds frozen 22-step contract')
|
||||||
|
tick, neuron = state['step'], state['neuron_idx']
|
||||||
|
R.require(tick.dtype == neuron.dtype == np.int32 and tick.ndim == neuron.ndim == 1 and tick.shape == neuron.shape,
|
||||||
|
'Invalid sparse event dtype/shape')
|
||||||
|
R.require(np.all((tick >= 0) & (tick < steps)) and np.all((neuron >= 0) & (neuron < N)), 'Parent event outside segment')
|
||||||
|
key = tick.astype(np.int64) * N + neuron
|
||||||
|
R.require(len(key) < 2 or np.all(key[1:] > key[:-1]), 'Parent events must be sorted and unique')
|
||||||
|
R.require(np.array_equal(np.bincount(neuron, minlength=N), state['counts']), 'Parent counts are not segment-local event counts')
|
||||||
|
ring = terminal['spike_ring']
|
||||||
|
R.require(ring.dtype == np.uint8 and ring.shape == (19, N) and np.all(ring <= 1), 'Invalid parent spike ring')
|
||||||
|
for name, shape in (('apl_state', (2,)), ('apl_pending', (18, 4064))):
|
||||||
|
value = terminal[name]
|
||||||
|
R.require(value.dtype == np.float32 and value.shape == shape and np.isfinite(value).all(), 'Invalid terminal ' + name)
|
||||||
|
phase = terminal['next_tick']
|
||||||
|
R.require(phase.dtype == np.int64 and phase.shape == () and phase.item() == steps, 'Terminal local phase does not match segment length')
|
||||||
|
for local_tick in range(max(0, steps - 19), steps):
|
||||||
|
start, stop = np.searchsorted(tick, (local_tick, local_tick + 1))
|
||||||
|
expected = np.zeros(N, dtype=np.uint8)
|
||||||
|
expected[neuron[start:stop]] = 1
|
||||||
|
R.require(np.array_equal(ring[local_tick % 19], expected), 'Spike ring does not match emitted segment events')
|
||||||
|
if fresh and steps < 19:
|
||||||
|
R.require(not np.any(ring[steps:]), 'Fresh parent has nonzero uninitialized spike slots')
|
||||||
|
return state, terminal
|
||||||
|
|
||||||
|
|
||||||
|
def _verify_receipt_hashes(directory, receipt):
|
||||||
|
for key, name in (('summary_sha256', 'summary.json'), ('finite_audit_sha256', 'finite-audit.json'),
|
||||||
|
('terminal_queues_sha256', 'terminal-queues.npz'), ('overlay_audit_sha256', 'overlay-audit.json')):
|
||||||
|
R.require(receipt.get(key) == R.digest(directory / name), 'Parent receipt hash mismatch: ' + name)
|
||||||
|
inputs = receipt.get('input_sha256')
|
||||||
|
R.require(isinstance(inputs, dict) and inputs, 'Parent receipt lacks immutable input bindings')
|
||||||
|
for name, sha in inputs.items():
|
||||||
|
R.require(Path(name).is_absolute() and R._sha(sha) and R.digest(name) == sha, 'Parent input/source bytes changed: ' + name)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_record(directory, seen):
|
||||||
|
summary = R._read_json(directory / 'summary.json')
|
||||||
|
finite = R._read_json(directory / 'finite-audit.json')
|
||||||
|
provenance = R._read_json(directory / 'runtime-provenance.json')
|
||||||
|
steps = summary.get('steps')
|
||||||
|
R.require(summary.get('complete') is True and summary.get('pass_all') is True and summary.get('all_finite') is True and
|
||||||
|
summary.get('completed_ticks') == steps and summary.get('nodes') == N and summary.get('edges') == E and
|
||||||
|
summary.get('precision') == 'float64' and summary.get('apl_precision') == 'float32' and
|
||||||
|
summary.get('within_trial_weight_updates') is False, 'Parent is not a complete fixed-weight fullgraph trial')
|
||||||
|
R.require(finite.get('all_finite') is True and finite.get('first_failure_tick') == -1 and
|
||||||
|
finite.get('finite_observed_ticks') == steps, 'Parent finite coverage failed')
|
||||||
|
R.require(provenance.get('complete') is True and provenance.get('weights_updated_during_run') is False and
|
||||||
|
provenance.get('old_globals_patched') is False, 'Invalid parent runtime receipt')
|
||||||
|
_verify_receipt_hashes(directory, provenance)
|
||||||
|
fresh = provenance.get('schema') == 'phase4an-reporting-adapter-v1'
|
||||||
|
if fresh:
|
||||||
|
R.require(provenance.get('source_sha256') == LIGHT_SHA and R.digest(provenance['source_file']) == LIGHT_SHA and
|
||||||
|
summary.get('checkpoint_continuation_used') is False, 'Fresh parent source/continuation scope mismatch')
|
||||||
|
offset = 0
|
||||||
|
else:
|
||||||
|
R.require(provenance.get('schema') == 'phase4an-continuation-runtime-v1' and
|
||||||
|
provenance.get('source_sha256') == R.digest(__file__) and
|
||||||
|
R.digest(provenance['source_file']) == R.digest(__file__) and
|
||||||
|
summary.get('checkpoint_continuation_used') is True, 'Unrecognized continued parent source')
|
||||||
|
receipt = R._read_json(directory / RECEIPT)
|
||||||
|
R.require(receipt.get('schema') == 'phase4an-continuation-receipt-v1' and receipt.get('complete') is True,
|
||||||
|
'Invalid continuation receipt')
|
||||||
|
R.require(receipt.get('weights_updated_during_run') is False and receipt.get('segment_steps') == steps and
|
||||||
|
receipt.get('counts_scope') == 'segment_only_not_lifetime' and
|
||||||
|
provenance.get('state_sha256') == R.digest(directory / 'state.npz'), 'Continued state/scope receipt mismatch')
|
||||||
|
expected_payload = _tree_hashes(directory)
|
||||||
|
expected_payload.pop(RECEIPT, None)
|
||||||
|
R.require(receipt.get('payload_sha256') == expected_payload, 'Continuation receipt does not bind the exact payload')
|
||||||
|
parent_pin = receipt.get('parent_checkpoint_manifest_sha256')
|
||||||
|
case_spec = _parent_spec({'summary': summary, 'provenance': provenance})
|
||||||
|
R.require(R._sha(parent_pin) and provenance.get('parent_checkpoint_manifest_sha256') == parent_pin and
|
||||||
|
summary.get('parent_checkpoint_manifest_sha256') == parent_pin and
|
||||||
|
case_spec.get('parent_checkpoint_manifest_sha256') == parent_pin,
|
||||||
|
'Parent checkpoint pin disagrees across case/summary/provenance/continuation receipts')
|
||||||
|
R.require(Path(receipt['parent_checkpoint_dir']).is_absolute(), 'Parent checkpoint directory is not absolute')
|
||||||
|
parent = load_checkpoint(receipt['parent_checkpoint_dir'], parent_pin, _seen=seen)
|
||||||
|
offset = parent['global_next_tick']
|
||||||
|
R.require(receipt.get('global_tick_offset') == offset and receipt.get('global_next_tick') == offset + steps and
|
||||||
|
summary.get('global_tick_offset') == offset and summary.get('global_next_tick') == offset + steps and
|
||||||
|
provenance.get('global_tick_offset') == offset and provenance.get('global_next_tick') == offset + steps,
|
||||||
|
'Continuation global clock chain mismatch')
|
||||||
|
R.require(summary.get('effective_weights_raw_sha256') == parent['summary'].get('effective_weights_raw_sha256'),
|
||||||
|
'Retention effective weights changed between parent and child')
|
||||||
|
state = _npz(directory / 'state.npz', ('step', 'neuron_idx', 'counts', 'v', 'g', 'ref'))
|
||||||
|
terminal = _npz(directory / 'terminal-queues.npz', ('spike_ring', 'apl_state', 'apl_pending', 'next_tick'))
|
||||||
|
validate_state(state, terminal, steps, fresh=fresh)
|
||||||
|
initial_padding = max(18 - (offset + steps), 0)
|
||||||
|
R.require(np.all(terminal['apl_pending'][:initial_padding].view(np.uint32) == 0),
|
||||||
|
'Unconsumed original APL padding is not positive zero')
|
||||||
|
if not fresh:
|
||||||
|
if steps < 19:
|
||||||
|
restored = rotate_spike_ring(parent['terminal']['spike_ring'], int(parent['terminal']['next_tick']))
|
||||||
|
R.require(np.array_equal(terminal['spike_ring'][steps:], restored[steps:]), 'Unwritten carried spike slots changed')
|
||||||
|
if steps < 18:
|
||||||
|
carried = parent['terminal']['apl_pending'][steps:]
|
||||||
|
R.require(np.array_equal(terminal['apl_pending'][:18 - steps].view(np.uint32), carried.view(np.uint32)),
|
||||||
|
'Unconsumed carried APL slots changed')
|
||||||
|
overlay = R._read_json(directory / 'overlay-audit.json')
|
||||||
|
R.require(overlay.get('complete') is True and overlay.get('weights_updated_during_run') is False and
|
||||||
|
overlay.get('effective_weights_raw_sha256') == summary.get('effective_weights_raw_sha256') and
|
||||||
|
overlay.get('mask_sha256') == R.MASK_SHA and overlay.get('am_helper_sha256') == R.AM_OVERLAY_SHA,
|
||||||
|
'Parent effective overlay receipt mismatch')
|
||||||
|
overlay_manifest = R._read_json(directory / 'overlay-manifest.json')
|
||||||
|
R.require(R.digest(directory / 'overlay-input.npz') == overlay_manifest.get('overlay_sha256') and
|
||||||
|
R.digest(directory / 'overlay-manifest.json') in provenance['input_sha256'].values() and
|
||||||
|
overlay_manifest.get('mask_sha256') == R.MASK_SHA and
|
||||||
|
overlay_manifest.get('base_candidate_sha256') == overlay.get('base_candidate_sha256'),
|
||||||
|
'Parent copied overlay inputs do not match their original receipt')
|
||||||
|
timing = R._read_json(directory / 'apl-timing-audit.json')
|
||||||
|
with (directory / 'apl-pending-tail.float32.npy').open('rb') as stream:
|
||||||
|
pending = np.load(stream, allow_pickle=False)
|
||||||
|
R.require(pending.dtype == np.float32 and pending.shape == (18, 4064) and
|
||||||
|
pending.tobytes() == terminal['apl_pending'].tobytes(), 'Parent terminal/pending output mismatch')
|
||||||
|
R.require(timing.get('pending_raw_sha256') == R._raw(pending) and timing.get('apl_delay_steps') == 18 and
|
||||||
|
timing.get('brain_tail_advanced') is False and
|
||||||
|
timing.get('final_apl_state_u32_bits') == terminal['apl_state'].view(np.uint32).tolist(), 'Parent APL terminal audit mismatch')
|
||||||
|
return {'directory': directory, 'summary': summary, 'provenance': provenance, 'overlay': overlay,
|
||||||
|
'state': state, 'terminal': terminal, 'steps': steps, 'global_tick_offset': offset,
|
||||||
|
'global_next_tick': offset + steps, 'fresh': fresh,
|
||||||
|
'ancestry_directories': [directory] if fresh else [directory, *parent['ancestry_directories']]}
|
||||||
|
|
||||||
|
|
||||||
|
def seal_checkpoint(checkpoint_dir):
|
||||||
|
"""Exclusive file-hash seal, not a brain run or proof of pre-seal integrity.
|
||||||
|
|
||||||
|
The returned manifest SHA must be externally pinned into the next case spec.
|
||||||
|
No existing receipt is overwritten. Fresh state.npz is newly bound here.
|
||||||
|
"""
|
||||||
|
directory = Path(checkpoint_dir).resolve(strict=True)
|
||||||
|
R.require(not (directory / MANIFEST).exists(), 'Checkpoint is already sealed')
|
||||||
|
before = _tree_hashes(directory)
|
||||||
|
record = _validate_record(directory, {directory})
|
||||||
|
R.require(before == _tree_hashes(directory), 'Checkpoint changed while sealing')
|
||||||
|
value = {'schema': 'phase4an-checkpoint-v1', 'complete': True, 'files_sha256': before,
|
||||||
|
'segment_steps': record['steps'], 'global_tick_offset': record['global_tick_offset'],
|
||||||
|
'global_next_tick': record['global_next_tick'], 'counts_scope': 'segment_only',
|
||||||
|
'state_binding_origin': 'checkpoint seal; fresh runtime receipt did not hash state.npz',
|
||||||
|
'pre_seal_state_integrity_independently_proven': False}
|
||||||
|
R._save(directory / MANIFEST, value)
|
||||||
|
return {'path': str(directory / MANIFEST), 'sha256': R.digest(directory / MANIFEST), **value}
|
||||||
|
|
||||||
|
|
||||||
|
def load_checkpoint(checkpoint_dir, expected_sha, *, _seen=None):
|
||||||
|
directory = Path(checkpoint_dir).resolve(strict=True)
|
||||||
|
R.require(R._sha(expected_sha) and R.digest(directory / MANIFEST) == expected_sha, 'Parent checkpoint manifest differs from external pin')
|
||||||
|
seen = set() if _seen is None else set(_seen)
|
||||||
|
R.require(directory not in seen, 'Checkpoint ancestry cycle')
|
||||||
|
seen.add(directory)
|
||||||
|
manifest = R._read_json(directory / MANIFEST)
|
||||||
|
R.require(manifest.get('schema') == 'phase4an-checkpoint-v1' and manifest.get('complete') is True and
|
||||||
|
manifest.get('counts_scope') == 'segment_only' and manifest.get('files_sha256') == _tree_hashes(directory),
|
||||||
|
'Checkpoint file inventory/hash mismatch')
|
||||||
|
record = _validate_record(directory, seen)
|
||||||
|
R.require(manifest.get('segment_steps') == record['steps'] and manifest.get('global_tick_offset') == record['global_tick_offset'] and
|
||||||
|
manifest.get('global_next_tick') == record['global_next_tick'], 'Checkpoint clock metadata mismatch')
|
||||||
|
R.require(manifest['files_sha256'] == _tree_hashes(directory) and R.digest(directory / MANIFEST) == expected_sha,
|
||||||
|
'Checkpoint changed while loading')
|
||||||
|
record.update(manifest=manifest, manifest_sha256=expected_sha)
|
||||||
|
return record
|
||||||
|
|
||||||
|
|
||||||
|
def derive_continued(source_bytes, mode):
|
||||||
|
"""One explicit arrival-admission edit plus one pre-loop restore hook."""
|
||||||
|
tree, inherited = R.derive_ast(source_bytes, mode)
|
||||||
|
original = copy.deepcopy(tree)
|
||||||
|
function = tree.body[-1]
|
||||||
|
body = next(node for node in function.body if isinstance(node, ast.Try)).body
|
||||||
|
candidates = [i for i, node in enumerate(body) if isinstance(node, ast.Assign) and
|
||||||
|
len(node.targets) == 1 and isinstance(node.targets[0], ast.Name) and node.targets[0].id == 'apl_ring']
|
||||||
|
R.require(len(candidates) == 1, 'Expected one APL ring initialization')
|
||||||
|
body.insert(candidates[0] + 1, ast.parse(RESTORE).body[0])
|
||||||
|
clocks = [node for node in ast.walk(function) if isinstance(node, ast.If) and ast.unparse(node.test) == CLOCK_OLD]
|
||||||
|
R.require(len(clocks) == 1, 'Expected exact original local arrival-admission condition')
|
||||||
|
clocks[0].test = ast.parse(CLOCK_NEW, mode='eval').body
|
||||||
|
tree = ast.fix_missing_locations(tree)
|
||||||
|
# Independently reverse exactly the two edits, then require the ENTIRE AST.
|
||||||
|
rollback = copy.deepcopy(tree)
|
||||||
|
reverse_body = next(node for node in rollback.body[-1].body if isinstance(node, ast.Try)).body
|
||||||
|
restores = [i for i, node in enumerate(reverse_body) if ast.unparse(node) == RESTORE]
|
||||||
|
reverse_clocks = [node for node in ast.walk(rollback) if isinstance(node, ast.If) and ast.unparse(node.test) == CLOCK_NEW]
|
||||||
|
R.require(len(restores) == len(reverse_clocks) == 1, 'Ambiguous continuation edit rollback')
|
||||||
|
del reverse_body[restores[0]]
|
||||||
|
reverse_clocks[0].test = ast.parse(CLOCK_OLD, mode='eval').body
|
||||||
|
R.require(R._dump(rollback) == R._dump(original), 'Additional unlisted continuation AST edit')
|
||||||
|
audit = {'base': inherited, 'restore_hook': RESTORE, 'clock_admission_old': CLOCK_OLD,
|
||||||
|
'clock_admission_new': CLOCK_NEW, 'full_AST_rollback_identical': True,
|
||||||
|
'kernels_sorting_and_local_ring_math_unchanged': True,
|
||||||
|
'derived_module_ast_sha256': hashlib.sha256(R._dump(tree).encode()).hexdigest()}
|
||||||
|
return tree, audit
|
||||||
|
|
||||||
|
|
||||||
|
def audit_carried_sequence(generated, applied, pending, initial_pending):
|
||||||
|
"""Bitwise FIFO accounting with a carried queue, never a new brain step."""
|
||||||
|
for name, value in (('generated', generated), ('applied', applied), ('pending', pending), ('initial', initial_pending)):
|
||||||
|
R.require(isinstance(value, np.ndarray) and value.dtype == np.float32 and value.ndim == 2 and
|
||||||
|
np.isfinite(value).all() and np.all(value >= 0), 'Invalid continued APL trace: ' + name)
|
||||||
|
R.require(generated.shape == applied.shape and pending.shape == initial_pending.shape == (18, generated.shape[1]),
|
||||||
|
'Continued APL sequence shapes differ')
|
||||||
|
steps = len(generated)
|
||||||
|
for tick in range(steps + 18):
|
||||||
|
actual = applied[tick] if tick < steps else pending[tick - steps]
|
||||||
|
expected = initial_pending[tick] if tick < 18 else generated[tick - 18]
|
||||||
|
R.require(np.array_equal(actual.view(np.uint32), expected.view(np.uint32)),
|
||||||
|
'Carried FIFO bitwise accounting failed at local application tick ' + str(tick))
|
||||||
|
return {'pass_all': True, 'apl_delay_steps': 18, 'steps': steps, 'sample_bits_preserved': True,
|
||||||
|
'initial_queue_from_parent': True, 'initial_queue_raw_sha256': R._raw(initial_pending),
|
||||||
|
'full_sequence_bitwise_audit_performed': True, 'brain_tail_advanced': False}
|
||||||
|
|
||||||
|
|
||||||
|
class ContinuedRuntime(R._Runtime):
|
||||||
|
def __init__(self, *args, parent, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.parent = parent
|
||||||
|
self.global_offset = parent['global_next_tick']
|
||||||
|
self.restorations = 0
|
||||||
|
|
||||||
|
def install(self, *args, **kwargs):
|
||||||
|
super().install(*args, **kwargs)
|
||||||
|
R.require(self.effective_sha == self.parent['summary']['effective_weights_raw_sha256'], 'Retention changed effective weights')
|
||||||
|
|
||||||
|
def restore(self, v, g, ref, counts, ring, apl_ring, apl, upload):
|
||||||
|
R.require(self.installations == 1 and self.restorations == 0, 'Restore must occur once after fixed-weight installation')
|
||||||
|
R.require(not bool(counts.any().item()), 'Segment counts must start at zero')
|
||||||
|
state, terminal = self.parent['state'], self.parent['terminal']
|
||||||
|
for target, value, dtype in ((v, state['v'], self.torch.float64), (g, state['g'], self.torch.float64),
|
||||||
|
(ref, state['ref'], self.torch.int32),
|
||||||
|
(ring, rotate_spike_ring(terminal['spike_ring'], int(terminal['next_tick'])), self.torch.uint8),
|
||||||
|
(apl_ring, terminal['apl_pending'], self.torch.float32),
|
||||||
|
(apl.state, terminal['apl_state'], self.torch.float32)):
|
||||||
|
target.copy_(upload(value, dtype))
|
||||||
|
self.restorations += 1
|
||||||
|
|
||||||
|
def finish(self, *args, **kwargs):
|
||||||
|
R.require(self.restorations == 1, 'Continuation was not restored')
|
||||||
|
return super().finish(*args, **kwargs)
|
||||||
|
|
||||||
|
def audit_sequence(self, generated, applied, pending, delay):
|
||||||
|
R.require(delay == 18, 'Continuation changed D18')
|
||||||
|
return audit_carried_sequence(generated, applied, pending, self.parent['terminal']['apl_pending'])
|
||||||
|
|
||||||
|
def _timing_metadata(self, value):
|
||||||
|
result = dict(value)
|
||||||
|
next_tick, steps = self.global_offset + self.spec['steps'], self.spec['steps']
|
||||||
|
result.pop('initial_padding_positive_zero', None)
|
||||||
|
result.update(initial_queue_from_parent=True, initial_queue_raw_sha256=R._raw(self.parent['terminal']['apl_pending']),
|
||||||
|
global_tick_offset=self.global_offset, global_next_tick=next_tick, tick_coordinate='global',
|
||||||
|
segment_steps=steps, segment_generated_rows_applied=max(steps - 18, 0),
|
||||||
|
applied_parent_pending_rows=min(steps, 18),
|
||||||
|
applied_initial_zero_rows=min(steps, max(18 - self.global_offset, 0)),
|
||||||
|
applied_parent_generated_rows=min(steps, 18) - min(steps, max(18 - self.global_offset, 0)),
|
||||||
|
pending_segment_generated_rows=min(steps, 18),
|
||||||
|
pending_parent_generated_rows=max(18 - steps, 0) - max(18 - next_tick, 0),
|
||||||
|
pending_generated_count=min(next_tick, 18), pending_initial_zero_prefix=max(18 - next_tick, 0),
|
||||||
|
pending_application_tick_start=next_tick, pending_application_tick_stop_exclusive=next_tick + 18,
|
||||||
|
pending_generated_tick_start=max(0, next_tick - 18), pending_generated_tick_stop_exclusive=next_tick,
|
||||||
|
brain_tail_advanced_scope='no extra brain ticks beyond this explicit segment')
|
||||||
|
if self.mode == 'light':
|
||||||
|
result.update(generated_trace=None, applied_trace=None, full_sequence_bitwise_audit_performed=False,
|
||||||
|
scope='Original D18 ring math retained with restored queue; histories not recorded')
|
||||||
|
return result
|
||||||
|
|
||||||
|
def timing(self, steps, pending):
|
||||||
|
return self._timing_metadata(super().timing(steps, pending))
|
||||||
|
|
||||||
|
def summary(self, value):
|
||||||
|
result = super().summary(value)
|
||||||
|
result.update(checkpoint_continuation_used=True, global_tick_offset=self.global_offset,
|
||||||
|
global_next_tick=self.global_offset + self.spec['steps'], event_tick_scope='segment_local',
|
||||||
|
counts_scope='segment_only_not_lifetime', parent_checkpoint_manifest_sha256=self.parent['manifest_sha256'])
|
||||||
|
result.update(pending_generated_count=min(result['global_next_tick'], 18),
|
||||||
|
pending_initial_zero_prefix=max(18 - result['global_next_tick'], 0))
|
||||||
|
if 'apl_timing' in result:
|
||||||
|
result['apl_timing'] = self._timing_metadata(result['apl_timing'])
|
||||||
|
return result
|
||||||
|
|
||||||
|
def write_json(self, path, value):
|
||||||
|
if Path(path).name == 'apl-timing-audit.json':
|
||||||
|
value = self._timing_metadata(value)
|
||||||
|
return super().write_json(path, value)
|
||||||
|
|
||||||
|
|
||||||
|
def compile_continued(aj, runtime, mode):
|
||||||
|
tree, audit = derive_continued(Path(aj.__file__).read_bytes(), mode)
|
||||||
|
namespace = dict(aj.__dict__)
|
||||||
|
namespace.update(__name__=__name__ + '.derived_' + mode, __file__=str(Path(__file__).resolve()),
|
||||||
|
_runtime=runtime, _continuation=runtime, write_json=runtime.write_json,
|
||||||
|
audit_sequence=runtime.audit_sequence)
|
||||||
|
audit['diagnostic_namespace_binding'] = 'audit_sequence checks parent_pending + generated, not an assumed zero-initial queue'
|
||||||
|
exec(compile(tree, str(Path(__file__).resolve()) + '::continued-AJ-AST-' + mode, 'exec'), namespace)
|
||||||
|
return namespace['run_gpu'], audit
|
||||||
|
|
||||||
|
|
||||||
|
def _parent_spec(parent):
|
||||||
|
expected = parent['summary']['input_sha256']['spec.json']
|
||||||
|
paths = [Path(path) for path, sha in parent['provenance']['input_sha256'].items()
|
||||||
|
if Path(path).name == 'spec.json' and sha == expected]
|
||||||
|
R.require(len(paths) == 1, 'Ambiguous original parent case spec')
|
||||||
|
return R._read_json(paths[0])
|
||||||
|
|
||||||
|
|
||||||
|
def run_continued(case_dir, out_dir, build_root, overlay_file, overlay_manifest, checkpoint_dir, *, mode='light'):
|
||||||
|
R.require(sys.dont_write_bytecode, 'Use python -B; frozen sources must not receive bytecode writes')
|
||||||
|
R.require(mode in ('light', 'reference'), 'Invalid diagnostic mode')
|
||||||
|
case_dir, out_dir, build_root = R.execution_paths(case_dir, out_dir, build_root, (checkpoint_dir,))
|
||||||
|
spec = R._read_json(case_dir / 'spec.json')
|
||||||
|
parent_sha = spec.get('parent_checkpoint_manifest_sha256')
|
||||||
|
fresh_admission = dict(spec)
|
||||||
|
fresh_admission.pop('parent_checkpoint_manifest_sha256', None)
|
||||||
|
R.validate_spec(fresh_admission, case_dir)
|
||||||
|
parent = load_checkpoint(checkpoint_dir, parent_sha)
|
||||||
|
# A continuation may never create output or a build cache inside ANY
|
||||||
|
# immutable ancestor, not only its immediate checkpoint parent. This check
|
||||||
|
# precedes overlay imports, Torch imports, compilation and output creation.
|
||||||
|
case_dir, out_dir, build_root = R.execution_paths(case_dir, out_dir, build_root, parent['ancestry_directories'])
|
||||||
|
if 'global_tick_offset' in spec:
|
||||||
|
R.require(type(spec['global_tick_offset']) is int and spec['global_tick_offset'] == parent['global_next_tick'],
|
||||||
|
'Declared global offset disagrees with checkpoint chain')
|
||||||
|
R.require(parent['global_next_tick'] + spec['steps'] <= np.iinfo(np.int64).max, 'Absolute tick overflow')
|
||||||
|
helper, plan, meta, inputs = R.load_overlay(overlay_file, overlay_manifest)
|
||||||
|
R.require(R.digest(overlay_file) == R.digest(parent['directory'] / 'overlay-input.npz') and
|
||||||
|
R.digest(overlay_manifest) == R.digest(parent['directory'] / 'overlay-manifest.json'), 'Retention overlay snapshot/manifest changed')
|
||||||
|
previous = _parent_spec(parent)
|
||||||
|
for key in ('dt_ms', 'model', 'apl', 'apl_delay_steps'):
|
||||||
|
R.require(spec[key] == previous[key], 'Continuation changes frozen dynamics: ' + key)
|
||||||
|
for key in ('graph_dir', 'apl_bundle_dir'):
|
||||||
|
R.require(Path(spec[key]).resolve(strict=True) == Path(previous[key]).resolve(strict=True), 'Continuation changes input directory: ' + key)
|
||||||
|
R.require(R.digest(spec['coefficients_path']) == parent['summary']['input_sha256']['coefficients.json'], 'Continuation coefficients changed')
|
||||||
|
R.require(R.digest(Path(spec['graph_dir']) / 'weights.npy') == parent['summary']['input_sha256']['base_weights.npy'], 'Continuation base weights changed')
|
||||||
|
aj_dir = Path(meta['aj_model_dir']).resolve(strict=True)
|
||||||
|
protected = (aj_dir.parent, Path(meta['am_overlay_path']).resolve().parent, spec['graph_dir'], spec['apl_bundle_dir'],
|
||||||
|
*parent['ancestry_directories'],
|
||||||
|
*(Path(path).resolve(strict=True).parent for path in
|
||||||
|
(overlay_file, overlay_manifest, meta['mask_path'], meta['base_candidate_path'], spec['coefficients_path'])))
|
||||||
|
case_dir, out_dir, build_root = R.execution_paths(case_dir, out_dir, build_root, protected)
|
||||||
|
for path in (case_dir / 'spec.json', case_dir / 'requests.npz', Path(spec['graph_dir']) / 'weights.npy',
|
||||||
|
Path(spec['coefficients_path']), Path(checkpoint_dir).resolve() / MANIFEST, Path(R.__file__).resolve()):
|
||||||
|
inputs[str(path)] = R.digest(path)
|
||||||
|
source_sha = R.digest(__file__)
|
||||||
|
R._load('timing_queue', aj_dir / 'timing_queue.py', R.PINS['apl-timing-lab-v1/timing_queue.py'])
|
||||||
|
aj = R._load('phase4an_continued_sealed_aj_gpu', aj_dir / 'gpu_timing.py', R.AJ_SHA)
|
||||||
|
runtime = ContinuedRuntime(mode, spec, helper, plan, meta, inputs, aj.torch, overlay_file, overlay_manifest, parent=parent)
|
||||||
|
function, ast_audit = compile_continued(aj, runtime, mode)
|
||||||
|
try:
|
||||||
|
inherited = function(case_dir, out_dir, build_root)
|
||||||
|
R.require(runtime.finished and runtime.restorations == 1 and runtime.installations == 1 and inherited['complete'], 'Incomplete continuation')
|
||||||
|
R.require(inherited['effective_weights_raw_sha256'] == runtime.effective_sha, 'Effective weight identity changed')
|
||||||
|
R.require(source_sha == R.digest(__file__) and all(R.digest(path) == sha for path, sha in inputs.items()), 'Source/input changed during continuation')
|
||||||
|
load_checkpoint(checkpoint_dir, parent_sha)
|
||||||
|
summary = R._read_json(out_dir / 'summary.json')
|
||||||
|
R.require(summary == runtime.summary(inherited), 'Stored continuation summary mismatch')
|
||||||
|
provenance = {'schema': 'phase4an-continuation-runtime-v1', 'complete': True, 'mode': mode,
|
||||||
|
'source_file': str(Path(__file__).resolve()), 'source_sha256': source_sha, 'fresh_runtime_sha256': LIGHT_SHA,
|
||||||
|
'ast': ast_audit, 'input_sha256': inputs, 'old_globals_patched': False, 'weights_updated_during_run': False,
|
||||||
|
'learning_pass_claimed': False, 'global_tick_offset': runtime.global_offset,
|
||||||
|
'global_next_tick': runtime.global_offset + spec['steps'],
|
||||||
|
'parent_checkpoint_manifest_sha256': parent_sha}
|
||||||
|
for key, name in (('summary_sha256', 'summary.json'), ('finite_audit_sha256', 'finite-audit.json'),
|
||||||
|
('terminal_queues_sha256', 'terminal-queues.npz'), ('overlay_audit_sha256', 'overlay-audit.json'),
|
||||||
|
('state_sha256', 'state.npz')):
|
||||||
|
provenance[key] = R.digest(out_dir / name)
|
||||||
|
R._save(out_dir / 'runtime-provenance.json', provenance)
|
||||||
|
receipt = {'schema': 'phase4an-continuation-receipt-v1', 'complete': True,
|
||||||
|
'parent_checkpoint_dir': str(parent['directory']), 'parent_checkpoint_manifest_sha256': parent_sha,
|
||||||
|
'global_tick_offset': runtime.global_offset, 'global_next_tick': runtime.global_offset + spec['steps'],
|
||||||
|
'segment_steps': spec['steps'], 'counts_scope': 'segment_only_not_lifetime',
|
||||||
|
'payload_sha256': _tree_hashes(out_dir), 'weights_updated_during_run': False,
|
||||||
|
'clock_admission_edit': CLOCK_NEW, 'checkpoint_continuation_verified_by_GPU_comparison': False}
|
||||||
|
R._save(out_dir / RECEIPT, receipt)
|
||||||
|
sealed = seal_checkpoint(out_dir)
|
||||||
|
return dict(summary, checkpoint_manifest_sha256=sealed['sha256'])
|
||||||
|
except Exception as error:
|
||||||
|
if out_dir.is_dir() and not (out_dir / 'continuation-error.json').exists():
|
||||||
|
R._save(out_dir / 'continuation-error.json', {'complete': False, 'type': type(error).__name__,
|
||||||
|
'message': str(error), 'learning_update_forbidden': True})
|
||||||
|
raise
|
||||||
@@ -0,0 +1,559 @@
|
|||||||
|
"""Engineering-only, fixed-weight trial execution derived from frozen AJ AST.
|
||||||
|
|
||||||
|
Public APIs run_light(case_dir,out_dir,build_root,overlay_file,overlay_manifest)
|
||||||
|
and run_reference(...) have identical arguments. Neither trains nor carries a
|
||||||
|
previous trial's neural state. The reference retains AJ's eager diagnostics;
|
||||||
|
the light function removes only an explicit diagnostic whitelist. Both accept
|
||||||
|
an explicit spec.max_steps instead of AJ's 1000-step admission bound.
|
||||||
|
|
||||||
|
The parent protocol owns conditioning, cue/tail schedules, frozen input/mask
|
||||||
|
authority and success criteria. A completed trial is not a learning PASS.
|
||||||
|
Before any scientific execution, the coordinator must verify externally fixed
|
||||||
|
hashes for the entire graph, APL bundle, coefficients/model, and preregistered
|
||||||
|
case spec (including max_steps). Inherited AJ consistency checks and this
|
||||||
|
adapter's input hashes are not a replacement for those external authorities.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import importlib.util
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
AJ_SHA = 'af1975ba5e5e700208c0a598d3cbe648a3cf10885c6231239b6e4b28f76d173b'
|
||||||
|
AM_OVERLAY_SHA = '7f891d0ba79b393c96e75fd2dee2eddc51e57d8213eaac2779703bc2c18712b4'
|
||||||
|
MASK_SHA = '8b0fb6eb2e6c31da4d17dc20d890aa3f367e514f05642de5bad6b42a1611c05b'
|
||||||
|
V2_SHA = 'abb4574da85f00bd9ef61024c65993ef81d42651ff8d8d63c15dd69c6222471e'
|
||||||
|
PINS = {
|
||||||
|
'apl-timing-lab-v1/gpu_timing.py': AJ_SHA,
|
||||||
|
'apl-timing-lab-v1/timing_queue.py': '54df6d4818e2a0c26e96fb0aaf5d9b71cd964981706da937562d48af79aca14e',
|
||||||
|
'author-apl-lab-v2/gpu_apl.py': '69f5d893f47dafff4ef7c3186c3df0b9014666b32c8f4e943b57016bec92b18a',
|
||||||
|
'author-apl-lab-v2/legacy_apl_worker.py': '21ceec65fe42581dc55872010e0025d660e80358905f1cf4df1dadf341a3b291',
|
||||||
|
'author-runtime-lab-v1/gpu_backend.py': '03758d07572f4b44d272059d9308fac534268ad201b57bdd77d69fee95e67278',
|
||||||
|
'author-runtime-lab-v1/author_ext.cpp': '208a937d17bbb041b9bf6b25b89264ee566830b60609e58491b44583d8541f15',
|
||||||
|
'author-runtime-lab-v1/author_ext.cu': '669f166e18ce9a3f63fc723db8b0a8b74f7fa4757194b1bd65b4cf6008a7787e',
|
||||||
|
'author-fullgraph-lab-v1/oracle_full.py': 'd72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961',
|
||||||
|
}
|
||||||
|
_LOADED = {}
|
||||||
|
_INSTALL = '_runtime.install(weights, graph, apl_out_mask, upload, out_dir, source_provenance, device)'
|
||||||
|
_FINISH = '_runtime.finish(ring, apl_ring, apl, steps, out_dir)'
|
||||||
|
_MATH_TARGETS = frozenset(('indptr', 'dst', 'global_nodes_gpu', 'base_weights', 'weights',
|
||||||
|
'local_apl', 'apl_out_mask', 'common_kc', 'local_kc', 'full_kc', 'kc_local_gpu', 'kc_full_gpu',
|
||||||
|
'v', 'g', 'ref', 'counts', 'requests', 'ring', 'apl_delay', 'apl_ring', 'requested_local_gpu',
|
||||||
|
'spikes', 'due', 'sources', 'degrees', 'offsets', 'edge_count', 'expanded', 'destination',
|
||||||
|
'order', 'ordered_edges', 'ordered_targets', 'boundary', 'starts', 'targets', 'full_spikes',
|
||||||
|
'drive', 'apl_state', 'h', 'slot', 'applied_h', 'delta_si'))
|
||||||
|
|
||||||
|
|
||||||
|
def require(ok, message):
|
||||||
|
if not ok:
|
||||||
|
raise ValueError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def digest(path):
|
||||||
|
h = hashlib.sha256()
|
||||||
|
with Path(path).open('rb') as stream:
|
||||||
|
for block in iter(lambda: stream.read(8 << 20), b''):
|
||||||
|
h.update(block)
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _read_json(path):
|
||||||
|
def pairs(items):
|
||||||
|
out = {}
|
||||||
|
for key, value in items:
|
||||||
|
require(key not in out, 'Duplicate JSON key: ' + key)
|
||||||
|
out[key] = value
|
||||||
|
return out
|
||||||
|
return json.loads(Path(path).read_text(encoding='utf-8'), object_pairs_hook=pairs,
|
||||||
|
parse_constant=lambda value: (_ for _ in ()).throw(ValueError('Nonfinite JSON: ' + value)))
|
||||||
|
|
||||||
|
|
||||||
|
def _save(path, value):
|
||||||
|
with Path(path).open('x', encoding='utf-8') as stream:
|
||||||
|
json.dump(value, stream, sort_keys=True, indent=2, allow_nan=False)
|
||||||
|
stream.write('\n')
|
||||||
|
|
||||||
|
|
||||||
|
def _raw(value):
|
||||||
|
return hashlib.sha256(np.ascontiguousarray(value, dtype=value.dtype.newbyteorder('<')).tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(value):
|
||||||
|
return isinstance(value, str) and re.fullmatch('[0-9a-f]{64}', value) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def _load(name, path, expected):
|
||||||
|
path = Path(path).absolute()
|
||||||
|
raw = path.read_bytes()
|
||||||
|
require(hashlib.sha256(raw).hexdigest() == expected, 'Unpinned source: ' + str(path))
|
||||||
|
if name in sys.modules:
|
||||||
|
module = sys.modules[name]
|
||||||
|
require(_LOADED.get(name) == (path, expected, module), 'Existing unverified module binding: ' + name)
|
||||||
|
return module
|
||||||
|
spec = importlib.util.spec_from_file_location(name, path)
|
||||||
|
require(spec is not None and spec.loader is not None, 'Missing module loader')
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[name] = module
|
||||||
|
try:
|
||||||
|
exec(compile(raw, str(path), 'exec'), module.__dict__)
|
||||||
|
except BaseException:
|
||||||
|
sys.modules.pop(name, None)
|
||||||
|
raise
|
||||||
|
_LOADED[name] = (path, expected, module)
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
def validate_spec(spec, case_dir):
|
||||||
|
"""Admission policy only. No implicit early stopping or checkpoint support."""
|
||||||
|
require(type(spec.get('max_steps')) is int and 0 < spec['max_steps'] <= np.iinfo(np.int32).max,
|
||||||
|
'An explicit positive int32-range max_steps is mandatory')
|
||||||
|
require(type(spec.get('steps')) is int and 0 < spec['steps'] <= spec['max_steps'], 'steps exceeds its declared bound')
|
||||||
|
require(spec.get('dt_ms') == .1 and spec.get('duration_ms') == spec['steps'] * .1 and
|
||||||
|
type(spec.get('apl_delay_steps')) is int and spec['apl_delay_steps'] == 18,
|
||||||
|
'Frozen clock/duration/D18 contract changed')
|
||||||
|
require(spec.get('record_history') is False, 'Only wholebrain fresh-state trials are supported')
|
||||||
|
require(not (Path(case_dir) / 'arrays.npz').exists(), 'Initial arrays/checkpoint continuation are not supported in this version')
|
||||||
|
require(not any('checkpoint' in str(key).lower() or str(key) in ('initial_state', 'resume', 'continuation') for key in spec),
|
||||||
|
'Checkpoint/continuation configuration is unsupported')
|
||||||
|
require(spec.get('within_trial_weight_updates', False) is False, 'No within-trial plasticity is supported')
|
||||||
|
return spec
|
||||||
|
|
||||||
|
|
||||||
|
def load_overlay(overlay_file, manifest_file):
|
||||||
|
"""New manifest policy, frozen AM array validators; no old-global mutation.
|
||||||
|
|
||||||
|
phase4an-overlay-v1 requires overlay_name zero/static25/learned,
|
||||||
|
overlay_sha256, original mask_path/mask_sha256, external positive f32-mV
|
||||||
|
base_candidate_path/base_candidate_sha256, aj_model_dir,
|
||||||
|
am_overlay_path/am_overlay_sha256. Learned snapshots additionally require
|
||||||
|
parent_snapshot_sha256 and eligibility_v2_source_sha256=the frozen 4J pin.
|
||||||
|
These hashes bind provenance; the coordinator must verify the parent chain.
|
||||||
|
NPZ contains ONLY edge_id:int64[14232], plastic_delta_mv:float32[14232].
|
||||||
|
"""
|
||||||
|
overlay_file, manifest_file = Path(overlay_file).absolute(), Path(manifest_file).absolute()
|
||||||
|
manifest_sha = digest(manifest_file)
|
||||||
|
meta = _read_json(manifest_file)
|
||||||
|
keys = {'schema', 'overlay_name', 'overlay_sha256', 'mask_path', 'mask_sha256',
|
||||||
|
'base_candidate_path', 'base_candidate_sha256', 'aj_model_dir', 'am_overlay_path', 'am_overlay_sha256'}
|
||||||
|
require(isinstance(meta, dict) and keys <= meta.keys() and meta['schema'] == 'phase4an-overlay-v1', 'Invalid overlay manifest schema')
|
||||||
|
require(meta['overlay_name'] in ('zero', 'static25', 'learned'), 'Unknown overlay snapshot type')
|
||||||
|
learned_keys = {'parent_snapshot_sha256', 'eligibility_v2_source_sha256'}
|
||||||
|
allowed = keys | (learned_keys if meta['overlay_name'] == 'learned' else set())
|
||||||
|
require(not (meta.keys() - allowed), 'Unknown or inapplicable overlay manifest fields')
|
||||||
|
require(meta['mask_sha256'] == MASK_SHA and meta['am_overlay_sha256'] == AM_OVERLAY_SHA,
|
||||||
|
'Original mask or frozen AM helper authority changed')
|
||||||
|
require(_sha(meta['overlay_sha256']) and digest(overlay_file) == meta['overlay_sha256'], 'Overlay SHA mismatch')
|
||||||
|
inputs = {str(overlay_file): meta['overlay_sha256'], str(manifest_file): manifest_sha}
|
||||||
|
for label in ('mask', 'base_candidate', 'am_overlay'):
|
||||||
|
path = Path(meta[label + '_path'])
|
||||||
|
require(path.is_absolute() and _sha(meta[label + '_sha256']) and digest(path) == meta[label + '_sha256'],
|
||||||
|
'Missing/mismatched anchored input: ' + label)
|
||||||
|
inputs[str(path)] = meta[label + '_sha256']
|
||||||
|
helper = _load('phase4an_sealed_am_overlay', meta['am_overlay_path'], AM_OVERLAY_SHA)
|
||||||
|
mask = np.load(meta['mask_path'], allow_pickle=False)
|
||||||
|
base = np.load(meta['base_candidate_path'], allow_pickle=False)
|
||||||
|
require(mask.dtype == np.int64 and mask.shape == (helper.CANDIDATE_COUNT,), 'Original complete 14,232 mask is required')
|
||||||
|
with np.load(overlay_file, allow_pickle=False) as archive:
|
||||||
|
require(len(archive.files) == 2 and set(archive.files) == {'edge_id', 'plastic_delta_mv'}, 'No embedded base or additional overlay arrays allowed')
|
||||||
|
plan = helper.validate_arrays(archive['edge_id'], archive['plastic_delta_mv'], mask, base)
|
||||||
|
delta = plan['plastic_delta_mv']
|
||||||
|
if meta['overlay_name'] == 'zero':
|
||||||
|
require(not np.any(delta != 0), 'Zero snapshot contains a nonzero delta')
|
||||||
|
elif meta['overlay_name'] == 'static25':
|
||||||
|
require(helper.bit_equal(delta, np.multiply(np.float32(-.25), base)), 'static25 must equal the original f32 floor')
|
||||||
|
else:
|
||||||
|
require(_sha(meta.get('parent_snapshot_sha256')) and meta.get('eligibility_v2_source_sha256') == V2_SHA,
|
||||||
|
'Learned snapshot needs parent hash and explicit frozen eligibility-v2 authority')
|
||||||
|
aj_dir = Path(meta['aj_model_dir'])
|
||||||
|
require(aj_dir.is_absolute() and aj_dir.name == 'apl-timing-lab-v1', 'AJ must use its real original directory')
|
||||||
|
for relative, expected in PINS.items():
|
||||||
|
path = aj_dir.parent / relative
|
||||||
|
require(digest(path) == expected, 'Sealed dependency changed: ' + relative)
|
||||||
|
inputs[str(path)] = expected
|
||||||
|
require(all(digest(path) == expected for path, expected in inputs.items()), 'Input changed while loading')
|
||||||
|
return helper, plan, meta, inputs
|
||||||
|
|
||||||
|
|
||||||
|
def _dump(node):
|
||||||
|
return ast.dump(node, annotate_fields=True, include_attributes=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _target_roots(node):
|
||||||
|
if isinstance(node, ast.Name):
|
||||||
|
return {node.id}
|
||||||
|
if isinstance(node, (ast.Tuple, ast.List)):
|
||||||
|
return set().union(*(_target_roots(value) for value in node.elts))
|
||||||
|
if isinstance(node, (ast.Subscript, ast.Attribute)):
|
||||||
|
return _target_roots(node.value)
|
||||||
|
return set()
|
||||||
|
|
||||||
|
|
||||||
|
def math_projection(function):
|
||||||
|
"""Ordered/control-structured frozen math statements, excluding diagnostics.
|
||||||
|
|
||||||
|
Whitelist explicitly covers state/weight initialization, request mutation,
|
||||||
|
expansion/stable grouping, original CUDA calls, LegacyAPL and ring/g write.
|
||||||
|
Tests also require the entire reference loop AST to equal the original.
|
||||||
|
"""
|
||||||
|
def block(statements):
|
||||||
|
result = []
|
||||||
|
for node in statements:
|
||||||
|
if isinstance(node, ast.FunctionDef) and node.name == 'upload':
|
||||||
|
result.append(copy.deepcopy(node))
|
||||||
|
elif isinstance(node, ast.Assign) and set().union(*(_target_roots(t) for t in node.targets)) & _MATH_TARGETS:
|
||||||
|
result.append(copy.deepcopy(node))
|
||||||
|
elif isinstance(node, ast.Expr) and isinstance(node.value, ast.Call):
|
||||||
|
text = ast.unparse(node.value.func)
|
||||||
|
if text.startswith('ext.') or text in ('requests.zero_', 'apl.spikes.zero_', 'apl_ring[slot].copy_'):
|
||||||
|
result.append(copy.deepcopy(node))
|
||||||
|
elif isinstance(node, (ast.With, ast.Try)):
|
||||||
|
result.extend(block(node.body))
|
||||||
|
elif isinstance(node, (ast.If, ast.For)):
|
||||||
|
body, other = block(node.body), block(node.orelse)
|
||||||
|
if body or other:
|
||||||
|
keep = copy.deepcopy(node)
|
||||||
|
keep.body, keep.orelse = body, other
|
||||||
|
result.append(keep)
|
||||||
|
return result
|
||||||
|
return _dump(ast.Module(body=block(function.body), type_ignores=[]))
|
||||||
|
|
||||||
|
|
||||||
|
def derive_ast(source_bytes, mode):
|
||||||
|
"""Derive only from exact AJ bytes; return ASTs plus an explicit edit receipt."""
|
||||||
|
require(mode in ('light', 'reference'), 'Unknown diagnostic mode')
|
||||||
|
require(hashlib.sha256(source_bytes).hexdigest() == AJ_SHA, 'AJ source pin mismatch')
|
||||||
|
source = ast.parse(source_bytes)
|
||||||
|
original = next(node for node in source.body if isinstance(node, ast.FunctionDef) and node.name == 'run_gpu')
|
||||||
|
loader = copy.deepcopy(next(node for node in source.body if isinstance(node, ast.FunctionDef) and node.name == 'load_inputs'))
|
||||||
|
bounds = [node for node in ast.walk(loader) if isinstance(node, ast.Compare) and
|
||||||
|
ast.unparse(node) == '0 < steps <= 1000']
|
||||||
|
require(len(bounds) == 1, 'Expected one explicit step-admission bound')
|
||||||
|
bounds[0].comparators[-1] = ast.parse("spec['max_steps']", mode='eval').body
|
||||||
|
function = copy.deepcopy(original)
|
||||||
|
body = next(node for node in function.body if isinstance(node, ast.Try)).body
|
||||||
|
anchor = next(i for i, node in enumerate(body) if ast.unparse(node) == 'effective_hash = hashlib.sha256()')
|
||||||
|
require(ast.unparse(body[anchor - 1]) == 'if bool(np.any(apl_out_mask)):\n weights[upload(apl_out_mask, torch.bool)] = 0.0',
|
||||||
|
'Installation no longer follows APL fast-edge zeroing')
|
||||||
|
body.insert(anchor, ast.parse(_INSTALL).body[0])
|
||||||
|
sync = [i for i, node in enumerate(body) if ast.unparse(node) == 'torch.cuda.synchronize(device)']
|
||||||
|
require(len(sync) == 1, 'Expected one post-loop synchronization')
|
||||||
|
body.insert(sync[0] + 1, ast.parse(_FINISH).body[0])
|
||||||
|
removed, replacements = [], []
|
||||||
|
|
||||||
|
class ReportingOnly(ast.NodeTransformer):
|
||||||
|
def note(self, node):
|
||||||
|
removed.append(_dump(node))
|
||||||
|
return None
|
||||||
|
|
||||||
|
def visit_Assign(self, node):
|
||||||
|
names = set().union(*(_target_roots(t) for t in node.targets))
|
||||||
|
if names & {'expanded_global', 'accepted_cpu', 'queue', 'apl_cpu', 'actual', 'finite', 'row'}:
|
||||||
|
return self.note(node)
|
||||||
|
if names == {'maps'} and isinstance(node.targets[0], ast.Subscript):
|
||||||
|
return self.note(node)
|
||||||
|
if names == {'timing'}:
|
||||||
|
require(ast.unparse(node.value.func) == 'audit_sequence', 'Unexpected timing assignment')
|
||||||
|
replacements.append(_dump(node))
|
||||||
|
return ast.parse('timing = _runtime.timing(steps, pending)').body[0]
|
||||||
|
if names == {'destination'}:
|
||||||
|
return [node, ast.parse('_runtime.arrivals(expanded, destination, ref)').body[0]]
|
||||||
|
if ast.unparse(node) == 'g[kc_local_gpu] = g[kc_local_gpu] - delta_si':
|
||||||
|
return [node, ast.parse('_runtime.after_tick(tick, v, g, ref, drive, apl_state, h, applied_h)').body[0]]
|
||||||
|
return node
|
||||||
|
|
||||||
|
def visit_AugAssign(self, node):
|
||||||
|
if _target_roots(node.target) & {'due_total', 'accepted_due_total'}:
|
||||||
|
return self.note(node)
|
||||||
|
return node
|
||||||
|
|
||||||
|
def visit_For(self, node):
|
||||||
|
text = ast.unparse(node.iter)
|
||||||
|
if text in ("(('drive', 2), ('state', 2), ('inhibition', 4064))", 'apl_cpu.items()', 'actual.items()'):
|
||||||
|
return self.note(node)
|
||||||
|
return self.generic_visit(node)
|
||||||
|
|
||||||
|
def visit_If(self, node):
|
||||||
|
if ast.unparse(node.test) in ("spec['record_history']", 'not finite'):
|
||||||
|
return self.note(node)
|
||||||
|
return self.generic_visit(node)
|
||||||
|
|
||||||
|
def visit_Expr(self, node):
|
||||||
|
if isinstance(node.value, ast.Call) and ast.unparse(node.value.func) in ('queue_output.write', 'hash_output.write'):
|
||||||
|
return self.note(node)
|
||||||
|
return node
|
||||||
|
|
||||||
|
def visit_With(self, node):
|
||||||
|
targets = [getattr(item.optional_vars, 'id', None) for item in node.items]
|
||||||
|
if targets == ['queue_output', 'hash_output', 'request_output']:
|
||||||
|
replacements.append(_dump(node.items[0])); replacements.append(_dump(node.items[1]))
|
||||||
|
node.items = [node.items[-1]]
|
||||||
|
return self.generic_visit(node)
|
||||||
|
|
||||||
|
if mode == 'light':
|
||||||
|
function = ReportingOnly().visit(function)
|
||||||
|
require(len(removed) == 20 and len(replacements) == 3, 'Reporting whitelist changed; stop instead of broad rewriting')
|
||||||
|
loops = lambda f: [node for node in ast.walk(f) if isinstance(node, ast.For) and
|
||||||
|
isinstance(node.target, ast.Name) and node.target.id == 'tick']
|
||||||
|
require(len(loops(original)) == len(loops(function)) == 1, 'Missing/duplicated trial loop')
|
||||||
|
if mode == 'reference':
|
||||||
|
require(_dump(loops(original)[0]) == _dump(loops(function)[0]), 'Reference loop must stay entirely unchanged')
|
||||||
|
original_math, derived_math = math_projection(original), math_projection(function)
|
||||||
|
require(original_math == derived_math, 'Ordered mathematical AST changed')
|
||||||
|
extra_calls = [ast.unparse(node) for node in ast.walk(function) if isinstance(node, ast.Call) and
|
||||||
|
ast.unparse(node.func).startswith('_runtime.')]
|
||||||
|
expected_calls = [_INSTALL, _FINISH]
|
||||||
|
if mode == 'light':
|
||||||
|
expected_calls += ['_runtime.arrivals(expanded, destination, ref)',
|
||||||
|
'_runtime.after_tick(tick, v, g, ref, drive, apl_state, h, applied_h)',
|
||||||
|
'_runtime.timing(steps, pending)']
|
||||||
|
require(sorted(extra_calls) == sorted(expected_calls), 'Unlisted runtime callback added')
|
||||||
|
tree = ast.fix_missing_locations(ast.Module(body=[loader, function], type_ignores=[]))
|
||||||
|
sha = lambda value: hashlib.sha256(value.encode('utf-8')).hexdigest()
|
||||||
|
receipt = {'mode': mode, 'aj_source_sha256': AJ_SHA, 'math_ast_sha256': sha(original_math),
|
||||||
|
'derived_math_ast_sha256': sha(derived_math), 'mathematical_ast_identical': True,
|
||||||
|
'reference_entire_tick_loop_identical': mode == 'reference',
|
||||||
|
'admission_edit': '0 < steps <= 1000 -> 0 < steps <= spec.max_steps',
|
||||||
|
'pre_loop_installation': _INSTALL, 'post_loop_terminal_recording': _FINISH,
|
||||||
|
'added_runtime_callbacks': extra_calls,
|
||||||
|
'removed_diagnostic_statements': removed, 'replaced_diagnostic_nodes': replacements,
|
||||||
|
'derived_module_ast_sha256': sha(_dump(tree)), 'old_globals_patched': False}
|
||||||
|
return tree, receipt
|
||||||
|
|
||||||
|
|
||||||
|
class FiniteObserver:
|
||||||
|
"""GPU scalar diagnostics only; never writes a neuronal/APL input tensor."""
|
||||||
|
def __init__(self, torch, device):
|
||||||
|
self.torch = torch
|
||||||
|
self.ok = torch.ones((), device=device, dtype=torch.bool)
|
||||||
|
self.first = torch.full((), -1, device=device, dtype=torch.int64)
|
||||||
|
self.accepted = torch.zeros((), device=device, dtype=torch.int64)
|
||||||
|
self.due = 0
|
||||||
|
self.ticks = 0
|
||||||
|
|
||||||
|
def arrivals(self, expanded, destination, ref):
|
||||||
|
self.due += expanded.numel()
|
||||||
|
self.accepted.add_((ref[destination.long()] == 0).to(self.torch.int64).sum())
|
||||||
|
|
||||||
|
def observe(self, tick, *values):
|
||||||
|
require(tick == self.ticks, 'Finite observer tick coverage changed')
|
||||||
|
finite = self.torch.ones_like(self.ok)
|
||||||
|
for value in values:
|
||||||
|
finite.logical_and_(self.torch.isfinite(value).all())
|
||||||
|
self.first = self.torch.where((self.first < 0) & (~finite), self.torch.full_like(self.first, tick), self.first)
|
||||||
|
self.ok.logical_and_(finite)
|
||||||
|
self.ticks += 1
|
||||||
|
|
||||||
|
def result(self):
|
||||||
|
return {'all_finite': bool(self.ok.item()), 'first_failure_tick': int(self.first.item()),
|
||||||
|
'finite_observed_ticks': self.ticks, 'arriving_edges': self.due,
|
||||||
|
'accepted_arriving_edges': int(self.accepted.item())}
|
||||||
|
|
||||||
|
|
||||||
|
def _copy_input(source, target, expected):
|
||||||
|
with Path(source).open('rb') as src, Path(target).open('xb') as dst:
|
||||||
|
for block in iter(lambda: src.read(8 << 20), b''):
|
||||||
|
dst.write(block)
|
||||||
|
require(digest(target) == expected, 'Copied input differs')
|
||||||
|
|
||||||
|
|
||||||
|
class _Runtime:
|
||||||
|
def __init__(self, mode, spec, helper, plan, meta, inputs, torch, overlay_file, manifest_file):
|
||||||
|
self.mode, self.spec, self.helper, self.plan, self.meta, self.inputs = mode, spec, helper, plan, meta, inputs
|
||||||
|
self.torch, self.overlay_file, self.manifest_file = torch, Path(overlay_file).absolute(), Path(manifest_file).absolute()
|
||||||
|
self.observer = None
|
||||||
|
self.installations = 0
|
||||||
|
self.finished = False
|
||||||
|
self.result = None
|
||||||
|
|
||||||
|
def install(self, weights, graph, apl_mask, upload, out_dir, inherited, device):
|
||||||
|
require(self.installations == 0, 'Repeated installation is forbidden')
|
||||||
|
require(len(graph['nodes']) == 166700 and len(graph['edge_id']) == self.helper.EDGE_COUNT,
|
||||||
|
'Only the intact full graph is permitted')
|
||||||
|
require(int(apl_mask.sum()) == 5845, 'Original fast APL mask changed')
|
||||||
|
mapping = self.helper.map_installation(graph['weights'], graph['edge_id'], apl_mask, self.plan)
|
||||||
|
require(mapping['missing_candidate_count'] == 0, 'All original candidates must be present')
|
||||||
|
rows = mapping['rows']
|
||||||
|
if len(rows):
|
||||||
|
index = upload(rows, self.torch.int64)
|
||||||
|
nonzero = self.plan['plastic_delta_mv'] != np.float32(0)
|
||||||
|
change = upload(self.plan['plastic_delta_mv'][nonzero], self.torch.float64) * 0.001
|
||||||
|
weights[index] = weights[index] + change
|
||||||
|
require(self.helper.bit_equal(weights[index].cpu().numpy(), mapping['expected_si']), 'Independent SI installation mismatch')
|
||||||
|
raw_base, expected = self.helper.expected_hashes(graph['weights'], apl_mask, mapping)
|
||||||
|
actual = hashlib.sha256()
|
||||||
|
for start in range(0, weights.numel(), 1 << 20):
|
||||||
|
actual.update(weights[start:start + (1 << 20)].cpu().numpy().astype('<f8', copy=False).tobytes())
|
||||||
|
require(actual.hexdigest() == expected, 'Effective weight bytes differ from declared overlay')
|
||||||
|
self.effective_sha = expected
|
||||||
|
self.observer = FiniteObserver(self.torch, device)
|
||||||
|
self.installations += 1
|
||||||
|
_copy_input(self.overlay_file, out_dir / 'overlay-input.npz', self.meta['overlay_sha256'])
|
||||||
|
_copy_input(self.manifest_file, out_dir / 'overlay-manifest.json', self.inputs[str(self.manifest_file)])
|
||||||
|
_save(out_dir / 'overlay-audit.json', {'schema': 'phase4an-overlay-install-v1', 'complete': True,
|
||||||
|
'overlay_name': self.meta['overlay_name'], 'candidate_count': len(self.plan['edge_id']),
|
||||||
|
'nonzero_delta_count': len(rows), 'am_helper_sha256': AM_OVERLAY_SHA, 'mask_sha256': MASK_SHA,
|
||||||
|
'base_candidate_sha256': self.meta['base_candidate_sha256'], 'delta_raw_sha256': _raw(self.plan['plastic_delta_mv']),
|
||||||
|
'base_weights_raw_sha256': raw_base, 'effective_weights_raw_sha256': expected,
|
||||||
|
'delta_dtype': 'float32', 'delta_units': 'mV', 'state_dtype': 'float64', 'bridge': self.helper.BRIDGE,
|
||||||
|
'zero_rows_untouched': True, 'weights_updated_during_run': False, 'apl_fast_edges_zeroed': int(apl_mask.sum()),
|
||||||
|
'parent_snapshot_sha256': self.meta.get('parent_snapshot_sha256'),
|
||||||
|
'eligibility_v2_source_sha256': self.meta.get('eligibility_v2_source_sha256'),
|
||||||
|
'parent_chain_verified_by_runtime': False, 'inherited_AJ_provenance_only': inherited})
|
||||||
|
|
||||||
|
def arrivals(self, expanded, destination, ref):
|
||||||
|
self.observer.arrivals(expanded, destination, ref)
|
||||||
|
|
||||||
|
def after_tick(self, tick, v, g, ref, drive, state, h, applied):
|
||||||
|
self.observer.observe(tick, v, g, ref, drive, state, h, applied)
|
||||||
|
|
||||||
|
def finish(self, ring, apl_ring, apl, steps, out_dir):
|
||||||
|
require(not self.finished and self.installations == 1, 'Invalid terminal recording sequence')
|
||||||
|
if self.mode == 'light':
|
||||||
|
self.result = self.observer.result()
|
||||||
|
require(self.result['finite_observed_ticks'] == steps, 'Missing finite checks')
|
||||||
|
else:
|
||||||
|
# Reaching this point means AJ's original per-tick finite check passed.
|
||||||
|
self.result = {'all_finite': True, 'first_failure_tick': -1, 'finite_observed_ticks': steps}
|
||||||
|
_save(out_dir / 'finite-audit.json', dict(self.result, mode=self.mode,
|
||||||
|
scope='every completed tick; no neuronal or APL tensor mutated by observer'))
|
||||||
|
raw_ring, raw_apl = ring.cpu().numpy().copy(), apl_ring.cpu().numpy().copy()
|
||||||
|
head = steps % len(raw_apl)
|
||||||
|
pending = np.concatenate((raw_apl[head:], raw_apl[:head]), axis=0)
|
||||||
|
apl_state = apl.state.cpu().numpy().copy()
|
||||||
|
require(raw_ring.dtype == np.uint8 and raw_ring.shape == (19, 166700) and
|
||||||
|
apl_state.dtype == pending.dtype == np.float32 and apl_state.shape == (2,) and pending.shape == (18, 4064),
|
||||||
|
'Terminal queue dtype/shape changed')
|
||||||
|
with (out_dir / 'terminal-queues.npz').open('xb') as target:
|
||||||
|
np.savez_compressed(target, spike_ring=raw_ring, apl_state=apl_state, apl_pending=pending,
|
||||||
|
next_tick=np.asarray(steps, dtype=np.int64))
|
||||||
|
self.finished = True
|
||||||
|
require(self.result['all_finite'], 'Nonfinite value observed; trial is invalid and must not produce a learning update')
|
||||||
|
|
||||||
|
def timing(self, steps, pending):
|
||||||
|
return {'apl_delay_steps': 18, 'steps': steps, 'pending_generated_count': min(steps, 18),
|
||||||
|
'pending_initial_zero_prefix': max(18 - steps, 0), 'brain_tail_advanced': False,
|
||||||
|
'full_sequence_bitwise_audit_performed': False,
|
||||||
|
'scope': 'Original D18 ring AST retained; generated/applied histories not recorded'}
|
||||||
|
|
||||||
|
def summary(self, value):
|
||||||
|
result = dict(value)
|
||||||
|
result.pop('learning', None)
|
||||||
|
result.update(diagnostic_mode=self.mode, within_trial_weight_updates=False,
|
||||||
|
outer_protocol=self.spec.get('outer_protocol'), outer_learning_status='not evaluated by this single-trial executor',
|
||||||
|
learning_pass_claimed=False, checkpoint_continuation_used=False,
|
||||||
|
max_steps=self.spec['max_steps'], explicit_steps_executed=self.spec['steps'],
|
||||||
|
entire_neural_trial_executed=True, hidden_early_stop=False,
|
||||||
|
full_APL_history_recorded=self.mode == 'reference', full_tick_state_hashes_recorded=self.mode == 'reference',
|
||||||
|
full_queue_hashes_recorded=self.mode == 'reference',
|
||||||
|
full_sequence_bitwise_audit_performed=self.mode == 'reference',
|
||||||
|
first_failure_tick=self.result['first_failure_tick'],
|
||||||
|
pass_all_scope='single fixed-weight trial finite/recording integrity only; no learning or equivalence claim')
|
||||||
|
if self.mode == 'light':
|
||||||
|
result.update(arriving_edges=self.result['arriving_edges'], accepted_arriving_edges=self.result['accepted_arriving_edges'])
|
||||||
|
if 'apl_timing' in result:
|
||||||
|
result['apl_timing'] = dict(result['apl_timing'], generated_trace=None, applied_trace=None,
|
||||||
|
full_sequence_bitwise_audit_performed=False)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def write_json(self, path, value):
|
||||||
|
path = Path(path)
|
||||||
|
if path.name == 'summary.json':
|
||||||
|
value = self.summary(value)
|
||||||
|
elif path.name == 'apl-timing-audit.json' and self.mode == 'light':
|
||||||
|
value = dict(value)
|
||||||
|
value.update(generated_trace=None, applied_trace=None, full_sequence_bitwise_audit_performed=False)
|
||||||
|
_save(path, value)
|
||||||
|
|
||||||
|
|
||||||
|
def compile_runtime(aj_module, runtime, mode):
|
||||||
|
"""Fresh namespace; __file__ is this real adapter, not a disguised old file."""
|
||||||
|
tree, audit = derive_ast(Path(aj_module.__file__).read_bytes(), mode)
|
||||||
|
namespace = dict(aj_module.__dict__)
|
||||||
|
namespace.update(__name__=__name__ + '.derived_' + mode, __file__=str(Path(__file__).absolute()),
|
||||||
|
_runtime=runtime, write_json=runtime.write_json)
|
||||||
|
exec(compile(tree, str(Path(__file__).absolute()) + '::AJ-AST-' + mode, 'exec'), namespace)
|
||||||
|
audit.update(derived_namespace_file=namespace['__file__'], original_module_file=str(Path(aj_module.__file__).absolute()),
|
||||||
|
output_metadata_binding='new write_json only labels recording/within-trial scope; no old global mutated')
|
||||||
|
return namespace['run_gpu'], audit
|
||||||
|
|
||||||
|
|
||||||
|
def execution_paths(case_dir, out_dir, build_root, protected=()):
|
||||||
|
"""Resolve directory aliases before containment checks, without any writes.
|
||||||
|
|
||||||
|
Only data/source/output directories are canonicalized here. This helper
|
||||||
|
must not be used for a Python executable: resolving a venv entry changes
|
||||||
|
interpreter semantics. The coordinator must keep input paths stable during
|
||||||
|
execution; this is not a defense against concurrent filesystem mutation.
|
||||||
|
"""
|
||||||
|
case_dir = Path(case_dir).resolve(strict=True)
|
||||||
|
require(case_dir.is_dir(), 'Input case must be an existing directory')
|
||||||
|
out_dir, build_root = (Path(path).resolve(strict=False) for path in (out_dir, build_root))
|
||||||
|
require(not out_dir.exists(), 'Output must be a new directory')
|
||||||
|
require(not build_root.exists() or build_root.is_dir(), 'Build cache must be a directory')
|
||||||
|
roots = [case_dir]
|
||||||
|
for path in protected:
|
||||||
|
root = Path(path).resolve(strict=True)
|
||||||
|
require(root.is_dir(), 'Protected input/source root must be a directory')
|
||||||
|
roots.append(root)
|
||||||
|
require(not any(out_dir.is_relative_to(root) or build_root.is_relative_to(root) for root in roots),
|
||||||
|
'Output/build paths cannot write into frozen source or input directories')
|
||||||
|
return case_dir, out_dir, build_root
|
||||||
|
|
||||||
|
|
||||||
|
def _run(mode, case_dir, out_dir, build_root, overlay_file, overlay_manifest):
|
||||||
|
require(sys.dont_write_bytecode, 'Use python -B; frozen dependencies must not receive bytecode writes')
|
||||||
|
case_dir, out_dir, build_root = execution_paths(case_dir, out_dir, build_root)
|
||||||
|
spec = validate_spec(_read_json(case_dir / 'spec.json'), case_dir)
|
||||||
|
helper, plan, meta, inputs = load_overlay(overlay_file, overlay_manifest)
|
||||||
|
own_sha = digest(__file__)
|
||||||
|
inputs[str(case_dir / 'spec.json')] = digest(case_dir / 'spec.json')
|
||||||
|
inputs[str(case_dir / 'requests.npz')] = digest(case_dir / 'requests.npz')
|
||||||
|
inputs[str(Path(spec['graph_dir']) / 'weights.npy')] = digest(Path(spec['graph_dir']) / 'weights.npy')
|
||||||
|
aj_dir = Path(meta['aj_model_dir']).resolve(strict=True)
|
||||||
|
protected = (aj_dir.parent, Path(meta['am_overlay_path']).resolve(strict=True).parent,
|
||||||
|
Path(spec['graph_dir']), Path(spec['apl_bundle_dir']),
|
||||||
|
*(Path(path).resolve(strict=True).parent for path in
|
||||||
|
(overlay_file, overlay_manifest, meta['mask_path'], meta['base_candidate_path'], spec['coefficients_path'])))
|
||||||
|
case_dir, out_dir, build_root = execution_paths(case_dir, out_dir, build_root, protected)
|
||||||
|
_load('timing_queue', aj_dir / 'timing_queue.py', PINS['apl-timing-lab-v1/timing_queue.py'])
|
||||||
|
aj = _load('phase4an_sealed_aj_gpu', aj_dir / 'gpu_timing.py', AJ_SHA)
|
||||||
|
runtime = _Runtime(mode, spec, helper, plan, meta, inputs, aj.torch, overlay_file, overlay_manifest)
|
||||||
|
function, ast_audit = compile_runtime(aj, runtime, mode)
|
||||||
|
try:
|
||||||
|
inherited = function(case_dir, out_dir, build_root)
|
||||||
|
require(runtime.finished and runtime.installations == 1 and inherited['complete'], 'Incomplete single-trial execution')
|
||||||
|
require(inherited['effective_weights_raw_sha256'] == runtime.effective_sha, 'Effective weight identity changed during trial')
|
||||||
|
require(digest(__file__) == own_sha and all(digest(path) == expected for path, expected in inputs.items()),
|
||||||
|
'Source or input changed during execution')
|
||||||
|
summary = _read_json(out_dir / 'summary.json')
|
||||||
|
require(summary == runtime.summary(inherited), 'Stored summary does not bind actual trial')
|
||||||
|
_save(out_dir / 'runtime-provenance.json', {'schema': 'phase4an-reporting-adapter-v1', 'complete': True,
|
||||||
|
'source_file': str(Path(__file__).absolute()), 'source_sha256': own_sha, 'mode': mode, 'ast': ast_audit,
|
||||||
|
'input_sha256': inputs, 'old_globals_patched': False, 'math_changed': False,
|
||||||
|
'admission_bound_changed_explicitly': True, 'weights_updated_during_run': False,
|
||||||
|
'learning_pass_claimed': False, 'parent_chain_verification_owned_by_coordinator': True,
|
||||||
|
'summary_sha256': digest(out_dir / 'summary.json'), 'finite_audit_sha256': digest(out_dir / 'finite-audit.json'),
|
||||||
|
'terminal_queues_sha256': digest(out_dir / 'terminal-queues.npz'),
|
||||||
|
'overlay_audit_sha256': digest(out_dir / 'overlay-audit.json')})
|
||||||
|
return summary
|
||||||
|
except Exception as error:
|
||||||
|
if out_dir.is_dir() and not (out_dir / 'runtime-error.json').exists():
|
||||||
|
_save(out_dir / 'runtime-error.json', {'complete': False, 'type': type(error).__name__, 'message': str(error),
|
||||||
|
'learning_update_forbidden': True})
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def run_light(case_dir, out_dir, build_root, overlay_file, overlay_manifest):
|
||||||
|
return _run('light', case_dir, out_dir, build_root, overlay_file, overlay_manifest)
|
||||||
|
|
||||||
|
|
||||||
|
def run_reference(case_dir, out_dir, build_root, overlay_file, overlay_manifest):
|
||||||
|
return _run('reference', case_dir, out_dir, build_root, overlay_file, overlay_manifest)
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
"""Synthetic/mocked dispatch + temporary-array tests; no GPU or brain runs."""
|
||||||
|
import copy
|
||||||
|
from contextlib import ExitStack
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_analysis as a
|
||||||
|
import engineering_plan as p
|
||||||
|
|
||||||
|
|
||||||
|
PIN = 'a' * 64
|
||||||
|
WEIGHT = 'b' * 64
|
||||||
|
|
||||||
|
|
||||||
|
def raw(value):
|
||||||
|
return hashlib.sha256(value.tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def record(row):
|
||||||
|
n, k, steps, start = 3, 2, row['steps'], row['start']
|
||||||
|
state = dict(step=np.empty(0, np.int32), neuron_idx=np.empty(0, np.int32), counts=np.zeros(n, np.int32),
|
||||||
|
v=np.zeros(n, np.float64), g=np.zeros(n, np.float64), ref=np.zeros(n, np.int32))
|
||||||
|
reference = row['mode'] == 'reference'
|
||||||
|
summary = dict(complete=True, pass_all=True, all_finite=True, counts_match_sparse_events=True,
|
||||||
|
steps=steps, completed_ticks=steps, nodes=n, edges=3, requested=0, total_spikes=0, accepted_requests=0,
|
||||||
|
rejected_requests=0, arriving_edges=0, accepted_arriving_edges=0, apl_fast_edges_zeroed=1, kc_targets_present=k,
|
||||||
|
precision='float64', apl_precision='float32', apl_delay_steps=18, diagnostic_mode=row['mode'],
|
||||||
|
effective_weights_raw_sha256=WEIGHT, within_trial_weight_updates=False, learning_pass_claimed=False,
|
||||||
|
checkpoint_continuation_used=start > 0, global_tick_offset=start, global_next_tick=start + steps,
|
||||||
|
wall_seconds=1., diagnostic_simulation_seconds=.5, build_or_cache_seconds=.2,
|
||||||
|
peak_allocated_vram_bytes=1000, peak_reserved_vram_bytes=2000)
|
||||||
|
return dict(source=row['row_id'], state=state, steps=steps, global_tick_offset=start, summary=summary,
|
||||||
|
terminal=dict(spike_ring=np.zeros((19, n), np.uint8), apl_state=np.zeros(2, np.float32),
|
||||||
|
apl_pending=np.zeros((18, k), np.float32), next_tick=np.asarray(steps, np.int64)),
|
||||||
|
requests=np.empty((0, 5), np.int64),
|
||||||
|
traces={name: np.zeros((steps, 2), np.float32) for name in a.compare.TRACE_FILES} if reference else {},
|
||||||
|
state_hashes=[dict(tick=t, v_sha256=raw(state['v']), g_sha256=raw(state['g']), ref_sha256=raw(state['ref'])) for t in range(steps)] if reference else None,
|
||||||
|
queues=[dict(tick=t, count=0, accepted_count=0, ordered_edge_sha256='c' * 64,
|
||||||
|
accepted_mask_sha256='c' * 64, joint_sha256='d' * 64) for t in range(steps)] if reference else None)
|
||||||
|
|
||||||
|
|
||||||
|
def fixture():
|
||||||
|
plan = p.build_plan(); exp = Path(tempfile.gettempdir()).resolve() / 'synthetic-project' / 'experiments/phase4an-engineering-validation'
|
||||||
|
reg = dict(schema='phase4an-engineering-registration-v1', plan=plan, training=False,
|
||||||
|
cases={r['row_id']: dict(case_dir=str(exp / 'cases' / r['row_id'])) for r in plan['rows']},
|
||||||
|
source_sha256={}, input_sha256={}, selected_case=dict(AM_outputs={'zero': 'mock', 'static25': 'mock'}),
|
||||||
|
overlays={'zero': {}, 'static25': {}})
|
||||||
|
verified = {r['row_id']: dict(schema='phase4an-engineering-runtime-record-v1', complete=True, training=False,
|
||||||
|
row=copy.deepcopy(r), registration_sha256=PIN, checkpoint_manifest_sha256=PIN,
|
||||||
|
runtime_and_immediate_seal_wall_seconds=2., storage={'state.npz': {'file_bytes': 10}, 'terminal-queues.npz': {'file_bytes': 20}})
|
||||||
|
for r in plan['rows']}
|
||||||
|
records = {r['row_id']: record(r) for r in plan['rows']}
|
||||||
|
reader = Mock(); reader.finish.return_value = []; reader.close.return_value = None
|
||||||
|
context = dict(reader=reader, records=records,
|
||||||
|
legacy={stage: record(next(r for r in plan['rows'] if r['overlay'] == stage and r['kind'] == 'fresh' and r['mode'] == 'reference')) for stage in p.OVERLAYS},
|
||||||
|
graph=dict(ptr=np.array([0, 1, 2, 3], np.int64), dst=np.array([1, 2, 0], np.int32), edge_id=np.arange(3, dtype=np.int64)),
|
||||||
|
requests=dict(tick=np.empty(0, np.int32), neuron_idx=np.empty(0, np.int32)), storage={r['row_id']: 600 for r in plan['rows']})
|
||||||
|
return reg, verified, context
|
||||||
|
|
||||||
|
|
||||||
|
class Orchestration(unittest.TestCase):
|
||||||
|
def mocked(self, reg, verified, context, *, fail=None, live=True, queue_exact=True, joint=True):
|
||||||
|
calls = []
|
||||||
|
def ordinary(name):
|
||||||
|
def f(*args):
|
||||||
|
calls.append(name)
|
||||||
|
return dict(numerical_exact=name != fail, checks={}, observed_scope={'mock_only': True})
|
||||||
|
return f
|
||||||
|
def chain(mono, parts):
|
||||||
|
calls.append('chain_exact')
|
||||||
|
reference = mono['summary']['diagnostic_mode'] == 'reference'
|
||||||
|
return dict(numerical_exact=fail != ('reference_chain' if reference else 'light_chain'),
|
||||||
|
pass_all=reference and live, nonvacuous_temporal_coverage=reference and live,
|
||||||
|
status='PASS' if reference else 'INCOMPLETE-COVERAGE',
|
||||||
|
coverage={'carried_APL_nonzero_applied_values': 1 if live and reference else 0,
|
||||||
|
'boundaries': [{'pending_source_spike_events': 1, 'carried_APL_nonzero_pending_values': 1 if joint else 0}]} if reference else None)
|
||||||
|
with ExitStack() as stack:
|
||||||
|
for name, value in dict(N=3, E=3, K=2, FAST_APL_EDGES=1).items():
|
||||||
|
stack.enter_context(patch.object(a, name, value))
|
||||||
|
stack.enter_context(patch.object(a, '_load_context', return_value=context))
|
||||||
|
stack.enter_context(patch.object(a, '_materialize', return_value=(np.ones(3, np.float64), {'effective_weights_raw_sha256': WEIGHT})))
|
||||||
|
stack.enter_context(patch.object(a.compare, 'compare_fresh', side_effect=ordinary('fresh')))
|
||||||
|
stack.enter_context(patch.object(a.scopes, 'compare_slice', side_effect=ordinary('slice')))
|
||||||
|
stack.enter_context(patch.object(a.scopes, 'compare_checkpoint', side_effect=ordinary('checkpoint')))
|
||||||
|
stack.enter_context(patch.object(a.scopes, 'compare_parent_carry', side_effect=ordinary('carry')))
|
||||||
|
stack.enter_context(patch.object(a, '_pair', side_effect=ordinary('pair')))
|
||||||
|
stack.enter_context(patch.object(a.compare, 'compare_segments', side_effect=chain))
|
||||||
|
queue_mock = stack.enter_context(patch.object(a.queue_audit, 'audit_queues', return_value=dict(
|
||||||
|
queue_ref_request_exact=queue_exact, accepted_nonzero_crossing_witness_verified=live and queue_exact)))
|
||||||
|
result = a.analyze(reg, PIN, verified)
|
||||||
|
return result, calls, queue_mock
|
||||||
|
|
||||||
|
def test_executes_all_descriptors_and_both_independent_queues(self):
|
||||||
|
reg, verified, ctx = fixture()
|
||||||
|
report, calls, queued = self.mocked(reg, verified, ctx)
|
||||||
|
expected = [r['row_id'] + '/' + str(i) for r in reg['plan']['rows'] for i, _ in enumerate(r['expected_comparisons'])]
|
||||||
|
self.assertEqual([r['descriptor_id'] for r in report['comparisons']], expected)
|
||||||
|
self.assertEqual(len(calls), len(expected))
|
||||||
|
self.assertEqual(report['evaluated_comparisons'], 74)
|
||||||
|
self.assertEqual(queued.call_count, 2)
|
||||||
|
self.assertEqual(queued.call_args.kwargs['cuts'], [5, 18, 19, 500])
|
||||||
|
self.assertEqual(report['status'], a.SUCCESS)
|
||||||
|
self.assertFalse(report['learning_pass_claimed'])
|
||||||
|
self.assertEqual(len(report['metrics']), 32)
|
||||||
|
self.assertTrue(all(row['gpu_utilization'] is None for row in report['metrics']))
|
||||||
|
self.assertTrue(all(r['light_standalone_coverage'] is None for r in report['overlay_reports'].values()))
|
||||||
|
json.dumps(report, allow_nan=False)
|
||||||
|
ctx['reader'].finish.assert_called_once()
|
||||||
|
ctx['reader'].close.assert_called_once()
|
||||||
|
|
||||||
|
def test_numerical_failure_still_evaluates_every_descriptor(self):
|
||||||
|
for failure in ('fresh', 'slice', 'checkpoint', 'carry', 'pair', 'reference_chain', 'light_chain'):
|
||||||
|
reg, verified, ctx = fixture()
|
||||||
|
with self.subTest(failure=failure):
|
||||||
|
report, calls, _ = self.mocked(reg, verified, ctx, fail=failure)
|
||||||
|
self.assertEqual(len(calls), 74)
|
||||||
|
self.assertEqual(report['status'], 'FAIL-NUMERICAL')
|
||||||
|
self.assertFalse(report['pass_all'])
|
||||||
|
|
||||||
|
def test_queue_failure_and_absent_live_coverage_are_distinct(self):
|
||||||
|
for arguments, expected in [({'queue_exact': False}, 'FAIL-NUMERICAL'),
|
||||||
|
({'live': False}, 'INCOMPLETE-COVERAGE'), ({'joint': False}, 'INCOMPLETE-COVERAGE')]:
|
||||||
|
reg, verified, ctx = fixture()
|
||||||
|
report, _, _ = self.mocked(reg, verified, ctx, **arguments)
|
||||||
|
self.assertEqual(report['status'], expected)
|
||||||
|
self.assertFalse(report['pass_all'])
|
||||||
|
|
||||||
|
def test_receipt_inventory_alias_and_descriptor_removal_fail_closed(self):
|
||||||
|
for mutation in ('receipt', 'descriptor', 'pin', 'case', 'row_alias'):
|
||||||
|
reg, verified, ctx = fixture(); identity = reg['plan']['rows'][0]['row_id']
|
||||||
|
if mutation == 'receipt':
|
||||||
|
verified.pop(identity)
|
||||||
|
elif mutation == 'descriptor':
|
||||||
|
reg['plan']['rows'][0]['expected_comparisons'] = []
|
||||||
|
elif mutation == 'pin':
|
||||||
|
verified[identity]['registration_sha256'] = 'f' * 64
|
||||||
|
elif mutation == 'row_alias':
|
||||||
|
verified[identity]['row']['steps'] = True
|
||||||
|
else:
|
||||||
|
reg['cases'][identity]['case_dir'] += '-another'
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
self.mocked(reg, verified, ctx)
|
||||||
|
|
||||||
|
def test_summary_uses_actual_AJ_requested_names_and_checks_total_accounting(self):
|
||||||
|
for key in ('requested', 'accepted_requests', 'arriving_edges', 'accepted_arriving_edges', 'edges', 'effective_weights_raw_sha256'):
|
||||||
|
reg, verified, ctx = fixture(); identity = reg['plan']['rows'][0]['row_id']
|
||||||
|
ctx['records'][identity]['summary'][key] = 'e' * 64 if key.endswith('sha256') else 1
|
||||||
|
with self.subTest(key=key):
|
||||||
|
report, _, _ = self.mocked(reg, verified, ctx)
|
||||||
|
self.assertEqual(report['status'], 'FAIL-NUMERICAL')
|
||||||
|
self.assertIn(identity, report['failed_run_checks'])
|
||||||
|
|
||||||
|
def test_identical_bytes_give_deterministic_report_and_unknown_is_null(self):
|
||||||
|
reg, verified, ctx = fixture(); identity = reg['plan']['rows'][0]['row_id']
|
||||||
|
ctx['records'][identity]['summary'].pop('peak_reserved_vram_bytes')
|
||||||
|
one, _, _ = self.mocked(reg, verified, ctx)
|
||||||
|
two, _, _ = self.mocked(reg, verified, ctx)
|
||||||
|
self.assertEqual(a._canonical(one), a._canonical(two))
|
||||||
|
row = next(r for r in one['metrics'] if r['row_id'] == identity)
|
||||||
|
self.assertIsNone(row['peak_reserved_vram_bytes'])
|
||||||
|
|
||||||
|
def test_AM_reference_full_comparison_is_not_hidden_by_light(self):
|
||||||
|
reg, _, ctx = fixture()
|
||||||
|
row = reg['plan']['rows'][0]; descriptor = row['expected_comparisons'][0]
|
||||||
|
ctx['records'][row['row_id']]['traces']['drive'][10, 0] = np.float32(1)
|
||||||
|
report = a._dispatch(descriptor, ctx['records'], ctx['legacy'], row['overlay'])
|
||||||
|
self.assertFalse(report['numerical_exact'])
|
||||||
|
self.assertIn('pair.trace.drive', report['failed_checks'])
|
||||||
|
|
||||||
|
def test_missing_loaded_population_or_reference_inventory_rejected(self):
|
||||||
|
reg, verified, ctx = fixture(); ctx['records'].pop(next(iter(ctx['records'])))
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.mocked(reg, verified, ctx)
|
||||||
|
|
||||||
|
|
||||||
|
class FileAndWeightInputs(unittest.TestCase):
|
||||||
|
def test_reader_rehashes_actual_content_and_never_uses_stat_cache(self):
|
||||||
|
with tempfile.TemporaryDirectory() as folder:
|
||||||
|
path = Path(folder).resolve() / 'data.bin'; path.write_bytes(b'AAAA')
|
||||||
|
reader = a._Reader({str(path): a._sha_file(path)})
|
||||||
|
reader.bind(path); path.write_bytes(b'BBBB')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
reader.bind(path)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
reader.finish()
|
||||||
|
|
||||||
|
def test_original_pinned_overlay_math_signed_zero_and_nonzero_only_bridge(self):
|
||||||
|
helper = Path(__file__).resolve().parents[1] / 'wholebrain-plastic-interface-v1/overlay.py'
|
||||||
|
self.assertEqual(a._sha_file(helper), a.AM_OVERLAY_SHA)
|
||||||
|
with tempfile.TemporaryDirectory() as folder:
|
||||||
|
folder = Path(folder).resolve()
|
||||||
|
mask = folder / 'mask.npy'; base = folder / 'base.npy'
|
||||||
|
np.save(mask, np.array([0], np.int64)); np.save(base, np.array([1.5], np.float32))
|
||||||
|
original = np.array([.002, -0., -0., .009], np.float64)
|
||||||
|
graph = dict(weights=original, edge_id=np.arange(4, dtype=np.int64), apl_out_mask=np.array([False, True, False, False]))
|
||||||
|
before = original.tobytes()
|
||||||
|
for stage in ('zero', 'static25'):
|
||||||
|
delta = np.array([-0. if stage == 'zero' else -.375], np.float32)
|
||||||
|
overlay = folder / (stage + '.npz'); manifest = folder / (stage + '.json')
|
||||||
|
np.savez_compressed(overlay, edge_id=np.array([0], np.int64), plastic_delta_mv=delta)
|
||||||
|
meta = dict(schema='phase4an-overlay-v1', overlay_name=stage, am_overlay_path=str(helper), am_overlay_sha256=a.AM_OVERLAY_SHA,
|
||||||
|
mask_path=str(mask), mask_sha256=a._sha_file(mask), base_candidate_path=str(base), base_candidate_sha256=a._sha_file(base),
|
||||||
|
overlay_sha256=a._sha_file(overlay))
|
||||||
|
manifest.write_text(json.dumps(meta), encoding='utf-8')
|
||||||
|
paths = [mask, base, overlay, manifest, helper]
|
||||||
|
reader = a._Reader({str(path): a._sha_file(path) for path in paths})
|
||||||
|
reg = {'overlays': {stage: dict(overlay_file=str(overlay), overlay_manifest=str(manifest))}}
|
||||||
|
with patch.object(a, 'MASK_SHA', meta['mask_sha256']), patch.object(a, 'CANDIDATES', 1), patch.object(a, 'FAST_APL_EDGES', 1):
|
||||||
|
actual, info = a._materialize(reader, reg, graph, stage)
|
||||||
|
expected = original.copy(); expected[1] = 0.
|
||||||
|
if stage == 'static25':
|
||||||
|
expected[0] = np.add(original[0], np.multiply(delta[0].astype(np.float64), np.float64(.001)))
|
||||||
|
self.assertEqual(actual.tobytes(), expected.tobytes())
|
||||||
|
self.assertEqual(info['effective_weights_raw_sha256'], raw(expected))
|
||||||
|
self.assertEqual(info['installed_nonzero_count'], 0 if stage == 'zero' else 1)
|
||||||
|
self.assertEqual(original.tobytes(), before)
|
||||||
|
reader.finish(); reader.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,246 @@
|
|||||||
|
"""Synthetic artifact comparisons only; no neural equation or GPU execution."""
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_compare as c
|
||||||
|
|
||||||
|
|
||||||
|
def sha(value):
|
||||||
|
return hashlib.sha256(np.ascontiguousarray(value).tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def synthetic_parts(lengths, *, active=True, traces=True, queues=True):
|
||||||
|
n, k = 3, 2
|
||||||
|
total = sum(lengths)
|
||||||
|
all_ticks = np.array([value for value in (0, 7, 19, 21, 41, 61) if value < total], np.int32) if active else np.empty(0, np.int32)
|
||||||
|
all_nodes = np.array([0, 1, 2, 0, 2, 1][:len(all_ticks)], np.int32)
|
||||||
|
ring, apl_ring = np.zeros((19, n), np.uint8), np.zeros((18, k), np.float32)
|
||||||
|
phase, offset, result = 0, 0, []
|
||||||
|
for length in lengths:
|
||||||
|
ring = ring[(np.arange(19) + phase % 19) % 19].copy()
|
||||||
|
head = phase % 18
|
||||||
|
apl_ring = np.concatenate((apl_ring[head:], apl_ring[:head]))
|
||||||
|
event_tick, event_node, requested, hashes, queue_rows = [], [], [], [], []
|
||||||
|
generated, applied, drives, apl_states = [], [], [], []
|
||||||
|
for tick in range(length):
|
||||||
|
absolute = offset + tick
|
||||||
|
fired = all_nodes[all_ticks == absolute]
|
||||||
|
ring[tick % 19] = 0; ring[tick % 19, fired] = 1
|
||||||
|
for neuron in fired:
|
||||||
|
event_tick.append(tick); event_node.append(neuron)
|
||||||
|
requested.append([tick, int(neuron), 1, 1, 0])
|
||||||
|
due = ring[(tick - 18) % 19] if absolute >= 18 else np.zeros(n, np.uint8)
|
||||||
|
edges = np.array([int(node) * 2 + i for node in np.flatnonzero(due) for i in (0, 1)], np.int64)
|
||||||
|
accepted = np.ones(len(edges), np.uint8)
|
||||||
|
queue_rows.append({'tick': tick, 'count': len(edges), 'accepted_count': len(edges),
|
||||||
|
'ordered_edge_sha256': sha(edges), 'accepted_mask_sha256': sha(accepted),
|
||||||
|
'joint_sha256': hashlib.sha256(str(tick).encode() + edges.tobytes() + accepted.tobytes()).hexdigest()})
|
||||||
|
v = np.array([-.05, -.04, -.03], np.float64)
|
||||||
|
g = np.array([-0., float(absolute), -.001], np.float64)
|
||||||
|
ref = np.zeros(n, np.int32)
|
||||||
|
hashes.append({'tick': tick, 'v_sha256': sha(v), 'g_sha256': sha(g), 'ref_sha256': sha(ref)})
|
||||||
|
h = np.full(k, np.float32(absolute + 1 if active else 0), np.float32)
|
||||||
|
application = apl_ring[tick % 18].copy(); apl_ring[tick % 18] = h
|
||||||
|
generated.append(h); applied.append(application)
|
||||||
|
drives.append(np.full(2, np.float32(absolute if active else 0), np.float32))
|
||||||
|
apl_states.append(np.full(2, np.float32(absolute + 2 if active else 0), np.float32))
|
||||||
|
local_ticks, nodes = np.array(event_tick, np.int32), np.array(event_node, np.int32)
|
||||||
|
state = {'step': local_ticks, 'neuron_idx': nodes, 'counts': np.bincount(nodes, minlength=n).astype(np.int32), 'v': v, 'g': g, 'ref': ref}
|
||||||
|
head = length % 18
|
||||||
|
pending = np.concatenate((apl_ring[head:], apl_ring[:head]))
|
||||||
|
terminal = {'spike_ring': ring.copy(), 'apl_state': apl_states[-1].copy(), 'apl_pending': pending,
|
||||||
|
'next_tick': np.asarray(length, np.int64)}
|
||||||
|
summary = {'complete': True, 'pass_all': True, 'all_finite': True, 'steps': length, 'completed_ticks': length,
|
||||||
|
'nodes': n, 'precision': 'float64', 'apl_precision': 'float32', 'apl_delay_steps': 18,
|
||||||
|
'checkpoint_continuation_used': offset > 0, 'global_tick_offset': offset, 'global_next_tick': offset + length,
|
||||||
|
'effective_weights_raw_sha256': 'e' * 64, 'diagnostic_mode': 'reference' if traces else 'light'}
|
||||||
|
result.append({'source': 'synthetic', 'steps': length, 'global_tick_offset': offset, 'state': state,
|
||||||
|
'requests': np.asarray(requested, np.int64).reshape(-1, 5), 'terminal': terminal,
|
||||||
|
'summary': summary, 'terminal_origin': 'synthetic_recorded',
|
||||||
|
'traces': {'generated': np.asarray(generated), 'applied': np.asarray(applied),
|
||||||
|
'drive': np.asarray(drives), 'state': np.asarray(apl_states)} if traces else {},
|
||||||
|
'state_hashes': hashes if traces else None, 'queues': queue_rows if queues else None})
|
||||||
|
offset += length; phase = length
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def write_output(path, run, *, legacy=False):
|
||||||
|
path.mkdir()
|
||||||
|
for name, value in (('summary.json', run['summary']), ('apl-timing-audit.json',
|
||||||
|
{'final_apl_state_u32_bits': run['terminal']['apl_state'].view(np.uint32).tolist()})):
|
||||||
|
(path / name).write_text(json.dumps(value), encoding='utf-8')
|
||||||
|
np.savez_compressed(path / 'state.npz', **run['state'])
|
||||||
|
np.save(path / 'apl-pending-tail.float32.npy', run['terminal']['apl_pending'])
|
||||||
|
if legacy:
|
||||||
|
(path / 'adapter-provenance.json').write_text('{}', encoding='utf-8')
|
||||||
|
else:
|
||||||
|
np.savez_compressed(path / 'terminal-queues.npz', **run['terminal'])
|
||||||
|
with (path / 'requests.csv').open('w', encoding='utf-8', newline='') as stream:
|
||||||
|
import csv
|
||||||
|
writer = csv.writer(stream); writer.writerow(c.REQUEST_FIELDS); writer.writerows(run['requests'].tolist())
|
||||||
|
for name, file in c.TRACE_FILES.items():
|
||||||
|
if name in run['traces']:
|
||||||
|
np.save(path / file, run['traces'][name])
|
||||||
|
for name, file in (('state_hashes', 'tick-state-hashes.jsonl'), ('queues', 'queue.jsonl')):
|
||||||
|
if run[name] is not None:
|
||||||
|
(path / file).write_text(''.join(json.dumps(row) + '\n' for row in run[name]), encoding='utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
class Comparisons(unittest.TestCase):
|
||||||
|
def test_fresh_light_reference_exact_without_fabricating_light_traces(self):
|
||||||
|
reference = synthetic_parts([64])[0]
|
||||||
|
light = synthetic_parts([64], traces=False, queues=False)[0]
|
||||||
|
report = c.compare_fresh(light, reference)
|
||||||
|
self.assertTrue(report['pass_all'])
|
||||||
|
self.assertFalse(report['reference_comparisons_available']['APL_traces'])
|
||||||
|
self.assertFalse(report['temporal_validation_complete'])
|
||||||
|
|
||||||
|
def test_light_does_not_hide_reference_vs_AM_interior_trace_mismatch(self):
|
||||||
|
light = synthetic_parts([64], traces=False, queues=False)[0]
|
||||||
|
reference = synthetic_parts([64])[0]
|
||||||
|
legacy = copy.deepcopy(reference)
|
||||||
|
reference['traces']['drive'][10, 0] += np.float32(1.)
|
||||||
|
report = c.compare_fresh(light, reference, legacy)
|
||||||
|
self.assertFalse(report['pass_all'])
|
||||||
|
self.assertIn('reference_vs_AM.trace.drive', report['failed_checks'])
|
||||||
|
|
||||||
|
def test_nonzero_origin_monolithic_and_split_require_same_parent(self):
|
||||||
|
mono = synthetic_parts([20, 44])[1]
|
||||||
|
parts = synthetic_parts([20, 5, 39])[1:]
|
||||||
|
with self.assertRaisesRegex(ValueError, 'same starting parent'):
|
||||||
|
c.compare_segments(mono, parts)
|
||||||
|
mono['summary']['parent_checkpoint_manifest_sha256'] = 'a' * 64
|
||||||
|
parts[0]['summary']['parent_checkpoint_manifest_sha256'] = 'a' * 64
|
||||||
|
report = c.compare_segments(mono, parts)
|
||||||
|
self.assertTrue(report['pass_all'], report['failed_checks'])
|
||||||
|
self.assertEqual(report['global_tick_offset'], 20)
|
||||||
|
parts[0]['summary']['parent_checkpoint_manifest_sha256'] = 'b' * 64
|
||||||
|
with self.assertRaisesRegex(ValueError, 'same starting parent'):
|
||||||
|
c.compare_segments(mono, parts)
|
||||||
|
|
||||||
|
def test_monolithic_segments_exact_and_cross_boundary_coverage(self):
|
||||||
|
mono = synthetic_parts([64])[0]
|
||||||
|
parts = synthetic_parts([5, 12, 1, 1, 18, 19, 8])
|
||||||
|
report = c.compare_segments(mono, parts)
|
||||||
|
self.assertTrue(report['pass_all'], report['failed_checks'])
|
||||||
|
self.assertTrue(report['reference_comparisons_available']['APL_traces'])
|
||||||
|
self.assertTrue(report['reference_comparisons_available']['state_hashes'])
|
||||||
|
self.assertGreater(report['coverage']['observed_carried_arriving_edges'], 0)
|
||||||
|
self.assertGreater(report['coverage']['carried_APL_nonzero_applied_values'], 0)
|
||||||
|
self.assertFalse(report['queue_joint_hash_compared'])
|
||||||
|
self.assertNotEqual(mono['queues'][18]['joint_sha256'], parts[3]['queues'][0]['joint_sha256'])
|
||||||
|
|
||||||
|
def test_raw_ring_phase_must_be_normalized(self):
|
||||||
|
mono = synthetic_parts([64])[0]
|
||||||
|
parts = synthetic_parts([20, 44])
|
||||||
|
self.assertFalse(c.bit_equal(mono['terminal']['spike_ring'], parts[-1]['terminal']['spike_ring']))
|
||||||
|
self.assertTrue(c.bit_equal(c.normalized_ring(mono['terminal']), c.normalized_ring(parts[-1]['terminal'])))
|
||||||
|
self.assertTrue(c.compare_segments(mono, parts)['pass_all'])
|
||||||
|
|
||||||
|
def test_signed_zero_final_state_difference_is_not_equal(self):
|
||||||
|
left = synthetic_parts([64], traces=False, queues=False)[0]
|
||||||
|
right = copy.deepcopy(left); right['state']['g'][0] = 0.
|
||||||
|
report = c.compare_fresh(left, right)
|
||||||
|
self.assertFalse(report['numerical_exact'])
|
||||||
|
self.assertIn('pair.state.g', report['failed_checks'])
|
||||||
|
|
||||||
|
def test_zero_activity_is_not_a_complete_temporal_pass(self):
|
||||||
|
mono = synthetic_parts([64], active=False)[0]
|
||||||
|
parts = synthetic_parts([20, 44], active=False)
|
||||||
|
report = c.compare_segments(mono, parts)
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertFalse(report['pass_all'])
|
||||||
|
self.assertFalse(report['temporal_validation_complete'])
|
||||||
|
self.assertEqual(report['status'], 'INCOMPLETE-COVERAGE')
|
||||||
|
self.assertFalse(c.compare_fresh(mono, copy.deepcopy(mono))['pass_all'])
|
||||||
|
|
||||||
|
def test_missing_observed_queue_coverage_is_reported_unknown_not_zero_or_pass(self):
|
||||||
|
mono = synthetic_parts([64], traces=False, queues=False)[0]
|
||||||
|
parts = synthetic_parts([20, 44], traces=False, queues=False)
|
||||||
|
report = c.compare_segments(mono, parts)
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertIsNone(report['coverage']['observed_carried_arriving_edges'])
|
||||||
|
self.assertFalse(report['temporal_validation_complete'])
|
||||||
|
|
||||||
|
def test_request_acceptance_difference_fails_even_if_events_are_equal(self):
|
||||||
|
left = synthetic_parts([64])[0]; right = copy.deepcopy(left)
|
||||||
|
right['requests'][0, 3:] = [0, 1]
|
||||||
|
report = c.compare_fresh(left, right)
|
||||||
|
self.assertIn('pair.requests_five_fields', report['failed_checks'])
|
||||||
|
|
||||||
|
def test_clock_gaps_and_empty_segment_list_rejected(self):
|
||||||
|
mono = synthetic_parts([64])[0]
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
c.compare_segments(mono, [])
|
||||||
|
parts = synthetic_parts([20, 44]); parts[1]['global_tick_offset'] += 1
|
||||||
|
with self.assertRaisesRegex(ValueError, 'clock gap'):
|
||||||
|
c.compare_segments(mono, parts)
|
||||||
|
|
||||||
|
def test_partial_traces_hash_coverage_and_bad_dtype_rejected(self):
|
||||||
|
for mutation in ('trace', 'hash', 'dtype', 'duplicate'):
|
||||||
|
run = synthetic_parts([64])[0]
|
||||||
|
if mutation == 'trace':
|
||||||
|
run['traces'].pop('applied')
|
||||||
|
elif mutation == 'hash':
|
||||||
|
run['state_hashes'].pop()
|
||||||
|
elif mutation == 'dtype':
|
||||||
|
run['state']['v'] = run['state']['v'].astype(np.float32)
|
||||||
|
else:
|
||||||
|
run['state']['step'][1] = run['state']['step'][0]
|
||||||
|
run['state']['neuron_idx'][1] = run['state']['neuron_idx'][0]
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
c.validate_run(run)
|
||||||
|
|
||||||
|
def test_per_step_state_hash_and_queue_mask_mismatch_fail(self):
|
||||||
|
mono = synthetic_parts([64])[0]; parts = synthetic_parts([20, 44])
|
||||||
|
parts[1]['state_hashes'][1]['g_sha256'] = '0' * 64
|
||||||
|
parts[1]['queues'][1]['accepted_mask_sha256'] = '1' * 64
|
||||||
|
report = c.compare_segments(mono, parts)
|
||||||
|
self.assertFalse(report['pass_all'])
|
||||||
|
self.assertIn('concatenated_per_tick_state_hashes', report['failed_checks'])
|
||||||
|
self.assertIn('concatenated_queue_order_and_acceptance', report['failed_checks'])
|
||||||
|
|
||||||
|
def test_effective_weight_change_fails(self):
|
||||||
|
mono = synthetic_parts([64])[0]; parts = synthetic_parts([20, 44])
|
||||||
|
parts[1]['summary']['effective_weights_raw_sha256'] = 'f' * 64
|
||||||
|
self.assertFalse(c.compare_segments(mono, parts)['checks']['unchanged_effective_weights'])
|
||||||
|
|
||||||
|
|
||||||
|
class FileSchemas(unittest.TestCase):
|
||||||
|
def test_actual_five_request_fields_and_AM_derived_ring_are_labeled(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory)
|
||||||
|
run = synthetic_parts([64])[0]
|
||||||
|
write_output(root / 'AN', run)
|
||||||
|
write_output(root / 'AM', run, legacy=True)
|
||||||
|
actual, legacy = c.load_run(root / 'AN'), c.load_run(root / 'AM', allow_legacy_am=True)
|
||||||
|
try:
|
||||||
|
self.assertIn('derived_from_fresh_events', legacy['terminal_origin'])
|
||||||
|
self.assertTrue(c.compare_fresh(actual, copy.deepcopy(actual), legacy)['pass_all'])
|
||||||
|
with self.assertRaisesRegex(ValueError, 'missing'):
|
||||||
|
c.load_run(root / 'AM')
|
||||||
|
finally:
|
||||||
|
c.close_run(actual); c.close_run(legacy)
|
||||||
|
|
||||||
|
def test_missing_reference_file_or_wrong_request_header_rejected(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory)
|
||||||
|
run = synthetic_parts([64])[0]
|
||||||
|
write_output(root / 'partial', run)
|
||||||
|
(root / 'partial' / 'apl-applied.float32.npy').unlink()
|
||||||
|
with self.assertRaisesRegex(ValueError, 'incomplete'):
|
||||||
|
c.load_run(root / 'partial')
|
||||||
|
write_output(root / 'header', run)
|
||||||
|
(root / 'header' / 'requests.csv').write_text('tick,neuron_idx,accepted\n', encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'five AJ'):
|
||||||
|
c.load_run(root / 'header')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
import copy
|
||||||
|
import unittest
|
||||||
|
import numpy as np
|
||||||
|
import engineering_inputs as e
|
||||||
|
|
||||||
|
|
||||||
|
def inputs():
|
||||||
|
return dict(tick=np.array([0, 4, 5, 17, 18, 18, 19, 499, 500, 999], np.int32),
|
||||||
|
neuron_idx=np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 166699], np.int32))
|
||||||
|
|
||||||
|
|
||||||
|
def spec():
|
||||||
|
return dict(name='unchanged', kind='fullgraph', steps=1000, dt_ms=.1, duration_ms=100.,
|
||||||
|
apl_delay_steps=18, record_history=False, training=False,
|
||||||
|
model={'threshold_mv': -45, 'w_syn_mv_per_anatomical_synapse': .275},
|
||||||
|
apl={'gain': .01}, budget_root='/project/old', output_budget_bytes=2048,
|
||||||
|
graph_dir='/project/frozen-graph', seed=1073741825)
|
||||||
|
|
||||||
|
|
||||||
|
class ExactInputs(unittest.TestCase):
|
||||||
|
def test_exact_boundaries_reconstruct_all_requests(self):
|
||||||
|
original = inputs()
|
||||||
|
intervals = [(0, 5), (5, 18), (18, 19), (19, 500), (500, 1000)]
|
||||||
|
parts = [e.slice_requests(original, 1000, *span) for span in intervals]
|
||||||
|
report = e.verify_partition(original, 1000, intervals, parts)
|
||||||
|
self.assertTrue(report['complete'])
|
||||||
|
self.assertEqual(parts[2]['tick'].tolist(), [0, 0])
|
||||||
|
self.assertEqual(parts[-1]['tick'].tolist(), [0, 499])
|
||||||
|
self.assertEqual(report['random_draws'], 0)
|
||||||
|
for value in parts:
|
||||||
|
for key in original:
|
||||||
|
self.assertFalse(np.shares_memory(original[key], value[key]))
|
||||||
|
|
||||||
|
def test_empty_intervals_are_explicit_not_lost(self):
|
||||||
|
original = inputs()
|
||||||
|
intervals = [(0, 20), (20, 499), (499, 1000)]
|
||||||
|
parts = [e.slice_requests(original, 1000, *span) for span in intervals]
|
||||||
|
self.assertEqual(len(parts[1]['tick']), 0)
|
||||||
|
self.assertTrue(e.verify_partition(original, 1000, intervals, parts)['complete'])
|
||||||
|
|
||||||
|
def test_bad_requests_never_silently_fixed(self):
|
||||||
|
for mut in ('dtype', 'duplicate', 'order', 'bounds', 'shape', 'extra'):
|
||||||
|
req = inputs()
|
||||||
|
if mut == 'dtype': req['tick'] = req['tick'].astype(np.int64)
|
||||||
|
elif mut == 'duplicate': req['tick'][1], req['neuron_idx'][1] = 0, 1
|
||||||
|
elif mut == 'order': req['tick'][1] = 10
|
||||||
|
elif mut == 'bounds': req['neuron_idx'][-1] = 166700
|
||||||
|
elif mut == 'shape': req['tick'] = req['tick'][:-1]
|
||||||
|
else: req['seed'] = 1
|
||||||
|
with self.subTest(mut=mut), self.assertRaises(ValueError):
|
||||||
|
e.slice_requests(req, 1000, 0, 1000)
|
||||||
|
|
||||||
|
def test_partition_gap_overlap_changed_input_and_missing_tail_rejected(self):
|
||||||
|
req = inputs()
|
||||||
|
spans = [(0, 500), (500, 1000)]
|
||||||
|
parts = [e.slice_requests(req, 1000, *x) for x in spans]
|
||||||
|
for bad in ([(0, 500), (501, 1000)], [(0, 500), (499, 1000)], [(0, 500)]):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
e.verify_partition(req, 1000, bad, parts[:len(bad)])
|
||||||
|
parts[0]['neuron_idx'][0] = 123
|
||||||
|
with self.assertRaisesRegex(ValueError, 'changes actual requests'):
|
||||||
|
e.verify_partition(req, 1000, spans, parts)
|
||||||
|
|
||||||
|
def test_fresh_prefix_and_continued_specs_preserve_original(self):
|
||||||
|
original = spec()
|
||||||
|
before = copy.deepcopy(original)
|
||||||
|
for start, stop, parent in ((0, 1000, None), (0, 18, None), (18, 19, 'a' * 64)):
|
||||||
|
derived, audit = e.derive_spec(original, start=start, stop=stop, budget_root='/project/new',
|
||||||
|
output_budget_bytes=8 * 1024**3, parent_sha=parent)
|
||||||
|
self.assertEqual(original, before)
|
||||||
|
self.assertEqual(derived['model'], original['model'])
|
||||||
|
self.assertEqual(derived['apl'], original['apl'])
|
||||||
|
self.assertIsNot(derived['model'], original['model'])
|
||||||
|
self.assertEqual(derived['max_steps'], 1000)
|
||||||
|
self.assertEqual(derived['steps'], stop - start)
|
||||||
|
self.assertTrue(audit['all_other_fields_unchanged'])
|
||||||
|
if start: self.assertEqual(derived['global_tick_offset'], start)
|
||||||
|
|
||||||
|
def test_invalid_continuation_root_and_duration_rejected(self):
|
||||||
|
for root in ('/project/old/sub', '/project', 'relative', '/project/../old', '//project/old', '//project/new'):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
e.derive_spec(spec(), start=0, stop=1000, budget_root=root, output_budget_bytes=10)
|
||||||
|
for start, stop, parent in ((1, 20, None), (0, 10, 'a'*64), (True, 10, None), (0, 1001, None)):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
e.derive_spec(spec(), start=start, stop=stop, budget_root='/project/new', output_budget_bytes=10, parent_sha=parent)
|
||||||
|
original = spec(); original['duration_ms'] = 1.
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
e.derive_spec(original, start=0, stop=10, budget_root='/project/new', output_budget_bytes=10)
|
||||||
|
|
||||||
|
def test_original_clock_type_and_no_within_trial_update_match_runtime(self):
|
||||||
|
for key, value in (('apl_delay_steps', 18.), ('apl_delay_steps', True),
|
||||||
|
('within_trial_weight_updates', True), ('budget_root', '//project/old')):
|
||||||
|
original = spec(); original[key] = value
|
||||||
|
with self.subTest(key=key, value=value), self.assertRaises(ValueError):
|
||||||
|
e.derive_spec(original, start=0, stop=10, budget_root='/project/new', output_budget_bytes=10)
|
||||||
|
|
||||||
|
def test_overlay_is_declaration_translation_not_self_authorized_learned(self):
|
||||||
|
original = dict(schema='phase4am-overlay-v1', overlay_name='zero', training=False, fixed_for_whole_trial=True,
|
||||||
|
overlay_sha256='b'*64, mask_path='/project/mask.npy', mask_sha256=e.MASK_SHA,
|
||||||
|
base_candidate_path='/project/base.npy', base_candidate_sha256='c'*64,
|
||||||
|
aj_model_dir='/project/apl-timing-lab-v1', old_extra_field='preserved in original only')
|
||||||
|
before = copy.deepcopy(original)
|
||||||
|
result = e.adapt_overlay_manifest(original, '/project/overlay.py')
|
||||||
|
self.assertEqual(original, before)
|
||||||
|
self.assertEqual(result['schema'], 'phase4an-overlay-v1')
|
||||||
|
self.assertNotIn('old_extra_field', result)
|
||||||
|
self.assertEqual(result['overlay_sha256'], original['overlay_sha256'])
|
||||||
|
for key, val in (('overlay_name', 'learned'), ('mask_sha256', 'd'*64), ('training', True), ('base_candidate_path', 'local')):
|
||||||
|
bad = dict(original); bad[key] = val
|
||||||
|
with self.subTest(key=key), self.assertRaises(ValueError):
|
||||||
|
e.adapt_overlay_manifest(bad, '/project/overlay.py')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
"""Pure inventory/dependency tests; no I/O, GPU, scientific input or runtime."""
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import engineering_plan as p
|
||||||
|
|
||||||
|
|
||||||
|
class FixedPlan(unittest.TestCase):
|
||||||
|
def test_complete_current_inventory_not_future_supplements(self):
|
||||||
|
plan = p.build_plan()
|
||||||
|
self.assertEqual(plan['total_calls'], len(plan['rows']))
|
||||||
|
self.assertEqual(plan['total_calls'], 32)
|
||||||
|
self.assertEqual(plan['total_ticks'], sum(row['steps'] for row in plan['rows']))
|
||||||
|
self.assertEqual(plan['total_ticks'], 11074)
|
||||||
|
self.assertEqual(plan['overlays'], ['zero', 'static25'])
|
||||||
|
self.assertEqual(plan['chain_lengths'], [5, 13, 1, 481, 500])
|
||||||
|
self.assertFalse(plan['training'])
|
||||||
|
self.assertFalse(plan['candidate_generated'])
|
||||||
|
self.assertEqual(p.validate_plan(json.loads(json.dumps(plan))), plan)
|
||||||
|
for overlay in plan['overlays']:
|
||||||
|
rows = [r for r in plan['rows'] if r['overlay'] == overlay]
|
||||||
|
self.assertEqual(len(rows), 16)
|
||||||
|
self.assertEqual(sum(r['steps'] for r in rows), 5537)
|
||||||
|
self.assertEqual([(r['mode'], r['steps']) for r in rows if r['kind'] == 'fresh'],
|
||||||
|
[('reference', 1000), ('light', 1000), ('light', 1000)])
|
||||||
|
self.assertEqual([r['stop'] for r in rows if r['kind'] == 'prefix'], [18, 19, 500])
|
||||||
|
self.assertFalse(any(r['stop'] > 1000 for r in rows))
|
||||||
|
|
||||||
|
def test_all_prerequisites_precede_rows_and_fresh_prefixes_precede_chains(self):
|
||||||
|
rows = p.build_plan()['rows']
|
||||||
|
self.assertTrue(all(r['kind'] in ('fresh', 'prefix') for r in rows[:12]))
|
||||||
|
self.assertTrue(all(r['kind'] == 'chain' for r in rows[12:]))
|
||||||
|
positions = {r['row_id']: i for i, r in enumerate(rows)}
|
||||||
|
self.assertEqual(len(positions), 32)
|
||||||
|
for index, row in enumerate(rows):
|
||||||
|
if row['parent_row_id'] is not None:
|
||||||
|
self.assertLess(positions[row['parent_row_id']], index)
|
||||||
|
for check in row['expected_comparisons']:
|
||||||
|
reference = check['reference_row_id']
|
||||||
|
if reference is not None:
|
||||||
|
self.assertLess(positions[reference], index)
|
||||||
|
for candidate in check['candidate_row_ids']:
|
||||||
|
self.assertLessEqual(positions[candidate], index)
|
||||||
|
self.assertLess(check['start'], check['stop'])
|
||||||
|
|
||||||
|
def test_each_chain_is_exact_partition_with_local_phase_distinct_from_global(self):
|
||||||
|
for overlay in p.OVERLAYS:
|
||||||
|
for mode in p.MODES:
|
||||||
|
chain = [r for r in p.build_plan()['rows'] if
|
||||||
|
(r['overlay'], r['mode'], r['kind']) == (overlay, mode, 'chain')]
|
||||||
|
self.assertEqual([(r['start'], r['stop']) for r in chain],
|
||||||
|
[(0, 5), (5, 18), (18, 19), (19, 500), (500, 1000)])
|
||||||
|
self.assertEqual([r['steps'] % 19 for r in chain], [5, 13, 1, 6, 6])
|
||||||
|
self.assertEqual([r['stop'] % 19 for r in chain], [5, 18, 0, 6, 12])
|
||||||
|
self.assertIsNone(chain[0]['parent_row_id'])
|
||||||
|
for earlier, later in zip(chain, chain[1:]):
|
||||||
|
self.assertEqual(later['parent_row_id'], earlier['row_id'])
|
||||||
|
self.assertEqual(later['start'], earlier['stop'])
|
||||||
|
self.assertEqual(chain[2]['start'], 18) # source tick 0 arrives at this child's local 0.
|
||||||
|
self.assertEqual(chain[2]['steps'], 1)
|
||||||
|
last = next(c for c in chain[-1]['expected_comparisons'] if c['check'] == 'chain_exact')
|
||||||
|
self.assertEqual(last['candidate_row_ids'], [r['row_id'] for r in chain])
|
||||||
|
self.assertEqual((last['start'], last['stop']), (0, 1000))
|
||||||
|
|
||||||
|
def test_prefix5_is_reference_first_segment_without_extra_run(self):
|
||||||
|
rows = p.build_plan()['rows']
|
||||||
|
self.assertFalse(any(r['kind'] == 'prefix' and r['stop'] == 5 for r in rows))
|
||||||
|
for overlay in p.OVERLAYS:
|
||||||
|
first = {r['mode']: r for r in rows if r['kind'] == 'chain' and
|
||||||
|
r['overlay'] == overlay and r['start'] == 0}
|
||||||
|
refs = [c for c in first['light']['expected_comparisons'] if c['check'] == 'checkpoint_exact']
|
||||||
|
self.assertEqual(len(refs), 1)
|
||||||
|
self.assertEqual(refs[0]['reference_row_id'], first['reference']['row_id'])
|
||||||
|
self.assertFalse(any(c['reference_row_id'] == first['reference']['row_id']
|
||||||
|
for c in first['reference']['expected_comparisons']))
|
||||||
|
|
||||||
|
def test_fresh_am_and_light_repeat_comparisons_are_explicit(self):
|
||||||
|
rows = p.build_plan()['rows']
|
||||||
|
for overlay in p.OVERLAYS:
|
||||||
|
fresh = [r for r in rows if r['overlay'] == overlay and r['kind'] == 'fresh']
|
||||||
|
self.assertEqual(len(fresh), 3)
|
||||||
|
for row in fresh:
|
||||||
|
am = [c for c in row['expected_comparisons'] if c['check'] == 'am_exact']
|
||||||
|
self.assertEqual(len(am), 1)
|
||||||
|
self.assertEqual(am[0]['external_reference'], 'sealed_AM_selected_case_same_overlay_r0')
|
||||||
|
self.assertIsNone(am[0]['reference_row_id'])
|
||||||
|
self.assertEqual(fresh[1]['expected_comparisons'][1]['reference_row_id'], fresh[0]['row_id'])
|
||||||
|
self.assertEqual(fresh[2]['expected_comparisons'][1]['reference_row_id'], fresh[1]['row_id'])
|
||||||
|
|
||||||
|
def test_every_result_is_independent_not_shared_mutable_inventory(self):
|
||||||
|
original = p.build_plan()
|
||||||
|
checked = p.validate_plan(original)
|
||||||
|
checked['rows'][0]['expected_comparisons'][0]['candidate_row_ids'].append('mutation')
|
||||||
|
checked['chain_lengths'][0] = 99
|
||||||
|
self.assertEqual(original, p.build_plan())
|
||||||
|
original['rows'][0]['expected_comparisons'][0]['scope'] = 'mutation'
|
||||||
|
self.assertNotEqual(original, p.build_plan())
|
||||||
|
|
||||||
|
def test_exact_types_reject_bool_int_float_and_sequence_conflation(self):
|
||||||
|
mutations = (
|
||||||
|
lambda x: x.update(total_calls=32.0),
|
||||||
|
lambda x: x.update(training=0),
|
||||||
|
lambda x: x['rows'][0].update(start=False),
|
||||||
|
lambda x: x['rows'][14].update(steps=True),
|
||||||
|
lambda x: x['rows'][14].update(steps=1.0),
|
||||||
|
lambda x: x['rows'][0]['expected_comparisons'][0].update(start=False),
|
||||||
|
lambda x: x.update(rows=tuple(x['rows'])),
|
||||||
|
)
|
||||||
|
for mutate in mutations:
|
||||||
|
plan = p.build_plan(); mutate(plan)
|
||||||
|
with self.subTest(mutation=repr(mutate)), self.assertRaisesRegex(ValueError, 'type'):
|
||||||
|
p.validate_plan(plan)
|
||||||
|
|
||||||
|
def test_unknown_fields_missing_overlays_and_reordering_are_rejected(self):
|
||||||
|
mutations = (
|
||||||
|
lambda x: x.update(extra=True),
|
||||||
|
lambda x: x['rows'][0].update(extra='not allowed'),
|
||||||
|
lambda x: x['rows'][0]['expected_comparisons'][0].update(tolerance=0),
|
||||||
|
lambda x: x.update(overlays=['zero']),
|
||||||
|
lambda x: x['rows'].pop(0),
|
||||||
|
lambda x: x['rows'].append(copy.deepcopy(x['rows'][-1])),
|
||||||
|
lambda x: x['rows'].__setitem__(slice(0, 2), x['rows'][1::-1]),
|
||||||
|
lambda x: x['rows'][0].update(overlay='static25'),
|
||||||
|
lambda x: x['rows'][0].update(mode='light'),
|
||||||
|
lambda x: x['rows'][0].update(row_id='arbitrary'),
|
||||||
|
)
|
||||||
|
for mutate in mutations:
|
||||||
|
plan = p.build_plan(); mutate(plan)
|
||||||
|
with self.subTest(mutation=repr(mutate)), self.assertRaises(ValueError):
|
||||||
|
p.validate_plan(plan)
|
||||||
|
|
||||||
|
def test_gaps_wrong_parents_and_dropped_comparisons_never_pass(self):
|
||||||
|
mutations = (
|
||||||
|
lambda x: x['rows'][13].update(start=6, steps=12),
|
||||||
|
lambda x: x['rows'][13].update(stop=17, steps=12),
|
||||||
|
lambda x: x['rows'][13].update(parent_row_id=None),
|
||||||
|
lambda x: x['rows'][12].update(parent_row_id=x['rows'][13]['row_id']),
|
||||||
|
lambda x: x['rows'][16].update(stop=999, steps=499),
|
||||||
|
lambda x: x['rows'][0].update(expected_comparisons=[]),
|
||||||
|
lambda x: x['rows'][2]['expected_comparisons'].pop(),
|
||||||
|
lambda x: x['rows'][16]['expected_comparisons'][-1]['candidate_row_ids'].pop(),
|
||||||
|
lambda x: x['rows'][16]['expected_comparisons'][-1].update(scope='final_only'),
|
||||||
|
)
|
||||||
|
for mutate in mutations:
|
||||||
|
plan = p.build_plan(); mutate(plan)
|
||||||
|
with self.subTest(mutation=repr(mutate)), self.assertRaises(ValueError):
|
||||||
|
p.validate_plan(plan)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,216 @@
|
|||||||
|
"""Temporary-directory and small authority tests only; never touch real ROOT."""
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import types
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
import engineering_prepare as p
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL = Path(__file__).resolve().parent
|
||||||
|
AI = LOCAL.parent / 'pn-recruitment-audit-v1/publication.py'
|
||||||
|
|
||||||
|
|
||||||
|
def valid_status():
|
||||||
|
final = dict(status=p.FINAL_STATUS, primary_trials_per_stage=120, repeats_per_stage=24,
|
||||||
|
zero_overlay_exact=True, static25_repeat_exact=True, old_integrity_pass=True,
|
||||||
|
frozen_five_reference_pass=True, frozen_eligibility_and_mask_unchanged=True,
|
||||||
|
base_weights_unchanged=True, training=False, learned_candidate=False)
|
||||||
|
scientific = dict(status=p.FINAL_STATUS, primary_trials_per_stage=120, technical_repeats_per_stage=24,
|
||||||
|
zero_overlay_exact=True, static25_repeat_exact=True, training=False, learned_candidate=False)
|
||||||
|
old = {'root-' + str(i): {'pass': True, 'checked': 1, 'mismatches': [], 'manifest_sha256': 'a'*64, 'checksums_sha256': 'b'*64}
|
||||||
|
for i in range(28)}
|
||||||
|
refs = {'pass_all': True, 'trials': [{'trial': name, 'exact': {key: True for key in ('step', 'neuron_idx', 'counts', 'v', 'g')}} for name in p.REFERENCES]}
|
||||||
|
return final, scientific, old, copy.deepcopy(old), refs
|
||||||
|
|
||||||
|
|
||||||
|
def planned():
|
||||||
|
return [dict(name='fixed-' + str(i), cohort='seed_validation' if i < 60 else 'novel_to_aj', repeat=r)
|
||||||
|
for i in range(120) for r in ((0, 1) if i < 24 else (0,))]
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorityTests(unittest.TestCase):
|
||||||
|
def test_required_final_status_and_all_28_roots_five_references(self):
|
||||||
|
p.validate_final_status(*valid_status())
|
||||||
|
for mutation in ('status', 'hidden-learning', 'root', 'reference', 'root-hash'):
|
||||||
|
args = copy.deepcopy(valid_status())
|
||||||
|
if mutation == 'status':
|
||||||
|
args[0]['status'] = 'INCOMPLETE'
|
||||||
|
elif mutation == 'hidden-learning':
|
||||||
|
args[1]['learned_candidate'] = True
|
||||||
|
elif mutation == 'root':
|
||||||
|
args[3].pop('root-27')
|
||||||
|
elif mutation == 'reference':
|
||||||
|
args[4]['trials'][2]['exact']['g'] = False
|
||||||
|
else:
|
||||||
|
args[3]['root-1']['manifest_sha256'] = 'c' * 64
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
p.validate_final_status(*args)
|
||||||
|
|
||||||
|
def test_first_actual_planned_primary_is_selected_without_dynamic_ranking(self):
|
||||||
|
rows = planned()
|
||||||
|
self.assertEqual(p.validate_planned(rows), rows[0])
|
||||||
|
for altered in (rows[:-1], rows + [rows[0]], [dict(rows[0], name='../escape'), *rows[1:]],
|
||||||
|
[rows[1], rows[1], *rows[2:]]):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p.validate_planned(altered)
|
||||||
|
|
||||||
|
def test_three_external_sha_anchors_have_no_defaults_or_placeholders(self):
|
||||||
|
for anchors in ((None, 'a'*64, 'b'*64), ('', '', ''), ('x'*64, 'a'*64, 'b'*64)):
|
||||||
|
with self.assertRaisesRegex(ValueError, 'actual external'):
|
||||||
|
p._prepare(Path('not-read'), Path('not-read'), Path('not-read'), *anchors)
|
||||||
|
|
||||||
|
def test_path_inventory_rejects_duplicates_and_traversal(self):
|
||||||
|
for name in ('../bad', '/absolute', 'a\\b', 'a/../b', 'C:/bad'):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p._relative(name)
|
||||||
|
row = {'path': 'good.json', 'bytes': 3, 'sha256': 'a'*64}
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Duplicate'):
|
||||||
|
p._index([row, row])
|
||||||
|
|
||||||
|
def test_pinned_AI_verifier_rechecks_complete_synthetic_seal(self):
|
||||||
|
helper = p.load_module('phase4an_test_AI_publication', AI, p.AI_HELPER_SHA)
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve()
|
||||||
|
payload = root / 'small.json'; payload.write_text('{}', encoding='utf-8')
|
||||||
|
row = {'path': payload.name, 'bytes': payload.stat().st_size, 'sha256': p.digest(payload)}
|
||||||
|
p.save(root / 'manifest.json', {'root': str(root), 'files': [row]})
|
||||||
|
(root / 'checksums.sha256').write_text(row['sha256'] + ' small.json\n' + p.digest(root / 'manifest.json') + ' manifest.json\n', encoding='utf-8')
|
||||||
|
self.assertTrue(helper.verify_seal(root)['pass_all'])
|
||||||
|
payload.write_text('{"changed":true}', encoding='utf-8')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
helper.verify_seal(root)
|
||||||
|
|
||||||
|
def test_finalizer_authority_helper_checks_external_anchors_and_both_full_seals(self):
|
||||||
|
helper = p.load_module('phase4an_test_AI_publication', AI, p.AI_HELPER_SHA)
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve()
|
||||||
|
model, experiment = root / p.AM_MODEL_REL, root / p.AM_EXP_REL
|
||||||
|
model.mkdir(parents=True); experiment.mkdir(parents=True)
|
||||||
|
p.save(model / 'payload.json', {'synthetic': True})
|
||||||
|
p.save(experiment / 'protocol/preregistered.json', {'planned': []})
|
||||||
|
p.save(experiment / 'audit/final-status.json', {'status': p.FINAL_STATUS})
|
||||||
|
for tree in (model, experiment):
|
||||||
|
rows = [dict(path=path.relative_to(tree).as_posix(), bytes=path.stat().st_size, sha256=p.digest(path))
|
||||||
|
for path in sorted(tree.rglob('*')) if path.is_file()]
|
||||||
|
p.save(tree / 'manifest.json', {'root': str(tree), 'files': rows})
|
||||||
|
(tree / 'checksums.sha256').write_text(''.join(row['sha256'] + ' ' + row['path'] + '\n' for row in rows) +
|
||||||
|
p.digest(tree / 'manifest.json') + ' manifest.json\n', encoding='utf-8')
|
||||||
|
prereg = p.digest(experiment / 'protocol/preregistered.json')
|
||||||
|
anchors = dict(am_model_manifest_sha256=p.digest(model / 'manifest.json'),
|
||||||
|
am_experiment_manifest_sha256=p.digest(experiment / 'manifest.json'), am_final_sha256=p.digest(experiment / 'audit/final-status.json'),
|
||||||
|
am_preregistration_sha256=prereg, AI_publication_helper_sha256=p.AI_HELPER_SHA)
|
||||||
|
with patch.object(p, 'ROOT', root), patch.object(p, 'AM_PREREG_SHA', prereg), patch.object(p, 'load_module', return_value=helper):
|
||||||
|
self.assertEqual(set(p.verify_authority(anchors)), {'model', 'experiment'})
|
||||||
|
(model / 'payload.json').write_text('changed', encoding='utf-8')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p.verify_authority(anchors)
|
||||||
|
|
||||||
|
def test_old_integrity_bridge_restores_import_path_and_rejects_failed_root(self):
|
||||||
|
import sys
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve(); expected = valid_status()[3]
|
||||||
|
before_path = list(sys.path)
|
||||||
|
def good():
|
||||||
|
sys.path.insert(0, 'synthetic-old-context-search-path')
|
||||||
|
return copy.deepcopy(expected)
|
||||||
|
module = types.SimpleNamespace(ROOT=root, integrity=good)
|
||||||
|
with patch.object(p, 'load_module', return_value=module):
|
||||||
|
self.assertEqual(p._old_integrity(root, 'a'*64, expected), expected)
|
||||||
|
self.assertEqual(sys.path, before_path)
|
||||||
|
bad = copy.deepcopy(expected); bad['root-1']['pass'] = False
|
||||||
|
module.integrity = lambda: bad
|
||||||
|
with patch.object(p, 'load_module', return_value=module), self.assertRaisesRegex(ValueError, '28-root'):
|
||||||
|
p._old_integrity(root, 'a'*64, expected)
|
||||||
|
self.assertEqual(sys.path, before_path)
|
||||||
|
|
||||||
|
def test_all_144_stage_completions_must_match_sealed_inventory(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve(); experiment = root / p.AM_EXP_REL; experiment.mkdir(parents=True)
|
||||||
|
rows, index, completed = planned(), {}, []
|
||||||
|
def add(relative, value):
|
||||||
|
path = experiment / relative; p.save(path, value)
|
||||||
|
index[relative] = {'path': relative, 'bytes': path.stat().st_size, 'sha256': p.digest(path)}
|
||||||
|
for row in rows:
|
||||||
|
prefix = 'gpu/zero/' + row['name'] + '-r' + str(row['repeat']) + '/'
|
||||||
|
folder = experiment / prefix.rstrip('/')
|
||||||
|
case = root / p.AK_REL / 'cases' / row['cohort'] / row['name']
|
||||||
|
add(prefix + 'summary.json', {'case': row['name'], 'complete': True, 'pass_all': True, 'all_finite': True,
|
||||||
|
'steps': 1000, 'completed_ticks': 1000})
|
||||||
|
add(prefix + 'comparison.json', {'pass_all': True, 'overlay_name': 'zero', 'case_dir': str(case), 'right': str(folder),
|
||||||
|
'mode': 'zero', 'left': str(root / p.AK_REL / 'gpu' / row['cohort'] / (row['name'] + '-r' + str(row['repeat']))),
|
||||||
|
'checks': {'synthetic_gate': True}, 'failed_checks': [], 'full_queue_reconstructed': True})
|
||||||
|
inventory = [dict(path=k[len(prefix):], bytes=v['bytes'], sha256=v['sha256']) for k, v in sorted(index.items()) if k.startswith(prefix)]
|
||||||
|
add(prefix + 'output-hashes.json', inventory)
|
||||||
|
completed.append(dict(name=row['name'], repeat=row['repeat'], output_hashes_sha256=index[prefix+'output-hashes.json']['sha256'],
|
||||||
|
comparison_sha256=index[prefix+'comparison.json']['sha256']))
|
||||||
|
receipt = {'stage': 'zero', 'pass_all': True, 'trials': 144, 'primary_trials': 120, 'technical_repeats': 24,
|
||||||
|
'training': False, 'completed': completed}
|
||||||
|
add('audit/zero-complete.json', receipt)
|
||||||
|
self.assertTrue(p.validate_stage(experiment, index, 'zero', rows, root)['pass_all'])
|
||||||
|
wrong = copy.deepcopy(rows); wrong[0], wrong[1] = wrong[1], wrong[0]
|
||||||
|
with self.assertRaisesRegex(ValueError, 'order/identity'):
|
||||||
|
p.validate_stage(experiment, index, 'zero', wrong, root)
|
||||||
|
# A missing sealed payload entry cannot be hidden by a PASS flag.
|
||||||
|
altered = dict(index); altered.pop('gpu/zero/fixed-0-r0/summary.json')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p.validate_stage(experiment, altered, 'zero', rows, root)
|
||||||
|
|
||||||
|
|
||||||
|
class PreparationSafetyTests(unittest.TestCase):
|
||||||
|
def test_exclusive_layout_allows_only_nonexistent_or_empty_experiment(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve()
|
||||||
|
model = root / 'models/male-cns-lif/olfactory-conditioning-lab-v1'; model.mkdir(parents=True)
|
||||||
|
experiment = root / 'experiments/phase4an-engineering-validation'; experiment.parent.mkdir()
|
||||||
|
self.assertEqual(p._layout(root, model, experiment)[2], experiment)
|
||||||
|
experiment.mkdir(); self.assertEqual(p._layout(root, model, experiment)[2], experiment)
|
||||||
|
(experiment / 'preserve.txt').write_text('partial', encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'populated'):
|
||||||
|
p._layout(root, model, experiment)
|
||||||
|
self.assertEqual((experiment / 'preserve.txt').read_text(), 'partial')
|
||||||
|
|
||||||
|
def test_required_runtime_workflow_scope_sources_must_all_exist(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
model = Path(directory).resolve()
|
||||||
|
for name in p.SOURCE_FILES:
|
||||||
|
(model / name).write_text('# pure test source\n', encoding='utf-8')
|
||||||
|
result = p.source_inventory(model)
|
||||||
|
self.assertEqual(len(result), 21)
|
||||||
|
self.assertIn(str(model / 'engineering_workflow.py'), result)
|
||||||
|
self.assertIn(str(model / 'engineering_scopes.py'), result)
|
||||||
|
self.assertIn(str(model / 'engineering_analysis.py'), result)
|
||||||
|
(model / 'engineering_workflow.py').unlink()
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Required engineering source'):
|
||||||
|
p.source_inventory(model)
|
||||||
|
|
||||||
|
def test_byte_budget_reserve_is_not_a_license_to_delete_partials(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
experiment = Path(directory).resolve() / 'new'
|
||||||
|
experiment.mkdir(); (experiment / 'partial').write_bytes(b'x')
|
||||||
|
with patch.object(p.shutil, 'disk_usage', return_value=types.SimpleNamespace(free=30 * 1024**3)):
|
||||||
|
self.assertEqual(p._budget(experiment)['used_bytes'], 1)
|
||||||
|
with patch.object(p.shutil, 'disk_usage', return_value=types.SimpleNamespace(free=5 * 1024**3)):
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Insufficient'):
|
||||||
|
p._budget(experiment)
|
||||||
|
self.assertTrue((experiment / 'partial').is_file())
|
||||||
|
|
||||||
|
def test_row_mapping_rejects_unplanned_or_escaping_paths(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
exp = Path(directory).resolve(); case = exp / 'cases/safe-row'; case.mkdir(parents=True)
|
||||||
|
reg = {'plan': {'rows': [{'row_id': 'safe-row'}]}, 'cases': {'safe-row': {'case_dir': str(case)}}}
|
||||||
|
with patch.object(p, 'EXP', exp):
|
||||||
|
self.assertEqual(p.row_path(reg, 'safe-row'), case)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p.row_path(reg, '../outside')
|
||||||
|
reg['cases']['safe-row']['case_dir'] = str(exp)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
p.row_path(reg, 'safe-row')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
"""Small synthetic CSR/record tests only; no brain, GPU or artifact writes."""
|
||||||
|
import ast
|
||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import struct
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_queue_audit as audit
|
||||||
|
|
||||||
|
|
||||||
|
def digest(array):
|
||||||
|
return hashlib.sha256(np.ascontiguousarray(array).tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def queue_row(tick, edges, accepted):
|
||||||
|
# Independent simple whole-payload construction, unlike the chunked audit.
|
||||||
|
edge_bytes = np.asarray(edges, dtype='<i8').tobytes()
|
||||||
|
mask_bytes = np.asarray(accepted, dtype=np.uint8).tobytes()
|
||||||
|
return dict(tick=tick, count=len(edges), accepted_count=int(sum(accepted)),
|
||||||
|
ordered_edge_sha256=hashlib.sha256(edge_bytes).hexdigest(),
|
||||||
|
accepted_mask_sha256=hashlib.sha256(mask_bytes).hexdigest(),
|
||||||
|
joint_sha256=hashlib.sha256(b'phase4af-queue-v1\0' + struct.pack('<qq', tick, len(edges)) + edge_bytes + mask_bytes).hexdigest())
|
||||||
|
|
||||||
|
|
||||||
|
def fixture(*, target_fire=True, weights=None, events=None, cuts=(5, 18, 19, 37)):
|
||||||
|
ptr = np.array([0, 2, 3, 4, 5], np.int64)
|
||||||
|
dst = np.array([2, 1, 2, 0, 2], np.int32)
|
||||||
|
edge_id = np.array([10, 11, 20, 30, 40], np.int64)
|
||||||
|
weights = np.array([.001, 0., -.002, .003, .004], np.float64) if weights is None else weights
|
||||||
|
total, n = 60, 4
|
||||||
|
if events is None:
|
||||||
|
events = [(0, 0), (0, 1), *(([(18, 2)]) if target_fire else []), (22, 0), (23, 1), (44, 0)]
|
||||||
|
events = sorted(events)
|
||||||
|
request_events = sorted(set(events + [(1, 0)]))
|
||||||
|
ticks, nodes = np.array([x[0] for x in events], np.int32), np.array([x[1] for x in events], np.int32)
|
||||||
|
requests = {'tick': np.array([x[0] for x in request_events], np.int32),
|
||||||
|
'neuron_idx': np.array([x[1] for x in request_events], np.int32)}
|
||||||
|
refs, expanded, masks, request_rows = [], [], [], []
|
||||||
|
last = np.full(n, -10000, np.int64)
|
||||||
|
for tick in range(total):
|
||||||
|
for when, neuron in request_events:
|
||||||
|
if when == tick:
|
||||||
|
accepted = int(tick - last[neuron] >= 22)
|
||||||
|
request_rows.append([tick, neuron, 1, accepted, 1 - accepted])
|
||||||
|
for when, neuron in events:
|
||||||
|
if when == tick:
|
||||||
|
last[neuron] = tick
|
||||||
|
ref = np.maximum(22 - (tick - last), 0).astype(np.int32)
|
||||||
|
refs.append(ref)
|
||||||
|
edges = [j for when, neuron in events if when == tick - 18 for j in range(int(ptr[neuron]), int(ptr[neuron + 1]))]
|
||||||
|
expanded.append(np.asarray(edges, np.int64))
|
||||||
|
masks.append((ref[dst[edges]] == 0).astype(np.uint8))
|
||||||
|
|
||||||
|
def record(start, stop):
|
||||||
|
selected = (ticks >= start) & (ticks < stop)
|
||||||
|
ev_t, ev_n = (ticks[selected] - start).copy(), nodes[selected].copy()
|
||||||
|
rows = np.array([row for row in request_rows if start <= row[0] < stop], np.int64).reshape(-1, 5)
|
||||||
|
rows[:, 0] -= start
|
||||||
|
return {'steps': stop - start, 'global_tick_offset': start,
|
||||||
|
'summary': {'pass_all': False}, # Never treated as authority.
|
||||||
|
'state': {'step': ev_t, 'neuron_idx': ev_n, 'counts': np.bincount(ev_n, minlength=n).astype(np.int32),
|
||||||
|
'v': np.zeros(n, np.float64), 'g': np.zeros(n, np.float64), 'ref': refs[stop - 1].copy()},
|
||||||
|
'requests': rows,
|
||||||
|
'queues': [queue_row(t - start, edge_id[expanded[t]], masks[t]) for t in range(start, stop)],
|
||||||
|
'state_hashes': [{'tick': t - start, 'v_sha256': digest(np.zeros(n, np.float64)),
|
||||||
|
'g_sha256': digest(np.zeros(n, np.float64)), 'ref_sha256': digest(refs[t])} for t in range(start, stop)]}
|
||||||
|
intervals = list(zip([0, *cuts], [*cuts, total]))
|
||||||
|
return {'mono': record(0, total), 'parts': [record(a, b) for a, b in intervals], 'ptr': ptr, 'dst': dst,
|
||||||
|
'edge_id': edge_id, 'effective_weights': weights, 'requests': requests, 'cuts': list(cuts)}
|
||||||
|
|
||||||
|
|
||||||
|
def run(data):
|
||||||
|
return audit.audit_queues(data['mono'], data['parts'], **{k: data[k] for k in
|
||||||
|
('ptr', 'dst', 'edge_id', 'effective_weights', 'requests', 'cuts')})
|
||||||
|
|
||||||
|
|
||||||
|
class QueueAudit(unittest.TestCase):
|
||||||
|
def test_real_edge_witness_and_local_headers_cross_18_19(self):
|
||||||
|
data = fixture()
|
||||||
|
result = run(data)
|
||||||
|
self.assertTrue(result['pass_all'], result['differences'])
|
||||||
|
witness = result['first_witness']
|
||||||
|
self.assertEqual((witness['boundary_tick'], witness['source_spike_tick'], witness['arrival_tick']), (37, 22, 40))
|
||||||
|
self.assertEqual((witness['source_neuron_idx'], witness['target_neuron_idx'], witness['global_edge_id']), (0, 2, 10))
|
||||||
|
self.assertEqual(witness['effective_weight_float64_le_hex'], np.asarray(.001, dtype='<f8').tobytes().hex())
|
||||||
|
self.assertFalse(result['membrane_dynamics_independently_replayed'])
|
||||||
|
self.assertFalse(result['v_g_hashes_independently_verified'])
|
||||||
|
self.assertEqual(result['rejected_requests'], 1)
|
||||||
|
# The tick44 source has arrival62, beyond this 60-tick record; no tail
|
||||||
|
# simulation or accidental drain is performed by the audit.
|
||||||
|
self.assertEqual(result['arriving_edges'], 7)
|
||||||
|
self.assertEqual(result['accepted_arriving_edges'], 2)
|
||||||
|
json.dumps(result, allow_nan=False)
|
||||||
|
self.assertNotEqual(data['mono']['queues'][18]['joint_sha256'], data['parts'][2]['queues'][0]['joint_sha256'])
|
||||||
|
|
||||||
|
def test_current_threshold_reset_rejects_arrival_and_available_target_accepts(self):
|
||||||
|
rejected = fixture(); accepted = fixture(target_fire=False)
|
||||||
|
self.assertEqual(rejected['mono']['queues'][18]['accepted_count'], 0)
|
||||||
|
self.assertEqual(accepted['mono']['queues'][18]['accepted_count'], 2)
|
||||||
|
self.assertTrue(run(rejected)['pass_all'])
|
||||||
|
witness = run(accepted)['first_witness']
|
||||||
|
self.assertEqual((witness['source_spike_tick'], witness['arrival_tick']), (0, 18))
|
||||||
|
|
||||||
|
def test_zero_weight_edges_stay_in_queue_but_cannot_supply_witness(self):
|
||||||
|
data = fixture(weights=np.zeros(5, np.float64))
|
||||||
|
result = run(data)
|
||||||
|
self.assertTrue(result['queue_ref_request_exact'])
|
||||||
|
self.assertGreater(result['arriving_edges'], 0)
|
||||||
|
self.assertFalse(result['pass_all'])
|
||||||
|
self.assertEqual(result['status'], 'INCOMPLETE-NO-ACCEPTED-NONZERO-CROSSING')
|
||||||
|
self.assertIsNone(result['first_witness'])
|
||||||
|
|
||||||
|
def test_target_sorted_or_reversed_queue_fails_even_when_both_outputs_agree(self):
|
||||||
|
data = fixture()
|
||||||
|
bad = queue_row(18, [20, 11, 10], [0, 0, 0])
|
||||||
|
data['mono']['queues'][18] = bad
|
||||||
|
data['parts'][2]['queues'][0] = queue_row(0, [20, 11, 10], [0, 0, 0])
|
||||||
|
result = run(data)
|
||||||
|
self.assertFalse(result['pass_all'])
|
||||||
|
self.assertTrue(any(d['field'] == 'queue.ordered_edge_sha256' for d in result['differences']))
|
||||||
|
|
||||||
|
def test_global_tick_in_segment_joint_header_fails(self):
|
||||||
|
data = fixture()
|
||||||
|
data['parts'][2]['queues'][0]['joint_sha256'] = data['mono']['queues'][18]['joint_sha256']
|
||||||
|
result = run(data)
|
||||||
|
self.assertEqual(result['difference_count'], 1)
|
||||||
|
self.assertEqual(result['differences'][0]['field'], 'queue.joint_sha256')
|
||||||
|
|
||||||
|
def test_fake_request_acceptance_and_ref_hash_fail_independently(self):
|
||||||
|
for mutate in ('request', 'hash', 'terminal'):
|
||||||
|
data = fixture()
|
||||||
|
if mutate == 'request':
|
||||||
|
data['parts'][0]['requests'][2, 3:] = [1, 0]
|
||||||
|
elif mutate == 'hash':
|
||||||
|
data['parts'][1]['state_hashes'][3]['ref_sha256'] = 'a' * 64
|
||||||
|
else:
|
||||||
|
data['parts'][0]['state']['ref'][0] = 0
|
||||||
|
with self.subTest(mutate=mutate):
|
||||||
|
self.assertFalse(run(data)['pass_all'])
|
||||||
|
|
||||||
|
def test_impossible_spikes_during_ref_fail_even_with_self_consistent_records(self):
|
||||||
|
data = fixture(events=[(0, 0), (1, 0), (23, 0)])
|
||||||
|
result = run(data)
|
||||||
|
self.assertFalse(result['pass_all'])
|
||||||
|
self.assertTrue(any(d['field'] == 'spike_during_refractory' for d in result['differences']))
|
||||||
|
|
||||||
|
def test_original_accepted_request_cannot_disappear_from_all_outputs(self):
|
||||||
|
data = fixture()
|
||||||
|
rows = sorted(zip(data['requests']['tick'].tolist(), data['requests']['neuron_idx'].tolist()))
|
||||||
|
rows.append((4, 3)); rows.sort()
|
||||||
|
data['requests'] = {'tick': np.array([r[0] for r in rows], np.int32),
|
||||||
|
'neuron_idx': np.array([r[1] for r in rows], np.int32)}
|
||||||
|
result = run(data)
|
||||||
|
self.assertFalse(result['pass_all'])
|
||||||
|
self.assertTrue(any(d['field'] == 'accepted_request_without_spike' for d in result['differences']))
|
||||||
|
|
||||||
|
def test_segment_events_cannot_cancel_or_substitute_nodes(self):
|
||||||
|
data = fixture()
|
||||||
|
data['parts'][0]['state']['neuron_idx'][1] = 3
|
||||||
|
data['parts'][0]['state']['counts'] = np.array([1, 0, 0, 1], np.int32)
|
||||||
|
result = run(data)
|
||||||
|
self.assertFalse(result['pass_all'])
|
||||||
|
self.assertTrue(any(d['field'] == 'events.neuron_idx' for d in result['differences']))
|
||||||
|
|
||||||
|
def test_missing_queue_or_wrong_cuts_fail_closed(self):
|
||||||
|
for mutate in ('missing', 'cuts', 'offset', 'dtype', 'nan'):
|
||||||
|
data = fixture()
|
||||||
|
if mutate == 'missing':
|
||||||
|
data['parts'][0]['queues'] = None
|
||||||
|
elif mutate == 'cuts':
|
||||||
|
data['cuts'][1] += 1
|
||||||
|
elif mutate == 'offset':
|
||||||
|
data['mono']['global_tick_offset'] = 1
|
||||||
|
elif mutate == 'dtype':
|
||||||
|
data['effective_weights'] = data['effective_weights'].astype(np.float32)
|
||||||
|
else:
|
||||||
|
data['effective_weights'][0] = np.nan
|
||||||
|
with self.subTest(mutate=mutate), self.assertRaises(ValueError):
|
||||||
|
run(data)
|
||||||
|
|
||||||
|
def test_negative_nonzero_edge_is_valid_witness_without_valence_claim(self):
|
||||||
|
data = fixture(target_fire=False)
|
||||||
|
data['effective_weights'][:2] = 0
|
||||||
|
result = run(data)
|
||||||
|
self.assertTrue(result['pass_all'])
|
||||||
|
self.assertEqual(result['first_witness']['global_edge_id'], 20)
|
||||||
|
self.assertLess(result['first_witness']['effective_weight_SI_volt'], 0)
|
||||||
|
self.assertFalse(result['unique_causal_or_necessity_claim'])
|
||||||
|
|
||||||
|
def test_input_arrays_are_not_modified(self):
|
||||||
|
data = fixture(); original = copy.deepcopy(data)
|
||||||
|
run(data)
|
||||||
|
for key in ('ptr', 'dst', 'edge_id', 'effective_weights'):
|
||||||
|
self.assertEqual(data[key].tobytes(), original[key].tobytes())
|
||||||
|
for key in data['requests']:
|
||||||
|
self.assertEqual(data['requests'][key].tobytes(), original['requests'][key].tobytes())
|
||||||
|
self.assertEqual(data['mono']['state']['ref'].tobytes(), original['mono']['state']['ref'].tobytes())
|
||||||
|
|
||||||
|
def test_frozen_AF_queue_definition_AST_crosscheck_and_chunk_order(self):
|
||||||
|
source = Path(__file__).resolve().parents[1] / 'author-fullgraph-lab-v1' / 'oracle_full.py'
|
||||||
|
raw = source.read_bytes()
|
||||||
|
self.assertEqual(hashlib.sha256(raw).hexdigest(), audit.AF_QUEUE_SOURCE_SHA256)
|
||||||
|
tree = ast.parse(raw)
|
||||||
|
definition = [n for n in tree.body if isinstance(n, ast.FunctionDef) and n.name == 'queue_summary']
|
||||||
|
self.assertEqual(len(definition), 1)
|
||||||
|
namespace = dict(np=np, hashlib=hashlib, struct=struct, BLOCK_BYTES=8 << 20, QUEUE_HEADER=b'phase4af-queue-v1\0')
|
||||||
|
exec(compile(ast.Module(body=definition, type_ignores=[]), str(source), 'exec'), namespace)
|
||||||
|
data = fixture()
|
||||||
|
saved = audit.CHUNK
|
||||||
|
try:
|
||||||
|
audit.CHUNK = 1 # Exercise edge pass then mask pass across boundaries.
|
||||||
|
for tick, local, sources, ref in [(18, 0, np.array([0, 1]), np.array([4, 4, 22, 0], np.int32)),
|
||||||
|
(40, 3, np.array([0]), np.zeros(4, np.int32)),
|
||||||
|
(0, 0, np.empty(0, np.int32), np.zeros(4, np.int32))]:
|
||||||
|
rows, _, _ = audit._queue(tick, local, sources, ref, data['ptr'], data['dst'], data['edge_id'], data['effective_weights'], [])
|
||||||
|
indices = np.array([j for s in sources for j in range(data['ptr'][s], data['ptr'][s + 1])], np.int64)
|
||||||
|
accepted = (ref[data['dst'][indices]] == 0).astype(np.uint8)
|
||||||
|
for at, row in zip((tick, local), rows):
|
||||||
|
self.assertEqual(row, namespace['queue_summary'](at, data['edge_id'][indices], accepted, chunk_bytes=8))
|
||||||
|
finally:
|
||||||
|
audit.CHUNK = saved
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,214 @@
|
|||||||
|
"""Pure synthetic records, deliberately not a neural simulation or file test."""
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_scopes as s
|
||||||
|
|
||||||
|
|
||||||
|
def sha(array):
|
||||||
|
return hashlib.sha256(np.ascontiguousarray(array).tobytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def record(start, stop, *, reference=True, blank_requests=False):
|
||||||
|
n, k, length = 3, 2, stop - start
|
||||||
|
ticks = np.array([0, 7, 19, 21, 41, 61], np.int32)
|
||||||
|
nodes = np.array([0, 1, 2, 0, 2, 1], np.int32)
|
||||||
|
selected = (ticks >= start) & (ticks < stop)
|
||||||
|
event_ticks, event_nodes = ticks[selected] - np.int32(start), nodes[selected].copy()
|
||||||
|
v = np.array([-.05, -.04, -.03], np.float64)
|
||||||
|
g = np.array([-0., float(stop - 1), -.001], np.float64)
|
||||||
|
ref = np.zeros(n, np.int32)
|
||||||
|
state = dict(step=event_ticks, neuron_idx=event_nodes, counts=np.bincount(event_nodes, minlength=n).astype(np.int32),
|
||||||
|
v=v, g=g, ref=ref)
|
||||||
|
raw_global = np.zeros((19, n), np.uint8)
|
||||||
|
for tick, node in zip(ticks, nodes):
|
||||||
|
if max(0, stop - 19) <= tick < stop:
|
||||||
|
raw_global[tick % 19, node] = 1
|
||||||
|
normalized = raw_global[(np.arange(19) + stop % 19) % 19]
|
||||||
|
raw_local = normalized[(np.arange(19) - length % 19) % 19].copy()
|
||||||
|
generated_all = np.repeat(np.arange(1, stop + 1, dtype=np.float32)[:, None], k, axis=1)
|
||||||
|
applied_all = np.concatenate((np.zeros((18, k), np.float32), generated_all))[:stop]
|
||||||
|
pending = np.zeros((18, k), np.float32)
|
||||||
|
kept = min(stop, 18); pending[-kept:] = generated_all[-kept:]
|
||||||
|
apl_state = np.full(2, np.float32(stop + 1), np.float32)
|
||||||
|
terminal = dict(spike_ring=raw_local, apl_state=apl_state, apl_pending=pending, next_tick=np.asarray(length, np.int64))
|
||||||
|
trace = dict(generated=generated_all[start:stop].copy(), applied=applied_all[start:stop].copy(),
|
||||||
|
drive=np.repeat(np.arange(start, stop, dtype=np.float32)[:, None], 2, axis=1),
|
||||||
|
state=np.repeat(np.arange(start + 2, stop + 2, dtype=np.float32)[:, None], 2, axis=1))
|
||||||
|
hashes, queues = [], []
|
||||||
|
for local, global_tick in enumerate(range(start, stop)):
|
||||||
|
hashes.append(dict(tick=local, v_sha256=sha(v), g_sha256=sha(np.array([-0., float(global_tick), -.001], np.float64)),
|
||||||
|
ref_sha256=sha(ref)))
|
||||||
|
edges, accepted = np.array([global_tick], np.int64), np.array([global_tick % 2], np.uint8)
|
||||||
|
queues.append(dict(tick=local, count=1, accepted_count=int(accepted.sum()), ordered_edge_sha256=sha(edges),
|
||||||
|
accepted_mask_sha256=sha(accepted), joint_sha256=hashlib.sha256(
|
||||||
|
str(local).encode() + edges.tobytes() + accepted.tobytes()).hexdigest()))
|
||||||
|
requests = np.array([[int(t), int(i), 1, 1, 0] for t, i in zip(event_ticks, event_nodes)], np.int64).reshape(-1, 5)
|
||||||
|
if blank_requests:
|
||||||
|
requests = np.empty((0, 5), np.int64)
|
||||||
|
summary = dict(complete=True, pass_all=True, all_finite=True, steps=length, completed_ticks=length, nodes=n,
|
||||||
|
precision='float64', apl_precision='float32', apl_delay_steps=18,
|
||||||
|
checkpoint_continuation_used=start > 0, global_tick_offset=start, global_next_tick=stop,
|
||||||
|
effective_weights_raw_sha256='e' * 64, diagnostic_mode='reference' if reference else 'light',
|
||||||
|
full_APL_history_recorded=reference, full_tick_state_hashes_recorded=reference,
|
||||||
|
full_queue_hashes_recorded=reference)
|
||||||
|
return dict(source='synthetic', state=state, terminal=terminal, requests=requests, steps=length,
|
||||||
|
global_tick_offset=start, summary=summary, traces=trace if reference else {},
|
||||||
|
state_hashes=hashes if reference else None, queues=queues if reference else None,
|
||||||
|
terminal_origin='synthetic_recorded')
|
||||||
|
|
||||||
|
|
||||||
|
class SliceTests(unittest.TestCase):
|
||||||
|
def test_reference_slice_all_observations_exact_and_inputs_unchanged(self):
|
||||||
|
candidate, whole = record(20, 44), record(0, 64)
|
||||||
|
before = candidate['terminal']['spike_ring'].tobytes(), whole['requests'].tobytes()
|
||||||
|
report = s.compare_slice(candidate, whole)
|
||||||
|
self.assertTrue(report['numerical_exact'], report['failed_checks'])
|
||||||
|
self.assertTrue(report['observed_scope']['candidate_per_tick_state_hashes'])
|
||||||
|
self.assertTrue(report['observed_scope']['candidate_per_tick_queue_fields'])
|
||||||
|
self.assertFalse(report['observed_scope']['queue_joint_hashes_compared'])
|
||||||
|
self.assertNotEqual(candidate['queues'][0]['joint_sha256'], whole['queues'][20]['joint_sha256'])
|
||||||
|
self.assertEqual(before, (candidate['terminal']['spike_ring'].tobytes(), whole['requests'].tobytes()))
|
||||||
|
json.dumps(report, allow_nan=False)
|
||||||
|
|
||||||
|
def test_light_uses_final_raw_hash_but_does_not_fabricate_optional_history(self):
|
||||||
|
report = s.compare_slice(record(20, 44, reference=False), record(0, 64))
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertTrue(report['observed_scope']['final_state_against_reference_tick_hash'])
|
||||||
|
for name in ('candidate_APL_histories', 'candidate_per_tick_state_hashes', 'candidate_per_tick_queue_fields'):
|
||||||
|
self.assertFalse(report['observed_scope'][name])
|
||||||
|
self.assertNotIn('slice.per_tick_state_hashes', report['checks'])
|
||||||
|
self.assertTrue(any('unobserved' in item for item in report['limitations']))
|
||||||
|
|
||||||
|
def test_short_fresh_positive_zero_padding_and_prefix_events(self):
|
||||||
|
self.assertTrue(s.compare_slice(record(0, 5), record(0, 64))['numerical_exact'])
|
||||||
|
candidate = record(0, 5, reference=False)
|
||||||
|
candidate['terminal']['apl_pending'][0, 0] = np.float32(-0.)
|
||||||
|
report = s.compare_slice(candidate, record(0, 64))
|
||||||
|
self.assertFalse(report['checks']['slice.APL_pending'])
|
||||||
|
|
||||||
|
def test_blank_requests_are_valid_but_wrong_acceptance_is_not_equal(self):
|
||||||
|
self.assertTrue(s.compare_slice(record(20, 44, blank_requests=True), record(0, 64, blank_requests=True))['numerical_exact'])
|
||||||
|
candidate = record(20, 44)
|
||||||
|
candidate['requests'][0, 3:] = [0, 1]
|
||||||
|
report = s.compare_slice(candidate, record(0, 64))
|
||||||
|
self.assertFalse(report['checks']['slice.requests_five_fields'])
|
||||||
|
|
||||||
|
def test_wrong_count_or_final_hash_binding_is_invalid_not_a_pass(self):
|
||||||
|
for mutation in ('count', 'terminal', 'last_hash'):
|
||||||
|
candidate = record(20, 44)
|
||||||
|
if mutation == 'count': candidate['state']['counts'][0] += 1
|
||||||
|
elif mutation == 'terminal': candidate['state']['g'][1] += 1.
|
||||||
|
else: candidate['state_hashes'][-1]['g_sha256'] = '0' * 64
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
s.compare_slice(candidate, record(0, 64))
|
||||||
|
|
||||||
|
def test_signed_zero_light_terminal_vs_reference_hash_is_detected(self):
|
||||||
|
candidate = record(20, 44, reference=False)
|
||||||
|
candidate['state']['g'][0] = 0.
|
||||||
|
report = s.compare_slice(candidate, record(0, 64))
|
||||||
|
self.assertFalse(report['checks']['slice.final_g_raw_hash'])
|
||||||
|
|
||||||
|
def test_interior_trace_state_hash_and_queue_mismatch_are_not_hidden(self):
|
||||||
|
candidate = record(20, 44)
|
||||||
|
candidate['traces']['drive'][1, 0] += np.float32(1.)
|
||||||
|
candidate['state_hashes'][1]['v_sha256'] = '0' * 64
|
||||||
|
candidate['queues'][1]['accepted_mask_sha256'] = '1' * 64
|
||||||
|
report = s.compare_slice(candidate, record(0, 64))
|
||||||
|
for key in ('slice.APL_trace.drive', 'slice.per_tick_state_hashes', 'slice.queue_order_and_acceptance'):
|
||||||
|
self.assertFalse(report['checks'][key])
|
||||||
|
|
||||||
|
def test_missing_reference_observations_and_invalid_bounds_fail_closed(self):
|
||||||
|
for mutation in ('light_mono', 'light_labeled_full_mono', 'mono_hashes', 'candidate_traces', 'partial_trace', 'out_of_bounds', 'nonzero_mono'):
|
||||||
|
candidate, mono = record(20, 44), record(0, 64)
|
||||||
|
if mutation == 'light_mono': mono = record(0, 64, reference=False)
|
||||||
|
elif mutation == 'light_labeled_full_mono': mono['summary']['diagnostic_mode'] = 'light'
|
||||||
|
elif mutation == 'mono_hashes': mono['state_hashes'] = None
|
||||||
|
elif mutation == 'candidate_traces': candidate['traces'] = {}
|
||||||
|
elif mutation == 'partial_trace': candidate['traces'].pop('drive')
|
||||||
|
elif mutation == 'out_of_bounds': candidate = record(60, 65)
|
||||||
|
else: mono = record(1, 65)
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
s.compare_slice(candidate, mono)
|
||||||
|
|
||||||
|
def test_summary_type_scope_nonfinite_and_paths_rejected(self):
|
||||||
|
for mutation in ('bool', 'failed', 'offset', 'mode', 'weight', 'nan'):
|
||||||
|
candidate = record(20, 44)
|
||||||
|
if mutation == 'bool': candidate['summary']['steps'] = True
|
||||||
|
elif mutation == 'failed': candidate['summary']['pass_all'] = False
|
||||||
|
elif mutation == 'offset': candidate['summary']['global_tick_offset'] = 0
|
||||||
|
elif mutation == 'mode': candidate['summary']['diagnostic_mode'] = 'unknown'
|
||||||
|
elif mutation == 'weight': candidate['summary'].pop('effective_weights_raw_sha256')
|
||||||
|
else: candidate['state']['g'][0] = np.nan
|
||||||
|
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||||
|
s.compare_slice(candidate, record(0, 64))
|
||||||
|
with self.assertRaises(ValueError): s.compare_slice('/never/open/this', record(0, 64))
|
||||||
|
|
||||||
|
|
||||||
|
class CheckpointTests(unittest.TestCase):
|
||||||
|
def test_local_phase_normalization_without_segment_cumulative_counts_confusion(self):
|
||||||
|
candidate, prefix = record(20, 64), record(0, 64)
|
||||||
|
self.assertFalse(s.ec.bit_equal(candidate['terminal']['spike_ring'], prefix['terminal']['spike_ring']))
|
||||||
|
self.assertFalse(s.ec.bit_equal(candidate['state']['counts'], prefix['state']['counts']))
|
||||||
|
report = s.compare_checkpoint(candidate, prefix)
|
||||||
|
self.assertTrue(report['numerical_exact'], report['failed_checks'])
|
||||||
|
self.assertFalse(report['observed_scope']['counts_compared'])
|
||||||
|
self.assertFalse(report['observed_scope']['per_tick_state_histories_compared'])
|
||||||
|
|
||||||
|
def test_signed_zero_different_stop_or_effective_weights_cannot_pass(self):
|
||||||
|
for mutation in ('zero', 'stop', 'weight'):
|
||||||
|
candidate, prefix = record(20, 64, reference=False), record(0, 64, reference=False)
|
||||||
|
if mutation == 'zero': candidate['state']['g'][0] = 0.
|
||||||
|
elif mutation == 'stop': prefix = record(0, 63, reference=False)
|
||||||
|
else: candidate['summary']['effective_weights_raw_sha256'] = 'f' * 64
|
||||||
|
with self.subTest(mutation=mutation):
|
||||||
|
self.assertFalse(s.compare_checkpoint(candidate, prefix)['numerical_exact'])
|
||||||
|
|
||||||
|
|
||||||
|
class ParentCarryTests(unittest.TestCase):
|
||||||
|
def test_short_parent_carry_observed_and_json_safe(self):
|
||||||
|
report = s.compare_parent_carry(record(20, 25), record(0, 20))
|
||||||
|
self.assertTrue(report['numerical_exact'], report['failed_checks'])
|
||||||
|
self.assertEqual(report['observed_scope']['unwritten_spike_slot_count'], 14)
|
||||||
|
self.assertEqual(report['observed_scope']['unconsumed_APL_row_count'], 13)
|
||||||
|
self.assertEqual(report['observed_scope']['applied_parent_APL_rows_compared'], 5)
|
||||||
|
json.dumps(report, allow_nan=False)
|
||||||
|
|
||||||
|
def test_unwritten_or_unconsumed_corruption_detected_even_if_terminal_is_self_consistent(self):
|
||||||
|
for mutation in ('ring', 'pending', 'applied'):
|
||||||
|
candidate = record(20, 25)
|
||||||
|
if mutation == 'ring': candidate['terminal']['spike_ring'][10, 0] ^= np.uint8(1)
|
||||||
|
elif mutation == 'pending': candidate['terminal']['apl_pending'][0, 0] += np.float32(1.)
|
||||||
|
else: candidate['traces']['applied'][0, 0] += np.float32(1.)
|
||||||
|
with self.subTest(mutation=mutation):
|
||||||
|
self.assertFalse(s.compare_parent_carry(candidate, record(0, 20))['numerical_exact'])
|
||||||
|
|
||||||
|
def test_light_missing_optional_applied_trace_is_not_fabricated(self):
|
||||||
|
report = s.compare_parent_carry(record(20, 25, reference=False), record(0, 20))
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertFalse(report['observed_scope']['applied_parent_APL_prefix_checked'])
|
||||||
|
self.assertIsNone(report['observed_scope']['applied_parent_APL_rows_compared'])
|
||||||
|
self.assertNotIn('parent.applied_APL_prefix', report['checks'])
|
||||||
|
|
||||||
|
def test_long_segment_discloses_no_unwritten_slots_and_wrong_parent_clock_fails(self):
|
||||||
|
report = s.compare_parent_carry(record(20, 44), record(0, 20))
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertFalse(report['observed_scope']['unwritten_spike_slots_checked'])
|
||||||
|
self.assertFalse(report['observed_scope']['unconsumed_APL_prefix_checked'])
|
||||||
|
self.assertEqual(report['observed_scope']['applied_parent_APL_rows_compared'], 18)
|
||||||
|
self.assertFalse(s.compare_parent_carry(record(20, 44), record(0, 19))['numerical_exact'])
|
||||||
|
with self.assertRaises(ValueError): s.compare_parent_carry(record(0, 5), record(0, 20))
|
||||||
|
|
||||||
|
def test_long_light_carry_scope_explicitly_has_no_observed_carry_array(self):
|
||||||
|
report = s.compare_parent_carry(record(20, 44, reference=False), record(0, 20))
|
||||||
|
self.assertTrue(report['numerical_exact'])
|
||||||
|
self.assertFalse(report['observed_scope']['any_carry_values_directly_compared'])
|
||||||
|
self.assertTrue(any('clock/shape/weight identity only' in line for line in report['limitations']))
|
||||||
|
self.assertFalse(report['complete_dynamical_equivalence_proven'])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import types
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import engineering_workflow as w
|
||||||
|
from test_engineering_inputs import spec
|
||||||
|
|
||||||
|
|
||||||
|
def template(row):
|
||||||
|
return dict(schema='phase4an-engineering-case-template-v1', row_id=row['row_id'], original_spec=spec(),
|
||||||
|
start=row['start'], stop=row['stop'], budget_root='/project/new', output_budget_bytes=8 * 1024**3)
|
||||||
|
|
||||||
|
|
||||||
|
class Workflow(unittest.TestCase):
|
||||||
|
def test_only_exact_plan_row_and_safe_output_identity(self):
|
||||||
|
reg = {'plan': w.PLAN.build_plan()}
|
||||||
|
row = reg['plan']['rows'][0]
|
||||||
|
self.assertEqual(w.row_from(reg, row['row_id']), row)
|
||||||
|
for bad in ('unknown', '../escape', '/absolute'):
|
||||||
|
with self.assertRaises(ValueError): w.row_from(reg, bad)
|
||||||
|
for bad in ('../escape', '/absolute', 'a/b', 'a\\b', '', 'a:b'):
|
||||||
|
with self.assertRaises(ValueError): w.locations(bad)
|
||||||
|
reg['plan']['rows'][0]['steps'] = True
|
||||||
|
with self.assertRaises(ValueError): w.row_from(reg, row['row_id'])
|
||||||
|
|
||||||
|
def test_real_parent_is_required_only_for_later_segments(self):
|
||||||
|
for row in w.PLAN.build_plan()['rows']:
|
||||||
|
before = template(row)
|
||||||
|
pin = None if row['parent_row_id'] is None else 'a' * 64
|
||||||
|
derived, audit = w.derive_case(before, row, pin)
|
||||||
|
self.assertEqual(derived['steps'], row['steps'])
|
||||||
|
self.assertEqual(before, template(row))
|
||||||
|
self.assertEqual(audit['input_interval'], [row['start'], row['stop']])
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
w.derive_case(before, row, 'a' * 64 if pin is None else None)
|
||||||
|
|
||||||
|
def test_forged_template_and_boolean_interval_rejected(self):
|
||||||
|
row = w.PLAN.build_plan()['rows'][0]
|
||||||
|
for key, value in (('schema', 'wrong'), ('row_id', 'wrong'), ('start', False), ('stop', 18)):
|
||||||
|
changed = template(row); changed[key] = value
|
||||||
|
with self.subTest(key=key), self.assertRaises(ValueError): w.derive_case(changed, row, None)
|
||||||
|
changed = template(row); changed['extra'] = True
|
||||||
|
with self.assertRaises(ValueError): w.derive_case(changed, row, None)
|
||||||
|
|
||||||
|
def test_json_comparison_does_not_conflate_booleans_and_numbers(self):
|
||||||
|
self.assertFalse(w.same_json({'n': True}, {'n': 1}))
|
||||||
|
self.assertFalse(w.same_json({'n': 1.}, {'n': 1}))
|
||||||
|
with self.assertRaises(ValueError): w.canonical({'n': float('nan')})
|
||||||
|
|
||||||
|
def test_actual_precision_flags_are_checked_not_merely_recorded(self):
|
||||||
|
component = dict(cuda_matmul_allow_tf32=False, cudnn_allow_tf32=True, deterministic_algorithms=False,
|
||||||
|
cudnn_deterministic=False, cudnn_benchmark=False, float32_matmul_precision='highest',
|
||||||
|
CUBLAS_WORKSPACE_CONFIG=None, device_name='NVIDIA GeForce RTX 4090', torch='2.test', cuda='13.0',
|
||||||
|
numpy='2.test', precision_configuration_changed_by_component=False)
|
||||||
|
recorded = dict(gpu_uuid=w.GPU, settings_changed_by_environment_recorder=False,
|
||||||
|
matmul_allow_tf32=False, cudnn_allow_tf32=True, deterministic_algorithms=False,
|
||||||
|
cudnn_deterministic=False, cudnn_benchmark=False, float32_matmul_precision='highest',
|
||||||
|
CUBLAS_WORKSPACE_CONFIG=None, device_name='NVIDIA GeForce RTX 4090', torch_version='2.test',
|
||||||
|
torch_cuda_version='13.0', numpy_version='2.test')
|
||||||
|
w.verify_environment(recorded, component)
|
||||||
|
for key, value in [('cuda_matmul_allow_tf32', True), ('float32_matmul_precision', 'high'),
|
||||||
|
('precision_configuration_changed_by_component', True), ('cudnn_allow_tf32', False)]:
|
||||||
|
altered = dict(component, **{key: value})
|
||||||
|
with self.subTest(key=key), self.assertRaises(ValueError): w.verify_environment(recorded, altered)
|
||||||
|
with self.assertRaises(ValueError): w.verify_environment(dict(recorded, matmul_allow_tf32=0), component)
|
||||||
|
|
||||||
|
def test_npz_real_compression_measured_not_assumed(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name:
|
||||||
|
root = Path(name)
|
||||||
|
with (root / 'compressed.npz').open('xb') as stream:
|
||||||
|
np.savez_compressed(stream, v=np.zeros(50, np.float64))
|
||||||
|
measured = w.npz_storage(root / 'compressed.npz')
|
||||||
|
self.assertGreater(measured['uncompressed_entry_bytes'], measured['compressed_entry_bytes'])
|
||||||
|
self.assertEqual(measured['entries'][0]['compression'], 8)
|
||||||
|
with (root / 'stored.npz').open('xb') as stream:
|
||||||
|
np.savez(stream, v=np.zeros(50, np.float64))
|
||||||
|
with self.assertRaises(ValueError): w.npz_storage(root / 'stored.npz')
|
||||||
|
|
||||||
|
def test_resource_limit_preserves_existing_payload(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
path = Path(name) / 'payload.bin'
|
||||||
|
path.write_bytes(b'not deleted')
|
||||||
|
reg = {'budget': {'output_budget_bytes': 1, 'minimum_free_reserve_bytes': 1}}
|
||||||
|
with self.assertRaises(ValueError): w.disk_budget(reg)
|
||||||
|
self.assertEqual(path.read_bytes(), b'not deleted')
|
||||||
|
|
||||||
|
def _temporary_gate(self, root):
|
||||||
|
for name in ('audit', 'logs', 'receipts', 'runs', 'cases'):
|
||||||
|
(root / name).mkdir()
|
||||||
|
reg = {'plan': w.PLAN.build_plan(), 'budget': {'output_budget_bytes': 1 << 20,
|
||||||
|
'minimum_free_reserve_bytes': 1}}
|
||||||
|
return reg, types.SimpleNamespace(read_registration=lambda sha: copy.deepcopy(reg))
|
||||||
|
|
||||||
|
def test_controller_refuses_partial_without_rerun_or_deletion(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); reg, prep = self._temporary_gate(root)
|
||||||
|
paths = w.locations(reg['plan']['rows'][0]['row_id'])
|
||||||
|
paths['stdout'].write_bytes(b'original evidence')
|
||||||
|
with (patch.object(w, 'preparation', return_value=prep), patch.object(w, 'preflight') as pre,
|
||||||
|
patch.object(w.subprocess, 'run') as runner):
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Partial row'):
|
||||||
|
w.run_registered('a' * 64)
|
||||||
|
runner.assert_not_called(); pre.assert_not_called()
|
||||||
|
self.assertEqual(paths['stdout'].read_bytes(), b'original evidence')
|
||||||
|
self.assertFalse(paths['execution'].exists())
|
||||||
|
self.assertTrue((root / 'audit/stopped.json').exists())
|
||||||
|
|
||||||
|
def test_nonzero_worker_exit_cannot_become_completed_receipt(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); reg, prep = self._temporary_gate(root)
|
||||||
|
paths = w.locations(reg['plan']['rows'][0]['row_id'])
|
||||||
|
failure = types.SimpleNamespace(returncode=1)
|
||||||
|
with (patch.object(w, 'preparation', return_value=prep), patch.object(w, 'preflight'),
|
||||||
|
patch.object(w.subprocess, 'run', return_value=failure) as runner):
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Worker failed'):
|
||||||
|
w.run_registered('a' * 64)
|
||||||
|
self.assertEqual(runner.call_count, 1)
|
||||||
|
self.assertTrue(paths['stdout'].exists() and paths['stderr'].exists())
|
||||||
|
self.assertFalse(paths['execution'].exists())
|
||||||
|
self.assertTrue((root / 'audit/stopped.json').exists())
|
||||||
|
|
||||||
|
def test_stopped_inventory_cannot_auto_resume(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); _, prep = self._temporary_gate(root)
|
||||||
|
(root / 'audit/stopped.json').write_text('{}')
|
||||||
|
with patch.object(w, 'preparation', return_value=prep), patch.object(w.subprocess, 'run') as runner:
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Stopped/completed'):
|
||||||
|
w.run_registered('a' * 64)
|
||||||
|
runner.assert_not_called()
|
||||||
|
|
||||||
|
def _completion(self, reg, root):
|
||||||
|
entries = []
|
||||||
|
for row in reg['plan']['rows']:
|
||||||
|
path = w.locations(row['row_id'])['execution']
|
||||||
|
path.write_bytes(row['row_id'].encode())
|
||||||
|
entries.append(dict(row_id=row['row_id'], execution_sha256=w.R.digest(path), reverified_existing=False))
|
||||||
|
return dict(complete=True, registration_sha256='a' * 64, expected_calls=32, executed_ticks=11074,
|
||||||
|
training=False, learning_pass_claimed=False, completed=entries)
|
||||||
|
|
||||||
|
def test_inventory_rechecks_every_actual_receipt(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); reg, _ = self._temporary_gate(root)
|
||||||
|
complete = self._completion(reg, root)
|
||||||
|
w.R._save(root / 'audit/execution-complete.json', complete)
|
||||||
|
with patch.object(w, 'verify_execution', side_effect=lambda r, s, row: dict(row=row)) as verify:
|
||||||
|
records = w.verified_inventory(reg, 'a' * 64)
|
||||||
|
self.assertEqual(verify.call_count, 32)
|
||||||
|
self.assertEqual(list(records), [row['row_id'] for row in reg['plan']['rows']])
|
||||||
|
|
||||||
|
def test_inventory_rejects_reorder_missing_and_changed_receipt(self):
|
||||||
|
for corruption in ('reorder', 'missing', 'changed', 'claimed_training', 'wrong_ticks'):
|
||||||
|
with self.subTest(corruption=corruption), tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); reg, _ = self._temporary_gate(root)
|
||||||
|
complete = self._completion(reg, root)
|
||||||
|
if corruption == 'reorder': complete['completed'].reverse()
|
||||||
|
if corruption == 'missing': complete['completed'].pop()
|
||||||
|
if corruption == 'changed': w.locations(reg['plan']['rows'][0]['row_id'])['execution'].write_bytes(b'changed')
|
||||||
|
if corruption == 'claimed_training': complete['training'] = True
|
||||||
|
if corruption == 'wrong_ticks': complete['executed_ticks'] += 1
|
||||||
|
w.R._save(root / 'audit/execution-complete.json', complete)
|
||||||
|
with patch.object(w, 'verify_execution'), self.assertRaises(ValueError):
|
||||||
|
w.verified_inventory(reg, 'a' * 64)
|
||||||
|
|
||||||
|
def test_seal_contains_nested_manifests_and_self_checksum(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name)
|
||||||
|
(root / 'runs' / 'one').mkdir(parents=True)
|
||||||
|
(root / 'runs/one/manifest.json').write_bytes(b'nested evidence')
|
||||||
|
(root / 'payload').write_bytes(b'payload')
|
||||||
|
result = w.seal_experiment()
|
||||||
|
manifest = json.loads((root / 'manifest.json').read_text())
|
||||||
|
self.assertEqual([row['path'] for row in manifest['files']], ['payload', 'runs/one/manifest.json'])
|
||||||
|
lines = (root / 'checksums.sha256').read_text().splitlines()
|
||||||
|
self.assertIn(result['manifest_sha256'] + ' manifest.json', lines)
|
||||||
|
self.assertEqual(len(lines), 3)
|
||||||
|
self.assertEqual(result['checksums_sha256'], hashlib.sha256((root / 'checksums.sha256').read_bytes()).hexdigest())
|
||||||
|
before = (root / 'manifest.json').read_bytes()
|
||||||
|
with self.assertRaises(ValueError): w.seal_experiment()
|
||||||
|
self.assertEqual((root / 'manifest.json').read_bytes(), before)
|
||||||
|
|
||||||
|
def test_seal_rejects_bytecode_instead_of_silently_losing_it(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); (root / '__pycache__').mkdir()
|
||||||
|
(root / '__pycache__/a.pyc').write_bytes(b'cache')
|
||||||
|
with self.assertRaises(ValueError): w.seal_experiment()
|
||||||
|
self.assertFalse((root / 'manifest.json').exists())
|
||||||
|
|
||||||
|
def test_finalize_rejects_recomputed_difference_before_sealing(self):
|
||||||
|
with tempfile.TemporaryDirectory() as name, patch.object(w, 'EXP', Path(name)):
|
||||||
|
root = Path(name); _, prep = self._temporary_gate(root)
|
||||||
|
w.R._save(root / 'audit/engineering-analysis.json', dict(status='saved'))
|
||||||
|
with patch.object(w, 'evaluate', return_value=({}, {'status': 'different'})), patch.object(w, 'seal_experiment') as seal:
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Recomputed analysis'):
|
||||||
|
w.finalize('a' * 64)
|
||||||
|
seal.assert_not_called()
|
||||||
|
self.assertFalse((root / 'audit/final-status.json').exists())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,399 @@
|
|||||||
|
"""CPU synthetic checkpoint/clock tests; not a brain or GPU equivalence test."""
|
||||||
|
import ast
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import types
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import runtime_continuation as c
|
||||||
|
|
||||||
|
|
||||||
|
R = c.R
|
||||||
|
AJ = Path(__file__).resolve().parent.parent / 'apl-timing-lab-v1/gpu_timing.py'
|
||||||
|
|
||||||
|
|
||||||
|
class RingTests(unittest.TestCase):
|
||||||
|
def execute(self, start, steps, raw, phase, apl_pending, events, *, admit_global=True):
|
||||||
|
ring = c.rotate_spike_ring(raw, phase)
|
||||||
|
apl = apl_pending.copy()
|
||||||
|
due, applied = [], []
|
||||||
|
for tick in range(steps):
|
||||||
|
absolute = start + tick
|
||||||
|
ring[tick % 19] = events[absolute]
|
||||||
|
admitted = absolute >= 18 if admit_global else tick >= 18
|
||||||
|
due.append(ring[(tick - 18) % 19].copy() if admitted else np.zeros(ring.shape[1], np.uint8))
|
||||||
|
slot = tick % 18
|
||||||
|
applied.append(apl[slot].copy())
|
||||||
|
apl[slot] = np.float32(absolute + 1)
|
||||||
|
head = steps % 18
|
||||||
|
return ring, steps, np.concatenate((apl[head:], apl[:head])), np.asarray(due), np.asarray(applied)
|
||||||
|
|
||||||
|
def test_multi_segments_preserve_all_future_arrivals_and_apl_slots(self):
|
||||||
|
rng = np.random.default_rng(193)
|
||||||
|
events = rng.integers(0, 2, (80, 4), dtype=np.uint8)
|
||||||
|
initial, pending = np.zeros((19, 4), np.uint8), np.zeros((18, 2), np.float32)
|
||||||
|
full = self.execute(0, 80, initial, 0, pending, events)
|
||||||
|
for lengths in ((5, 13, 1, 22, 39), (17, 1, 1, 18, 43), (19, 19, 19, 23), (1,) * 80):
|
||||||
|
ring, phase, tail, offset, due, applied = initial, 0, pending, 0, [], []
|
||||||
|
for steps in lengths:
|
||||||
|
ring, phase, tail, d, a = self.execute(offset, steps, ring, phase, tail, events)
|
||||||
|
due.append(d); applied.append(a); offset += steps
|
||||||
|
np.testing.assert_array_equal(np.concatenate(due), full[3])
|
||||||
|
np.testing.assert_array_equal(np.concatenate(applied), full[4])
|
||||||
|
np.testing.assert_array_equal(c.rotate_spike_ring(ring, phase), c.rotate_spike_ring(full[0], 80))
|
||||||
|
np.testing.assert_array_equal(tail, full[2])
|
||||||
|
|
||||||
|
def test_parent_shorter_than_delay_needs_global_admission(self):
|
||||||
|
events = np.zeros((24, 2), np.uint8); events[0, 1] = 1
|
||||||
|
parent = self.execute(0, 5, np.zeros((19, 2), np.uint8), 0, np.zeros((18, 2), np.float32), events)
|
||||||
|
child = self.execute(5, 19, *parent[:3], events)
|
||||||
|
wrong = self.execute(5, 19, *parent[:3], events, admit_global=False)
|
||||||
|
self.assertEqual(child[3][13, 1], 1) # absolute tick 18, local 13
|
||||||
|
self.assertEqual(wrong[3][13, 1], 0)
|
||||||
|
|
||||||
|
def test_local_tick_zero_request_uses_global_clock_and_ring_phase(self):
|
||||||
|
events = np.zeros((50, 3), np.uint8)
|
||||||
|
events[19, 2] = 1 # Synthetic US request at child's local tick zero.
|
||||||
|
first = self.execute(0, 19, np.zeros((19, 3), np.uint8), 0, np.zeros((18, 2), np.float32), events)
|
||||||
|
child = self.execute(19, 31, *first[:3], events)
|
||||||
|
self.assertEqual(child[3][18, 2], 1)
|
||||||
|
self.assertEqual(np.count_nonzero(child[3][:18, 2]), 0)
|
||||||
|
|
||||||
|
def test_rotation_is_copy_and_rejects_invalid_ring(self):
|
||||||
|
raw = np.zeros((19, 2), np.uint8); raw[18, 1] = 1
|
||||||
|
before = raw.tobytes()
|
||||||
|
result = c.rotate_spike_ring(raw, 19)
|
||||||
|
result[:] = 1
|
||||||
|
self.assertEqual(raw.tobytes(), before)
|
||||||
|
for value, phase in ((raw.astype(np.int32), 0), (raw[:18], 0), (raw, -1), (raw, True)):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
c.rotate_spike_ring(value, phase)
|
||||||
|
|
||||||
|
|
||||||
|
class ASTTests(unittest.TestCase):
|
||||||
|
def test_only_restore_and_global_admission_edits_in_both_modes(self):
|
||||||
|
for mode in ('light', 'reference'):
|
||||||
|
tree, audit = c.derive_continued(AJ.read_bytes(), mode)
|
||||||
|
self.assertTrue(audit['full_AST_rollback_identical'])
|
||||||
|
self.assertTrue(audit['kernels_sorting_and_local_ring_math_unchanged'])
|
||||||
|
self.assertEqual(sum(isinstance(node, ast.If) and ast.unparse(node.test) == c.CLOCK_NEW for node in ast.walk(tree)), 1)
|
||||||
|
self.assertEqual(sum(isinstance(node, ast.Expr) and ast.unparse(node) == c.RESTORE for node in ast.walk(tree)), 1)
|
||||||
|
compile(tree, '<pure continuation AST>', 'exec')
|
||||||
|
|
||||||
|
def test_reference_loop_diff_is_exactly_admission_condition(self):
|
||||||
|
base, _ = R.derive_ast(AJ.read_bytes(), 'reference')
|
||||||
|
actual, _ = c.derive_continued(AJ.read_bytes(), 'reference')
|
||||||
|
loops = lambda tree: next(node for node in ast.walk(tree) if isinstance(node, ast.For) and
|
||||||
|
isinstance(node.target, ast.Name) and node.target.id == 'tick')
|
||||||
|
modified = copy.deepcopy(loops(actual))
|
||||||
|
changed = [node for node in ast.walk(modified) if isinstance(node, ast.If) and ast.unparse(node.test) == c.CLOCK_NEW]
|
||||||
|
changed[0].test = ast.parse(c.CLOCK_OLD, mode='eval').body
|
||||||
|
self.assertEqual(R._dump(modified), R._dump(loops(base)))
|
||||||
|
|
||||||
|
def test_compile_never_mutates_sealed_module_namespace(self):
|
||||||
|
module = types.ModuleType('fake_aj'); module.__file__ = str(AJ)
|
||||||
|
original = dict(module.__dict__)
|
||||||
|
runtime = types.SimpleNamespace(write_json=lambda *_: None, audit_sequence=lambda *_: None)
|
||||||
|
function, _ = c.compile_continued(module, runtime, 'light')
|
||||||
|
self.assertEqual(module.__dict__, original)
|
||||||
|
self.assertEqual(function.__globals__['__file__'], str(Path(c.__file__).resolve()))
|
||||||
|
self.assertIs(function.__globals__['_continuation'], runtime)
|
||||||
|
|
||||||
|
|
||||||
|
class ArrayTarget:
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = np.array(value, copy=True)
|
||||||
|
|
||||||
|
def copy_(self, value):
|
||||||
|
self.value[...] = value
|
||||||
|
|
||||||
|
def any(self):
|
||||||
|
return np.asarray(self.value.any())
|
||||||
|
|
||||||
|
|
||||||
|
class RestoreTests(unittest.TestCase):
|
||||||
|
def test_reference_fifo_audit_preserves_carried_bits_for_short_segment(self):
|
||||||
|
initial = np.arange(36, dtype=np.float32).reshape(18, 2)
|
||||||
|
initial[0, 0] = np.float32(-0.)
|
||||||
|
generated = np.arange(10, dtype=np.float32).reshape(5, 2)
|
||||||
|
joined = np.concatenate((initial, generated))
|
||||||
|
applied, pending = joined[:5], joined[5:]
|
||||||
|
result = c.audit_carried_sequence(generated, applied, pending, initial)
|
||||||
|
self.assertTrue(result['sample_bits_preserved'])
|
||||||
|
bad = applied.copy(); bad[0, 0] = np.float32(0.)
|
||||||
|
with self.assertRaisesRegex(ValueError, 'bitwise'):
|
||||||
|
c.audit_carried_sequence(generated, bad, pending, initial)
|
||||||
|
|
||||||
|
def test_timing_counts_and_ranges_use_absolute_clock_not_segment_length(self):
|
||||||
|
obj = object.__new__(c.ContinuedRuntime)
|
||||||
|
obj.global_offset, obj.spec, obj.mode = 41, {'steps': 5}, 'reference'
|
||||||
|
obj.parent = {'terminal': {'apl_pending': np.zeros((18, 4064), np.float32)}}
|
||||||
|
result = obj._timing_metadata({'pending_generated_count': 5, 'pending_initial_zero_prefix': 13,
|
||||||
|
'initial_padding_positive_zero': True})
|
||||||
|
self.assertEqual(result['pending_generated_count'], 18)
|
||||||
|
self.assertEqual(result['pending_initial_zero_prefix'], 0)
|
||||||
|
self.assertEqual(result['pending_application_tick_start'], 46)
|
||||||
|
self.assertEqual(result['pending_generated_tick_start'], 28)
|
||||||
|
self.assertEqual(result['pending_segment_generated_rows'], 5)
|
||||||
|
self.assertEqual(result['pending_parent_generated_rows'], 13)
|
||||||
|
self.assertEqual(result['applied_parent_generated_rows'], 5)
|
||||||
|
self.assertNotIn('initial_padding_positive_zero', result)
|
||||||
|
|
||||||
|
def test_restore_carries_exact_state_and_queues_but_not_segment_counts(self):
|
||||||
|
parent = {'global_next_tick': 41, 'state': {'v': np.array([-.05, -.04], np.float64),
|
||||||
|
'g': np.array([-0., -.002], np.float64), 'ref': np.array([22, 3], np.int32)},
|
||||||
|
'terminal': {'spike_ring': np.zeros((19, 2), np.uint8), 'next_tick': np.asarray(5, np.int64),
|
||||||
|
'apl_pending': np.arange(36, dtype=np.float32).reshape(18, 2), 'apl_state': np.array([2., 3.], np.float32)}}
|
||||||
|
parent['terminal']['spike_ring'][4, 1] = 1
|
||||||
|
obj = object.__new__(c.ContinuedRuntime)
|
||||||
|
obj.parent, obj.installations, obj.restorations = parent, 1, 0
|
||||||
|
obj.torch = types.SimpleNamespace(float64=np.float64, float32=np.float32, int32=np.int32, uint8=np.uint8)
|
||||||
|
v, g, ref, counts = (ArrayTarget(np.zeros(2, dtype)) for dtype in (np.float64, np.float64, np.int32, np.int32))
|
||||||
|
ring, apl_ring = ArrayTarget(np.zeros((19, 2), np.uint8)), ArrayTarget(np.zeros((18, 2), np.float32))
|
||||||
|
apl = types.SimpleNamespace(state=ArrayTarget(np.zeros(2, np.float32)))
|
||||||
|
upload = lambda value, dtype: np.array(value, dtype=dtype, copy=True)
|
||||||
|
obj.restore(v, g, ref, counts, ring, apl_ring, apl, upload)
|
||||||
|
self.assertEqual(g.value.tobytes(), parent['state']['g'].tobytes())
|
||||||
|
np.testing.assert_array_equal(ref.value, parent['state']['ref'])
|
||||||
|
np.testing.assert_array_equal(counts.value, [0, 0])
|
||||||
|
np.testing.assert_array_equal(ring.value, c.rotate_spike_ring(parent['terminal']['spike_ring'], 5))
|
||||||
|
np.testing.assert_array_equal(apl_ring.value, parent['terminal']['apl_pending'])
|
||||||
|
np.testing.assert_array_equal(apl.state.value, parent['terminal']['apl_state'])
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
obj.restore(v, g, ref, counts, ring, apl_ring, apl, upload)
|
||||||
|
|
||||||
|
|
||||||
|
class CheckpointTests(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.tmp = tempfile.TemporaryDirectory()
|
||||||
|
self.root = Path(self.tmp.name).resolve()
|
||||||
|
self.n = patch.object(c, 'N', 4); self.e = patch.object(c, 'E', 6)
|
||||||
|
self.n.start(); self.e.start()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.e.stop(); self.n.stop(); self.tmp.cleanup()
|
||||||
|
|
||||||
|
def save(self, path, value):
|
||||||
|
R._save(path, value)
|
||||||
|
|
||||||
|
def make(self, name, steps=5, parent=None, corrupt_carry=None):
|
||||||
|
directory = self.root / name; directory.mkdir()
|
||||||
|
inputs = self.root / (name + '-inputs'); inputs.mkdir()
|
||||||
|
spec = {'steps': steps}
|
||||||
|
if parent is not None:
|
||||||
|
spec['parent_checkpoint_manifest_sha256'] = parent['manifest_sha256']
|
||||||
|
self.save(inputs / 'spec.json', spec)
|
||||||
|
overlay_bytes = b'synthetic-bound-overlay-not-a-brain'
|
||||||
|
(inputs / 'overlay.npz').write_bytes(overlay_bytes)
|
||||||
|
meta = {'overlay_sha256': R.digest(inputs / 'overlay.npz'), 'mask_sha256': R.MASK_SHA,
|
||||||
|
'base_candidate_sha256': 'b' * 64}
|
||||||
|
self.save(inputs / 'overlay-manifest.json', meta)
|
||||||
|
(directory / 'overlay-input.npz').write_bytes(overlay_bytes)
|
||||||
|
self.save(directory / 'overlay-manifest.json', meta)
|
||||||
|
event_tick, event_neuron = np.array([0], np.int32), np.array([1], np.int32)
|
||||||
|
counts = np.array([0, 1, 0, 0], np.int32)
|
||||||
|
state = {'step': event_tick, 'neuron_idx': event_neuron, 'counts': counts,
|
||||||
|
'v': np.full(4, -.052, np.float64), 'g': np.array([-0., -.003, 0., 1.], np.float64),
|
||||||
|
'ref': np.array([0, 22, 3, 0], np.int32)}
|
||||||
|
ring = np.zeros((19, 4), np.uint8) if parent is None else c.rotate_spike_ring(parent['terminal']['spike_ring'], parent['steps'])
|
||||||
|
for tick in range(steps):
|
||||||
|
ring[tick % 19] = 0
|
||||||
|
if tick == 0:
|
||||||
|
ring[0, 1] = 1
|
||||||
|
pending = np.zeros((18, 4064), np.float32)
|
||||||
|
if corrupt_carry == 'spike':
|
||||||
|
ring[18, 0] ^= np.uint8(1)
|
||||||
|
elif corrupt_carry == 'apl':
|
||||||
|
pending[0, 0] = np.float32(1.)
|
||||||
|
terminal = {'spike_ring': ring, 'apl_pending': pending, 'apl_state': np.array([1., 2.], np.float32),
|
||||||
|
'next_tick': np.asarray(steps, np.int64)}
|
||||||
|
np.savez_compressed(directory / 'state.npz', **state)
|
||||||
|
np.savez_compressed(directory / 'terminal-queues.npz', **terminal)
|
||||||
|
np.save(directory / 'apl-pending-tail.float32.npy', pending)
|
||||||
|
self.save(directory / 'apl-timing-audit.json', {'apl_delay_steps': 18, 'brain_tail_advanced': False,
|
||||||
|
'pending_raw_sha256': R._raw(pending), 'final_apl_state_u32_bits': terminal['apl_state'].view(np.uint32).tolist()})
|
||||||
|
offset = 0 if parent is None else parent['global_next_tick']
|
||||||
|
summary = {'complete': True, 'pass_all': True, 'all_finite': True, 'steps': steps, 'completed_ticks': steps,
|
||||||
|
'nodes': 4, 'edges': 6, 'precision': 'float64', 'apl_precision': 'float32',
|
||||||
|
'within_trial_weight_updates': False, 'checkpoint_continuation_used': parent is not None,
|
||||||
|
'effective_weights_raw_sha256': 'e'*64, 'global_tick_offset': offset, 'global_next_tick': offset + steps,
|
||||||
|
'input_sha256': {'spec.json': R.digest(inputs / 'spec.json')}}
|
||||||
|
if parent is not None:
|
||||||
|
summary['parent_checkpoint_manifest_sha256'] = parent['manifest_sha256']
|
||||||
|
self.save(directory / 'summary.json', summary)
|
||||||
|
self.save(directory / 'finite-audit.json', {'all_finite': True, 'first_failure_tick': -1, 'finite_observed_ticks': steps})
|
||||||
|
self.save(directory / 'overlay-audit.json', {'complete': True, 'weights_updated_during_run': False,
|
||||||
|
'effective_weights_raw_sha256': 'e'*64, 'mask_sha256': R.MASK_SHA, 'am_helper_sha256': R.AM_OVERLAY_SHA,
|
||||||
|
'base_candidate_sha256': 'b'*64})
|
||||||
|
provenance = {'schema': 'phase4an-reporting-adapter-v1' if parent is None else 'phase4an-continuation-runtime-v1',
|
||||||
|
'complete': True, 'weights_updated_during_run': False, 'old_globals_patched': False,
|
||||||
|
'source_file': R.__file__ if parent is None else c.__file__,
|
||||||
|
'source_sha256': c.LIGHT_SHA if parent is None else R.digest(c.__file__),
|
||||||
|
'input_sha256': {str(path): R.digest(path) for path in inputs.iterdir()}}
|
||||||
|
if parent is not None:
|
||||||
|
provenance.update(parent_checkpoint_manifest_sha256=parent['manifest_sha256'],
|
||||||
|
global_tick_offset=offset, global_next_tick=offset + steps)
|
||||||
|
for key, file in (('summary_sha256', 'summary.json'), ('finite_audit_sha256', 'finite-audit.json'),
|
||||||
|
('terminal_queues_sha256', 'terminal-queues.npz'), ('overlay_audit_sha256', 'overlay-audit.json'),
|
||||||
|
('state_sha256', 'state.npz')):
|
||||||
|
provenance[key] = R.digest(directory / file)
|
||||||
|
self.save(directory / 'runtime-provenance.json', provenance)
|
||||||
|
if parent is not None:
|
||||||
|
self.save(directory / c.RECEIPT, {'schema': 'phase4an-continuation-receipt-v1', 'complete': True,
|
||||||
|
'parent_checkpoint_dir': str(parent['directory']), 'parent_checkpoint_manifest_sha256': parent['manifest_sha256'],
|
||||||
|
'segment_steps': steps, 'counts_scope': 'segment_only_not_lifetime', 'weights_updated_during_run': False,
|
||||||
|
'global_tick_offset': offset, 'global_next_tick': offset + steps, 'payload_sha256': c._tree_hashes(directory)})
|
||||||
|
return directory
|
||||||
|
|
||||||
|
def test_fresh_seal_is_exclusive_and_binds_state_bytes(self):
|
||||||
|
directory = self.make('fresh')
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
loaded = c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
self.assertEqual(loaded['global_next_tick'], 5)
|
||||||
|
self.assertEqual(loaded['state']['g'].tobytes(), np.array([-0., -.003, 0., 1.], np.float64).tobytes())
|
||||||
|
self.assertIn('state.npz', sealed['files_sha256'])
|
||||||
|
self.assertFalse(sealed['pre_seal_state_integrity_independently_proven'])
|
||||||
|
with self.assertRaisesRegex(ValueError, 'already sealed'):
|
||||||
|
c.seal_checkpoint(directory)
|
||||||
|
with (directory / 'state.npz').open('ab') as stream:
|
||||||
|
stream.write(b'tampered')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'inventory/hash'):
|
||||||
|
c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
|
||||||
|
def test_multisegment_receipts_bind_absolute_offset_and_local_phase(self):
|
||||||
|
parent = None
|
||||||
|
total = 0
|
||||||
|
for i, steps in enumerate((5, 13, 1, 19)):
|
||||||
|
directory = self.make('segment-' + str(i), steps, parent)
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
parent = c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
total += steps
|
||||||
|
self.assertEqual(parent['global_next_tick'], total)
|
||||||
|
self.assertEqual(parent['terminal']['next_tick'].item(), steps)
|
||||||
|
self.assertEqual(parent['ancestry_directories'], [self.root / ('segment-' + str(j)) for j in range(i, -1, -1)])
|
||||||
|
self.assertEqual(total, 38)
|
||||||
|
|
||||||
|
def test_run_rejects_output_and_build_in_every_ancestor_before_overlay_or_gpu(self):
|
||||||
|
parent = None
|
||||||
|
for i in range(3):
|
||||||
|
directory = self.make('ancestor-' + str(i), 20, parent)
|
||||||
|
seal = c.seal_checkpoint(directory)
|
||||||
|
parent = c.load_checkpoint(directory, seal['sha256'])
|
||||||
|
case = self.root / 'next-case'; case.mkdir()
|
||||||
|
self.save(case / 'spec.json', {'max_steps': 5, 'steps': 5, 'dt_ms': .1, 'duration_ms': .5,
|
||||||
|
'apl_delay_steps': 18, 'record_history': False,
|
||||||
|
'parent_checkpoint_manifest_sha256': parent['manifest_sha256']})
|
||||||
|
before = {path: c._tree_hashes(path) for path in parent['ancestry_directories']}
|
||||||
|
with patch.object(R, 'load_overlay', side_effect=AssertionError('Overlay/GPU preparation must not begin')) as overlay:
|
||||||
|
for ancestor in parent['ancestry_directories']:
|
||||||
|
for forbidden in (ancestor, ancestor / 'new-child'):
|
||||||
|
for output, build in ((forbidden, self.root / 'safe-build'), (self.root / 'safe-output', forbidden)):
|
||||||
|
with self.subTest(ancestor=ancestor.name, output=output, build=build), self.assertRaises(ValueError):
|
||||||
|
c.run_continued(case, output, build, self.root / 'unused-overlay.npz',
|
||||||
|
self.root / 'unused-manifest.json', parent['directory'])
|
||||||
|
overlay.assert_not_called()
|
||||||
|
self.assertEqual(before, {path: c._tree_hashes(path) for path in parent['ancestry_directories']})
|
||||||
|
self.assertFalse((self.root / 'safe-output').exists())
|
||||||
|
self.assertFalse((self.root / 'safe-build').exists())
|
||||||
|
|
||||||
|
def test_reject_bad_external_pin_extra_file_and_error_marker(self):
|
||||||
|
directory = self.make('fresh')
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
with self.assertRaisesRegex(ValueError, 'external pin'):
|
||||||
|
c.load_checkpoint(directory, '0' * 64)
|
||||||
|
(directory / 'unexpected.bin').write_bytes(b'extra')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'inventory/hash'):
|
||||||
|
c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
failure = self.make('failure')
|
||||||
|
self.save(failure / 'runtime-error.json', {'complete': False})
|
||||||
|
with self.assertRaisesRegex(ValueError, 'failure/error'):
|
||||||
|
c.seal_checkpoint(failure)
|
||||||
|
|
||||||
|
def test_self_consistent_receipts_do_not_hide_unwritten_carry_slot_corruption(self):
|
||||||
|
directory = self.make('parent', 20)
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
parent = c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
for kind, message in (('spike', 'carried spike'), ('apl', 'carried APL')):
|
||||||
|
child = self.make('bad-' + kind, 5, parent, corrupt_carry=kind)
|
||||||
|
# The synthetic writer hashes its incorrect output consistently;
|
||||||
|
# the independent parent-to-child carry invariant must still reject.
|
||||||
|
with self.subTest(kind=kind), self.assertRaisesRegex(ValueError, message):
|
||||||
|
c.seal_checkpoint(child)
|
||||||
|
|
||||||
|
def test_reject_partial_receipt_and_modified_original_input(self):
|
||||||
|
directory = self.make('bad-receipt')
|
||||||
|
(directory / 'summary.json').write_text('{}', encoding='utf-8')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
c.seal_checkpoint(directory)
|
||||||
|
directory = self.make('modified-input')
|
||||||
|
(self.root / 'modified-input-inputs' / 'spec.json').write_text('{}', encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'input/source'):
|
||||||
|
c.seal_checkpoint(directory)
|
||||||
|
|
||||||
|
def test_descendant_rejects_mutated_ancestor_even_if_own_files_are_unchanged(self):
|
||||||
|
directory = self.make('ancestor', 20)
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
parent = c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
child = self.make('descendant', 5, parent)
|
||||||
|
child_seal = c.seal_checkpoint(child)
|
||||||
|
with (directory / 'state.npz').open('ab') as stream:
|
||||||
|
stream.write(b'ancestor changed after child seal')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'inventory/hash'):
|
||||||
|
c.load_checkpoint(child, child_seal['sha256'])
|
||||||
|
|
||||||
|
def test_self_consistent_hashes_cannot_hide_parent_pin_or_weight_disagreement(self):
|
||||||
|
directory = self.make('bound-parent', 20)
|
||||||
|
sealed = c.seal_checkpoint(directory)
|
||||||
|
parent = c.load_checkpoint(directory, sealed['sha256'])
|
||||||
|
def rewrite(path, value):
|
||||||
|
path.write_text(json.dumps(value, sort_keys=True), encoding='utf-8')
|
||||||
|
for kind in ('case', 'summary', 'provenance', 'weights'):
|
||||||
|
child = self.make('bound-child-' + kind, 5, parent)
|
||||||
|
spec_path = self.root / ('bound-child-' + kind + '-inputs') / 'spec.json'
|
||||||
|
summary = R._read_json(child / 'summary.json')
|
||||||
|
provenance = R._read_json(child / 'runtime-provenance.json')
|
||||||
|
if kind == 'case':
|
||||||
|
spec = R._read_json(spec_path); spec['parent_checkpoint_manifest_sha256'] = '0' * 64
|
||||||
|
rewrite(spec_path, spec)
|
||||||
|
summary['input_sha256']['spec.json'] = R.digest(spec_path)
|
||||||
|
provenance['input_sha256'][str(spec_path)] = R.digest(spec_path)
|
||||||
|
elif kind in ('summary', 'provenance'):
|
||||||
|
target = summary if kind == 'summary' else provenance
|
||||||
|
target['parent_checkpoint_manifest_sha256'] = '0' * 64
|
||||||
|
else:
|
||||||
|
summary['effective_weights_raw_sha256'] = 'f' * 64
|
||||||
|
audit = R._read_json(child / 'overlay-audit.json'); audit['effective_weights_raw_sha256'] = 'f' * 64
|
||||||
|
rewrite(child / 'overlay-audit.json', audit)
|
||||||
|
provenance['overlay_audit_sha256'] = R.digest(child / 'overlay-audit.json')
|
||||||
|
rewrite(child / 'summary.json', summary)
|
||||||
|
provenance['summary_sha256'] = R.digest(child / 'summary.json')
|
||||||
|
rewrite(child / 'runtime-provenance.json', provenance)
|
||||||
|
receipt = R._read_json(child / c.RECEIPT)
|
||||||
|
receipt['payload_sha256'] = c._tree_hashes(child); receipt['payload_sha256'].pop(c.RECEIPT)
|
||||||
|
rewrite(child / c.RECEIPT, receipt)
|
||||||
|
# All individual byte hashes are now consistent. Only semantic
|
||||||
|
# cross-receipt binding or parent/child weight equality rejects it.
|
||||||
|
with self.subTest(kind=kind), self.assertRaisesRegex(ValueError, 'weights changed|pin disagrees'):
|
||||||
|
c.seal_checkpoint(child)
|
||||||
|
|
||||||
|
def test_reject_invalid_state_dtype_events_ref_and_ring(self):
|
||||||
|
directory = self.make('arrays')
|
||||||
|
state = c._npz(directory / 'state.npz', ('step', 'neuron_idx', 'counts', 'v', 'g', 'ref'))
|
||||||
|
terminal = c._npz(directory / 'terminal-queues.npz', ('spike_ring', 'apl_state', 'apl_pending', 'next_tick'))
|
||||||
|
for key, value in (('v', state['v'].astype(np.float32)), ('g', np.full(4, np.nan)),
|
||||||
|
('ref', np.full(4, 23, np.int32)), ('step', np.array([5], np.int32)),
|
||||||
|
('counts', np.zeros(4, np.int32))):
|
||||||
|
with self.subTest(key=key), self.assertRaises(ValueError):
|
||||||
|
c.validate_state(dict(state, **{key: value}), terminal, 5, fresh=True)
|
||||||
|
bad = dict(terminal, spike_ring=terminal['spike_ring'].copy()); bad['spike_ring'][0, 1] = 0
|
||||||
|
with self.assertRaisesRegex(ValueError, 'emitted'):
|
||||||
|
c.validate_state(state, bad, 5, fresh=True)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,298 @@
|
|||||||
|
"""Synthetic AST/array diagnostics only. No real brain/GPU or old-file writes."""
|
||||||
|
import ast
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
import tempfile
|
||||||
|
import types
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import runtime_light as r
|
||||||
|
|
||||||
|
|
||||||
|
AJ = Path(__file__).absolute().parent.parent / 'apl-timing-lab-v1/gpu_timing.py'
|
||||||
|
AM = Path(__file__).absolute().parent.parent / 'wholebrain-plastic-interface-v1/overlay.py'
|
||||||
|
|
||||||
|
|
||||||
|
class ScalarTensor:
|
||||||
|
"""Tiny NumPy scalar stub for diagnostic algebra, not a neuron simulator."""
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = np.asarray(value)
|
||||||
|
|
||||||
|
def logical_and_(self, other):
|
||||||
|
self.value = self.value & other.value
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __lt__(self, other):
|
||||||
|
return ScalarTensor(self.value < other)
|
||||||
|
|
||||||
|
def __and__(self, other):
|
||||||
|
return ScalarTensor(self.value & other.value)
|
||||||
|
|
||||||
|
def __invert__(self):
|
||||||
|
return ScalarTensor(~self.value)
|
||||||
|
|
||||||
|
def all(self):
|
||||||
|
return ScalarTensor(self.value.all())
|
||||||
|
|
||||||
|
def item(self):
|
||||||
|
return self.value.item()
|
||||||
|
|
||||||
|
|
||||||
|
class TorchScalars:
|
||||||
|
bool, int64 = np.bool_, np.int64
|
||||||
|
ones = staticmethod(lambda shape, device, dtype: ScalarTensor(np.ones(shape, dtype)))
|
||||||
|
zeros = staticmethod(lambda shape, device, dtype: ScalarTensor(np.zeros(shape, dtype)))
|
||||||
|
full = staticmethod(lambda shape, value, device, dtype: ScalarTensor(np.full(shape, value, dtype)))
|
||||||
|
ones_like = staticmethod(lambda value: ScalarTensor(np.ones_like(value.value)))
|
||||||
|
full_like = staticmethod(lambda value, fill: ScalarTensor(np.full_like(value.value, fill)))
|
||||||
|
isfinite = staticmethod(lambda value: ScalarTensor(np.isfinite(value)))
|
||||||
|
where = staticmethod(lambda condition, first, other: ScalarTensor(np.where(condition.value, first.value, other.value)))
|
||||||
|
|
||||||
|
|
||||||
|
class AstTests(unittest.TestCase):
|
||||||
|
def source(self):
|
||||||
|
if not AJ.is_file():
|
||||||
|
self.skipTest('Original pinned AJ source is not installed')
|
||||||
|
return AJ.read_bytes()
|
||||||
|
|
||||||
|
def test_math_projection_equal_light_and_reference_and_guard_explicit(self):
|
||||||
|
for mode in ('light', 'reference'):
|
||||||
|
tree, audit = r.derive_ast(self.source(), mode)
|
||||||
|
self.assertTrue(audit['mathematical_ast_identical'])
|
||||||
|
self.assertEqual(audit['math_ast_sha256'], audit['derived_math_ast_sha256'])
|
||||||
|
self.assertIn("spec['max_steps']", ast.unparse(tree.body[0]))
|
||||||
|
compile(tree, '<synthetic-AST-check>', 'exec')
|
||||||
|
|
||||||
|
def test_reference_entire_tick_loop_remains_identical(self):
|
||||||
|
source = ast.parse(self.source())
|
||||||
|
original = next(node for node in source.body if isinstance(node, ast.FunctionDef) and node.name == 'run_gpu')
|
||||||
|
tree, _ = r.derive_ast(self.source(), 'reference')
|
||||||
|
tick = lambda f: next(n for n in ast.walk(f) if isinstance(n, ast.For) and isinstance(n.target, ast.Name) and n.target.id == 'tick')
|
||||||
|
self.assertEqual(r._dump(tick(original)), r._dump(tick(tree.body[-1])))
|
||||||
|
|
||||||
|
def test_light_retains_events_requests_kernels_and_no_full_state_cpu_copy(self):
|
||||||
|
tree, _ = r.derive_ast(self.source(), 'light')
|
||||||
|
function = tree.body[-1]
|
||||||
|
tick = next(n for n in ast.walk(function) if isinstance(n, ast.For) and isinstance(n.target, ast.Name) and n.target.id == 'tick')
|
||||||
|
text = ast.unparse(tick)
|
||||||
|
for expected in ('ext.state_step', 'ext.fill_edges', 'ext.apply_arrivals', 'apl.advance',
|
||||||
|
'event_steps.append', 'event_nodes.append', 'writer.writerows', '_runtime.after_tick',
|
||||||
|
'apl_ring[slot].clone()', 'apl_ring[slot].copy_(h)'):
|
||||||
|
self.assertIn(expected, text)
|
||||||
|
for forbidden in ('v.cpu()', 'g.cpu()', 'ref.cpu()', 'drive.cpu()', 'h.cpu()', 'queue_summary(',
|
||||||
|
'queue_output', 'hash_output', 'np.isfinite'):
|
||||||
|
self.assertNotIn(forbidden, text)
|
||||||
|
|
||||||
|
def test_altered_math_is_detected_and_source_pin_rejects_comments(self):
|
||||||
|
tree, audit = r.derive_ast(self.source(), 'light')
|
||||||
|
function = copy.deepcopy(tree.body[-1])
|
||||||
|
node = next(n for n in ast.walk(function) if isinstance(n, ast.Assign) and
|
||||||
|
ast.unparse(n) == 'g[kc_local_gpu] = g[kc_local_gpu] - delta_si')
|
||||||
|
node.value.op = ast.Add()
|
||||||
|
self.assertNotEqual(r.math_projection(function), r.math_projection(tree.body[-1]))
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
r.derive_ast(self.source() + b'\n# altered\n', 'light')
|
||||||
|
|
||||||
|
def test_fresh_namespace_no_fake_file_no_old_globals_changed(self):
|
||||||
|
self.source()
|
||||||
|
module = types.ModuleType('synthetic_AJ')
|
||||||
|
module.__file__ = str(AJ)
|
||||||
|
module.marker = object()
|
||||||
|
before = dict(module.__dict__)
|
||||||
|
runtime = types.SimpleNamespace(write_json=lambda *_: None)
|
||||||
|
function, audit = r.compile_runtime(module, runtime, 'light')
|
||||||
|
self.assertEqual(before, module.__dict__)
|
||||||
|
self.assertEqual(function.__globals__['__file__'], str(Path(r.__file__).absolute()))
|
||||||
|
self.assertNotEqual(function.__globals__['__file__'], str(AJ))
|
||||||
|
self.assertFalse(audit['old_globals_patched'])
|
||||||
|
|
||||||
|
|
||||||
|
class ContractTests(unittest.TestCase):
|
||||||
|
def spec(self, steps=1200):
|
||||||
|
return dict(max_steps=steps, steps=steps, dt_ms=.1, duration_ms=steps*.1,
|
||||||
|
apl_delay_steps=18, record_history=False)
|
||||||
|
|
||||||
|
def test_directory_parent_traversal_cannot_bypass_input_or_source_boundaries(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve()
|
||||||
|
case, models, graph, bundle = (root / name for name in ('case', 'models', 'graph', 'bundle'))
|
||||||
|
for path in (case, models, graph, bundle, root / 'new'):
|
||||||
|
path.mkdir()
|
||||||
|
safe = root / 'new'
|
||||||
|
for protected in (case, models, graph, bundle):
|
||||||
|
alias = safe / '..' / protected.name / 'cache'
|
||||||
|
for output, build in ((alias, safe / 'build'), (safe / 'out', alias)):
|
||||||
|
with self.subTest(protected=protected.name, output=output), self.assertRaisesRegex(ValueError, 'cannot write'):
|
||||||
|
r.execution_paths(case, output, build, (models, graph, bundle))
|
||||||
|
actual = r.execution_paths(case, safe / '..' / 'safe-output', safe / '..' / 'safe-build', (models, graph, bundle))
|
||||||
|
self.assertEqual(actual, (case, root / 'safe-output', root / 'safe-build'))
|
||||||
|
self.assertFalse((root / 'safe-output').exists())
|
||||||
|
self.assertFalse((root / 'safe-build').exists())
|
||||||
|
|
||||||
|
def test_directory_link_alias_cannot_bypass_protected_boundary(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root = Path(directory).resolve()
|
||||||
|
case, models = root / 'case', root / 'models'
|
||||||
|
case.mkdir(); models.mkdir()
|
||||||
|
alias = root / 'alias-to-models'
|
||||||
|
try:
|
||||||
|
alias.symlink_to(models, target_is_directory=True)
|
||||||
|
except (OSError, NotImplementedError) as error:
|
||||||
|
self.skipTest('Directory symlink unavailable on this host: ' + str(error))
|
||||||
|
for output, build in ((alias / 'out', root / 'build'), (root / 'out', alias / 'build')):
|
||||||
|
with self.subTest(output=output), self.assertRaisesRegex(ValueError, 'cannot write'):
|
||||||
|
r.execution_paths(case, output, build, (models,))
|
||||||
|
# A protected root supplied through an alias is also canonicalized.
|
||||||
|
with self.assertRaisesRegex(ValueError, 'cannot write'):
|
||||||
|
r.execution_paths(case, root / 'out', models / 'build', (alias,))
|
||||||
|
|
||||||
|
def test_explicit_bounds_1000_1200_retention_no_hidden_duration(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
for steps in (1000, 1200, 100000):
|
||||||
|
self.assertEqual(r.validate_spec(self.spec(steps), directory)['steps'], steps)
|
||||||
|
for update in ({'max_steps': 999}, {'max_steps': True}, {'steps': 1200.},
|
||||||
|
{'duration_ms': 100.}, {'dt_ms': .2}, {'apl_delay_steps': 0},
|
||||||
|
{'within_trial_weight_updates': True}, {'checkpoint': None}):
|
||||||
|
with self.subTest(update=update), self.assertRaises(ValueError):
|
||||||
|
r.validate_spec(dict(self.spec(), **update), directory)
|
||||||
|
Path(directory, 'arrays.npz').write_bytes(b'unsupported checkpoint')
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
r.validate_spec(self.spec(), directory)
|
||||||
|
|
||||||
|
def test_finite_observer_remembers_nan_that_later_disappears(self):
|
||||||
|
observer = r.FiniteObserver(TorchScalars, 'CPU-test-stub')
|
||||||
|
initial = np.array([1., -2.], np.float64)
|
||||||
|
saved = initial.tobytes()
|
||||||
|
observer.observe(0, initial)
|
||||||
|
observer.observe(1, np.array([np.nan], np.float32))
|
||||||
|
observer.observe(2, np.array([0.], np.float64))
|
||||||
|
result = observer.result()
|
||||||
|
self.assertFalse(result['all_finite'])
|
||||||
|
self.assertEqual(result['first_failure_tick'], 1)
|
||||||
|
self.assertEqual(result['finite_observed_ticks'], 3)
|
||||||
|
self.assertEqual(saved, initial.tobytes())
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
observer.observe(4, initial)
|
||||||
|
|
||||||
|
def test_finite_observer_all_valid_reports_minus_one(self):
|
||||||
|
observer = r.FiniteObserver(TorchScalars, 'CPU-test-stub')
|
||||||
|
for tick in range(4):
|
||||||
|
observer.observe(tick, np.array([1, 0], np.int32), np.array([-0., 1.], np.float64))
|
||||||
|
self.assertTrue(observer.result()['all_finite'])
|
||||||
|
self.assertEqual(observer.result()['first_failure_tick'], -1)
|
||||||
|
|
||||||
|
def test_summary_has_no_fake_outer_learning_claim_and_light_audit_is_not_full(self):
|
||||||
|
obj = object.__new__(r._Runtime)
|
||||||
|
obj.mode, obj.spec = 'light', dict(max_steps=1200, steps=1200, outer_protocol='conditioning-owned-by-parent')
|
||||||
|
obj.result = dict(first_failure_tick=-1, arriving_edges=11, accepted_arriving_edges=7)
|
||||||
|
inherited = dict(learning=False, arriving_edges=0, accepted_arriving_edges=0, complete=True,
|
||||||
|
apl_timing={'generated_trace': 'absent.npy', 'applied_trace': 'absent.npy'})
|
||||||
|
final = obj.summary(inherited)
|
||||||
|
self.assertNotIn('learning', final)
|
||||||
|
self.assertFalse(final['within_trial_weight_updates'])
|
||||||
|
self.assertFalse(final['learning_pass_claimed'])
|
||||||
|
self.assertFalse(final['full_sequence_bitwise_audit_performed'])
|
||||||
|
self.assertEqual(final['arriving_edges'], 11)
|
||||||
|
self.assertIsNone(final['apl_timing']['generated_trace'])
|
||||||
|
self.assertIsNone(final['apl_timing']['applied_trace'])
|
||||||
|
self.assertFalse(obj.timing(1200, np.zeros((18, 4064), np.float32))['full_sequence_bitwise_audit_performed'])
|
||||||
|
self.assertEqual(inherited['arriving_edges'], 0)
|
||||||
|
|
||||||
|
def test_terminal_queue_schema_chronological_pending_and_fresh_tick(self):
|
||||||
|
class CPUArray:
|
||||||
|
def __init__(self, array):
|
||||||
|
self.value = array
|
||||||
|
|
||||||
|
def cpu(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def numpy(self):
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
ring = np.zeros((19, 166700), np.uint8)
|
||||||
|
ring[2, 3] = 1
|
||||||
|
apl_ring = np.repeat(np.arange(18, dtype=np.float32)[:, None], 4064, axis=1)
|
||||||
|
apl = types.SimpleNamespace(state=CPUArray(np.array([1., 2.], np.float32)))
|
||||||
|
obj = object.__new__(r._Runtime)
|
||||||
|
obj.mode, obj.installations, obj.finished = 'light', 1, False
|
||||||
|
obj.observer = types.SimpleNamespace(result=lambda: dict(all_finite=True, first_failure_tick=-1,
|
||||||
|
finite_observed_ticks=1200, arriving_edges=11, accepted_arriving_edges=7))
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
obj.finish(CPUArray(ring), CPUArray(apl_ring), apl, 1200, Path(directory))
|
||||||
|
with np.load(Path(directory)/'terminal-queues.npz', allow_pickle=False) as output:
|
||||||
|
self.assertEqual(set(output.files), {'spike_ring', 'apl_state', 'apl_pending', 'next_tick'})
|
||||||
|
self.assertEqual(output['spike_ring'].dtype, np.uint8)
|
||||||
|
self.assertEqual(output['spike_ring'].tobytes(), ring.tobytes())
|
||||||
|
self.assertEqual(output['next_tick'].dtype, np.int64)
|
||||||
|
self.assertEqual(output['next_tick'].item(), 1200)
|
||||||
|
expected = np.concatenate((apl_ring[1200 % 18:], apl_ring[:1200 % 18]))
|
||||||
|
np.testing.assert_array_equal(output['apl_pending'], expected)
|
||||||
|
self.assertTrue(obj.finished)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
obj.finish(CPUArray(ring), CPUArray(apl_ring), apl, 1200, Path(directory))
|
||||||
|
|
||||||
|
def test_pinned_overlay_helpers_toy_units_and_missing_nonzero_fail_closed(self):
|
||||||
|
if not AM.is_file():
|
||||||
|
self.skipTest('Original frozen AM overlay helper not installed')
|
||||||
|
helper = r._load('phase4an_test_overlay_helper', AM, r.AM_OVERLAY_SHA)
|
||||||
|
ids, base32 = np.array([3, 9], np.int64), np.array([.275, 1.1], np.float32)
|
||||||
|
delta = np.float32(-.25) * base32
|
||||||
|
plan = helper.validate_arrays(ids, delta, ids, base32)
|
||||||
|
base = np.array([.000275, .0011], np.float64)
|
||||||
|
result, _ = helper.materialize_numpy(base, ids, np.zeros(2, bool), plan)
|
||||||
|
self.assertTrue(helper.bit_equal(result, base + delta.astype(np.float64) * .001))
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
helper.map_installation(base[:1], ids[:1], np.zeros(1, bool), plan)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
helper.validate_arrays(ids, np.array([.1, 0], np.float32), ids, base32)
|
||||||
|
|
||||||
|
def test_manifest_cannot_self_authorize_replacement_mask(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
path = Path(directory)
|
||||||
|
manifest = dict(schema='phase4an-overlay-v1', overlay_name='learned', overlay_sha256='0'*64,
|
||||||
|
mask_path=str(path/'mask.npy'), mask_sha256='0'*64, base_candidate_path=str(path/'base.npy'),
|
||||||
|
base_candidate_sha256='0'*64, aj_model_dir=str(AJ.parent), am_overlay_path=str(AM),
|
||||||
|
am_overlay_sha256=r.AM_OVERLAY_SHA)
|
||||||
|
(path/'manifest.json').write_text(json.dumps(manifest), encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'authority'):
|
||||||
|
r.load_overlay(path/'delta.npz', path/'manifest.json')
|
||||||
|
|
||||||
|
def test_learned_manifest_uses_external_base_and_requires_parent_v2(self):
|
||||||
|
if not AM.is_file() or not AJ.is_file():
|
||||||
|
self.skipTest('Pinned static source dependencies are not installed')
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
path = Path(directory)
|
||||||
|
ids = np.arange(14232, dtype=np.int64)
|
||||||
|
base = np.full(14232, .275, np.float32)
|
||||||
|
delta = np.zeros(14232, np.float32); delta[0] = np.float32(-.00275)
|
||||||
|
np.save(path/'mask.npy', ids); np.save(path/'base.npy', base)
|
||||||
|
np.savez(path/'delta.npz', edge_id=ids, plastic_delta_mv=delta)
|
||||||
|
mask_sha = r.digest(path/'mask.npy')
|
||||||
|
manifest = dict(schema='phase4an-overlay-v1', overlay_name='learned',
|
||||||
|
overlay_sha256=r.digest(path/'delta.npz'), mask_path=str(path/'mask.npy'), mask_sha256=mask_sha,
|
||||||
|
base_candidate_path=str(path/'base.npy'), base_candidate_sha256=r.digest(path/'base.npy'),
|
||||||
|
aj_model_dir=str(AJ.parent), am_overlay_path=str(AM), am_overlay_sha256=r.AM_OVERLAY_SHA,
|
||||||
|
parent_snapshot_sha256='a'*64, eligibility_v2_source_sha256=r.V2_SHA)
|
||||||
|
(path/'manifest.json').write_text(json.dumps(manifest), encoding='utf-8')
|
||||||
|
# Only the authority fixture is patched; production pin remains fixed.
|
||||||
|
with patch.object(r, 'MASK_SHA', mask_sha):
|
||||||
|
helper, plan, meta, inputs = r.load_overlay(path/'delta.npz', path/'manifest.json')
|
||||||
|
self.assertEqual(plan['plastic_delta_mv'].tobytes(), delta.tobytes())
|
||||||
|
self.assertFalse(plan['plastic_delta_mv'].flags.writeable)
|
||||||
|
self.assertEqual(meta['parent_snapshot_sha256'], 'a'*64)
|
||||||
|
unexpected = dict(manifest, within_trial_weight_updates=True)
|
||||||
|
(path/'manifest.json').write_text(json.dumps(unexpected), encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'Unknown'):
|
||||||
|
r.load_overlay(path/'delta.npz', path/'manifest.json')
|
||||||
|
manifest.pop('parent_snapshot_sha256')
|
||||||
|
(path/'manifest.json').write_text(json.dumps(manifest), encoding='utf-8')
|
||||||
|
with self.assertRaisesRegex(ValueError, 'parent'):
|
||||||
|
r.load_overlay(path/'delta.npz', path/'manifest.json')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"GPU_used": false,
|
||||||
|
"analysis_sha256": "d5ad47a85e4c22e8a482b26330957a821e394022658531a914c9080187454d03",
|
||||||
|
"learning_pass_claimed": false,
|
||||||
|
"registration_sha256": "7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945",
|
||||||
|
"training": false,
|
||||||
|
"wall_seconds": 40.56493683200097
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,172 @@
|
|||||||
|
{
|
||||||
|
"complete": true,
|
||||||
|
"completed": [
|
||||||
|
{
|
||||||
|
"execution_sha256": "1a6e73ee71f969125a3a69d1f46b0765a6bf574b55fe9704be07be364e64b4c4",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--fresh--reference-r0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "099d02a5b31e3ff6e0c620bb285d444fa192fa15022b78632a05774e002b3c89",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--fresh--light-r0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "36da6e49ba3575ddc0bf36a839e58e959abc08f3db2e728f40a9d88e22ace1bb",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--fresh--light-r1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "f06f286b82f9b196347253684eef229a3f156d3109fcb9b15141c41ac0f47533",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--prefix--reference-t0018"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "1eea2cc407e3a01ccf6d5cedf2aa19eb3be1bb75b9df3e5cb31a7eed38a96762",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--prefix--reference-t0019"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "49b34a635e2e029b430224bf3a067ced408f81273a7b17f33a783b64431cd765",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--prefix--reference-t0500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "9479f44277df44557ffbc2f5251fc523f07e9fa4fab4575023510bc6ff26bab6",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--fresh--reference-r0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "83cee3b7447cf8ccace47b499145542351dda52498f9165c5b02eff5b31c490d",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--fresh--light-r0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "86cdde61b7c2581f28d5bed9271fbf0a2f764c01ac95b360b221c9436177e731",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--fresh--light-r1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "601feb3ffefc15c3ccf98a36b89eb16559a9672b325393b43e9559cecabedfda",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--prefix--reference-t0018"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "e3f380e6fba8c92111f54af259531f64177c58401e915898c80f34f178fe78df",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--prefix--reference-t0019"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "d61cd75530c74b579b334bc715a9de2226606855ccc4c011fcac6cf89570cdf4",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--prefix--reference-t0500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "ab843922c457b8ebbed58f6bd057d1219fa523100ded700d6c5fb3eae39bd6bd",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--reference-s00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "0d9ce5b903e3b60510778a47d9797b8c45455c7509e9a2872039e3f87f90cd91",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--reference-s01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "8e7d08743ee87c12bf98e20b853117c883601489b7824ad4a24354eb684ef4fe",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--reference-s02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "420090f9378d8f236d2a478af22e009364b5613eb7ec0f76228a08baafed4dd8",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--reference-s03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "98fc0809ab600d49ea7c15284364cfcc40797e14e23dd5dee56f7a206a269b8a",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--reference-s04"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "0fd5857a719d09737124116cc9342386474859e19c55c015c614db4c751e799e",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--light-s00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "2e038c35dc563a558dd0025a63262497551d4a65d542d34f30bb2a1812566cda",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--light-s01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "a0836cffbc3a7857937b578ee084c955f0b1851b4c2455d3576951256128d5e5",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--light-s02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "bd7d4d7315d6336031c9176a54fd65baf01ecd5722cf8885b351054d9d9d9485",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--light-s03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "f2936dfa1b16a0aac6ff1be109a0f0c3b13ed895c5284fab9fae6dd297839e12",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "zero--chain--light-s04"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "5ec0ca4d44c8c0f7f029b3b0cdacd4a522fac06ab61dea7930a7bbc38660f04d",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--reference-s00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "49c6e3a38ec64acce20f2580567ebe065adfc68b96a8b5d4e38933245a1f7494",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--reference-s01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "1ee9097792abf54b989a2a06dfa41336216540cdf29aebb635ba72abff57d609",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--reference-s02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "85193748d4675d875ff9bd53abbf82f3c00720c706d662694aaaee75741f263f",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--reference-s03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "b8a9ed7667b384ee0e9939dea363196fab0eba8695422d7e868e92d3c3a56398",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--reference-s04"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "69fb7a48f6af11d36ed0db8609bb2f70884275e9d86cae829b876e2417312eaa",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--light-s00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "cf3f86c0f93fa9144e860311262eacb7883395850e9ec5ddbc0e9b1bb2d3eb78",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--light-s01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "b5d51f20ad942805ea10c8cfd59fda3e10b55b95e4da73b074a197d9495e0f2f",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--light-s02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "cd1bcdbc73127f7837e889a3aeee8bea7e3d76fb31b1797fdb6a34ae1c55cec9",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--light-s03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"execution_sha256": "4e16145b7e065bf891478a3e2b75d0ae568179a9e963e487c36fad13132a3802",
|
||||||
|
"reverified_existing": false,
|
||||||
|
"row_id": "static25--chain--light-s04"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed_ticks": 11074,
|
||||||
|
"expected_calls": 32,
|
||||||
|
"learning_pass_claimed": false,
|
||||||
|
"numerical_gate_evaluated": false,
|
||||||
|
"registration_sha256": "7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945",
|
||||||
|
"training": false,
|
||||||
|
"wall_seconds": 433.96824523499527
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"AM_seals_preserved": true,
|
||||||
|
"analysis_recomputed_exactly": true,
|
||||||
|
"analysis_sha256": "d5ad47a85e4c22e8a482b26330957a821e394022658531a914c9080187454d03",
|
||||||
|
"budget": {
|
||||||
|
"free_bytes": 649401114624,
|
||||||
|
"hard_cap_bytes": 8589934592,
|
||||||
|
"reserve_bytes": 10737418240,
|
||||||
|
"used_bytes": 221057911
|
||||||
|
},
|
||||||
|
"completed_calls": 32,
|
||||||
|
"executed_ticks": 11074,
|
||||||
|
"learned_candidate": false,
|
||||||
|
"learning_pass_claimed": false,
|
||||||
|
"model_directory_sealed": false,
|
||||||
|
"old_five_reference_evidence": "Sealed AM five-trial evidence retained; not rerun by this engineering gate",
|
||||||
|
"old_integrity_pass": true,
|
||||||
|
"old_integrity_roots": 28,
|
||||||
|
"registration_sha256": "7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945",
|
||||||
|
"schema": "phase4an-engineering-final-v1",
|
||||||
|
"scope": "Finite registered 100 ms input and fixed continuation cuts only; no universal determinism, learning or physiology claim",
|
||||||
|
"status": "PASS-EXACT-LIGHT-CONTINUATION-ENGINEERING-NOT-LEARNING",
|
||||||
|
"training": false,
|
||||||
|
"used_engineering_source_snapshots_sealed": true
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.5,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 5,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--light-s00",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 5
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.3,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 5,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "e1eb04c098b366870cb05869af9a4277d85fb7722f87202ac9e3b97e768d30cb",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 13,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--light-s01",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 5,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 18,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "e3885149662d9abf9666a76953784b508398a08be963b8165cbbb3548b4e2b13",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--light-s02",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 18,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 48.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 19,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "ba542fc65ca165c6d1027ce0c056bf8f0b6360b0ad98f4f909240e34419655a8",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 481,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--light-s03",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 19,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 500,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "7a46fe8914e903760a720caee920070d8dde2e1ecf91190948b3541bbf366505",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--light-s04",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 500,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.5,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 5,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--reference-s00",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 5
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.3,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 5,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "9b3529f7ee0e6363af7254489c452638f0f37ac3a62ccce8461ab1b4c6e9189a",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 13,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--reference-s01",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 5,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 18,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "26df7763cb02fb1e1610398b72860027dfdc788237ca5a4c20140f013cc22559",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--reference-s02",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 18,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 48.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 19,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "a4d2ea258823ca6685aa3538ffd99f011c68a063110fa47965827a537950424b",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 481,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--reference-s03",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 19,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 500,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "0b8da3d954e9b66df6fa24ab139a8cf0dca650f294bf68783e6c050357790715",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--chain--reference-s04",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 500,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--fresh--light-r0",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--fresh--light-r1",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--fresh--reference-r0",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.8,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 18,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--prefix--reference-t0018",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.9000000000000001,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 19,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--prefix--reference-t0019",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "static25--prefix--reference-t0500",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.5,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 5,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--light-s00",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 5
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.3,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 5,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "7c15a5a78a6197eec593c553c3625261b47c40a2ee22515ccda5b5d67eefed2e",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 13,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--light-s01",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 5,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 18,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "3bcfbc0516e918a4ff42ce4c0cf25129ac1b0fcf8fdb0baa9f55923a02b45f9b",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--light-s02",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 18,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 48.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 19,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "61b16179c796301e05f4c6f6989d0d31e0e8da0d7d38f086aecacc9b61d5bfcb",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 481,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--light-s03",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 19,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 500,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "97db003dc84cf99bb92e815fbcbea0796270884da37803b8746041b695d546d3",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--light-s04",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 500,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.5,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 5,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--reference-s00",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 5
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.3,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 5,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "01ad785a6d5e94a8e83c80a3d48e91f245432b446c8fc907d9644850f9370d01",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 13,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--reference-s01",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 5,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 0.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 18,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "4be0d1ac31613a5ba3fafae8d80e1a1be55f0ce2a56b54c4b3abbb24fd5705bd",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--reference-s02",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 18,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 48.1,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 19,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "670ca9c79c29791df8f2107272ef50010e97b1d7dbe2f7ea85d519364f903647",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 481,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--reference-s03",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 19,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"global_tick_offset": 500,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"parent_checkpoint_manifest_sha256": "7d06d07087c1c39396b9160ce39e5cf31b8b1893f098f0bb78397b927084a504",
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--chain--reference-s04",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 500,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--fresh--light-r0",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--fresh--light-r1",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--fresh--reference-r0",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 1000
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.8,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 18,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--prefix--reference-t0018",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 18
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 1.9000000000000001,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 19,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--prefix--reference-t0019",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 19
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 50.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"max_steps": 1000,
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"outer_protocol": "phase4an-engineering-validation-no-training",
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 500,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation",
|
||||||
|
"within_trial_weight_updates": false
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4an-engineering-validation",
|
||||||
|
"original_spec": {
|
||||||
|
"apl": {
|
||||||
|
"gain": 0.01,
|
||||||
|
"normalization": 1.0,
|
||||||
|
"tau_ms": 20.0
|
||||||
|
},
|
||||||
|
"apl_bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||||
|
"apl_delay_steps": 18,
|
||||||
|
"apl_precision": "float32",
|
||||||
|
"budget_root": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation",
|
||||||
|
"coefficients_path": "/data/digital-drosophila/experiments/phase4af-author-fullgraph/oracle/no_input/coefficients.json",
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"duration_ms": 100.0,
|
||||||
|
"expected_external_events": 105.90211181640625,
|
||||||
|
"graph_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/graphs/full",
|
||||||
|
"kind": "fullgraph",
|
||||||
|
"legacy_apl_worker": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
|
||||||
|
"mode": "physiological",
|
||||||
|
"model": {
|
||||||
|
"dt_ms": 0.1,
|
||||||
|
"membrane_tau_ms": 20.0,
|
||||||
|
"refractory_ms": 2.2,
|
||||||
|
"reset_potential_mv": -52.0,
|
||||||
|
"resting_potential_mv": -52.0,
|
||||||
|
"synaptic_delay_ms": 1.8,
|
||||||
|
"synaptic_tau_ms": 5.0,
|
||||||
|
"threshold_mv": -45.0,
|
||||||
|
"w_syn_mv_per_anatomical_synapse": 0.275
|
||||||
|
},
|
||||||
|
"name": "seed_validation-physiological-00-s1073741825",
|
||||||
|
"odor_id": "OMSUIQOIVADKIM-RXMQYKEDSA-N",
|
||||||
|
"odor_index": 0,
|
||||||
|
"odor_name": "ethyl (R)-(-)-3-hydroxybutanoate",
|
||||||
|
"output_budget_bytes": 25769803776,
|
||||||
|
"precision": "float64",
|
||||||
|
"rate_sum_hz": 1059.0211181640625,
|
||||||
|
"record_history": false,
|
||||||
|
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
|
||||||
|
"seed": 1073741825,
|
||||||
|
"source_panel_row": 0,
|
||||||
|
"source_panel_split": "calibration",
|
||||||
|
"steps": 1000,
|
||||||
|
"target_count": 48,
|
||||||
|
"training": false,
|
||||||
|
"validation_cohort": "seed_validation"
|
||||||
|
},
|
||||||
|
"output_budget_bytes": 8589934592,
|
||||||
|
"row_id": "zero--prefix--reference-t0500",
|
||||||
|
"schema": "phase4an-engineering-case-template-v1",
|
||||||
|
"start": 0,
|
||||||
|
"stop": 500
|
||||||
|
}
|
||||||
@@ -0,0 +1,901 @@
|
|||||||
|
5bddbfb94f999aaee354408241557f44bd3d019311f2a12c81cbb2a71f47b6de audit/analysis-execution.json
|
||||||
|
d5ad47a85e4c22e8a482b26330957a821e394022658531a914c9080187454d03 audit/engineering-analysis.json
|
||||||
|
7163399ac2205a2232e7b5e7b758df7a98d979d3e6f25109894cc6d32f0e0d28 audit/execution-complete.json
|
||||||
|
16630d0d666a2467c56b647d021cbdb627a553795f6afcd7f7eb496a2737d815 audit/final-status.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/static25--chain--light-s00/requests.npz
|
||||||
|
ddb53c3d067aa3c85c81f2525db59dc6ab8eda1bfeb910fd7a3828222499e5ff cases/static25--chain--light-s00/spec.json
|
||||||
|
065e4b01b74ac6619f6533c54fdb58a345fffe7be30ae2295e50ab7015da888a cases/static25--chain--light-s00/template-spec.json
|
||||||
|
929f5b8a23043c0a10790d7cc0683ff81a6049b4e714db86b1fb54cb7f3ca8f2 cases/static25--chain--light-s01/requests.npz
|
||||||
|
c29fcf0d124c07d169e9357ff07b5cd9dcb6d6676562d9ba4db85c6c8f24e613 cases/static25--chain--light-s01/spec.json
|
||||||
|
38001935f07393a08f8c83595541a6ff060b0f9ca7b9fdaf357e2f77f9348994 cases/static25--chain--light-s01/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/static25--chain--light-s02/requests.npz
|
||||||
|
34db8114208a21487dc5d07ba5f7700caefc0a5add81cb8fd7f0767bbed2b017 cases/static25--chain--light-s02/spec.json
|
||||||
|
c89d7994d40fc79591c78d11c549766b45d283145fdcebb1e3b6c964b8750b2a cases/static25--chain--light-s02/template-spec.json
|
||||||
|
be049a344735ad19157ea86c6e911ea9042127ace736fe98bcdddf6b3c1425d1 cases/static25--chain--light-s03/requests.npz
|
||||||
|
3256a11c89da8ad99d2504bacf02c7b8ca8dba0679b5697250f3d071e6074d55 cases/static25--chain--light-s03/spec.json
|
||||||
|
390f3d472a2baf3b7d14f1bb22185e027fb1c5ede8f42bfbd8e7c2051e78d0fe cases/static25--chain--light-s03/template-spec.json
|
||||||
|
764259eb618a2ee9393b67ec2713cd0c68763a3e55bbd35e261f5c38ea044b0e cases/static25--chain--light-s04/requests.npz
|
||||||
|
c10065bca4e8cec618c817ed8e86a42b51ef4849804e4369a18586cda34b3205 cases/static25--chain--light-s04/spec.json
|
||||||
|
90a262080e33a6014679e7f3d932f61e1edb04cffcd9a2cf35440c078a9085f4 cases/static25--chain--light-s04/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/static25--chain--reference-s00/requests.npz
|
||||||
|
ddb53c3d067aa3c85c81f2525db59dc6ab8eda1bfeb910fd7a3828222499e5ff cases/static25--chain--reference-s00/spec.json
|
||||||
|
3b63e236d755714dc59b083b2ee48761ce48e9a8456770e3502798f5bd5e2ff6 cases/static25--chain--reference-s00/template-spec.json
|
||||||
|
929f5b8a23043c0a10790d7cc0683ff81a6049b4e714db86b1fb54cb7f3ca8f2 cases/static25--chain--reference-s01/requests.npz
|
||||||
|
bcc2974b14b4a4e74e86c75d6806ecd15af8b26107fcd22f9ea6cf9f0423258e cases/static25--chain--reference-s01/spec.json
|
||||||
|
595a1a67fd82b48e0db25480771a93bd289e8f65c511c43780b42dabf9c8b478 cases/static25--chain--reference-s01/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/static25--chain--reference-s02/requests.npz
|
||||||
|
38488bbf4491c1d50f7c81726894584ab4b7f5cc1189e9aca88207b6d97e3203 cases/static25--chain--reference-s02/spec.json
|
||||||
|
bda9afb21aebd4cf37d52a0cb83c21f179ca4fe9aca8a43e5a1cc92f2af81897 cases/static25--chain--reference-s02/template-spec.json
|
||||||
|
be049a344735ad19157ea86c6e911ea9042127ace736fe98bcdddf6b3c1425d1 cases/static25--chain--reference-s03/requests.npz
|
||||||
|
557096e8e0b28def2e3c7039e7f5b79d75f5539744f7a0fa3fbd2eb403fd87eb cases/static25--chain--reference-s03/spec.json
|
||||||
|
246cbb287972c7539c4f53bc2546bd9cdd0dd960e8714bce060db1bee1ba0fc9 cases/static25--chain--reference-s03/template-spec.json
|
||||||
|
764259eb618a2ee9393b67ec2713cd0c68763a3e55bbd35e261f5c38ea044b0e cases/static25--chain--reference-s04/requests.npz
|
||||||
|
ee7a4c6678992ab2c193178c5cb0cb26a546e89bc62cd73f2bcb9be8b6393c9e cases/static25--chain--reference-s04/spec.json
|
||||||
|
de59abaa0670a9be8d90a9dd9b41522edd277d9f75dbdb77ddeeeca1c508265f cases/static25--chain--reference-s04/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/static25--fresh--light-r0/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/static25--fresh--light-r0/spec.json
|
||||||
|
802b717691f9a6b460a1a58044286e727ffa8393605127ee7a11ad267fbf6338 cases/static25--fresh--light-r0/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/static25--fresh--light-r1/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/static25--fresh--light-r1/spec.json
|
||||||
|
f4cdfd5de0fb80dd39203425c4ff7d063b0b66f2ac887e4276043251e3ad956c cases/static25--fresh--light-r1/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/static25--fresh--reference-r0/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/static25--fresh--reference-r0/spec.json
|
||||||
|
2ee541997a8a82f9ac356e9fedf8fc70ce31f622d42d846ab6de8c5f6cdea39f cases/static25--fresh--reference-r0/template-spec.json
|
||||||
|
adc91d6f97531e8f94b0bbee6b67b1c62b0303bb90b2ad0aa0adf0af9f990570 cases/static25--prefix--reference-t0018/requests.npz
|
||||||
|
534981eeebd53acfaac8915f181e54db2e761231ec95c9b389f00fbc9cfb586f cases/static25--prefix--reference-t0018/spec.json
|
||||||
|
282eccfb1ee2008f0b9ae8cca4daf45bfefd664806e7d04b8712fadf90b83bb5 cases/static25--prefix--reference-t0018/template-spec.json
|
||||||
|
adc91d6f97531e8f94b0bbee6b67b1c62b0303bb90b2ad0aa0adf0af9f990570 cases/static25--prefix--reference-t0019/requests.npz
|
||||||
|
fbeccc9b36c505dce773095e159b031e0abd41f83ed9dbd69c2f4d5145d50f0c cases/static25--prefix--reference-t0019/spec.json
|
||||||
|
8cd7512a1b2cdef47aecfd26bfb7ee8b22b566dc6c6812e887b4cc3f5416e7e3 cases/static25--prefix--reference-t0019/template-spec.json
|
||||||
|
aa2773a740b0e85940f3d96738a141903d5d178e40586522b603ae1c9de53e98 cases/static25--prefix--reference-t0500/requests.npz
|
||||||
|
5a728bef0c5a786989989b11ccb550b4f36622471d0169e355f8a5195e803913 cases/static25--prefix--reference-t0500/spec.json
|
||||||
|
654043502385a40dc4396c25ab2bf6f74701a7026fc85e6789672a810e5f700e cases/static25--prefix--reference-t0500/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/zero--chain--light-s00/requests.npz
|
||||||
|
ddb53c3d067aa3c85c81f2525db59dc6ab8eda1bfeb910fd7a3828222499e5ff cases/zero--chain--light-s00/spec.json
|
||||||
|
e8f6fe8e0f67cbe851c045a067485d753979f5af32d30f596f545387b306f123 cases/zero--chain--light-s00/template-spec.json
|
||||||
|
929f5b8a23043c0a10790d7cc0683ff81a6049b4e714db86b1fb54cb7f3ca8f2 cases/zero--chain--light-s01/requests.npz
|
||||||
|
616f9dbb93e9cc8b6bf6420d2e213afead3a1af0d580082c11653e0e14f434f6 cases/zero--chain--light-s01/spec.json
|
||||||
|
b727d54f9d28e9b8482860c3ed2bb6c30d4778fe90644b2df9ebb8d0c032e148 cases/zero--chain--light-s01/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/zero--chain--light-s02/requests.npz
|
||||||
|
33739fcd9a34cb385163ac9b678fd44dfd56fff19c67054005790876b19ee48c cases/zero--chain--light-s02/spec.json
|
||||||
|
8af5bc5ed35084f15c7d77ded8224d49f49561d48510c862410eccd4d7dc5560 cases/zero--chain--light-s02/template-spec.json
|
||||||
|
be049a344735ad19157ea86c6e911ea9042127ace736fe98bcdddf6b3c1425d1 cases/zero--chain--light-s03/requests.npz
|
||||||
|
c395303842c48cc82c34db3ab0e1490e3f2b68326e5477ad8996d62b41cb7643 cases/zero--chain--light-s03/spec.json
|
||||||
|
7e140b41ae610cd67a8cfe2e30d633190ac2c7689a4682bba676e423b54e689d cases/zero--chain--light-s03/template-spec.json
|
||||||
|
764259eb618a2ee9393b67ec2713cd0c68763a3e55bbd35e261f5c38ea044b0e cases/zero--chain--light-s04/requests.npz
|
||||||
|
2e6291cb22891c66e08f9b90d4f6b7daf9e67b29352b7e0e8a62defa9f907644 cases/zero--chain--light-s04/spec.json
|
||||||
|
5cc7905cdca67bdf09eb0730a274644f5605178b1c97928572c5ecf2a3b5acff cases/zero--chain--light-s04/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/zero--chain--reference-s00/requests.npz
|
||||||
|
ddb53c3d067aa3c85c81f2525db59dc6ab8eda1bfeb910fd7a3828222499e5ff cases/zero--chain--reference-s00/spec.json
|
||||||
|
452da911a5f3d6d8cbd33e96451d6f65af5e46eee57fda00125c59f6378dfba6 cases/zero--chain--reference-s00/template-spec.json
|
||||||
|
929f5b8a23043c0a10790d7cc0683ff81a6049b4e714db86b1fb54cb7f3ca8f2 cases/zero--chain--reference-s01/requests.npz
|
||||||
|
6d90561b4235d3c0c5316ca5abbdbcaeb84b4b324e2b258c2da34d55990f6abf cases/zero--chain--reference-s01/spec.json
|
||||||
|
b943e29941af75b7c4ff333bdc0a9697d0e15131bdea46c4460ef91f894565b2 cases/zero--chain--reference-s01/template-spec.json
|
||||||
|
517b500f350b0825f7cc9c639beb62d06764de286b13e0835cb26c5f83ff106a cases/zero--chain--reference-s02/requests.npz
|
||||||
|
d1bb8f215583a91592b405d86134eea2ff0e7cb5bb1e09fc3c3a8d99cf819f75 cases/zero--chain--reference-s02/spec.json
|
||||||
|
412390b67001e08930f243f54954d78e7edf94b330aee2087c35748963a883db cases/zero--chain--reference-s02/template-spec.json
|
||||||
|
be049a344735ad19157ea86c6e911ea9042127ace736fe98bcdddf6b3c1425d1 cases/zero--chain--reference-s03/requests.npz
|
||||||
|
72e5e05e201adeeb2be2436ebb3f9ca35b605cc81de7dcbace4a5a76326a115e cases/zero--chain--reference-s03/spec.json
|
||||||
|
6d5f2819be44646890cdad1969043bee5209e801b79687a8c1c2205601bc9656 cases/zero--chain--reference-s03/template-spec.json
|
||||||
|
764259eb618a2ee9393b67ec2713cd0c68763a3e55bbd35e261f5c38ea044b0e cases/zero--chain--reference-s04/requests.npz
|
||||||
|
33200448de1970e83b99237f94b02284a023241ba878d8f47f1ca83251e9485e cases/zero--chain--reference-s04/spec.json
|
||||||
|
d8bd2b1b151582ec7495e59a15cae15279f71d444429c5c273397b63008b3440 cases/zero--chain--reference-s04/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/zero--fresh--light-r0/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/zero--fresh--light-r0/spec.json
|
||||||
|
df1a6663ea748b0dc0333540877000e5c91d493b151e134e346dee54e834e3de cases/zero--fresh--light-r0/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/zero--fresh--light-r1/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/zero--fresh--light-r1/spec.json
|
||||||
|
32dce4105aaadac4f7079264cf0a30a3f8171862edf59cceaba6624f01a5252d cases/zero--fresh--light-r1/template-spec.json
|
||||||
|
003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091 cases/zero--fresh--reference-r0/requests.npz
|
||||||
|
67c84138bab13ad1790020924064e6ead8b3d739c62bb44013d5b1f8cf40299e cases/zero--fresh--reference-r0/spec.json
|
||||||
|
a0bf214d782ddef0adb5b6f9b89c2d52566a5928b5d96316bddfe12520aa5460 cases/zero--fresh--reference-r0/template-spec.json
|
||||||
|
adc91d6f97531e8f94b0bbee6b67b1c62b0303bb90b2ad0aa0adf0af9f990570 cases/zero--prefix--reference-t0018/requests.npz
|
||||||
|
534981eeebd53acfaac8915f181e54db2e761231ec95c9b389f00fbc9cfb586f cases/zero--prefix--reference-t0018/spec.json
|
||||||
|
8400934e175d3c20f19d863082e7df02c5279864b5191736565e9014df6e0e83 cases/zero--prefix--reference-t0018/template-spec.json
|
||||||
|
adc91d6f97531e8f94b0bbee6b67b1c62b0303bb90b2ad0aa0adf0af9f990570 cases/zero--prefix--reference-t0019/requests.npz
|
||||||
|
fbeccc9b36c505dce773095e159b031e0abd41f83ed9dbd69c2f4d5145d50f0c cases/zero--prefix--reference-t0019/spec.json
|
||||||
|
9c361dfb9af4dd7071a7f1c3c2315adddb21b42e9ed5e9a199b1cdf52fab40e7 cases/zero--prefix--reference-t0019/template-spec.json
|
||||||
|
aa2773a740b0e85940f3d96738a141903d5d178e40586522b603ae1c9de53e98 cases/zero--prefix--reference-t0500/requests.npz
|
||||||
|
5a728bef0c5a786989989b11ccb550b4f36622471d0169e355f8a5195e803913 cases/zero--prefix--reference-t0500/spec.json
|
||||||
|
bda640a599d6cdf80ad435f344fcd576d91ca0afe9de732f36fa7bd54d470c1e cases/zero--prefix--reference-t0500/template-spec.json
|
||||||
|
08dad899a5b5953c910653df1e2d0deea25774993247bb0481e9a7226196c01e extension-build/author_cuda_8b92086ce274b694/.ninja_deps
|
||||||
|
c933cf20577c21213c02b866e31ff3018ffdd7891b8d1e78b479075499497fcc extension-build/author_cuda_8b92086ce274b694/.ninja_log
|
||||||
|
af0e447e2a763b34d872ebf5ac8e2ffb47dd6035010383964763bc2fcb27e350 extension-build/author_cuda_8b92086ce274b694/author_cuda_8b92086ce274b694.so
|
||||||
|
b379970317d4d6d97c0d428e7fd218883c44b7ee137511e9154df6c73f51a628 extension-build/author_cuda_8b92086ce274b694/author_ext.cuda.o
|
||||||
|
f9092f2ef8da90ee89cfb89075d1e0891456f4bcbf6d9d405c65696a92f8cc49 extension-build/author_cuda_8b92086ce274b694/author_ext.o
|
||||||
|
75c123c6847475e58245ed925446ae65ffcb58f336d6b4cb928e7f47e4de8a50 extension-build/author_cuda_8b92086ce274b694/build.ninja
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 extension-build/author_cuda_8b92086ce274b694/lock
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--light-s00.stderr.log
|
||||||
|
a8914ea1648f779de118286907c4a1b1f4e5bc748cc734e6abc0757ea01e9b0f logs/static25--chain--light-s00.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--light-s01.stderr.log
|
||||||
|
5df0ddef73c57fd56b891c69e1177a41a072f2f9bed8e5b9ec41e399badb02af logs/static25--chain--light-s01.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--light-s02.stderr.log
|
||||||
|
c1fce7b291ecfe94d413325aeda502528d8ce8a1282c82b5007da4227df06975 logs/static25--chain--light-s02.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--light-s03.stderr.log
|
||||||
|
5cae770692eb5330f242e9b3817ca84ec70e0b9b09ba1ba82d831ead66295f99 logs/static25--chain--light-s03.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--light-s04.stderr.log
|
||||||
|
339f02325c11599a7723c93e668221b1111cdefe5094203d31896cecba7fa671 logs/static25--chain--light-s04.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--reference-s00.stderr.log
|
||||||
|
d07baacc8d9b02c9c8c806aec082109a88423825cec56ec8f04660d12412e4df logs/static25--chain--reference-s00.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--reference-s01.stderr.log
|
||||||
|
d6620036700f715cd7492eaa60bbc674ee052eddae3a1f5a98ae370fa6e627ae logs/static25--chain--reference-s01.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--reference-s02.stderr.log
|
||||||
|
d19a2b51b2eea5294c1e8149ca7521d961ebc5af57ef301cfc2b270722437375 logs/static25--chain--reference-s02.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--reference-s03.stderr.log
|
||||||
|
a63ff43c90fd7e231cf8c92cff363ae5bb2f9cec14da374192a471deb85f4660 logs/static25--chain--reference-s03.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--chain--reference-s04.stderr.log
|
||||||
|
ff46304c4dc8fc5d6ec279090c7d7e31a59e71630a49693efc539a9d2026a76f logs/static25--chain--reference-s04.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--fresh--light-r0.stderr.log
|
||||||
|
d60fac810df233507a1093e09481174ad24f8d0efd6a550f6ac3d16b53fca7bf logs/static25--fresh--light-r0.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--fresh--light-r1.stderr.log
|
||||||
|
3a9e1bcbaccb384ccee3b3b2b1271c9300237235e67621c13ca269e4ff2c7c30 logs/static25--fresh--light-r1.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--fresh--reference-r0.stderr.log
|
||||||
|
2d4bb1c9465c4a16137ece838f05ea0a3c84f67a9fd60fe8cfe0ae78809efafd logs/static25--fresh--reference-r0.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--prefix--reference-t0018.stderr.log
|
||||||
|
89a495cfb8f44d07f69c6b22c15f9d385e418ceaff9ca2a3d3359f4c9ee44a62 logs/static25--prefix--reference-t0018.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--prefix--reference-t0019.stderr.log
|
||||||
|
55113d1c38cdfe8c46205d7ab908d2213ad8ee61146a4dd6a2acbe8d0b26f123 logs/static25--prefix--reference-t0019.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/static25--prefix--reference-t0500.stderr.log
|
||||||
|
738a4b6b18e8502ac1cce710362e36f80e9d73c3c7658292abc154974eede002 logs/static25--prefix--reference-t0500.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--light-s00.stderr.log
|
||||||
|
3babc52c94e68512278687051547d37aea27fc3df8d56ecdd295aa3423588dfb logs/zero--chain--light-s00.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--light-s01.stderr.log
|
||||||
|
6cfbde7603928a48527dc69dbc8fff25aee3d573d96a78ffbbe9cc36794deec1 logs/zero--chain--light-s01.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--light-s02.stderr.log
|
||||||
|
8cbb7655946977f254d3877f9b5125a052118389d5c67adb2eac50ec6e2525a5 logs/zero--chain--light-s02.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--light-s03.stderr.log
|
||||||
|
d3323bc0aca8b024c4ad4a2f907cc8c0cf540750d662b556c96db1db079b0e8f logs/zero--chain--light-s03.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--light-s04.stderr.log
|
||||||
|
dd30bffc1726f678429d49c8b917778aeb94a3d693a42e3f37b41220a254c6e1 logs/zero--chain--light-s04.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--reference-s00.stderr.log
|
||||||
|
109a8e00d97390ae78c1afc3635ee44a160ddcbe3f4f10181f033fd2e331c056 logs/zero--chain--reference-s00.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--reference-s01.stderr.log
|
||||||
|
dbc332683c73131f9245cd7de27d4fded303cacfa481490177dd9551be0944e7 logs/zero--chain--reference-s01.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--reference-s02.stderr.log
|
||||||
|
f970a34a6b7198db75609f8524053cd897303c34dfc68fbbea241bf2233a46c1 logs/zero--chain--reference-s02.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--reference-s03.stderr.log
|
||||||
|
8368d8d91b58feca3f305103c86bf10fab9d8791c11714a229feee64fb53fced logs/zero--chain--reference-s03.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--chain--reference-s04.stderr.log
|
||||||
|
029ffc9b372430ba3fe7437a885c85f41c6deed249469af350ba9df221abcf18 logs/zero--chain--reference-s04.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--fresh--light-r0.stderr.log
|
||||||
|
71a1f1b0dc9d977522f41e619471a50a3278032600eb4f3ffd5502680e6a9125 logs/zero--fresh--light-r0.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--fresh--light-r1.stderr.log
|
||||||
|
8c29087862f7d8b9a361787df12ec099d6fef7b536d3057228a2f1ebcd1f4e09 logs/zero--fresh--light-r1.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--fresh--reference-r0.stderr.log
|
||||||
|
e7c749668db2d2b3ee28b59c524bd5de0bae7365379dfa8702de827a2d0251b7 logs/zero--fresh--reference-r0.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--prefix--reference-t0018.stderr.log
|
||||||
|
3f31fc5d6f9e3f4a54fee90c50d968a0cf81a7e64e9e233e6f65ccaf8d76e6ff logs/zero--prefix--reference-t0018.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--prefix--reference-t0019.stderr.log
|
||||||
|
f33e40ba1cfd49f2105d8fea8a49eeadeeadc8ed9d08c53a0fdaf5b085865d5d logs/zero--prefix--reference-t0019.stdout.log
|
||||||
|
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 logs/zero--prefix--reference-t0500.stderr.log
|
||||||
|
bbd479014693caa69287d6f2eafbe60b920c7f04fa5a232a61844b1412991943 logs/zero--prefix--reference-t0500.stdout.log
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 overlays/static25.json
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 overlays/zero.json
|
||||||
|
66257eb665808e33005dd7ba14a16063064618cc48e47cb65b70f3900cec2484 protocol/AM-gate-authority.json
|
||||||
|
175b5d0e2de12a9ce01c6167591dab882d9c9c6869de2d194bcd9e6732c6ed6d protocol/AM-seal-verification.json
|
||||||
|
7317441126f191ccc6e6d28438870b3921537ebe282a6acb163716a690057945 protocol/preregistered.json
|
||||||
|
1ac0d65b906e1061781c967cc6a99e8a0a73df6a1ee564ed6603f88e3f5d7056 protocol/source-snapshot/ENGINEERING_GATE_DRAFT.md
|
||||||
|
3970d13bd43d4bc12baf4b6ad1cda3eb085e10bf4648752cfcecb6d12314c5ea protocol/source-snapshot/engineering_analysis.py
|
||||||
|
5a2403f11bc08d65a9d242ac2cf9686b850e0c3680d65659f785e9b6b50c0238 protocol/source-snapshot/engineering_compare.py
|
||||||
|
cc8c0e83016af4836c81cd0773fc521c69fd30e6f4d021bf54d0e7897105c6d5 protocol/source-snapshot/engineering_inputs.py
|
||||||
|
3c127aee723a054fda272fee458067608b521a7c443455822d97f509caded6c7 protocol/source-snapshot/engineering_plan.py
|
||||||
|
62dedce2439407398e70beb4c718bf14e02d3e624b3db3ef6f74299115d84bc1 protocol/source-snapshot/engineering_prepare.py
|
||||||
|
6ddaec52f2a0b5d0c528d51230d372fe2344160aef5eccea6a95b6c5e61a574e protocol/source-snapshot/engineering_queue_audit.py
|
||||||
|
1043ba217e5395c9e81e58b95a5aa396f572588872b954e549774f2b99cac5df protocol/source-snapshot/engineering_scopes.py
|
||||||
|
76313332b8d18f121a61f7b6e2fc32ea9e893848e8ed5d049557fc08b385e674 protocol/source-snapshot/engineering_workflow.py
|
||||||
|
0b8e8e0a6a23a079dc62a88355ce355d53b3ae22f6665519a8f6aef2dcfc5aba protocol/source-snapshot/runtime_continuation.py
|
||||||
|
522b8c31ea938890fe15364fccd25ccc5bded54101754909f255532e7ad01aae protocol/source-snapshot/runtime_light.py
|
||||||
|
35e4ee37a1e82cf5e645d24165343049d400104c94a6d184b8aa834ba5ef2d20 protocol/source-snapshot/test_engineering_analysis.py
|
||||||
|
87a85843d918cce6529ab94f7cb82499aa413281e803c00c030a3c340a581469 protocol/source-snapshot/test_engineering_compare.py
|
||||||
|
4dcc7b775eb3c7e59ed9cc3d7591eacc0ef7bda1209edbd847e2ae79b115ef1b protocol/source-snapshot/test_engineering_inputs.py
|
||||||
|
c26c2c75bb27d3b8514b7d44f40369130d60147c6c8edc569b4efba4a4ad9815 protocol/source-snapshot/test_engineering_plan.py
|
||||||
|
a12aa1d2cb4880a3f7a7889b89d71a859bc8c68b4badfb8f082d712cdd342627 protocol/source-snapshot/test_engineering_prepare.py
|
||||||
|
0e2bcfe25c3b5a5cd0ed5cd05a89392207191ec4db950cdb06a0137666c8adb7 protocol/source-snapshot/test_engineering_queue_audit.py
|
||||||
|
748c0777e4a8164e80c03c727df1c2decbac7747737ad1c9fb730ea5c9e208d3 protocol/source-snapshot/test_engineering_scopes.py
|
||||||
|
bb781b23f92b5c0eb92f8dbc54468a8e843177f6da004c444b48947b037bd705 protocol/source-snapshot/test_engineering_workflow.py
|
||||||
|
325c0b688d0ca1648ffdf29a8d3d4bb91d6f6115bea6f5ac30982acd6dfe8e06 protocol/source-snapshot/test_runtime_continuation.py
|
||||||
|
887345e497e6fa9c10ffa49c490196711d8cee028c62ec7a73f42db36569be2b protocol/source-snapshot/test_runtime_light.py
|
||||||
|
817766a56484ba383462d89e7648e1dd238a2e00bb2b824504e6262d76355deb receipts/static25--chain--light-s00.derivation.json
|
||||||
|
69fb7a48f6af11d36ed0db8609bb2f70884275e9d86cae829b876e2417312eaa receipts/static25--chain--light-s00.json
|
||||||
|
9400c4ae2449fbdce0a317cd4398cbdf6b1597b68c9010d4d8e2001c7e2788e8 receipts/static25--chain--light-s00.runtime.json
|
||||||
|
5a2e7395aa5387345be5c95ae37f2294b8641e3bdacb785077628082d0ae850c receipts/static25--chain--light-s01.derivation.json
|
||||||
|
cf3f86c0f93fa9144e860311262eacb7883395850e9ec5ddbc0e9b1bb2d3eb78 receipts/static25--chain--light-s01.json
|
||||||
|
f6f17ea84079a8d98465f429d6eb1b0f79f333a1948431a3ff800cb2174465bd receipts/static25--chain--light-s01.runtime.json
|
||||||
|
843fc8a4be08679681bb8a9855e9e5ce63fc2f4c96aad33e11ccac1545439497 receipts/static25--chain--light-s02.derivation.json
|
||||||
|
b5d51f20ad942805ea10c8cfd59fda3e10b55b95e4da73b074a197d9495e0f2f receipts/static25--chain--light-s02.json
|
||||||
|
ff5398be834fbc68fe5374145024162258f2a191c519015254651f66cd853442 receipts/static25--chain--light-s02.runtime.json
|
||||||
|
1a878637be0632b541b61c4364d9e4c9c0a4dd7e09cbf0f7372b582374a6b9e0 receipts/static25--chain--light-s03.derivation.json
|
||||||
|
cd1bcdbc73127f7837e889a3aeee8bea7e3d76fb31b1797fdb6a34ae1c55cec9 receipts/static25--chain--light-s03.json
|
||||||
|
97c5419cb4060d9c3c24ab35e420a7a130d606c7345297ea0703744f5ef2edf2 receipts/static25--chain--light-s03.runtime.json
|
||||||
|
86ffb5bf2a9db6fe3f62b7180be82bed665e894e05eae112a6c5b82fcf3f601b receipts/static25--chain--light-s04.derivation.json
|
||||||
|
4e16145b7e065bf891478a3e2b75d0ae568179a9e963e487c36fad13132a3802 receipts/static25--chain--light-s04.json
|
||||||
|
da5edb58d7f1f4ba07d71391fafa0fd645b3c528147457f8b31056a53242fa24 receipts/static25--chain--light-s04.runtime.json
|
||||||
|
817766a56484ba383462d89e7648e1dd238a2e00bb2b824504e6262d76355deb receipts/static25--chain--reference-s00.derivation.json
|
||||||
|
5ec0ca4d44c8c0f7f029b3b0cdacd4a522fac06ab61dea7930a7bbc38660f04d receipts/static25--chain--reference-s00.json
|
||||||
|
94a92952f25666c066addccd5df7cb5e1743b37ae9fed0565c6975843cc2490b receipts/static25--chain--reference-s00.runtime.json
|
||||||
|
481d91030d37fab8ab61935744d9fbb9f0f57ddf25ee4271658771b28b189ece receipts/static25--chain--reference-s01.derivation.json
|
||||||
|
49c6e3a38ec64acce20f2580567ebe065adfc68b96a8b5d4e38933245a1f7494 receipts/static25--chain--reference-s01.json
|
||||||
|
bf9f1c0c8f65c7b77e47f2ab43748747d9738db750e70ab044548c90f1d6d135 receipts/static25--chain--reference-s01.runtime.json
|
||||||
|
e04bb42ec8b562e6be8779b90ac61933c637c54e6954327f0ad1468cbbecf232 receipts/static25--chain--reference-s02.derivation.json
|
||||||
|
1ee9097792abf54b989a2a06dfa41336216540cdf29aebb635ba72abff57d609 receipts/static25--chain--reference-s02.json
|
||||||
|
e57184070d6b37c31b35820502747a652a6b773a5d3b22eaa491cb0c06bd1b27 receipts/static25--chain--reference-s02.runtime.json
|
||||||
|
b01505e9068238f4aded3eab346ace5043f48270618d13c12bb637cc8db6523a receipts/static25--chain--reference-s03.derivation.json
|
||||||
|
85193748d4675d875ff9bd53abbf82f3c00720c706d662694aaaee75741f263f receipts/static25--chain--reference-s03.json
|
||||||
|
f256d3569fee444d851b6e16eac920aca744a1b5900f241c39f38e8cc6dee501 receipts/static25--chain--reference-s03.runtime.json
|
||||||
|
bd5faed882110abe97015650dc7ff7f7e194670520d30ff7773126773d8e0bd5 receipts/static25--chain--reference-s04.derivation.json
|
||||||
|
b8a9ed7667b384ee0e9939dea363196fab0eba8695422d7e868e92d3c3a56398 receipts/static25--chain--reference-s04.json
|
||||||
|
9b4bcbee75d5221e689666e58bd927624bb10aa04f4cebd3b9cb1ac68b36b206 receipts/static25--chain--reference-s04.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/static25--fresh--light-r0.derivation.json
|
||||||
|
83cee3b7447cf8ccace47b499145542351dda52498f9165c5b02eff5b31c490d receipts/static25--fresh--light-r0.json
|
||||||
|
21a6add7cb67d76c317ee0adccbde24e17de6f66dc2e7eb16163a376736d4500 receipts/static25--fresh--light-r0.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/static25--fresh--light-r1.derivation.json
|
||||||
|
86cdde61b7c2581f28d5bed9271fbf0a2f764c01ac95b360b221c9436177e731 receipts/static25--fresh--light-r1.json
|
||||||
|
5600b9bed927201d5b095eb677451300e99c71112b404f4241639c3e82e81c24 receipts/static25--fresh--light-r1.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/static25--fresh--reference-r0.derivation.json
|
||||||
|
9479f44277df44557ffbc2f5251fc523f07e9fa4fab4575023510bc6ff26bab6 receipts/static25--fresh--reference-r0.json
|
||||||
|
212af7746d375dfdec0fa9fdaac84de9ee323182bf2ddef8e4e1f5209a748e91 receipts/static25--fresh--reference-r0.runtime.json
|
||||||
|
65b115618f193a5b7b7ddacbb4040f3564c426d2b97130fce642dffaf53a5568 receipts/static25--prefix--reference-t0018.derivation.json
|
||||||
|
601feb3ffefc15c3ccf98a36b89eb16559a9672b325393b43e9559cecabedfda receipts/static25--prefix--reference-t0018.json
|
||||||
|
31ab36a846b1c572a3830e2c0afd32da0b68c0836ec0d0a963defd5d82310744 receipts/static25--prefix--reference-t0018.runtime.json
|
||||||
|
4c5e34a864b200a29a17c0a3c33579aa226c9c86bfc4b9ae5525e00f400d9279 receipts/static25--prefix--reference-t0019.derivation.json
|
||||||
|
e3f380e6fba8c92111f54af259531f64177c58401e915898c80f34f178fe78df receipts/static25--prefix--reference-t0019.json
|
||||||
|
43b452923fb221ae6b2d9a27ec57240f4799b09b5ba1e300c7aead5ccff7f6fb receipts/static25--prefix--reference-t0019.runtime.json
|
||||||
|
5c54b053c2a7cec1fa5106fbc72fc41a03168da4eba68bb8db88b2d7910507b6 receipts/static25--prefix--reference-t0500.derivation.json
|
||||||
|
d61cd75530c74b579b334bc715a9de2226606855ccc4c011fcac6cf89570cdf4 receipts/static25--prefix--reference-t0500.json
|
||||||
|
0b0cb7db049668c0217fc1613b796ea061f78806ef2bb1ae80d051b97d744633 receipts/static25--prefix--reference-t0500.runtime.json
|
||||||
|
817766a56484ba383462d89e7648e1dd238a2e00bb2b824504e6262d76355deb receipts/zero--chain--light-s00.derivation.json
|
||||||
|
0fd5857a719d09737124116cc9342386474859e19c55c015c614db4c751e799e receipts/zero--chain--light-s00.json
|
||||||
|
6bad229951b64fdfc8c10186e899051b04fc7022be19bba858dade38b145132c receipts/zero--chain--light-s00.runtime.json
|
||||||
|
29f23c65ef708b0688eed37b0de1cf5ee115cb54a966a6e5d79f232795075ddf receipts/zero--chain--light-s01.derivation.json
|
||||||
|
2e038c35dc563a558dd0025a63262497551d4a65d542d34f30bb2a1812566cda receipts/zero--chain--light-s01.json
|
||||||
|
529eee86ecfd21acbbc011d9d148272aa104b7e2e6a980c2b6b0419dcd0393d0 receipts/zero--chain--light-s01.runtime.json
|
||||||
|
5cb5b89d76859178d9e203667066616eb93849591500694ce83c15650cef81e6 receipts/zero--chain--light-s02.derivation.json
|
||||||
|
a0836cffbc3a7857937b578ee084c955f0b1851b4c2455d3576951256128d5e5 receipts/zero--chain--light-s02.json
|
||||||
|
d21a6b7b6cbf15cd880d40e3ddf22d06d26a898f51ffa527801aa6f7d6aef5eb receipts/zero--chain--light-s02.runtime.json
|
||||||
|
d3db21ca94683e4506df9e032c13ede46d154d2ab76206fc131a6db8f8f7b3fa receipts/zero--chain--light-s03.derivation.json
|
||||||
|
bd7d4d7315d6336031c9176a54fd65baf01ecd5722cf8885b351054d9d9d9485 receipts/zero--chain--light-s03.json
|
||||||
|
6896e2a2eedb9d8e94a11c3131e3142904bdfe30c03996451f9fdf0628f5b99f receipts/zero--chain--light-s03.runtime.json
|
||||||
|
31a5f242e0a8c2d77e5d002bf35a2a28286c39e54d7db031b24824b508741202 receipts/zero--chain--light-s04.derivation.json
|
||||||
|
f2936dfa1b16a0aac6ff1be109a0f0c3b13ed895c5284fab9fae6dd297839e12 receipts/zero--chain--light-s04.json
|
||||||
|
86e11dbe8df489041f3da35c5d3ee831343ce3d1e098a7e897039f0ba005d270 receipts/zero--chain--light-s04.runtime.json
|
||||||
|
817766a56484ba383462d89e7648e1dd238a2e00bb2b824504e6262d76355deb receipts/zero--chain--reference-s00.derivation.json
|
||||||
|
ab843922c457b8ebbed58f6bd057d1219fa523100ded700d6c5fb3eae39bd6bd receipts/zero--chain--reference-s00.json
|
||||||
|
d469108942db00e4fbb2a7b7040325308641e6a405be13b93c51b406ca889aff receipts/zero--chain--reference-s00.runtime.json
|
||||||
|
255b2b3e6825a3f17f5dbfa2b7dfd193f41539f2446514811f4c21dbbefa6399 receipts/zero--chain--reference-s01.derivation.json
|
||||||
|
0d9ce5b903e3b60510778a47d9797b8c45455c7509e9a2872039e3f87f90cd91 receipts/zero--chain--reference-s01.json
|
||||||
|
3506b72bc8cf76560229ec40e5ebc5935a459ee9369011b5830e7a7701079b53 receipts/zero--chain--reference-s01.runtime.json
|
||||||
|
18791a4fc66607470d1a5bf0cf0f36ceab0d4abddd3f1aaa46bf98b6f48b0752 receipts/zero--chain--reference-s02.derivation.json
|
||||||
|
8e7d08743ee87c12bf98e20b853117c883601489b7824ad4a24354eb684ef4fe receipts/zero--chain--reference-s02.json
|
||||||
|
9c55e8be5c4e690dc88adaf6570be49a7ebaa14c370777765e5f7acb10d608e4 receipts/zero--chain--reference-s02.runtime.json
|
||||||
|
9623d3ffb8db90cc4f477c831ee58650b8293b759dfd2ea91360db72589bc261 receipts/zero--chain--reference-s03.derivation.json
|
||||||
|
420090f9378d8f236d2a478af22e009364b5613eb7ec0f76228a08baafed4dd8 receipts/zero--chain--reference-s03.json
|
||||||
|
8d833796fa45c674ece9c9722bcca59a40cc65768a3a396adf34d1fe61badae7 receipts/zero--chain--reference-s03.runtime.json
|
||||||
|
99fd0a5ef2aa4fa090c6fae1aa603a30be5adb1da247febed0841731e6fb487c receipts/zero--chain--reference-s04.derivation.json
|
||||||
|
98fc0809ab600d49ea7c15284364cfcc40797e14e23dd5dee56f7a206a269b8a receipts/zero--chain--reference-s04.json
|
||||||
|
487b2cad28e8adea2cccd29da2150d80dffd139565c2ff47f74db271ef5efd18 receipts/zero--chain--reference-s04.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/zero--fresh--light-r0.derivation.json
|
||||||
|
099d02a5b31e3ff6e0c620bb285d444fa192fa15022b78632a05774e002b3c89 receipts/zero--fresh--light-r0.json
|
||||||
|
e0893b05c197c0ed0a56b597267b1d5d4ea2fc323504f8ff238ba27744655bcc receipts/zero--fresh--light-r0.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/zero--fresh--light-r1.derivation.json
|
||||||
|
36da6e49ba3575ddc0bf36a839e58e959abc08f3db2e728f40a9d88e22ace1bb receipts/zero--fresh--light-r1.json
|
||||||
|
347e24167e785df30091308dbf5900981bb9ffd422ca71980a2e8a893237904f receipts/zero--fresh--light-r1.runtime.json
|
||||||
|
d3a4bb58fefadff205151d9824f1ae7af5a59a28d4d97e7bbfec6ffe48079aa9 receipts/zero--fresh--reference-r0.derivation.json
|
||||||
|
1a6e73ee71f969125a3a69d1f46b0765a6bf574b55fe9704be07be364e64b4c4 receipts/zero--fresh--reference-r0.json
|
||||||
|
4ddf3396aae5da1cf9c8d416039fea5f7619831d405fcaebcf0f24cc5e116953 receipts/zero--fresh--reference-r0.runtime.json
|
||||||
|
65b115618f193a5b7b7ddacbb4040f3564c426d2b97130fce642dffaf53a5568 receipts/zero--prefix--reference-t0018.derivation.json
|
||||||
|
f06f286b82f9b196347253684eef229a3f156d3109fcb9b15141c41ac0f47533 receipts/zero--prefix--reference-t0018.json
|
||||||
|
7565c66430321fb14fb1de284b24e6a82246b61e6134a38242da86221612da9f receipts/zero--prefix--reference-t0018.runtime.json
|
||||||
|
4c5e34a864b200a29a17c0a3c33579aa226c9c86bfc4b9ae5525e00f400d9279 receipts/zero--prefix--reference-t0019.derivation.json
|
||||||
|
1eea2cc407e3a01ccf6d5cedf2aa19eb3be1bb75b9df3e5cb31a7eed38a96762 receipts/zero--prefix--reference-t0019.json
|
||||||
|
176a7d952ed81882c231512814ca1e7be04767f52bae83c1ca74fbe1d23ae91d receipts/zero--prefix--reference-t0019.runtime.json
|
||||||
|
5c54b053c2a7cec1fa5106fbc72fc41a03168da4eba68bb8db88b2d7910507b6 receipts/zero--prefix--reference-t0500.derivation.json
|
||||||
|
49b34a635e2e029b430224bf3a067ced408f81273a7b17f33a783b64431cd765 receipts/zero--prefix--reference-t0500.json
|
||||||
|
df18488b891cbb3609868b10dd3e3e7d17ffa5b37590e91e43ea97563cc67fdf receipts/zero--prefix--reference-t0500.runtime.json
|
||||||
|
175b5d0e2de12a9ce01c6167591dab882d9c9c6869de2d194bcd9e6732c6ed6d regression/AM-seals-after.json
|
||||||
|
68475cc0e72039e044c8fb3aaea9c8487c6737c1b8a457641e818581d81c387c regression/old-integrity-after.json
|
||||||
|
68475cc0e72039e044c8fb3aaea9c8487c6737c1b8a457641e818581d81c387c regression/old-integrity-before.json
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--light-s00/apl-component.json
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/static25--chain--light-s00/apl-pending-tail.float32.npy
|
||||||
|
e683ba6046e405c6787e6861cfff6b2d5df8b38be7684351810dc2bb8fb65b76 runs/static25--chain--light-s00/apl-timing-audit.json
|
||||||
|
e1eb04c098b366870cb05869af9a4277d85fb7722f87202ac9e3b97e768d30cb runs/static25--chain--light-s00/checkpoint-manifest.json
|
||||||
|
4d5ecd025cf500818de9c269269596c604b385c795a80442384ae688cb907066 runs/static25--chain--light-s00/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--light-s00/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--light-s00/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--light-s00/overlay-manifest.json
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/static25--chain--light-s00/requests.csv
|
||||||
|
ec67e5a4d47948e7152b0c532fc74fd8e0571fd8697cba760352bbfbd4763d48 runs/static25--chain--light-s00/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--light-s00/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--light-s00/source-audit.json
|
||||||
|
67943c878314d88e6c34ee89a08ec61dfb9c66c43279766f54946556962b67a3 runs/static25--chain--light-s00/state.npz
|
||||||
|
dfcae9b785dcaa579d813185df194ce69a18e672738deaa63766a61585e59acc runs/static25--chain--light-s00/summary.json
|
||||||
|
749a93983ffcf0b89e2b0f67f51bc11134c575d7e8d0230d6ebe333fa20c28ab runs/static25--chain--light-s00/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--light-s01/apl-component.json
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/static25--chain--light-s01/apl-pending-tail.float32.npy
|
||||||
|
a82b3b00fd2366b13e8f89945c353cbff49fd43258d00723cc471eff795c2ef6 runs/static25--chain--light-s01/apl-timing-audit.json
|
||||||
|
e3885149662d9abf9666a76953784b508398a08be963b8165cbbb3548b4e2b13 runs/static25--chain--light-s01/checkpoint-manifest.json
|
||||||
|
2d4871c9f09b5ad486637bb9233c49d6c2398dce409019cac72b77f6c1cfd221 runs/static25--chain--light-s01/continuation-receipt.json
|
||||||
|
ff22fb288988dea3ac624bcec27359837bdfa4dab244768b252e65e2e1acfa46 runs/static25--chain--light-s01/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--light-s01/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--light-s01/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--light-s01/overlay-manifest.json
|
||||||
|
9e9b4d0a5057a967246555f30a70b9c145b4247ae77722ba562441483182faa8 runs/static25--chain--light-s01/requests.csv
|
||||||
|
659f9383bafcc3d222325fb8d61be7af5be34e48a34180614b11d7ca2fae78c3 runs/static25--chain--light-s01/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--light-s01/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--light-s01/source-audit.json
|
||||||
|
93ef29574754b862a88c665589190732acc69f9fecdbf57295f71d9a3ccc99c7 runs/static25--chain--light-s01/state.npz
|
||||||
|
0b4f6774478e8e79b551527838bf230a2c1fae1547920979c002149fff924bc9 runs/static25--chain--light-s01/summary.json
|
||||||
|
cf00897e9128b83a01d32c1c7208449911f34a776fb9a88f78273a91aabf0986 runs/static25--chain--light-s01/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--light-s02/apl-component.json
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/static25--chain--light-s02/apl-pending-tail.float32.npy
|
||||||
|
bf13d66b8834c17b1c68a0d107b1b48258cb2179b548ece5e2c2142fe2ca3df5 runs/static25--chain--light-s02/apl-timing-audit.json
|
||||||
|
ba542fc65ca165c6d1027ce0c056bf8f0b6360b0ad98f4f909240e34419655a8 runs/static25--chain--light-s02/checkpoint-manifest.json
|
||||||
|
37a6a7ad9440dc3c61f97a783a915ff4e7c52b32a12cb89f5aaf8aa17b62af36 runs/static25--chain--light-s02/continuation-receipt.json
|
||||||
|
f11b37717ad3c092a481adcf78f7caffd688650bf4cb56ab644175721e63a9e8 runs/static25--chain--light-s02/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--light-s02/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--light-s02/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--light-s02/overlay-manifest.json
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/static25--chain--light-s02/requests.csv
|
||||||
|
b9547378fa968408fcaed0a2997e98d1f065d2864d4e531703739b6e9d281312 runs/static25--chain--light-s02/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--light-s02/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--light-s02/source-audit.json
|
||||||
|
e73da12668986893b8fe7d412e2efaa8ebf53478b12bd6081c92f3ab7d0d1960 runs/static25--chain--light-s02/state.npz
|
||||||
|
82e68ff0074b239038c267a13fcfab9ca0ae034a6d731a9777a5b1d5c126c5bb runs/static25--chain--light-s02/summary.json
|
||||||
|
c62e42ea853eba86b021529340bb106425043080632d41a935d107ec32f467b1 runs/static25--chain--light-s02/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--light-s03/apl-component.json
|
||||||
|
c222b8012c2e3edbff7fad90e8dcd51db47b2a541d7109be2872acb96ac94c30 runs/static25--chain--light-s03/apl-pending-tail.float32.npy
|
||||||
|
a640b2790c05c73b86d69e667f2a63510ec1937d04ded8e9e0035d1557d0dd79 runs/static25--chain--light-s03/apl-timing-audit.json
|
||||||
|
7a46fe8914e903760a720caee920070d8dde2e1ecf91190948b3541bbf366505 runs/static25--chain--light-s03/checkpoint-manifest.json
|
||||||
|
41e56da038e2d8d4c85fcf7be0c5380a4219d153d8c9709a8d61d9c0d8aa5a48 runs/static25--chain--light-s03/continuation-receipt.json
|
||||||
|
78de62547a9d43e37543dedb92ef79687676c58a031269f447d5f1545cf08c9c runs/static25--chain--light-s03/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--light-s03/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--light-s03/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--light-s03/overlay-manifest.json
|
||||||
|
f485d562e1be7230112ed27f211d3053ac715bee49416a0062ac71210cac5d56 runs/static25--chain--light-s03/requests.csv
|
||||||
|
4030d42ef51df0cf987be0fe43a7f8ce8d041c7ed5d484a35953bbbcb4e593cd runs/static25--chain--light-s03/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--light-s03/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--light-s03/source-audit.json
|
||||||
|
1ac87260cb29f8358e26f9603dcba748833ae597fb848e28169915b2c2ad75cd runs/static25--chain--light-s03/state.npz
|
||||||
|
b18796a661d050f5f577750ca9811eb9e34d9dc74cdb7b61d0f45df18cb3e515 runs/static25--chain--light-s03/summary.json
|
||||||
|
8faf854dcef4d8ff8c66413fd560313dcbbd9df8cdd386fd491521d492f9298b runs/static25--chain--light-s03/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--light-s04/apl-component.json
|
||||||
|
2dd2e0c79d4ee5299b8c1e8863e6c61b81f3dba08e599011887b1e1621f7c945 runs/static25--chain--light-s04/apl-pending-tail.float32.npy
|
||||||
|
e9988f2d7a7ac7894a576572301bb99a8d1bcc953420c898170dc048a4a66561 runs/static25--chain--light-s04/apl-timing-audit.json
|
||||||
|
b06f62b9290d5b41883dad249eb32cc2d1978beb5d1f8f92652c52c6202433f5 runs/static25--chain--light-s04/checkpoint-manifest.json
|
||||||
|
b69961a06417b0d44688e3b02fa4fbc4c308976971256e15c00a856eaf91a266 runs/static25--chain--light-s04/continuation-receipt.json
|
||||||
|
3c654cdf657f9566f5daa467d94e80d225feaf53858cd87a446c4c0893d97662 runs/static25--chain--light-s04/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--light-s04/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--light-s04/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--light-s04/overlay-manifest.json
|
||||||
|
ea59d983198a1ddb9ca97927561380667ce05d855f8d87dcb4cc89d8b778030f runs/static25--chain--light-s04/requests.csv
|
||||||
|
ce7bddc8556a8d7e2fc60316786290fedf724eab5c149559d2ed95b88dbaba9b runs/static25--chain--light-s04/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--light-s04/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--light-s04/source-audit.json
|
||||||
|
67ecca5b227ec7942c273e2ebecf9d82b4fadd688a4c3fb39e361f6ca1a38c6b runs/static25--chain--light-s04/state.npz
|
||||||
|
816ee6c491e3ba9e125b178741aa862679772c1861646f216d4ff3a0d83adda7 runs/static25--chain--light-s04/summary.json
|
||||||
|
279fc5d68f2630b8bb634d01546f529a250a54976ed5f3daef82b8be9d1b683f runs/static25--chain--light-s04/terminal-queues.npz
|
||||||
|
f1c06741513c8fca5911c4389abae361c2d5d04ca81896b4d8d87941146446d1 runs/static25--chain--reference-s00/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--reference-s00/apl-component.json
|
||||||
|
d3795834abfcadbbeb0f1ba994182acd9e27d997d308be4c4ec95a8b5de215e0 runs/static25--chain--reference-s00/apl-drive.float32.npy
|
||||||
|
f1c06741513c8fca5911c4389abae361c2d5d04ca81896b4d8d87941146446d1 runs/static25--chain--reference-s00/apl-inhibition.float32.npy
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/static25--chain--reference-s00/apl-pending-tail.float32.npy
|
||||||
|
d3795834abfcadbbeb0f1ba994182acd9e27d997d308be4c4ec95a8b5de215e0 runs/static25--chain--reference-s00/apl-state.float32.npy
|
||||||
|
f9123943d2616754e13637d92d6e2b3f3539a58df2b934879d40e227cf14ad4d runs/static25--chain--reference-s00/apl-timing-audit.json
|
||||||
|
9b3529f7ee0e6363af7254489c452638f0f37ac3a62ccce8461ab1b4c6e9189a runs/static25--chain--reference-s00/checkpoint-manifest.json
|
||||||
|
56d70ced7cb5b01d0e7fe74ef6d539cf8e80412b99a0e4f73a8197dea0ed914f runs/static25--chain--reference-s00/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--reference-s00/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--reference-s00/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--reference-s00/overlay-manifest.json
|
||||||
|
081cb361f63c9afe550371b67f2bfa784c63396af1b40cdbc34e26c395bdbd96 runs/static25--chain--reference-s00/queue.jsonl
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/static25--chain--reference-s00/requests.csv
|
||||||
|
2f2812e6892b4d12836e2e686876f010e1f67521054a37198412fbeab1dc2228 runs/static25--chain--reference-s00/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--reference-s00/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--reference-s00/source-audit.json
|
||||||
|
67943c878314d88e6c34ee89a08ec61dfb9c66c43279766f54946556962b67a3 runs/static25--chain--reference-s00/state.npz
|
||||||
|
6d32eaf71092cea2bc56a84a750a0146578892aecc8dc82d2735dec7a1220813 runs/static25--chain--reference-s00/summary.json
|
||||||
|
749a93983ffcf0b89e2b0f67f51bc11134c575d7e8d0230d6ebe333fa20c28ab runs/static25--chain--reference-s00/terminal-queues.npz
|
||||||
|
c96bf4166cdda9ba70e3f0f2382d3d65d78abd725fc071cc49be7b2d34d2d83b runs/static25--chain--reference-s00/tick-state-hashes.jsonl
|
||||||
|
1f1c042aaaf27898fbdbbe5e9ed0bde7617eae632801faac21e10d07d234e9bf runs/static25--chain--reference-s01/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--reference-s01/apl-component.json
|
||||||
|
9a4600c8a58e8bab325e379a4cc99e960afcf475e13c3157737db053a91b3304 runs/static25--chain--reference-s01/apl-drive.float32.npy
|
||||||
|
514da41968400fa6865cfb2f19398e6d29fa32958bf217a54c644fcddc417f52 runs/static25--chain--reference-s01/apl-inhibition.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/static25--chain--reference-s01/apl-pending-tail.float32.npy
|
||||||
|
89dac2c9bc0b766424ab963f22c5706381728bb5f48a179bf30c5244084098bb runs/static25--chain--reference-s01/apl-state.float32.npy
|
||||||
|
7954927d3b1f5a2116a391830b004a2c82e9dcb19143bff7444f12f04591e9b5 runs/static25--chain--reference-s01/apl-timing-audit.json
|
||||||
|
26df7763cb02fb1e1610398b72860027dfdc788237ca5a4c20140f013cc22559 runs/static25--chain--reference-s01/checkpoint-manifest.json
|
||||||
|
911325d7926e6655b7d894f8182b9608390dcb9568c798f6e03018bec40148d5 runs/static25--chain--reference-s01/continuation-receipt.json
|
||||||
|
bf5ad06fff9de0534f3431881cc615aea335773307fed93d870d9d0bcae9528a runs/static25--chain--reference-s01/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--reference-s01/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--reference-s01/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--reference-s01/overlay-manifest.json
|
||||||
|
59dcafed60163245561db96222a74c7077a39efe4160681d03d1387738726dd0 runs/static25--chain--reference-s01/queue.jsonl
|
||||||
|
9e9b4d0a5057a967246555f30a70b9c145b4247ae77722ba562441483182faa8 runs/static25--chain--reference-s01/requests.csv
|
||||||
|
268e40ec67aeac9134a31602553d74b0261061bb0428e7b7eeb24a79c687a78f runs/static25--chain--reference-s01/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--reference-s01/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--reference-s01/source-audit.json
|
||||||
|
93ef29574754b862a88c665589190732acc69f9fecdbf57295f71d9a3ccc99c7 runs/static25--chain--reference-s01/state.npz
|
||||||
|
8c48b202bdb088026674622734c6cd07eb48e1b4f221377d0ce40cd4a1ce0f80 runs/static25--chain--reference-s01/summary.json
|
||||||
|
cf00897e9128b83a01d32c1c7208449911f34a776fb9a88f78273a91aabf0986 runs/static25--chain--reference-s01/terminal-queues.npz
|
||||||
|
c5859a1dd79ec0403139e23c1e262fb2521a1534dac7c584afad437b44ec8d22 runs/static25--chain--reference-s01/tick-state-hashes.jsonl
|
||||||
|
8b3bc91ea0e86a20feccfb2327e65b92e3e4aa2de93782a4eb1d757e687ff0fe runs/static25--chain--reference-s02/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--reference-s02/apl-component.json
|
||||||
|
ae978ab20d186085d5a14508a08f4d42e3d54167e9517379bbeaa40e2c424b8c runs/static25--chain--reference-s02/apl-drive.float32.npy
|
||||||
|
8c846229ace8008635319ff5125fc77a0588f99bc23da4b1cf215e2660dd144c runs/static25--chain--reference-s02/apl-inhibition.float32.npy
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/static25--chain--reference-s02/apl-pending-tail.float32.npy
|
||||||
|
5a33b8bdc6829523b3b6eb5ef7189823a06e59f6e6effb1e25164cf0966e5701 runs/static25--chain--reference-s02/apl-state.float32.npy
|
||||||
|
7c6e6b649d7fe7514ff3bbfa1d9d72e1f1746f693c7dff0a15afc91c86a9175e runs/static25--chain--reference-s02/apl-timing-audit.json
|
||||||
|
a4d2ea258823ca6685aa3538ffd99f011c68a063110fa47965827a537950424b runs/static25--chain--reference-s02/checkpoint-manifest.json
|
||||||
|
6dbce80909cbd2ddc2860b7a924dd631cc203419826dfa4fb38f01a94c71ae73 runs/static25--chain--reference-s02/continuation-receipt.json
|
||||||
|
7fe8fdc62c85adc3187ac92c4c136af4037784cde7b87f95d381e53b184ad486 runs/static25--chain--reference-s02/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--reference-s02/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--reference-s02/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--reference-s02/overlay-manifest.json
|
||||||
|
91a4d67c2c5d3efcc20534451768b0152c3cee354f06cb0108fee5ed17a2f73c runs/static25--chain--reference-s02/queue.jsonl
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/static25--chain--reference-s02/requests.csv
|
||||||
|
25cbca33e003a47c3aec5f4b41d66459a7e06c8db90c381e84a2cda788a9e97c runs/static25--chain--reference-s02/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--reference-s02/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--reference-s02/source-audit.json
|
||||||
|
e73da12668986893b8fe7d412e2efaa8ebf53478b12bd6081c92f3ab7d0d1960 runs/static25--chain--reference-s02/state.npz
|
||||||
|
1eece4d03226ee7a3483e090224ad06a927d1229996d3af7977afeaa6e645222 runs/static25--chain--reference-s02/summary.json
|
||||||
|
c62e42ea853eba86b021529340bb106425043080632d41a935d107ec32f467b1 runs/static25--chain--reference-s02/terminal-queues.npz
|
||||||
|
c0c09c5f8a0038f5c569848d26e4bd7470cf3826cb77838a0bdd1de9f8c583d7 runs/static25--chain--reference-s02/tick-state-hashes.jsonl
|
||||||
|
6e4db049606110d7f8fb744658f491a702258f4c0039b6f1de4eedd1a268c1d4 runs/static25--chain--reference-s03/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--reference-s03/apl-component.json
|
||||||
|
5091e42124e93db94d2b8c75ba3d6c210f0a29b6621226a2d15b16df3d4364a2 runs/static25--chain--reference-s03/apl-drive.float32.npy
|
||||||
|
69f42a802f4f766dce86f33e2c44b1268b9686a2fc10b0c41460f17187bd25df runs/static25--chain--reference-s03/apl-inhibition.float32.npy
|
||||||
|
c222b8012c2e3edbff7fad90e8dcd51db47b2a541d7109be2872acb96ac94c30 runs/static25--chain--reference-s03/apl-pending-tail.float32.npy
|
||||||
|
6337cfb5adf42fd92ea63651fb85d29aed5115d37d0353690f2236ff2eaa776c runs/static25--chain--reference-s03/apl-state.float32.npy
|
||||||
|
606417b3ea730e4123beb62bcba35148c517490e8fe058bc3a0a574c7a449e0f runs/static25--chain--reference-s03/apl-timing-audit.json
|
||||||
|
0b8da3d954e9b66df6fa24ab139a8cf0dca650f294bf68783e6c050357790715 runs/static25--chain--reference-s03/checkpoint-manifest.json
|
||||||
|
6319f971eb68640d1c801d2ed53933f4bdce62195d7bb5572d225823a69b9a15 runs/static25--chain--reference-s03/continuation-receipt.json
|
||||||
|
048b38a7d3af3e9204ff83c5f47623e65c6cd11e694e3fb2326079423e4db8b9 runs/static25--chain--reference-s03/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--reference-s03/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--reference-s03/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--reference-s03/overlay-manifest.json
|
||||||
|
e76c008a5e6926b743a41628204c22b96c65d71a545005e0cf9e2a49036f5f2b runs/static25--chain--reference-s03/queue.jsonl
|
||||||
|
f485d562e1be7230112ed27f211d3053ac715bee49416a0062ac71210cac5d56 runs/static25--chain--reference-s03/requests.csv
|
||||||
|
46aed69967b93abacbf33dd4e2692974ee56aea5b96a3dca813c414f95884bd7 runs/static25--chain--reference-s03/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--reference-s03/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--reference-s03/source-audit.json
|
||||||
|
1ac87260cb29f8358e26f9603dcba748833ae597fb848e28169915b2c2ad75cd runs/static25--chain--reference-s03/state.npz
|
||||||
|
6b54c3b6a12d3d2f6a018592665be8c2f92c326c5eafa7368b77186cb48586e5 runs/static25--chain--reference-s03/summary.json
|
||||||
|
8faf854dcef4d8ff8c66413fd560313dcbbd9df8cdd386fd491521d492f9298b runs/static25--chain--reference-s03/terminal-queues.npz
|
||||||
|
421ebcda58bbbc4c502ecce1a648fa623a554e60d1418d87a1da108564e9445b runs/static25--chain--reference-s03/tick-state-hashes.jsonl
|
||||||
|
7de2da212e8a0d33bf1e8dcd0c98296d52284dd4523bd89b15577f4b82194cd0 runs/static25--chain--reference-s04/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--chain--reference-s04/apl-component.json
|
||||||
|
adf895727284c908b2d1f262b5f5984508fd859fc0a33b58e619bf9ec2dbe2da runs/static25--chain--reference-s04/apl-drive.float32.npy
|
||||||
|
4ac23f93c28a8bf6009dc19719523cb2be3c4625af494eb86bc58ff06e2365db runs/static25--chain--reference-s04/apl-inhibition.float32.npy
|
||||||
|
2dd2e0c79d4ee5299b8c1e8863e6c61b81f3dba08e599011887b1e1621f7c945 runs/static25--chain--reference-s04/apl-pending-tail.float32.npy
|
||||||
|
616cffd9b2c3216adb22d21af3d8c2751e61c7e11a70bc062a2dc96d07fd0c63 runs/static25--chain--reference-s04/apl-state.float32.npy
|
||||||
|
19839fbba619ef7c260e559f3c588bd42c05810c365fb3cf1ea0e79988034870 runs/static25--chain--reference-s04/apl-timing-audit.json
|
||||||
|
84f8fdec76adec84be053a30fe720de12f89711aad9679325486ed60d4901e65 runs/static25--chain--reference-s04/checkpoint-manifest.json
|
||||||
|
ed99f64655e6680733132b52ce9c7b25a5db9071434cb1d11fd2e53f9a6f0c28 runs/static25--chain--reference-s04/continuation-receipt.json
|
||||||
|
d581bb0d3c1a7f7c9f3afcff7bdbdcd7f32c9a9db798bcde1e0c869c38fd13ad runs/static25--chain--reference-s04/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--chain--reference-s04/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--chain--reference-s04/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--chain--reference-s04/overlay-manifest.json
|
||||||
|
8f22feee1d6cadb46efddce7c79b3a3c66ad727825c2165e7efd3a551961fe50 runs/static25--chain--reference-s04/queue.jsonl
|
||||||
|
ea59d983198a1ddb9ca97927561380667ce05d855f8d87dcb4cc89d8b778030f runs/static25--chain--reference-s04/requests.csv
|
||||||
|
6a2b572ab789b98ab351ada603e28d6d81e93c1c00f1ec5593ca8a5044ee92e2 runs/static25--chain--reference-s04/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--chain--reference-s04/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--chain--reference-s04/source-audit.json
|
||||||
|
67ecca5b227ec7942c273e2ebecf9d82b4fadd688a4c3fb39e361f6ca1a38c6b runs/static25--chain--reference-s04/state.npz
|
||||||
|
77a48ed4ed8e189ed1553f92387811f0efc7a832015067a00ce84b37776e6149 runs/static25--chain--reference-s04/summary.json
|
||||||
|
279fc5d68f2630b8bb634d01546f529a250a54976ed5f3daef82b8be9d1b683f runs/static25--chain--reference-s04/terminal-queues.npz
|
||||||
|
9a056a54dceab68d40ab582a6600db6be668ad21cdd8857685fa82383ddb5107 runs/static25--chain--reference-s04/tick-state-hashes.jsonl
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--fresh--light-r0/apl-component.json
|
||||||
|
2dd2e0c79d4ee5299b8c1e8863e6c61b81f3dba08e599011887b1e1621f7c945 runs/static25--fresh--light-r0/apl-pending-tail.float32.npy
|
||||||
|
0774772ba473c5dc4d5c636ecc9a5a2e44779f2647c58f1c84adc381495ec411 runs/static25--fresh--light-r0/apl-timing-audit.json
|
||||||
|
967aa8574fe357a2874d78e029c64833402a1724060c5b1f27d014af0ee47ed2 runs/static25--fresh--light-r0/checkpoint-manifest.json
|
||||||
|
abc4a3320d906ac02a9c73026680b92f4fdc2bc55740c128390f8e94b17dbbcb runs/static25--fresh--light-r0/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--fresh--light-r0/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--fresh--light-r0/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--fresh--light-r0/overlay-manifest.json
|
||||||
|
b11fb0b6d1ac9211f02f05a9809175c64b72e8bcd4c4e4da31be1efbe6a82a83 runs/static25--fresh--light-r0/requests.csv
|
||||||
|
ab1b4823b9d8e0562b879236bd04ccad162d3e41129cd7ce029221e1b7c5c85b runs/static25--fresh--light-r0/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--fresh--light-r0/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--fresh--light-r0/source-audit.json
|
||||||
|
7de2f62ecbde41a11db5aa220aed2fa6128e9fb6e65d04357f5373eb21538f81 runs/static25--fresh--light-r0/state.npz
|
||||||
|
9f863a708fabc72cc460d84a9adc2ef7b060349e5edcd6858a72dd2d28b5e012 runs/static25--fresh--light-r0/summary.json
|
||||||
|
05565f934549e68b2f8900c80b7b5e5887802abb6de30154718c6e297e12daa5 runs/static25--fresh--light-r0/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--fresh--light-r1/apl-component.json
|
||||||
|
2dd2e0c79d4ee5299b8c1e8863e6c61b81f3dba08e599011887b1e1621f7c945 runs/static25--fresh--light-r1/apl-pending-tail.float32.npy
|
||||||
|
0774772ba473c5dc4d5c636ecc9a5a2e44779f2647c58f1c84adc381495ec411 runs/static25--fresh--light-r1/apl-timing-audit.json
|
||||||
|
ee804c485192544704b18c3b32212c75955324d2f949a481e018da58b71de5ac runs/static25--fresh--light-r1/checkpoint-manifest.json
|
||||||
|
abc4a3320d906ac02a9c73026680b92f4fdc2bc55740c128390f8e94b17dbbcb runs/static25--fresh--light-r1/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--fresh--light-r1/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--fresh--light-r1/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--fresh--light-r1/overlay-manifest.json
|
||||||
|
b11fb0b6d1ac9211f02f05a9809175c64b72e8bcd4c4e4da31be1efbe6a82a83 runs/static25--fresh--light-r1/requests.csv
|
||||||
|
7231cac0a7d0318f4ca60590d1c3f0f6574a31cbdffaf06406690394b3396f90 runs/static25--fresh--light-r1/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--fresh--light-r1/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--fresh--light-r1/source-audit.json
|
||||||
|
7de2f62ecbde41a11db5aa220aed2fa6128e9fb6e65d04357f5373eb21538f81 runs/static25--fresh--light-r1/state.npz
|
||||||
|
32ce77695fb4934adec3eda3b45f186f07a886d30a852cf11f33afa0c4825aa1 runs/static25--fresh--light-r1/summary.json
|
||||||
|
05565f934549e68b2f8900c80b7b5e5887802abb6de30154718c6e297e12daa5 runs/static25--fresh--light-r1/terminal-queues.npz
|
||||||
|
6228c9e8ec19cb7532e65728ec8f2bd6b080dca8379b17bd393979beaba4c6eb runs/static25--fresh--reference-r0/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--fresh--reference-r0/apl-component.json
|
||||||
|
19b32ccdefea22ddc3e2efcc98b919b8fcf69887f029c17dc75bafa5b34259c5 runs/static25--fresh--reference-r0/apl-drive.float32.npy
|
||||||
|
d5194ea98900ca1800416712619143b731d9b3a5d1391180e6881205c7a4d663 runs/static25--fresh--reference-r0/apl-inhibition.float32.npy
|
||||||
|
2dd2e0c79d4ee5299b8c1e8863e6c61b81f3dba08e599011887b1e1621f7c945 runs/static25--fresh--reference-r0/apl-pending-tail.float32.npy
|
||||||
|
5fe5ac53e012232b42a7e717357e9782b247f74da93640a0cfb8a078bc9d4855 runs/static25--fresh--reference-r0/apl-state.float32.npy
|
||||||
|
ea4f779b1cddc07f4db6158655ee27231dbc69d45fc206c35e104db43949ef9f runs/static25--fresh--reference-r0/apl-timing-audit.json
|
||||||
|
e90e3d3d457c1f86feada9206104f5883d13b1744a2fce340262f3b1a58c43dd runs/static25--fresh--reference-r0/checkpoint-manifest.json
|
||||||
|
738c9121fb7ff24213440dcad0206b59f810cccbcb26a3a13daa2ed5e115b960 runs/static25--fresh--reference-r0/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--fresh--reference-r0/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--fresh--reference-r0/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--fresh--reference-r0/overlay-manifest.json
|
||||||
|
3e93bbae67a18944383b2b11a63708ee31e18b8ae7084f24dcb24045c85aa9a7 runs/static25--fresh--reference-r0/queue.jsonl
|
||||||
|
b11fb0b6d1ac9211f02f05a9809175c64b72e8bcd4c4e4da31be1efbe6a82a83 runs/static25--fresh--reference-r0/requests.csv
|
||||||
|
6e2575196d319c12745da19312875ef29e48e1758ea8df39b59ba63b1db9300f runs/static25--fresh--reference-r0/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--fresh--reference-r0/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--fresh--reference-r0/source-audit.json
|
||||||
|
7de2f62ecbde41a11db5aa220aed2fa6128e9fb6e65d04357f5373eb21538f81 runs/static25--fresh--reference-r0/state.npz
|
||||||
|
430141b99fa885f4b28d9df47cde62ca42b457e5ca4be378ef629403b023a36c runs/static25--fresh--reference-r0/summary.json
|
||||||
|
05565f934549e68b2f8900c80b7b5e5887802abb6de30154718c6e297e12daa5 runs/static25--fresh--reference-r0/terminal-queues.npz
|
||||||
|
3428c112a32024b539218aa6f4778cfa8c19c208bbdbfb2567324294370f23ea runs/static25--fresh--reference-r0/tick-state-hashes.jsonl
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/static25--prefix--reference-t0018/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--prefix--reference-t0018/apl-component.json
|
||||||
|
786d0df4e095e384e1508a05f7ae53fa99549a76f4fefb9abd46956ded2538e9 runs/static25--prefix--reference-t0018/apl-drive.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/static25--prefix--reference-t0018/apl-inhibition.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/static25--prefix--reference-t0018/apl-pending-tail.float32.npy
|
||||||
|
96e37646488edb27895a4747f6312fd87b5a4adf7c8a1587fd9f4c6d19acf40d runs/static25--prefix--reference-t0018/apl-state.float32.npy
|
||||||
|
652d4e3c745097ad598eff149b1730e395cd50bdbc5b2813517f90f0ea6f97a4 runs/static25--prefix--reference-t0018/apl-timing-audit.json
|
||||||
|
2eaabd01b41f9d97057a0a79264b2c9ca18442ab8de2f50d3ada906b9cc4d43a runs/static25--prefix--reference-t0018/checkpoint-manifest.json
|
||||||
|
5309d5c19506445ab9c010263b34433f74c57f5df99b2829b27a338c80553a42 runs/static25--prefix--reference-t0018/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--prefix--reference-t0018/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--prefix--reference-t0018/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--prefix--reference-t0018/overlay-manifest.json
|
||||||
|
31167ee501ed919292b7a3803cb3f342bdbaaba0a9420c52d7493ce60ea1f02a runs/static25--prefix--reference-t0018/queue.jsonl
|
||||||
|
078d18f36364578cb8e2f51a82dec0dd068ae61727a40d4c8afc15c82ae9cd62 runs/static25--prefix--reference-t0018/requests.csv
|
||||||
|
d669c5ae11f29d772664f45ca67fd0c6050ad0e4c8a0522df34e69bbc74f21de runs/static25--prefix--reference-t0018/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--prefix--reference-t0018/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--prefix--reference-t0018/source-audit.json
|
||||||
|
da0c8ac8c1da272c4eb1457ae641819ff54d429b04c59fae5170a647a912af12 runs/static25--prefix--reference-t0018/state.npz
|
||||||
|
9f50513b7ec6d50cd1dff16b5b0c7a1e845252141d7093d0ba394638a8453b02 runs/static25--prefix--reference-t0018/summary.json
|
||||||
|
d2b280bb73888521fb2c0747cc09b9c1836bc301aa1bfe2409149c704f67aae2 runs/static25--prefix--reference-t0018/terminal-queues.npz
|
||||||
|
e86786098be7fda04adb06730658f95736ac18fc5d2cd9ff8bb77f0c694e3e4b runs/static25--prefix--reference-t0018/tick-state-hashes.jsonl
|
||||||
|
f902ffb12382261a3993d233eeb3b0b691e4ad9d4b76c36332ee81881ce50bf8 runs/static25--prefix--reference-t0019/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--prefix--reference-t0019/apl-component.json
|
||||||
|
b46c32d5185a7f57b2dcdd4817437b9cf557983cec23d740dd8f65c5e04f0244 runs/static25--prefix--reference-t0019/apl-drive.float32.npy
|
||||||
|
053ac45481cfca6b6e2ac4dc56142bcf53e8c97935fcf104a793f8ea1a55e11b runs/static25--prefix--reference-t0019/apl-inhibition.float32.npy
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/static25--prefix--reference-t0019/apl-pending-tail.float32.npy
|
||||||
|
fe7b33b71fa087406370e5b75dbe4056251e2ba4c57a7f21ef4a1ac282509a8d runs/static25--prefix--reference-t0019/apl-state.float32.npy
|
||||||
|
dd872831fb1699007cc9fe0a6d95f6b22d37f510dc1b8c26643778c309866399 runs/static25--prefix--reference-t0019/apl-timing-audit.json
|
||||||
|
d467a97926538fe1b2b5bb0c659ddb532993bc74404991b0ee4bce4c87007145 runs/static25--prefix--reference-t0019/checkpoint-manifest.json
|
||||||
|
038a3638ab2b13c25fee6178399cd0efb11923383d945116b42d4eeb019d48b5 runs/static25--prefix--reference-t0019/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--prefix--reference-t0019/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--prefix--reference-t0019/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--prefix--reference-t0019/overlay-manifest.json
|
||||||
|
a17831e0c0df6636ac1d0592d95b023f659c5ba1bc820ff7393cf7b51b3ac06d runs/static25--prefix--reference-t0019/queue.jsonl
|
||||||
|
078d18f36364578cb8e2f51a82dec0dd068ae61727a40d4c8afc15c82ae9cd62 runs/static25--prefix--reference-t0019/requests.csv
|
||||||
|
c45508ae5df49ab51f082a20a865e2f6f361642748b16d3bc49a452b93a7ed79 runs/static25--prefix--reference-t0019/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--prefix--reference-t0019/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--prefix--reference-t0019/source-audit.json
|
||||||
|
bcac86eacdc89e7a313891594adc60b30abc2b8632c70b6e7d35bee88d9e85ef runs/static25--prefix--reference-t0019/state.npz
|
||||||
|
94ab49bd487dc7a283f9cf9b1dca9dc25a2a6b50789f2ab285b9cf9bf647275a runs/static25--prefix--reference-t0019/summary.json
|
||||||
|
7b53244c354dcb34f4b51b44265a3e94a7ddc05af816cbca2e7b0dc3c95658ae runs/static25--prefix--reference-t0019/terminal-queues.npz
|
||||||
|
072dd7c530a45bbf03ff24e910f784839ffaf2c45342c817d1e25964b6158b22 runs/static25--prefix--reference-t0019/tick-state-hashes.jsonl
|
||||||
|
add634d007828f026845264a0b93a5c4b5195d60e728c8504e110137222b62bf runs/static25--prefix--reference-t0500/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/static25--prefix--reference-t0500/apl-component.json
|
||||||
|
94a25d3735669b3fe387d632b07dd7a382281f1445b77bf5d3988d040739665c runs/static25--prefix--reference-t0500/apl-drive.float32.npy
|
||||||
|
794b18eecb4f3d7db1f2ef258cb2c3c262bd2bf10415b9784b94879f01230267 runs/static25--prefix--reference-t0500/apl-inhibition.float32.npy
|
||||||
|
c222b8012c2e3edbff7fad90e8dcd51db47b2a541d7109be2872acb96ac94c30 runs/static25--prefix--reference-t0500/apl-pending-tail.float32.npy
|
||||||
|
ee4f8b2d3f6026c1ba5eec5b4e01e18194815d9bb0cee9d56dc77aa93872450b runs/static25--prefix--reference-t0500/apl-state.float32.npy
|
||||||
|
524801a43cc532c797d71c12f41e3d55bc53c061f6dd9135759a532f4d8af351 runs/static25--prefix--reference-t0500/apl-timing-audit.json
|
||||||
|
416bb062900efbcd70d07c650a6e0d3143419dd00ae6cf338945bbfafd850ff9 runs/static25--prefix--reference-t0500/checkpoint-manifest.json
|
||||||
|
d581bb0d3c1a7f7c9f3afcff7bdbdcd7f32c9a9db798bcde1e0c869c38fd13ad runs/static25--prefix--reference-t0500/finite-audit.json
|
||||||
|
03fa596094d386840f2a8e00e59d76eb4dea10b5835a8270e32dce50e7640c38 runs/static25--prefix--reference-t0500/overlay-audit.json
|
||||||
|
7805bd2f86de91777bca86c52870607a2e091ed74b901319b896055ad3463f6d runs/static25--prefix--reference-t0500/overlay-input.npz
|
||||||
|
b0ee003192fbdfd869f8b23c9bbab0ff99079b7bd2bf1dc33b7afef40785a143 runs/static25--prefix--reference-t0500/overlay-manifest.json
|
||||||
|
6c48e15ad128e5518860abe1cc2f4a8492156bdfa0387d748c94d5f800fb123b runs/static25--prefix--reference-t0500/queue.jsonl
|
||||||
|
adf325481c75c9a35aa8874fadbf84067ee5eb530cf5fdb99faaff091d128ed9 runs/static25--prefix--reference-t0500/requests.csv
|
||||||
|
8292f362ed1431979c99b2e9d0eb250b8fdf1439c7ced3ba8ea842f8957cd44e runs/static25--prefix--reference-t0500/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/static25--prefix--reference-t0500/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/static25--prefix--reference-t0500/source-audit.json
|
||||||
|
14d6d10397532cac10847c99064823b8a806e572848311096b4deae8db9d36f2 runs/static25--prefix--reference-t0500/state.npz
|
||||||
|
e8872f06e4f5c21e08dc8861b7682c589ed20bd90263bcc5c6c4d0e8545ff7f8 runs/static25--prefix--reference-t0500/summary.json
|
||||||
|
723cee6e7200100bb05d108f13ca90f4c7740cc07f74645775801c1d9582e0b2 runs/static25--prefix--reference-t0500/terminal-queues.npz
|
||||||
|
e8f5d61c866031e48dcc0b121f2443bf46d46029aa0f93efa976fc7513e1a3d5 runs/static25--prefix--reference-t0500/tick-state-hashes.jsonl
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--light-s00/apl-component.json
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/zero--chain--light-s00/apl-pending-tail.float32.npy
|
||||||
|
e683ba6046e405c6787e6861cfff6b2d5df8b38be7684351810dc2bb8fb65b76 runs/zero--chain--light-s00/apl-timing-audit.json
|
||||||
|
7c15a5a78a6197eec593c553c3625261b47c40a2ee22515ccda5b5d67eefed2e runs/zero--chain--light-s00/checkpoint-manifest.json
|
||||||
|
4d5ecd025cf500818de9c269269596c604b385c795a80442384ae688cb907066 runs/zero--chain--light-s00/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--light-s00/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--light-s00/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--light-s00/overlay-manifest.json
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/zero--chain--light-s00/requests.csv
|
||||||
|
583ac2f17db4e6f29cf049b033c8877383b886bade220b8b8350657e0084ac70 runs/zero--chain--light-s00/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--light-s00/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--light-s00/source-audit.json
|
||||||
|
67943c878314d88e6c34ee89a08ec61dfb9c66c43279766f54946556962b67a3 runs/zero--chain--light-s00/state.npz
|
||||||
|
357c640840a54db7c798cfb157f4fadf97ce9f16b6dca5958939ce689a237eef runs/zero--chain--light-s00/summary.json
|
||||||
|
749a93983ffcf0b89e2b0f67f51bc11134c575d7e8d0230d6ebe333fa20c28ab runs/zero--chain--light-s00/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--light-s01/apl-component.json
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/zero--chain--light-s01/apl-pending-tail.float32.npy
|
||||||
|
a82b3b00fd2366b13e8f89945c353cbff49fd43258d00723cc471eff795c2ef6 runs/zero--chain--light-s01/apl-timing-audit.json
|
||||||
|
3bcfbc0516e918a4ff42ce4c0cf25129ac1b0fcf8fdb0baa9f55923a02b45f9b runs/zero--chain--light-s01/checkpoint-manifest.json
|
||||||
|
29743398a8cdf48b0e9ec249cb77445d18e947f8f76d77a715a660c91cab2717 runs/zero--chain--light-s01/continuation-receipt.json
|
||||||
|
ff22fb288988dea3ac624bcec27359837bdfa4dab244768b252e65e2e1acfa46 runs/zero--chain--light-s01/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--light-s01/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--light-s01/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--light-s01/overlay-manifest.json
|
||||||
|
9e9b4d0a5057a967246555f30a70b9c145b4247ae77722ba562441483182faa8 runs/zero--chain--light-s01/requests.csv
|
||||||
|
a01167b8168aa1a9367b2265ce722d04939ea43ef3e49cfa5092b530b1e0ce54 runs/zero--chain--light-s01/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--light-s01/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--light-s01/source-audit.json
|
||||||
|
93ef29574754b862a88c665589190732acc69f9fecdbf57295f71d9a3ccc99c7 runs/zero--chain--light-s01/state.npz
|
||||||
|
a3d08747b5094df2e75bd9e3c5dc7bd8e2354d3db2aef0a58c5957e0147982d5 runs/zero--chain--light-s01/summary.json
|
||||||
|
cf00897e9128b83a01d32c1c7208449911f34a776fb9a88f78273a91aabf0986 runs/zero--chain--light-s01/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--light-s02/apl-component.json
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/zero--chain--light-s02/apl-pending-tail.float32.npy
|
||||||
|
bf13d66b8834c17b1c68a0d107b1b48258cb2179b548ece5e2c2142fe2ca3df5 runs/zero--chain--light-s02/apl-timing-audit.json
|
||||||
|
61b16179c796301e05f4c6f6989d0d31e0e8da0d7d38f086aecacc9b61d5bfcb runs/zero--chain--light-s02/checkpoint-manifest.json
|
||||||
|
d312355d4f4d4d2b68de8e3e8dfd424b6bf1fa55b9e3f8834dca8fa2c5e604c5 runs/zero--chain--light-s02/continuation-receipt.json
|
||||||
|
f11b37717ad3c092a481adcf78f7caffd688650bf4cb56ab644175721e63a9e8 runs/zero--chain--light-s02/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--light-s02/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--light-s02/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--light-s02/overlay-manifest.json
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/zero--chain--light-s02/requests.csv
|
||||||
|
b2a79c7379f99ad1beec238a3910658b4f88d15d2f153424e896b0f637d6ef2a runs/zero--chain--light-s02/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--light-s02/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--light-s02/source-audit.json
|
||||||
|
e73da12668986893b8fe7d412e2efaa8ebf53478b12bd6081c92f3ab7d0d1960 runs/zero--chain--light-s02/state.npz
|
||||||
|
00148e47ae577a3e9b2cebe2f3f0892a293d2dcf921714232cfa3f40d0eda775 runs/zero--chain--light-s02/summary.json
|
||||||
|
c62e42ea853eba86b021529340bb106425043080632d41a935d107ec32f467b1 runs/zero--chain--light-s02/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--light-s03/apl-component.json
|
||||||
|
8f990c4598e6604cc33eed5d2247e92bb6098c827a504d0265dbb95a9cd6a277 runs/zero--chain--light-s03/apl-pending-tail.float32.npy
|
||||||
|
6869c76a69ee6017aaae46e82d2b88846d4c815ad1a5eaa261b86952d3b204a3 runs/zero--chain--light-s03/apl-timing-audit.json
|
||||||
|
97db003dc84cf99bb92e815fbcbea0796270884da37803b8746041b695d546d3 runs/zero--chain--light-s03/checkpoint-manifest.json
|
||||||
|
08f7563eb2cde422f35f02b329cfc4d9cd4a3f367bd25c71f8e659df6a31cc55 runs/zero--chain--light-s03/continuation-receipt.json
|
||||||
|
bc6bed2daa41d4da6889855500104c569bb2719d61235bc29016cce9e2cf66ea runs/zero--chain--light-s03/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--light-s03/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--light-s03/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--light-s03/overlay-manifest.json
|
||||||
|
bf0cc878e78bdbc1272833829ab7ac0dd3734e1b84a8f4c6d61c4f3ac05bae5f runs/zero--chain--light-s03/requests.csv
|
||||||
|
71506e5e0eea3964987a1d0eaade3be6268b478d6a9ec4c5c0244fd254b57977 runs/zero--chain--light-s03/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--light-s03/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--light-s03/source-audit.json
|
||||||
|
39fed967ede12bd1f085c60aabe527bd5138b5af8f20063d80374e15e689e92e runs/zero--chain--light-s03/state.npz
|
||||||
|
1d753fe8c8ef4a3f1860beb329d38481a2d513fc01b1a23e5459eed930436f48 runs/zero--chain--light-s03/summary.json
|
||||||
|
5140f54c237a9574f1ec163220dc8a8047fcf87ff1914a5a8bb27dcff2d35171 runs/zero--chain--light-s03/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--light-s04/apl-component.json
|
||||||
|
fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f runs/zero--chain--light-s04/apl-pending-tail.float32.npy
|
||||||
|
9e875aafc55f7262ef202b3ce212a74a3d162fb979bf73b6311ac673cbf7a85e runs/zero--chain--light-s04/apl-timing-audit.json
|
||||||
|
385b9b1b62d0f184c8766ca28548f2f5553fb01a8f3cd1ad6ff68e6c08fe16f5 runs/zero--chain--light-s04/checkpoint-manifest.json
|
||||||
|
d55caf73ebce88295e08c19811498955282d2738baafd60b5ed4b62c3d69efac runs/zero--chain--light-s04/continuation-receipt.json
|
||||||
|
a05afce6c67cea10bc322ff0030ec422a9ddbd29c60bd313995332e70da4fc99 runs/zero--chain--light-s04/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--light-s04/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--light-s04/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--light-s04/overlay-manifest.json
|
||||||
|
1a6f62e6b9e67770a5ed6344ae54dc001505704c13c515d4c6e033aba0993f4b runs/zero--chain--light-s04/requests.csv
|
||||||
|
86f748bfd55b949ab85cfffcf1c398991fcedae2534eac6adc08907d003f1eae runs/zero--chain--light-s04/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--light-s04/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--light-s04/source-audit.json
|
||||||
|
b79df8b2c159057fdfdb40fa960d8b9c23bdded285509f9fb3c08ca5b4497fe3 runs/zero--chain--light-s04/state.npz
|
||||||
|
583461c010f7104493676a7a2340683d215e84b5c1c7466949158d92e65df727 runs/zero--chain--light-s04/summary.json
|
||||||
|
ef4b594ae6e22c1cbea7b1b80393fc313f6ace376e77bb6609ba44871eb0767e runs/zero--chain--light-s04/terminal-queues.npz
|
||||||
|
f1c06741513c8fca5911c4389abae361c2d5d04ca81896b4d8d87941146446d1 runs/zero--chain--reference-s00/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--reference-s00/apl-component.json
|
||||||
|
d3795834abfcadbbeb0f1ba994182acd9e27d997d308be4c4ec95a8b5de215e0 runs/zero--chain--reference-s00/apl-drive.float32.npy
|
||||||
|
f1c06741513c8fca5911c4389abae361c2d5d04ca81896b4d8d87941146446d1 runs/zero--chain--reference-s00/apl-inhibition.float32.npy
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/zero--chain--reference-s00/apl-pending-tail.float32.npy
|
||||||
|
d3795834abfcadbbeb0f1ba994182acd9e27d997d308be4c4ec95a8b5de215e0 runs/zero--chain--reference-s00/apl-state.float32.npy
|
||||||
|
f9123943d2616754e13637d92d6e2b3f3539a58df2b934879d40e227cf14ad4d runs/zero--chain--reference-s00/apl-timing-audit.json
|
||||||
|
01ad785a6d5e94a8e83c80a3d48e91f245432b446c8fc907d9644850f9370d01 runs/zero--chain--reference-s00/checkpoint-manifest.json
|
||||||
|
56d70ced7cb5b01d0e7fe74ef6d539cf8e80412b99a0e4f73a8197dea0ed914f runs/zero--chain--reference-s00/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--reference-s00/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--reference-s00/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--reference-s00/overlay-manifest.json
|
||||||
|
081cb361f63c9afe550371b67f2bfa784c63396af1b40cdbc34e26c395bdbd96 runs/zero--chain--reference-s00/queue.jsonl
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/zero--chain--reference-s00/requests.csv
|
||||||
|
0c91d3a0e978c78e1636bf11846ddd0b56ceef2376f3f1dbff6eb428c404b123 runs/zero--chain--reference-s00/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--reference-s00/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--reference-s00/source-audit.json
|
||||||
|
67943c878314d88e6c34ee89a08ec61dfb9c66c43279766f54946556962b67a3 runs/zero--chain--reference-s00/state.npz
|
||||||
|
a79e66e788f70070dd7d4bbc8ac937e93619aa63922d3569108afcce1f8c1f42 runs/zero--chain--reference-s00/summary.json
|
||||||
|
749a93983ffcf0b89e2b0f67f51bc11134c575d7e8d0230d6ebe333fa20c28ab runs/zero--chain--reference-s00/terminal-queues.npz
|
||||||
|
c96bf4166cdda9ba70e3f0f2382d3d65d78abd725fc071cc49be7b2d34d2d83b runs/zero--chain--reference-s00/tick-state-hashes.jsonl
|
||||||
|
1f1c042aaaf27898fbdbbe5e9ed0bde7617eae632801faac21e10d07d234e9bf runs/zero--chain--reference-s01/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--reference-s01/apl-component.json
|
||||||
|
9a4600c8a58e8bab325e379a4cc99e960afcf475e13c3157737db053a91b3304 runs/zero--chain--reference-s01/apl-drive.float32.npy
|
||||||
|
514da41968400fa6865cfb2f19398e6d29fa32958bf217a54c644fcddc417f52 runs/zero--chain--reference-s01/apl-inhibition.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/zero--chain--reference-s01/apl-pending-tail.float32.npy
|
||||||
|
89dac2c9bc0b766424ab963f22c5706381728bb5f48a179bf30c5244084098bb runs/zero--chain--reference-s01/apl-state.float32.npy
|
||||||
|
7954927d3b1f5a2116a391830b004a2c82e9dcb19143bff7444f12f04591e9b5 runs/zero--chain--reference-s01/apl-timing-audit.json
|
||||||
|
4be0d1ac31613a5ba3fafae8d80e1a1be55f0ce2a56b54c4b3abbb24fd5705bd runs/zero--chain--reference-s01/checkpoint-manifest.json
|
||||||
|
664432cdb79a5afbae67531a9f9b990167f3ababa6a7c8e881e9841ff8c346c0 runs/zero--chain--reference-s01/continuation-receipt.json
|
||||||
|
bf5ad06fff9de0534f3431881cc615aea335773307fed93d870d9d0bcae9528a runs/zero--chain--reference-s01/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--reference-s01/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--reference-s01/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--reference-s01/overlay-manifest.json
|
||||||
|
59dcafed60163245561db96222a74c7077a39efe4160681d03d1387738726dd0 runs/zero--chain--reference-s01/queue.jsonl
|
||||||
|
9e9b4d0a5057a967246555f30a70b9c145b4247ae77722ba562441483182faa8 runs/zero--chain--reference-s01/requests.csv
|
||||||
|
84baed1ae5d453b789f5ed9ff06fbe787d18395bdb611ffe756c9256ffaa916b runs/zero--chain--reference-s01/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--reference-s01/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--reference-s01/source-audit.json
|
||||||
|
93ef29574754b862a88c665589190732acc69f9fecdbf57295f71d9a3ccc99c7 runs/zero--chain--reference-s01/state.npz
|
||||||
|
0c8ff599c93cef11c5ed8c019785c7304361054f64a03520f78819ebc74f29ef runs/zero--chain--reference-s01/summary.json
|
||||||
|
cf00897e9128b83a01d32c1c7208449911f34a776fb9a88f78273a91aabf0986 runs/zero--chain--reference-s01/terminal-queues.npz
|
||||||
|
c5859a1dd79ec0403139e23c1e262fb2521a1534dac7c584afad437b44ec8d22 runs/zero--chain--reference-s01/tick-state-hashes.jsonl
|
||||||
|
8b3bc91ea0e86a20feccfb2327e65b92e3e4aa2de93782a4eb1d757e687ff0fe runs/zero--chain--reference-s02/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--reference-s02/apl-component.json
|
||||||
|
ae978ab20d186085d5a14508a08f4d42e3d54167e9517379bbeaa40e2c424b8c runs/zero--chain--reference-s02/apl-drive.float32.npy
|
||||||
|
8c846229ace8008635319ff5125fc77a0588f99bc23da4b1cf215e2660dd144c runs/zero--chain--reference-s02/apl-inhibition.float32.npy
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/zero--chain--reference-s02/apl-pending-tail.float32.npy
|
||||||
|
5a33b8bdc6829523b3b6eb5ef7189823a06e59f6e6effb1e25164cf0966e5701 runs/zero--chain--reference-s02/apl-state.float32.npy
|
||||||
|
7c6e6b649d7fe7514ff3bbfa1d9d72e1f1746f693c7dff0a15afc91c86a9175e runs/zero--chain--reference-s02/apl-timing-audit.json
|
||||||
|
670ca9c79c29791df8f2107272ef50010e97b1d7dbe2f7ea85d519364f903647 runs/zero--chain--reference-s02/checkpoint-manifest.json
|
||||||
|
5de41af972d382dc672c43c77343c6c02321d29dc6b652e40350e4fa7ec5b1b2 runs/zero--chain--reference-s02/continuation-receipt.json
|
||||||
|
7fe8fdc62c85adc3187ac92c4c136af4037784cde7b87f95d381e53b184ad486 runs/zero--chain--reference-s02/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--reference-s02/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--reference-s02/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--reference-s02/overlay-manifest.json
|
||||||
|
91a4d67c2c5d3efcc20534451768b0152c3cee354f06cb0108fee5ed17a2f73c runs/zero--chain--reference-s02/queue.jsonl
|
||||||
|
d2250de77a7723e0237f53b54038377b5502ccf3a549cc08f3344a1e924b99ac runs/zero--chain--reference-s02/requests.csv
|
||||||
|
1c7ddbd49568d94d4f83e82ac8a1846308d3d494b8f9448a65e33e775a1b2e2d runs/zero--chain--reference-s02/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--reference-s02/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--reference-s02/source-audit.json
|
||||||
|
e73da12668986893b8fe7d412e2efaa8ebf53478b12bd6081c92f3ab7d0d1960 runs/zero--chain--reference-s02/state.npz
|
||||||
|
8ed3bada34ab7a7beab8e5a1c4b897eb782c9451fa8e9b142f25202f994cfd6a runs/zero--chain--reference-s02/summary.json
|
||||||
|
c62e42ea853eba86b021529340bb106425043080632d41a935d107ec32f467b1 runs/zero--chain--reference-s02/terminal-queues.npz
|
||||||
|
c0c09c5f8a0038f5c569848d26e4bd7470cf3826cb77838a0bdd1de9f8c583d7 runs/zero--chain--reference-s02/tick-state-hashes.jsonl
|
||||||
|
40f5e76e9743ff231577b45fa5fb28a61b56e63e744a2edf0e269523d42ec1ba runs/zero--chain--reference-s03/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--reference-s03/apl-component.json
|
||||||
|
ef47e4cee995504243550b48a7665007419c8c512c116ee7312f11ba5b70f654 runs/zero--chain--reference-s03/apl-drive.float32.npy
|
||||||
|
27f4bd3da4cb101595d5f9b88ca8162cf5d544cbf90048aed697f8434698ec16 runs/zero--chain--reference-s03/apl-inhibition.float32.npy
|
||||||
|
8f990c4598e6604cc33eed5d2247e92bb6098c827a504d0265dbb95a9cd6a277 runs/zero--chain--reference-s03/apl-pending-tail.float32.npy
|
||||||
|
bfee2aa531d7e87c1db652c5e4fb41a467dd4ec6f5b5e80866f46a92a1df5b84 runs/zero--chain--reference-s03/apl-state.float32.npy
|
||||||
|
d03ae83816b801d763bae7871c938621405145aed4ed88351db723e6230284d2 runs/zero--chain--reference-s03/apl-timing-audit.json
|
||||||
|
7d06d07087c1c39396b9160ce39e5cf31b8b1893f098f0bb78397b927084a504 runs/zero--chain--reference-s03/checkpoint-manifest.json
|
||||||
|
aeea580f2eb345ad135ce8a5112a82a66afbd105a9ff5d929ab8107d3a04d86d runs/zero--chain--reference-s03/continuation-receipt.json
|
||||||
|
048b38a7d3af3e9204ff83c5f47623e65c6cd11e694e3fb2326079423e4db8b9 runs/zero--chain--reference-s03/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--reference-s03/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--reference-s03/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--reference-s03/overlay-manifest.json
|
||||||
|
cb1d8970bdfa133348308a296f47022c0595c12fa101aefdd9053f73ce4bc299 runs/zero--chain--reference-s03/queue.jsonl
|
||||||
|
bf0cc878e78bdbc1272833829ab7ac0dd3734e1b84a8f4c6d61c4f3ac05bae5f runs/zero--chain--reference-s03/requests.csv
|
||||||
|
abdd7dda65fce4a0d4b37fc53a69d8b9b8475d52f917a2f2e8268ea507c073ed runs/zero--chain--reference-s03/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--reference-s03/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--reference-s03/source-audit.json
|
||||||
|
39fed967ede12bd1f085c60aabe527bd5138b5af8f20063d80374e15e689e92e runs/zero--chain--reference-s03/state.npz
|
||||||
|
9571eee391b8ca523afbe14ded5bebd61caf22e1af32ea7ba2999f7e3d7d5485 runs/zero--chain--reference-s03/summary.json
|
||||||
|
5140f54c237a9574f1ec163220dc8a8047fcf87ff1914a5a8bb27dcff2d35171 runs/zero--chain--reference-s03/terminal-queues.npz
|
||||||
|
5f2bfd378ee2df1deaf630b96b111cbfb1d8ba55e80dde6e0e2b0fe53a5978c8 runs/zero--chain--reference-s03/tick-state-hashes.jsonl
|
||||||
|
c1450e6d7810e5c249534aade9da4a46aa681b5e99f6ff4598c16088d656efe2 runs/zero--chain--reference-s04/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--chain--reference-s04/apl-component.json
|
||||||
|
63a934273e5fa60562cdbd141666c3ab2d6ff39483832a7dfd5368b8e06d68db runs/zero--chain--reference-s04/apl-drive.float32.npy
|
||||||
|
c03168a440cd20ec2e6f5dd452998861e24f86517830272f6dc642dbca9c73be runs/zero--chain--reference-s04/apl-inhibition.float32.npy
|
||||||
|
fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f runs/zero--chain--reference-s04/apl-pending-tail.float32.npy
|
||||||
|
7e9e0e218f2002d6e0c6cb72969133a08da46469ea8ed45187b963b303f72930 runs/zero--chain--reference-s04/apl-state.float32.npy
|
||||||
|
f1cd871ccd389920d6374cba317d0642c59182ebf34052340ac3130b16bcbf2a runs/zero--chain--reference-s04/apl-timing-audit.json
|
||||||
|
a8864ab9ce28e52a0ca21ed388f19459007cc12281a18e55dee2779b60a6ec77 runs/zero--chain--reference-s04/checkpoint-manifest.json
|
||||||
|
f53bfbe7a0f6ec6f74b424c6eec988d91112f161d7e72ed15b4381991cb35d1c runs/zero--chain--reference-s04/continuation-receipt.json
|
||||||
|
d581bb0d3c1a7f7c9f3afcff7bdbdcd7f32c9a9db798bcde1e0c869c38fd13ad runs/zero--chain--reference-s04/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--chain--reference-s04/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--chain--reference-s04/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--chain--reference-s04/overlay-manifest.json
|
||||||
|
7114b8d823b83e7dd8bc65e82b0688c1704bcaf601e527b00e64a7ac4449f5ea runs/zero--chain--reference-s04/queue.jsonl
|
||||||
|
1a6f62e6b9e67770a5ed6344ae54dc001505704c13c515d4c6e033aba0993f4b runs/zero--chain--reference-s04/requests.csv
|
||||||
|
949a200d2e5392dd20a38e88b2f80c723383b2cd71bdea62be83e9dad3d03444 runs/zero--chain--reference-s04/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--chain--reference-s04/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--chain--reference-s04/source-audit.json
|
||||||
|
b79df8b2c159057fdfdb40fa960d8b9c23bdded285509f9fb3c08ca5b4497fe3 runs/zero--chain--reference-s04/state.npz
|
||||||
|
0a4cf0d9238a0de8553829cad8e24f5b7b8e70bb31ef1ae4ca6ad76c2c574f16 runs/zero--chain--reference-s04/summary.json
|
||||||
|
ef4b594ae6e22c1cbea7b1b80393fc313f6ace376e77bb6609ba44871eb0767e runs/zero--chain--reference-s04/terminal-queues.npz
|
||||||
|
654b6dcf15a7c0428ed6be6bac96d44cf8af205a42f01fd06dce1dfca367922c runs/zero--chain--reference-s04/tick-state-hashes.jsonl
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--fresh--light-r0/apl-component.json
|
||||||
|
fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f runs/zero--fresh--light-r0/apl-pending-tail.float32.npy
|
||||||
|
cf1dc0658c942cf5f7e09c9c8dfa7ec49e5762d97e7c7cda1ccca3688552cbf5 runs/zero--fresh--light-r0/apl-timing-audit.json
|
||||||
|
c324a7b4b847a96a49fa92f93617e5fc13ace140619bef48384da38a0e1551bf runs/zero--fresh--light-r0/checkpoint-manifest.json
|
||||||
|
4542696366df32a26cb71337d5999684d0d0c6e3d81a06430558ec8b793e6c12 runs/zero--fresh--light-r0/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--fresh--light-r0/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--fresh--light-r0/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--fresh--light-r0/overlay-manifest.json
|
||||||
|
4bcc9ef7fdc596ddac3be3b0d29f0aea2e086deeb803f3a90baba21b5490ef53 runs/zero--fresh--light-r0/requests.csv
|
||||||
|
7e2f1e3a4fd6b2ae86b34e8be3b67c7ffa645cd1bb1a069b9a555f2ee15c8a20 runs/zero--fresh--light-r0/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--fresh--light-r0/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--fresh--light-r0/source-audit.json
|
||||||
|
933afdc1bd0ea81174aeb334f017cfbe1bbc0a72f8eca767698275c5dca886f3 runs/zero--fresh--light-r0/state.npz
|
||||||
|
5170c782bd90a0d25dc6a82a41f0ef4fafacde304d9f5bf57dd851f7024970c5 runs/zero--fresh--light-r0/summary.json
|
||||||
|
cf43a90cc755aaa3aa7a34401dda5da2619e52aa915c3c841c487100e92eb947 runs/zero--fresh--light-r0/terminal-queues.npz
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--fresh--light-r1/apl-component.json
|
||||||
|
fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f runs/zero--fresh--light-r1/apl-pending-tail.float32.npy
|
||||||
|
cf1dc0658c942cf5f7e09c9c8dfa7ec49e5762d97e7c7cda1ccca3688552cbf5 runs/zero--fresh--light-r1/apl-timing-audit.json
|
||||||
|
474d4b831f99efdb791ed11d18674919355b032092708fcd2923118f7883395a runs/zero--fresh--light-r1/checkpoint-manifest.json
|
||||||
|
4542696366df32a26cb71337d5999684d0d0c6e3d81a06430558ec8b793e6c12 runs/zero--fresh--light-r1/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--fresh--light-r1/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--fresh--light-r1/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--fresh--light-r1/overlay-manifest.json
|
||||||
|
4bcc9ef7fdc596ddac3be3b0d29f0aea2e086deeb803f3a90baba21b5490ef53 runs/zero--fresh--light-r1/requests.csv
|
||||||
|
3bacbb31a56eb30f74714a774795e3695a54c3412df9a64e4c9a182c039ce088 runs/zero--fresh--light-r1/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--fresh--light-r1/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--fresh--light-r1/source-audit.json
|
||||||
|
933afdc1bd0ea81174aeb334f017cfbe1bbc0a72f8eca767698275c5dca886f3 runs/zero--fresh--light-r1/state.npz
|
||||||
|
fbdda7b83cbb13f2c0f9c2309dad2c1001c726515f3ea1cabd9b32e61838f419 runs/zero--fresh--light-r1/summary.json
|
||||||
|
cf43a90cc755aaa3aa7a34401dda5da2619e52aa915c3c841c487100e92eb947 runs/zero--fresh--light-r1/terminal-queues.npz
|
||||||
|
b3a535bc095db2464a75560ed11f336a9db8e843c08fd7681a1b9759b624ad8e runs/zero--fresh--reference-r0/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--fresh--reference-r0/apl-component.json
|
||||||
|
8b6432e8947f4c67466b5cae28cb0d0877b61862e80e6d9b10c5734d9afa8411 runs/zero--fresh--reference-r0/apl-drive.float32.npy
|
||||||
|
8f9e59026dc7c7663abf8f7abc60ebf93b11a68483bc0960d375a83731acc859 runs/zero--fresh--reference-r0/apl-inhibition.float32.npy
|
||||||
|
fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f runs/zero--fresh--reference-r0/apl-pending-tail.float32.npy
|
||||||
|
36ecfec747be0c700959ba1ac171b81a1f3471aa9baba41b7bb6a67be01213c2 runs/zero--fresh--reference-r0/apl-state.float32.npy
|
||||||
|
d2d8c4375d967b7a9a0fccba9bdd70b4d5c558b4a268c9221c105575480ae5ab runs/zero--fresh--reference-r0/apl-timing-audit.json
|
||||||
|
f5b68645f57b7221654ab25ae217a266f1d4a571494b56a49e44752fa9c64da9 runs/zero--fresh--reference-r0/checkpoint-manifest.json
|
||||||
|
738c9121fb7ff24213440dcad0206b59f810cccbcb26a3a13daa2ed5e115b960 runs/zero--fresh--reference-r0/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--fresh--reference-r0/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--fresh--reference-r0/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--fresh--reference-r0/overlay-manifest.json
|
||||||
|
22fbf106279d5ad314beba357137701df111bb28b57accdb09a0e299dfdf39cf runs/zero--fresh--reference-r0/queue.jsonl
|
||||||
|
4bcc9ef7fdc596ddac3be3b0d29f0aea2e086deeb803f3a90baba21b5490ef53 runs/zero--fresh--reference-r0/requests.csv
|
||||||
|
399b314d757631301f57efa5acbda84e53bef688cf7c410e5ed6d8877bf6652f runs/zero--fresh--reference-r0/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--fresh--reference-r0/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--fresh--reference-r0/source-audit.json
|
||||||
|
933afdc1bd0ea81174aeb334f017cfbe1bbc0a72f8eca767698275c5dca886f3 runs/zero--fresh--reference-r0/state.npz
|
||||||
|
e8994b989c65f7519fba987ec965472e6caf9c826eec85348ae4dd4d2d0a207e runs/zero--fresh--reference-r0/summary.json
|
||||||
|
cf43a90cc755aaa3aa7a34401dda5da2619e52aa915c3c841c487100e92eb947 runs/zero--fresh--reference-r0/terminal-queues.npz
|
||||||
|
0266afe78eadd1ea5bfb25026103d01d2af82d9b6ce2bcbb9d60e576ac898e91 runs/zero--fresh--reference-r0/tick-state-hashes.jsonl
|
||||||
|
f4c6097555e9bca1551d23df2751afd3d8ae6914559233707de894b51c9dd200 runs/zero--prefix--reference-t0018/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--prefix--reference-t0018/apl-component.json
|
||||||
|
786d0df4e095e384e1508a05f7ae53fa99549a76f4fefb9abd46956ded2538e9 runs/zero--prefix--reference-t0018/apl-drive.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/zero--prefix--reference-t0018/apl-inhibition.float32.npy
|
||||||
|
3b0d33abfbd75b2e48c3d48bff3f3374a9f3845543cd2626ca341d1c4532286d runs/zero--prefix--reference-t0018/apl-pending-tail.float32.npy
|
||||||
|
96e37646488edb27895a4747f6312fd87b5a4adf7c8a1587fd9f4c6d19acf40d runs/zero--prefix--reference-t0018/apl-state.float32.npy
|
||||||
|
652d4e3c745097ad598eff149b1730e395cd50bdbc5b2813517f90f0ea6f97a4 runs/zero--prefix--reference-t0018/apl-timing-audit.json
|
||||||
|
f170d4f77221bf2e106b31e5913de8cdcdf19b4dd7b2368705fe29b48c2176ab runs/zero--prefix--reference-t0018/checkpoint-manifest.json
|
||||||
|
5309d5c19506445ab9c010263b34433f74c57f5df99b2829b27a338c80553a42 runs/zero--prefix--reference-t0018/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--prefix--reference-t0018/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--prefix--reference-t0018/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--prefix--reference-t0018/overlay-manifest.json
|
||||||
|
31167ee501ed919292b7a3803cb3f342bdbaaba0a9420c52d7493ce60ea1f02a runs/zero--prefix--reference-t0018/queue.jsonl
|
||||||
|
078d18f36364578cb8e2f51a82dec0dd068ae61727a40d4c8afc15c82ae9cd62 runs/zero--prefix--reference-t0018/requests.csv
|
||||||
|
18b7e22ca0a9af4b8c3fcabc504f19911fcac37443d6f915168c345b4ac43643 runs/zero--prefix--reference-t0018/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--prefix--reference-t0018/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--prefix--reference-t0018/source-audit.json
|
||||||
|
da0c8ac8c1da272c4eb1457ae641819ff54d429b04c59fae5170a647a912af12 runs/zero--prefix--reference-t0018/state.npz
|
||||||
|
b4de6d62ced85e4a957e6a00cd20c77cb6c224df85342e8a0d3d4228ce661221 runs/zero--prefix--reference-t0018/summary.json
|
||||||
|
d2b280bb73888521fb2c0747cc09b9c1836bc301aa1bfe2409149c704f67aae2 runs/zero--prefix--reference-t0018/terminal-queues.npz
|
||||||
|
e86786098be7fda04adb06730658f95736ac18fc5d2cd9ff8bb77f0c694e3e4b runs/zero--prefix--reference-t0018/tick-state-hashes.jsonl
|
||||||
|
f902ffb12382261a3993d233eeb3b0b691e4ad9d4b76c36332ee81881ce50bf8 runs/zero--prefix--reference-t0019/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--prefix--reference-t0019/apl-component.json
|
||||||
|
b46c32d5185a7f57b2dcdd4817437b9cf557983cec23d740dd8f65c5e04f0244 runs/zero--prefix--reference-t0019/apl-drive.float32.npy
|
||||||
|
053ac45481cfca6b6e2ac4dc56142bcf53e8c97935fcf104a793f8ea1a55e11b runs/zero--prefix--reference-t0019/apl-inhibition.float32.npy
|
||||||
|
1f730d8d9b512d19d1cb4af20c85dcb56d60dde2a6fcdea5000f9078415850d3 runs/zero--prefix--reference-t0019/apl-pending-tail.float32.npy
|
||||||
|
fe7b33b71fa087406370e5b75dbe4056251e2ba4c57a7f21ef4a1ac282509a8d runs/zero--prefix--reference-t0019/apl-state.float32.npy
|
||||||
|
dd872831fb1699007cc9fe0a6d95f6b22d37f510dc1b8c26643778c309866399 runs/zero--prefix--reference-t0019/apl-timing-audit.json
|
||||||
|
d136be24c76c5435ef82231b24e6534d265bc90beed96610a509eac71d5256c0 runs/zero--prefix--reference-t0019/checkpoint-manifest.json
|
||||||
|
038a3638ab2b13c25fee6178399cd0efb11923383d945116b42d4eeb019d48b5 runs/zero--prefix--reference-t0019/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--prefix--reference-t0019/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--prefix--reference-t0019/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--prefix--reference-t0019/overlay-manifest.json
|
||||||
|
a17831e0c0df6636ac1d0592d95b023f659c5ba1bc820ff7393cf7b51b3ac06d runs/zero--prefix--reference-t0019/queue.jsonl
|
||||||
|
078d18f36364578cb8e2f51a82dec0dd068ae61727a40d4c8afc15c82ae9cd62 runs/zero--prefix--reference-t0019/requests.csv
|
||||||
|
91b5e9e2015d961ccbac177f920371c361d212c03769ff264ded6e2ed97a0079 runs/zero--prefix--reference-t0019/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--prefix--reference-t0019/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--prefix--reference-t0019/source-audit.json
|
||||||
|
bcac86eacdc89e7a313891594adc60b30abc2b8632c70b6e7d35bee88d9e85ef runs/zero--prefix--reference-t0019/state.npz
|
||||||
|
35673b9fcbe682ab98ab3f4babb05d151cc91522279fb10ad2b520adf7587803 runs/zero--prefix--reference-t0019/summary.json
|
||||||
|
7b53244c354dcb34f4b51b44265a3e94a7ddc05af816cbca2e7b0dc3c95658ae runs/zero--prefix--reference-t0019/terminal-queues.npz
|
||||||
|
072dd7c530a45bbf03ff24e910f784839ffaf2c45342c817d1e25964b6158b22 runs/zero--prefix--reference-t0019/tick-state-hashes.jsonl
|
||||||
|
d24f161f31abb6dd6d57dc0a74b5bca65ae2b35325d50f16815d9442f0dd73b9 runs/zero--prefix--reference-t0500/apl-applied.float32.npy
|
||||||
|
7a49a1a8fbe42b3965913b8e483ef729ba1f13c211f8da7f10b4b2cd142e6882 runs/zero--prefix--reference-t0500/apl-component.json
|
||||||
|
f8501880df7d53b60d22258457f584db10e76db2510d3a2013c87b80676e43d5 runs/zero--prefix--reference-t0500/apl-drive.float32.npy
|
||||||
|
fea94545b7bdc2b4e2e439e09e2b610f9e23404d5b5935b0ade3db75f9175f1a runs/zero--prefix--reference-t0500/apl-inhibition.float32.npy
|
||||||
|
8f990c4598e6604cc33eed5d2247e92bb6098c827a504d0265dbb95a9cd6a277 runs/zero--prefix--reference-t0500/apl-pending-tail.float32.npy
|
||||||
|
088a2194a613eff7650ddb6c74a81f6d17ee2c0d1145058eaacab6e37a227861 runs/zero--prefix--reference-t0500/apl-state.float32.npy
|
||||||
|
253e599852f3ba8c6e22f258dab2c3832c68e578d2ce28287b86c57a452a839d runs/zero--prefix--reference-t0500/apl-timing-audit.json
|
||||||
|
2e72393a6676ba738739d61f6992289c2d11793449a5efb15a40c6525ae7924a runs/zero--prefix--reference-t0500/checkpoint-manifest.json
|
||||||
|
d581bb0d3c1a7f7c9f3afcff7bdbdcd7f32c9a9db798bcde1e0c869c38fd13ad runs/zero--prefix--reference-t0500/finite-audit.json
|
||||||
|
bb8ddbcdb4f17c36a7352f0aa863f68e0ba92c3c8507bd99b85df224035d9379 runs/zero--prefix--reference-t0500/overlay-audit.json
|
||||||
|
0b219eab09c30dc3af31fef7e6395a9bec1234090abbb72db096da833fed82c5 runs/zero--prefix--reference-t0500/overlay-input.npz
|
||||||
|
11b668978f3070dad26d99d9310bebefa0731fa0d4e361e8dc0ef02a213277c2 runs/zero--prefix--reference-t0500/overlay-manifest.json
|
||||||
|
10ced8f9b403e850c430dbe68d3f84e7f6458f0f57ca46effcef7d86f5cdbde9 runs/zero--prefix--reference-t0500/queue.jsonl
|
||||||
|
46d029c30d77cf99a69617f02957ecc7cea2b942a46caaee5157ff28283869a9 runs/zero--prefix--reference-t0500/requests.csv
|
||||||
|
24ae913b96c3c8b8fa4804a99e822b8fde7bded231d274d9592bfedf08440237 runs/zero--prefix--reference-t0500/runtime-provenance.json
|
||||||
|
0584f865885b18e6a36870a7ecfbbc98d7a94274fa5e9e073e7cf97597d78a03 runs/zero--prefix--reference-t0500/sealed-gpu-source.diff
|
||||||
|
d644f0265632f117bba0e045d26fb266765b1d005a89426b6242f3de034be935 runs/zero--prefix--reference-t0500/source-audit.json
|
||||||
|
399dede1263e20c74edaa4e294bcfc3453dc6b10271a200534b608c59fc75aae runs/zero--prefix--reference-t0500/state.npz
|
||||||
|
ba9d1046ed7536816e2c82ee2ca25181207cdc2d0277f8e929eef529e8544ffa runs/zero--prefix--reference-t0500/summary.json
|
||||||
|
c6b90eaa65808847d512bead4a983493a88d2ef368b48f6d389501771113e62a runs/zero--prefix--reference-t0500/terminal-queues.npz
|
||||||
|
3493765ab82b625634049e5cd32c22f55d302ee510250acddf8d4261e1c548e8 runs/zero--prefix--reference-t0500/tick-state-hashes.jsonl
|
||||||
|
e8952a48cd3ea6a93c811a1183a1f7b79e19646299924e7688e5f393737a9aa2 manifest.json
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
COMPLETED ENGINEERING ROW static25--chain--light-s00
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
COMPLETED ENGINEERING ROW static25--chain--light-s01
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
COMPLETED ENGINEERING ROW static25--chain--light-s02
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user