int main(int argc, char **argv){ float **shake_dim_min_to_max_matrix = NULL; /* N*dim */ FILE *ifp = NULL; FILE *ofp = NULL; int with_sample_ID = 1; int arg_stat = 0; int i = 0; int j = 0; char dim_string[TMP_STRING_LEN]; int grid_tensor_elms = 1; int grid_tensor_rank = 1; int *grid_tensor_dim = NULL; int **tensor_position_matrix = NULL; float **tensor_vars = NULL; /* temporary vars */ int tmp_ptr_arr = 0; int tmp_ptr_word = 0; char *tmp_word; tmp_word = c_alloc_vec(SHORT_STRING_LEN); if(argc == 2){ if(strcmp(argv[1],"-h") == 0){ message(); usage(); options(); }else{ message(); usage(); } }else if(argc >= 4){ arg_stat = get_options(1,argc,argv); if((arg_stat&22) != 22){ usage(); exit(1); } /* (* check file format */ int max_col = 0; int min_col = 0; int lines = 0; if((ifp = fopen(sample_file,"r")) == NULL){ perror(sample_file); exit(1); } read_ilist_from_stream(1,ifp,&dim_data); read_ilist_from_stream(1,ifp,&num_data); fgetc(ifp); count_column_from_stream(ifp,&lines,&max_col,&min_col); fclose(ifp); fprintf(stderr,"1st line information: dim:%d: num:%d:\n",dim_data,num_data); fprintf(stderr,"count: max:%d: min:%d: lines:%d:\n",max_col,min_col,lines); if(max_col != min_col){ fprintf(stderr,"[EROOR] something wrong: max_col not min_col.\n"); exit(1); } if(dim_data == max_col){ fprintf(stderr,"dim_data == num of columns: with_sample_ID = 0.\n"); with_sample_ID = 0; }else if((dim_data + 1) == max_col){ fprintf(stderr,"dim_data + 1 == num of columns: with_sample_ID = 1.\n"); with_sample_ID = 1; } /* *) */ /* (* scan data, allocate mem, read data */ if((ifp = fopen(sample_file,"r")) == NULL){ perror(sample_file); exit(1); } read_ilist_from_stream(1,ifp,&dim_data); read_ilist_from_stream(1,ifp,&num_data); data_matrix = f_alloc_mat(num_data,dim_data); sample_id = c_alloc_mat(num_data,ID_LEN); if(with_sample_ID == 1){ read_ID_ftable_from_stream(num_data,dim_data,ifp,data_matrix,sample_id); }else if(with_sample_ID == 0){ read_ftable_from_stream(num_data,dim_data,ifp,data_matrix); } fclose(ifp); dim_clst = dim_data; dim_min_and_max_table = f_alloc_mat(2,dim_data); /* *) */ /* (* set min_dim_list to dim_min_and_max_table[0] */ min_list_from_matrix(dim_data,num_data,data_matrix,dim_min_and_max_table[0],0); /* *) */ /* (* set max_dim_list to dim_min_and_max_table[1] */ max_list_from_matrix(dim_data,num_data,data_matrix,dim_min_and_max_table[1],0); /* *) */ /* (* set ticks to dim_min_to_max_matrix */ dim_min_to_max_matrix = f_alloc_mat(num_clst,dim_data); make_min_to_max_table(num_clst,dim_data,dim_min_and_max_table,dim_min_to_max_matrix); /* *) */ /* (* change operation by coordinate_option */ if((strcmp(coordinate_option,"Diagonal") == 0)||(strcmp(coordinate_option,"-D") == 0)){ /* (* copy pointer for write to file */ out_matrix = dim_min_to_max_matrix; /* *) */ }else if(strcmp(coordinate_option,"random=Order") == 0){ /* (* generate random order */ int_rand_order_matrix = i_alloc_mat(dim_data,num_clst); t = time(NULL); for(i=0;i<dim_data;i++){ srand(t+33*i); mk_int_rand_order_list(0,num_clst-1,int_rand_order_matrix[i],t+pow(5,i)+(13*i)+seed); } /* *) */ /* (* set shake_dim_min_to_max_matrix from random_order & min_max_matrix */ shake_dim_min_to_max_matrix = f_alloc_mat(num_clst,dim_data); for(j=0;j<num_clst;j++){ for(i=0;i<dim_data;i++){ shake_dim_min_to_max_matrix[j][i] = dim_min_to_max_matrix[int_rand_order_matrix[i][j]][i]; } } /* *) */ /* (* copy pointer for write to file */ out_matrix = shake_dim_min_to_max_matrix; /* *) */ }else if(strcmp(coordinate_option,"random=Value") == 0){ t = time(NULL); dim_min_to_max_matrix = f_alloc_mat(num_clst,dim_data); mk_rand_coordinate(num_clst,dim_data,dim_min_and_max_table,dim_min_to_max_matrix,t+seed); out_matrix = dim_min_to_max_matrix; }else if(strcmp(coordinate_option,"node=Central") == 0){ /* check num */ if(num_data < num_clst){ printf("%d,%d\n",num_data,num_clst); fprintf(stderr,"Warn : number of clusters exceeded number of samples.\n"); exit(1); } /* init id_distance */ id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = 0; } /* set centroid */ centroid = f_calloc_vec(dim_data); for(i=0;i<num_data;i++){ for(j=0;j<dim_data;j++){ centroid[j] += data_matrix[i][j]; } } for(j=0;j<dim_data;j++){ centroid[j] = centroid[j]/num_data; } /* set id_distance */ for(i=0;i<num_data;i++){ id_distance[i].value = euc_dist(dim_data,centroid,data_matrix[i]); } /* sort id_distance by distance */ qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))cmp_dist); out_matrix = data_matrix; }else if(strcmp(coordinate_option,"node=diStant") == 0){ if(num_data < num_clst){ fprintf(stderr,"Warn : number of clusters exceeded number of samples.\n"); exit(1); } origin = f_calloc_vec(dim_data); origin_data_dist_list = f_alloc_vec(num_data); for(i=0;i<num_data;i++){ origin_data_dist_list[i] = euc_dist(dim_data,origin,data_matrix[i]); } id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = origin_data_dist_list[i]; } qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))alt_cmp_dist); out_matrix = data_matrix; }else if(strcmp(coordinate_option,"node=Power") == 0){ if(num_data < num_clst){ fprintf(stderr,"Warn : number of clusters exceeded number of samples.\n"); exit(1); } id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = 0; } for(i=0;i<num_data;i++){ for(j=0;j<dim_data;j++){ id_distance[i].value = id_distance[i].value + data_matrix[i][j]; } } qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))alt_cmp_dist); out_matrix = data_matrix; }else if(strcmp(coordinate_option,"node=outLying") == 0){ if(num_data < num_clst){ fprintf(stderr,"Warn : number of clusters exceeded number of samples.\n"); exit(1); } id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = 0; } centroid = f_calloc_vec(dim_data); for(i=0;i<num_data;i++){ for(j=0;j<dim_data;j++){ centroid[j] += data_matrix[i][j]; } } for(j=0;j<dim_data;j++){ centroid[j] = centroid[j]/num_data; } for(i=0;i<num_data;i++){ id_distance[i].value = euc_dist(dim_data,centroid,data_matrix[i]); } qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))alt_cmp_dist); out_matrix = data_matrix; }else if(strcmp(coordinate_option,"node=Intensive") == 0){ if(num_data < num_clst){ fprintf(stderr,"Warn : number of cluster exceeded number of samples.\n"); exit(1); } id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = 0; } for(i=0;i<num_data;i++){ for(j=0;j<=i;j++){ id_distance[i].value += euc_dist(dim_data,data_matrix[i],data_matrix[j]); } } for(i=0;i<num_data;i++){ for(j=num_data-1;j>i;j--){ id_distance[i].value += euc_dist(dim_data,data_matrix[j],data_matrix[i]); } } qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))cmp_dist); out_matrix = data_matrix; }else if(strncmp(coordinate_option,"node=Median",11) == 0){ //fprintf(stderr,"HOGE!!\n"); double delta = 0; int data_ptr = 0; int bin_ptr = 0; int total_bin_count = 0; //int tmp = 0; /* check num */ if(num_data < num_clst){ printf("%d,%d\n",num_data,num_clst); fprintf(stderr,"Warn : number of clusters exceeded number of samples.\n"); exit(1); } /* init id_distance */ id_distance = status_alloc_list(num_data); for(i=0;i<num_data;i++){ id_distance[i].pos = i; id_distance[i].value = 0; } /* set centroid */ centroid = f_calloc_vec(dim_data); for(i=0;i<num_data;i++){ for(j=0;j<dim_data;j++){ centroid[j] += data_matrix[i][j]; } } for(j=0;j<dim_data;j++){ centroid[j] = centroid[j]/num_data; } /* set id_distance */ for(i=0;i<num_data;i++){ id_distance[i].value = euc_dist(dim_data,centroid,data_matrix[i]); } /* sort id_distance by distance */ qsort(id_distance,num_data,sizeof(struct status),(int(*)(const void*, const void*))cmp_dist); max_dist = id_distance[num_data-1].value; min_dist = id_distance[0].value; fprintf(stderr,"max_dist:%f:\n",max_dist); fprintf(stderr,"min_dist:%f:\n",min_dist); out_matrix = data_matrix; /* set partition */ partition = (int)num_data/num_clst; fprintf(stderr,"partition:%d:\n",partition); parted_values = f_calloc_vec(partition); delta = (max_dist - min_dist)/partition; fprintf(stderr,"delta:%f:\n",delta); for(i=0;i<partition;i++){ parted_values[i] = min_dist + (i * delta); //fprintf(stderr,"%f\n",parted_values[i]); } /* (* UNDER CHECK */ bins = i_calloc_vec(partition); data_ptr = 0; bin_ptr = 0; total_bin_count = 0; //median_range = 0; median_count = 0; median_value = 0; ordered_start = 0; for(i=0;i<num_data;i++){ if(bin_ptr >= partition){ break; } if(id_distance[i].value <= parted_values[bin_ptr+1]){ total_bin_count++; bins[bin_ptr]++; }else{ if(bins[bin_ptr] > median_count){ median_count = bins[bin_ptr]; median_value = parted_values[bin_ptr]; ordered_start = total_bin_count - bins[bin_ptr]; } bin_ptr++; } } //printf(":::%d:::\n",num_data); //printf(":::%d:::\n",num_data - total_bin_count); bins[bin_ptr-1] = (num_data - total_bin_count); /* test for(i=0;i<partition;i++){ fprintf(stderr,"%f\n",parted_values[i]); fprintf(stderr," %d\n",bins[i]); tmp = tmp + bins[i]; fprintf(stderr," %d\n",tmp); } fprintf(stderr,"start:%d:\n",ordered_start); */ /* *) */ }else if(strcmp(coordinate_option,"Through") == 0){ num_clst = num_data; out_matrix = data_matrix; }else if(strncmp(coordinate_option,"Grid=",5) == 0){ sscanf(coordinate_option,"Grid=%s",dim_string); grid_tensor_rank = dim_data; grid_tensor_dim = get_tensor_dimANDrank(grid_tensor_rank,dim_string); tensor_position_matrix = make_outer_tensor_position_matrix(dim_data,&grid_tensor_elms,grid_tensor_dim); num_clst = grid_tensor_elms; if((tensor_vars = malloc((size_t)sizeof(float*)*grid_tensor_rank)) == NULL){ printf("failed : malloc() at %ld byte.\n",(long int)sizeof(float*)*grid_tensor_rank); exit(1); } for(i=0;i<grid_tensor_rank;i++){ tensor_vars[i] = make_min_to_max_list(grid_tensor_dim[i],dim_min_and_max_table[0][i],dim_min_and_max_table[1][i]); } out_matrix = f_alloc_mat(grid_tensor_elms,grid_tensor_rank); for(i=0;i<grid_tensor_elms;i++){ for(j=0;j<dim_data;j++){ out_matrix[i][j] = tensor_vars[j][tensor_position_matrix[i][j]]; } } }else if(strncmp(coordinate_option,"Axis-mean=",10) == 0){ int axis_str_len = 0; int axis_list_len = 0; int *axis_list = NULL; double *axis_v_list = NULL; sscanf(coordinate_option,"Axis-mean=%s",axis_str); axis_str_len = strlen(axis_str); for(i=0;i<axis_str_len;i++){ if(axis_str[i] == ','){ axis_list_len++; } } axis_list_len++; axis_list = i_alloc_vec(axis_list_len); axis_v_list = d_calloc_vec(axis_list_len); for(i=0;i<axis_str_len;i++){ if(axis_str[i] == ','){ tmp_word[tmp_ptr_word] = '\0'; sscanf(tmp_word,"%d",&axis_list[tmp_ptr_arr]); tmp_ptr_arr++; tmp_ptr_word = 0; }else{ tmp_word[tmp_ptr_word] = axis_str[i]; tmp_ptr_word++; } } tmp_word[tmp_ptr_word] = '\0'; sscanf(tmp_word,"%d",&axis_list[tmp_ptr_arr]); tmp_ptr_arr++; tmp_ptr_word = 0; /* num_clst */ num_clst = axis_list_len; /* out_matrix alloc */ out_matrix = f_calloc_mat(num_clst,dim_data); /* calculation */ for(i=0;i<num_data;i++){ for(j=0;j<axis_list_len;j++){ axis_v_list[j] += data_matrix[i][axis_list[j]]; } } for(j=0;j<axis_list_len;j++){ axis_v_list[j] = axis_v_list[j]/num_data; out_matrix[j][axis_list[j]] = (float)axis_v_list[j]; } }else if(strncmp(coordinate_option,"aXis-intensive=",15) == 0){ /* declear and allocation */ float axis_ratio = 1; struct st_ax_and_mean *ax_mean; if(((ax_mean = malloc(sizeof(struct st_ax_and_mean) * dim_data)) == NULL)){ fprintf(stderr, "[E] failed: malloc().\n"); exit(0); } out_matrix = f_calloc_mat(dim_data,dim_data); /* ratio */ sscanf(coordinate_option,"aXis-intensive=%f",&axis_ratio); mat_TO_st_ax_and_mean(dim_data, num_data, data_matrix, ax_mean); qsort(ax_mean,dim_data,sizeof(struct st_ax_and_mean),(int(*)(const void*, const void*))cmp_ax_and_mean); for(j=0;j<dim_data;j++){ out_matrix[j][ax_mean[j].ax] = axis_ratio * ax_mean[j].mean; } }else{ options(); exit(1); } /* *) */ /* (* open file and write shake_dim_min_to_max_matrix */ ofp = fopen(cluster_file,"w"); if(ofp == NULL){ perror(cluster_file); exit(1); } if(ordered_output == 0){ fprintf(ofp,"%d %d\n",dim_data,num_clst); for(j=0;j<num_clst;j++){ for(i=0;i<dim_data;i++){ fprintf(ofp,"%f ",out_matrix[j][i]); } fprintf(ofp,"\n"); } fclose(ofp); }else{ fprintf(ofp,"%d %d\n",dim_data,num_clst); for(j=ordered_start;j<num_clst+ordered_start;j++){ for(i=0;i<dim_data;i++){ fprintf(ofp,"%f ",out_matrix[id_distance[j].pos][i]); } fprintf(ofp,"\n"); } fclose(ofp); } /* *) */ }else{ message(); usage(); } return(0); }
int main(int argc, char **argv){ struct options *opt; int ie=0; FILE *fp; char *line; int c; int num_RNG_edge = 0; struct edge_d RNG_edge_d; //struct edge_table RNG_tbl; //float **dmat; float **RNG_d_tbl; float *min_stack; int min_stack_len; float maxmin = 0; int i,j,k,l; /* (* check options */ opt = alloc_options(); init_options(opt); get_options(argc-1, argv+1, opt); if((*opt).loop == 0){ (*opt).loop = (*opt).dsize; } if(argc == 1){ (*opt).help = 1; } if((*opt).help == 1){ help(); ie = 1; } if((*opt).stat == 1){ status(); ie = 1; } if((*opt).check == 1){ check_options(opt); ie = 1; } if(ie == 1){ exit(0); } /* *) */ /* (* read RNG_d */ //must be rewrite line = c_alloc_vec(LEN); if((fp = fopen((*opt).ef,"r")) == NULL){ perror((*opt).ef); exit(1); } num_RNG_edge = 0; while((c=fgetc(fp)) != EOF){ if((char)c == '\n'){ num_RNG_edge++; } } //printf("num_RNG_edge:%d:\n",num_RNG_edge); fseek(fp,0U,SEEK_SET); RNG_edge_d.p = i_alloc_vec(num_RNG_edge); RNG_edge_d.t = i_alloc_vec(num_RNG_edge); RNG_edge_d.d = f_alloc_vec(num_RNG_edge); i = 0; while((fgets(line,LEN,fp)) != NULL){ sscanf(line,"%d %d %f",RNG_edge_d.p+i,RNG_edge_d.t+i,RNG_edge_d.d+i); i++; } fclose(fp); //check /* for(i=0;i<num_RNG_edge;i++){ printf("%d %d %f\n",RNG_edge_d.p[i],RNG_edge_d.t[i],RNG_edge_d.d[i]); } */ /* *) */ /* (* create RNG_d_tbl */ //must be rewite RNG_d_tbl = f_calloc_mat((*opt).dsize,(*opt).dsize); for(i=0;i<(*opt).dsize;i++){ for(j=0;j<(*opt).dsize;j++){ RNG_d_tbl[i][j] = -1; } } for(i=0;i<num_RNG_edge;i++){ RNG_d_tbl[RNG_edge_d.p[i]][RNG_edge_d.t[i]] = RNG_edge_d.d[i]; RNG_d_tbl[RNG_edge_d.t[i]][RNG_edge_d.p[i]] = RNG_edge_d.d[i]; } //check /* printf("dsize:%d:\n",(*opt).dsize); for(i=0;i<(*opt).dsize;i++){ for(j=0;j<(*opt).dsize;j++){ printf(" %f",RNG_d_tbl[i][j]); } printf("\n"); } */ /* *) */ /* (* refine RNG_d_tbl */ min_stack = f_alloc_vec((*opt).dsize); //for l in loop for(l=0;l<(*opt).loop;l++){ //for i in row for(i=0;i<(*opt).dsize;i++){ //for j in row for(j=0;j<(*opt).dsize;j++){ //for k in column //min_stack_len = 0; maxmin = 0; min_stack_len = 0; for(k=0;k<(*opt).dsize;k++){ //comp(dmat[i] dmat[j]) //if dmat[i][k]!=0, dmat[j][k]!=0 //Func1 //if((RNG_d_tbl[i][k] != -1) && (RNG_d_tbl[j][k] != -1)){ if((RNG_d_tbl[i][k] >= 0) && (RNG_d_tbl[j][k] >= 0)){ //add max(pair) to min_stack; nim_stack_len++; min_stack[min_stack_len] = max(RNG_d_tbl[i][k],RNG_d_tbl[j][k]); min_stack_len++; } //end for k } //min of nim_stack //Func2 maxmin = f_min_list(min_stack_len,min_stack); // ?? can rewrite maxmin ?? if((*opt).diag==1 && i==j){ maxmin = -1; } // ?? needs ?? //printf("maxmin:%f:\n",maxmin); //rewrite RNG_d_tbl[i][j] <- nim(nin_stack); if(min_stack_len > 0){ // must be replaced!! //Func3 if(RNG_d_tbl[i][j] >= 0){ maxmin = min(maxmin,RNG_d_tbl[i][j]); } RNG_d_tbl[i][j] = maxmin; } //end for j } //end for i } //end for l } /* *) */ /* (* print results */ //printf("result after %d times loop:\n",l); if((*opt).zeroself == 1){ for(i=0;i<(*opt).dsize;i++){ RNG_d_tbl[i][i] = 0; } } for(i=0;i<(*opt).dsize;i++){ printf("%f",RNG_d_tbl[i][0]); for(j=1;j<(*opt).dsize;j++){ printf(" %f",RNG_d_tbl[i][j]); } printf("\n"); } /* *) */ return(0); }
int main(int argc, char **argv){ int i,j; int mpi_rank; int mpi_size; char *file_name_head; char *mpi_target_file_name; char *mpi_rank_str; int mpi_c; int mpi_sample_dim = 0; int mpi_sample_num = 0; int *mpi_sample_num_list; float *mpi_sample_ave_vec; float **mpi_sample_ave_mat; double *total_sample_ave_vec; double total_sample_num; char **mpi_sample_head; float **mpi_sample_mat; int *mpi_reccount_list; int *mpi_displs; FILE *mpi_target_fp; file_name_head = c_alloc_vec(STRSIZE_LARGE); sscanf(argv[1],"%s",file_name_head); MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); mpi_rank_str = c_calloc_vec(STRSIZE); mpi_target_file_name = c_calloc_vec(STRSIZE_LARGE); mpi_sample_num_list = i_alloc_vec(mpi_size); mpi_reccount_list = i_alloc_vec(mpi_size); mpi_displs = i_alloc_vec(mpi_size); sprintf(mpi_rank_str,"%d",mpi_rank); sprintf(mpi_target_file_name,"%s",file_name_head); strcat(mpi_target_file_name,"."); strcat(mpi_target_file_name,mpi_rank_str); /* (* file: open */ printf("[%d/%d] file: open\n",mpi_rank,mpi_size); if((mpi_target_fp = fopen(mpi_target_file_name,"r")) == NULL){ perror(mpi_target_file_name); exit(0); } read_ilist_from_stream(1,mpi_target_fp,&mpi_sample_dim); read_ilist_from_stream(1,mpi_target_fp,&mpi_sample_num); mpi_sample_head = c_alloc_mat(mpi_sample_num,STRSIZE); mpi_sample_mat = f_alloc_mat(mpi_sample_num,mpi_sample_dim); mpi_sample_ave_vec = f_calloc_vec(mpi_sample_dim); mpi_sample_ave_mat = f_calloc_mat(mpi_size,mpi_sample_dim); total_sample_ave_vec = d_calloc_vec(mpi_sample_dim); read_ID_ftable_from_stream(mpi_sample_num,mpi_sample_dim,mpi_target_fp,mpi_sample_mat,mpi_sample_head); fclose(mpi_target_fp); printf("[%d/%d] file: close\n",mpi_rank,mpi_size); /* *) */ /* (* check */ printf("[%d/%d] ave:start:",mpi_rank,mpi_size); for(j=0;j<mpi_sample_dim;j++){ printf(" %lf",mpi_sample_ave_vec[j]); } printf("\n"); /* *) */ /* (* rank vec mean */ for(i=0;i<mpi_sample_num;i++){ for(j=0;j<mpi_sample_dim;j++){ mpi_sample_ave_vec[j] += mpi_sample_mat[i][j]; } } for(j=0;j<mpi_sample_dim;j++){ mpi_sample_ave_vec[j] = mpi_sample_ave_vec[j]/mpi_sample_num; } /* *) */ /* (* check */ for(i=0;i<mpi_sample_num;i++){ printf("%s",mpi_sample_head[i]); for(j=0;j<mpi_sample_dim;j++){ printf(" %lf",mpi_sample_mat[i][j]); } printf("\n"); } printf("[%d/%d] ave:end:",mpi_rank,mpi_size); for(j=0;j<mpi_sample_dim;j++){ printf(" %lf",mpi_sample_ave_vec[j]); } printf("\n"); /* *) */ /* (* allgather num */ for(i=0;i<mpi_size;i++){ mpi_reccount_list[i] = 1; //recieve from size:1 each rank } for(i=0;i<mpi_size;i++){ mpi_displs[i] = i; } MPI_Allgatherv(&mpi_sample_num, 1, MPI_INT, mpi_sample_num_list, mpi_reccount_list, mpi_displs, MPI_INT, MPI_COMM_WORLD ); fprintf(stdout,"[%d/%d] sample dimensions:%d:\n",mpi_rank,mpi_size,mpi_sample_dim); fprintf(stdout,"[%d/%d] num samples:%d:\n",mpi_rank,mpi_size,mpi_sample_num); for(i=0;i<mpi_size;i++){ fprintf(stdout,"[%d/%d]mpi_sample_num_list[%d]:%d:\n",mpi_rank,mpi_size,i,mpi_sample_num_list[i]); } /* *) */ /* (* allgather ave_mat */ for(i=0;i<mpi_size;i++){ mpi_reccount_list[i] = mpi_sample_dim; //recieve sizes:mpi_sample_dim from each rank } for(i=0;i<mpi_size;i++){ mpi_displs[i] = i*mpi_sample_dim; //recieve pointers for each rank } MPI_Allgatherv(mpi_sample_ave_vec,mpi_sample_dim,MPI_FLOAT,mpi_sample_ave_mat[0],mpi_reccount_list,mpi_displs,MPI_FLOAT,MPI_COMM_WORLD); //???? //MPI_Allgatherv(mpi_sample_ave_vec,mpi_sample_dim,MPI_FLOAT,&mpi_sample_ave_mat[0][0],mpi_reccount_list,mpi_displs,MPI_FLOAT,MPI_COMM_WORLD); //???? for(i=0;i<mpi_size;i++){ for(j=0;j<mpi_sample_dim;j++){ printf(" [%d/%d:%d:%d]:%f",mpi_rank,mpi_size,i,j,mpi_sample_ave_mat[i][j]); } printf("\n"); } /* *) */ /* (* total mean */ total_sample_num = 0; for(i=0;i<mpi_size;i++){ total_sample_num += mpi_sample_num_list[i]; } printf("[%d/%d] total_sample_num:%d:\n",mpi_rank,mpi_size,total_sample_num); for(i=0;i<mpi_size;i++){ for(j=0;j<mpi_sample_dim;j++){ total_sample_ave_vec[j] += (double)(mpi_sample_ave_mat[i][j] * mpi_sample_num_list[i]); } } for(j=0;j<mpi_sample_dim;j++){ total_sample_ave_vec[j] = total_sample_ave_vec[j]/total_sample_num; } for(j=0;j<mpi_sample_dim;j++){ printf(" [%d/%d]total_sample_ave_vec[%d]:%lf",mpi_rank,mpi_size,j,total_sample_ave_vec[j]); } printf("\n"); /* *) */ MPI_Finalize(); fprintf(stdout,"\n[%d/%d] END\n",mpi_rank,mpi_size); }