# -*- coding: utf-8 -*-
#
# test_connect_parameters.py
#
# 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/>.
'''
Tests of non pattern specific parameter.
The tests for all rules will run these tests separately.
'''
import unittest
import numpy as np
from . import test_connect_helpers as hf
[docs]class TestParams(unittest.TestCase):
# Setting default parameter. These parameter might be overwritten
# by the classes
# testing one specific rule.
# specify connection pattern
rule = 'one_to_one'
conn_dict = {'rule': rule}
# sizes of populations
N1 = 6
N2 = 6
# time step
dt = 0.1
# default params
w0 = 1.0
d0 = 1.0
r0 = 0
syn0 = 'static_synapse'
# parameter for test of distributed parameter
pval = 0.05 # minimum p-value to pass kolmogorov smirnov test
# number of threads
nr_threads = 2
# for now only tests if a multi-thread connect is successfull, not whether
# the the threading is actually used
[docs] def setUp(self):
hf.nest.ResetKernel()
hf.nest.SetKernelStatus({'local_num_threads': self.nr_threads})
[docs] def setUpNetwork(self, conn_dict=None, syn_dict=None, N1=None, N2=None):
if N1 is None:
N1 = self.N1
if N2 is None:
N2 = self.N2
self.pop1 = hf.nest.Create('iaf_psc_alpha', N1)
self.pop2 = hf.nest.Create('iaf_psc_alpha', N2)
hf.nest.set_verbosity('M_FATAL')
hf.nest.Connect(self.pop1, self.pop2, conn_dict, syn_dict)
[docs] def setUpNetworkOnePop(self, conn_dict=None, syn_dict=None, N=None):
if N is None:
N = self.N1
self.pop = hf.nest.Create('iaf_psc_alpha', N)
hf.nest.set_verbosity('M_FATAL')
hf.nest.Connect(self.pop, self.pop, conn_dict, syn_dict)
[docs] def testWeightSetting(self):
# test if weights are set correctly
# one weight for all connections
w0 = 0.351
label = 'weight'
syn_params = {label: w0}
hf.check_synapse([label], [syn_params['weight']], syn_params, self)
[docs] def testDelaySetting(self):
# test if delays are set correctly
# one delay for all connections
d0 = 0.275
syn_params = {'delay': d0}
self.setUpNetwork(self.conn_dict, syn_params)
connections = hf.nest.GetStatus(
hf.nest.GetConnections(self.pop1, self.pop2))
nest_delays = [connection['delay'] for connection in connections]
# all delays need to be equal
self.assertTrue(hf.all_equal(nest_delays))
# delay (rounded) needs to equal the delay that was put in
self.assertTrue(abs(d0 - nest_delays[0]) < self.dt)
[docs] def testRPortSetting(self):
neuron_model = 'iaf_psc_exp_multisynapse'
neuron_dict = {'tau_syn': [0.5, 0.7]}
rtype = 2
self.pop1 = hf.nest.Create(neuron_model, self.N1, neuron_dict)
self.pop2 = hf.nest.Create(neuron_model, self.N2, neuron_dict)
syn_params = {'model': 'static_synapse', 'receptor_type': rtype}
hf.nest.Connect(self.pop1, self.pop2, self.conn_dict, syn_params)
conns = hf.nest.GetStatus(hf.nest.GetConnections(self.pop1, self.pop2))
ports = [conn['receptor'] for conn in conns]
self.assertTrue(hf.all_equal(ports))
self.assertTrue(ports[0] == rtype)
[docs] def testSynapseSetting(self):
hf.nest.CopyModel("static_synapse", 'test_syn', {'receptor_type': 0})
syn_params = {'model': 'test_syn'}
self.setUpNetwork(self.conn_dict, syn_params)
conns = hf.nest.GetStatus(hf.nest.GetConnections(self.pop1, self.pop2))
syns = [str(conn['synapse_model']) for conn in conns]
self.assertTrue(hf.all_equal(syns))
self.assertTrue(syns[0] == syn_params['model'])
# tested on each mpi process separatly
[docs] def testDefaultParams(self):
self.setUpNetwork(self.conn_dict)
conns = hf.nest.GetStatus(hf.nest.GetConnections(self.pop1, self.pop2))
self.assertTrue(all(x['weight'] == self.w0 for x in conns))
self.assertTrue(all(x['delay'] == self.d0 for x in conns))
self.assertTrue(all(x['receptor'] == self.r0 for x in conns))
self.assertTrue(all(x['synapse_model'] == self.syn0 for x in conns))
[docs] def testAutapsesTrue(self):
conn_params = self.conn_dict.copy()
# test that autapses exist
conn_params['autapses'] = True
self.pop1 = hf.nest.Create('iaf_psc_alpha', self.N1)
hf.nest.Connect(self.pop1, self.pop1, conn_params)
# make sure all connections do exist
M = hf.get_connectivity_matrix(self.pop1, self.pop1)
hf.mpi_assert(np.diag(M), np.ones(self.N1), self)
[docs] def testAutapsesFalse(self):
conn_params = self.conn_dict.copy()
# test that autapses were excluded
conn_params['autapses'] = False
self.pop1 = hf.nest.Create('iaf_psc_alpha', self.N1)
hf.nest.Connect(self.pop1, self.pop1, conn_params)
# make sure all connections do exist
M = hf.get_connectivity_matrix(self.pop1, self.pop1)
hf.mpi_assert(np.diag(M), np.zeros(self.N1), self)
[docs] def testHtSynapse(self):
params = ['P', 'delta_P']
values = [0.987, 0.362]
syn_params = {'model': 'ht_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testQuantalStpSynapse(self):
# params a and n are not tested since Connect cannot handle
# integer parameter yet
# Connect will throw an error is a or n are set in syn_spec
params = ['U', 'tau_fac', 'tau_rec', 'u']
values = [0.679, 8.45, 746.2, 0.498]
syn_params = {'model': 'quantal_stp_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testStdpFacetshwSynapseHom(self):
params = ['a_acausal', 'a_causal', 'a_thresh_th', 'a_thresh_tl',
'next_readout_time'
]
values = [0.162, 0.263, 20.46, 19.83, 0.1]
syn_params = {'model': 'stdp_facetshw_synapse_hom'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testStdpPlSynapseHom(self):
params = ['Kplus']
values = [0.173]
syn_params = {'model': 'stdp_pl_synapse_hom'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testStdpSynapseHom(self):
params = ['Kplus']
values = [0.382]
syn_params = {'model': 'stdp_synapse_hom'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testStdpSynapse(self):
params = ['Wmax', 'alpha', 'lambda', 'mu_minus', 'mu_plus', 'tau_plus']
values = [98.34, 0.945, 0.02, 0.945, 1.26, 19.73]
syn_params = {'model': 'stdp_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testTsodyks2Synapse(self):
params = ['U', 'tau_fac', 'tau_rec', 'u', 'x']
values = [0.362, 0.152, 789.2, 0.683, 0.945]
syn_params = {'model': 'tsodyks2_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testTsodyksSynapse(self):
params = ['U', 'tau_fac', 'tau_psc', 'tau_rec', 'x', 'y', 'u']
values = [0.452, 0.263, 2.56, 801.34, 0.567, 0.376, 0.102]
syn_params = {'model': 'tsodyks_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testStdpDopamineSynapse(self):
# ResetKernel() since parameter setting not thread save for this
# synapse type
hf.nest.ResetKernel()
vol = hf.nest.Create('volume_transmitter')
hf.nest.SetDefaults('stdp_dopamine_synapse', {'vt': vol[0]})
params = ['c', 'n']
values = [0.153, 0.365]
syn_params = {'model': 'stdp_dopamine_synapse'}
hf.check_synapse(params, values, syn_params, self)
[docs] def testRPortAllSynapses(self):
syns = ['cont_delay_synapse', 'ht_synapse', 'quantal_stp_synapse',
'static_synapse_hom_w', 'stdp_dopamine_synapse',
'stdp_facetshw_synapse_hom', 'stdp_pl_synapse_hom',
'stdp_synapse_hom', 'stdp_synapse', 'tsodyks2_synapse',
'tsodyks_synapse'
]
syn_params = {'receptor_type': 1}
for i, syn in enumerate(syns):
if syn == 'stdp_dopamine_synapse':
vol = hf.nest.Create('volume_transmitter')
hf.nest.SetDefaults('stdp_dopamine_synapse', {'vt': vol[0]})
syn_params['model'] = syn
self.pop1 = hf.nest.Create('iaf_psc_exp_multisynapse', self.N1, {
'tau_syn': [0.2, 0.5]})
self.pop2 = hf.nest.Create('iaf_psc_exp_multisynapse', self.N2, {
'tau_syn': [0.2, 0.5]})
hf.nest.Connect(self.pop1, self.pop2, self.conn_dict, syn_params)
conns = hf.nest.GetStatus(
hf.nest.GetConnections(self.pop1, self.pop2))
conn_params = [conn['receptor'] for conn in conns]
self.assertTrue(hf.all_equal(conn_params))
self.assertTrue(conn_params[0] == syn_params['receptor_type'])
self.setUp()
[docs] def testWeightAllSynapses(self):
# test all synapses apart from static_synapse_hom_w where weight is not
# settable
syns = ['cont_delay_synapse', 'ht_synapse', 'quantal_stp_synapse',
'stdp_dopamine_synapse',
'stdp_facetshw_synapse_hom',
'stdp_pl_synapse_hom',
'stdp_synapse_hom', 'stdp_synapse', 'tsodyks2_synapse',
'tsodyks_synapse'
]
syn_params = {'weight': 0.372}
for syn in syns:
if syn == 'stdp_dopamine_synapse':
vol = hf.nest.Create('volume_transmitter')
hf.nest.SetDefaults('stdp_dopamine_synapse', {'vt': vol[0]})
syn_params['model'] = syn
hf.check_synapse(
['weight'], [syn_params['weight']], syn_params, self)
self.setUp()
[docs] def testDelayAllSynapses(self):
syns = ['cont_delay_synapse',
'ht_synapse', 'quantal_stp_synapse',
'static_synapse_hom_w',
'stdp_dopamine_synapse',
'stdp_facetshw_synapse_hom', 'stdp_pl_synapse_hom',
'stdp_synapse_hom', 'stdp_synapse', 'tsodyks2_synapse',
'tsodyks_synapse'
]
syn_params = {'delay': 0.4}
for syn in syns:
if syn == 'stdp_dopamine_synapse':
vol = hf.nest.Create('volume_transmitter')
hf.nest.SetDefaults('stdp_dopamine_synapse', {'vt': vol[0]})
syn_params['model'] = syn
hf.check_synapse(
['delay'], [syn_params['delay']], syn_params, self)
self.setUp()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestParams)
unittest.TextTestRunner(verbosity=2).run(suite)