/* * test_iaf_dc_aligned.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 <http://www.gnu.org/licenses/>. * */ /* BeginDocumentation Name: testsuite::test_iaf_dc_aligned - sli script for test of iaf_neuron resolution independence Synopsis: (test_iaf_dc_aligned) run -> compare response with reference data Description: test_iaf_dc_aligned.sli is a modified version of test_iaf_dc. Here, we discuss and remove one of the problems of test_iaf_dc leading to simulation results not independent of the computation step size (resolution). The remaining flaw is corrected in the follow up script test_iaf_dc_delay.sli . The expected output is documented and briefly commented at the end of the script. The intention of this script is that the current starts to affect the neuron (is present from) at time t=3ms. By default, the delay of the connection between DC generator and neuron assumes the minimal value of 1 computation step h. Therefore, the time stamp of the emitted current event needs to be 3ms - h. according to the definitions of the timing scheme, the DC generator consequently needs to emit the appropriate event in the step 3ms - 2h -> 3ms - h. The property /start of a device specifies in ms the earliest time at which the device emits an event. This enables resolution independent specification of the emission time because at any computation step size h the device can be activated in the step start - h -> start. The only requirement being that start - h is a time larger or equal to the current time. Otherwise the device cannot fulfill the request. The additional property /origin enables a shift of the device's time axis, see the documentation of devices for details. If resolution independence is desired origin should be specified in ms, often 0. is a useful value. The above considerations result in the following settings for the DC generator device: /origin 0. % in ms /start arrival h sub % in ms It should be pointed out that not specifying the delay of a connection in the .sli script, like it is done here dc_gen neuron Connect ; results in a simulation script that is not independent of the computation step size. This is because at the time of creation of the connection the minimal delay (1 computation step) is assumed. Therefore we have to compensate for this dependency in the start time of the DC generator as described above. The alternative approach would be to specify a delay between the DC generator and the Neuron larger or equal to the largest computation time step to be used. This approach is investigated in test_iaf_dc_aligned.sli Remarks: In earlier versions /start was defined to specify the time step t at which the device becomes activated, which is the transition t -> t+h. On the basis of this definition, the correct code was: /start arrival 2 h mul sub % in ms During the development of this script a conversion problem of device start time expressed in ms was observed: dc_gen << /start 1.8 >> SetStatus dc_gen GetStatus /start get == --> 1.800000e+00 dc_gen << /start 2.8 >> SetStatus dc_gen GetStatus /start get == --> 2.799000e+00 For the purpose of this script, the problem was temporarily fixed by adding an epsilon 0.0001 /start arrival 2 h mul sub 0.0001 add % in ms The problem was fixed by Gewaltig 3.3.2004 and the code of this test script changed accordingly, Diesmann . Author: February 2004, Diesmann, Gewaltig, Plesser SeeAlso: testsuite::test_iaf_dc, testsuite::test_iaf_dc_aligned_delay, testsuite::test_iaf_dc_aligned_automatic */ /unittest (6688) require /unittest using 3.0 /arrival Set % in ms, desired arrival time /AlignedInjection { << >> begin /d Set /h Set ResetKernel 0 << /local_num_threads 1 /resolution h >> SetStatus /iaf_neuron Create /neuron Set /dc_generator Create /dc_gen Set dc_gen << /amplitude 1000. % in pA /origin 0. % in ms /start arrival h sub % in ms >> SetStatus % ^ % | % -- SLI code explicitly depends on % computation step size h. /voltmeter Create /vm Set vm << /withtime true /to_memory true /time_in_steps true /interval h >> SetStatus /spike_detector Create /sp_det Set sp_det << /withtime true /to_memory true /time_in_steps true >> SetStatus dc_gen neuron 1.0 h Connect % code depends on computation step size % because the default delay is 1 h. vm neuron Connect neuron sp_det Connect 6 Simulate d Transpose First /test_times Set % times of reference vm [/events [/times /V_m]] get cva % array of recorded voltages 6 ToUnitTestPrecision % to precision of reference Transpose % all recorded tuples {First test_times exch MemberQ } Select % those with reference d eq % compare end } def { % h d, vector of resolutions and compressed reference data InflateUnitTestData Transpose {AlignedInjection} MapThread true exch {and} Fold % remove this line to see individual results } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Expected output of this program: % % The output send to std::cout is a superposition of the output of % the voltmeter and the spike detector. Both, voltmeter and spike % detector are connected to the same neuron. % % % h= (in ms) [0.1 0.2 0.5 1.0] % % time voltage [ % ... [ 25 5 -70] [ 26 12 -70] [ 27 -70] [ 28 14 -70] [ 29 -70] [ 30 15 6 3 -70] % <---- Current starts to affect [ 31 -69.602] % neuron (visible in state variable [ 32 16 -69.2079] % y0). This is the desired onset of [ 33 -68.8178] % t= 3.0 ms. [ 34 17 -68.4316] [ 35 7 -68.0492] [ 36 18 -67.6706] [ 37 -67.2958] [ 38 19 -66.9247] [ 39 -66.5572] [ 40 20 8 4 -66.1935] [ 41 -65.8334] [ 42 21 -65.4768] % ... ] % rolld assert_or_die