CCResult check_conformance(const Program& program, const Observer& observer, MemorySetup msetup) { try { auto fp = fixed_point(program, observer, msetup); return CCResult(std::move(fp)); } catch (std::runtime_error& e) { return CCResult(e.what()); } }
void kde(double *data, int length, int n ,double dataMIN, double dataMAX, double **out_density, double **out_x, double *bw) { XML_IN; /* * function [bandwidth,density,xmesh,cdf]=kde(data,n,dataMIN,dataMAX) * Reference: * Kernel density estimation via diffusion * Z. I. Botev, J. F. Grotowski, and D. P. Kroese (2010) * Annals of Statistics, Volume 38, Number 5, pages 2916-2957. */ /* if n is not supplied switch to the default n = pow( 2 , 14 ); */ n = pow( 2 , ceil(log2(n)) ); // round up n to the next power of 2; double tol=1e-6; if ( (fabs(dataMIN+1)<tol) && (fabs(dataMAX+1)<tol) ) { printf("using automatic extrema determination\n"); //define the default interval [MIN,MAX] double maximum,minimum; find_max_min_array_doubles(data,length,&maximum,&minimum); double Range=maximum-minimum; dataMIN=minimum-Range/10.0; dataMAX=maximum+Range/10.0; printf("min: %g max: %g\n",dataMIN,dataMAX); } /*set up the grid over which the density estimate is computed;*/ double R=dataMAX-dataMIN; double dx=R/(n-1); double* xmesh=(double*)malloc(n*sizeof(*xmesh)); for (int i=0; i<n; i++ ) xmesh[i] = dataMIN+i*dx; double N = length; //double N=length(unique(data)); //qsort(data, length, sizeof(double), compare_doubles); N=256; //FIXME: we have emulate the unique matlab function. /*bin the data uniformly using the grid defined above;*/ double initial_data[n]; histc(data, length, xmesh, n , initial_data); double sum_initial_data = 0; for(int i=0;i<n;i++){ initial_data[i]=initial_data[i]/N; sum_initial_data+=initial_data[i]; } for(int i=0;i<n;i++) initial_data[i]=initial_data[i]/sum_initial_data; double a[n]; kde_dct_fftw(initial_data,n,a); // discrete cosine transform of initial data /*now compute the optimal bandwidth^2 using the referenced method*/ double It[n-1]; for (int i=0;i<n-1;i++) It[i]=pow(i+1,2.0); double a2[n-1]; for(int i=0;i<n-1;i++) a2[i] = pow(a[i+1]/2.0,2.0); double t_star=0; /*use fzero to solve the equation t=zeta*gamma^[5](t)*/ /* try t_star=fzero(@(t)fixed_point(t,N,I,a2),[0,.1]) catch t_star=.28*N^(-2/5); end */ //test fixed point values double t=0; double tt; tt=fixed_point(0.01,N,It,a2,n); printf("tt: %g\n",tt); tt=fixed_point(0.0,N,It,a2,n); printf("tt: %g\n",tt); tt=fixed_point(0.1,N,It,a2,n); printf("tt: %g\n",tt); int status=fzero(&t_star,N,It,a2,n); printf("t_star: %g\n",t_star); //t_star=.28*pow(N,-2.0/5.0); //printf("t_star: %g\n",t_star); /*smooth the discrete cosine transform of initial data using t_star*/ double a_t[n]; for(int i=0;i<n;i++) a_t[i]=a[i]*exp(-pow(i*M_PI,2.0)*t_star/2.0); double *density=(double* )malloc(n*sizeof(*density)); kde_idct_fftw(a_t,n,density); for(int i=0;i<n;i++) density[i]/=R*n*2; double bandwidth=sqrt(t_star)*R; printf("bandwidth: %g\n",bandwidth); if (verbose>=2 || verbose<=3) { int range[2]={0,128}; print_vec(xmesh,"xmesh",0,n); print_vec(data,"data",0,length); print_vec(initial_data,"initial_data",0,n); print_vec(a,"a",0,n); print_vec(a_t,"a_t",0,n); print_vec(a2,"a_2",0,n-1); print_vec(density,"density",0,n); } if (verbose>=3) { array_write_ascii(xmesh,n,"xmesh.txt"); array_write_ascii(initial_data, n, "initial_data.txt"); array_write_ascii(data, length, "data.txt"); array_write_ascii(density, n, "density.txt"); array_write_ascii(a_t, n, "a_t.txt"); array_write_ascii(a2, n-1, "a_2.txt"); } //prepare output *bw=bandwidth; if(!(*out_density)) *out_density=density; if(!(*out_x)) *out_x=xmesh; XML_OUT; }
fixed_point fixed_point::operator -() const{ return fixed_point(-mQ); }