%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% DATE: 20/10/2003
%%%% WHAT: M-code (script) version of the extended model
%%%% Parameters are from Humphries & Gurney (2002) Network, 13, 131-156.
%%%% AUTHOR: Mark Humphries
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
%%% MODEL PARAMETERS
NUM_CHANNELS = 6;
da_sel = 0.2; % dopamine level
da_cont = 0.2;
W_Sal_SEL = 0.5;
W_Sal_CONT = 0.5;
W_Sal_STN = 0.5;
W_Sal_MCtx = 1;
W_MCtx_SEL = 0.5;
W_MCtx_CONT = 0.5;
W_MCtx_STN = 0.5;
W_MCtx_VL = 1;
W_MCtx_TRN = 1;
W_VL_MCtx = 1;
W_VL_TRN = 1;
W_TRN_between = -0.7;
W_TRN_within = -0.1;
W_SEL_GPi = -1;
W_CONT_GPe = -1;
W_STN_GPi = 0.8;
W_STN_GPe = 0.8;
W_GPe_STN = -1;
W_GPe_GPi = -0.4;
W_GPi_VL = -1;
e_SEL = 0.2;
e_CONT = 0.2;
e_STN = -0.25;
e_GPe = -0.2;
e_GPi = -0.2;
e_MCtx = 0;
e_VL = 0;
e_TRN = 0;
%%% SIMULATION PARAMETERS %%%%%%%%%%%%%%%%%%%%%%%%%%%%
t = 6; % length of simulation
dt = 0.001; % time-step
sim_steps = t / dt;
% activity arrays
a_MCtx = zeros(NUM_CHANNELS,1);
a_VL = zeros(NUM_CHANNELS,1);
a_TRN = zeros(NUM_CHANNELS,1);
a_SEL = zeros(NUM_CHANNELS,1);
a_CONT = zeros(NUM_CHANNELS,1);
a_STN = zeros(NUM_CHANNELS,1);
a_GPe = zeros(NUM_CHANNELS,1);
a_GPi = zeros(NUM_CHANNELS,1);
% output arrays
o_MCtx = zeros(NUM_CHANNELS,sim_steps);
o_VL = zeros(NUM_CHANNELS,sim_steps);
o_TRN = zeros(NUM_CHANNELS,sim_steps);
o_SEL = zeros(NUM_CHANNELS,sim_steps);
o_CONT = zeros(NUM_CHANNELS,sim_steps);
o_STN = zeros(NUM_CHANNELS,sim_steps);
o_GPe = zeros(NUM_CHANNELS,sim_steps);
o_GPi = zeros(NUM_CHANNELS,sim_steps);
%%% SALIENCE INPUT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ch1_onset = 1;
ch1_size = 0.4;
ch2_onset = 3;
ch2_size = 0.6;
transient_onset = 4;
transient_off = 6;
transient_size = 0.2;
c = zeros(NUM_CHANNELS,1);
%%% ARTIFICAL UNIT PARAMETERS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k = 25; % gain
m = 1; % slope
decay_constant = exp(-k*dt);
trn_vec = ones(NUM_CHANNELS,1);
tic
%%% SIMULATE MODEL
for steps = 2:sim_steps
%% calculate salience changes
if steps * dt == ch1_onset
c(1) = ch1_size;
end
if steps * dt == ch2_onset
c(2) = ch2_size;
end
if steps * dt == transient_onset
c(1) = c(1) + transient_size;
end
if steps * dt == transient_off
c(1) = ch1_size;
end
%%% OUTPUTS - calculated from previous time-step
o_MCtx(:,steps) = ramp_output(a_MCtx,e_MCtx,m)';
o_VL(:,steps) = ramp_output(a_VL,e_VL,m)';
o_TRN(:,steps) = ramp_output(a_TRN,e_TRN,m)';
o_SEL(:,steps) = ramp_output(a_SEL,e_SEL,m)';
o_CONT(:,steps) = ramp_output(a_CONT,e_CONT,m)';
o_STN(:,steps) = ramp_output(a_STN,e_STN,m)';
o_GPe(:,steps) = ramp_output(a_GPe,e_GPe,m)';
o_GPi(:,steps) = ramp_output(a_GPi,e_GPi,m)';
%% Motor Cortex
u_MCtx = c .* W_Sal_MCtx + o_VL(:,steps) .* W_VL_MCtx;
a_MCtx = (a_MCtx - u_MCtx) * decay_constant + u_MCtx;
%% VL thalamus
temp = (sum(o_TRN(:,steps)) .* trn_vec) - o_TRN(:,steps); %% removes own input from each summed value
u_VL = o_MCtx(:,steps) .* W_MCtx_VL + o_GPi(:,steps) .* W_GPi_VL + o_TRN(:,steps) .* W_TRN_within + temp .* W_TRN_between;
a_VL = (a_VL - u_VL) * decay_constant + u_VL;
%% TRN
u_TRN = o_MCtx(:,steps) .* W_MCtx_TRN + o_VL(:,steps) .* W_VL_TRN;
a_TRN = (a_TRN - u_TRN) * decay_constant + u_TRN;
%% STRIATUM D1
u_SEL = (c .* W_Sal_SEL + o_MCtx(:,steps) .* W_MCtx_SEL) .* (1 + da_sel);
a_SEL = (a_SEL - u_SEL) * decay_constant + u_SEL;
%% STRIATUM D2
u_CONT = (c .* W_Sal_CONT + o_MCtx(:,steps) .* W_MCtx_CONT) .* (1 - da_cont);
a_CONT = (a_CONT - u_CONT) * decay_constant + u_CONT;
%% STN
u_STN = c .* W_Sal_STN + o_MCtx(:,steps) .* W_MCtx_STN + o_GPe(:,steps) .* W_GPe_STN;
a_STN = (a_STN - u_STN) * decay_constant + u_STN;
%% GPe
u_GPe = sum(o_STN(:,steps)) .* W_STN_GPe + o_CONT(:,steps) .* W_CONT_GPe;
a_GPe = (a_GPe - u_GPe) * decay_constant + u_GPe;
%% GPi
u_GPi = sum(o_STN(:,steps)) .* W_STN_GPi + o_GPe(:,steps) .* W_GPe_GPi + o_SEL(:,steps) .* W_SEL_GPi;
a_GPi = (a_GPi - u_GPi) * decay_constant + u_GPi;
end
toc
figure(1)
clf
plot(o_GPi(1,:),'r')
hold on
plot(o_GPi(2,:),'b')