Seal Phase 4AK frozen D18 independent validation

This commit is contained in:
Digital Drosophila Archive
2026-09-30 13:18:18 +08:00
parent cb6937666f
commit c6444255fe
1313 changed files with 154250 additions and 15 deletions
@@ -0,0 +1,12 @@
{
"KC_targets_in_case": 4064,
"base_graph_files_modified": false,
"base_weight_raw_bytes_sha256": "a8c19cde743bd456bcb2e988d504f805b6943d6ceb97cd241d6e1e472ab5a591",
"count": 5845,
"effective_weights_file_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b",
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"fullgraph_required_mask_count": 5845,
"graded_targets": "only KC identities present in this LIF case",
"ordered_original_edge_id_sha256": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
"rule": "zero +0 all existing fast edges whose source GLOBAL neuron is in apl_globals; no graph edge removal"
}
@@ -0,0 +1,39 @@
{
"APL_generation_steps_after_window": 0,
"apl_delay_steps": 18,
"applied_generated_rows": 982,
"brain_steps_after_window": 0,
"brain_tail_advanced": false,
"closed_loop_branch_integrals_claimed_equal": false,
"delay_implementation": "independent list FIFO; no candidate or timing_queue imports",
"final_apl_state_float32": [
148.8344268798828,
172.29991149902344
],
"final_apl_state_nonzero": true,
"final_apl_state_u32_bits": [
1125438877,
1126976711
],
"finite_generated_sequence_partition_exact": true,
"future_apl_decay_or_feedback_generated": false,
"future_generated_decay_tail_included": false,
"generated_rows": 1000,
"initial_zero_prefix": 0,
"meaning": "Tail contains only already generated h and any remaining initial-zero padding; never a complete future closed-loop or decay tail",
"pending_application_tick_start": 1000,
"pending_application_tick_stop_exclusive": 1018,
"pending_file_sha256": "6fe96517fc7e7ec8f991a9a9b1fb5a9c4d9a27d4532f17a17676fc540b427fa3",
"pending_generated_count": 18,
"pending_generated_tick_start": 982,
"pending_generated_tick_stop_exclusive": 1000,
"pending_initial_zero_prefix": 0,
"pending_raw_sha256": "479e12060457c98eef9daa5b4417d5dca1da61716a3163dd4da3add350533cba",
"pending_shape": [
18,
4064
],
"positive_zero_warmup_exact": true,
"steps": 1000,
"transport_shift_exact": true
}
@@ -0,0 +1,56 @@
{
"command": [
"/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"-B",
"/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
"--bundle-dir",
"/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
"--dt-ms",
"0.1"
],
"handshake": {
"array_sha256": {
"apl_globals.npy": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
"input_matrix.npy": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
"kc_globals.npy": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
"output_matrix.npy": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9"
},
"decay_f32_bits": "3f7eb923",
"dt_ms": 0.1,
"environment": {
"CUBLAS_WORKSPACE_CONFIG": null,
"cuda": "13.0",
"cuda_matmul_allow_tf32": false,
"cudnn": 92400,
"cudnn_allow_tf32": true,
"cudnn_benchmark": false,
"cudnn_deterministic": false,
"deterministic_algorithms": false,
"device_capability": [
8,
9
],
"device_index": 0,
"device_name": "NVIDIA GeForce RTX 4090",
"float32_matmul_precision": "highest",
"numpy": "2.2.6",
"precision_configuration_changed_by_component": false,
"torch": "2.14.0+cu130"
},
"files_sha256": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"gain_f32_bits": "3c23d70a",
"h_units": "legacy mV",
"initial_state": "float32 zeros",
"n_apl": 2,
"n_kc": 4064,
"n_neurons": 166700,
"ok": true,
"operator_sequence": "state.mul_(decay32); drive=mv(I32,spikes32); state.add_(drive); h=matmul(state,O32)*gain32",
"protocol": "phase4ag-apl-v1"
}
}
@@ -0,0 +1,72 @@
{
"c0": -0.00025935108198051754,
"cg": 0.004937935295309027,
"cv": 0.9950124791926823,
"gd": 0.9801986733067553,
"metadata": {
"constant_values_are_double": true,
"float32_execution_note": "Brian NumPy scalar/array promotion and operation order must be matched separately; double coefficients alone do not assert float64 intermediate array arithmetic.",
"g_expression": "gd * old_g",
"hex": {
"c0": "-0x1.0ff306a505980p-12",
"cg": "0x1.439cce9a65d5bp-8",
"cv": "0x1.fd7246927d28bp-1",
"gd": "0x1.f5dc99badec5bp-1",
"reset": "-0x1.a9fbe76c8b43ap-5",
"seed_volt": "-0x1.6872b020c49bap-5",
"threshold": "-0x1.70a3d70a3d70ap-5"
},
"names": {
"c0": "_lio_8",
"cg": "_lio_9",
"cv": "_lio_10",
"gd": "_lio_2"
},
"provenance": {
"c0": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_8",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cg": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_9",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cv": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_10",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"gd": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_2",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"reset": {
"code_object": "default_neurons_spike_resetter_codeobject_1",
"name": "v_rst",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"seed_volt": {
"source": "common request interface: unchanged v_th + 1 mV"
},
"threshold": {
"code_object": "default_neurons_spike_thresholder_codeobject_1",
"name": "v_th",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
}
},
"units": "SI volts and dimensionless coefficients",
"voltage_expression": "c0 + ((cg * old_g) + (cv * old_v))"
},
"reset": -0.052000000000000005,
"seed_volt": -0.044,
"threshold": -0.045
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n g = _array_default_neurons_g.copy()\n dt = _array_defaultclock_dt[0]\n rfc = _array_default_neurons_rfc\n lastspike = _array_default_neurons_lastspike\n v = _array_default_neurons_v.copy()\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\n",
"name": "default_neurons_stateupdater_codeobject"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\n",
"name": "default_neurons_spike_thresholder_codeobject"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _array_spikemonitor_count[_events - _source_start] += 1\n",
"name": "spikemonitor_codeobject"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n w = _array_default_synapses_w[_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\n",
"name": "default_synapses_pre_codeobject"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\n",
"name": "default_neurons_spike_resetter_codeobject"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,17 @@
{
"APL_precision": "float32 in separate science-Python process",
"Torch_imported_into_Brian": false,
"author_precision": "float64",
"codegen": "numpy",
"packages": {
"brian2": "2.5.1",
"cython": "0.29.33",
"numpy": "1.22.3",
"pandas": "1.4.3",
"pyarrow": "11.0.0",
"scipy": "1.8.1",
"sympy": "1.12"
},
"platform": "Linux-5.15.0-194-generic-x86_64-with-glibc2.35",
"python": "3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]"
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n g = _array_default_neurons_g.copy()\n dt = _array_defaultclock_dt[0]\n rfc = _array_default_neurons_rfc\n lastspike = _array_default_neurons_lastspike\n v = _array_default_neurons_v.copy()\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\n",
"name": "default_neurons_stateupdater_codeobject_1"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\n",
"name": "default_neurons_spike_thresholder_codeobject_1"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _array_spikemonitor_count[_events - _source_start] += 1\n",
"name": "spikemonitor_codeobject_1"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n w = _array_default_synapses_w[_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\n",
"name": "default_synapses_pre_codeobject_1"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\n",
"name": "default_neurons_spike_resetter_codeobject_1"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,80 @@
{
"ae_sha256": "32eb1c42383068ce52701d2139a376ce155ad7072cde019949f8ca2d55492409",
"af_sha256": "d72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961",
"apl_delay_steps": 18,
"author_sha256": "fc45837d7122c6ce2a7f3f2f23c515992e4b232aadb919efabb72337fac88e4e",
"bundle_hashes": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"candidate_trace_used_as_input": false,
"case_hashes": {
"requests.npz": "2492a95c805c779db16753a786a20e5668885ae9f54f4be39e6d86e3090e5cd3",
"spec.json": "f57a9d8eba2548c8a4c1129494620f55e12acf5a4492ee04301c3c90c7ad15c8"
},
"coefficients_sha256": "bde79d95ef0097b827d5faf4d5658eafc009d8e9fcef1fddd645c953823e3f64",
"copied_oracle_sha256": "357a7d3debb5abc34a8714c0233b456547a154d9d5855d28661b4f01019a80ea",
"copied_oracle_source": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/oracle_apl.py",
"graph_hashes": {
"completeness.csv": "fb9033398abb7585ae63472ced9d8c8cab787f69965dc9ce5fa409ab105bc1bc",
"connectivity.parquet": "1362c1102b74f5552f4b01fca956574fd6252f749e31493c4a00a1bc9eab00b3",
"dst.npy": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
"edge_id.npy": "49260615ff2b6432ce3dea9ce2c7ab8f83d06c2fb7491e58e08355fcedf86a30",
"nodes.npy": "5b511a98e8fbf8d65bbc70b93e75ecae19366f650b7842a45611bfad62ed83dc",
"ptr.npy": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
"signed_raw.npy": "f9884ccb8930b32420b27c69271df78034a8350fe5a5c9b76a63c259268efc09",
"src.npy": "bfd625ce690fc21eb0a8b9dede831688ab73b789045ba83ddf4baeefeddf1fc3",
"weights.npy": "462839ffc3feb8f6c278044488082b1c8e410e7f23229d6b5e29d1b7042416a1"
},
"legacy_apl_worker_sha256": "21ceec65fe42581dc55872010e0025d660e80358905f1cf4df1dadf341a3b291",
"only_scientific_change": "transport generated graded-APL h before the unchanged end write",
"scope": "shared-APL-component closed-loop oracle, not all-components-independent CPU equivalence",
"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": 102.2443115234375,
"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": "matched_energy",
"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": "novel_to_aj-matched_energy-00-s1073741825",
"odor_id": "YSNWHRKJEKWJNY-UHFFFAOYSA-N",
"odor_index": 0,
"odor_name": "ethyl 3-methylsulfanylpropanoate",
"output_budget_bytes": 25769803776,
"precision": "float64",
"rate_sum_hz": 1022.443115234375,
"record_history": false,
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"seed": 1073741825,
"source_panel_row": 6,
"source_panel_split": "heldout",
"steps": 1000,
"target_count": 35,
"training": false,
"validation_cohort": "novel_to_aj"
}
}
@@ -0,0 +1,60 @@
{
"APL_SI_conversion": "h.astype(float64) * float64(0.001), then separate float64 g subtraction",
"APL_dtype": "float32",
"APL_h_units": "mV; gain already applied in float32",
"APL_inhibition_file_means": "generated h at the actual closed-loop Brian spike tick, not the delayed applied value",
"APL_input": "Brian's own actual global spikes, never candidate spikes or candidate inhibition",
"APL_pending_file": "apl-pending-tail.float32.npy",
"APL_pending_generated_count": 18,
"APL_pending_initial_zero_prefix": 0,
"APL_pending_scope": "next D scheduled applications from recorded h plus unconsumed initial zero slots; not future generated decay",
"APL_shapes": {
"applied": [
1000,
4064
],
"drive": [
1000,
2
],
"inhibition": [
1000,
4064
],
"pending_tail": [
18,
4064
],
"state": [
1000,
2
]
},
"APL_transport": "applied[t]=generated_h[t-D] for t>=D, positive zero otherwise; separate independent list FIFO",
"APL_write_schedule": "end, order=0, after original reset, unconditional raw g write; recorder end/order=1",
"apl_delay_steps": 18,
"complete_marker": "summary.json complete=true only after worker exit and all checks",
"history_recorded": false,
"history_shape": [
1000,
166700
],
"queue_protocol": "sealed Phase4AF queue_summary; original global edge IDs, including zero-weight/ref-rejected arrivals",
"request_columns": [
"tick",
"neuron_idx",
"attempted",
"accepted",
"rejected"
],
"state_hash_encoding": "SHA256 of contiguous little-endian raw f64 V/g and i32 ref",
"state_hash_file": "tick-state-hashes.jsonl",
"state_npz": [
"step",
"neuron_idx",
"counts",
"v",
"g",
"ref"
]
}
@@ -0,0 +1,34 @@
{
"membrane_tau_ms": {
"author": 20.0,
"case": 20.0
},
"refractory_ms": {
"author": 2.2,
"case": 2.2
},
"reset_potential_mv": {
"author": -52.0,
"case": -52.0
},
"resting_potential_mv": {
"author": -52.0,
"case": -52.0
},
"synaptic_delay_ms": {
"author": 1.8,
"case": 1.8
},
"synaptic_tau_ms": {
"author": 5.0,
"case": 5.0
},
"threshold_mv": {
"author": -45.0,
"case": -45.0
},
"w_syn_mv_per_anatomical_synapse": {
"author": 0.275,
"case": 0.275
}
}
@@ -0,0 +1,15 @@
{
"advance_calls": 1000,
"forwarding_contract": "sealed AE/AF design",
"installations": [
"default_synapses_pre_codeobject",
"default_synapses_pre_codeobject_1"
],
"limit": "Current wrapper was not independently rerun without the queue proxy",
"new_unwrapped_repeat_performed": false,
"original_edge_ids_not_sorted_or_filtered": true,
"peek_calls": 1000,
"post_threshold_pre_synaptic_guard_observed": true,
"same_peek_object_returned": true,
"zero_weight_and_refractory_rejected_edges_retained": true
}
@@ -0,0 +1,110 @@
tick,neuron_idx,attempted,accepted,rejected
20,7322,1,1,0
21,53508,1,1,0
24,999,1,1,0
25,530,1,1,0
31,159,1,1,0
37,2029,1,1,0
43,530,1,0,1
50,522,1,1,0
51,1372,1,1,0
58,9052,1,1,0
73,530,1,1,0
81,530,1,0,1
95,622,1,1,0
114,710,1,1,0
115,2029,1,1,0
136,79514,1,1,0
138,79514,1,0,1
150,130753,1,1,0
152,130753,1,0,1
154,530,1,0,1
155,2029,1,1,0
157,54264,1,1,0
160,54264,1,0,1
163,54264,1,0,1
172,2029,1,0,1
183,7322,1,1,0
190,130753,1,1,0
195,7322,1,0,1
201,97,1,1,0
202,530,1,0,1
204,9052,1,1,0
214,55121,1,1,0
220,522,1,1,0
234,1011,1,1,0
257,530,1,1,0
278,6721,1,1,0
287,999,1,0,1
295,189,1,0,1
326,571,1,0,1
334,360,1,0,1
353,79514,1,1,0
366,1372,1,1,0
386,189,1,1,0
408,1011,1,1,0
415,130753,1,0,1
423,434,1,1,0
430,130257,1,1,0
446,79514,1,1,0
463,2601,1,0,1
469,522,1,1,0
479,159,1,1,0
481,360,1,1,0
511,9052,1,1,0
513,571,1,1,0
527,54264,1,1,0
547,189,1,1,0
554,999,1,1,0
556,2029,1,1,0
556,9052,1,1,0
567,4786,1,1,0
567,79514,1,1,0
568,7680,1,1,0
610,434,1,1,0
613,1011,1,1,0
629,159,1,0,1
643,130753,1,1,0
657,1011,1,1,0
682,1372,1,0,1
695,6721,1,1,0
704,4624,1,1,0
710,9052,1,1,0
714,700,1,0,1
725,1372,1,0,1
725,7680,1,1,0
726,6721,1,1,0
742,1022,1,1,0
750,1011,1,1,0
754,189,1,1,0
755,4624,1,1,0
770,130753,1,0,1
795,97,1,1,0
814,189,1,1,0
817,360,1,0,1
817,6721,1,1,0
831,434,1,1,0
836,133666,1,1,0
842,530,1,0,1
844,54264,1,1,0
846,530,1,0,1
847,97,1,1,0
886,522,1,1,0
890,189,1,0,1
896,1372,1,1,0
896,133666,1,1,0
897,1011,1,1,0
902,1011,1,0,1
906,530,1,1,0
909,97,1,0,1
915,1927,1,1,0
950,4786,1,1,0
952,360,1,1,0
957,7322,1,1,0
964,189,1,1,0
965,522,1,0,1
974,2029,1,1,0
977,79514,1,0,1
982,97,1,0,1
992,54264,1,1,0
998,189,1,1,0
1 tick neuron_idx attempted accepted rejected
2 20 7322 1 1 0
3 21 53508 1 1 0
4 24 999 1 1 0
5 25 530 1 1 0
6 31 159 1 1 0
7 37 2029 1 1 0
8 43 530 1 0 1
9 50 522 1 1 0
10 51 1372 1 1 0
11 58 9052 1 1 0
12 73 530 1 1 0
13 81 530 1 0 1
14 95 622 1 1 0
15 114 710 1 1 0
16 115 2029 1 1 0
17 136 79514 1 1 0
18 138 79514 1 0 1
19 150 130753 1 1 0
20 152 130753 1 0 1
21 154 530 1 0 1
22 155 2029 1 1 0
23 157 54264 1 1 0
24 160 54264 1 0 1
25 163 54264 1 0 1
26 172 2029 1 0 1
27 183 7322 1 1 0
28 190 130753 1 1 0
29 195 7322 1 0 1
30 201 97 1 1 0
31 202 530 1 0 1
32 204 9052 1 1 0
33 214 55121 1 1 0
34 220 522 1 1 0
35 234 1011 1 1 0
36 257 530 1 1 0
37 278 6721 1 1 0
38 287 999 1 0 1
39 295 189 1 0 1
40 326 571 1 0 1
41 334 360 1 0 1
42 353 79514 1 1 0
43 366 1372 1 1 0
44 386 189 1 1 0
45 408 1011 1 1 0
46 415 130753 1 0 1
47 423 434 1 1 0
48 430 130257 1 1 0
49 446 79514 1 1 0
50 463 2601 1 0 1
51 469 522 1 1 0
52 479 159 1 1 0
53 481 360 1 1 0
54 511 9052 1 1 0
55 513 571 1 1 0
56 527 54264 1 1 0
57 547 189 1 1 0
58 554 999 1 1 0
59 556 2029 1 1 0
60 556 9052 1 1 0
61 567 4786 1 1 0
62 567 79514 1 1 0
63 568 7680 1 1 0
64 610 434 1 1 0
65 613 1011 1 1 0
66 629 159 1 0 1
67 643 130753 1 1 0
68 657 1011 1 1 0
69 682 1372 1 0 1
70 695 6721 1 1 0
71 704 4624 1 1 0
72 710 9052 1 1 0
73 714 700 1 0 1
74 725 1372 1 0 1
75 725 7680 1 1 0
76 726 6721 1 1 0
77 742 1022 1 1 0
78 750 1011 1 1 0
79 754 189 1 1 0
80 755 4624 1 1 0
81 770 130753 1 0 1
82 795 97 1 1 0
83 814 189 1 1 0
84 817 360 1 0 1
85 817 6721 1 1 0
86 831 434 1 1 0
87 836 133666 1 1 0
88 842 530 1 0 1
89 844 54264 1 1 0
90 846 530 1 0 1
91 847 97 1 1 0
92 886 522 1 1 0
93 890 189 1 0 1
94 896 1372 1 1 0
95 896 133666 1 1 0
96 897 1011 1 1 0
97 902 1011 1 0 1
98 906 530 1 1 0
99 909 97 1 0 1
100 915 1927 1 1 0
101 950 4786 1 1 0
102 952 360 1 1 0
103 957 7322 1 1 0
104 964 189 1 1 0
105 965 522 1 0 1
106 974 2029 1 1 0
107 977 79514 1 0 1
108 982 97 1 0 1
109 992 54264 1 1 0
110 998 189 1 1 0
@@ -0,0 +1,9 @@
{
"apl_delay_steps": 18,
"backend": "oracle",
"dynamics_copied_or_reimplemented": false,
"old_module_scientific_globals_changed": false,
"scope": "Unchanged AJ runtime called with new case/output/build arguments; not a new numerical model",
"sealed_runtime": "/data/digital-drosophila/models/male-cns-lif/apl-timing-lab-v1/oracle_timing.py",
"sealed_runtime_sha256": "39d8c47c94bc2faddf016864a43e7715907fb987f56f7b27098060a88851f6be"
}
@@ -0,0 +1,11 @@
{
"schedule": [
"start",
"groups",
"thresholds",
"synapses",
"resets",
"end"
],
"summary": " object | part of | Clock dt | when | order | active\n---------------------------------------------------+-------------------------------+----------------------+-------------------+---------+-------\ndefault_neurons_stateupdater (StateUpdater) | default_neurons (NeuronGroup) | 100. us (every step) | groups | 0 | yes \noracle_common_requests (NetworkOperation) | -- | 100. us (every step) | before_thresholds | 0 | yes \ndefault_neurons_spike_thresholder (Thresholder) | default_neurons (NeuronGroup) | 100. us (every step) | thresholds | 0 | yes \nspikemonitor (SpikeMonitor) | spikemonitor (SpikeMonitor) | 100. us (every step) | thresholds | 1 | yes \ndefault_synapses_pre (SynapticPathway) | default_synapses (Synapses) | 100. us (every step) | synapses | -1 | yes \ndefault_neurons_spike_resetter (Resetter) | default_neurons (NeuronGroup) | 100. us (every step) | resets | 0 | yes \noracle_legacy_apl_unconditional (NetworkOperation) | -- | 100. us (every step) | end | 0 | yes \noracle_after_apl_record (NetworkOperation) | -- | 100. us (every step) | end | 1 | yes \nzz_apl_queue_installer (QueueInstaller) | -- | 100. us (every step) | end | 1000000 | yes "
}
@@ -0,0 +1,51 @@
{
"APL_applied_sha256": "a0b0fb96df98f1b589f81d6169d095ed22a0896de92725b00bb1d42e01c4f206",
"APL_fast_edges_zeroed": 5845,
"APL_finite_sequence_partition_exact": true,
"APL_pending_tail_sha256": "6fe96517fc7e7ec8f991a9a9b1fb5a9c4d9a27d4532f17a17676fc540b427fa3",
"APL_precision": "float32",
"APL_timing_audit_sha256": "d5a6b9b87bb29eab8849aaf284de8a3383d169d7f76ad04d8ab9dfaf230fda89",
"APL_transport_shift_exact": true,
"APL_worker_exit_status": 0,
"APL_worker_ticks": 1000,
"apl_delay_steps": 18,
"apl_fast_edges_zeroed": 5845,
"applicable_requests": 79,
"backend": "shared-APL-component closed-loop Brian2 oracle",
"candidate_trace_used_as_input": false,
"complete": true,
"completed_ticks": 1000,
"edges": 25582938,
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"events_sha256": "a1127296a157423910edcff21be25df8f54d33ea071c43dc23d8ff2e96ff8f19",
"future_generated_decay_tail_included": false,
"history_recorded": false,
"independent_CPU_all_components_claim": false,
"initial_zero_prefix": 0,
"kc_targets_present": 4064,
"name": "novel_to_aj-matched_energy-00-s1073741825",
"no_poi": true,
"no_training": true,
"nodes": 166700,
"output_budget_bytes": 25769803776,
"output_bytes_before_summary": 3665862279,
"pass_all": true,
"pass_all_scope": "Oracle construction, protocol and internal self-checks only; candidate comparison is a separate gate",
"pending_generated_count": 18,
"pending_initial_zero_prefix": 0,
"pending_tail_shape": [
18,
4064
],
"precision": "float64",
"queue_sha256": "102e549d18bc7a421dc1500c7436bf7abee361e1e2bedaad50b9546d2aa56167",
"ref_rejected_requests": 30,
"requests": 109,
"scope": "Only this fixed trajectory; legacy Torch APL is a shared numerical component, not an independent CPU APL implementation",
"single_continuous_run": true,
"source_and_inputs_unchanged": true,
"spikes": 29962,
"state_hashes_sha256": "a92a4ca83752275c8118911d8d2c8543df4bc4e45d8e08151f3bf5964dc3b8cf",
"steps": 1000,
"weights_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b"
}
@@ -0,0 +1,12 @@
{
"KC_targets_in_case": 4064,
"base_graph_files_modified": false,
"base_weight_raw_bytes_sha256": "a8c19cde743bd456bcb2e988d504f805b6943d6ceb97cd241d6e1e472ab5a591",
"count": 5845,
"effective_weights_file_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b",
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"fullgraph_required_mask_count": 5845,
"graded_targets": "only KC identities present in this LIF case",
"ordered_original_edge_id_sha256": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
"rule": "zero +0 all existing fast edges whose source GLOBAL neuron is in apl_globals; no graph edge removal"
}
@@ -0,0 +1,39 @@
{
"APL_generation_steps_after_window": 0,
"apl_delay_steps": 18,
"applied_generated_rows": 982,
"brain_steps_after_window": 0,
"brain_tail_advanced": false,
"closed_loop_branch_integrals_claimed_equal": false,
"delay_implementation": "independent list FIFO; no candidate or timing_queue imports",
"final_apl_state_float32": [
152.68724060058594,
166.99606323242188
],
"final_apl_state_nonzero": true,
"final_apl_state_u32_bits": [
1125691375,
1126629118
],
"finite_generated_sequence_partition_exact": true,
"future_apl_decay_or_feedback_generated": false,
"future_generated_decay_tail_included": false,
"generated_rows": 1000,
"initial_zero_prefix": 0,
"meaning": "Tail contains only already generated h and any remaining initial-zero padding; never a complete future closed-loop or decay tail",
"pending_application_tick_start": 1000,
"pending_application_tick_stop_exclusive": 1018,
"pending_file_sha256": "0bbf355ce1ddb2d2ddfdd73a0ca2fba59dd479584403a6cf8aa0b8d2336935f9",
"pending_generated_count": 18,
"pending_generated_tick_start": 982,
"pending_generated_tick_stop_exclusive": 1000,
"pending_initial_zero_prefix": 0,
"pending_raw_sha256": "7e7809e834debf7f983f54907901965c969e2e88ba987605e5823ceadc139bd9",
"pending_shape": [
18,
4064
],
"positive_zero_warmup_exact": true,
"steps": 1000,
"transport_shift_exact": true
}
@@ -0,0 +1,56 @@
{
"command": [
"/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"-B",
"/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
"--bundle-dir",
"/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
"--dt-ms",
"0.1"
],
"handshake": {
"array_sha256": {
"apl_globals.npy": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
"input_matrix.npy": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
"kc_globals.npy": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
"output_matrix.npy": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9"
},
"decay_f32_bits": "3f7eb923",
"dt_ms": 0.1,
"environment": {
"CUBLAS_WORKSPACE_CONFIG": null,
"cuda": "13.0",
"cuda_matmul_allow_tf32": false,
"cudnn": 92400,
"cudnn_allow_tf32": true,
"cudnn_benchmark": false,
"cudnn_deterministic": false,
"deterministic_algorithms": false,
"device_capability": [
8,
9
],
"device_index": 0,
"device_name": "NVIDIA GeForce RTX 4090",
"float32_matmul_precision": "highest",
"numpy": "2.2.6",
"precision_configuration_changed_by_component": false,
"torch": "2.14.0+cu130"
},
"files_sha256": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"gain_f32_bits": "3c23d70a",
"h_units": "legacy mV",
"initial_state": "float32 zeros",
"n_apl": 2,
"n_kc": 4064,
"n_neurons": 166700,
"ok": true,
"operator_sequence": "state.mul_(decay32); drive=mv(I32,spikes32); state.add_(drive); h=matmul(state,O32)*gain32",
"protocol": "phase4ag-apl-v1"
}
}
@@ -0,0 +1,72 @@
{
"c0": -0.00025935108198051754,
"cg": 0.004937935295309027,
"cv": 0.9950124791926823,
"gd": 0.9801986733067553,
"metadata": {
"constant_values_are_double": true,
"float32_execution_note": "Brian NumPy scalar/array promotion and operation order must be matched separately; double coefficients alone do not assert float64 intermediate array arithmetic.",
"g_expression": "gd * old_g",
"hex": {
"c0": "-0x1.0ff306a505980p-12",
"cg": "0x1.439cce9a65d5bp-8",
"cv": "0x1.fd7246927d28bp-1",
"gd": "0x1.f5dc99badec5bp-1",
"reset": "-0x1.a9fbe76c8b43ap-5",
"seed_volt": "-0x1.6872b020c49bap-5",
"threshold": "-0x1.70a3d70a3d70ap-5"
},
"names": {
"c0": "_lio_8",
"cg": "_lio_9",
"cv": "_lio_10",
"gd": "_lio_2"
},
"provenance": {
"c0": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_8",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cg": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_9",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cv": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_10",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"gd": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_2",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"reset": {
"code_object": "default_neurons_spike_resetter_codeobject_1",
"name": "v_rst",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"seed_volt": {
"source": "common request interface: unchanged v_th + 1 mV"
},
"threshold": {
"code_object": "default_neurons_spike_thresholder_codeobject_1",
"name": "v_th",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
}
},
"units": "SI volts and dimensionless coefficients",
"voltage_expression": "c0 + ((cg * old_g) + (cv * old_v))"
},
"reset": -0.052000000000000005,
"seed_volt": -0.044,
"threshold": -0.045
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n dt = _array_defaultclock_dt[0]\n lastspike = _array_default_neurons_lastspike\n g = _array_default_neurons_g.copy()\n rfc = _array_default_neurons_rfc\n t = _array_defaultclock_t[0]\n v = _array_default_neurons_v.copy()\n not_refractory = _array_default_neurons_not_refractory.copy()\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,17 @@
{
"APL_precision": "float32 in separate science-Python process",
"Torch_imported_into_Brian": false,
"author_precision": "float64",
"codegen": "numpy",
"packages": {
"brian2": "2.5.1",
"cython": "0.29.33",
"numpy": "1.22.3",
"pandas": "1.4.3",
"pyarrow": "11.0.0",
"scipy": "1.8.1",
"sympy": "1.12"
},
"platform": "Linux-5.15.0-194-generic-x86_64-with-glibc2.35",
"python": "3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]"
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n dt = _array_defaultclock_dt[0]\n lastspike = _array_default_neurons_lastspike\n g = _array_default_neurons_g.copy()\n rfc = _array_default_neurons_rfc\n t = _array_defaultclock_t[0]\n v = _array_default_neurons_v.copy()\n not_refractory = _array_default_neurons_not_refractory.copy()\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject_1"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject_1"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject_1"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject_1"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject_1"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,80 @@
{
"ae_sha256": "32eb1c42383068ce52701d2139a376ce155ad7072cde019949f8ca2d55492409",
"af_sha256": "d72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961",
"apl_delay_steps": 18,
"author_sha256": "fc45837d7122c6ce2a7f3f2f23c515992e4b232aadb919efabb72337fac88e4e",
"bundle_hashes": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"candidate_trace_used_as_input": false,
"case_hashes": {
"requests.npz": "e1864bc4bbe3224126fdc6757552d09d942803c83853faec00e06069c00838ee",
"spec.json": "e6a07f3094dd548d6ba784edbe4e0dcd854514b6fd6492cbdc417b39e9063845"
},
"coefficients_sha256": "bde79d95ef0097b827d5faf4d5658eafc009d8e9fcef1fddd645c953823e3f64",
"copied_oracle_sha256": "357a7d3debb5abc34a8714c0233b456547a154d9d5855d28661b4f01019a80ea",
"copied_oracle_source": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/oracle_apl.py",
"graph_hashes": {
"completeness.csv": "fb9033398abb7585ae63472ced9d8c8cab787f69965dc9ce5fa409ab105bc1bc",
"connectivity.parquet": "1362c1102b74f5552f4b01fca956574fd6252f749e31493c4a00a1bc9eab00b3",
"dst.npy": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
"edge_id.npy": "49260615ff2b6432ce3dea9ce2c7ab8f83d06c2fb7491e58e08355fcedf86a30",
"nodes.npy": "5b511a98e8fbf8d65bbc70b93e75ecae19366f650b7842a45611bfad62ed83dc",
"ptr.npy": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
"signed_raw.npy": "f9884ccb8930b32420b27c69271df78034a8350fe5a5c9b76a63c259268efc09",
"src.npy": "bfd625ce690fc21eb0a8b9dede831688ab73b789045ba83ddf4baeefeddf1fc3",
"weights.npy": "462839ffc3feb8f6c278044488082b1c8e410e7f23229d6b5e29d1b7042416a1"
},
"legacy_apl_worker_sha256": "21ceec65fe42581dc55872010e0025d660e80358905f1cf4df1dadf341a3b291",
"only_scientific_change": "transport generated graded-APL h before the unchanged end write",
"scope": "shared-APL-component closed-loop oracle, not all-components-independent CPU equivalence",
"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": 113.30283203125,
"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": "novel_to_aj-physiological-00-s1073741825",
"odor_id": "YSNWHRKJEKWJNY-UHFFFAOYSA-N",
"odor_index": 0,
"odor_name": "ethyl 3-methylsulfanylpropanoate",
"output_budget_bytes": 25769803776,
"precision": "float64",
"rate_sum_hz": 1133.0283203125,
"record_history": false,
"science_python": "/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"seed": 1073741825,
"source_panel_row": 6,
"source_panel_split": "heldout",
"steps": 1000,
"target_count": 35,
"training": false,
"validation_cohort": "novel_to_aj"
}
}
@@ -0,0 +1,60 @@
{
"APL_SI_conversion": "h.astype(float64) * float64(0.001), then separate float64 g subtraction",
"APL_dtype": "float32",
"APL_h_units": "mV; gain already applied in float32",
"APL_inhibition_file_means": "generated h at the actual closed-loop Brian spike tick, not the delayed applied value",
"APL_input": "Brian's own actual global spikes, never candidate spikes or candidate inhibition",
"APL_pending_file": "apl-pending-tail.float32.npy",
"APL_pending_generated_count": 18,
"APL_pending_initial_zero_prefix": 0,
"APL_pending_scope": "next D scheduled applications from recorded h plus unconsumed initial zero slots; not future generated decay",
"APL_shapes": {
"applied": [
1000,
4064
],
"drive": [
1000,
2
],
"inhibition": [
1000,
4064
],
"pending_tail": [
18,
4064
],
"state": [
1000,
2
]
},
"APL_transport": "applied[t]=generated_h[t-D] for t>=D, positive zero otherwise; separate independent list FIFO",
"APL_write_schedule": "end, order=0, after original reset, unconditional raw g write; recorder end/order=1",
"apl_delay_steps": 18,
"complete_marker": "summary.json complete=true only after worker exit and all checks",
"history_recorded": false,
"history_shape": [
1000,
166700
],
"queue_protocol": "sealed Phase4AF queue_summary; original global edge IDs, including zero-weight/ref-rejected arrivals",
"request_columns": [
"tick",
"neuron_idx",
"attempted",
"accepted",
"rejected"
],
"state_hash_encoding": "SHA256 of contiguous little-endian raw f64 V/g and i32 ref",
"state_hash_file": "tick-state-hashes.jsonl",
"state_npz": [
"step",
"neuron_idx",
"counts",
"v",
"g",
"ref"
]
}
@@ -0,0 +1,34 @@
{
"membrane_tau_ms": {
"author": 20.0,
"case": 20.0
},
"refractory_ms": {
"author": 2.2,
"case": 2.2
},
"reset_potential_mv": {
"author": -52.0,
"case": -52.0
},
"resting_potential_mv": {
"author": -52.0,
"case": -52.0
},
"synaptic_delay_ms": {
"author": 1.8,
"case": 1.8
},
"synaptic_tau_ms": {
"author": 5.0,
"case": 5.0
},
"threshold_mv": {
"author": -45.0,
"case": -45.0
},
"w_syn_mv_per_anatomical_synapse": {
"author": 0.275,
"case": 0.275
}
}
@@ -0,0 +1,15 @@
{
"advance_calls": 1000,
"forwarding_contract": "sealed AE/AF design",
"installations": [
"default_synapses_pre_codeobject",
"default_synapses_pre_codeobject_1"
],
"limit": "Current wrapper was not independently rerun without the queue proxy",
"new_unwrapped_repeat_performed": false,
"original_edge_ids_not_sorted_or_filtered": true,
"peek_calls": 1000,
"post_threshold_pre_synaptic_guard_observed": true,
"same_peek_object_returned": true,
"zero_weight_and_refractory_rejected_edges_retained": true
}
@@ -0,0 +1,118 @@
tick,neuron_idx,attempted,accepted,rejected
20,7322,1,1,0
21,53508,1,1,0
24,999,1,1,0
25,530,1,1,0
31,159,1,1,0
37,2029,1,1,0
43,530,1,0,1
50,522,1,1,0
51,1372,1,1,0
58,9052,1,1,0
73,530,1,1,0
78,530,1,0,1
81,530,1,0,1
95,622,1,1,0
114,710,1,1,0
115,2029,1,1,0
136,79514,1,1,0
138,79514,1,0,1
150,130753,1,1,0
152,130753,1,0,1
154,530,1,0,1
155,2029,1,1,0
157,54264,1,1,0
160,54264,1,0,1
163,54264,1,0,1
172,2029,1,0,1
183,7322,1,1,0
190,130753,1,1,0
195,7322,1,0,1
201,97,1,1,0
202,530,1,0,1
204,9052,1,1,0
214,55121,1,1,0
220,522,1,1,0
234,1011,1,1,0
257,530,1,1,0
264,700,1,1,0
278,6721,1,1,0
287,999,1,0,1
295,189,1,0,1
326,571,1,0,1
334,360,1,0,1
353,79514,1,1,0
366,1372,1,1,0
386,189,1,1,0
408,1011,1,1,0
415,130753,1,0,1
423,434,1,1,0
430,130257,1,1,0
446,79514,1,1,0
463,2601,1,0,1
469,522,1,1,0
479,159,1,1,0
481,360,1,1,0
511,9052,1,1,0
513,571,1,1,0
527,54264,1,1,0
547,189,1,0,1
554,999,1,1,0
556,2029,1,1,0
556,9052,1,1,0
567,4786,1,1,0
567,79514,1,1,0
568,7680,1,1,0
596,1372,1,0,1
610,434,1,1,0
613,1011,1,1,0
629,159,1,0,1
643,130753,1,1,0
657,1011,1,1,0
668,2029,1,1,0
672,1011,1,0,1
682,1372,1,1,0
695,6721,1,1,0
700,360,1,0,1
704,4624,1,1,0
710,9052,1,1,0
714,700,1,0,1
725,1372,1,1,0
725,7680,1,1,0
726,6721,1,1,0
742,1022,1,0,1
750,1011,1,0,1
754,189,1,0,1
755,4624,1,1,0
770,130753,1,0,1
795,97,1,1,0
814,189,1,1,0
817,360,1,1,0
817,6721,1,1,0
831,434,1,0,1
836,133666,1,1,0
842,530,1,0,1
844,54264,1,1,0
846,530,1,1,0
847,97,1,1,0
886,522,1,1,0
890,189,1,1,0
896,1372,1,0,1
896,133666,1,0,1
897,1011,1,1,0
902,1011,1,0,1
906,530,1,1,0
909,97,1,1,0
915,1927,1,1,0
950,4786,1,1,0
952,360,1,1,0
957,7322,1,0,1
964,189,1,0,1
965,522,1,1,0
974,2029,1,1,0
977,79514,1,1,0
982,97,1,0,1
989,54264,1,1,0
992,54264,1,0,1
994,79514,1,0,1
998,189,1,1,0
1 tick neuron_idx attempted accepted rejected
2 20 7322 1 1 0
3 21 53508 1 1 0
4 24 999 1 1 0
5 25 530 1 1 0
6 31 159 1 1 0
7 37 2029 1 1 0
8 43 530 1 0 1
9 50 522 1 1 0
10 51 1372 1 1 0
11 58 9052 1 1 0
12 73 530 1 1 0
13 78 530 1 0 1
14 81 530 1 0 1
15 95 622 1 1 0
16 114 710 1 1 0
17 115 2029 1 1 0
18 136 79514 1 1 0
19 138 79514 1 0 1
20 150 130753 1 1 0
21 152 130753 1 0 1
22 154 530 1 0 1
23 155 2029 1 1 0
24 157 54264 1 1 0
25 160 54264 1 0 1
26 163 54264 1 0 1
27 172 2029 1 0 1
28 183 7322 1 1 0
29 190 130753 1 1 0
30 195 7322 1 0 1
31 201 97 1 1 0
32 202 530 1 0 1
33 204 9052 1 1 0
34 214 55121 1 1 0
35 220 522 1 1 0
36 234 1011 1 1 0
37 257 530 1 1 0
38 264 700 1 1 0
39 278 6721 1 1 0
40 287 999 1 0 1
41 295 189 1 0 1
42 326 571 1 0 1
43 334 360 1 0 1
44 353 79514 1 1 0
45 366 1372 1 1 0
46 386 189 1 1 0
47 408 1011 1 1 0
48 415 130753 1 0 1
49 423 434 1 1 0
50 430 130257 1 1 0
51 446 79514 1 1 0
52 463 2601 1 0 1
53 469 522 1 1 0
54 479 159 1 1 0
55 481 360 1 1 0
56 511 9052 1 1 0
57 513 571 1 1 0
58 527 54264 1 1 0
59 547 189 1 0 1
60 554 999 1 1 0
61 556 2029 1 1 0
62 556 9052 1 1 0
63 567 4786 1 1 0
64 567 79514 1 1 0
65 568 7680 1 1 0
66 596 1372 1 0 1
67 610 434 1 1 0
68 613 1011 1 1 0
69 629 159 1 0 1
70 643 130753 1 1 0
71 657 1011 1 1 0
72 668 2029 1 1 0
73 672 1011 1 0 1
74 682 1372 1 1 0
75 695 6721 1 1 0
76 700 360 1 0 1
77 704 4624 1 1 0
78 710 9052 1 1 0
79 714 700 1 0 1
80 725 1372 1 1 0
81 725 7680 1 1 0
82 726 6721 1 1 0
83 742 1022 1 0 1
84 750 1011 1 0 1
85 754 189 1 0 1
86 755 4624 1 1 0
87 770 130753 1 0 1
88 795 97 1 1 0
89 814 189 1 1 0
90 817 360 1 1 0
91 817 6721 1 1 0
92 831 434 1 0 1
93 836 133666 1 1 0
94 842 530 1 0 1
95 844 54264 1 1 0
96 846 530 1 1 0
97 847 97 1 1 0
98 886 522 1 1 0
99 890 189 1 1 0
100 896 1372 1 0 1
101 896 133666 1 0 1
102 897 1011 1 1 0
103 902 1011 1 0 1
104 906 530 1 1 0
105 909 97 1 1 0
106 915 1927 1 1 0
107 950 4786 1 1 0
108 952 360 1 1 0
109 957 7322 1 0 1
110 964 189 1 0 1
111 965 522 1 1 0
112 974 2029 1 1 0
113 977 79514 1 1 0
114 982 97 1 0 1
115 989 54264 1 1 0
116 992 54264 1 0 1
117 994 79514 1 0 1
118 998 189 1 1 0
@@ -0,0 +1,9 @@
{
"apl_delay_steps": 18,
"backend": "oracle",
"dynamics_copied_or_reimplemented": false,
"old_module_scientific_globals_changed": false,
"scope": "Unchanged AJ runtime called with new case/output/build arguments; not a new numerical model",
"sealed_runtime": "/data/digital-drosophila/models/male-cns-lif/apl-timing-lab-v1/oracle_timing.py",
"sealed_runtime_sha256": "39d8c47c94bc2faddf016864a43e7715907fb987f56f7b27098060a88851f6be"
}
@@ -0,0 +1,11 @@
{
"schedule": [
"start",
"groups",
"thresholds",
"synapses",
"resets",
"end"
],
"summary": " object | part of | Clock dt | when | order | active\n---------------------------------------------------+-------------------------------+----------------------+-------------------+---------+-------\ndefault_neurons_stateupdater (StateUpdater) | default_neurons (NeuronGroup) | 100. us (every step) | groups | 0 | yes \noracle_common_requests (NetworkOperation) | -- | 100. us (every step) | before_thresholds | 0 | yes \ndefault_neurons_spike_thresholder (Thresholder) | default_neurons (NeuronGroup) | 100. us (every step) | thresholds | 0 | yes \nspikemonitor (SpikeMonitor) | spikemonitor (SpikeMonitor) | 100. us (every step) | thresholds | 1 | yes \ndefault_synapses_pre (SynapticPathway) | default_synapses (Synapses) | 100. us (every step) | synapses | -1 | yes \ndefault_neurons_spike_resetter (Resetter) | default_neurons (NeuronGroup) | 100. us (every step) | resets | 0 | yes \noracle_legacy_apl_unconditional (NetworkOperation) | -- | 100. us (every step) | end | 0 | yes \noracle_after_apl_record (NetworkOperation) | -- | 100. us (every step) | end | 1 | yes \nzz_apl_queue_installer (QueueInstaller) | -- | 100. us (every step) | end | 1000000 | yes "
}
@@ -0,0 +1,51 @@
{
"APL_applied_sha256": "757329fd1d760d3f2dc5e73fb2686a94ba78c5a255db7f4ec9918f8d8ba700f8",
"APL_fast_edges_zeroed": 5845,
"APL_finite_sequence_partition_exact": true,
"APL_pending_tail_sha256": "0bbf355ce1ddb2d2ddfdd73a0ca2fba59dd479584403a6cf8aa0b8d2336935f9",
"APL_precision": "float32",
"APL_timing_audit_sha256": "251dd25f317e022dfd8ba8709e0c1b5c468401c3ed7beeedecde9f8cfe246a63",
"APL_transport_shift_exact": true,
"APL_worker_exit_status": 0,
"APL_worker_ticks": 1000,
"apl_delay_steps": 18,
"apl_fast_edges_zeroed": 5845,
"applicable_requests": 80,
"backend": "shared-APL-component closed-loop Brian2 oracle",
"candidate_trace_used_as_input": false,
"complete": true,
"completed_ticks": 1000,
"edges": 25582938,
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"events_sha256": "2815973438d5de7c169ed651101dec8136fe5bde549324010204ca7b7d694bac",
"future_generated_decay_tail_included": false,
"history_recorded": false,
"independent_CPU_all_components_claim": false,
"initial_zero_prefix": 0,
"kc_targets_present": 4064,
"name": "novel_to_aj-physiological-00-s1073741825",
"no_poi": true,
"no_training": true,
"nodes": 166700,
"output_budget_bytes": 25769803776,
"output_bytes_before_summary": 3389301301,
"pass_all": true,
"pass_all_scope": "Oracle construction, protocol and internal self-checks only; candidate comparison is a separate gate",
"pending_generated_count": 18,
"pending_initial_zero_prefix": 0,
"pending_tail_shape": [
18,
4064
],
"precision": "float64",
"queue_sha256": "894ab50fa8a60ebe4ccf54c46b7778488b83605bb08c9dcb438981f9901c0a0c",
"ref_rejected_requests": 37,
"requests": 117,
"scope": "Only this fixed trajectory; legacy Torch APL is a shared numerical component, not an independent CPU APL implementation",
"single_continuous_run": true,
"source_and_inputs_unchanged": true,
"spikes": 29986,
"state_hashes_sha256": "166a663b84ff3281babc50b7ebd7d356f6de1eed734b72abfd545b785b9a063c",
"steps": 1000,
"weights_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b"
}
@@ -0,0 +1,12 @@
{
"KC_targets_in_case": 4064,
"base_graph_files_modified": false,
"base_weight_raw_bytes_sha256": "a8c19cde743bd456bcb2e988d504f805b6943d6ceb97cd241d6e1e472ab5a591",
"count": 5845,
"effective_weights_file_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b",
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"fullgraph_required_mask_count": 5845,
"graded_targets": "only KC identities present in this LIF case",
"ordered_original_edge_id_sha256": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
"rule": "zero +0 all existing fast edges whose source GLOBAL neuron is in apl_globals; no graph edge removal"
}
@@ -0,0 +1,39 @@
{
"APL_generation_steps_after_window": 0,
"apl_delay_steps": 18,
"applied_generated_rows": 982,
"brain_steps_after_window": 0,
"brain_tail_advanced": false,
"closed_loop_branch_integrals_claimed_equal": false,
"delay_implementation": "independent list FIFO; no candidate or timing_queue imports",
"final_apl_state_float32": [
149.37657165527344,
165.87535095214844
],
"final_apl_state_nonzero": true,
"final_apl_state_u32_bits": [
1125474407,
1126555671
],
"finite_generated_sequence_partition_exact": true,
"future_apl_decay_or_feedback_generated": false,
"future_generated_decay_tail_included": false,
"generated_rows": 1000,
"initial_zero_prefix": 0,
"meaning": "Tail contains only already generated h and any remaining initial-zero padding; never a complete future closed-loop or decay tail",
"pending_application_tick_start": 1000,
"pending_application_tick_stop_exclusive": 1018,
"pending_file_sha256": "fdc9d9439f0a7ced8c05728bd893861e1a383b4ff2d0e8338817e80c75b0dc69",
"pending_generated_count": 18,
"pending_generated_tick_start": 982,
"pending_generated_tick_stop_exclusive": 1000,
"pending_initial_zero_prefix": 0,
"pending_raw_sha256": "0ecc528803aceb25ca9247f2d596e3d7aec2ee750fa285cd21a2798e53a8b577",
"pending_shape": [
18,
4064
],
"positive_zero_warmup_exact": true,
"steps": 1000,
"transport_shift_exact": true
}
@@ -0,0 +1,56 @@
{
"command": [
"/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"-B",
"/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
"--bundle-dir",
"/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
"--dt-ms",
"0.1"
],
"handshake": {
"array_sha256": {
"apl_globals.npy": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
"input_matrix.npy": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
"kc_globals.npy": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
"output_matrix.npy": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9"
},
"decay_f32_bits": "3f7eb923",
"dt_ms": 0.1,
"environment": {
"CUBLAS_WORKSPACE_CONFIG": null,
"cuda": "13.0",
"cuda_matmul_allow_tf32": false,
"cudnn": 92400,
"cudnn_allow_tf32": true,
"cudnn_benchmark": false,
"cudnn_deterministic": false,
"deterministic_algorithms": false,
"device_capability": [
8,
9
],
"device_index": 0,
"device_name": "NVIDIA GeForce RTX 4090",
"float32_matmul_precision": "highest",
"numpy": "2.2.6",
"precision_configuration_changed_by_component": false,
"torch": "2.14.0+cu130"
},
"files_sha256": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"gain_f32_bits": "3c23d70a",
"h_units": "legacy mV",
"initial_state": "float32 zeros",
"n_apl": 2,
"n_kc": 4064,
"n_neurons": 166700,
"ok": true,
"operator_sequence": "state.mul_(decay32); drive=mv(I32,spikes32); state.add_(drive); h=matmul(state,O32)*gain32",
"protocol": "phase4ag-apl-v1"
}
}
@@ -0,0 +1,72 @@
{
"c0": -0.00025935108198051754,
"cg": 0.004937935295309027,
"cv": 0.9950124791926823,
"gd": 0.9801986733067553,
"metadata": {
"constant_values_are_double": true,
"float32_execution_note": "Brian NumPy scalar/array promotion and operation order must be matched separately; double coefficients alone do not assert float64 intermediate array arithmetic.",
"g_expression": "gd * old_g",
"hex": {
"c0": "-0x1.0ff306a505980p-12",
"cg": "0x1.439cce9a65d5bp-8",
"cv": "0x1.fd7246927d28bp-1",
"gd": "0x1.f5dc99badec5bp-1",
"reset": "-0x1.a9fbe76c8b43ap-5",
"seed_volt": "-0x1.6872b020c49bap-5",
"threshold": "-0x1.70a3d70a3d70ap-5"
},
"names": {
"c0": "_lio_8",
"cg": "_lio_9",
"cv": "_lio_10",
"gd": "_lio_2"
},
"provenance": {
"c0": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_8",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cg": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_9",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cv": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_10",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"gd": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_2",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"reset": {
"code_object": "default_neurons_spike_resetter_codeobject_1",
"name": "v_rst",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"seed_volt": {
"source": "common request interface: unchanged v_th + 1 mV"
},
"threshold": {
"code_object": "default_neurons_spike_thresholder_codeobject_1",
"name": "v_th",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
}
},
"units": "SI volts and dimensionless coefficients",
"voltage_expression": "c0 + ((cg * old_g) + (cv * old_v))"
},
"reset": -0.052000000000000005,
"seed_volt": -0.044,
"threshold": -0.045
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n dt = _array_defaultclock_dt[0]\n lastspike = _array_default_neurons_lastspike\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n g = _array_default_neurons_g.copy()\n v = _array_default_neurons_v.copy()\n rfc = _array_default_neurons_rfc\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\n _array_default_neurons_v[:] = v\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n not_refractory = _array_default_neurons_not_refractory\n v = _array_default_neurons_v\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_g[_idx] = g\n _array_default_neurons_v[_idx] = v\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,17 @@
{
"APL_precision": "float32 in separate science-Python process",
"Torch_imported_into_Brian": false,
"author_precision": "float64",
"codegen": "numpy",
"packages": {
"brian2": "2.5.1",
"cython": "0.29.33",
"numpy": "1.22.3",
"pandas": "1.4.3",
"pyarrow": "11.0.0",
"scipy": "1.8.1",
"sympy": "1.12"
},
"platform": "Linux-5.15.0-194-generic-x86_64-with-glibc2.35",
"python": "3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]"
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n dt = _array_defaultclock_dt[0]\n lastspike = _array_default_neurons_lastspike\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n g = _array_default_neurons_g.copy()\n v = _array_default_neurons_v.copy()\n rfc = _array_default_neurons_rfc\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_not_refractory[:] = not_refractory\n _array_default_neurons_g[:] = g\n _array_default_neurons_v[:] = v\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject_1"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n not_refractory = _array_default_neurons_not_refractory\n v = _array_default_neurons_v\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject_1"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_t = _array_defaultclock_t[0]\n _source_i = _array_default_neurons_i[_idx]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject_1"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject_1"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_g[_idx] = g\n _array_default_neurons_v[_idx] = v\nbefore_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject_1"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,80 @@
{
"ae_sha256": "32eb1c42383068ce52701d2139a376ce155ad7072cde019949f8ca2d55492409",
"af_sha256": "d72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961",
"apl_delay_steps": 18,
"author_sha256": "fc45837d7122c6ce2a7f3f2f23c515992e4b232aadb919efabb72337fac88e4e",
"bundle_hashes": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"candidate_trace_used_as_input": false,
"case_hashes": {
"requests.npz": "829bb96de6a7137e33f3b17ba12163a973471068a5777188c958ce4687100585",
"spec.json": "23b4e96982040551cc88333dad82d8bd77275726132134ece80e560f8aae988d"
},
"coefficients_sha256": "bde79d95ef0097b827d5faf4d5658eafc009d8e9fcef1fddd645c953823e3f64",
"copied_oracle_sha256": "357a7d3debb5abc34a8714c0233b456547a154d9d5855d28661b4f01019a80ea",
"copied_oracle_source": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/oracle_apl.py",
"graph_hashes": {
"completeness.csv": "fb9033398abb7585ae63472ced9d8c8cab787f69965dc9ce5fa409ab105bc1bc",
"connectivity.parquet": "1362c1102b74f5552f4b01fca956574fd6252f749e31493c4a00a1bc9eab00b3",
"dst.npy": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
"edge_id.npy": "49260615ff2b6432ce3dea9ce2c7ab8f83d06c2fb7491e58e08355fcedf86a30",
"nodes.npy": "5b511a98e8fbf8d65bbc70b93e75ecae19366f650b7842a45611bfad62ed83dc",
"ptr.npy": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
"signed_raw.npy": "f9884ccb8930b32420b27c69271df78034a8350fe5a5c9b76a63c259268efc09",
"src.npy": "bfd625ce690fc21eb0a8b9dede831688ab73b789045ba83ddf4baeefeddf1fc3",
"weights.npy": "462839ffc3feb8f6c278044488082b1c8e410e7f23229d6b5e29d1b7042416a1"
},
"legacy_apl_worker_sha256": "21ceec65fe42581dc55872010e0025d660e80358905f1cf4df1dadf341a3b291",
"only_scientific_change": "transport generated graded-APL h before the unchanged end write",
"scope": "shared-APL-component closed-loop oracle, not all-components-independent CPU equivalence",
"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": 102.24431762695312,
"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": "matched_energy",
"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-matched_energy-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": 1022.4431762695312,
"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"
}
}
@@ -0,0 +1,60 @@
{
"APL_SI_conversion": "h.astype(float64) * float64(0.001), then separate float64 g subtraction",
"APL_dtype": "float32",
"APL_h_units": "mV; gain already applied in float32",
"APL_inhibition_file_means": "generated h at the actual closed-loop Brian spike tick, not the delayed applied value",
"APL_input": "Brian's own actual global spikes, never candidate spikes or candidate inhibition",
"APL_pending_file": "apl-pending-tail.float32.npy",
"APL_pending_generated_count": 18,
"APL_pending_initial_zero_prefix": 0,
"APL_pending_scope": "next D scheduled applications from recorded h plus unconsumed initial zero slots; not future generated decay",
"APL_shapes": {
"applied": [
1000,
4064
],
"drive": [
1000,
2
],
"inhibition": [
1000,
4064
],
"pending_tail": [
18,
4064
],
"state": [
1000,
2
]
},
"APL_transport": "applied[t]=generated_h[t-D] for t>=D, positive zero otherwise; separate independent list FIFO",
"APL_write_schedule": "end, order=0, after original reset, unconditional raw g write; recorder end/order=1",
"apl_delay_steps": 18,
"complete_marker": "summary.json complete=true only after worker exit and all checks",
"history_recorded": false,
"history_shape": [
1000,
166700
],
"queue_protocol": "sealed Phase4AF queue_summary; original global edge IDs, including zero-weight/ref-rejected arrivals",
"request_columns": [
"tick",
"neuron_idx",
"attempted",
"accepted",
"rejected"
],
"state_hash_encoding": "SHA256 of contiguous little-endian raw f64 V/g and i32 ref",
"state_hash_file": "tick-state-hashes.jsonl",
"state_npz": [
"step",
"neuron_idx",
"counts",
"v",
"g",
"ref"
]
}
@@ -0,0 +1,34 @@
{
"membrane_tau_ms": {
"author": 20.0,
"case": 20.0
},
"refractory_ms": {
"author": 2.2,
"case": 2.2
},
"reset_potential_mv": {
"author": -52.0,
"case": -52.0
},
"resting_potential_mv": {
"author": -52.0,
"case": -52.0
},
"synaptic_delay_ms": {
"author": 1.8,
"case": 1.8
},
"synaptic_tau_ms": {
"author": 5.0,
"case": 5.0
},
"threshold_mv": {
"author": -45.0,
"case": -45.0
},
"w_syn_mv_per_anatomical_synapse": {
"author": 0.275,
"case": 0.275
}
}
@@ -0,0 +1,15 @@
{
"advance_calls": 1000,
"forwarding_contract": "sealed AE/AF design",
"installations": [
"default_synapses_pre_codeobject",
"default_synapses_pre_codeobject_1"
],
"limit": "Current wrapper was not independently rerun without the queue proxy",
"new_unwrapped_repeat_performed": false,
"original_edge_ids_not_sorted_or_filtered": true,
"peek_calls": 1000,
"post_threshold_pre_synaptic_guard_observed": true,
"same_peek_object_returned": true,
"zero_weight_and_refractory_rejected_edges_retained": true
}
@@ -0,0 +1,108 @@
tick,neuron_idx,attempted,accepted,rejected
7,522,1,1,0
15,2943,1,1,0
15,7781,1,1,0
17,2927,1,1,0
31,3252,1,1,0
37,159,1,1,0
37,5519,1,1,0
56,522,1,1,0
69,2535,1,1,0
69,9370,1,1,0
78,6842,1,1,0
83,10769,1,1,0
113,12644,1,1,0
114,3345,1,1,0
118,522,1,0,1
133,130472,1,1,0
146,4173,1,1,0
149,21802,1,1,0
156,130497,1,1,0
178,2010,1,0,1
215,14839,1,0,1
236,6842,1,1,0
238,5519,1,0,1
302,360,1,1,0
325,1011,1,1,0
337,2586,1,1,0
342,130753,1,1,0
351,1514,1,0,1
374,1927,1,0,1
378,999,1,1,0
384,130753,1,1,0
385,360,1,1,0
395,360,1,0,1
399,4311,1,1,0
404,8504,1,1,0
414,999,1,1,0
414,2927,1,1,0
434,522,1,0,1
461,10769,1,1,0
475,360,1,0,1
489,1514,1,1,0
497,130753,1,1,0
506,999,1,0,1
507,12644,1,1,0
513,3161,1,1,0
516,522,1,1,0
518,12644,1,0,1
521,21802,1,1,0
528,130472,1,0,1
529,360,1,1,0
538,7781,1,1,0
541,2970,1,1,0
547,7781,1,0,1
549,131226,1,0,1
550,131226,1,0,1
551,360,1,1,0
596,1514,1,1,0
596,9975,1,1,0
604,2029,1,0,1
605,2347,1,1,0
609,1191,1,1,0
610,10769,1,1,0
613,131226,1,0,1
616,522,1,1,0
617,522,1,0,1
646,2535,1,0,1
650,2010,1,0,1
654,2231,1,1,0
655,522,1,1,0
663,360,1,0,1
667,10769,1,1,0
698,1514,1,1,0
704,12644,1,1,0
716,1514,1,0,1
727,522,1,1,0
727,6842,1,0,1
745,2010,1,1,0
746,360,1,0,1
754,3252,1,0,1
763,130497,1,1,0
764,1890,1,0,1
772,3161,1,1,0
782,9975,1,0,1
794,2029,1,1,0
815,130753,1,1,0
816,1514,1,1,0
816,4505,1,1,0
823,14839,1,1,0
834,522,1,1,0
846,2601,1,1,0
855,999,1,1,0
859,9370,1,1,0
863,522,1,1,0
866,360,1,1,0
876,6842,1,1,0
878,9975,1,1,0
898,522,1,1,0
906,331,1,0,1
906,2010,1,1,0
921,5519,1,1,0
931,522,1,1,0
940,360,1,1,0
942,130753,1,1,0
971,1890,1,1,0
972,2010,1,0,1
995,130753,1,1,0
996,10769,1,1,0
1 tick neuron_idx attempted accepted rejected
2 7 522 1 1 0
3 15 2943 1 1 0
4 15 7781 1 1 0
5 17 2927 1 1 0
6 31 3252 1 1 0
7 37 159 1 1 0
8 37 5519 1 1 0
9 56 522 1 1 0
10 69 2535 1 1 0
11 69 9370 1 1 0
12 78 6842 1 1 0
13 83 10769 1 1 0
14 113 12644 1 1 0
15 114 3345 1 1 0
16 118 522 1 0 1
17 133 130472 1 1 0
18 146 4173 1 1 0
19 149 21802 1 1 0
20 156 130497 1 1 0
21 178 2010 1 0 1
22 215 14839 1 0 1
23 236 6842 1 1 0
24 238 5519 1 0 1
25 302 360 1 1 0
26 325 1011 1 1 0
27 337 2586 1 1 0
28 342 130753 1 1 0
29 351 1514 1 0 1
30 374 1927 1 0 1
31 378 999 1 1 0
32 384 130753 1 1 0
33 385 360 1 1 0
34 395 360 1 0 1
35 399 4311 1 1 0
36 404 8504 1 1 0
37 414 999 1 1 0
38 414 2927 1 1 0
39 434 522 1 0 1
40 461 10769 1 1 0
41 475 360 1 0 1
42 489 1514 1 1 0
43 497 130753 1 1 0
44 506 999 1 0 1
45 507 12644 1 1 0
46 513 3161 1 1 0
47 516 522 1 1 0
48 518 12644 1 0 1
49 521 21802 1 1 0
50 528 130472 1 0 1
51 529 360 1 1 0
52 538 7781 1 1 0
53 541 2970 1 1 0
54 547 7781 1 0 1
55 549 131226 1 0 1
56 550 131226 1 0 1
57 551 360 1 1 0
58 596 1514 1 1 0
59 596 9975 1 1 0
60 604 2029 1 0 1
61 605 2347 1 1 0
62 609 1191 1 1 0
63 610 10769 1 1 0
64 613 131226 1 0 1
65 616 522 1 1 0
66 617 522 1 0 1
67 646 2535 1 0 1
68 650 2010 1 0 1
69 654 2231 1 1 0
70 655 522 1 1 0
71 663 360 1 0 1
72 667 10769 1 1 0
73 698 1514 1 1 0
74 704 12644 1 1 0
75 716 1514 1 0 1
76 727 522 1 1 0
77 727 6842 1 0 1
78 745 2010 1 1 0
79 746 360 1 0 1
80 754 3252 1 0 1
81 763 130497 1 1 0
82 764 1890 1 0 1
83 772 3161 1 1 0
84 782 9975 1 0 1
85 794 2029 1 1 0
86 815 130753 1 1 0
87 816 1514 1 1 0
88 816 4505 1 1 0
89 823 14839 1 1 0
90 834 522 1 1 0
91 846 2601 1 1 0
92 855 999 1 1 0
93 859 9370 1 1 0
94 863 522 1 1 0
95 866 360 1 1 0
96 876 6842 1 1 0
97 878 9975 1 1 0
98 898 522 1 1 0
99 906 331 1 0 1
100 906 2010 1 1 0
101 921 5519 1 1 0
102 931 522 1 1 0
103 940 360 1 1 0
104 942 130753 1 1 0
105 971 1890 1 1 0
106 972 2010 1 0 1
107 995 130753 1 1 0
108 996 10769 1 1 0
@@ -0,0 +1,9 @@
{
"apl_delay_steps": 18,
"backend": "oracle",
"dynamics_copied_or_reimplemented": false,
"old_module_scientific_globals_changed": false,
"scope": "Unchanged AJ runtime called with new case/output/build arguments; not a new numerical model",
"sealed_runtime": "/data/digital-drosophila/models/male-cns-lif/apl-timing-lab-v1/oracle_timing.py",
"sealed_runtime_sha256": "39d8c47c94bc2faddf016864a43e7715907fb987f56f7b27098060a88851f6be"
}
@@ -0,0 +1,11 @@
{
"schedule": [
"start",
"groups",
"thresholds",
"synapses",
"resets",
"end"
],
"summary": " object | part of | Clock dt | when | order | active\n---------------------------------------------------+-------------------------------+----------------------+-------------------+---------+-------\ndefault_neurons_stateupdater (StateUpdater) | default_neurons (NeuronGroup) | 100. us (every step) | groups | 0 | yes \noracle_common_requests (NetworkOperation) | -- | 100. us (every step) | before_thresholds | 0 | yes \ndefault_neurons_spike_thresholder (Thresholder) | default_neurons (NeuronGroup) | 100. us (every step) | thresholds | 0 | yes \nspikemonitor (SpikeMonitor) | spikemonitor (SpikeMonitor) | 100. us (every step) | thresholds | 1 | yes \ndefault_synapses_pre (SynapticPathway) | default_synapses (Synapses) | 100. us (every step) | synapses | -1 | yes \ndefault_neurons_spike_resetter (Resetter) | default_neurons (NeuronGroup) | 100. us (every step) | resets | 0 | yes \noracle_legacy_apl_unconditional (NetworkOperation) | -- | 100. us (every step) | end | 0 | yes \noracle_after_apl_record (NetworkOperation) | -- | 100. us (every step) | end | 1 | yes \nzz_apl_queue_installer (QueueInstaller) | -- | 100. us (every step) | end | 1000000 | yes "
}
@@ -0,0 +1,51 @@
{
"APL_applied_sha256": "d17e1c743093b083d47ca78438e56f3097b5634da887f83987aec477b9ec4274",
"APL_fast_edges_zeroed": 5845,
"APL_finite_sequence_partition_exact": true,
"APL_pending_tail_sha256": "fdc9d9439f0a7ced8c05728bd893861e1a383b4ff2d0e8338817e80c75b0dc69",
"APL_precision": "float32",
"APL_timing_audit_sha256": "ef1061951869c394d606f79f2d362f67e75a06955e737f0a4b9a7cb7eedd6ce1",
"APL_transport_shift_exact": true,
"APL_worker_exit_status": 0,
"APL_worker_ticks": 1000,
"apl_delay_steps": 18,
"apl_fast_edges_zeroed": 5845,
"applicable_requests": 78,
"backend": "shared-APL-component closed-loop Brian2 oracle",
"candidate_trace_used_as_input": false,
"complete": true,
"completed_ticks": 1000,
"edges": 25582938,
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"events_sha256": "57d328e7f223d47f189bc7ffe1b13a6da0022e160f5ad631c711f4099d56dd82",
"future_generated_decay_tail_included": false,
"history_recorded": false,
"independent_CPU_all_components_claim": false,
"initial_zero_prefix": 0,
"kc_targets_present": 4064,
"name": "seed_validation-matched_energy-00-s1073741825",
"no_poi": true,
"no_training": true,
"nodes": 166700,
"output_budget_bytes": 25769803776,
"output_bytes_before_summary": 626492038,
"pass_all": true,
"pass_all_scope": "Oracle construction, protocol and internal self-checks only; candidate comparison is a separate gate",
"pending_generated_count": 18,
"pending_initial_zero_prefix": 0,
"pending_tail_shape": [
18,
4064
],
"precision": "float64",
"queue_sha256": "90826f935c270e4d56d4310aad43d17124322129add4f096eabfa3c352bb2336",
"ref_rejected_requests": 29,
"requests": 107,
"scope": "Only this fixed trajectory; legacy Torch APL is a shared numerical component, not an independent CPU APL implementation",
"single_continuous_run": true,
"source_and_inputs_unchanged": true,
"spikes": 30982,
"state_hashes_sha256": "b0386ffb7f5aaac324e058daed6dddb87979001dbb172a9673cf5392d35ae212",
"steps": 1000,
"weights_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b"
}
@@ -0,0 +1,12 @@
{
"KC_targets_in_case": 4064,
"base_graph_files_modified": false,
"base_weight_raw_bytes_sha256": "a8c19cde743bd456bcb2e988d504f805b6943d6ceb97cd241d6e1e472ab5a591",
"count": 5845,
"effective_weights_file_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b",
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"fullgraph_required_mask_count": 5845,
"graded_targets": "only KC identities present in this LIF case",
"ordered_original_edge_id_sha256": "78d88b017b336f9c72a230680a39a9c4e74fedeff6fbb7b9c8641f30cb15e72b",
"rule": "zero +0 all existing fast edges whose source GLOBAL neuron is in apl_globals; no graph edge removal"
}
@@ -0,0 +1,39 @@
{
"APL_generation_steps_after_window": 0,
"apl_delay_steps": 18,
"applied_generated_rows": 982,
"brain_steps_after_window": 0,
"brain_tail_advanced": false,
"closed_loop_branch_integrals_claimed_equal": false,
"delay_implementation": "independent list FIFO; no candidate or timing_queue imports",
"final_apl_state_float32": [
151.74046325683594,
169.58856201171875
],
"final_apl_state_nonzero": true,
"final_apl_state_u32_bits": [
1125629327,
1126799020
],
"finite_generated_sequence_partition_exact": true,
"future_apl_decay_or_feedback_generated": false,
"future_generated_decay_tail_included": false,
"generated_rows": 1000,
"initial_zero_prefix": 0,
"meaning": "Tail contains only already generated h and any remaining initial-zero padding; never a complete future closed-loop or decay tail",
"pending_application_tick_start": 1000,
"pending_application_tick_stop_exclusive": 1018,
"pending_file_sha256": "fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f",
"pending_generated_count": 18,
"pending_generated_tick_start": 982,
"pending_generated_tick_stop_exclusive": 1000,
"pending_initial_zero_prefix": 0,
"pending_raw_sha256": "c1ebb91163861d3b2d35e180f72f76695703839b46228796f817b2acb56e8bb5",
"pending_shape": [
18,
4064
],
"positive_zero_warmup_exact": true,
"steps": 1000,
"transport_shift_exact": true
}
@@ -0,0 +1,56 @@
{
"command": [
"/data/digital-drosophila/models/male-cns-lif/.venv/bin/python",
"-B",
"/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/legacy_apl_worker.py",
"--bundle-dir",
"/data/digital-drosophila/experiments/phase4ag-author-apl-r2/apl-bundle",
"--dt-ms",
"0.1"
],
"handshake": {
"array_sha256": {
"apl_globals.npy": "979ef88dff30d41168ce9b377a006ccb3cd034b2dce86d54923ca0f4b87cb6a6",
"input_matrix.npy": "528a5f6f5ffe424f323c5a44695db4a7cf32570709832eff2f37f49e85c92c3e",
"kc_globals.npy": "9e990d10a63b0f74cd7bbbdc5369082f24d5246487af944ba289bc6bf48d4b75",
"output_matrix.npy": "0dcf02cdb7836ab72da32ac47f5682ca33e25f63a8a662a8452d4ea9d46babb9"
},
"decay_f32_bits": "3f7eb923",
"dt_ms": 0.1,
"environment": {
"CUBLAS_WORKSPACE_CONFIG": null,
"cuda": "13.0",
"cuda_matmul_allow_tf32": false,
"cudnn": 92400,
"cudnn_allow_tf32": true,
"cudnn_benchmark": false,
"cudnn_deterministic": false,
"deterministic_algorithms": false,
"device_capability": [
8,
9
],
"device_index": 0,
"device_name": "NVIDIA GeForce RTX 4090",
"float32_matmul_precision": "highest",
"numpy": "2.2.6",
"precision_configuration_changed_by_component": false,
"torch": "2.14.0+cu130"
},
"files_sha256": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"gain_f32_bits": "3c23d70a",
"h_units": "legacy mV",
"initial_state": "float32 zeros",
"n_apl": 2,
"n_kc": 4064,
"n_neurons": 166700,
"ok": true,
"operator_sequence": "state.mul_(decay32); drive=mv(I32,spikes32); state.add_(drive); h=matmul(state,O32)*gain32",
"protocol": "phase4ag-apl-v1"
}
}
@@ -0,0 +1,72 @@
{
"c0": -0.00025935108198051754,
"cg": 0.004937935295309027,
"cv": 0.9950124791926823,
"gd": 0.9801986733067553,
"metadata": {
"constant_values_are_double": true,
"float32_execution_note": "Brian NumPy scalar/array promotion and operation order must be matched separately; double coefficients alone do not assert float64 intermediate array arithmetic.",
"g_expression": "gd * old_g",
"hex": {
"c0": "-0x1.0ff306a505980p-12",
"cg": "0x1.439cce9a65d5bp-8",
"cv": "0x1.fd7246927d28bp-1",
"gd": "0x1.f5dc99badec5bp-1",
"reset": "-0x1.a9fbe76c8b43ap-5",
"seed_volt": "-0x1.6872b020c49bap-5",
"threshold": "-0x1.70a3d70a3d70ap-5"
},
"names": {
"c0": "_lio_8",
"cg": "_lio_9",
"cv": "_lio_10",
"gd": "_lio_2"
},
"provenance": {
"c0": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_8",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cg": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_9",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"cv": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_10",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"gd": {
"code_object": "default_neurons_stateupdater_codeobject_1",
"name": "_lio_2",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"reset": {
"code_object": "default_neurons_spike_resetter_codeobject_1",
"name": "v_rst",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
},
"seed_volt": {
"source": "common request interface: unchanged v_th + 1 mV"
},
"threshold": {
"code_object": "default_neurons_spike_thresholder_codeobject_1",
"name": "v_th",
"namespace_dtype": "float64",
"source": "CodeObject.namespace"
}
},
"units": "SI volts and dimensionless coefficients",
"voltage_expression": "c0 + ((cg * old_g) + (cv * old_v))"
},
"reset": -0.052000000000000005,
"seed_volt": -0.044,
"threshold": -0.045
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n lastspike = _array_default_neurons_lastspike\n rfc = _array_default_neurons_rfc\n g = _array_default_neurons_g.copy()\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n v = _array_default_neurons_v.copy()\n dt = _array_defaultclock_dt[0]\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_g[:] = g\n _array_default_neurons_not_refractory[:] = not_refractory\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_i = _array_default_neurons_i[_idx]\n _source_t = _array_defaultclock_t[0]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,17 @@
{
"APL_precision": "float32 in separate science-Python process",
"Torch_imported_into_Brian": false,
"author_precision": "float64",
"codegen": "numpy",
"packages": {
"brian2": "2.5.1",
"cython": "0.29.33",
"numpy": "1.22.3",
"pandas": "1.4.3",
"pyarrow": "11.0.0",
"scipy": "1.8.1",
"sympy": "1.12"
},
"platform": "Linux-5.15.0-194-generic-x86_64-with-glibc2.35",
"python": "3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]"
}
@@ -0,0 +1,124 @@
[
{
"active": true,
"code_objects": [],
"name": "default_neurons",
"order": 0,
"type": "NeuronGroup",
"when": "start"
},
{
"active": true,
"code_objects": [],
"name": "default_synapses",
"order": 0,
"type": "Synapses",
"when": "start"
},
{
"abstract_code": "not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n_g = g*exp(-dt*int(not_refractory)/tau)\n_v = g*tau*(-exp(dt*int(not_refractory)/t_mbr) + exp(dt*int(not_refractory)/tau))*exp(-dt*int(not_refractory)/t_mbr)*exp(-dt*int(not_refractory)/tau)/(t_mbr - tau) + v*exp(-dt*int(not_refractory)/t_mbr) + v_0 - v_0*exp(-dt*int(not_refractory)/t_mbr)\ng = _g\nv = _v",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n dt = _array_defaultclock_dt[0]\n _lio_1 = (- dt) / tau\n _lio_2 = exp(_lio_1)\n _lio_3 = tau / (t_mbr - tau)\n _lio_4 = dt / t_mbr\n _lio_5 = dt / tau\n _lio_6 = (- dt) / t_mbr\n _lio_7 = v_0 - v_0\n _lio_8 = v_0 - (v_0 * exp(_lio_6))\n _lio_9 = ((_lio_3 * ((- exp(_lio_4)) + exp(_lio_5))) * exp(_lio_6)) * exp(_lio_1)\n _lio_10 = exp(_lio_6)\n # vector code\n _vectorisation_idx = LazyArange(N)\n lastspike = _array_default_neurons_lastspike\n rfc = _array_default_neurons_rfc\n g = _array_default_neurons_g.copy()\n not_refractory = _array_default_neurons_not_refractory.copy()\n t = _array_defaultclock_t[0]\n v = _array_default_neurons_v.copy()\n dt = _array_defaultclock_dt[0]\n not_refractory = timestep(t - lastspike, dt) >= timestep(rfc, dt)\n _g = _numpy.where(not_refractory, _lio_2 * g, g)\n _v = _numpy.where(not_refractory, _lio_8 + ((_lio_9 * g) + (_lio_10 * v)), _lio_7 + v)\n g[not_refractory] = _g[not_refractory]\n v[not_refractory] = _v[not_refractory]\n _array_default_neurons_v[:] = v\n _array_default_neurons_g[:] = g\n _array_default_neurons_not_refractory[:] = not_refractory\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_stateupdater_codeobject_1"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_common_requests",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n numpy_True = _numpy.bool_(True)\n numpy_False = _numpy.bool_(False)\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = LazyArange(N)\n v = _array_default_neurons_v\n not_refractory = _array_default_neurons_not_refractory\n _cond = (v > v_th) & not_refractory\n if _cond is True or _cond is numpy_True:\n _events = _numpy.arange(N)\n elif _cond is False or _cond is numpy_False:\n _events = _numpy.array([])\n else:\n _events, = _cond.nonzero()\n _array_default_neurons__spikespace[-1] = len(_events)\n _array_default_neurons__spikespace[:len(_events)] = _events\n # Set the neuron to refractory\n _array_default_neurons_not_refractory[_events] = False\n _array_default_neurons_lastspike[_events] = _array_defaultclock_t[0]\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 0\n",
"name": "default_neurons_spike_thresholder_codeobject_1"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _n_events = _array_default_neurons__spikespace[-1]\n if _n_events > 0:\n _events = _array_default_neurons__spikespace[:_n_events]\n # Take subgroups into account\n if _source_start != 0 or _source_stop != _source_N:\n _events = _events[(_events >= _source_start) & (_events < _source_stop)]\n _n_events = len(_events)\n if _n_events > 0:\n _vectorisation_idx = 1\n _curlen = _array_spikemonitor_N[0]\n _newlen = _curlen + _n_events\n _owner.resize(_newlen)\n _array_spikemonitor_N[0] = _newlen\n _vectorisation_idx = _events\n _idx = _events\n _source_i = _array_default_neurons_i[_idx]\n _source_t = _array_defaultclock_t[0]\n _to_record_i = _source_i\n _to_record_t = _source_t\n _dynamic_array_spikemonitor_i[_curlen:_newlen] = _to_record_i\n _dynamic_array_spikemonitor_t[_curlen:_newlen] = _to_record_t\n _array_spikemonitor_count[_events - _source_start] += 1\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "spikemonitor_codeobject_1"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.initialise_queue()\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _owner.push_spikes()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_push_spikes"
},
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _spiking_synapses = _queue.peek()\n if len(_spiking_synapses):\n # scalar code\n # vector code\n _idx = _spiking_synapses\n _vectorisation_idx = _idx\n # Abstract code: g += w\n _postsynaptic_idx = _array_default_synapses__synaptic_post[_idx]\n w = _array_default_synapses_w[_idx]\n not_refractory = _array_default_neurons_not_refractory[_postsynaptic_idx]\n _numpy.add.at(_array_default_neurons_g, _postsynaptic_idx[not_refractory], w[not_refractory])\n # Advance the spike queue\n _queue.advance()\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_synapses_pre_codeobject_1"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "before_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # scalar code\n _vectorisation_idx = 1\n w = 0\n # vector code\n _idx = _array_default_neurons__spikespace[:_array_default_neurons__spikespace[-1]]\n _vectorisation_idx = _idx\n v = v_rst\n g = 0.0\n _array_default_neurons_v[_idx] = v\n _array_default_neurons_g[_idx] = g\nafter_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # EMPTY_CODE_BLOCK -- overwrite in child template\n",
"name": "default_neurons_spike_resetter_codeobject_1"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"when": "resets"
},
{
"active": true,
"code_objects": [],
"name": "oracle_legacy_apl_unconditional",
"order": 0,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "oracle_after_apl_record",
"order": 1,
"type": "NetworkOperation",
"when": "end"
},
{
"active": true,
"code_objects": [],
"name": "zz_apl_queue_installer",
"order": 1000000,
"type": "QueueInstaller",
"when": "end"
}
]
@@ -0,0 +1,80 @@
{
"ae_sha256": "32eb1c42383068ce52701d2139a376ce155ad7072cde019949f8ca2d55492409",
"af_sha256": "d72003d98f0f1624b12126eff50bd361c43d888f4a64d90ba9247a58976f1961",
"apl_delay_steps": 18,
"author_sha256": "fc45837d7122c6ce2a7f3f2f23c515992e4b232aadb919efabb72337fac88e4e",
"bundle_hashes": {
"apl_globals.npy": "8388c8795d49cfe5b14fda54f76ef3a35030c62ba87bd8ca6334a2dcdf186f19",
"input_matrix.npy": "c4d3df703ea5f1d7402b8255cfa19d9744139ad1048827c23b151d8ba766fec6",
"kc_globals.npy": "97a570aafa089f93e642b2bb07e3a3322dabb14c3c7dd431f0c8d2b3b7951fdd",
"output_matrix.npy": "e2d0a1ccd740e6777245ebf2efcd88bf5e1da9e47308c63ec8e83d451e134a73"
},
"candidate_trace_used_as_input": false,
"case_hashes": {
"requests.npz": "003a6f6306787b67391735c41dd8b14c689beaaab3ab71a5e9afb376d3cbb091",
"spec.json": "ebffa677b41e06cb776a987a496a0577bdda135cf3c067ca8017b038ff3fc5c4"
},
"coefficients_sha256": "bde79d95ef0097b827d5faf4d5658eafc009d8e9fcef1fddd645c953823e3f64",
"copied_oracle_sha256": "357a7d3debb5abc34a8714c0233b456547a154d9d5855d28661b4f01019a80ea",
"copied_oracle_source": "/data/digital-drosophila/models/male-cns-lif/author-apl-lab-v2/oracle_apl.py",
"graph_hashes": {
"completeness.csv": "fb9033398abb7585ae63472ced9d8c8cab787f69965dc9ce5fa409ab105bc1bc",
"connectivity.parquet": "1362c1102b74f5552f4b01fca956574fd6252f749e31493c4a00a1bc9eab00b3",
"dst.npy": "ce20f7433f78442c717ad2a7b5394cf4a3b109d990b4be0788040b7b0f4ed150",
"edge_id.npy": "49260615ff2b6432ce3dea9ce2c7ab8f83d06c2fb7491e58e08355fcedf86a30",
"nodes.npy": "5b511a98e8fbf8d65bbc70b93e75ecae19366f650b7842a45611bfad62ed83dc",
"ptr.npy": "fe43420f11e6242a11f8199ae7f097cab4b8a6db181d36f2a46b9e46670acbb4",
"signed_raw.npy": "f9884ccb8930b32420b27c69271df78034a8350fe5a5c9b76a63c259268efc09",
"src.npy": "bfd625ce690fc21eb0a8b9dede831688ab73b789045ba83ddf4baeefeddf1fc3",
"weights.npy": "462839ffc3feb8f6c278044488082b1c8e410e7f23229d6b5e29d1b7042416a1"
},
"legacy_apl_worker_sha256": "21ceec65fe42581dc55872010e0025d660e80358905f1cf4df1dadf341a3b291",
"only_scientific_change": "transport generated graded-APL h before the unchanged end write",
"scope": "shared-APL-component closed-loop oracle, not all-components-independent CPU equivalence",
"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"
}
}
@@ -0,0 +1,60 @@
{
"APL_SI_conversion": "h.astype(float64) * float64(0.001), then separate float64 g subtraction",
"APL_dtype": "float32",
"APL_h_units": "mV; gain already applied in float32",
"APL_inhibition_file_means": "generated h at the actual closed-loop Brian spike tick, not the delayed applied value",
"APL_input": "Brian's own actual global spikes, never candidate spikes or candidate inhibition",
"APL_pending_file": "apl-pending-tail.float32.npy",
"APL_pending_generated_count": 18,
"APL_pending_initial_zero_prefix": 0,
"APL_pending_scope": "next D scheduled applications from recorded h plus unconsumed initial zero slots; not future generated decay",
"APL_shapes": {
"applied": [
1000,
4064
],
"drive": [
1000,
2
],
"inhibition": [
1000,
4064
],
"pending_tail": [
18,
4064
],
"state": [
1000,
2
]
},
"APL_transport": "applied[t]=generated_h[t-D] for t>=D, positive zero otherwise; separate independent list FIFO",
"APL_write_schedule": "end, order=0, after original reset, unconditional raw g write; recorder end/order=1",
"apl_delay_steps": 18,
"complete_marker": "summary.json complete=true only after worker exit and all checks",
"history_recorded": false,
"history_shape": [
1000,
166700
],
"queue_protocol": "sealed Phase4AF queue_summary; original global edge IDs, including zero-weight/ref-rejected arrivals",
"request_columns": [
"tick",
"neuron_idx",
"attempted",
"accepted",
"rejected"
],
"state_hash_encoding": "SHA256 of contiguous little-endian raw f64 V/g and i32 ref",
"state_hash_file": "tick-state-hashes.jsonl",
"state_npz": [
"step",
"neuron_idx",
"counts",
"v",
"g",
"ref"
]
}
@@ -0,0 +1,34 @@
{
"membrane_tau_ms": {
"author": 20.0,
"case": 20.0
},
"refractory_ms": {
"author": 2.2,
"case": 2.2
},
"reset_potential_mv": {
"author": -52.0,
"case": -52.0
},
"resting_potential_mv": {
"author": -52.0,
"case": -52.0
},
"synaptic_delay_ms": {
"author": 1.8,
"case": 1.8
},
"synaptic_tau_ms": {
"author": 5.0,
"case": 5.0
},
"threshold_mv": {
"author": -45.0,
"case": -45.0
},
"w_syn_mv_per_anatomical_synapse": {
"author": 0.275,
"case": 0.275
}
}
@@ -0,0 +1,15 @@
{
"advance_calls": 1000,
"forwarding_contract": "sealed AE/AF design",
"installations": [
"default_synapses_pre_codeobject",
"default_synapses_pre_codeobject_1"
],
"limit": "Current wrapper was not independently rerun without the queue proxy",
"new_unwrapped_repeat_performed": false,
"original_edge_ids_not_sorted_or_filtered": true,
"peek_calls": 1000,
"post_threshold_pre_synaptic_guard_observed": true,
"same_peek_object_returned": true,
"zero_weight_and_refractory_rejected_edges_retained": true
}
@@ -0,0 +1,111 @@
tick,neuron_idx,attempted,accepted,rejected
7,522,1,1,0
15,2943,1,1,0
15,7781,1,1,0
17,2927,1,1,0
31,3252,1,1,0
37,159,1,1,0
37,5519,1,1,0
56,522,1,1,0
69,2535,1,1,0
69,9370,1,1,0
74,1927,1,1,0
78,6842,1,1,0
83,10769,1,1,0
113,12644,1,1,0
114,3345,1,1,0
118,522,1,0,1
133,130472,1,1,0
146,4173,1,1,0
149,21802,1,1,0
156,130497,1,1,0
178,2010,1,0,1
215,14839,1,0,1
236,6842,1,1,0
238,5519,1,0,1
302,360,1,1,0
325,1011,1,1,0
337,2586,1,1,0
342,130753,1,1,0
351,1514,1,0,1
361,1514,1,1,0
374,1927,1,1,0
378,999,1,1,0
384,130753,1,1,0
385,360,1,1,0
395,360,1,0,1
399,4311,1,0,1
404,8504,1,1,0
405,131226,1,0,1
414,999,1,1,0
414,2927,1,1,0
434,522,1,1,0
461,10769,1,0,1
475,360,1,0,1
489,1514,1,0,1
497,130753,1,0,1
506,999,1,0,1
507,12644,1,1,0
513,3161,1,1,0
516,522,1,1,0
518,12644,1,0,1
521,21802,1,1,0
528,130472,1,1,0
529,360,1,1,0
538,7781,1,1,0
541,2970,1,1,0
547,7781,1,0,1
549,131226,1,1,0
550,131226,1,0,1
551,360,1,1,0
596,1514,1,1,0
596,9975,1,1,0
604,2029,1,1,0
605,2347,1,1,0
609,1191,1,1,0
610,10769,1,0,1
613,131226,1,0,1
616,522,1,1,0
617,522,1,0,1
646,2535,1,1,0
650,2010,1,0,1
654,2231,1,1,0
655,522,1,1,0
663,360,1,1,0
667,10769,1,1,0
698,1514,1,1,0
704,12644,1,1,0
716,1514,1,0,1
727,522,1,1,0
727,6842,1,1,0
745,2010,1,1,0
746,360,1,1,0
754,3252,1,1,0
763,130497,1,0,1
764,1890,1,1,0
772,3161,1,1,0
782,9975,1,1,0
794,2029,1,0,1
815,130753,1,0,1
816,1514,1,1,0
816,4505,1,0,1
823,14839,1,1,0
834,522,1,1,0
846,2601,1,1,0
855,999,1,1,0
859,9370,1,1,0
863,522,1,1,0
866,360,1,1,0
876,6842,1,1,0
878,9975,1,1,0
898,522,1,1,0
906,331,1,0,1
906,2010,1,0,1
921,5519,1,0,1
931,522,1,1,0
940,360,1,0,1
942,130753,1,1,0
971,1890,1,1,0
972,2010,1,0,1
995,130753,1,0,1
996,10769,1,1,0
1 tick neuron_idx attempted accepted rejected
2 7 522 1 1 0
3 15 2943 1 1 0
4 15 7781 1 1 0
5 17 2927 1 1 0
6 31 3252 1 1 0
7 37 159 1 1 0
8 37 5519 1 1 0
9 56 522 1 1 0
10 69 2535 1 1 0
11 69 9370 1 1 0
12 74 1927 1 1 0
13 78 6842 1 1 0
14 83 10769 1 1 0
15 113 12644 1 1 0
16 114 3345 1 1 0
17 118 522 1 0 1
18 133 130472 1 1 0
19 146 4173 1 1 0
20 149 21802 1 1 0
21 156 130497 1 1 0
22 178 2010 1 0 1
23 215 14839 1 0 1
24 236 6842 1 1 0
25 238 5519 1 0 1
26 302 360 1 1 0
27 325 1011 1 1 0
28 337 2586 1 1 0
29 342 130753 1 1 0
30 351 1514 1 0 1
31 361 1514 1 1 0
32 374 1927 1 1 0
33 378 999 1 1 0
34 384 130753 1 1 0
35 385 360 1 1 0
36 395 360 1 0 1
37 399 4311 1 0 1
38 404 8504 1 1 0
39 405 131226 1 0 1
40 414 999 1 1 0
41 414 2927 1 1 0
42 434 522 1 1 0
43 461 10769 1 0 1
44 475 360 1 0 1
45 489 1514 1 0 1
46 497 130753 1 0 1
47 506 999 1 0 1
48 507 12644 1 1 0
49 513 3161 1 1 0
50 516 522 1 1 0
51 518 12644 1 0 1
52 521 21802 1 1 0
53 528 130472 1 1 0
54 529 360 1 1 0
55 538 7781 1 1 0
56 541 2970 1 1 0
57 547 7781 1 0 1
58 549 131226 1 1 0
59 550 131226 1 0 1
60 551 360 1 1 0
61 596 1514 1 1 0
62 596 9975 1 1 0
63 604 2029 1 1 0
64 605 2347 1 1 0
65 609 1191 1 1 0
66 610 10769 1 0 1
67 613 131226 1 0 1
68 616 522 1 1 0
69 617 522 1 0 1
70 646 2535 1 1 0
71 650 2010 1 0 1
72 654 2231 1 1 0
73 655 522 1 1 0
74 663 360 1 1 0
75 667 10769 1 1 0
76 698 1514 1 1 0
77 704 12644 1 1 0
78 716 1514 1 0 1
79 727 522 1 1 0
80 727 6842 1 1 0
81 745 2010 1 1 0
82 746 360 1 1 0
83 754 3252 1 1 0
84 763 130497 1 0 1
85 764 1890 1 1 0
86 772 3161 1 1 0
87 782 9975 1 1 0
88 794 2029 1 0 1
89 815 130753 1 0 1
90 816 1514 1 1 0
91 816 4505 1 0 1
92 823 14839 1 1 0
93 834 522 1 1 0
94 846 2601 1 1 0
95 855 999 1 1 0
96 859 9370 1 1 0
97 863 522 1 1 0
98 866 360 1 1 0
99 876 6842 1 1 0
100 878 9975 1 1 0
101 898 522 1 1 0
102 906 331 1 0 1
103 906 2010 1 0 1
104 921 5519 1 0 1
105 931 522 1 1 0
106 940 360 1 0 1
107 942 130753 1 1 0
108 971 1890 1 1 0
109 972 2010 1 0 1
110 995 130753 1 0 1
111 996 10769 1 1 0
@@ -0,0 +1,9 @@
{
"apl_delay_steps": 18,
"backend": "oracle",
"dynamics_copied_or_reimplemented": false,
"old_module_scientific_globals_changed": false,
"scope": "Unchanged AJ runtime called with new case/output/build arguments; not a new numerical model",
"sealed_runtime": "/data/digital-drosophila/models/male-cns-lif/apl-timing-lab-v1/oracle_timing.py",
"sealed_runtime_sha256": "39d8c47c94bc2faddf016864a43e7715907fb987f56f7b27098060a88851f6be"
}
@@ -0,0 +1,11 @@
{
"schedule": [
"start",
"groups",
"thresholds",
"synapses",
"resets",
"end"
],
"summary": " object | part of | Clock dt | when | order | active\n---------------------------------------------------+-------------------------------+----------------------+-------------------+---------+-------\ndefault_neurons_stateupdater (StateUpdater) | default_neurons (NeuronGroup) | 100. us (every step) | groups | 0 | yes \noracle_common_requests (NetworkOperation) | -- | 100. us (every step) | before_thresholds | 0 | yes \ndefault_neurons_spike_thresholder (Thresholder) | default_neurons (NeuronGroup) | 100. us (every step) | thresholds | 0 | yes \nspikemonitor (SpikeMonitor) | spikemonitor (SpikeMonitor) | 100. us (every step) | thresholds | 1 | yes \ndefault_synapses_pre (SynapticPathway) | default_synapses (Synapses) | 100. us (every step) | synapses | -1 | yes \ndefault_neurons_spike_resetter (Resetter) | default_neurons (NeuronGroup) | 100. us (every step) | resets | 0 | yes \noracle_legacy_apl_unconditional (NetworkOperation) | -- | 100. us (every step) | end | 0 | yes \noracle_after_apl_record (NetworkOperation) | -- | 100. us (every step) | end | 1 | yes \nzz_apl_queue_installer (QueueInstaller) | -- | 100. us (every step) | end | 1000000 | yes "
}
@@ -0,0 +1,51 @@
{
"APL_applied_sha256": "b3a535bc095db2464a75560ed11f336a9db8e843c08fd7681a1b9759b624ad8e",
"APL_fast_edges_zeroed": 5845,
"APL_finite_sequence_partition_exact": true,
"APL_pending_tail_sha256": "fc1e2d8ffa426d4118a7544129323c5f7523e9df3e298a60922ca0ecabe7c18f",
"APL_precision": "float32",
"APL_timing_audit_sha256": "c94e1d8a3a3760cf1926f105c41487e7f6fa5a68b3a4170857328ae9519af78d",
"APL_transport_shift_exact": true,
"APL_worker_exit_status": 0,
"APL_worker_ticks": 1000,
"apl_delay_steps": 18,
"apl_fast_edges_zeroed": 5845,
"applicable_requests": 79,
"backend": "shared-APL-component closed-loop Brian2 oracle",
"candidate_trace_used_as_input": false,
"complete": true,
"completed_ticks": 1000,
"edges": 25582938,
"effective_weights_raw_sha256": "b8b8f43048e0ef03943e607666319d25363bed3b2564fdc02b4149837e7eedc9",
"events_sha256": "4eebd71c427d662a98759276cce7ec4a16ad0d66c9cbef7130fee3acdca8748b",
"future_generated_decay_tail_included": false,
"history_recorded": false,
"independent_CPU_all_components_claim": false,
"initial_zero_prefix": 0,
"kc_targets_present": 4064,
"name": "seed_validation-physiological-00-s1073741825",
"no_poi": true,
"no_training": true,
"nodes": 166700,
"output_budget_bytes": 25769803776,
"output_bytes_before_summary": 349877277,
"pass_all": true,
"pass_all_scope": "Oracle construction, protocol and internal self-checks only; candidate comparison is a separate gate",
"pending_generated_count": 18,
"pending_initial_zero_prefix": 0,
"pending_tail_shape": [
18,
4064
],
"precision": "float64",
"queue_sha256": "ea81d2d07626aed2ae1096da17a1b4163d3568dc54438409c3ac35f81a7d395f",
"ref_rejected_requests": 31,
"requests": 110,
"scope": "Only this fixed trajectory; legacy Torch APL is a shared numerical component, not an independent CPU APL implementation",
"single_continuous_run": true,
"source_and_inputs_unchanged": true,
"spikes": 30876,
"state_hashes_sha256": "b06d86d7560da6c0222e9ea82dc172faf94aec38950456d47a8bdc40acfbf3ad",
"steps": 1000,
"weights_sha256": "ac433da4b0ac3cdc20c526d99a7158c3dc2298b62c10784f9dcd7db1f089214b"
}