/*
 *  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) run
/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

