Distributed cerebellar plasticity implements adaptable gain control (Garrido et al., 2013)

 Download zip file 
Help downloading and running models
Accession:150067
We tested the role of plasticity distributed over multiple synaptic sites (Hansel et al., 2001; Gao et al., 2012) by generating an analog cerebellar model embedded into a control loop connected to a robotic simulator. The robot used a three-joint arm and performed repetitive fast manipulations with different masses along an 8-shape trajectory. In accordance with biological evidence, the cerebellum model was endowed with both LTD and LTP at the PF-PC, MF-DCN and PC-DCN synapses. This resulted in a network scheme whose effectiveness was extended considerably compared to one including just PF-PC synaptic plasticity. Indeed, the system including distributed plasticity reliably self-adapted to manipulate different masses and to learn the arm-object dynamics over a time course that included fast learning and consolidation, along the lines of what has been observed in behavioral tests. In particular, PF-PC plasticity operated as a time correlator between the actual input state and the system error, while MF-DCN and PC-DCN plasticity played a key role in generating the gain controller. This model suggests that distributed synaptic plasticity allows generation of the complex learning properties of the cerebellum.
Reference:
1 . Garrido JA, Luque NR, D'Angelo E, Ros E (2013) Distributed cerebellar plasticity implements adaptable gain control in a manipulation task: a closed-loop robotic simulation Front. Neural Circuits 7:159:1-20
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Cerebellum;
Cell Type(s): Cerebellum deep nucleus neuron;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program; MATLAB; Simulink;
Model Concept(s): Long-term Synaptic Plasticity;
Implementer(s): Garrido, Jesus A [jesus.garrido at unipv.it]; Luque, Niceto R. [nluque at ugr.es];
     TrajectoryTime=1;
     TimeStep=0.002;
     SimulationTime=100;
     FileSuffix = 'AllLearning10';
     ResultsFolder = './Register/';
     TorqueFile = strcat(ResultsFolder,'Torque',FileSuffix,'.mat');
     TorqueIndFile = strcat(ResultsFolder,'Torque1',FileSuffix,'.mat');
     PCActivityFile = strcat(ResultsFolder,'PCActivity',FileSuffix,'.mat');
     MFDCNWeightFile = strcat(ResultsFolder,'MFDCNWeight',FileSuffix,'.mat');
     PCDCNWeightFile = strcat(ResultsFolder,'PCDCNWeight',FileSuffix,'.mat');
     ErrorPositionFile = strcat(ResultsFolder,'ErrorPosition',FileSuffix,'.mat');
     
     OutputVideoName = './Videos/Learning10kgJoint1';
     
     %TrajectoriesToShow = 1:10:1000;
     TrajectoriesToShow = 1:1:100;
     FpsVideo = 20;
     ScreenSize = [1600 900];
     %MaximumSizePerVideo = 512*2^20; % Maximum size for every video (in B)
     MaximumSizePerVideo = 200*2^20; % Maximum size for every video (in B)
     
     PFPCWeightsToShow = [50 175 300 400]; % Always 4 different PFs
     
     JointToShow = 1;
     JointColors = 'brg';
          
     LineWidth = 2;
     
     TotalSize = length(TrajectoriesToShow)*FpsVideo*ScreenSize(1)*ScreenSize(2)*3;
     
     disp(['Video total size: ' num2str(TotalSize/2^20) 'MB']);
     
     if (TotalSize>MaximumSizePerVideo)
         VideoParts = floor(TotalSize/MaximumSizePerVideo)+1;
         NumberOfFramesPerPart = floor(length(TrajectoriesToShow)*FpsVideo/VideoParts); 
         disp(['Splitting in ' num2str(VideoParts) ' parts of ' num2str(NumberOfFramesPerPart) ' frames each']);
     else
         VideoParts = 1;
         NumberOfFramesPerPart = length(TrajectoriesToShow)*FpsVideo;
     end
     
     Delay=0;
     NumStep=round(TrajectoryTime/TimeStep);
     NumTrayectories=round(SimulationTime/TrajectoryTime);
     
     Torque = load(TorqueFile);
     Torque = Torque.ans;
     
     Time = Torque(1,:);
     
     CorrectiveTorques = Torque(2:4,:);
     IdealTorques = Torque(8:10,:);
     ErrorTorques = IdealTorques - CorrectiveTorques;
     
     clear Torque;
     
     IndividualTorques = load(TorqueIndFile);
     IndividualTorques = IndividualTorques.ans(2:end,:);
          
     DCNActivity = load(TorqueIndFile);
     DCNActivity = DCNActivity.ans(2:end,:);
     
     PCActivity = load(PCActivityFile);
     PCActivity = PCActivity.ans(2:end,:);
          
     MFDCNWeight = load(MFDCNWeightFile);
     MFDCNWeight = MFDCNWeight.ans(2:7,:);
     
     PCDCNWeight = load(PCDCNWeightFile);
     PCDCNWeight = PCDCNWeight.ans(2:7,:);
          
     
     ErrorPosition = load(ErrorPositionFile);
     ErrorPosition = ErrorPosition.ans(2:4,:);
     
     for i=1:NumTrayectories,
           Mae1(i)=mae(ErrorPosition(1,NumStep*(i-1)+1:(NumStep*(i))-1));
           Mae2(i)=mae(ErrorPosition(2,NumStep*(i-1)+1:(NumStep*(i))-1));
           Mae3(i)=mae(ErrorPosition(3,NumStep*(i-1)+1:(NumStep*(i))-1));
     end
     MaeTotal = Mae1+Mae2+Mae3;
     
     % Plot the 3D trajectories
     t = 0:TimeStep:(TrajectoryTime-TimeStep);
     A=0.1;
     % Joint positions 
     qtdes1 =A*sin(2*pi*t);
     qtdes2 =A*sin(2*pi*t+pi/4);
     qtdes3 =A*sin(2*pi*t+pi/2); 
     
     [xdes, ydes, zdes] = cin_dir_och3joints_funct(qtdes1,qtdes2,qtdes3);
     
 
     fig10 = figure(10);
     set(fig10,'Position',[1 1 ScreenSize]); %make the frame size fixed
     %set(fig10,'Position',[1 1 800 800]); %make the frame size fixed
     
     % Set 3D trajectory axes
     TrajPlot = subplot(5,2,[1 3]);
     ax=get(TrajPlot,'Position');
     %ax(2)=ax(2)+0.05;
     %ax(4)=ax(4)-0.05; %or wathever
     %set(TrajPlot,'Position',ax);
     grid on;
     axis([0.78 0.789 -0.08 0.08 0 1]);
     campos([0.8 -0.25 8.6])
     xlabel('x(m)');
     xlabh = get(gca,'XLabel');
     set(xlabh,'Position',[0.801 -0.386 8.398]);
     ylabel('y(m)');
     ylabh = get(gca,'YLabel');
     set(ylabh,'Position',[0.807 -0.277 8.39]);
     zlabel('z(m)');
     title('3D Trajectory','FontSize', 18);
     set(gca,'defaultlinelinewidth',3); 
     set(gca,'nextplot','replacechildren');
 
     
     % Set corrective torque axes
     TorquePlot = subplot(5,2,[5 7]);
     ax=get(TorquePlot,'Position');
     ax(2)=ax(2)+0.02;
     ax(4)=ax(4)-0.02; %or wathever
     set(TorquePlot,'Position',ax);
     axis([0 1 min(CorrectiveTorques(:)) max(CorrectiveTorques(:))]);
     xlabel('Time(s)');
     ylabel('Torque (Nm)');
     title('Corrective Torques','FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     % Set MAE axes
     MAEPlot = subplot(5,2,9);
     axis([0 max(TrajectoriesToShow) min(log10(MaeTotal(TrajectoriesToShow))) max(log10(MaeTotal(TrajectoriesToShow)))]);
     xlabel('Trial');
     ylabel('log(MAE)');
     title('Mean Average Error','FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     
     % Set PFPC axes
     PFPCWeightPlot = subplot(5,2,2);
     axis([0 max(TrajectoriesToShow) 0 1]);
     xlabel('Trial');
     ylabel('PF-PC Weight');
     title(['PF-PC Weight - Joint ' num2str(JointToShow)],'FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     
     % Set PC activity axes
     PCActPlot = subplot(5,2,4);
     axis([0 1 0 1]);
     xlabel('Time(s)');
     ylabel('Firing Rate');
     title(['PC Activity - Joint ' num2str(JointToShow)],'FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     % Set DCN activity axes
     DCNActPlot = subplot(5,2,6);
     LocalValues = IndividualTorques((JointToShow*2-1):(JointToShow*2),:);
     axis([0 1 0 max(LocalValues(:))]);
     xlabel('Time(s)');
     ylabel('Firing Rate');
     title(['DCN Activity - Joint ' num2str(JointToShow)],'FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     % Set MF-DCN weight axes
     MFDCNWeightPlot = subplot(5,2,8);
     LocalValues = MFDCNWeight((JointToShow*2-1):(JointToShow*2),:);
     axis([0 max(TrajectoriesToShow) 0 max(LocalValues(:))]);
     xlabel('Trial');
     ylabel('MF-DCN Weight');
     title(['MF-DCN Weight - Joint ' num2str(JointToShow)],'FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren')
     
     % Set PC-DCN weight axes
     PCDCNWeightPlot = subplot(5,2,10);
     LocalValues = PCDCNWeight((JointToShow*2-1):(JointToShow*2),:);
     axis([0 max(TrajectoriesToShow) 0 max(LocalValues(:))]);
     xlabel('Trial');
     ylabel('PC-DCN Weight');
     title(['PC-DCN Weight - Joint ' num2str(JointToShow)],'FontSize', 13);
     set(gca,'defaultlinelinewidth',LineWidth); 
     set(gca,'nextplot','replacechildren');
        
     
         
     StepPerFrame = NumStep/FpsVideo;
     nframe=FpsVideo*length(TrajectoriesToShow);
     CurrentVideoPart = 1;
     CurrentPartFrame = 1;
     mov(1:NumberOfFramesPerPart)= struct('cdata',[],'colormap',[]);
     for j=1:length(TrajectoriesToShow),
         i = TrajectoriesToShow(j);
         InitIndex = (NumStep*(i-1)+1);
         EndIndex = (NumStep*i);
         LocalTime = 0:TimeStep:((NumStep-1)*TimeStep);
         qtreal1 = qtdes1-ErrorPosition(1,InitIndex:EndIndex);
         qtreal2 = qtdes2-ErrorPosition(2,InitIndex:EndIndex);
         qtreal3 = qtdes3-ErrorPosition(3,InitIndex:EndIndex);
         [xreal, yreal, zreal] = cin_dir_och3joints_funct(qtreal1,qtreal2,qtreal3);
         title(TrajPlot,['Trial ' num2str(i)],'FontSize', 20);
         
         PFPCIndexes = [0:(i-1)]*NumStep;
         
         % Plot PF-PC weight
         plot(PFPCWeightPlot, 1:i, PCActivity(JointToShow*2-1,PFPCIndexes+PFPCWeightsToShow(1)),['-' JointColors(JointToShow)],...
             1:i, PCActivity(JointToShow*2-1,PFPCIndexes+PFPCWeightsToShow(2)),['-' JointColors(JointToShow)],...
             1:i, PCActivity(JointToShow*2-1,PFPCIndexes+PFPCWeightsToShow(3)),['-' JointColors(JointToShow)],...
             1:i, PCActivity(JointToShow*2-1,PFPCIndexes+PFPCWeightsToShow(4)),['-' JointColors(JointToShow)]);
            
                  
         for k=1:FpsVideo,
            LocalIndex = round(StepPerFrame*k)-1;
            
            % Plot 3D Trajectory
            plot3(TrajPlot,xdes,ydes,zdes,'r',xreal(1:LocalIndex),yreal(1:LocalIndex),zreal(1:LocalIndex),'k');
            
            % Plot corrective torques
            plot(TorquePlot, LocalTime(1:LocalIndex), CorrectiveTorques(1,InitIndex:(InitIndex+LocalIndex-1)), ['-' JointColors(1)],...
                LocalTime, IdealTorques(1,InitIndex:EndIndex), ['--' JointColors(1)],...
                LocalTime(1:LocalIndex), CorrectiveTorques(2,InitIndex:(InitIndex+LocalIndex-1)), ['-' JointColors(2)],...
                LocalTime, IdealTorques(2,InitIndex:EndIndex), ['--' JointColors(2)],...
                LocalTime(1:LocalIndex), CorrectiveTorques(3,InitIndex:(InitIndex+LocalIndex-1)), ['-' JointColors(3)],...
                LocalTime, IdealTorques(3,InitIndex:EndIndex), ['--' JointColors(3)]);
            legend(TorquePlot,'Joint 1 - Real','Joint 1 - Ideal','Joint 2 - Real',...
                'Joint 2 - Ideal','Joint 3 - Real','Joint 3 - Ideal','Location','SouthEast');
            
            % Plot MAE evolution
            plot(MAEPlot, 1:i, log10(MaeTotal(1:i)),'k');
                 
            % Plot PC activity
            plot(PCActPlot, LocalTime(1:LocalIndex), PCActivity(JointToShow*2-1,InitIndex:(InitIndex+LocalIndex-1)),['-' JointColors(JointToShow)],...
                LocalTime(1:LocalIndex), PCActivity(JointToShow*2,InitIndex:(InitIndex+LocalIndex-1)),['--' JointColors(JointToShow)]);
                 
            
            % Plot DCN activity
            plot(DCNActPlot, LocalTime(1:LocalIndex), DCNActivity(JointToShow*2-1,InitIndex:(InitIndex+LocalIndex-1)),['-' JointColors(JointToShow)],...
                LocalTime(1:LocalIndex), DCNActivity(JointToShow*2,InitIndex:(InitIndex+LocalIndex-1)),['--' JointColors(JointToShow)]);
            
            % Plot MF-DCN weight
            plot(MFDCNWeightPlot, Time(1:(InitIndex+LocalIndex-1)), MFDCNWeight(JointToShow*2-1,1:(InitIndex+LocalIndex-1)),['-' JointColors(JointToShow)],...
                Time(1:(InitIndex+LocalIndex-1)), MFDCNWeight(JointToShow*2,1:(InitIndex+LocalIndex-1)),['--' JointColors(JointToShow)]);
            legend(MFDCNWeightPlot,'Agonist','Antagonist','Location','East');
            
            % Plot PC-DCN weight
            plot(PCDCNWeightPlot, Time(1:(InitIndex+LocalIndex-1)), PCDCNWeight(JointToShow*2-1,1:(InitIndex+LocalIndex-1)),['-' JointColors(JointToShow)],...
                Time(1:(InitIndex+LocalIndex-1)), PCDCNWeight(JointToShow*2,1:(InitIndex+LocalIndex-1)),['--' JointColors(JointToShow)]);
            
            
            mov(CurrentPartFrame)=getframe(gcf);
            
            if (CurrentPartFrame==NumberOfFramesPerPart)
                disp(['Writing video part ' num2str(CurrentVideoPart)]);
                movie2avi(mov, [OutputVideoName num2str(CurrentVideoPart) '.avi'], 'compression', 'None','fps',FpsVideo);
                mov(1:NumberOfFramesPerPart)= struct('cdata',[],'colormap',[]);
                CurrentVideoPart = CurrentVideoPart + 1;
                CurrentPartFrame = 0;
            end
            
            CurrentPartFrame = CurrentPartFrame + 1;
            
         end
     end
     
     beep;

Loading data, please wait...