% Author: Etay Hay
% Orientation processing by synaptic integration across first-order tactile neurons (Hay and Pruszynski 2020)
function [] = save_accuracy(task_type,acc_type,nc_type,noise_level,t_win,savemode,networktype,learning_alg,senss)
warning off
close all;
rng(1234);
if noise_level == 0
Nrand = 1;
else
Nrand = 20;
end
load(['models/',networktype,'angles',int2str(task_type),'_',int2str(noise_level),'.mat']);
Ncells = length(models2);
Ntrials = size(m_spike_times,3);
for i=1:Ncells
for k = 1:length(stim_list)
for k2 = 1:Ntrials
m_spike_rate = get_spike_rate(m_spike_times{i,k,k2},m_t{k});
vmax = max(m_spike_rate);
if nc_type == 1
psp{k,i,k2} = st2epsp(m_t{k},m_spike_times{i,k,k2},0.5,3);
elseif nc_type == 2
psp{k,i,k2} = st2epsp(m_t{k},m_spike_times{i,k,k2},0.5,65);
elseif nc_type == 3
psp{k,i,k2} = st2epsp(m_t{k},m_spike_times{i,k,k2},0.5,3) + st2epsp(m_t{i,k,k2},m_spike_times{i,k,k2},0.5,65);
end
if t_win > 0
ti_middle = round(length(m_t{k})/2);
ti1 = ti_middle - floor(t_win/2);
ti2 = ti_middle + ceil(t_win/2) - 1;
psp{k,i,k2} = psp{k,i,k2}(ti1:ti2);
end
end
end
end
%senss = [20:-5:5,3,1];
y = zeros(length(stim_list),length(stim_list),Ntrials);
for k = 1:length(stim_list)
for k2 = 1:Ntrials
y(k,k,k2) = 1;
end
end
performance = zeros(Nrand,length(senss));
for i_sens = 1:length(senss)
disp([int2str(senss(i_sens)),' degrees'])
if acc_type == 1
stim_angles2 = [-senss(i_sens),senss(i_sens)];
elseif acc_type == 2
stim_angles2 = [0:-senss(i_sens):min(stim_angles),senss(i_sens):senss(i_sens):max(stim_angles)];
end
inds2 = find(ismember(stim_angles,stim_angles2));
ws1 = [];
ws2 = [];
for i_rand = 1:Nrand
rvec = randperm(Ntrials);
inds_train = rvec(1:round(Ntrials/2));
inds_test = rvec((1+round(Ntrials/2)):Ntrials);
y_train = [];
y_test = [];
psp_train = {};
psp_test = {};
for k2 = 1:length(inds_train)
y_train = [y_train; squeeze(y(inds2,inds2(1),inds_train(k2)))];
for k3 = 1:length(inds2)
temp = [];
for k4 = 1:Ncells
temp = [temp, psp{inds2(k3),k4,inds_train(k2)}];
end
psp_train{end+1} = temp;
end
end
for k2 = 1:length(inds_test)
y_test = [y_test; squeeze(y(inds2,inds2(1),inds_test(k2)))];
for k3 = 1:length(inds2)
temp = [];
for k4 = 1:Ncells
temp = [temp, psp{inds2(k3),k4,inds_test(k2)}];
end
psp_test{end+1} = temp;
end
end
if strcmp(learning_alg,'ga')
network_classifier = derive_network_classifier_ga(psp_train,y_train);
elseif strcmp(learning_alg,'perc')
network_classifier = derive_network_classifier_perc(psp_train,y_train);
end
ym = run_network_classifier(network_classifier,psp_test);
performance(i_rand,i_sens) = calc_performance(ym,y_test);
disp(['Test performance = ',num2str(performance(i_rand,i_sens))])
if savemode == 2
ws1 = [ws1, network_classifier.w(:,1)];
ws2 = [ws2, network_classifier.w(:,2)];
end
end
if savemode == 2
save(['models/',networktype,'wnc',int2str(task_type),'_',int2str(acc_type),'_nc',int2str(nc_type),'_nz',int2str(noise_level),...
'_tw',int2str(t_win),'_ang',int2str(senss(i_sens)),'_',learning_alg],'ws1','ws2');
end
end
if savemode ~= 0
save(['models/',networktype,'acc',int2str(task_type),'_',int2str(acc_type),'_nc',int2str(nc_type),'_nz',int2str(noise_level),...
'_tw',int2str(t_win),'_',learning_alg],'performance','senss');
end
end