Neural modeling of an internal clock (Yamazaki and Tanaka 2008)

 Download zip file 
Help downloading and running models
Accession:115966
"We studied a simple random recurrent inhibitory network. Despite its simplicity, the dynamics was so rich that activity patterns of neurons evolved with time without recurrence due to random recurrent connections among neurons. The sequence of activity patterns was generated by the trigger of an external signal, and the generation was stable against noise.... Therefore, a time passage from the trigger of an external signal could be represented by the sequence of activity patterns, suggesting that this model could work as an internal clock. ..."
Reference:
1 . Yamazaki T, Tanaka S (2005) Neural modeling of an internal clock. Neural Comput 17:1032-58 [PubMed]
Citations  Citation Browser
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):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s): Temporal Pattern Generation; Spatio-temporal Activity Patterns; Rate-coding model neurons;
Implementer(s):
//
// Calculation of similarity index (Eq. (2.2) in p. 1034)
//

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<gd.h>

#define N 1000			// # of neurons
#define T 1000			// # of time steps
#define nGrayScale	256	// 8 bit gray scale for similarity matrix

double *z, *similarity;
#define zid(t,i) ((i)+N*(t))
#define sid(t,s) ((s)+ T*(t))

// Read "activity.dat" and store the activity in array z.
void input(char *filename)
{
  FILE *file;

  file = fopen(filename, "r");
  if (!file){
    fprintf(stderr, "cannot open %s.\n", filename);
    exit(1);
  }
  {
    int t, i;
    char buf[1024];
    for(t = 0; t < T; t++){
      for(i = 0; i < N; i++){
	fgets(buf, 1024, file);
	z[zid(t,i)] = atof(buf);
      }
    }
  }

  fclose(file);
}

// Compute the similarity index and generate the PNG file of the matrix.
void similarity_index(char *prefix)
{
  int t, t1, t2, i, j;
  double r, norm[T];

  gdImagePtr im;
  FILE *file;
  int gray[nGrayScale], index;
  char filename[1024];

  // Preparing the square norms (denominator of Eq. (2.2))
  for(t = 0; t < T; t++){
    for(r = 0, i = 0; i < N; i++){
      r += z[zid(t,i)]*z[zid(t,i)];
    }
    norm[t] = sqrt(r);
  }
  for(t1 = 0; t1 < T; t1++){
    for(t2 = t1; t2 < T; t2++){
      // Computing the numerator of Eq. (2.2)
      for(r = 0, i = 0; i < N; i++){
	r += z[zid(t1,i)]*z[zid(t2,i)];
      }
      // Computing the similarity index at (t1, t2).
      if (norm[t1] == 0 || norm[t2] == 0){
	similarity[sid(t1,t2)] = 0;
      }else{
	similarity[sid(t1,t2)] = r/(norm[t1]*norm[t2]);
      }
      similarity[sid(t2,t1)] = similarity[sid(t1,t2)];
    }
  }

  // Creatting the PNG file of the similarity matrix.
  im = gdImageCreate(T, T);
  for(i = 0; i < nGrayScale; i++){
    gray[i] = gdImageColorAllocate(im, i, i, i);
  }
  for(i = 0; i < T; i++){
    for(j = 0; j < T; j++){
      index = floor((nGrayScale-1)*similarity[sid(i,j)]);
      gdImageSetPixel(im, i, j, gray[index]);
    }
  }
  sprintf(filename, "%s.png", prefix);
  file = fopen(filename, "wb");
  gdImagePng(im, file);
  fclose(file);
  gdImageDestroy(im);

  // Plotting 0, 200, 400, 600, 800 th rows of the matrix
  sprintf(filename, "%s.dat", prefix);
  file = fopen(filename, "w");
  for(t1 = 0; t1 < T; t1 += 200){
    for(t2 = 0; t2 < T; t2++){
      fprintf(file, "%d %f\n", t2, similarity[sid(t1,t2)]);
    }
    fprintf(file, "\n\n");
  }
  fclose(file);
}
int main(int argc, char *argv[])
{
  // <input> activity.dat
  // <output_prefix> prefix for filenames of the similarity matrix.
  if (argc < 3){
    fprintf(stderr, "usage: %s <input> <output_prefix>\n", argv[0]);
    exit(1);
  }
  z = malloc(N*T*sizeof(double));
  if (!z){
    fprintf(stderr, "cannot malloc z.\n");
    exit(1);
  }
  similarity = malloc(T*T*sizeof(double));
  if (!similarity){
    fprintf(stderr, "cannot malloc similarity.\n");
    exit(1);
  }

  input(argv[1]);
  similarity_index(argv[2]);

  free(similarity);
  free(z);
  exit(0);
}