Seal Phase 4AK frozen D18 independent validation
This commit is contained in:
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 29368,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 4.4330954551696777e-07,
|
||||
"max_bound_utilization": 1.1255846215596215e-05,
|
||||
"max_error_bound": 0.07659348333922923,
|
||||
"max_relative_error_nonzero_reference": 1.1296086159079982e-07,
|
||||
"mean_abs_error": 1.862645149230957e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 4.445260958441111e-06,
|
||||
"max_bound_utilization": 6.665149070935509e-05,
|
||||
"max_error_bound": 0.07816517227600407,
|
||||
"max_relative_error_nonzero_reference": 6.695233609882282e-07,
|
||||
"mean_abs_error": 2.497939558179807e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 8.397293098028058e-05,
|
||||
"max_bound_utilization": 5.497153936634678e-05,
|
||||
"max_error_bound": 1.7306627481890076,
|
||||
"max_relative_error_nonzero_reference": 5.522214025342151e-07,
|
||||
"mean_abs_error": 2.1755705714919985e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/controls/cal-matched_energy-00-s51101-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "945f263c84f91569984961e9c04bec1b316195bb5a08151119ce4b9c03adfab2",
|
||||
"apl-inhibition.float32.npy": "b6f3741e964b3d57261be82727a08c8555aa1ef3af611dfea1aba20543421ee3",
|
||||
"apl-state.float32.npy": "d3c52200188a64b9b7dc5054c9a6199a4cd4a9168369f051b6de2d764442e64b",
|
||||
"state.npz": "17f9aa5c6748b0dc028c551ae6c91edaeea40b8d7561656a0936ff716ca74f0b",
|
||||
"summary.json": "2528b6ce72406feb3ee3256b0ffd0400ce2acbb4888bc414875862015f777259"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 8,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 29672,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 3.5762786865234375e-07,
|
||||
"max_bound_utilization": 1.1129652859651151e-05,
|
||||
"max_error_bound": 0.06850973674407951,
|
||||
"max_relative_error_nonzero_reference": 1.1169441658599537e-07,
|
||||
"mean_abs_error": 1.7873942852020264e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 5.347266883504176e-06,
|
||||
"max_bound_utilization": 7.933359526698304e-05,
|
||||
"max_error_bound": 0.07767639555002429,
|
||||
"max_relative_error_nonzero_reference": 7.980238963080976e-07,
|
||||
"mean_abs_error": 3.382391482195504e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 0.0001079866522957218,
|
||||
"max_bound_utilization": 6.987172912306554e-05,
|
||||
"max_error_bound": 1.753313621761298,
|
||||
"max_relative_error_nonzero_reference": 7.028256069891883e-07,
|
||||
"mean_abs_error": 2.949250549552969e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/controls/cal-physiological-00-s51101-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "383cafd480aadca9ca7b04810087a1865f941c3ecf3429cc9133ce8dedbdd7fc",
|
||||
"apl-inhibition.float32.npy": "3bf68b8939f54fdbda273803ff19d3b77b602ea63e1d8edb0a4528c3c9f69233",
|
||||
"apl-state.float32.npy": "39358239cc58666ef5c690111150cb08cb4fee7b1f2c85ef59f8063e00d7e698",
|
||||
"state.npz": "86c2607df55271e573c942c630f0d99488417ad823fb3b0e0936aa2db32d5418",
|
||||
"summary.json": "c02ce8970c9dd4acab097820c24168d82ebbbfdfa2a9ab5e04196d170d002026"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 8,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 29962,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 3.203749656677246e-07,
|
||||
"max_bound_utilization": 1.3825115623797472e-05,
|
||||
"max_error_bound": 0.07133904829165284,
|
||||
"max_relative_error_nonzero_reference": 1.3874540772356036e-07,
|
||||
"mean_abs_error": 1.7659738659858703e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 6.4121923228910305e-06,
|
||||
"max_bound_utilization": 9.27224404952438e-05,
|
||||
"max_error_bound": 0.08043766806597782,
|
||||
"max_relative_error_nonzero_reference": 9.324284737130469e-07,
|
||||
"mean_abs_error": 4.313282548413184e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 0.0001329280476625172,
|
||||
"max_bound_utilization": 8.404940344370784e-05,
|
||||
"max_error_bound": 1.7416648758003332,
|
||||
"max_relative_error_nonzero_reference": 8.447392582941784e-07,
|
||||
"mean_abs_error": 3.782970280137016e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/novel_to_aj/novel_to_aj-matched_energy-00-s1073741825-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "705fc118805a38f04f21cde945996d6365f04c7dc142c2c167c300b837a909ee",
|
||||
"apl-inhibition.float32.npy": "e2ae30c7cd172c623b2d129a87197052d4c3467ac163e3b92a60d0340ec0da30",
|
||||
"apl-state.float32.npy": "f46650683c74f06fb24cdfa9374de0da8a64a6ae89c606a7a992aed93772609b",
|
||||
"state.npz": "de63be6895c06e99631076550b984f1bff9a1360caedb6b9661e70bb91f6c0ad",
|
||||
"summary.json": "ca0a197b450f0b182f21e5cf79b9df1fc9b4a93763a4f884e19236a1cfc47f30"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 8,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 29986,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 3.2782554626464844e-07,
|
||||
"max_bound_utilization": 1.2735864407512016e-05,
|
||||
"max_error_bound": 0.07133904829165284,
|
||||
"max_relative_error_nonzero_reference": 1.2781395454592698e-07,
|
||||
"mean_abs_error": 1.8380582332611085e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 6.2065581358794475e-06,
|
||||
"max_bound_utilization": 9.474149976429201e-05,
|
||||
"max_error_bound": 0.08043766806597782,
|
||||
"max_relative_error_nonzero_reference": 9.530814236635841e-07,
|
||||
"mean_abs_error": 5.587837737872867e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 0.00013957842179479485,
|
||||
"max_bound_utilization": 8.537353858092776e-05,
|
||||
"max_error_bound": 1.7360135833989094,
|
||||
"max_relative_error_nonzero_reference": 8.588383769758908e-07,
|
||||
"mean_abs_error": 4.88171940874576e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/novel_to_aj/novel_to_aj-physiological-00-s1073741825-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "dcffdc2891adcea6be0e672c5840527a7d7073ffaedc2bfa48a3287caa291d27",
|
||||
"apl-inhibition.float32.npy": "ac66b570abacbc83dff4250936becf7c538bf2aca8d53a358e237b33050b2616",
|
||||
"apl-state.float32.npy": "6ce330b52b7e8067ae043df15f1691973afedc4867679c9d97761e88f6ca9cff",
|
||||
"state.npz": "651624e2efa6b0cc8caedb3d120e020f37ca85accb36f59ba8dff69e914bd742",
|
||||
"summary.json": "2a0e1b97a90de09a3ee05db6701ce45a1da3c18ac4ce3390f8b01a08aa3c5a01"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 9,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 30982,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 4.172325134277344e-07,
|
||||
"max_bound_utilization": 1.5952056345228826e-05,
|
||||
"max_error_bound": 0.08669816247069724,
|
||||
"max_relative_error_nonzero_reference": 1.6009085362282417e-07,
|
||||
"mean_abs_error": 1.8207356333732606e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 5.774900461830157e-06,
|
||||
"max_bound_utilization": 8.365905906775735e-05,
|
||||
"max_error_bound": 0.08278209460663016,
|
||||
"max_relative_error_nonzero_reference": 8.415611663478381e-07,
|
||||
"mean_abs_error": 3.897195014559034e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 0.00011661864286338641,
|
||||
"max_bound_utilization": 7.528199961201348e-05,
|
||||
"max_error_bound": 1.7294997835148593,
|
||||
"max_relative_error_nonzero_reference": 7.57270415730961e-07,
|
||||
"mean_abs_error": 3.4153801116489474e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/seed_validation/seed_validation-matched_energy-00-s1073741825-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "18cae6e5e9a99a239baf3e1d78ed2017022923e0ce4aa8a6c3725a267fed1fd5",
|
||||
"apl-inhibition.float32.npy": "8f8841b63ee734ddd51fac8d47017ea3499d8fb67b14623c6a24e45503fbb809",
|
||||
"apl-state.float32.npy": "ee6cf00cae5c024fd596d217168f18466e579effa3af9cbe022168b6e2c5d39a",
|
||||
"state.npz": "8e79648cdfb7f23ed18f92a248708f028f9f5ffaccb9d59c171aa36ed3177509",
|
||||
"summary.json": "7c65ee7ec41142271137e2985366f1de38915abf29f80fc39261d8c4e440e71d"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 9,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"actual_spike_events": 30876,
|
||||
"ast_replay_bitwise_exact": {
|
||||
"drive": true,
|
||||
"inhibition": true,
|
||||
"state": true
|
||||
},
|
||||
"brain_or_learning_parameters_changed": false,
|
||||
"bundle_dir": "/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
|
||||
"bundle_sha256": {
|
||||
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
|
||||
"apl_out_ids.npy": "51e2cb25752d8eaa3ab1950fdd4ae9580f71644b8d435f875abb63efa6ab344c",
|
||||
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
|
||||
"input_raw.npy": "6da61bb9db93e11c687632f8ae7a5ffec3734d506b790f40c38da16c7e6d1028",
|
||||
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
|
||||
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73",
|
||||
"output_raw.npy": "a142a2b49b070d1a03c8ba4b7fa53fa97fa3005ad70326e0a93204570e5beea1",
|
||||
"pn_globals.npy": "ed574f42559455069679f8ce3b339395efa9398ec13e199eab47959533370805",
|
||||
"provenance.json": "c3441f8424032f6f9c28aa19370928407c46eaea942eb7581a77214ed38bf57e",
|
||||
"scales.json": "fe2decd3949f73006966227cd6a1c4a7d43885f977311ffabb9ababdedd44daa"
|
||||
},
|
||||
"candidate_function_called": false,
|
||||
"canonical_sha256": {
|
||||
"indices": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
|
||||
"indptr": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
|
||||
"metadata": "922af16846a065c3dbfca7c11146b83ca217fcbd7392edc745f444a04eae8c63",
|
||||
"raw": "c7ae101451dd19c47fd976bcfacbc52d67193a68ffa04c5b4d2e911cfd52d99b"
|
||||
},
|
||||
"decay_f32_bits": "3f7eb923",
|
||||
"environment": {
|
||||
"cuda": "13.0",
|
||||
"cuda_matmul_allow_tf32": false,
|
||||
"deterministic_algorithms": false,
|
||||
"float32_matmul_precision": "highest",
|
||||
"gpu": "NVIDIA GeForce RTX 4090",
|
||||
"numpy": "2.2.6",
|
||||
"precision_flags_changed": false,
|
||||
"torch": "2.14.0+cu130"
|
||||
},
|
||||
"extracted_source": {
|
||||
"decay_line": 126,
|
||||
"decay_source": "apl_decay = np.float32(math.exp(-self.dt / 20.0))",
|
||||
"excluded_self_base_line": 83,
|
||||
"inhibition_line": 154,
|
||||
"inhibition_source": "inhibition = torch.matmul(apl_state, self.output_gpu) * np.float32(0.01)",
|
||||
"initializer_line_end": 82,
|
||||
"initializer_line_start": 55,
|
||||
"initializer_source": "self.rt = rt\nself.n = rt.n\nself.device = rt.device\nself.dt = rt.dt\nmeta = rt.table.to_pandas().sort_values(\"neuron_idx\").reset_index(drop=True)\nself.meta = meta\ncls = meta.annotation_class.fillna(\"\").astype(str).to_numpy()\ntyp = meta.annotation_type.fillna(\"\").astype(str).to_numpy()\nself.kc = np.flatnonzero(cls == \"Kenyon_Cell\").astype(np.int32)\nself.mbon = np.flatnonzero(cls == \"MBON\").astype(np.int32)\nself.pn = np.flatnonzero(cls == \"ALPN\").astype(np.int32)\nself.apl = np.flatnonzero(typ == \"APL\").astype(np.int32)\nif len(self.apl) != 2 or len(self.kc) != 4064: raise RuntimeError(\"frozen APL/KC identity changed\")\nself.sources = np.repeat(np.arange(self.n, dtype=np.int32), np.diff(rt.indptr_np).astype(np.int64))\nidx = rt.indices_np\nraw = rt.raw_np\napl_out = np.isin(self.sources, self.apl)\nself.apl_out_ids = np.flatnonzero(apl_out).astype(np.int64)\ninput_matrix = np.zeros((len(self.apl), self.n), np.float32)\noutput_matrix = np.zeros((len(self.apl), len(self.kc)), np.float32)\nkc_lookup = np.full(self.n, -1, np.int32)\nkc_lookup[self.kc] = np.arange(len(self.kc), dtype=np.int32)\nallowed = np.isin(self.sources, np.concatenate((self.kc, self.pn))) & np.isin(idx, self.apl)\napl_lookup = {int(x): i for i, x in enumerate(self.apl)}\nfor eid in np.flatnonzero(allowed): input_matrix[apl_lookup[int(idx[eid])], int(self.sources[eid])] += float(raw[eid])\nfor eid in np.flatnonzero(apl_out & np.isin(idx, self.kc)):\n output_matrix[apl_lookup[int(self.sources[eid])], kc_lookup[int(idx[eid])]] += float(raw[eid])\nself.input_scale = float(input_matrix[input_matrix > 0].sum() / np.count_nonzero(np.any(input_matrix > 0, axis=0)))\nself.output_scale = float(output_matrix[output_matrix > 0].mean())\nself.input_gpu = torch.as_tensor(input_matrix / self.input_scale, dtype=torch.float32, device=self.device)\nself.output_gpu = torch.as_tensor(output_matrix / self.output_scale, dtype=torch.float32, device=self.device)\nself.kc_gpu = torch.as_tensor(self.kc, dtype=torch.int64, device=self.device)\nself.apl_out_gpu = torch.as_tensor(self.apl_out_ids, dtype=torch.int64, device=self.device)",
|
||||
"learning_initializer_suffix_executed": false,
|
||||
"original_run_loop_executed": false,
|
||||
"sha256": "c7e693a2da70acdce4f53af5c2853e52e8333acc93f88a46a5e8083eac639346",
|
||||
"source": "/data/digital-drosophila/models/male-cns-lif/deterministic-runtime-v2/phase4p_revalidate.py",
|
||||
"state_update_line": 153,
|
||||
"state_update_source": "apl_state.mul_(float(apl_decay)).add_(torch.mv(self.input_gpu, self.rt.spike_u8.to(torch.float32)))"
|
||||
},
|
||||
"first_ast_difference": null,
|
||||
"float64_measurement": {
|
||||
"drive": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 3.8743019104003906e-07,
|
||||
"max_bound_utilization": 1.0574248685708828e-05,
|
||||
"max_error_bound": 0.0598197108441445,
|
||||
"max_relative_error_nonzero_reference": 1.0612051900264713e-07,
|
||||
"mean_abs_error": 1.837685704231262e-08,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"inhibition": {
|
||||
"bound_violations": 0,
|
||||
"elements": 4064000,
|
||||
"max_abs_error": 5.093154738844419e-06,
|
||||
"max_bound_utilization": 8.812986267814258e-05,
|
||||
"max_error_bound": 0.08260575257145494,
|
||||
"max_relative_error_nonzero_reference": 8.864677758965812e-07,
|
||||
"mean_abs_error": 4.286303706345423e-07,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
},
|
||||
"state": {
|
||||
"bound_violations": 0,
|
||||
"elements": 2000,
|
||||
"max_abs_error": 0.00012930523044474285,
|
||||
"max_bound_utilization": 7.651823932615403e-05,
|
||||
"max_error_bound": 1.7649496062259644,
|
||||
"max_relative_error_nonzero_reference": 7.696472542398691e-07,
|
||||
"mean_abs_error": 3.747036531716575e-05,
|
||||
"zero_reference_nonzero_actual": 0
|
||||
}
|
||||
},
|
||||
"gain_f32_bits": "3c23d70a",
|
||||
"gpu_case_dir": "/data/digital-drosophila/experiments/phase4ak-apl-timing-validation/gpu/seed_validation/seed_validation-physiological-00-s1073741825-r0",
|
||||
"independent_cpu_closed_loop_oracle": false,
|
||||
"input_sha256": {
|
||||
"apl-drive.float32.npy": "8b6432e8947f4c67466b5cae28cb0d0877b61862e80e6d9b10c5734d9afa8411",
|
||||
"apl-inhibition.float32.npy": "8f9e59026dc7c7663abf8f7abc60ebf93b11a68483bc0960d375a83731acc859",
|
||||
"apl-state.float32.npy": "36ecfec747be0c700959ba1ac171b81a1f3471aa9baba41b7bb6a67be01213c2",
|
||||
"state.npz": "933afdc1bd0ea81174aeb334f017cfbe1bbc0a72f8eca767698275c5dca886f3",
|
||||
"summary.json": "9d65ce466a76c4adb46dac9ebeb15b6a72f829427f0cb1a4b4946b4016346266"
|
||||
},
|
||||
"limitations": [
|
||||
"AST shadow and candidate use the same original Torch/CUDA primitives; this validates preserved component semantics, not an independent CPU whole-brain oracle.",
|
||||
"Float64 is a non-feedback mathematical measurement with explicit gamma error bounds, not replacement APL dynamics.",
|
||||
"Replay uses the recorded actual spike train; it does not establish equivalence for untested closed-loop inputs.",
|
||||
"The N-1 positive-sum bound is deliberately conservative; passing it does not prove physiological validity or learning."
|
||||
],
|
||||
"matrix_checks": {
|
||||
"apl_globals": true,
|
||||
"apl_out_ids": true,
|
||||
"input_matrix": true,
|
||||
"input_raw": true,
|
||||
"input_scale": true,
|
||||
"kc_globals": true,
|
||||
"output_matrix": true,
|
||||
"output_raw": true,
|
||||
"output_scale": true,
|
||||
"pn_globals": true
|
||||
},
|
||||
"pass_all": true,
|
||||
"reconstructed_array_sha256": {
|
||||
"apl_globals": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
|
||||
"apl_out_ids": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
|
||||
"input_matrix": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
|
||||
"input_raw": "a7153b9a7c7cdc2700bd97f9ed96c7402c360172ebb739099303d057c9bbea11",
|
||||
"kc_globals": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
|
||||
"output_matrix": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9",
|
||||
"output_raw": "2a3e4f18ac86c6d557f5dc85b6f99060fc1bd2d4c0c53241714acc2aee24dc0e",
|
||||
"pn_globals": "56c4eb47cb535fcf990017b13a29d026f91a28397e6c206bd24a99598d2588ff"
|
||||
},
|
||||
"scope": "Frozen APL component extraction and recorded-spike replay only",
|
||||
"steps": 1000,
|
||||
"theoretical_bound": {
|
||||
"applicable": true,
|
||||
"assumptions": "nonnegative f32 matrices, spikes exactly 0/1, fixed stored f32 decay/gain, normal finite RN binary32/64 operations; no reduced-precision matmul",
|
||||
"bound_arithmetic": "Each positive bound operation is rounded toward +infinity via nextafter; denominator toward -infinity",
|
||||
"drive_n": 166699,
|
||||
"f64_values_used_to_drive_brain": false,
|
||||
"gamma_definition": "gamma_n=(n*u)/(1-n*u), upward-rounded; u32=2^-24,u64=2^-53",
|
||||
"gamma_drive_f32": 0.010035750241849791,
|
||||
"gamma_drive_f64": 1.8507306798541427e-11,
|
||||
"max_observed_nonzero_drive_terms": 9,
|
||||
"no_cpu_gpu_bitwise_expectation_for_f64_measurement": true,
|
||||
"normal_or_zero_arithmetic": true,
|
||||
"output_bound": "q*sum(B*E_p) + gamma_(2*A+1),p*q*sum(B*abs(s_p)); compare with E32+E64",
|
||||
"state_recurrence": "E_p[t] <= d*E_p[t-1] + gamma_2,p*(d*abs(s_p[t-1])+D_upper) + (1+u_p)*gamma_(N-1),p*D_upper",
|
||||
"tolerance_fitted_to_observed_error": false
|
||||
},
|
||||
"value_units": {
|
||||
"drive": "legacy normalized-contact spike drive",
|
||||
"inhibition": "legacy mV",
|
||||
"state": "legacy normalized-drive accumulator"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user