Validate isolated author LIF semantics without changing frozen models

This commit is contained in:
Digital Drosophila Archive
2026-09-30 07:23:09 +08:00
parent 5008cd85ca
commit 92241aea02
460 changed files with 46900 additions and 47 deletions
@@ -0,0 +1,11 @@
{
"edge_id": [
-1
],
"weights_mv": [
0.2749999761581421
],
"weights_volt": [
0.0002749999985098839
]
}
@@ -0,0 +1,2 @@
step,neuron_idx
0,-2
1 step neuron_idx
2 0 -2
@@ -0,0 +1,11 @@
{
"exact_events": true,
"exact_counts": true,
"ref_exact": true,
"max_abs_mv": 0.0001220405101776123,
"mean_abs_mv": 1.6799908344182768e-05,
"same_event_prefix_max_abs_mv": 0.0001220405101776123,
"first_event_divergence_step": null,
"tolerance_mv": 0.001,
"pass_oracle": true
}
@@ -0,0 +1,3 @@
global_neuron_idx,local_index
-2,0
-1,1
1 global_neuron_idx local_index
2 -2 0
3 -1 1
@@ -0,0 +1,102 @@
{
"all_package_pins_match": true,
"author_platform": "Windows",
"author_python": "3.10.11",
"binary_identical_author_environment_claimed": false,
"packages": {
"brian2": {
"actual": "2.5.1",
"expected": "2.5.1",
"matches": true
},
"cython": {
"actual": "0.29.33",
"expected": "0.29.33",
"matches": true
},
"jinja2": {
"actual": "2.11.3",
"expected": "2.11.3",
"matches": true
},
"joblib": {
"actual": "1.2.0",
"expected": "1.2.0",
"matches": true
},
"markupsafe": {
"actual": "1.1.1",
"expected": "1.1.1",
"matches": true
},
"mpmath": {
"actual": "1.3.0",
"expected": "1.3.0",
"matches": true
},
"numpy": {
"actual": "1.22.3",
"expected": "1.22.3",
"matches": true
},
"packaging": {
"actual": "23.1",
"expected": "23.1",
"matches": true
},
"pandas": {
"actual": "1.4.3",
"expected": "1.4.3",
"matches": true
},
"pyarrow": {
"actual": "11.0.0",
"expected": "11.0.0",
"matches": true
},
"pyparsing": {
"actual": "3.0.9",
"expected": "3.0.9",
"matches": true
},
"python-dateutil": {
"actual": "2.8.2",
"expected": "2.8.2",
"matches": true
},
"pytz": {
"actual": "2023.3",
"expected": "2023.3",
"matches": true
},
"scipy": {
"actual": "1.8.1",
"expected": "1.8.1",
"matches": true
},
"setuptools": {
"actual": "67.8.0",
"expected": "67.8.0",
"matches": true
},
"six": {
"actual": "1.16.0",
"expected": "1.16.0",
"matches": true
},
"sympy": {
"actual": "1.12",
"expected": "1.12",
"matches": true
},
"wheel": {
"actual": "0.38.4",
"expected": "0.38.4",
"matches": true
}
},
"platform": "Linux-5.15.0-194-generic-x86_64-with-glibc2.35",
"python": "3.10.12",
"python_executable": "/data/digital-drosophila/experiments/phase4ad-author-semantics/environment/.venv/bin/python",
"python_patch_matches": false
}
@@ -0,0 +1,127 @@
[
{
"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": "after_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\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\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 g = _array_default_neurons_g.copy()\n t = _array_defaultclock_t[0]\n dt = _array_defaultclock_dt[0]\n rfc = _array_default_neurons_rfc\n v = _array_default_neurons_v.copy()\n lastspike = _array_default_neurons_lastspike\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_g[:] = g\n _array_default_neurons_v[:] = v\n _array_default_neurons_not_refractory[:] = not_refractory\n",
"name": "default_neurons_stateupdater_codeobject_5",
"type": "CallableProxyType"
}
],
"name": "default_neurons_stateupdater",
"order": 0,
"type": "StateUpdater",
"user_code": "g = -g*int(not_refractory)/tau\nv = (g - v + v_0)*int(not_refractory)/t_mbr",
"when": "groups"
},
{
"active": true,
"code_objects": [],
"name": "oracle_seed_injection",
"order": 0,
"type": "NetworkOperation",
"when": "before_thresholds"
},
{
"abstract_code": "_cond = (v > v_th) and not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "after_run:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n _array_default_neurons__spikespace[-1] = 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\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_5",
"type": "CallableProxyType"
}
],
"name": "default_neurons_spike_thresholder",
"order": 0,
"type": "Thresholder",
"user_code": "_cond = v > v_th",
"when": "thresholds"
},
{
"abstract_code": "_to_record_i = _source_i\n_to_record_t = _source_t",
"active": true,
"code_objects": [
{
"generated_code": "after_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\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\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_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",
"type": "CallableProxyType"
}
],
"name": "spikemonitor",
"order": 1,
"type": "SpikeMonitor",
"user_code": "None",
"when": "thresholds"
},
{
"abstract_code": "g += w\n",
"active": true,
"code_objects": [
{
"generated_code": "after_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\nbefore_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()\n",
"name": "default_synapses_pre_push_spikes",
"type": "CallableProxyType"
},
{
"generated_code": "after_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\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\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()\n",
"name": "default_synapses_pre_codeobject_6",
"type": "CallableProxyType"
}
],
"name": "default_synapses_pre",
"order": -1,
"type": "SynapticPathway",
"user_code": "None",
"when": "synapses"
},
{
"abstract_code": "v = v_rst; w = 0; g = 0 * mV",
"active": true,
"code_objects": [
{
"generated_code": "after_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\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\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_g[_idx] = g\n _array_default_neurons_v[_idx] = v\n",
"name": "default_neurons_spike_resetter_codeobject_6",
"type": "CallableProxyType"
}
],
"name": "default_neurons_spike_resetter",
"order": 0,
"type": "Resetter",
"user_code": "None",
"when": "resets"
},
{
"abstract_code": "_to_record_v = _source_v\n_to_record_g = _source_g\n_to_record_lastspike = _source_lastspike\n_to_record_not_refractory = _source_not_refractory",
"active": true,
"code_objects": [
{
"generated_code": "after_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\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\nrun:\n import numpy as _numpy\n from brian2.codegen.runtime.numpy_rt.numpy_rt import LazyArange\n # Resize dynamic arrays\n _new_len = len(_dynamic_array_oracle_end_state_t) + 1\n _owner.resize(_new_len)\n # Store values\n _dynamic_array_oracle_end_state_t[-1] = _array_defaultclock_t[0]\n # scalar code\n _vectorisation_idx = 1\n # vector code\n _vectorisation_idx = _array_oracle_end_state__indices\n _idx = _array_oracle_end_state__indices\n _source_not_refractory = _array_default_neurons_not_refractory[_idx]\n _source_g = _array_default_neurons_g[_idx]\n _source_v = _array_default_neurons_v[_idx]\n _source_lastspike = _array_default_neurons_lastspike[_idx]\n _to_record_v = _source_v\n _to_record_g = _source_g\n _to_record_lastspike = _source_lastspike\n _to_record_not_refractory = _source_not_refractory\n _dynamic_array_oracle_end_state_v[-1, :] = _to_record_v\n _dynamic_array_oracle_end_state_g[-1, :] = _to_record_g\n _dynamic_array_oracle_end_state_lastspike[-1, :] = _to_record_lastspike\n _dynamic_array_oracle_end_state_not_refractory[-1, :] = _to_record_not_refractory\n",
"name": "oracle_end_state_codeobject",
"type": "CallableProxyType"
}
],
"name": "oracle_end_state",
"order": 0,
"type": "StateMonitor",
"user_code": "None",
"when": "end"
}
]
@@ -0,0 +1,2 @@
step,neuron_idx
0,-2
1 step neuron_idx
2 0 -2
@@ -0,0 +1,117 @@
{
"author_commit": "91bdd1e7dcf193f3e7ca5a8933497fcef63b7960",
"author_sha256": "fc45837d7122c6ce2a7f3f2f23c515992e4b232aadb919efabb72337fac88e4e",
"config": {
"author_precisions": [
"float64",
"float32"
],
"comparison": {
"exact_spike_events_required_for_oracle_validation": true,
"float32_state_max_abs_tolerance_mv": 0.001,
"float64_state_max_abs_tolerance_mv": 1e-08,
"precision_cross_comparison_may_diverge_but_must_be_reported": true
},
"component_policies": [
"frozen",
"reset_g_only",
"refractory_gate_only",
"reset_and_refractory"
],
"dt_ms": 0.1,
"duration_ms": 20.0,
"experiment": "experiments/phase4ad-author-semantics",
"human_authorization": "\u5141\u8bb8\u72ec\u7acb\u65b0\u6a21\u578b\u5206\u652f\u6d4b\u8bd5\u52a8\u529b\u5b66\u5047\u8bbe",
"late_start_ms": 500.0,
"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
},
"model_directory": "models/male-cns-lif/author-semantics-lab-v1",
"motifs": [
"pair",
"trio",
"five",
"feedforward",
"no_input"
],
"name": "author-semantics-lab-v1",
"no_training_or_candidate": true,
"phase": "4AD",
"prior_experiment": "experiments/phase4ac-lif-semantics",
"prior_model": "models/male-cns-lif/lif-semantics-audit-v1",
"root": "/data/digital-drosophila",
"seed_margin_mv": 1.0,
"seed_node": 1381
},
"delay_steps": 18,
"dt_ms": 0.1,
"edge_ids": [
-1
],
"external_arrivals": {
"events": 0,
"ordering": "after default_synapses.pre"
},
"internal_voltage_unit": "volt",
"nodes": [
-2,
-1
],
"parameter_checks": {
"membrane_tau_ms": {
"author": 20.0,
"config": 20.0
},
"refractory_ms": {
"author": 2.2,
"config": 2.2
},
"reset_potential_mv": {
"author": -52.0,
"config": -52.0
},
"resting_potential_mv": {
"author": -52.0,
"config": -52.0
},
"synaptic_delay_ms": {
"author": 1.8,
"config": 1.8
},
"synaptic_tau_ms": {
"author": 5.0,
"config": 5.0
},
"threshold_mv": {
"author": -45.0,
"config": -45.0
},
"w_syn_mv_per_anatomical_synapse": {
"author": 0.275,
"config": 0.275
}
},
"precision": "float32",
"preferences": {
"codegen.target": "numpy",
"core.default_float_dtype": "float32",
"legacy.refractory_timing": false
},
"refractory_steps": 22,
"returned_voltage_unit": "mV",
"seed": {
"injections": 0,
"margin_mv": 1.0,
"requested_global_node": -2
},
"steps": 200,
"weight_rule": "raw_count multiplied by unchanged author w_syn; no sign inference"
}
@@ -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_seed_injection (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_end_state (StateMonitor) | oracle_end_state (StateMonitor) | 100. us (every step) | end | 0 | yes "
}
@@ -0,0 +1,7 @@
{
"applied_mv": -43.99999976158142,
"injections": 1,
"margin_mv": 1.0,
"requested_global_node": -2,
"spiked_at_zero": true
}