long rnd_cell(void) // Pick a random cell in the lattice { return rnd_long(modulus); }
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; }