/*
 *  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_DataConnect - sli script to test if DataConnect works as expected

   Synopsis: (test_DataConnect) run

   Description:

   This test generates 100 iaf_neurons and creates a connectivity vector per neuron

   SeeAlso: DataConnect

   FirstVersion: May 2012
   Author: Marc-Oliver Gewaltig
 */

/unittest (7488) require
/unittest using

% Create Random number generator
rngdict /MT19937 get 1234 CreateRNG /rng Set

rng rdevdict /uniformint get CreateRDV /unidv Set
rng rdevdict /normal get CreateRDV /normdv_w Set
rng rdevdict /normal get CreateRDV /normdv_d Set

unidv
<< 
  /nmin 1 
  /nmax 100
>> SetStatus

normdv_w
<< 
  /mean 10. 
  /sdev 0.5
>> SetStatus

normdv_d
<< 
  /mean 1. 
  /sdev 0.1
>> SetStatus

/n_neurons 100 def
/n_syn 10 def

/iaf_neuron n_neurons Create /n Set

/synapses
[
 n_neurons 
 {
  <<
    /target unidv n_syn RandomArray 1.0 mul
    /weight normdv_w n_syn RandomArray 
    /delay  normdv_d n_syn RandomArray { dup 0.1 lt { pop 0.1 } if } Map % clip small values
  >>  
 } repeat
] def

1 1 n_neurons
{
 dup synapses exch 1 sub get /static_synapse DataConnect
} for

(Done Connecting) =

% Check for one source neuron
/nrn 5 def
 << /source [nrn] /synapse_model /static_synapse >> GetConnections /conn Set
 conn {GetStatus} Map /syn5 Set

 syn5 { /weight get } Map /weights Set
 syn5 { /delay get} Map /delays Set
 syn5 { /target get cvd } Map /targets Set

 synapses nrn 1 sub get /target get doublevector2array
 targets  eq assert_or_die

% Now the second variant of dataconnect which takes a list of status dicts.

% Step 1: read out all connections and retrieve the synapse status

<< /synapse_model /static_synapse >> GetConnections {GetStatus} Map
/connectome Set

% Step 2: reset the kernel 
ResetKernel

% Step 3: rebuild the neurons
/iaf_neuron n_neurons Create /n Set

% Step 4: Rebuild the connections
% Pass the connectome to DataConnect
connectome DataConnect

% Step 5: Check for one source neuron
/nrn 5 def
 << /source [nrn] /synapse_model /static_synapse >> GetConnections /conn Set
 conn {GetStatus} Map /syn5 Set

 syn5 { /weight get } Map /weights Set
 syn5 { /delay get} Map /delays Set
 syn5 { /target get cvd } Map /targets Set

 synapses nrn 1 sub get /target get doublevector2array
 targets  eq assert_or_die

endusing