Modelling gain modulation in stability-optimised circuits (Stroud et al 2018)

 Download zip file 
Help downloading and running models
Accession:246004
We supply Matlab code to create 'stability-optimised circuits'. These networks can give rise to rich neural activity transients that resemble primary motor cortex recordings in monkeys during reaching. We also supply code that allows one to learn new network outputs by changing the input-output gain of neurons in a stability-optimised network. Our code recreates the main results of Figure 1 in our related publication.
Reference:
1 . Stroud JP, Porter MA, Hennequin G, Vogels TP (2018) Motor primitives in space and time via targeted gain modulation in cortical networks. Nat Neurosci 21:1774-1783 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Connectionist Network;
Brain Region(s)/Organism:
Cell Type(s): Abstract rate-based neuron;
Channel(s):
Gap Junctions:
Receptor(s): M1;
Gene(s):
Transmitter(s):
Simulation Environment: MATLAB;
Model Concept(s): Learning;
Implementer(s): Stroud, Jake P [jp.stroud at hotmail.com]; Hennequin, Guillaume ; Vogels, Tim [tim.vogels at epfl.ch];
Search NeuronDB for information about:  M1;
function [output] = integrate_dynamics(W, gains, params, initial_cond)

%% Function that integrates the equation governing the neuronal dynamics
% Written by Jake Stroud

params.gains = gains;

% Add noise to the initial condition if indicated
if params.initial_cond_noise ~= 0
    initial_cond = awgn(initial_cond(:,1),params.initial_cond_noise,'measured');
end

% Solve the ODEs governing the neuronal dynamics
[output.t, X] = ode45(@rate_dynamics_ode, ...
    linspace(0, params.tfinal, params.n_timepoints), initial_cond, [], W, params);

% Convert neuronal activities into firing rates
output.R = feval(params.ff, X, params);

output.param = params; %Output parameters if needed

end

function x_dot = rate_dynamics_ode(t, X, W, param)

% Vector equation governing the neuronal activity
x_dot = param.over_tau*(-X + W*feval(param.f, X, param));

end

% Gain functions
function out = f_non_linear(X, param)

out = zeros(size(X));
I = X < 0;
out(I) = param.r0*tanh(param.gains(I).*X(I)/param.r0);
I2 = logical(1 - I);
out(I2) = (param.rmax-param.r0)*tanh(param.gains(I2).*X(I2)/(param.rmax-param.r0));

end

function out = f_final_non_linear(X, param)

param.gains = repmat((param.gains)', length(X),1); %Here we pass all the neuronal activities over times through the gain function so we need to repmat all the gain values
out = zeros(size(X));
I = X < 0;
out(I) = (param.r0*tanh(param.gains(I).*X(I)/param.r0));
I2 = logical(1 - I);
out(I2) = (param.rmax-param.r0)*tanh(param.gains(I2).*X(I2)/(param.rmax-param.r0));

end

function out = f_linear(X, param)

out = param.gains.*X;

end

Loading data, please wait...