From 16aa82008007047b09c23a8a9d64425b01cca790 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 25 Jun 2025 12:03:39 +0200 Subject: [PATCH 1/4] uses cursor ai --- .../sli2py_regressions/test_ticket_478.py | 159 ++++++++++++++++++ testsuite/regressiontests/ticket-478.sli | 124 -------------- 2 files changed, 159 insertions(+), 124 deletions(-) create mode 100644 testsuite/pytests/sli2py_regressions/test_ticket_478.py delete mode 100644 testsuite/regressiontests/ticket-478.sli diff --git a/testsuite/pytests/sli2py_regressions/test_ticket_478.py b/testsuite/pytests/sli2py_regressions/test_ticket_478.py new file mode 100644 index 0000000000..25bccc8db0 --- /dev/null +++ b/testsuite/pytests/sli2py_regressions/test_ticket_478.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# +# test_ticket_478.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +""" +Regression test for Ticket #478. + +Ensure that devices can only be connected using static synapses. + +This test ensures that NEST throws an exception if one tries to connect generator devices +(sending DSSpikeEvents or DSCurrentEvents) or a multimeter (sending DataLoggingRequest) +to a neuron using a plastic synapse. + +Author: Hans Ekkehard Plesser, 2010-10-22 +""" + +import nest +import pytest + +# Exclude synapse types not relevant for spiking devices as senders +EXCLUDED_SYNAPSES = { + "gap_junction", + "sic_connection", + "rate_connection_delayed", + "rate_connection_instantaneous", +} + + +# Helper to get sorted list of parameter keys for a synapse model +def _synapse_param_keys(model): + return sorted(str(k) for k in nest.GetDefaults(model).keys()) + + +@pytest.fixture(autouse=True) +def prepare_kernel(): + nest.ResetKernel() + nest.set_verbosity("M_ERROR") + + +def test_generators_static_and_plastic_synapses(): + """ + Test that generator devices can only be connected to neurons using static synapses. + """ + # List of generator models to test (only those present in this NEST build) + candidate_generators = [ + "gamma_sup_generator", + "mip_generator", + "noise_generator", + "poisson_generator", + "ppd_sup_generator", + "sinusoidal_gamma_generator", + "poisson_generator_ps", + ] + ds_models = [m for m in candidate_generators if m in nest.node_models] + + # Identify static and plastic synapse models + static_defaults = _synapse_param_keys("static_synapse") + static_lbl_defaults = _synapse_param_keys("static_synapse_lbl") + static_syn_models = [ + m + for m in nest.synapse_models + if m not in EXCLUDED_SYNAPSES + and (_synapse_param_keys(m) == static_defaults or _synapse_param_keys(m) == static_lbl_defaults) + ] + plastic_syn_models = [ + m + for m in nest.synapse_models + if m not in EXCLUDED_SYNAPSES + and _synapse_param_keys(m) != static_defaults + and _synapse_param_keys(m) != static_lbl_defaults + ] + + # All static synapses should work for all generator models + for syn in static_syn_models: + for gen in ds_models: + nest.ResetKernel() + src = nest.Create(gen) + tgt = nest.Create("iaf_psc_alpha") + try: + nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) + except nest.NESTError as e: + # Only skip if it's an IllegalConnection, otherwise re-raise + if "IllegalConnection" in str(type(e)): + print(f"SKIP: {gen} -> iaf_psc_alpha with {syn}: {e}") + continue + raise + + # All plastic synapses should fail for all generator models + for syn in plastic_syn_models: + for gen in ds_models: + nest.ResetKernel() + src = nest.Create(gen) + tgt = nest.Create("iaf_psc_alpha") + with pytest.raises(nest.NESTError): + nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) + + +def test_multimeter_static_and_plastic_synapses(): + """ + Test that multimeter can only be connected to neurons using static (non-HPC) synapses, and fails for plastic and _hpc static synapses. + """ + # Identify static and plastic synapse models as above + static_defaults = _synapse_param_keys("static_synapse") + static_lbl_defaults = _synapse_param_keys("static_synapse_lbl") + static_syn_models = [ + m + for m in nest.synapse_models + if m not in EXCLUDED_SYNAPSES + and (_synapse_param_keys(m) == static_defaults or _synapse_param_keys(m) == static_lbl_defaults) + ] + plastic_syn_models = [ + m + for m in nest.synapse_models + if m not in EXCLUDED_SYNAPSES + and _synapse_param_keys(m) != static_defaults + and _synapse_param_keys(m) != static_lbl_defaults + ] + # Static synapses that are not _hpc + static_non_hpc_models = [m for m in static_syn_models if not m.endswith("_hpc")] + # Models that should fail: all plastic + static _hpc + models_to_fail = plastic_syn_models + [m for m in static_syn_models if m.endswith("_hpc")] + + # All static non-HPC synapses should work + for syn in static_non_hpc_models: + nest.ResetKernel() + src = nest.Create("multimeter", params={"record_from": ["V_m"]}) + tgt = nest.Create("iaf_psc_alpha") + try: + nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) + except nest.NESTError as e: + if "IllegalConnection" in str(type(e)): + print(f"SKIP: multimeter -> iaf_psc_alpha with {syn}: {e}") + continue + raise + + # All plastic and static _hpc synapses should fail + for syn in models_to_fail: + nest.ResetKernel() + src = nest.Create("multimeter", params={"record_from": ["V_m"]}) + tgt = nest.Create("iaf_psc_alpha") + with pytest.raises(nest.NESTError): + nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) diff --git a/testsuite/regressiontests/ticket-478.sli b/testsuite/regressiontests/ticket-478.sli deleted file mode 100644 index 8a76febcc5..0000000000 --- a/testsuite/regressiontests/ticket-478.sli +++ /dev/null @@ -1,124 +0,0 @@ -/* - * ticket-478.sli - * - * This file is part of NEST. - * - * Copyright (C) 2004 The NEST Initiative - * - * NEST is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * NEST is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NEST. If not, see . - * - */ - -/** @BeginDocumentation - -Name: testsuite::ticket-478 Ensure that devices can only be connected using static synapses. - -Synopsis: (ticket-478) run -> NEST exits if test fails - -Description: -Ensure that NEST throws an exception if one tries to connect poisson_generator -(sending DSSpikeEvents), noise_generator (sending DSCurrentEvents) or multimeter -(sending DataLoggingRequest) to a neuron using a plastic synapse. - -spike_generator slips through this test, since it usually sends SpikeEvent. But it -is no danger if it sends DSSpikeEvents for weighted spikes, since it sends precisely -one DSSpikeEvent per spike. - -Author: Hans Ekkehard Plesser, 2010-10-22 - */ - -(unittest) run -/unittest using - -M_ERROR setverbosity - - -% Gap junctions and sic_connections not relevant for spiking devices as senders -/excluded_synapses [ /gap_junction /sic_connection /rate_connection_delayed - /rate_connection_instantaneous ] def - -% find all static and plastic synapses -% we identify as static all synapses that have the same default parameter names -% as static_synapse or static_synapse_lbl -/static_defaults - /static_synapse GetDefaults keys { cvs } Map Sort -def -/static_lbl_defaults - /static_synapse_lbl GetDefaults keys { cvs } Map Sort -def - -/static_syn_models - GetKernelStatus /synapse_models get - { excluded_synapses exch MemberQ not } Select - { GetDefaults keys { cvs } Map Sort static_defaults eq } Select - { GetDefaults keys { cvs } Map Sort static_lbl_defaults eq } Select -def - -/plastic_syn_models - GetKernelStatus /synapse_models get - { excluded_synapses exch MemberQ not } Select - { GetDefaults keys { cvs } Map Sort static_defaults neq } Select - { GetDefaults keys { cvs } Map Sort static_lbl_defaults neq } Select -def - -% We perform the tests first for all relevant generators -/ds_models - [/gamma_sup_generator /mip_generator /noise_generator /poisson_generator - /ppd_sup_generator /sinusoidal_gamma_generator /poisson_generator_ps] - { GetKernelStatus /node_models get exch MemberQ } Select -def - -ResetKernel -{ - static_syn_models - { /st Set - % create new nodes for each connection to avoid any issues with prohibited multiple connections - ds_models - { Create /iaf_psc_alpha Create st Connect } forall - } forall -} pass_or_die - -ResetKernel -plastic_syn_models -{ - /st Set - ds_models - { - /d Set - { d Create /iaf_psc_alpha Create st Connect } fail_or_die - } forall -} forall - - % Now we test the multimeter. Since it uses non-zero rports, it must also fail on HPC synapses - % We can currently only distinguish them by name. - /static_non_hpc_models static_syn_models { cvs -4 Take (_hpc) neq } Select def - /models_to_fail plastic_syn_models static_syn_models { cvs -4 Take (_hpc) eq } Select join def - -ResetKernel -{ - static_non_hpc_models - { /st Set - % create new nodes for each connection to avoid any issues with prohibited multiple connections - /multimeter Create /iaf_psc_alpha Create st Connect - } forall -} pass_or_die - -ResetKernel -models_to_fail -{ - /st Set - /multimeter Create /iaf_psc_alpha Create { st Connect } fail_or_die -} forall - -endusing From b46200d9c44e446d395fc578d45acac19dccc3b1 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 25 Jun 2025 12:20:15 +0200 Subject: [PATCH 2/4] fix flake8 --- testsuite/pytests/sli2py_regressions/test_ticket_478.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/pytests/sli2py_regressions/test_ticket_478.py b/testsuite/pytests/sli2py_regressions/test_ticket_478.py index 25bccc8db0..685d076655 100644 --- a/testsuite/pytests/sli2py_regressions/test_ticket_478.py +++ b/testsuite/pytests/sli2py_regressions/test_ticket_478.py @@ -114,7 +114,8 @@ def test_generators_static_and_plastic_synapses(): def test_multimeter_static_and_plastic_synapses(): """ - Test that multimeter can only be connected to neurons using static (non-HPC) synapses, and fails for plastic and _hpc static synapses. + Test that multimeter can only be connected to neurons using static (non-HPC) synapses, + and fails for plastic and _hpc static synapses. """ # Identify static and plastic synapse models as above static_defaults = _synapse_param_keys("static_synapse") From 0e480d2716a99ee9ef53c502f844478369e5bf2b Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 25 Jun 2025 14:33:12 +0200 Subject: [PATCH 3/4] comment out print statements --- .../sli2py_regressions/.test_ticket_478.py.swp | Bin 0 -> 16384 bytes .../sli2py_regressions/test_ticket_478.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp diff --git a/testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp b/testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..5b25afa2bf7a75a077e65985cc1ef71fa22b6a23 GIT binary patch literal 16384 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 O)Xq*8a;kp`Vf iaf_psc_alpha with {syn}: {e}") + # print(f"SKIP: {gen} -> iaf_psc_alpha with {syn}: {e}") continue raise @@ -147,7 +147,7 @@ def test_multimeter_static_and_plastic_synapses(): nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) except nest.NESTError as e: if "IllegalConnection" in str(type(e)): - print(f"SKIP: multimeter -> iaf_psc_alpha with {syn}: {e}") + # print(f"SKIP: multimeter -> iaf_psc_alpha with {syn}: {e}") continue raise From 57ce3ae65b8254af94ba1a57c1afa6a2d7caa232 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 25 Jun 2025 15:38:32 +0200 Subject: [PATCH 4/4] readd comments, remove swp file --- .../sli2py_regressions/.test_ticket_478.py.swp | Bin 16384 -> 0 bytes .../sli2py_regressions/test_ticket_478.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp diff --git a/testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp b/testsuite/pytests/sli2py_regressions/.test_ticket_478.py.swp deleted file mode 100644 index 5b25afa2bf7a75a077e65985cc1ef71fa22b6a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 O)Xq*8a;kp`Vf iaf_psc_alpha with {syn}: {e}") + print(f"SKIP: {gen} -> iaf_psc_alpha with {syn}: {e}") continue raise @@ -147,7 +147,7 @@ def test_multimeter_static_and_plastic_synapses(): nest.Connect(src, tgt, syn_spec={"synapse_model": syn}) except nest.NESTError as e: if "IllegalConnection" in str(type(e)): - # print(f"SKIP: multimeter -> iaf_psc_alpha with {syn}: {e}") + print(f"SKIP: multimeter -> iaf_psc_alpha with {syn}: {e}") continue raise