Пример #1
0
	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());
		}
	}
Пример #2
0
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;
}
Пример #3
0
fixed_point fixed_point::operator -() const{
    return fixed_point(-mQ);
}