%THIS FILE SIMULATES UNISENSORY AND MULTISENSORY STIMULATIONS ACCORDING TO 
%FIG.11A OF THE PAPER J.COMPUT.NEUROSCI.(2009) 26:55-73 AND
%CREATES .MAT FILES CONTAINING THE RESULTS OF THESE SIMULATIONS. SUCH .MAT
%FILES ARE THEN USED BY THE FILE GRAPHS_FIG11A.M TO CREATE THE SIX PLOTS OF
%FIG.11-a OF THE PAPER

clear
clc
close all

load synapses_La
load synapses_Lv
load synapses_Lm

posizione_m=[20 20]; 
posizione_v=[20 20]; 
posizione_a=[20 20]; 
posizione_contrasto_a=[20 14]; 
posizione_contrasto_v=[20 14]; 
input_v_contrasto=0;   
input_a_contrasto=0;    

input_input_v=[5 8 9 10 12 15 18 20 22 25 30 35];
input_input_a=[0 0 0 0 0 0 0 0 0 0 0 0];

iter=1200;
dt=0.1;
t=[0:iter]*dt;
L=length(t);


Nv=41;
Mv=41;

Gv=1;
phiv=3;      
pend_v=0.3;       
Tv=3;                                                       

Na=41;
Ma=41;

Ga=1;
phia=3;      
pend_a=0.3;       
Ta=3;                                                        
Nm=41;
Mm=41;

Gm=1;
phim=3;  
pend_m=0.3;       
Tm=3;                                                      

Kv=7; 
Ka=6; 


kmv=1;   
kma=1;   

Wma=cell(Nm,Mm);
for i = 1:Nm,
    for j = 1:Mm, 
        Wma{i,j}=zeros(Nm,Mm);
        Wma{i,j}(i,j)=kma;              % 0.8;
    end
end


Wmv=cell(Nm,Mm);
for i = 1:Nm,
    for j = 1:Mm, 
        Wmv{i,j}=zeros(Nm,Mm);
        Wmv{i,j}(i,j)=kmv;              % 0.8;
    end
end


for p=1:12
    
    Iv = zeros(Nv,Mv,L);
    xv=zeros(Nv,Mv,L);         
    
    Ia = zeros(Na,Ma,L);
    xa=zeros(Na,Ma,L);         
    
    
    xm=zeros(Nm,Mm,L); 
    
    time_inputV=[0 1200]; 
    timeV=[0 200];
    
    time_inputA=[0 1200];
    timeA=[0 200]; 
    
    input_v=0;
    inputvisivo
    input_camporec_visivo_0=input_camporec_visivo;
    clear input_camporec_visivo
    
    input_v=input_input_v(p);
    inputvisivo
    input_camporec_visivo_N0=input_camporec_visivo;
    clear input_camporec_visivo
    
    input_a=0;
    inputacustico
    input_camporec_acustico_0=input_camporec_acustico;
    clear input_camporec_acustico
    
    input_a=input_input_a(p);
    inputacustico
    input_camporec_acustico_N0=input_camporec_acustico;
    clear input_camporec_acustico
    
    for k=1:L-1,
        dt*k;
        k
        if k >= timeV(1) & k < timeV(2),
            Iv(:,:,k)=input_camporec_visivo_0;
        else
            Iv(:,:,k)=input_camporec_visivo_N0;
        end
        if k >= timeA(1) & k < timeA(2),
            Ia(:,:,k)=input_camporec_acustico_0; 
            
        else
            Ia(:,:,k)=input_camporec_acustico_N0;
        end
    end    
    
    
    
    
    for k=1:L-1,
        dt*k;
        k
        for i = 1:Nv,
            for j = 1:Mv,
                
                in_laterali_v(i,j)=sum(sum(LLv{i,j}.*xv(:,:,k)));
                in_feedback_v(i,j)=sum(sum(Wmv{i,j}.*xm(:,:,k)));
                Sv(i,j)=in_laterali_v(i,j) + in_feedback_v(i,j); %  
                
            end
        end
        
        
        for i = 1:Na,
            for j = 1:Ma,
                
                in_laterali_a(i,j)=sum(sum(LLa{i,j}.*xa(:,:,k)));
                in_feedback_a(i,j)=sum(sum(Wma{i,j}.*xm(:,:,k)));
                Sa(i,j)=in_laterali_a(i,j) + in_feedback_a(i,j); %  
                
            end
        end
        
        
        for i = 1:Nm,
            for j = 1:Mm,
                Sm(i,j)=sum(sum(LLm{i,j}.*xm(:,:,k)));
            end
        end
        
        
        xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)+Sv-phiv)*pend_v))));
        %xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)+in_feedback_v-phiv)*pend_v)))); % eliminate lateral synapses
        %xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)-phiv)*pend_v)))); %eliminate lateral synapses and feedback synapses     
        xv(:,:,k+1)=ceil(xv(:,:,k+1)*100000000)/100000000;
        
        xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)+Sa-phia)*pend_a))));       
        %xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)+in_feedback_a-phia)*pend_a)))); % eliminate lateral synapses
        %xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)-phia)*pend_a))));  %eliminate lateral synapses and feedback synapses                          
        xa(:,:,1+1)=ceil(xa(:,:,1+1)*100000000)/100000000;
        
        xm(:,:,k+1)=xm(:,:,k)+dt*((1/Tm)*(-xm(:,:,k)+Gm./(1+exp(-(Kv*xv(:,:,k)+Ka*xa(:,:,k)+Sm-phim)*pend_m)))); 
        %xm(:,:,k+1)=xm(:,:,k)+dt*((1/Tm)*(-xm(:,:,k)+Gm./(1+exp(-(Kv*xv(:,:,k)+Ka*xa(:,:,k)-phim)*pend_m))));%eliminate lateral synapses
        xm(:,:,k+1)=ceil(xm(:,:,k+1)*100000000)/100000000;
        
        input_acustico(k)=Ia(posizione_a(1),posizione_a(2),k)+Sa(posizione_a(1),posizione_a(2));
        input_laterali_a(k)=in_laterali_a(posizione_a(1),posizione_a(2));
        input_feedback_a(k)=in_feedback_a(posizione_a(1),posizione_a(2));
        
        input_visivo(k)=Iv(posizione_v(1),posizione_v(2),k)+Sv(posizione_v(1),posizione_v(2));
        input_laterali_v(k)=in_laterali_v(posizione_v(1),posizione_v(2));
        input_feedback_v(k)=in_feedback_v(posizione_v(1),posizione_v(2));
        
        input_multisensoriale(k)=Kv*xv(posizione_v(1),posizione_v(2),k)+Ka*xa(posizione_a(1),posizione_a(2),k)+Sm(posizione_m(1),posizione_m(2));         %
        input_A_multisensoriale(k)=Ka*xa(posizione_a(1),posizione_a(2),k);
        input_V_multisensoriale(k)=Kv*xv(posizione_v(1),posizione_v(2),k);
        input_laterali_multisens(k)=Sm(posizione_m(1),posizione_m(2));     
        
        xvplot(k)=xv(posizione_v(1),posizione_v(2),k);
        xaplot(k)=xa(posizione_a(1),posizione_a(2),k);
        xmplot(k)=xm(posizione_m(1),posizione_m(2),k);
    end
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_acustico input_laterali_a input_feedback_a'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_visivo input_laterali_v input_feedback_v -append'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_multisensoriale input_A_multisensoriale input_V_multisensoriale input_laterali_multisens -append'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' xvplot xaplot xmplot -append'])
    
    clear input_acustico input_laterali_a input_feedback_a
    clear input_visivo input_laterali_v input_feedback_v
    clear input_multisensoriale input_A_multisensoriale input_V_multisensoriale input_laterali_multisens
    clear xvplot xaplot xmplot
end


input_input_v=[5 8 9 10 12 15 18 20 22 25 30 35];
input_input_a=[5 8 9 10 12 15 18 20 22 25 30 35];


for p=1:12
    
    Iv = zeros(Nv,Mv,L);
    xv=zeros(Nv,Mv,L);         
    
    Ia = zeros(Na,Ma,L);
    xa=zeros(Na,Ma,L);         
    
    
    xm=zeros(Nm,Mm,L); 
    
    time_inputV=[0 1200]; 
    timeV=[0 200];
    
    time_inputA=[0 1200]; 
    timeA=[0 200]; 
    
    input_v=0;
    inputvisivo
    input_camporec_visivo_0=input_camporec_visivo;
    clear input_camporec_visivo
    
    input_v=input_input_v(p);
    inputvisivo
    input_camporec_visivo_N0=input_camporec_visivo;
    clear input_camporec_visivo
    
    input_a=0;
    inputacustico
    input_camporec_acustico_0=input_camporec_acustico;
    clear input_camporec_acustico
    
    input_a=input_input_a(p);
    inputacustico
    input_camporec_acustico_N0=input_camporec_acustico;
    clear input_camporec_acustico
    
    for k=1:L-1,
        dt*k;
        k;
        if k >= timeV(1) & k < timeV(2),
            Iv(:,:,k)=input_camporec_visivo_0;
        else
            Iv(:,:,k)=input_camporec_visivo_N0;
        end
        if k >= timeA(1) & k < timeA(2),
            Ia(:,:,k)=input_camporec_acustico_0; 
            %Rv{a1(1),a1(2)};
        else
            Ia(:,:,k)=input_camporec_acustico_N0;
        end
    end    
    
    for k=1:L-1,
        dt*k;
        k
        for i = 1:Nv,
            for j = 1:Mv,
                
                in_laterali_v(i,j)=sum(sum(LLv{i,j}.*xv(:,:,k)));
                in_feedback_v(i,j)=sum(sum(Wmv{i,j}.*xm(:,:,k)));
                Sv(i,j)=in_laterali_v(i,j) + in_feedback_v(i,j); %  
                
            end
        end
        
        
        for i = 1:Na,
            for j = 1:Ma,
                
                in_laterali_a(i,j)=sum(sum(LLa{i,j}.*xa(:,:,k)));
                in_feedback_a(i,j)=sum(sum(Wma{i,j}.*xm(:,:,k)));
                Sa(i,j)=in_laterali_a(i,j) + in_feedback_a(i,j); %  
                
            end
        end
        
        
        for i = 1:Nm,
            for j = 1:Mm,
                Sm(i,j)=sum(sum(LLm{i,j}.*xm(:,:,k)));
            end
        end
        
        
        xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)+Sv-phiv)*pend_v))));
        %xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)+in_feedback_v-phiv)*pend_v)))); %eliminate lateral synapses 
        %xv(:,:,k+1)=xv(:,:,k)+dt*((1/Tv)*(-xv(:,:,k)+Gv./(1+exp(-(Iv(:,:,k)-phiv)*pend_v)))); %eliminate lateral and feedback synapses      
        xv(:,:,k+1)=ceil(xv(:,:,k+1)*100000000)/100000000;
        
        xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)+Sa-phia)*pend_a))));       
        %xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)+in_feedback_a-phia)*pend_a)))); %eliminate lateral synapses
        %xa(:,:,k+1)=xa(:,:,k)+dt*((1/Ta)*(-xa(:,:,k)+Ga./(1+exp(-(Ia(:,:,k)-phia)*pend_a))));  %eliminate lateral and feedback synapses                        
        xa(:,:,1+1)=ceil(xa(:,:,1+1)*100000000)/100000000;
        
        xm(:,:,k+1)=xm(:,:,k)+dt*((1/Tm)*(-xm(:,:,k)+Gm./(1+exp(-(Kv*xv(:,:,k)+Ka*xa(:,:,k)+Sm-phim)*pend_m)))); 
        %xm(:,:,k+1)=xm(:,:,k)+dt*((1/Tm)*(-xm(:,:,k)+Gm./(1+exp(-(Kv*xv(:,:,k)+Ka*xa(:,:,k)-phim)*pend_m))));%eliminate lateral synapses
        xm(:,:,k+1)=ceil(xm(:,:,k+1)*100000000)/100000000;
        
        input_acustico(k)=Ia(posizione_a(1),posizione_a(2),k)+Sa(posizione_a(1),posizione_a(2));
        input_laterali_a(k)=in_laterali_a(posizione_a(1),posizione_a(2));
        input_feedback_a(k)=in_feedback_a(posizione_a(1),posizione_a(2));
        
        input_visivo(k)=Iv(posizione_v(1),posizione_v(2),k)+Sv(posizione_v(1),posizione_v(2));
        input_laterali_v(k)=in_laterali_v(posizione_v(1),posizione_v(2));
        input_feedback_v(k)=in_feedback_v(posizione_v(1),posizione_v(2));
        
        input_multisensoriale(k)=Kv*xv(posizione_v(1),posizione_v(2),k)+Ka*xa(posizione_a(1),posizione_a(2),k)+Sm(posizione_m(1),posizione_m(2));         %
        input_A_multisensoriale(k)=Ka*xa(posizione_a(1),posizione_a(2),k);
        input_V_multisensoriale(k)=Kv*xv(posizione_v(1),posizione_v(2),k);
        input_laterali_multisens(k)=Sm(posizione_m(1),posizione_m(2));     
        
        xvplot(k)=xv(posizione_v(1),posizione_v(2),k);
        xaplot(k)=xa(posizione_a(1),posizione_a(2),k);
        xmplot(k)=xm(posizione_m(1),posizione_m(2),k);
    end
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_acustico input_laterali_a input_feedback_a'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_visivo input_laterali_v input_feedback_v -append'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' input_multisensoriale input_A_multisensoriale input_V_multisensoriale input_laterali_multisens -append'])
    eval(['save Iv',num2str(input_input_v(p)),'_Ia',num2str(input_input_a(p)),' xvplot xaplot xmplot -append'])
    
    clear input_acustico input_laterali_a input_feedback_a
    clear input_visivo input_laterali_v input_feedback_v
    clear input_multisensoriale input_A_multisensoriale input_V_multisensoriale input_laterali_multisens
    clear xvplot xaplot xmplot
end