Source code for nest.tests.test_weight_recorder

# -*- coding: utf-8 -*-
#
# test_weight_recorder.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/>.

"""
Test of events
"""

import unittest
import nest
import numpy as np
HAVE_GSL = nest.sli_func("statusdict/have_gsl ::")


[docs]@nest.check_stack class WeightRecorderTestCase(unittest.TestCase): """Tests for the Weight Recorder"""
[docs] def is_subset(self, a, b, places=6, msg=None): a = np.round(a, places) b = np.round(b, places) if set(a) <= set(b): return msg = self._formatMessage(msg, """List A is not subset of list B and/or the items are not equal within a certain range of precision. List A is {0} and list B is {1}""" .format(a, b)) raise self.failureException(msg)
[docs] def testSingleThread(self): """Weight Recorder Single Threaded""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 1}) wr = nest.Create('weight_recorder') nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) connections = nest.GetConnections(pre, post) weights = np.array([]) for i in range(100): nest.Simulate(1) weights = np.append(weights, nest.GetStatus(connections, "weight")[0]) wr_weights = nest.GetStatus(wr, "events")[0]["weights"] self.addTypeEqualityFunc(type(wr_weights), self.is_subset) self.assertEqual(wr_weights, weights)
[docs] def testMultipleThreads(self): """Weight Recorder Multi Threaded""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 2}) wr = nest.Create('weight_recorder') nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) connections = nest.GetConnections(pre, post) weights = np.array([]) for i in range(100): nest.Simulate(1) weights = np.append(weights, nest.GetStatus(connections, "weight")[0]) wr_weights = nest.GetStatus(wr, "events")[0]["weights"] self.addTypeEqualityFunc(type(wr_weights), self.is_subset) self.assertEqual(wr_weights, weights)
[docs] def testDefinedSenders(self): """Weight Recorder Defined Subset Of Senders""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 1}) wr = nest.Create('weight_recorder') nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) nest.SetStatus(wr, {"senders": pre[:3]}) connections = nest.GetConnections(pre[:3], post) senders = np.array([]) for i in range(100): nest.Simulate(1) senders = np.append(senders, nest.GetStatus(connections, "source")) wr_senders = nest.GetStatus(wr, "events")[0]["senders"] self.addTypeEqualityFunc(type(wr_senders), self.is_subset) self.assertEqual(wr_senders, senders)
[docs] def testDefinedTargets(self): """Weight Recorder Defined Subset Of Targets""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 1}) wr = nest.Create('weight_recorder') nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) nest.SetStatus(wr, {"targets": post[:3]}) connections = nest.GetConnections(pre, post[:3]) targets = np.array([]) for i in range(100): nest.Simulate(1) targets = np.append(targets, nest.GetStatus(connections, "target")) wr_targets = nest.GetStatus(wr, "events")[0]["targets"] self.addTypeEqualityFunc(type(wr_targets), self.is_subset) self.assertEqual(wr_targets, targets)
[docs] def testDefinedTargetsAndSenders(self): """Weight Recorder Defined Subset Of Targets and Senders""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 1}) wr = nest.Create('weight_recorder') nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) nest.SetStatus(wr, {"senders": pre[1:3], "targets": post[:3]}) # simulate before GetConnections # as order of connections changes at beginning of simulation (sorting) nest.Simulate(1) connections = nest.GetConnections(pre[1:3], post[:3]) targets = np.array([]) for i in range(1): nest.Simulate(1) targets = np.append(targets, nest.GetStatus(connections, "target")) wr_targets = nest.GetStatus(wr, "events")[0]["targets"] self.addTypeEqualityFunc(type(wr_targets), self.is_subset) self.assertEqual(wr_targets, targets)
[docs] def testMultapses(self): """Weight Recorder Multapses""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 2}) wr = nest.Create('weight_recorder', params={"withport": True}) nest.CopyModel("stdp_synapse", "stdp_synapse_rec", {"weight_recorder": wr[0], "weight": 1.}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("parrot_neuron", 5) nest.Connect(pre, post, 'one_to_one', syn_spec="stdp_synapse_rec") nest.Connect(pre, post, 'one_to_one', syn_spec="stdp_synapse_rec") nest.Connect(sg, pre) # simulate before GetConnections # as order of connections changes at beginning of simulation (sorting) nest.Simulate(1) connections = [(c[0], c[1], c[4]) for c in nest.GetConnections(pre, post)] nest.Simulate(100) wr_events = nest.GetStatus(wr, "events")[0] senders = wr_events["senders"] targets = wr_events["targets"] ports = wr_events["ports"] ids = list(zip(senders, targets, ports)) # create an array of object dtype to use np.unique to get # unique ids unique_ids = np.empty(len(ids), dtype=object) for i, v in enumerate(ids): unique_ids[i] = v unique_ids = np.unique(unique_ids) self.assertEqual(sorted(unique_ids), sorted(connections))
[docs] @unittest.skipIf(not HAVE_GSL, 'GSL is not available') def testRPorts(self): """Weight Recorder rports""" nest.ResetKernel() nest.SetKernelStatus({"local_num_threads": 1}) wr = nest.Create('weight_recorder', params={"withrport": True}) nest.CopyModel("stdp_synapse", "stdp_synapse_rec_0", {"weight_recorder": wr[0], "weight": 1., "receptor_type": 1}) nest.CopyModel("stdp_synapse", "stdp_synapse_rec_1", {"weight_recorder": wr[0], "weight": 1., "receptor_type": 2}) sg = nest.Create("spike_generator", params={"spike_times": [10., 15., 55., 70.]}) pre = nest.Create("parrot_neuron", 5) post = nest.Create("aeif_cond_alpha_multisynapse", 5, {"V_th": -69.9, 'tau_syn': [20., 30.], 'E_rev': [0., 0.]}) nest.Connect(pre, post, 'one_to_one', syn_spec="stdp_synapse_rec_0") nest.Connect(pre, post, 'one_to_one', syn_spec="stdp_synapse_rec_1") nest.Connect(sg, pre) connections = nest.GetConnections(pre, post) receptors = nest.GetStatus(connections, "receptor") connections = [(connections[i][0], connections[i][1], receptors[i]) for i in range(len(connections))] nest.Simulate(100) wr_events = nest.GetStatus(wr, "events")[0] senders = wr_events["senders"] targets = wr_events["targets"] rports = wr_events["receptors"] ids = list(zip(senders, targets, rports)) # create an array of object dtype to use np.unique to get # unique ids unique_ids = np.empty(len(ids), dtype=object) for i, v in enumerate(ids): unique_ids[i] = v unique_ids = np.unique(unique_ids) # should be 10 connections self.assertEqual(sorted(unique_ids), sorted(connections))
[docs]def suite(): suite = unittest.TestLoader().loadTestsFromTestCase(WeightRecorderTestCase) return suite
if __name__ == "__main__": runner = unittest.TextTestRunner(verbosity=2) runner.run(suite())