Table of Contents

WeightMonitor

This class monitors one or multiple synaptic weights over time and writes them to a human readable ASCII file. For the full class reference see its doxygen page.

Usage example

Consider the following examples. Assuming that you have previously define a plastic connection object con in your simulation and you want to see what some of its synapses are doing during learning.

This will initialize a WeightMonitor object:

WeightMonitor * wmon = new WeightMonitor( con, sys->fn("con","syn"), 0.1);

The first argument is the connection you want to monitor. The second one is the filename to write to (here we are using the fn, for filename, function provided by the Auryn kernel that will generate a suitable filename for each rank). The third argument is the sampling interval in seconds. WeightMonitor maintains a list of connections to monitor. Initially this list is empty. There are multiple ways of telling Weight Monitor which ones to monitor.

Monitoring a subset of random weights

wmon->add_equally_spaced(20);

This adds 20 weights to the list which are equally spaced in memory. For most purposes of random connectivity matrices you can think of them as a set of random weights.

Adding a specific synaptic connection

If you are interested in a specific synaptic connection, you can add it to the list using the pre and post indices (NeuronID)

wmon->add_to_list( pre, post );

or if you have a pointer ptr pointing to this synaptic weight:

wmon->add_to_list( ptr );

is also permitted.

Structured connections

Suppose you want to monitor the weights between population of neurons. For instance, connections within a cell assembly or the connections between them. You can do this with

wmon->load_pattern_connections(filename);

where filename is the path to a file which looks like this:

0
1
2
3
4



5
6
7
8
9

The WeightMonitor will read the above file as two “patterns”, two subpopulations consisting of 5 neurons each. Let's call them p1=(0,1,2,3,4) and p2=(5,6,7,8,9). Per default it wall add 5 weights for each possible connection between the two populations to the list. I.e. there will be 5 weights corresponding to self connections between neurons in p1. The next 5 weights will be connections from p1 to p2. The next 5 p2 to p2 and then p2 to p1.

There is a similar function which takes two filenames and allows you to load the structure of SynFireChains into the WeightMonitor.

Adding a list of connections

Alternatively you can add a list of neurons to the list as follows:

int psize = 100; // block size
WeightMonitor * wmon = new WeightMonitor( con, sys->fn("con","syn"), 10 );
        for ( int i = 0 ; i < 5 ; ++i ) {
            for ( int j = 0 ; j < 5 ; ++j ) {
                std::vector<neuron_pair> sublist = con_ee->get_block(i*psize,(i+1)*psize,j*psize,(j+1)*psize);
                sublist.resize(50); // only record a maximum of 50 connections from each block
                wmon->add_to_list(sublist);
            }
        }

For additional ways of loading weights to the least also see: http://fzenke.net/auryn/doxygen/current/classauryn_1_1WeightMonitor.html

Output format

The WeightMonitor writes column formatted ASCII files with floating point values that can be read by most plotting tools which can process CSV and Python (numpy) or MATLAB. Per convention the first column holds the simulation time in seconds and the consecutive columns are the corresponding weight values in the order as they have been added to the list.

This is shown in the example below.

30.000000 1.600000e-01 1.600000e-01 
30.100000 1.600000e-01 1.600000e-01 
30.200000 1.600000e-01 1.600000e-01 
30.300000 1.600000e-01 1.600000e-01 
30.400000 1.600000e-01 1.600000e-01 
30.500000 1.600000e-01 1.600000e-01 
30.600000 1.600000e-01 1.600000e-01 
30.700000 1.600000e-01 1.600000e-01 
30.800000 1.600000e-01 1.599996e-01 
30.900000 1.600000e-01 1.599996e-01 
31.000000 1.600000e-01 1.599996e-01 
31.100000 1.600000e-01 1.599996e-01 
31.200000 1.600000e-01 1.599996e-01 
31.300000 1.600000e-01 1.599996e-01 
31.400000 1.600000e-01 1.599996e-01 
31.500000 1.600000e-01 1.693685e-01 
31.600000 1.600000e-01 1.691309e-01 
31.700000 1.600000e-01 1.691309e-01 
31.800000 1.600000e-01 1.691309e-01 
31.900000 1.600000e-01 1.691309e-01
...

Which can be plotted easily (for instance with https://github.com/fzenke/malleable/blob/master/bin/psyn.sh) The above example was recorded with sim_background. Note that plasticity is only “switched on” at t=30s.