/*
* test_sinusoidal_poisson_generator_6.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_poisson_generator_6 - Test parallel generation of sinusoidally modulate Poissonian trains with individual spike trains
Synopsis: nest_indirect test_sinusoidal_poisson_generator_6.sli -> -
Description:
Creates a sinusoidally modulated Poisson generator emitting an
individual spike train to each of its targets and sends spikes to spike
detectors. Ensures that all targets receive identical spike trains.
NOTE: THIS TEST DOES NOT WORK AUTOMATICALLY, DUE TO PROBLEMS WITH UNITTEST.
You can run it manually and see if the output is as expected with
mpirun -np 2 nest test_sinusoidal_poisson_generator_6.sli
Author: December 2012, May 2013, Plesser, based on test_poisson_generator.sli
See also: test_sinusoidal_poisson_generator_{1,2,3,4,6}, test_sinusoidal_poisson_generator_nostat
*/
(unittest) run
/unittest using
/total_vps 4 def
% return true if all arrays inside an array are different from each other
% [l1 l2 ...] all_different -> bool
/all_different
{
empty
{
; true
}
{
/items Set
items [ 1 -2 ] Take % all except last element
{ 1 add -1 2 arraystore items exch Take
exch /item Set
true exch { item neq and } Fold
} MapIndexed
true exch { and } Fold
} ifelse
} def
% function building n neuron network with spike detectors
% num_nrns individual run_simple_net -> [ spike_detectors ]
/run_simple_net
{
/individual Set
/n Set
% set resolution and total/local number of threads
0
<<
/resolution 0.1
/total_num_virtual_procs total_vps
>> SetStatus
/sinusoidal_poisson_generator
<<
/dc 1000.
/ac 1000.
/freq 100.
/individual_spike_trains individual
>> SetDefaults
/parrots [ n ] { ; /parrot_neuron Create } Table def
/sdets [ n ]
{ ; /spike_detector n << /withtime true /withgid false >> Create }
Table def
/gen /sinusoidal_poisson_generator Create def
gen parrots DivergentConnect
[parrots sdets] { Connect } ScanThread
10. Simulate
sdets
} def
% we only run for two MPI with two threads each
% thus, each MP process returns an array with two spike-train arrays
% we pool all the arrays (i.e., total spike trains) and they must all
% be identical
[ 2 ]
{
/sdets 16 true run_simple_net def
% get events, replace vectors with SLI arrays
% keep only non-empty arrays; empty ones are from off-process parrots
(ALL LINES SHOULD BE DIFFERENT) ==
sdets { [/events /times] get cva } Map { empty not exch ; } Select
{ == } forall
} exec
% code below leads to error in data collection routine
{
% expect array with two arrays of spike times
arrayload ; join
all_different
}
% distributed_collect_assert_or_die