Cerebellar memory consolidation model (Yamazaki et al. 2015)

 Download zip file 
Help downloading and running models
Accession:180823
"Long-term depression (LTD) at parallel fiber-Purkinje cell (PF-PC) synapses is thought to underlie memory formation in cerebellar motor learning. Recent experimental results, however, suggest that multiple plasticity mechanisms in the cerebellar cortex and cerebellar/vestibular nuclei participate in memory formation. To examine this possibility, we formulated a simple model of the cerebellum with a minimal number of components based on its known anatomy and physiology, implementing both LTD and long-term potentiation (LTP) at PF-PC synapses and mossy fiber-vestibular nuclear neuron (MF-VN) synapses. With this model, we conducted a simulation study of the gain adaptation of optokinetic response (OKR) eye movement. Our model reproduced several important aspects of previously reported experimental results in wild-type and cerebellum-related gene-manipulated mice. ..."
Reference:
1 . Yamazaki T, Nagao S, Lennon W, Tanaka S (2015) Modeling memory consolidation during posttraining periods in cerebellovestibular learning. Proc Natl Acad Sci U S A 112:3541-6 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Connectionist Network;
Brain Region(s)/Organism:
Cell Type(s): Cerebellum Purkinje GABA cell; Cerebellum deep nucleus neuron;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s): Simplified Models; Synaptic Plasticity; Long-term Synaptic Plasticity; Hebbian plasticity;
Implementer(s): Yamazaki, Tadashi ;
Search NeuronDB for information about:  Cerebellum Purkinje GABA cell;
/*
  Author: YAMAZAKI, Tadashi (NumericalBrain.Org)
 */

#include<stdio.h>
#include<stdlib.h>
#include "param.h"

extern double f_dw(const int, const int, const double, const double);
extern double f_dw4(const int, const int, const double, const double);
extern double f_dw_wulff(const int, const int, const double, const double);

extern double f_dv(const int, const int, const double, const double);
extern double f_dv_shutdown4(const int, const int, const double, const double);
extern double f_dv_muscimol(const int, const int, const double, const double);
extern double f_dv_muscimol30(const int, const int, const double, const double);
extern double f_dv_muscimol60(const int, const int, const double, const double);
extern double f_dv_ltd(const int, const int, const double, const double);
extern double f_dv_wulff(const int, const int, const double, const double);

extern double f_okr(const int, const int, const double, const double);
extern double f_okr_shutdown4(const int, const int, const double, const double);
extern double f_okr_muscimol(const int, const int, const double, const double);
extern double f_okr_muscimol30(const int, const int, const double, const double);
extern double f_okr_muscimol60(const int, const int, const double, const double);
extern double f_okr_ltd(const int, const int, const double, const double);
extern double f_okr_wulff(const int, const int, const double, const double);

// Training paradigms
int training_5days(const int t)
{
  return (1*day <= t && t < 6*day && t%day < 1*hour) ? 1 : 0;
}
int training_8days(const int t)
{
  return (1*day <= t && t < 9*day && t%day < 1*hour) ? 1 : 0;
}
int training_mass(const int t)
{
  return (1*day <= t && t < 2*day && t%day < 1*hour) ? 1 : 0;
}
int training_space_15minsx4days(const int t)
{
  return (1*day <= t && t < 5*day && t%day < 15*min) ? 1 : 0;
}
int training_space_15minsx4hours(const int t)
{
  return ((1*day + 0*hour +  0*min <= t && t <= 1*day + 0*hour + 15*min) ||
	  (1*day + 1*hour + 15*min <= t && t <= 1*day + 1*hour + 30*min) ||
	  (1*day + 2*hour + 30*min <= t && t <= 1*day + 2*hour + 45*min) ||
	  (1*day + 3*hour + 45*min <= t && t <= 1*day + 3*hour + 60*min)) ? 1 : 0;
}
int training_space_15minsx2hours(const int t)
{
  return ((1*day +  0*min +  0*min <= t && t <= 1*day +  0*min + 15*min) ||
	  (1*day + 30*min + 15*min <= t && t <= 1*day + 30*min + 30*min) ||
	  (1*day + 60*min + 30*min <= t && t <= 1*day + 60*min + 45*min) ||
	  (1*day + 90*min + 45*min <= t && t <= 1*day + 90*min + 60*min)) ? 1 : 0;
}
int training_space_7_5minsx8days(const int t)
{
  return (1*day <= t && t < 9*day && t%day < 7.5*min) ? 1 : 0;
}

void transfer(const char *filename,
	      int (*training_pattern)(const int),
	      double (*f_dw)(const int, const int, const double, const double),
	      double (*f_dv)(const int, const int, const double, const double),
	      double (*f_okr)(const int, const int, const double, const double))
{
  double w = w_0, v = v_0;
  FILE *file;

  file = fopen(filename, "w");

  for(int t = 0; t < training_daymax; t += min){
    double okr, dw, dv;

    okr =(*f_okr)(training_pattern(t), t, v, w);
    dw = (*f_dw)(training_pattern(t), t, v, w);
    dv = (*f_dv)(training_pattern(t), t, v, w);
    fprintf(file, "%f %f %f %f\n", (double)t/day, okr, w, v);
    w += min*dw;
    if (w < 0){ w = 0; }
    v += min*dv;
    if (v < 0){ v = 0; }
  }

  fclose(file);
}

int main(void)
{
#if 1
  transfer("normal.dat", training_5days,
	   f_dw, f_dv, f_okr);
  transfer("normal4.dat", training_5days,
	   f_dw4, f_dv, f_okr);
  transfer("shutdown4.dat", training_5days,
	   f_dw, f_dv_shutdown4, f_okr_shutdown4);
  transfer("muscimol.dat", training_5days,
	   f_dw, f_dv_muscimol, f_okr_muscimol);
  transfer("muscimol30.dat", training_5days,
	   f_dw, f_dv_muscimol30, f_okr_muscimol30);
  transfer("muscimol60.dat", training_5days,
	   f_dw, f_dv_muscimol60, f_okr_muscimol60);

  transfer("mass.dat", training_mass,
           f_dw, f_dv, f_okr);
  transfer("space1.dat", training_space_15minsx4hours,
           f_dw, f_dv, f_okr);
  transfer("space2.dat", training_space_15minsx4days,
           f_dw, f_dv, f_okr);
  transfer("space3.dat", training_space_7_5minsx8days,
           f_dw, f_dv, f_okr);
#endif

#if 0
  // Set w_0=1.1, v_0=0.0 and c_okr=1.0.
  transfer("ltd.dat", training_8days,
	   f_dw, f_dv_ltd, f_okr_ltd);
#endif

#if 0
  // Set v_0 = 0.0.
  transfer("wulff.dat", training_8days,
	   f_dw_wulff, f_dv_wulff, f_okr_wulff);
#endif

  return 0;
}