long rnd_cell(void)					// Pick a random cell in the lattice
{
	return rnd_long(modulus);
}
Ejemplo n.º 2
0
int main(int argc,char **argv)
{
  unsigned int outstrlen=0,offset,hdim,wdim=1;
  int i,j;
  unsigned int *future,has_future;
  unsigned long count;
  long li,lj;
  char *outstring,*infile,*fieldfile,*wcol;
  double **series,*sermin,*serinter,**dfuture,max,**cast,sweights;
  double *new,*drift,**diffusion,**gamma;
  struct sfound sf;
  FILE *fout,*ffield;

  if (scan_help(argc,argv))
    show_options(argv[0]);

  for (i=0;i<argc;i++) {
    outstrlen += strlen(argv[i]);
    outstrlen++;
  }
  check_alloc(outstring=(char*)malloc(sizeof(char)*(outstrlen+8)));
  sprintf(outstring,"#Prog: ");
  offset=7;
  for (i=0;i<argc;i++) {
    sprintf(outstring+offset,"%s ",argv[i]);
    offset += (strlen(argv[i])+1);
  }

  scan_options(argc,argv);

  if (pars.MINN < (pars.DIM+1)) {
    fprintf(stderr,"Too few neighbors. System is underdetermined.\n");
    exit(LANGEVIN_MAIN_TOO_FEW_MINN);
  }

  infile=search_datafile(argc,argv,NULL,VERBOSITY);
  if (infile == NULL) {
    fprintf(stderr,"No input datafile found.\n");
    exit(LANGEVIN_MAIN_NO_INPUTFILE);
  }
  
  if (OUTFILE == NULL) {
    check_alloc(OUTFILE=(char*)calloc(strlen(infile)+6,(size_t)1));
    sprintf(OUTFILE,"%s.lang",infile);
    check_alloc(fieldfile=(char*)calloc(strlen(infile)+12,(size_t)1));
    sprintf(fieldfile,"%s.lang.field",infile);
  }
  else {
    check_alloc(fieldfile=(char*)calloc(strlen(OUTFILE)+7,(size_t)1));
    sprintf(fieldfile,"%s.field",OUTFILE);
  }
  OUTFILE=test_outfile(OUTFILE);
  if (!nofields)
    fieldfile=test_outfile(fieldfile);

  if (COLUMN == NULL)
    series=(double**)get_multi_series(infile,&(pars.LENGTH),EXCLUDE,
				      &(pars.DIM),"",dimset,VERBOSITY);
  else
    series=(double**)get_multi_series(infile,&(pars.LENGTH),EXCLUDE,
				      &(pars.DIM),COLUMN,dimset,VERBOSITY);

  init_noise(pars,seed);

  if (INNOISE > 0.0)
    for (li=0;li<pars.LENGTH;li++)
      for (i=0;i<pars.DIM;i++)
	series[i][li] += 2.0*INNOISE*
	  ((double)rnd_long()/(double)ULONG_MAX-0.5);

  check_alloc(sermin=malloc(sizeof(double)*pars.DIM));
  check_alloc(serinter=malloc(sizeof(double)*pars.DIM));
  //  rescale_data(series,pars,sermin,serinter);

  for (i=0;i<pars.DIM;i++) {
    sermin[i]=0.0;
    serinter[i]=1.0;
  }
  max=serinter[0];
  for (i=1;i<pars.DIM;i++)
    if (serinter[i] > max)
      max=serinter[i];

  for (i=0;i<pars.DIM;i++) {
    for (j=0;j<pars.LENGTH;j++)
      series[i][j] /= max;
  }
  if (pars.maxr > 0.0)
    pars.maxr /= max;

  hdim=1;
  pars.hdim=hdim;

  check_alloc(future=(unsigned int*)malloc(sizeof(int)*pars.LENGTH));
  if (WHICHFUTURE>0) {
    check_alloc(wcol=(char*)calloc((size_t)10,(size_t)1));
    sprintf(wcol,"%u",WHICHFUTURE);
    dfuture=(double**)get_multi_series(infile,&(pars.LENGTH),EXCLUDE,
				       &wdim,wcol,1,0L);
    for (li=0;li<hdim;li++)
      future[li]=0;
    for (li=hdim;li<pars.LENGTH-1;li++) {
      has_future= (dfuture[0][li]>0.0);
      for (lj=1;lj<=hdim;lj++)
	has_future &= (dfuture[0][li-lj]>0.0);
      future[li]=has_future;
    }
    future[pars.LENGTH-1]=0;
    free(dfuture);
  }
  else {
    for (li=0;li<pars.LENGTH-1;li++)
      future[li]=1;
    future[pars.LENGTH-1]=0;
    for (li=0;li<hdim;li++)
      future[li]=0;
  }

  check_alloc(sf.found=(unsigned long*)
	      malloc(sizeof(unsigned long)*pars.LENGTH));
  check_alloc(sf.distance=(double*)malloc(sizeof(double)*pars.LENGTH));
  check_alloc(sf.weight=(double*)malloc(sizeof(double)*pars.LENGTH));
  check_alloc(sf.count=(unsigned long*)malloc(sizeof(unsigned long)));
  check_alloc(sf.aveps=(double*)malloc(sizeof(double)));
  sf.count[0]=0;
  sf.aveps[0]=0.0;
  check_alloc(cast=(double**)malloc(sizeof(double*)*pars.DIM));
  for (i=0;i<pars.DIM;i++)
    check_alloc(cast[i]=(double*)malloc(sizeof(double)*(hdim+1)));
  check_alloc(new=(double*)malloc(sizeof(double)*pars.DIM));

  check_alloc(drift=(double*)malloc(sizeof(double)*pars.DIM));
  check_alloc(diffusion=(double**)malloc(sizeof(double*)*pars.DIM));
  check_alloc(gamma=(double**)malloc(sizeof(double*)*pars.DIM));
  for (i=0;i<pars.DIM;i++) {
    check_alloc(diffusion[i]=(double*)malloc(sizeof(double)*pars.DIM));
    check_alloc(gamma[i]=(double*)malloc(sizeof(double)*pars.DIM));
  }

  for (i=0;i<=hdim;i++)
    for (j=0;j<pars.DIM;j++)
      cast[j][hdim-i]=series[j][pars.LENGTH-1-i];

  pars.minminn=(unsigned long)((3.*pars.DIM+3.)/2.0+0.5);
  init_neighbor_search_circ(series,pars,future);

  /* print program call and column labels */
  fout=fopen(OUTFILE,"w");
  fprintf(fout,"%s\n",outstring);
#if defined(MAXNORM)
  fprintf(fout,"#Norm: Maxnorm\n");
#else
  fprintf(fout,"#Norm: L2 Norm\n");
#endif
#if defined(WEIGHTS)
  if (pars.maxr > 0.0)
    fprintf(fout,"#Weights: on WFACT = %lf maxr = %lf\n",WFACT,pars.maxr*max);
  else
    fprintf(fout,"#Weights: on WFACT = %lf maxr not set\n",WFACT);
#else
  fprintf(fout,"#Weights: off\n");
#endif
  fprintf(fout,"#Content: ");
  for (i=0;i<pars.DIM;i++)
    fprintf(fout,"x%d ",i+1);
  fprintf(fout,"\n");
  fflush(fout);

  if (!nofields) {
    ffield=fopen(fieldfile,"w");
    fprintf(ffield,"%s\n",outstring);
#if defined(MAXNORM)
    fprintf(ffield,"#Norm: Maxnorm\n");
#else
    fprintf(ffield,"#Norm: L2 Norm\n");
#endif
#if defined(WEIGHTS)
  if (pars.maxr > 0.0)
    fprintf(ffield,"#Weights: on WFACT = %lf maxr = %lf\n",WFACT,pars.maxr*max);
  else
    fprintf(ffield,"#Weights: on WFACT = %lf maxr not set\n",WFACT);
#else
    fprintf(ffield,"#Weights: off\n");
#endif
    fprintf(ffield,"#Content: ");
    for (i=0;i<pars.DIM;i++)
      for (j=0;j<pars.EMB;j++)
	if (pars.EMB>1) {
	  fprintf(ffield,"x%d_%d ",i+1,j+1);
	}
	else {
	  fprintf(ffield,"x%d ",i+1);
	}
    for (i=0;i<pars.DIM;i++)
      fprintf(ffield,"f%d ",i+1);
    for (i=0;i<pars.DIM;i++)
      for (j=0;j<pars.DIM;j++)
	fprintf(ffield,"g_%d_%d ",i+1,j+1);
    for (i=0;i<pars.DIM;i++)
      for (j=0;j<=i;j++)
	fprintf(ffield,"K_%d_%d ",i+1,j+1);
#if defined(WEIGHTS)
    fprintf(ffield,"distance sweights\n");
#else
    fprintf(ffield,"distance\n");
#endif
    fflush(ffield);
  }

  count=0;
  while (count <FLENGTH) {
    search_neighbors_circ(series,cast,pars,sf);
    get_fields_no_circ(series,pars,sf,drift,gamma,diffusion,cast);
    make_cast_no_circ(cast,new,pars,drift,gamma,diffusion);

    for (i=0;i<pars.DIM;i++)
      fprintf(fout,"%lf ",new[i]*max+sermin[i]);
    fprintf(fout,"\n");
    fflush(fout);

    if (!nofields) {
      for (i=0;i<pars.DIM;i++)
	for (j=0;j<pars.EMB;j++)
	  fprintf(ffield,"%e ",cast[i][hdim-j*pars.DELAY]*max+sermin[i]);
      for (i=0;i<pars.DIM;i++)
	fprintf(ffield,"%e ",drift[i]*max);
      for (i=0;i<pars.DIM;i++)
	for (j=0;j<pars.DIM;j++)
	  fprintf(ffield,"%e ",gamma[i][j]);
      for (i=0;i<pars.DIM;i++)
	for (j=0;j<=i;j++)
	  fprintf(ffield,"%e ",diffusion[i][j]*max);
#if defined(WEIGHTS)
      sweights=sf.weight[0];
      for (i=1;i<pars.MINN;i++)
	sweights += sf.weight[i];
      fprintf(ffield,"%e %lf\n",sf.distance[pars.MINN-1]*max,sweights);
#else
      fprintf(ffield,"%e\n",sf.distance[pars.MINN-1]*max);
#endif
      fflush(ffield);
    }
    for (i=1;i<=hdim;i++)
      for (j=0;j<pars.DIM;j++)
	cast[j][i-1]=cast[j][i];
    for (i=0;i<pars.DIM;i++)
      cast[i][hdim]=new[i];
    count++;
  }
  fclose(fout);
  if (!nofields)
    fclose(ffield);

  return 0;
}