static VALUE rb_gsl_rng_fwrite(VALUE obj, VALUE io) { gsl_rng *h = NULL; FILE *f = NULL; int status, flag = 0; Data_Get_Struct(obj, gsl_rng, h); f = rb_gsl_open_writefile(io, &flag); status = gsl_rng_fwrite(f, h); if (flag == 1) fclose(f); return INT2FIX(status); }
void rng_read_write_test (const gsl_rng_type * T) { unsigned long int test_a[N], test_b[N]; int i; gsl_rng *r = gsl_rng_alloc (T); for (i = 0; i < N; ++i) { gsl_rng_get (r); /* throw away N iterations */ } { /* save the state to a binary file */ FILE *f = fopen("test.dat", "wb"); gsl_rng_fwrite(f, r); fclose(f); } for (i = 0; i < N; ++i) { test_a[i] = gsl_rng_get (r); } { /* read the state from a binary file */ FILE *f = fopen("test.dat", "rb"); gsl_rng_fread(f, r); fclose(f); } for (i = 0; i < N; ++i) { test_b[i] = gsl_rng_get (r); } { int status = 0; for (i = 0; i < N; ++i) { status |= (test_b[i] != test_a[i]); } /*gsl_test (status, "%s, random number generator read and write",*/ /*gsl_rng_name (r));*/ } gsl_rng_free (r); }
/* rng_fwrite writes the state of the rng to a file with filename * NOTE: It would be much better to be able to use the gsl API * function gsl_rng_fwrite to write to any Go writer but I am not * sure how to do that or if it is even possible. */ int rng_fwrite(const char *fileName, const gsl_rng *r) { FILE *file = fopen(fileName, "w"); if (file == NULL) { return 1; } int status = gsl_rng_fwrite(file, r); // we need to flush the stream since otherwise the stream // remains empty. I don't understand why. if (fflush(file) != 0) { return 1; } return status; }
int ggen_rng_save(gsl_rng **r,const char *file) { FILE *f; int e1,e2; f = fopen(file,"wb"); if(!f) return 1; e1 = gsl_rng_fwrite(f,*r); if(e1) error("GSL error: %s\n",gsl_strerror(e1)); e2 = fclose(f); if(e2) error("I/O error: %s\n",strerror(e2)); if(e1 || e2) return 2; else return 0; }
void opiniao(int **rede, par *P, int s[], unsigned long int sem, unsigned long int sem_rede, char out[], char fran[]) { // --------------------------------------------------- // Aqui é a parte da simulação da dinâmica de opinião. // --------------------------------------------------- // Obtendo os parâmetros int *h, k_max=0; // vetor de conectividade e com o estado dos sitios; double epsilon=P->eps, J=P->J, q=P->q; int i, w, t, tt, T=P->T_mcs, nt=P->D_mcs; // passo monte-carlo e iterador de sítios da rede double *tau, rho=0; // campo local de cada sítio e taca de transição FILE *f=fopen(out,"w"), *g, *ff=fopen(fran,"r"); char ou[255]; // Variáveis do gerador gsl_rng *r; // Arquivo de saída de estado strcpy(ou,out); strcat(ou,"~"); // Iniciando a galera h=(int *)calloc(n,I); // Pegar o grau máximo for(i=0;i<n;i++) if(rede[i][0]>k_max) k_max=rede[i][0]; // Constrói as taxas de k=0 até o grau máximo tau=make_tau(k_max,J,q,epsilon); // Iniciando a semente de números aleatórios r = gsl_rng_alloc (gsl_rng_mt19937); gsl_rng_fread(ff,r); fclose(ff); for(i=0;i<n;i++) rho+=s[i]; rho/=((double)n); // Primeiro ponto na saida fprintf(f, "%lf\n", rho); // O monte-carlo começa aqui for(t=0;t<T;t+=nt) { g=fopen(ou,"w"); ff=fopen(fran,"w"); fprintf(g,"# N=%d\tk=%d\tp=%lf\tsem=-1\tJ=%lf\teps=%lf\tq=%lf\tSR=%lu\n",n,K,p,J,epsilon,q,sem_rede); fprintf(g, "# Semente: -1\n"); for(tt=0;tt<nt;tt++) { // Calcular o vetor h dos sítios for(i=0;i<n;i++) { h[i]=0; for(w=1;w<=rede[i][0];w++) { h[i]+=s[rede[i][w]]; } } // Atualiza os sítios for(i=0;i<n;i++) { if(gsl_rng_uniform(r)<tau[h[i]-1+(rede[i][0]+1)*rede[i][0]/2]) s[i]=1; else s[i]=0; } // Calcula a densidade de estados rho=0; for(i=0;i<n;i++) rho+=s[i]; rho/=((double)n); // Imprime saída fprintf(f, "%lf\n", rho); } // Salvando o estado for(i=0;i<n;i++) fprintf(g, "%d\n", s[i]); gsl_rng_fwrite(ff,r); fclose(g); fclose(ff); } free(tau); free(h); // Libera memória do gerador gsl_rng_free (r); }