/*
* test_GetConnections.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_GetConnections - sli script to test if GetConnections works as expected
Synopsis: (test_getConnections) run
Description:
This test generates 100 iaf_neurons and connects them with different synapses.
SeeAlso: GetConnections
FirstVersion: May 2012
Author: Marc-Oliver Gewaltig
*/
/unittest (7488) require
/unittest using
% Create the following network:
% - 100 neurons
% - 1, 3, ..., 99 are sources
% - 2, 4, ..., 100 are targets
% - Connect 1, 3, ..., 69 -> 2, 4, ..., 70 with static_synapse
% - Connect 31, ..., 99 -> 32, ..., 100 with stdp_synapse
% - Then:
% 15 connections with static only
% 20 connections with static + stdp
% 15 connections with stdp only
/build_net
{
% create 100 neurons, connect (2n-1) -> 2n for n=1..50
/iaf_neuron 100 Create ;
/static_sources [ 1 69 2 ] Range def
/static_targets static_sources 1 add def
/stdp_sources [ 31 99 2 ] Range def
/stdp_targets stdp_sources 1 add def
[static_sources static_targets] { /static_synapse Connect } ScanThread
[stdp_sources stdp_targets] { /stdp_synapse Connect } ScanThread
} def
% first test: retrieve static connections
{
<< >> begin
ResetKernel
build_net
/conns << /synapse_model /static_synapse >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
/cstp conns { 3 get } Map def % synapse type
/syn_id synapsedict /static_synapse get def
csrc static_sources eq
ctgt static_targets eq and
cstp { syn_id eq and } Fold % all synapses must have static type
end
} assert_or_die
% second test: retrieve stdp connections
{
<< >> begin
ResetKernel
build_net
/conns << /synapse_model /stdp_synapse >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
/cstp conns { 3 get } Map def % synapse type
/syn_id synapsedict /stdp_synapse get def
csrc stdp_sources eq
ctgt stdp_targets eq and
cstp { syn_id eq and } Fold % all synapses must have static type
end
} assert_or_die
% third test: retrieve all connections --- static will come first
{
<< >> begin
ResetKernel
build_net
/conns << >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
csrc static_sources stdp_sources join eq
ctgt static_targets stdp_targets join eq and
end
} assert_or_die
% fourth test: retrieve connections for some sources
{
<< >> begin
ResetKernel
build_net
/ssrc_static static_sources 3 Take def
/stgt_static static_targets 3 Take def
/ssrc_stdp stdp_sources -3 Take def % take final three to avoid
/stgt_stdp stdp_targets -3 Take def % those with static+stdp
/ssrc_all ssrc_static ssrc_stdp join def
/stgt_all stgt_static stgt_stdp join def
/conns << /source ssrc_all >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
csrc ssrc_all eq
ctgt stgt_all eq and
end
} assert_or_die
% fifth test: retrieve connections for some targets
{
<< >> begin
ResetKernel
build_net
/ssrc_static static_sources 3 Take def
/stgt_static static_targets 3 Take def
/ssrc_stdp stdp_sources -3 Take def % take final three to avoid
/stgt_stdp stdp_targets -3 Take def % those with static+stdp
/ssrc_all ssrc_static ssrc_stdp join def
/stgt_all stgt_static stgt_stdp join def
/conns << /target stgt_all >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
csrc ssrc_all eq
ctgt stgt_all eq and
end
} assert_or_die
% sixth test: retrieve connections for specific sources and targets
{
<< >> begin
ResetKernel
build_net
% set up so that for each synapse type, last two srcs match first two tgts
/ssrc_static static_sources [1 3] Take def
/stgt_static static_targets [2 4] Take def
/ssrc_stdp stdp_sources [-4 -2] Take def % take final three to avoid
/stgt_stdp stdp_targets [-3 -1] Take def % those with static+stdp
/ssrc_all ssrc_static ssrc_stdp join def
/stgt_all stgt_static stgt_stdp join def
/conns << /source ssrc_all /target stgt_all >> GetConnections { cva } Map def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
csrc ssrc_static -2 Take ssrc_stdp -2 Take join eq
ctgt stgt_static 2 Take stgt_stdp 2 Take join eq and
end
} assert_or_die
% seventh test: same as sixth, but select static synapses
{
<< >> begin
ResetKernel
build_net
% set up so that for each synapse type, last two srcs match first two tgts
/ssrc_static static_sources [1 3] Take def
/stgt_static static_targets [2 4] Take def
/ssrc_stdp stdp_sources [-4 -2] Take def % take final three to avoid
/stgt_stdp stdp_targets [-3 -1] Take def % those with static+stdp
/ssrc_all ssrc_static ssrc_stdp join def
/stgt_all stgt_static stgt_stdp join def
/conns
<< /source ssrc_all /target stgt_all /synapse_model /static_synapse >>
GetConnections { cva } Map
def
/csrc conns { 0 get } Map def
/ctgt conns { 1 get } Map def
csrc ssrc_static -2 Take eq
ctgt stgt_static 2 Take eq and
end
} assert_or_die
% eighth test: check static synapses on four threads
{
<< >> begin
ResetKernel
0 << /local_num_threads 4 >> SetStatus
build_net
% NB: relative ordering of data from threads is random under OpenMP
/conns << /synapse_model /static_synapse >> GetConnections { cva } Map def
% SLI Sort can only sort numbers or strings.
% To sort source-target pairs, we convert them to large numbers
/conns_as_nums
conns
{ dup 0 get 1000 mul exch 1 get add } Map
def
/expect_as_nums
[ static_sources static_targets ]
{ exch 1000 mul add } MapThread
def
conns_as_nums Sort expect_as_nums Sort eq
end
} assert_or_die
endusing