Beispiel #1
0
static bool
delete_node(const void *key, bnode_t *bnode, piojo_btree_t *tree)
{
        bool found_p, deleted_p=FALSE;
        size_t i;
        bnode_t *next;
        iter_t iter;

        while (bnode != NULL){
                i = bin_search(key, tree, bnode, &found_p);
                if (found_p){
                        /* Key in leaf, shrink the leaf and finish. */
                        if (bnode->leaf_p){
                                free_entry(&bnode->kvs[i], tree, &deleted_p);
                                --bnode->ecnt;
                                for (; i < bnode->ecnt; ++i){
                                        copy_bentry(i + 1, bnode, i, bnode, tree);
                                }
                                return TRUE;
                        }

                        /* Key in internal node, move prev/next key up and delete it. */
                        iter.bnode = bnode;
                        if (bnode->children[i]->ecnt >= tree->cmin){
                                free_entry(&bnode->kvs[i], tree, &deleted_p);
                                iter.eidx = i;
                                search_max(&iter);
                                copy_bentry(iter.eidx, iter.bnode, i, bnode, tree);
                                key = entry_key(i, bnode, tree);
                                bnode = bnode->children[i];
                        }else if (bnode->children[i + 1]->ecnt >= tree->cmin){
                                free_entry(&bnode->kvs[i], tree, &deleted_p);
                                iter.eidx = i + 1;
                                search_min(&iter);
                                copy_bentry(iter.eidx, iter.bnode, i, bnode, tree);
                                key = entry_key(i, bnode, tree);
                                bnode = bnode->children[i + 1];
                        }else{
                                /* Both node children are key deficient, merge and try again. */
                                PIOJO_ASSERT(bnode->children[i]->ecnt == tree->cmin - 1);
                                PIOJO_ASSERT(bnode->children[i + 1]->ecnt == tree->cmin - 1);
                                next = bnode->children[i];
                                merge_bnodes(tree, i, next, bnode->children[i + 1], bnode);
                                bnode = next;
                        }
                }else if (! bnode->leaf_p){
                        /* Key not in internal node, rebalance and try again. */
                        next = bnode->children[i];
                        if (next->ecnt < tree->cmin){
                                PIOJO_ASSERT(next->ecnt == tree->cmin - 1);
                                next = rebalance_bnode(tree, i, next, bnode);
                        }
                        bnode = next;
                }else{
                        /* Key not in leaf. */
                        bnode = NULL;
                }
        }
        return FALSE;
}
Beispiel #2
0
/**
 * Reads the previous key (order given by @a keycmp function).
 * @param[in] key
 * @param[in] tree
 * @param[out] data Entry value, can be @b NULL.
 * @return previous key or @b NULL if @a key is the first one.
 */
const void*
piojo_btree_prev(const void *key, const piojo_btree_t *tree, void **data)
{
        iter_t iter;
        PIOJO_ASSERT(tree);
        PIOJO_ASSERT(key);

        iter = search_node(key, tree);
        PIOJO_ASSERT(iter.bnode != NULL);

        if (! iter.bnode->leaf_p && iter.eidx < iter.bnode->ecnt + 1){
                iter.bnode = iter.bnode->children[iter.eidx];
                iter.eidx = iter.bnode->ecnt;
                search_max(&iter);
        }else if (iter.eidx > 0){
                --iter.eidx;
        }else{
                while (iter.bnode->parent != NULL){
                        iter.eidx = iter.bnode->pidx;
                        iter.bnode = iter.bnode->parent;
                        if (iter.eidx > 0){
                                --iter.eidx;
                                if (data != NULL){
                                        *data = entry_val(iter.eidx, iter.bnode, tree);
                                }
                                return entry_key(iter.eidx, iter.bnode, tree);
                        }
                }
                return NULL;
        }
        if (data != NULL){
                *data = entry_val(iter.eidx, iter.bnode, tree);
        }
        return entry_key(iter.eidx, iter.bnode, tree);
}
Beispiel #3
0
void ch_mode(int mode)
{
	reset();
	switch(mode){
		case 1: search_max();	break;
		case 2: sens_save();	break;
		case 3: sens_load();	break;
		case 4: maxmin_out(); 	break;
		case 5: sens_out();		break;
		case 6: 		break;
	}
}
Beispiel #4
0
void ch_mode(int mode)
{
	reset();
	switch(mode){
		case 1: search_max();	break;
		case 2: trace();		break;
		case 3: trace2();		break;
		case 4: line_check();		break;
		case 5: out_senc_drive_mot();		break;
		case 6: out_senc();		break;
		case 7: out_curve();	break;
	}
}
Beispiel #5
0
int main()/*begin function main*/
{
   /*vaiables used in the main function*/
   int num;
   int large;
   int row;
   int col;
   int i;
   int x;
   int close;

   printf("\nEnter the size of the 2D  array: ");/*prompt user for the size of the array to be initialized*/
   scanf("%d", &num);

   while (check_error(num) == 0)/*check that a valid size was entered*/
   {
      printf("Invalid input enter the size of the array again: ");
      scanf("%d", &num);
   }

   srand(time(NULL));/*randomize the function reand()*/

   initialize_2Darray(num);/*initialize the 2D array*/

   print_2Darray(num);/*display the 2D array*/

   initialize_1Darray(num);/*initialize the 1D array*/

   print_1Darray(num);/*display the 1D array*/

   printf("\n\nEnter the row: ");/*prompt the user to enter a row number*/
   scanf("%d", &row);

   printf("Enter the col: ");/*prompt the user to enter a column number*/
   scanf("%d", &col);   

   large = search_max(row, col, num);/*find the largest number in the row and column entered by the user*/

   printf("\nThe largest number present in the row %d and col %d is %d\n", row, col, large);/*display the largest value found in the coulumn*/

   for (i = 0; i < num; i++)/*display the diagonal value and how many times it is present in that row and column*/
   {
      x = count_diagonal(i, num);   

      printf("\nDiagonal element %d is present %d more times in the row %d and col %d", array2D[i][i], x, i, i);
   }
  
   close = closest_row(num);/*assign the number of the closest row to the variable closest*/
   
   printf("\n\nRow closest to the array is row %d\n\n", close);/*display the row of the 2D array cloasest to the 1D array*/
}
Beispiel #6
0
/**
 * Reads the last key in @a tree (order given by @a keycmp function).
 * @param[in] tree
 * @param[out] data Entry value, can be @b NULL.
 * @return last key or @b NULL if @a tree is empty.
 */
const void*
piojo_btree_last(const piojo_btree_t *tree, void **data)
{
        iter_t iter;
        PIOJO_ASSERT(tree);

        if (tree->ecount > 0){
                iter.tree = tree;
                iter.eidx = tree->root->ecnt;
                iter.bnode = tree->root;
                search_max(&iter);
                if (data != NULL){
                        *data = entry_val(iter.eidx, iter.bnode, tree);
                }
                return entry_key(iter.eidx, iter.bnode, tree);
        }
        return NULL;
}
Beispiel #7
0
void out_senc_drive_mot()
{
	short i;
	
	TIMER_WAIT(2000);
	search_max();
	start0=1;
	mot_STB(START_A);
	mot_frag=1;
	TIMER_WAIT(2000);
	while(1){
		MTU0.TGRA=100;
		MTU0.TGRC=100;
		for(i=1; i<11; i++){
			dec_out((short)ave_SEN[i], 4);	outs(" ");
		}
		outs("\n");
	}
} 
Beispiel #8
0
int main(void)
{
	//variable declaration//
	int size,student,row,col;
	float scores[COL_SIZE][COL_SIZE];
	srand(time(NULL));
	//size of array input//
	printf("Enter the size of the array:");
	scanf("%d",&size);
	//error checking//
	while(check_error(size)==0)
	{
		printf("Invalid input enter the size of the array again:");
		scanf("%d",&size);
	}
	//print array//
	printf("\nScores:\n");
	initialize_2Darray(scores,size);
	print_2Darray(scores,size);
	printf("\n");
	//average score// 
	average_scores(scores,size);
	//student number input//
	printf("Enter student number (1-%d):",size);
	scanf("%d",&student);
	//Overal grade for specific student// 
	printf("\nOverall grade for %dth student is %c",student,compute_grade(scores,size,student));
	//input row//
	printf("\nEnter the row (1-%d):",size);
        scanf("%d",&row);
	//input column//
	printf("Enter the col (1-%d):",size);
        scanf("%d",&col);
	//the largest number present in specific row and column//
	printf("The largest number present in row %d or col %d is %.2f\n",row,col,search_max(scores,row,col,size));
	printf("Bonus part");
	printf("\nArray before sorting\n");
	print_2Darray(scores,size);	

}	
Beispiel #9
0
int main(){
    const int max_mu_size=601;
    const int zero_pad_size=pow(2,15);
    FILE *in;
    in= fopen("mean.chi", "r");
    gsl_matrix *e = gsl_matrix_alloc(max_mu_size, 4);
    gsl_vector * kvar=gsl_vector_alloc(max_mu_size);
    gsl_vector * muvar=gsl_vector_alloc(max_mu_size);
    gsl_vector * mu_0pad=gsl_vector_alloc(zero_pad_size);
    gsl_vector * r_0pad=gsl_vector_alloc(zero_pad_size/2); //half of lenght 
    gsl_vector * kvar_0pad=gsl_vector_alloc(zero_pad_size);

    gsl_matrix_fscanf(in, e);
    fclose(in);

    gsl_matrix_get_col(kvar,e,0);
    gsl_matrix_get_col(muvar,e,1);
    gsl_vector_set_zero(mu_0pad);
    gsl_matrix_free(e);


    double dk=gsl_vector_get (kvar, 1)-gsl_vector_get (kvar, 0);
    double dr=M_PI/float(zero_pad_size-1)/dk;

    for (int i = 0; i < zero_pad_size; i++)
    {
      gsl_vector_set (kvar_0pad, i, dk*i);
    }
    for (int i = 0; i < zero_pad_size/2; i++)
    {
      gsl_vector_set (r_0pad, i, dr*i);
    }
    for (int i = 0; i < max_mu_size; i++)
    {
      gsl_vector_set (mu_0pad, i, gsl_vector_get (muvar, i));
    }

    gsl_vector *mu_widowed=gsl_vector_alloc(zero_pad_size);
    gsl_vector_memcpy (mu_widowed, mu_0pad);
    double kmin=4.0, kmax=17.0, dwk=0.8;
    hanning(mu_widowed, kvar_0pad, kmin, kmax, dwk);


    //FFT transform
    double *data = (double *) malloc(zero_pad_size*sizeof(double)); 
    //new double [zero_pad_size] ;
    memcpy(data, mu_widowed->data, zero_pad_size*sizeof(double));
    gsl_fft_real_radix2_transform(data, 1, zero_pad_size);

    //Unpack complex vector
    gsl_vector_complex *fourier_data = gsl_vector_complex_alloc (zero_pad_size);
    gsl_fft_halfcomplex_radix2_unpack(data, fourier_data->data, 1, zero_pad_size);
    gsl_vector *fftR_real = gsl_vector_alloc(fourier_data->size/2);
    gsl_vector *fftR_imag = gsl_vector_alloc(fourier_data->size/2);
    gsl_vector *fftR_abs  = gsl_vector_alloc(fourier_data->size/2);
    complex_vector_parts(fourier_data, fftR_real, fftR_imag);
    complex_vector_abs(fftR_abs, fftR_real, fftR_imag);
    
    gsl_vector *first_shell=gsl_vector_alloc(fftR_abs->size);
    gsl_vector_memcpy (first_shell, fftR_abs);
    double rmin=0.2, rmax=3.0, dwr=0.1;
    hanning(first_shell, r_0pad, rmin, rmax, dwr);


    //feff0001.dat
    const int path_lines=68; 
    e = gsl_matrix_alloc(path_lines, 7); 
    gsl_vector * k_p  =gsl_vector_alloc(path_lines);
    gsl_vector * phc_p=gsl_vector_alloc(path_lines);
    gsl_vector * mag_p=gsl_vector_alloc(path_lines);
    gsl_vector * pha_p=gsl_vector_alloc(path_lines);
    gsl_vector * lam_p=gsl_vector_alloc(path_lines);
    
    in= fopen("feff0001.dat", "r");
    gsl_matrix_fscanf(in, e);
    fclose(in);
    
    gsl_matrix_get_col(k_p  ,e,0);
    gsl_matrix_get_col(phc_p,e,1);
    gsl_matrix_get_col(mag_p,e,2);
    gsl_matrix_get_col(pha_p,e,3);
    gsl_matrix_get_col(lam_p,e,5);
    gsl_matrix_free(e);

    gsl_interp_accel *acc = gsl_interp_accel_alloc ();
    gsl_spline *k_spline   = gsl_spline_alloc (gsl_interp_cspline, path_lines);
    gsl_spline *phc_spline = gsl_spline_alloc (gsl_interp_cspline, path_lines);
    gsl_spline *mag_spline = gsl_spline_alloc (gsl_interp_cspline, path_lines);
    gsl_spline *pha_spline = gsl_spline_alloc (gsl_interp_cspline, path_lines);
    gsl_spline *lam_spline = gsl_spline_alloc (gsl_interp_cspline, path_lines);

    gsl_spline_init (k_spline  , k_p->data, k_p->data  , path_lines);
    gsl_spline_init (phc_spline, k_p->data, phc_p->data, path_lines);
    gsl_spline_init (mag_spline, k_p->data, mag_p->data, path_lines);
    gsl_spline_init (pha_spline, k_p->data, pha_p->data, path_lines);
    gsl_spline_init (lam_spline, k_p->data, lam_p->data, path_lines);


    gsl_vector * mu_p  =gsl_vector_alloc(path_lines);

    //struct fit_params { student_params t; double kshift; double S02; double N; inter_path splines; };
    //student_params t   = {2.45681867, 0.02776907, -21.28920008, 9.44741797, 0.0, 0.0, 0.0};

    splines.acc=acc; splines.phc_spline=phc_spline; splines.mag_spline=mag_spline;
    splines.pha_spline=pha_spline; splines.lam_spline=lam_spline;
    
    
    fit_params fp = { 2.45681867, 0.02776907, -21.28920008, 9.44741797, 1.0, 0.0};
    compute_itegral(k_p, &fp, mu_p);

    //mu_data_fit params = { k_p, mu_p};
    mu_data.k  = kvar_0pad;
    mu_data.mu = mu_0pad;
    mu_data.mu_ft = first_shell;
    mu_data.r = r_0pad;
    mu_data.kmin = kmin;
    mu_data.kmax = kmax;
    mu_data.rmin = rmin;
    mu_data.rmax = rmax;
    mu_data.dwk = dwk;
    mu_data.dwr = dwr;


    // initialize the solver
    size_t Nparams=6;
    gsl_vector *guess0 = gsl_vector_alloc(Nparams);

    gsl_vector_set(guess0, 0, 2.4307);
    gsl_vector_set(guess0, 1, 0.040969);
    gsl_vector_set(guess0, 2, 0.001314);
    gsl_vector_set(guess0, 3, 7835);
    gsl_vector_set(guess0, 4,  1.0);
    gsl_vector_set(guess0, 5,  0.0);


    gsl_vector *fit_r = gsl_vector_alloc(r_0pad->size);

    
    compute_itegral_r(&mu_data, fp, fit_r);
    gsl_matrix *plotting = gsl_matrix_calloc(r_0pad->size, 3);
    gsl_matrix_set_col (plotting, 0,  r_0pad);
    gsl_matrix_set_col (plotting, 1,  first_shell);
    gsl_matrix_set_col (plotting, 2,  fit_r);
    plot_matplotlib(plotting);
    gsl_matrix_free (plotting);
    


    gsl_multifit_function_fdf fit_mu_k;
    fit_mu_k.f = &resudial_itegral_r;
    fit_mu_k.n = MAX_FIT_POINTS;
    fit_mu_k.p = Nparams;
    fit_mu_k.params = &mu_data;
    fit_mu_k.df = NULL;
    fit_mu_k.fdf = NULL;




    gsl_multifit_fdfsolver *solver = gsl_multifit_fdfsolver_alloc(gsl_multifit_fdfsolver_lmsder, MAX_FIT_POINTS, Nparams);
    gsl_multifit_fdfsolver_set(solver, &fit_mu_k, guess0);

    size_t iter=0, status;
    do{
        iter++;
        //cout << solver->x->data[0] << " " << solver->x->data[1] <<endl;
        status = gsl_multifit_fdfsolver_iterate (solver);
        //printf("%12.4f %12.4f %12.4f\n", solver->J->data[0,0], solver->J->data[1,1], solver->J->data[2,2] );
        //gsl_multifit_fdfsolver_dif_df  (k_p, &fit_mu_k, mu_p, solver->J);
        //gsl_multifit_fdfsolver_dif_fdf (k_p, &fit_mu_k, mu_p, solver->J);
        for (int i =0; i< solver->x->size; i++){
            printf("%14.5f", gsl_vector_get (solver->x, i)) ;
        }
        printf("\n") ;

        if (status) break;
        status = gsl_multifit_test_delta (solver->dx, solver->x, 1e-4, 1e-4);
    }while (status == GSL_CONTINUE && iter < 100);

    gsl_vector * mu_fit  =gsl_vector_alloc(path_lines);
    fit_params fitp = { solver->x->data[0], solver->x->data[1],\
                        solver->x->data[2], solver->x->data[3],\
                        solver->x->data[4], solver->x->data[5]};
    compute_itegral(k_p, &fitp, mu_fit);



        fp.mu=gsl_vector_get (solver->x, 0);
        fp.sig=gsl_vector_get (solver->x, 1);
        fp.skew=gsl_vector_get (solver->x, 2);
        fp.nu=gsl_vector_get (solver->x, 3);
        fp.S02=gsl_vector_get (solver->x, 4);
        fp.kshift=gsl_vector_get (solver->x, 5);
        
        compute_itegral_r(&mu_data, fp, fit_r);
        //gsl_matrix *plotting = gsl_matrix_calloc(r_0pad->size, 3);
        gsl_matrix_set_col (plotting, 0,  r_0pad);
        gsl_matrix_set_col (plotting, 1,  first_shell);
        gsl_matrix_set_col (plotting, 2,  fit_r);
        int min_r=search_max(r_0pad, 0.);
        int max_r=search_max(r_0pad, 4.);
        gsl_matrix_view plotting_lim = gsl_matrix_submatrix (plotting, min_r, 0, max_r-min_r, plotting->size2);
        plot_matplotlib(&plotting_lim.matrix);
        gsl_matrix_free (plotting);


    //cout << gsl_spline_eval (k_spline, 1.333, acc) << endl;
    //cout << gsl_spline_eval (phc_spline, 1.333, acc) << endl;


    //cout << data[0] << "\t" << data[1] << "\t" << data[2] << "\t" << endl;
    //cout << fourier_data->data[0] << "\t" << fourier_data->data[1] << "\t" << fourier_data->data[2] << "\t" << endl;

   
    //Plotting
    /*
    gsl_matrix *plotting = gsl_matrix_calloc(zero_pad_size, 3);
    gsl_matrix_set_col (plotting, 0, kvar_0pad);
    gsl_matrix_set_col (plotting, 1, mu_0pad);
    gsl_matrix_set_col (plotting, 2, mu_widowed);
    int max_k=search_max(kvar_0pad, 35.);
    int min_k=search_max(kvar_0pad, 1.0);
    gsl_matrix_view plotting_lim = gsl_matrix_submatrix (plotting, min_k, 0, max_k-min_k, 3);
    plot_matplotlib(&plotting_lim.matrix);
    gsl_matrix_free (plotting);
    */

    /*
    gsl_matrix *plotting = gsl_matrix_calloc(zero_pad_size, 2);
    gsl_matrix_set_col (plotting, 0, r_0pad);
    gsl_matrix_set_col (plotting, 1, mu_0pad);
    int max_k=search_max(kvar_0pad, 35.);
    int min_k=search_max(kvar_0pad, 1.0);
    gsl_matrix_view plotting_lim = gsl_matrix_submatrix (plotting, min_k, 0, max_k-min_k, 3);
    plot_matplotlib(&plotting_lim.matrix);
    gsl_matrix_free (plotting);
    */
    /*  
    gsl_matrix *plotting = gsl_matrix_calloc(r_0pad->size, 5);
    gsl_matrix_set_col (plotting, 0,  r_0pad);
    gsl_matrix_set_col (plotting, 1,  fftR_abs);
    gsl_matrix_set_col (plotting, 2,  fftR_real);
    gsl_matrix_set_col (plotting, 3,  fftR_imag);
    gsl_matrix_set_col (plotting, 4,  first_shell);
    
    int min_r=search_max(r_0pad, 0.);
    int max_r=search_max(r_0pad, 5.);
    gsl_matrix_view plotting_lim = gsl_matrix_submatrix (plotting, min_r, 0, max_r-min_r, plotting->size2);
    plot_matplotlib(&plotting_lim.matrix);
    //plot_matplotlib(plotting);
    gsl_matrix_free (plotting);
    */






    //cout << "Done" << endl;
    //cout << data[1] <<"\t" << data[2] << endl;
    
    //for (int i = 0; i < kvar->size; i++)
    //{
    //    cout << gsl_vector_get (kvar, i) <<"\t" << gsl_vector_get (muvar, i) << endl;
    //}

}