diff --git a/testsuite/pytests/sli2py_regressions/test_ticket_156.py b/testsuite/pytests/sli2py_regressions/test_ticket_156.py new file mode 100644 index 0000000000..311ec984d1 --- /dev/null +++ b/testsuite/pytests/sli2py_regressions/test_ticket_156.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# +# test_ticket_156.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 . +import nest +import numpy as np +import pytest + + +def test_ticket_156(): + """ + Verify that poisson_generator_ps generates identical spike trains for given + start and stop times across different simulation resolutions and different targets. + + Protocol: + 1. poisson_generator_ps projects to two spike_recorders. + 2. Run for different resolutions, record precise spike times in ms. + 3. Test all spikes are in (start, stop]. + 4. Test for different results between spike_recorders. + 5. Test for identical results across resolutions. + """ + + ps_params = {"origin": 0.0, "start": 1.0, "stop": 2.0, "rate": 12345.0} # Expect ~ 12.3 spikes + resolutions = [0.01, 0.1, 0.2, 0.5, 1.0] + simtime = ps_params["stop"] + 2.0 + + def single_trial(h): + """ + Returns concatenated spike times recorded by the two spike recorders. + + Asserts that single spike trains fulfill requirements. + """ + + nest.ResetKernel() + nest.resolution = h + + pg = nest.Create("poisson_generator_ps", params=ps_params) + srs = nest.Create("spike_recorder", n=2) + nest.Connect(pg, srs, syn_spec={"delay": 1.0, "weight": 1.0}) + + nest.Simulate(simtime) + + spike_times = srs.get("events", "times") + + # Test that the two recorders recorded different times + assert not np.array_equal(*spike_times) + + # Test that all spike times are in (start, stop] + all_spike_times = np.concatenate(spike_times) + assert all(all_spike_times > ps_params["origin"] + ps_params["start"]) + assert all(all_spike_times <= ps_params["origin"] + ps_params["stop"]) + + return all_spike_times + + # Run trials for each resolution and check all resolutions yield identical spike trains + results = [single_trial(h) for h in resolutions] + for train in results[1:]: + assert np.allclose(train, results[0], atol=1e-15) diff --git a/testsuite/regressiontests/ticket-156.sli b/testsuite/regressiontests/ticket-156.sli deleted file mode 100644 index 75d0ce9056..0000000000 --- a/testsuite/regressiontests/ticket-156.sli +++ /dev/null @@ -1,110 +0,0 @@ -/* - * ticket-156.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 . - * - */ - -/* - Test for Ticket 156. - - This test verifies that: - poisson_generator_ps generates identical spike trains for given - start and stop for different simulation resolutions, and different - trains for different targets. - - Protocol: - 1. poisson_generator_ps projects to two spike_recorders - 2. run for different resolutions, record precise spike times is ms - 3. test all spikes are in (start, stop] - 3. test for different results between spike_recorders - 4. test for identical results across resolutions -*/ - -(unittest) run -/unittest using - -/ps_params << - /origin 0.0 - /start 1.0 - /stop 2.0 - /rate 12345.0 % expect ~ 12.3 spikes ->> def - -/resolutions [0.01 0.1 0.2 0.5 1.0] def - -% ensure all spikes arrive at recorder -/simtime ps_params /stop get 2.0 add def - -/check_limits % true if all spikes in (origin+start, origin+stop] -{ - << >> begin - /spks Set - /ori ps_params /origin get def - spks Min ps_params /start get ori add gt - spks Max ps_params /stop get ori add leq - and - end -} def - -/single_trial -{ - << >> begin - /h Set - ResetKernel - << /resolution h >> SetKernelStatus - - /poisson_generator_ps Create /pg Set - pg ps_params SetStatus - - [ /spike_recorder Create - /spike_recorder Create - ] /srs Set - srs { pg exch 1.0 1.0 Connect } forall - - simtime Simulate - srs { [/events /times] get cva } Map - end -} def - -resolutions { single_trial } Map -/res Set - -(First test) = -% first test: limits -res Flatten check_limits - -(Second test) = -% second test: different results between targets -res { - arrayload ; neq -} Map - -(Third test) = -% third test: equality among runs -% Test for spike time equality to within 1.0e-16 ms. -res Transpose { - dup First /ref Set - Rest true exch { ref sub 0 exch { abs max } Fold 1.0e-15 lt and } Fold -} Map - -% collect -3 arraystore Flatten -true exch { and } Fold - -assert_or_die