예제 #1
0
파일: quantile.c 프로젝트: cran/TPmsm
void quantile_d(
	CintCP len,
	double V[*len],
	CintCP n,
	Cdouble P[*n],
	double Q[*n])
{
	register int i;
	int j, k;
	double g;
	sort_d(V, *len, FALSE, FALSE); // sort vector
	for (k = 0; k < *len; k++) if ( !ISNAN(V[k]) ) break; // find first NaN or NA
	for (i = 0; i < *n; i++) {
		g = P[i]*(*len-k-1);
		j = g;
		if (j == *len-k-1) Q[i] = V[*len-1]; // compute quantile
		else {
			g -= j;
			Q[i] = (1-g)*V[j+k]+g*V[j+k+1]; // compute quantile
		}
	}
	return;
} // quantile_d
예제 #2
0
int prep_profile(double  *ordinate,
	         int      n_data,
	         int      n_bin,
	         double   first_bin_min_size,
	         int      min_number,
	         double   ordinate_max_max,
	         int      bin_type,
	         int    **bin_id,
	         double **ordinate_min,
	         double **ordinate_max,
	         double **ordinate_avg,
	         int     *n_bin_out){
  int    *ordinate_id;
  int     i,j,k;
  double  next_ordinate;
  double  ordinate_next;
  double  ordinate_step;
  int     accumulator;
  double  ordinate_stop;
  int     status=ERROR_NONE;
  
  fprintf(stderr,"  Preparing profile bins...");

  sort_d(ordinate,n_data,&ordinate_id,FALSE);

  ordinate_stop=MIN(ordinate_max_max,ordinate[ordinate_id[n_data-1]]);

  if(bin_type==LOG_BIN){
    ordinate_next=MAX(first_bin_min_size,ordinate[ordinate_id[MIN(1,n_data-1)]]);
    ordinate_step=
      pow(ordinate_stop/ordinate_next,1.0/(double)(n_bin-1));
  }
  else{
    ordinate_step=
      (ordinate_stop/(double)(n_bin));    
    ordinate_next=ordinate_step;
    if(ordinate_next<first_bin_min_size ||
       ordinate_step<ordinate[ordinate_id[MIN(1,n_data-1)]]){
      ordinate_next=MAX(first_bin_min_size,ordinate[ordinate_id[MIN(1,n_data-1)]]);
      ordinate_step=
	((ordinate_stop-ordinate_next)/(double)(n_bin-1));    
    }
  }

  (*bin_id)=(int *)malloc(sizeof(int)*n_data);
  for(i=0;i<n_data;i++)
    (*bin_id)[i]=-1;
  (*ordinate_min)    =(double *)malloc(sizeof(double)*n_bin);
  (*ordinate_max)    =(double *)malloc(sizeof(double)*n_bin);
  (*ordinate_avg)    =(double *)malloc(sizeof(double)*n_bin);
  for(i=0;i<n_bin;i++)
    (*ordinate_avg)[i]=0.0;
  for(i=0,j=0,(*ordinate_min)[0]=0.0,accumulator=0;
      i<n_data && j<n_bin && ordinate[ordinate_id[i]]<=ordinate_stop;
      i++){
    next_ordinate=ordinate[ordinate_id[MIN(i+1,n_data-1)]];
    if(ordinate[ordinate_id[i]]>=ordinate_next && 
       next_ordinate>ordinate[ordinate_id[i]]){
      if(accumulator>min_number){
	if(bin_type==LOG_BIN) ordinate_next*=ordinate_step;
	else                  ordinate_next+=ordinate_step;
        (*ordinate_avg)[j]/=(double)accumulator;
	j++;
	if(j<n_bin)
	  (*ordinate_min)[j]=(*ordinate_max)[j-1];
	accumulator=0;
      }
      else {
	ordinate_next=next_ordinate;
	if(bin_type==LOG_BIN){
	  ordinate_step=
	    pow(ordinate_stop/ordinate_next,1.0/(double)MAX(1,n_bin-j-1));
	}
	else if(bin_type==LINEAR_BIN){
	  ordinate_step=
	    ((ordinate_stop-ordinate_next)/(double)(n_bin-j));    
	}
      }
    }
    (*ordinate_avg)[j]+=ordinate[ordinate_id[i]];
    (*bin_id)[ordinate_id[i]]=j;
    (*ordinate_max)[j]       =ordinate[ordinate_id[i]];
    accumulator++;
  }
  for(i=0;i<n_data;i++)
    if((*bin_id)[i]==j)
      (*bin_id)[i]=-1;
  *n_bin_out=MIN(n_bin,j);
  fprintf(stderr,"%d bins created...Done.\n",(*n_bin_out));
  free(ordinate_id);
  return(status);
}
예제 #3
0
void prep_profile_image(double  *image,
 	                int      n_x,
	                int      n_y,
	                double   x_cen,
	                double   y_cen,
	                int      n_bin,
	                double   first_bin_min_size,
	                double   min_amount,
	                double   r_max_max,
	                int      bin_type,
	                int    **bin_image,
	                double **r_min,
	                double **r_max,
	                int     *n_bin_out){
  int     n_pix;
  double *r_pix;
  int    *order;
  int     i,j,k;
  double  R_next;
  double  R_step;
  double  r_pix_next;
  double  accumulator;
  double  R_max;
  
  fprintf(stderr,"  Creating profile bins...");
  n_pix=n_x*n_y;
  r_pix=(double *)malloc(sizeof(double)*n_pix);
  for(j=0,k=0;j<n_y;j++){
    for(i=0;i<n_x;i++){
      r_pix[k]=pow(((double)i-x_cen)*((double)i-x_cen)+
		   ((double)j-y_cen)*((double)j-y_cen),0.5);
      k++;
    }
  }
  sort_d(r_pix,n_pix,&order,TRUE);
  R_max=MIN(r_max_max,r_pix[n_pix-1]);

  if(bin_type==LOG_BIN){
    R_next=MAX(first_bin_min_size,r_pix[MIN(1,n_pix-1)]);
    R_step=
      pow(R_max/R_next,1.0/(double)(n_bin-1));
  }
  else{
    R_step=
      (R_max/(double)(n_bin));    
    R_next=R_step;
    if(R_next<first_bin_min_size ||
       R_step<r_pix[MIN(1,n_pix-1)]){
      R_next=MAX(first_bin_min_size,r_pix[MIN(1,n_pix-1)]);
      R_step=
	((R_max-R_next)/(double)(n_bin-1));    
    }
  }

  (*bin_image)=(int *)malloc(sizeof(int)*n_pix);
  for(i=0;i<n_pix;i++)
    (*bin_image)[i]=-1;
  (*r_min)    =(double *)malloc(sizeof(double)*n_bin);
  (*r_max)    =(double *)malloc(sizeof(double)*n_bin);
  for(i=0,j=0,(*r_min)[0]=0.0,accumulator=0.0;
      i<n_pix && j<n_bin && r_pix[i]<=R_max;
      i++){
    r_pix_next=r_pix[MIN(i+1,n_pix-1)];
    if(r_pix[i]>=R_next && 
       r_pix_next>r_pix[i]){
      if(accumulator>min_amount){
	if(bin_type==LOG_BIN) R_next*=R_step;
	else                  R_next+=R_step;
	j++;
	if(j<n_bin)
	  (*r_min)[j]=(*r_max)[j-1];
	accumulator=0.0;
      }
      else {
	R_next=r_pix_next;
	if(bin_type==LOG_BIN){
	  R_step=
	    pow(R_max/R_next,1.0/(double)MAX(1,n_bin-j-1));
	}
	else if(bin_type==LINEAR_BIN){
	  R_step=
	    ((R_max-R_next)/(double)(n_bin-j));    
	}
      }
    }
    (*bin_image)[order[i]]=j;
    (*r_max)[j] =r_pix[i];
    accumulator+=image[order[i]];
  }
  *n_bin_out=MIN(n_bin,j+1);
  fprintf(stderr,"%d bins created...Done.\n",(*n_bin_out));
  free(r_pix);
  free(order);
}
예제 #4
0
파일: mapper.c 프로젝트: KrishnaAdapa/aloe
float mapper(struct preprocessing *preproc,
           struct mapping_algorithm *algorithm,
           struct cost_function *cfunction,
           struct platform_resources *platform,
           struct waveform_resources *waveform,
           struct mapping_result *result)
{

	int i, j;		// loop indices
	float cost;		// mapping cost

	float m[Mmax];

	// t-mapping: trellis organization
	int nodes[Nmax][Mmax];		// 2D-array of N*M nodes that can be traspassed in the trellis
	//int (*ptr_nodes)[Mmax];
	int count;			// integer counter


	/* primero compruebas que las variables de entrada sean correctas */
 	/*if (...) 
		return -1;
	*/

	// COPIES
	/* number of processors and tasks */
	N = platform->nof_processors;	// number of platform's processors
	M = waveform->nof_tasks;		// number of application's tasks/SDR functions/processes

	// INITIALIZATIONS
	//ptr_nodes = nodes;

	// trellis organization: 'trellis nodes' (2D-array) numbered to be accessible by a single number or dimension
	count = 0;
	for (i=0; i<M; i++)
		for (j=0; j<N; j++)
			nodes[j][i] = count++;

	/* cost function parameters */
	q1 = cfunction->q;
	q2 = (float)1-q1;
	mhop = cfunction->mhop;

	/* application and platform resources and parameters */
	for (i=0; i<M; i++)
		m[i] = waveform->c[i];

	/** IGM: fill force idx vector */
	for (i=0; i<M; i++)
			force_idx[i] = waveform->force[i];

	for (i=0; i<M; i++)
		for (j=0; j<M; j++)
			b[i][j] = waveform->b[i][j];

	for (i=0; i<N; i++)
		P[i] = platform->C[i];				

	for (i=0; i<N; i++)
		for (j=0; j<N; j++)
			L[i][j] = platform->B[i][j];

	arch = platform->arch;

	resource_trans();

	/* preprocessing */
	switch (preproc->ord) {
	case no_ord:
		for (i=0; i<M; i++)
			m_sort[i] = m[i];
		break;
	case c_ord:
		sort_d(m);
		break;
	case b_ord:
		sort_b(m);
		break;
	default:
		for (i=0; i<M; i++)
			m_sort[i] = m[i];
	}

	cost = tw_mapping(nodes, algorithm->w);

	for (i=0;i<M;i++) {
		result->P_m[i]=final_map[i];
	}

	return cost;
}