Revision f0c5c7cb930dc7952c24021113edac8be7e4bf32 authored by Guy Avraham on 26 October 2022, 13:32:18 UTC, committed by GitHub on 26 October 2022, 13:32:18 UTC
1 parent ac59451
sim_SS_diff_paramRange_main.m
%% simulate rescorla state-space- test parameters ranges (Fig. 3)
clear all;close all;clc;
%% differential conditioning paradigm
nsims = 100; % number of simulations
ntrials = 800; % total number of trials
nlearning = 600; % learning trials
nwash = ntrials-nlearning; % washout
% init associative values (and set first trial to 0)
V_plan = nan(nsims,ntrials+1,1); V_plan(:,1) = 0;
V_tone = nan(nsims,ntrials+1,1); V_tone(:,1) = 0;
V_light = nan(nsims,ntrials+1,1); V_light(:,1) = 0;
V = nan(nsims,ntrials+1,1); V(:,1) = 0;
alpha_plan=1;
alpha_tone = 0;
alpha_light = 0;
lambda=20;
nParamRange=40;
A_range = linspace(0.8,1,nParamRange);
B_range = linspace(0.01,0.5,nParamRange);
newSet=0;
if newSet
pavEffect_adapt_cond=nan(nParamRange);
pavEffect_wash_cond=nan(nParamRange);
for a=1:nParamRange
A = A_range(a);
for b=1:nParamRange
beta = B_range(b);
% sim loop
for sim = 1:nsims
% trial protocol
tmp_us = rectpulse([0,1],nlearning/2); % 50 percent clamp schedule
us = [tmp_us(randperm(length(tmp_us))) zeros(1,ntrials-length(tmp_us))]; % clamp trials (after shuffling, with 200 washouts)
cs_plan = ones(1,ntrials); % plan CS is assumed to happen EVERY TRIAL
cs_tone = zeros(1,ntrials); % init tone cs
cs_light = zeros(1,ntrials); % init light cs
idx_on = find(us(1:length(tmp_us))==1); % paired cs-us
idx_off = find(us(1:length(tmp_us))==0); % unpaired cs-us
cs_tone(idx_on) = 1; % set tone
cs_light(idx_off) = 1; % set light
tmp_wash = rectpulse([0,1],nwash/2); % washout, intermixed cs trial
wash = tmp_wash(randperm(length(tmp_wash))); % shuffle
cs_tone(length(tmp_us)+1:end) = wash; % set tone
cs_light(length(tmp_us)+1:end) = 1-wash; % set light
% trial loop
for t = 1:ntrials
% clamp trial?
if us(t)
err = lambda;
else
err = 0;
end
% which cs?
if cs_tone(t)
V(sim,t) = V_plan(sim,t) + V_tone(sim,t);
% update tone only
delta_tone = alpha_tone * beta * (err - V(sim,t));
V_tone(sim,t+1) = V_tone(sim,t) + delta_tone;
V_light(sim,t+1) = V_light(sim,t);
% update plan
delta_plan = alpha_plan * beta * (err - V(sim,t));
V_plan(sim,t+1) = A*V_plan(sim,t) + delta_plan; % A is for the retention factor of the state space
else
V(sim,t) = V_plan(sim,t) + V_light(sim,t);
% update light only
delta_light = alpha_light * beta * (err - V(sim,t));
V_light(sim,t+1) = V_light(sim,t) + delta_light;
V_tone(sim,t+1) = V_tone(sim,t);
% update plan
delta_plan = alpha_plan * beta * (err - V(sim,t));
V_plan(sim,t+1) = A*V_plan(sim,t) + delta_plan;
end
end
%% compute changes in hand angles in each of four conditions
% learning
tpt=[];tpl=[];lpt=[];lpl=[];
for n = 2:nlearning
dv = V(sim,n) - V(sim,n-1);
if cs_tone(n) == 1 && cs_tone(n-1) == 1
tpt = [tpt;dv];
elseif cs_tone(n) == 1 && cs_tone(n-1) == 0
tpl = [tpl;dv];
elseif cs_light(n) == 1 && cs_light(n-1) == 1
lpl = [lpl;dv];
elseif cs_light(n) == 1 && cs_light(n-1) == 0
lpt = [lpt;dv];
end
end
tone_post_tone(sim,1) = nanmean(tpt);
tone_post_light(sim,1) = nanmean(tpl);
light_post_tone(sim,1) = nanmean(lpt);
light_post_light(sim,1) = nanmean(lpl);
% washout
tpt=[];tpl=[];lpt=[];lpl=[];
for n = nlearning+1:ntrials
dv = V(sim,n) - V(sim,n-1);
if cs_tone(n) == 1 && cs_tone(n-1) == 1
tpt = [tpt;dv];
elseif cs_tone(n) == 1 && cs_tone(n-1) == 0
tpl = [tpl;dv];
elseif cs_light(n) == 1 && cs_light(n-1) == 1
lpl = [lpl;dv];
elseif cs_light(n) == 1 && cs_light(n-1) == 0
lpt = [lpt;dv];
end
end
tone_post_tone(sim,2) = nanmean(tpt);
tone_post_light(sim,2) = nanmean(tpl);
light_post_tone(sim,2) = nanmean(lpt);
light_post_light(sim,2) = nanmean(lpl);
end
dha_adapt=[tone_post_tone(:,1),light_post_tone(:,1), tone_post_light(:,1),light_post_light(:,1)]; %tone-err; light-hit
dha_wash=[tone_post_tone(:,2),light_post_tone(:,2), tone_post_light(:,2),light_post_light(:,2)]; %tone-err; light-hit
pavEffect_adapt_cond_loop=mean([mean(dha_adapt(:,1)-dha_adapt(:,2)), mean(dha_adapt(:,3)-dha_adapt(:,4))]);
pavEffect_wash_cond_loop=mean([mean(dha_wash(:,1)-dha_wash(:,2)), mean(dha_wash(:,3)-dha_wash(:,4))]);
pavEffect_adapt_cond(b,a)=pavEffect_adapt_cond_loop; % alpha_cs - raws; alpha_plan - columns
pavEffect_wash_cond(b,a)=pavEffect_wash_cond_loop;
V=V(:,1:ntrials);
V_plan=V_plan(:,1:ntrials);
V_tone=V_tone(:,1:ntrials);
V_light=V_light(:,1:ntrials);
V_all={V;V_plan;V_tone;V_light};
end
end
pavEffect_adapt=pavEffect_adapt_cond;
pavEffect_wash=pavEffect_wash_cond;
save('diff_sim_set_paramRange_ss')
else
load('diff_sim_set_paramRange_ss')
end
min_pavEffect_adapt=min(min(pavEffect_adapt));
max_pavEffect_adapt=max(max(pavEffect_adapt));
min_pavEffect_wash=min(min(pavEffect_wash));
max_pavEffect_wash=max(max(pavEffect_wash));
min_pavEffect_ss=min(min_pavEffect_adapt,min_pavEffect_wash);
max_pavEffect_ss=max(max_pavEffect_adapt,max_pavEffect_wash);
save('extreme_pavEffect_SS_sim','min_pavEffect_ss','max_pavEffect_ss')
load('extreme_pavEffect_RW_sim') % load the conditioning effect range from the RW simulation
% scale both state space and rescorla-wagner to the same color scale
min_pavEffect=min(min_pavEffect_rw,min_pavEffect_ss);
max_pavEffect=max(max_pavEffect_rw,max_pavEffect_ss);
%%
clc
close all
set(groot, 'DefaultAxesXColor', [0,0,0], ...
'DefaultAxesYColor', [0,0,0], ...
'DefaultAxesZColor', [0,0,0])
% for the contour plots. load the actual data
load ('../DataAnalysis/Differential.mat')
for block=1:2 % 1-adapt; 2- wash
if block==1
pavEffect=pavEffect_adapt;
pavEffect_rangeData=Differential.adapt.seda_s_rangeCurr;
else
pavEffect=pavEffect_wash;
pavEffect_rangeData=Differential.wash.seda_s_rangeCurr;
end
figure('position',[50,50,330,310])
h=imagesc([A_range(1) A_range(end)],[B_range(1) B_range(end)],pavEffect,'CDataMapping','scaled',[0 max_pavEffect]);
set(gca,'YDir','normal','xtick',[A_range(1) A_range(end)],'ytick',[B_range(1) B_range(end)],'fontsize',14)
colormap(brewermap([],'*Spectral'))
hold on
contour(repmat(A_range,nParamRange,1),repmat(B_range',1,nParamRange),pavEffect,pavEffect_rangeData(1)*[1 1],'color',0*[1 1 1],'linewidth',2)
contour(repmat(A_range,nParamRange,1),repmat(B_range',1,nParamRange),pavEffect,pavEffect_rangeData(2)*[1 1],'k','linewidth',4)
end

Computing file changes ...