/*
* test_multimeter_freeze_thaw.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_multimeter_freeze_thaw - test if multimeter handles frozen nodes properly
Synopsis: (test_multimeter_freeze_thaw.sli) run -> dies if assertion fails
Description:
1. Record from neuron initially frozen, then thawed, then frozen, then thawed. See
that correct number of data points collected.
2. Same as above, simultaneously record from thawed node.
3. Record from two synchrounsly frozen/thawed nodes in accumulator mode.
4. Same as above, but one node permanently thawed.
Author: Plesser
FirstVersion: 2011-02-11
*/
/unittest (8831) require
/unittest using
/arr (9161) require
M_ERROR setverbosity
/clear_error
{
counttomark npop % pop all but mark
errordict begin /newerror false def end
} def
% integer_data --- return array with only unique entries in ascending order
% data must be intergers
%
/unique_ascending
{
/d << >> def
{ cvs cvlit d exch 0 put } forall
d keys { cvs cvi } Map Sort
}
def
% sender data --- split data by sender
/split_data
{
/data Set
dup { cvs cvlit } Map /senders Set
unique_ascending { cvs cvlit } Map /us Set
/res << >> def
us { res exch [] put } forall
[ data senders ] { /key Set res key get exch append res exch key exch put } ScanThread
res
}
def
% times data --- times and data have corresponding entries; entries in
% data with equalt times are summed.
/sum_by_times
{
/data Set
dup { cvs cvlit } Map /times Set
unique_ascending { cvs cvlit } Map /utimes Set
/res << >> def
utimes { res exch 0 put } forall
[ data times ] { /key Set res key get add res exch key exch put } ScanThread
[ ] utimes { res exch get append } forall
}
def
% first test:
% one noded, cycled
{
<< >> begin
/build_net {
/iaf_neuron << /I_e 50.0 >> SetDefaults
/multimeter << /record_from [ /V_m ] /interval 0.5 >> SetDefaults
/n /iaf_neuron Create def
/mm /multimeter Create def
mm n Connect
} def
% sim with freeze/thaw
ResetKernel
build_net
n << /frozen true >> SetStatus
5. Simulate
n << /frozen false >> SetStatus
5. Simulate
n << /frozen true >> SetStatus
5. Simulate
n << /frozen false >> SetStatus
5. Simulate
mm /events get /V_m get cva /fV Set
% simulate for same equivalent time (ie thawed time only) without freezing
ResetKernel
build_net
10. Simulate
mm /events get /V_m get cva /rV Set
fV rV eq % both should give same result
end
} assert_or_die
% second test:
% two nodes, one cycled
{
<< >> begin
/build_net {
/iaf_neuron << /I_e 50.0 >> SetDefaults
/multimeter << /record_from [ /V_m ] /interval 0.5 /withgid true
/time_in_steps true >> SetDefaults
/nc /iaf_neuron Create def
/np /iaf_neuron Create def
/mm /multimeter Create def
mm nc Connect
mm np Connect
} def
% sim with freeze/thaw
ResetKernel
build_net
nc << /frozen true >> SetStatus
5. Simulate
nc << /frozen false >> SetStatus
5. Simulate
nc << /frozen true >> SetStatus
5. Simulate
nc << /frozen false >> SetStatus
5. Simulate
mm /events get /ev Set
ev /times get cva /tall Set
ev /senders get cva /sall Set
ev /V_m get cva /Vall Set
% check event times by sender
sall tall split_data dup
np cvs cvlit get [5 190 5] Range eq exch
nc cvs cvlit get [55 100 5] Range [155 190 5] Range join eq
and
% check event data by sender---frozen data equal to first points in non-frozen
sall Vall split_data dup
nc cvs cvlit get /Vc Set
np cvs cvlit get Vc length Take Vc eq
and
end
} assert_or_die
% third test:
% several nodes, synchronously thawed and frozen
{
ResetKernel
<< >> begin
/recvars [ /V_m ] def
/N 10 def
/nnet /subnet Create def
nnet ChangeSubnet
/iaf_psc_alpha N Create ;
0 ChangeSubnet
/nrns nnet GetGlobalLeaves def
/multimeter << /record_from recvars /withgid false /withtime true
/interval 0.7 /start 4.8 /stop 233.1 /time_in_steps true >> SetDefaults
/mm /multimeter Create def
/ac /multimeter << /to_memory false /to_accumulator true >> Create def
mm nrns DivergentConnect
ac nrns DivergentConnect
/pg /poisson_generator << /rate 1000. >> Create def
/static_synapse /exc << /weight 1.0 >> CopyModel
/static_synapse /inh << /weight -1.0 >> CopyModel
pg nrns /exc DivergentConnect
pg nrns /inh DivergentConnect
nrns { << /frozen true >> SetStatus } forall
20. Simulate
nrns { << /frozen false >> SetStatus } forall
20. Simulate
nrns { << /frozen true >> SetStatus } forall
20. Simulate
nrns { << /frozen false >> SetStatus } forall
20. Simulate
/detevs mm /events get def
/dettimes detevs /times get cva def
/accevs ac /events get def
/acctimes accevs /times get cva def
recvars
{
/var Set
% get data from individual recordings
detevs var get cva
% compute mean for error estimate
dup Mean /varmean Set
% sum results for equal times
dettimes exch sum_by_times
% data from accumulated recording
accevs var get cva
% test difference relative to mean
sub true exch { varmean div abs 1e-15 lt and } Fold
} Map
true exch { and } Fold
% check that times are equal
dettimes unique_ascending acctimes eq and
end
} assert_or_die
% Fourth test:
% As second, but run in accumulator mode. This does NOT MAKE SENSE, really ...
{
<< >> begin
/build_net {
/iaf_neuron << /I_e 0.0 >> SetDefaults
/multimeter << /record_from [ /V_m ] /interval 0.5 /withgid false
/time_in_steps true /record_to [ /accumulator ] >> SetDefaults
/nc /iaf_neuron Create def
/np /iaf_neuron Create def
/mm /multimeter Create def
mm nc Connect
mm np Connect
} def
% sim with freeze/thaw
ResetKernel
build_net
nc << /frozen true >> SetStatus
5. Simulate
nc << /frozen false >> SetStatus
5. Simulate
nc << /frozen true >> SetStatus
5. Simulate
nc << /frozen false >> SetStatus
5. Simulate
mm /events get /ev Set
ev /times get cva [5 190 5] Range eq % should be all time points
% for voltage, we can't sort by sender, but all points where nc is not frozen
% should have double the value from the others
ev /V_m get cva /Vall Set
/fp [ 1 10] Range [21 30] Range join def
/tp [11 20] Range [31 38] Range join def
/Vref /iaf_neuron GetDefaults /E_L get def
nc /V_m get Vref eq np /V_m get Vref eq and assert % ascertain V_m has not changed
true fp { Vall exch 1 sub get Vref eq and } Fold
true tp { Vall exch 1 sub get 2 Vref mul eq and } Fold
and
and
end
} assert_or_die
endusing