Tools

This is a collection of useful tools and functions mainly for use with Brian2. Or other spiking network software or hardware.

converter

Functions in this module convert data from or to Brian2 compatible formats. In particular, there are functions to convert and process data from Dynamic Vision Sensors (DVSs), which are event-based cameras. If you want to learn more about a DVS checkout the original publication

cpptools

This provides functions that are used by the TeiliNetwork class to allow running the network several times with different parameters without recompiling. This is in particular useful if you have small networks and you would like to do parameter optimization. Have a look at sequence_learning_standalone_tutorial as an example for how to use it.

# net is built once
net.build(standalone_params = standaloneParams)
# and can then be run several times with different parameters without recompilation
net.run(duration,standaloneParams = standaloneParams)

distance

These functions to compute different distance measures are mainly there to provide an easy to use cpp implementation for Brian2 cpp code generation. They are used by the synaptic kernel functions, but can also be added into any Brian2 string. Make sure to add the functions you use to the namespace of the respective groups as follows:

from teili.tools.distance import function
group.namespace['functionname_used_in_string'] = function

indexing

Functions that convert 1d indices to x, y coordinates and vice versa including cpp implementation. As Brian2 uses 1d indexing for neurons, it is necessary to convert 1d to 2d indices every so often when e.g. generating synapses. Numpy provides a good API for that, which we use here, but we also add a cpp implementation so the functions can be used in standalone mode.

live

WIP Live plotting and changing of parameters during numpy based simulation could be done like this.

misc

Functions that didn’t fit in any of the other categories so far.

plotter2d

Will be deprecated soon once implemented into the visualizer. Provides 2d plotting functionality (video plot and gif generation)

plotting

Will be deprecated soon once implemented into the visualizer?

prob_distributions

Probability density functions with cpp implementation.

This is e.g. a plot of a 1d Gaussian:

import matplotlib.pyplot as plt
dx = 0.1
normal1drange = np.arange(-10, 10, dx)
gaussian = [normal1d_density(x, 0, 1, True) for x in normal1drange]
print(np.sum(gaussian) * dx)

plt.figure()
plt.plot(normal1drange, gaussian)
plt.show()

random_sampling

This module provides functions to sample from a random distribution, e.g. for random initialization of weights. All functions in should be callable in a similar way as rand() or randn() that are provided by Brian2.

Here is an example how this works in standalone mode:

from teili.tools.random_sampling import Rand_gamma, Randn_trunc

n_samples = 10000
standaloneDir = os.path.expanduser('~/gamma_standalone')
set_device('cpp_standalone', directory=standaloneDir, build_on_run=True)

ng = NeuronGroup(n_samples, '''
testvar : 1
testvar2 : 1''', name = 'ng_test')

ng.namespace.update({'rand_gamma': Rand_gamma(4.60, -10750.0),
                     'randn_trunc': Randn_trunc(-1.5,1.5)
                    })

ng.testvar = 'rand_gamma()'
ng.testvar2 = '5*randn_trunc()'

run(10 * ms)

plt.figure()
plt.title('rand_gamma')
plt.hist(ng.testvar, 50, histtype='step')
plt.show()

plt.figure()
plt.title('randn_trunc')
plt.hist(ng.testvar2, 50, histtype='step')
plt.show()

random_walk

Functions that generate a random walk. E.g. as artificial input.

sorting

To understand the structure in spiking activity of a network or more specifically the structure in the spike rasterplots of a neuronal population we need to sort the neuronal indicies. But also if we want to understand the strucuture of a learned weight matrix we need to be able to sort this matrix. This set of tools allows the user to sort a given weight matrix according to some similarity measure, such as euclidean distance. The class returns a list of permutated indices which can be used to sort a spike rasterplot or the weight matrix itself, before it is being displayed. However, the sorting algorithm is completely agnostic to the similarity measure. It connects each node with maximum two edges and constructs a directed graph. This is similar to the travelling salesman problem.

Example:

In order to use this class you need to initialize it either without a filename:

from teili.tools.sorting import SortMatrix
import numpy as np
matrix = np.random.randint((49, 49))
obj = SortMatrix(nrows=49, matrix=matrix)
print(obj.matrix)
print(obj.permutation)
print(ob.sorted_matrix)

or instead of using a matrix you can also specify a path to a stored matrix:

filename = '/path/to/your/matrix.npy'
obj = SortMatrix(nrows=49, filename=filename)

stimulus_generators

The idea is to generate inputs based on a function instead of having to use a fixed spikegenerator that is filled before the simulation. This avoids having to read large datafiles and makes generation of input easier.

Use it as follows (also teili groups and network can be used):

import matplotlib.pyplot as plt

from brian2 import SpikeMonitor, Network, prefs, ms

from teili.tools.stimulus_generators import StimulusSpikeGenerator
from teili import normal2d_density, Plotter2d

prefs.codegen.target = 'numpy'

nrows = 80
ncols = 80

# Create a moving Gaussian with increasing sigma
# the update that happens every dt is given in the trajectory_eq
# the center coordinates move 5 to the right and 2 upwards every dt
# the sigma is increased by 0.1 in both directions every dt
trajectory_eq = '''
                mu_x = (mu_x + 5)%nrows
                mu_y = (mu_y + 2)%nrows
                sigma_x += 0.1
                sigma_y += 0.1
                '''

stimgen = StimulusSpikeGenerator(
    nrows, ncols, dt=50 * ms, trajectory_eq=trajectory_eq, amplitude=200,
    spike_generator='poisson', pattern_func=normal2d_density,
    name="moving_gaussian_stimgen",
    mu_x=40.0, mu_y=40.0, sigma_x=1.0, sigma_y=1.0, rho=0.0, normalized=False)

poissonspmon = SpikeMonitor(stimgen, record=True)

net = Network()
net.add((stimgen, poissonspmon))
net.run(3000 * ms)

plt.plot(poissonspmon.t, poissonspmon.i, ".")

plotter2d = Plotter2d(poissonspmon, (nrows, ncols))
imv = plotter2d.plot3d(plot_dt=10 * ms, filtersize=20 * ms)
imv.show()

synaptic_kernel

This module provides functions that can be used for synaptic connectivity kernels (generate weight matrices). E.g. Gaussian, Mexican hat, Gabor with different dimensionality, also using different distance metrics. In order to also use them with C++ code generation, all functions have a cpp implementation given by the @implementation decorator.