/*
 *  test_sinusoidal_gamma_generator_2.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_sinusoidal_gamma_generator_2 - Test parallel generation of sinusoidally modulate Gammaian trains with individual spike trains

Synopsis: nest_indirect test_sinusoidal_gamma_generator_2.sli -> -

Description:
   Creates a sinusoidally modulated Gamma generator emitting
   individual spike trains to each of its targets and sends spikes to
   spike detector. Assert invariant results for fixed VP number. This
   is a partial response to #551. May be adapted to other generators.

Author:  December 2012, May 2013, Plesser, based on test_gamma_generator.sli

See also: testsuite::test_sinusoidal_gamma_generator_3, testsuite::test_sinusoidal_gamma_generator
*/

(unittest) run
/unittest using

is_threaded not { exit_test_gracefully } if


/total_vps 4 def

% run simulation with or without individual trains
% bool spg_tester -> spike detector
/spg_tester
{
  /individual Set

  /nodes total_vps 2 mul def  

  % set resolution and total/local number of threads
  0
  <<
  /resolution  0.1
  /total_num_virtual_procs total_vps
  >> SetStatus

  /sinusoidal_gamma_generator
  << 
    /rate 1000.
    /amplitude 1000.
    /frequency 100.
    /order 3.
    /individual_spike_trains individual
  >> SetDefaults

  /gens [ nodes ] 
  { 
    ;
    /sinusoidal_gamma_generator Create
  } Table def
  /sd /spike_detector << /record_to [/memory] 
                         /withgid true 
                         /withtime true 
                      >> Create def
  /pnet [ nodes ] { ; /parrot_neuron Create } Table def

  [ gens pnet ] { Connect } ScanThread
  pnet [sd] Connect
  
  10. Simulate

  sd
} def

% second test: individual spike trains, equality for different splits
[1 2 4]
{
  % run test only if generator is known, otherwise, leave empty dict
  modeldict /sinusoidal_gamma_generator known
  {
    /sd true spg_tester def

    % get events, replace vectors with SLI arrays    
    /ev sd /events get def
    ev keys { /k Set ev dup k get cva k exch put } forall
    ev 
  }
  {
    << >>
  } ifelse
} distributed_process_invariant_events_assert_or_die
