void learning_loop_monitor(int _loop_offset, int _monitor, int _loop, float _err_correct_rate, int _err_ck, float _err_thrld, int _check_cl, int _check_cl_interval, int _generated, float _r_generated, int _generated_suppress_clst_num, int _generated_interval, int _max_num_clst, int _unified, float _r_unified, int _u_interval, int _u_suppress_clst_num, int _delete, float _delete_threshold, int _delete_interval, int _cutoff, float _cutoff_value, int _cutoff_iteration, int _cutoff_gen, float _cutoff_ol_th, float _cutoff_gen_th, int _cutoff_interval, int _grouping_mode, float _grouping_radius_index, float _grouping_member_index, float _grouping_density_index, float _grouping_radius_ratio, int _moved, float _moved_rate, int _moved_interval, float _r_moved_suppress, int _dim_clst, int _num_clst, float **_clst_matrix, int _dim_smpl, int _num_smpl, float **_smpl_matrix, float **_dif_table, float **_clst_smpl_dist_table, float **_clst_clst_dist_table, float **_sum_ref_smpl_list, float **_ave_ref_smpl_list, float *_ave_coordinate_smpl, int *_alloc_num_clst, int *_assigned_num_clst, float *_total_sum_dist, struct status *_attrb_list_min, struct status *_attrb_list_max, struct clst_status *_clst_status_list, struct clst_status *_clst_status_list_prev, char **_sample_id, int *_l_times, int _data_form,FILE *_lfp){ int a = _loop_offset; int i = 0; int j = 0; int k = 0; int assigned_num_clst = 0; float clst_clst_min_dist = 0; /* for clst unifying*/ int clst_clst_min_position[2] = {0,0}; /* for clst unifying*/ float *merged_list = NULL; //int *flaged_list = NULL; float dist_clst_to_ave_smpl = 0; float ave_ave_radius_clst = 0; /* for generated */ float ave_ave_clst_num = 0; /* for generated */ float **arranged_clst_smpl_dist_table = NULL; int *min_pos_to_data_list = NULL; /*for moving*/ float *min_dist_to_data_list = NULL; /*for moving*/ int *max_pos_to_data_list = NULL; /*for moving*/ float *max_dist_to_data_list = NULL; /*for moving*/ int *outlier = NULL; /*for cutoff_gen*/ int *outlier_stat = NULL; /*for cutoff_gen*/ float **outlier_vec = NULL; /*for cutoff_gen*/ float **outlier_dist_tri = NULL; /*for cutoff_gen*/ int num_outlier = 0; /*for cutoff_gen*/ float ave_ave_radius_th = 0; /*for cutoff_gen*/ float ave_ave_radius_th_del = 0; /*for delete*/ float th_del = 0; /*for delete*/ int num_del_clst = 0; /*for delete*/ int *del_clst_list = NULL; /*for delete length=num_del_clst*/ int *del_clst_count_list = NULL; /*for delete length=_num_clst*/ float *total_sq_err = 0; float ave_total_sq_err = 0; float unifying_dist = 0; struct status generated_node; int check_cl_count = 0; merged_list = f_alloc_vec(_dim_clst); //flaged_list = i_alloc_vec(_num_clst); outlier = i_alloc_vec(_num_smpl); del_clst_list = i_calloc_vec(_max_num_clst); del_clst_count_list = i_calloc_vec(_max_num_clst); if((_monitor&1) == 1){ fprintf(_lfp,"\n\n" DELIM BRK_S); } if(grouping_mode >= 1){ arranged_clst_smpl_dist_table = f_alloc_mat(_num_smpl,_num_clst); } for(a=_loop_offset;a<_loop;a++){ (*_l_times)++; /* (* print _clst_matrix */ if((_monitor >= 2)&&((_monitor&1) == 1)&&(a >= 1)){ fprintf(_lfp,"\n" DELIM BRK_S BRK_S "\"loop[%d]::\"" BRK_E,a); }else if((_monitor >= 2)&&((_monitor&1) == 1)&&(a == 0)){ fprintf(_lfp,BRK_S BRK_S "\"loop[%d]::\"" BRK_E,a); } if((_monitor&3) == 3){ fprintf(_lfp,DELIM "\n" BRK_S "\"clst dim,num:\"" DELIM "%d" DELIM "%d" BRK_E DELIM "\n",_dim_clst,_num_clst); fprintf(_lfp,BRK_S "\"clst coordinate:\""); for(i=0;i<_num_clst;i++){ fprintf(_lfp,DELIM "\n" BRK_S "%f",_clst_matrix[i][0]); for(j=1;j<_dim_clst;j++){ fprintf(_lfp,DELIM "%f",_clst_matrix[i][j]); } fprintf(_lfp,BRK_E); } fprintf(_lfp,BRK_E); } /* *) */ /* (* [2]. caluculate _clst_smpl_dist_table */ dist_table_func(_num_smpl,_smpl_matrix,_num_clst,_clst_matrix,_dim_smpl,_clst_smpl_dist_table); /* *) */ /* (* print _clst_smpl_dist_table */ if((_monitor&9) == 9){ fprintf(_lfp,DELIM "\n" BRK_S "\"clst-data distance:\""); for(j=0;j<_num_smpl;j++){ fprintf(_lfp,DELIM "\n" BRK_S "%f",_clst_smpl_dist_table[j][0]); for(i=1;i<_num_clst;i++){ fprintf(_lfp,DELIM "%f",_clst_smpl_dist_table[j][i]); } fprintf(_lfp,BRK_E); } fprintf(_lfp,BRK_E); } /* *) */ /* (* [3]. find farther clst from each sample (_attrb_list_max) */ if(_generated == 8){ if(_grouping_mode == 0){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,3); } }else if(_grouping_mode == 1){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].ave_dist <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 2){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 3){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 4){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 5){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 6){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 7){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } }else if(_grouping_mode == 8){ for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_max,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i] - (_clst_status_list[i].ave_dist * _grouping_radius_index); } } for(i=0;i<_num_smpl;i++){ f_max_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_max,i,2); } } } /* *) */ /* (* [4]. find nearest clst from each sample (_attrb_list_min) */ if(_grouping_mode == 0){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,3); } }else if(_grouping_mode == 1){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].ave_dist <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 2){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 3){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 4){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 5){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 6){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 7){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node <= 0){ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]; }else{ arranged_clst_smpl_dist_table[j][i] = _clst_smpl_dist_table[j][i]*pow(_clst_status_list[i].ave_dist,_grouping_radius_index)*pow(_clst_status_list[i].num_smpl_node,_grouping_member_index)*pow(((float)_clst_status_list[i].num_smpl_node / _clst_status_list[i].ave_dist),grouping_density_index); } } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } }else if(_grouping_mode == 8){ for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,_clst_smpl_dist_table[i],_attrb_list_min,i,1); } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ arranged_clst_smpl_dist_table[j][i] = (_clst_smpl_dist_table[j][i] - (_clst_status_list[i].ave_dist * _grouping_radius_ratio)); } } for(i=0;i<_num_smpl;i++){ f_min_status_list(_num_clst,arranged_clst_smpl_dist_table[i],_attrb_list_min,i,2); } } /* *) */ /* (* [5]. allocate samples to each cluster, set cluster radius and num of members, including cutoff-generation and delete-preparation */ for(i=0;i<_num_clst;i++){ _clst_status_list[i].num_smpl_node = 0; _clst_status_list[i].sum_dist = 0; _clst_status_list[i].ave_dist = 0; } for(j=0;j<_num_smpl;j++){ for(i=0;i<_num_clst;i++){ if(_attrb_list_min[j].pos == i){ _clst_status_list[i].id_smpl_node[_clst_status_list[i].num_smpl_node] = j; _clst_status_list[i].num_smpl_node++; _clst_status_list[i].sum_dist += _attrb_list_min[j].value; } } } for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node >= 1){ _clst_status_list[i].ave_dist = (_clst_status_list[i].sum_dist) / (_clst_status_list[i].num_smpl_node); } } if((_cutoff == 1)&&(a >= _cutoff_iteration)){ for(i=0;i<_num_clst;i++){ _clst_status_list[i].num_arranged_smpl_node = 0; } for(i=0;i<_num_clst;i++){ for(j=0;j<_clst_status_list[i].num_smpl_node;j++){ if(_clst_smpl_dist_table[_clst_status_list[i].id_smpl_node[j]][i] <= _clst_status_list[i].ave_dist * _cutoff_value){ _clst_status_list[i].id_arranged_smpl_node[_clst_status_list[i].num_arranged_smpl_node] = _clst_status_list[i].id_smpl_node[j]; _clst_status_list[i].num_arranged_smpl_node++; }else{ fprintf(stderr,"found outlier in cl[%d] loop[%d]!!\n",i,a); } } } }else if((_cutoff_gen == 1)&&(a%_cutoff_interval == 0)){ num_outlier = 0; for(j=0;j<_num_smpl;j++){ outlier[j] = -1; } for(i=0;i<_num_clst;i++){ _clst_status_list[i].num_arranged_smpl_node = 0; } for(i=0;i<_num_clst;i++){ for(j=0;j<_clst_status_list[i].num_smpl_node;j++){ if(_clst_smpl_dist_table[_clst_status_list[i].id_smpl_node[j]][i] <= _clst_status_list[i].ave_dist * _cutoff_ol_th){ _clst_status_list[i].id_arranged_smpl_node[_clst_status_list[i].num_arranged_smpl_node] = _clst_status_list[i].id_smpl_node[j]; _clst_status_list[i].num_arranged_smpl_node++; }else{ outlier[num_outlier] = _clst_status_list[i].id_smpl_node[j]; num_outlier++; } } } for(j=0;j<num_outlier;j++){ fprintf(stderr,"found outlier %d \n",outlier[j]); } /*memory allocation*/ //outlier_dist_tri = f_calloc_triangle(num_outlier); outlier_dist_tri = f_calloc_lower_triangle(num_outlier); if((outlier_vec = malloc(sizeof(float *) * num_outlier)) == NULL){ fprintf(stderr,"failed malloc at outlier_vec\n."); exit(0); } outlier_stat = i_calloc_vec(num_outlier); /*ave_ave_radius for generate*/ /* ave_ave_radius_th = 0; for(i=0;i<_num_clst;i++){ ave_ave_radius_th = ave_ave_radius_th + _clst_status_list[i].ave_dist; } ave_ave_radius_th = (ave_ave_radius_th/_num_clst * _cutoff_gen_th); */ /*calculate outlier-outlier dist*/ for(j=0;j<num_outlier;j++){ outlier_vec[j] = _smpl_matrix[outlier[j]]; } euc_dist_triangle(num_outlier, _dim_smpl, outlier_vec, outlier_dist_tri); for(i=0;i<num_outlier;i++){ for(j=0;j<i;j++){ if(outlier_dist_tri[i][j] < _cutoff_gen_th){ outlier_stat[i]++; } } } /*cluster generate*/ for(i=0;i<num_outlier;i++){ if((outlier_stat[i] == 0)&&(_num_clst < _max_num_clst)){ for(j=0;j<_dim_smpl;j++){ _clst_matrix[_num_clst][j] = _smpl_matrix[outlier[i]][j]; } _num_clst++; } } /*memory free*/ free(outlier_stat); free(outlier_vec); /* for(j=0;j<num_outlier;j++){ free(outlier_dist_tri[j]); } */ free(outlier_dist_tri[0]); free(outlier_dist_tri); }else if((_cutoff_gen == 2)&&(a%_cutoff_interval == 0)){ num_outlier = 0; for(j=0;j<_num_smpl;j++){ outlier[j] = -1; } for(i=0;i<_num_clst;i++){ _clst_status_list[i].num_arranged_smpl_node = 0; } for(i=0;i<_num_clst;i++){ for(j=0;j<_clst_status_list[i].num_smpl_node;j++){ if(_clst_smpl_dist_table[_clst_status_list[i].id_smpl_node[j]][i] <= _clst_status_list[i].ave_dist * _cutoff_ol_th){ _clst_status_list[i].id_arranged_smpl_node[_clst_status_list[i].num_arranged_smpl_node] = _clst_status_list[i].id_smpl_node[j]; _clst_status_list[i].num_arranged_smpl_node++; }else{ outlier[num_outlier] = _clst_status_list[i].id_smpl_node[j]; num_outlier++; } } } for(j=0;j<num_outlier;j++){ fprintf(stderr,"found outlier %d \n",outlier[j]); } /*memory allocation*/ //outlier_dist_tri = f_calloc_triangle(num_outlier); outlier_dist_tri = f_calloc_lower_triangle(num_outlier); if((outlier_vec = malloc(sizeof(float *) * num_outlier)) == NULL){ fprintf(stderr,"failed malloc at outlier_vec\n."); exit(0); } outlier_stat = i_calloc_vec(num_outlier); /*ave_ave_radius for generate*/ ave_ave_radius_th = 0; for(i=0;i<_num_clst;i++){ ave_ave_radius_th = ave_ave_radius_th + _clst_status_list[i].ave_dist; } ave_ave_radius_th = (ave_ave_radius_th/_num_clst * _cutoff_ol_th * 1); /*calculate outlier-outlier dist*/ for(j=0;j<num_outlier;j++){ outlier_vec[j] = _smpl_matrix[outlier[j]]; } euc_dist_triangle(num_outlier, _dim_smpl, outlier_vec, outlier_dist_tri); for(i=0;i<num_outlier;i++){ for(j=0;j<i;j++){ if(outlier_dist_tri[i][j] < ave_ave_radius_th){ outlier_stat[i]++; } } } /*cluster generate*/ for(i=0;i<num_outlier;i++){ if((outlier_stat[i] == 0)&&(_num_clst < _max_num_clst)){ for(j=0;j<_dim_smpl;j++){ _clst_matrix[_num_clst][j] = _smpl_matrix[outlier[i]][j]; } _num_clst++; } } /*memory free*/ free(outlier_stat); free(outlier_vec); /* for(j=0;j<num_outlier;j++){ free(outlier_dist_tri[j]); } */ free(outlier_dist_tri[0]); free(outlier_dist_tri); }else if(_delete > 0){ /*ave_ave_radius for delete*/ ave_ave_radius_th_del = 0; for(i=0;i<_num_clst;i++){ ave_ave_radius_th_del = ave_ave_radius_th_del + _clst_status_list[i].ave_dist; } ave_ave_radius_th_del = (ave_ave_radius_th_del / _num_clst); } /* *) */ /* (* print clst_status_list */ if((_monitor&17) == 17){ fprintf(_lfp,DELIM "\n" BRK_S "\"number of referencing data-nodes:\""); for(i=0;i<_num_clst;i++){ fprintf(_lfp,DELIM "\n" BRK_S "\"_clst_status_list[%d].num_smpl_node:\"" DELIM "%d" BRK_E,i,_clst_status_list[i].num_smpl_node); } fprintf(_lfp,BRK_E DELIM "\n" BRK_S "\"data number of each cluster:\""); if(_data_form == 1){ for(i=0;i<_num_clst;i++){ fprintf(_lfp,DELIM "\n" BRK_S "\"_clst_status_list[%d].id_smpl_node[]:\"",i); for(j=0;j<_clst_status_list[i].num_smpl_node;j++){ fprintf(_lfp,DELIM "%d",_clst_status_list[i].id_smpl_node[j]); } fprintf(_lfp,BRK_E); } }else if(_data_form == 2){ for(i=0;i<_num_clst;i++){ fprintf(_lfp,DELIM "\n" BRK_S "\"_clst_status_list[%d].id_smpl_node[]:\"",i); for(j=0;j<_clst_status_list[i].num_smpl_node;j++){ fprintf(_lfp,DELIM "\"%s\"",_sample_id[_clst_status_list[i].id_smpl_node[j]]); } fprintf(_lfp,BRK_E); } } fprintf(_lfp,BRK_E); } /* *) */ /* (* print cluster radius */ if((_monitor&33) == 33){ *_total_sum_dist = 0; fprintf(_lfp,DELIM "\n" BRK_S "\"dist_to_data_node_from_clst (sum,ave):\""); for(i=0;i<_num_clst;i++){ *_total_sum_dist += _clst_status_list[i].sum_dist; fprintf(_lfp,DELIM "\n" BRK_S "%f" DELIM "%f" BRK_E,_clst_status_list[i].sum_dist,_clst_status_list[i].ave_dist); } fprintf(_lfp,DELIM "\n" BRK_S "\"Total:\"" DELIM "%f" BRK_E BRK_E,*_total_sum_dist); } /* *) */ /* (* [7]. reference operation, including centroid detection and cutoff operation */ if(((_cutoff == 0)&&(_cutoff_gen == 0))||(a < _cutoff_iteration)){ for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ _ave_ref_smpl_list[j][i] = 0; } } for(j=0;j<_num_clst;j++){ add_column_of_matrix(_clst_status_list[j].num_smpl_node,_dim_clst,_clst_status_list[j].id_smpl_node,_smpl_matrix,_ave_ref_smpl_list[j]); } for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ if(_clst_status_list[j].num_smpl_node > 0){ _ave_ref_smpl_list[j][i] = (_ave_ref_smpl_list[j][i])/(_clst_status_list[j].num_smpl_node); } } } }else{ for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ _ave_ref_smpl_list[j][i] = 0; } } for(j=0;j<_num_clst;j++){ add_column_of_matrix(_clst_status_list[j].num_arranged_smpl_node,_dim_clst,_clst_status_list[j].id_arranged_smpl_node,_smpl_matrix,_ave_ref_smpl_list[j]); } for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ if(_clst_status_list[j].num_arranged_smpl_node > 0){ _ave_ref_smpl_list[j][i] = (_ave_ref_smpl_list[j][i])/(_clst_status_list[j].num_arranged_smpl_node); } } } } /* *) */ /* (* [8]. calclate errors between centroid and each clst */ for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ _dif_table[j][i] = 0; } } for(j=0;j<_num_clst;j++){ if(_clst_status_list[j].num_smpl_node > 0){ dif_2lists(_dim_clst,_clst_matrix[j],_ave_ref_smpl_list[j],_dif_table[j]); } } /* *) */ /* (* print errors */ if((_monitor&65) == 65){ fprintf(_lfp,DELIM "\n" BRK_S "\"error:\""); for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ fprintf(_lfp,DELIM "%f",_dif_table[j][i]); } } fprintf(_lfp,BRK_E); } /* *) */ /* (* [9]. check errors for breaking loop */ if(_err_ck == 1){ assigned_num_clst = 0; for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node != 0){ assigned_num_clst++; } } total_sq_err = f_calloc_vec(_num_clst); for(j=0;j<_num_clst;j++){ for(i=0;i<_dim_clst;i++){ total_sq_err[j] += pow(_dif_table[j][i],2); } } for(j=0;j<_num_clst;j++){ total_sq_err[j] = sqrt(total_sq_err[j]); ave_total_sq_err =+ total_sq_err[j]; } /* ave_total_sq_err = ave_total_sq_err/_num_clst; */ ave_total_sq_err = ave_total_sq_err/assigned_num_clst; if(ave_total_sq_err < _err_thrld){ break; } free(total_sq_err); } /* *) */ /* (* [10]. check cluster member */ if((_check_cl == 1)&&(a%_check_cl_interval == 0)&&(a>_check_cl_interval)){ check_cl_count = 0; for(j=0;j<_num_clst;j++){ if(_clst_status_list[j].num_smpl_node != _clst_status_list_prev[j].num_smpl_node){ check_cl_count++; } } if(check_cl_count == 0){ for(j=0;j<_num_clst;j++){ for(i=0;i<_clst_status_list[j].num_smpl_node;i++){ if(_clst_status_list[j].id_smpl_node[i] != _clst_status_list_prev[j].id_smpl_node[i]){ check_cl_count++; } } } } if(check_cl_count > 0){ fprintf(stderr,"break at %d\n",a); break; } for(j=0;j<_num_clst;j++){ _clst_status_list_prev[j].num_smpl_node = _clst_status_list[j].num_smpl_node; for(i=0;i<_clst_status_list[j].num_smpl_node;i++){ _clst_status_list_prev[j].id_smpl_node[i] = _clst_status_list[j].id_smpl_node[i]; } } } /* *) */ /* (* [11]. correct and write clst matrix (cluster move) */ move_write_matrix(_num_clst,_dim_clst,_clst_matrix,_dif_table,_err_correct_rate); /* *) */ /* (* [12]. caluculate _clst_clst_dist_table */ if(((_monitor&5) == 5)||(_unified > 0)||(_delete > 0)){ dist_triangle_func(_num_clst,_dim_clst,_clst_matrix,_clst_clst_dist_table); } /* *) */ /* (* print clst-clst distance */ if((_monitor&5) == 5){ fprintf(_lfp,DELIM "\n" BRK_S "\"clst-clst distance:\""); for(i=1;i<_num_clst;i++){ fprintf(_lfp,DELIM "\n" BRK_S "%f",_clst_clst_dist_table[i][0]); for(j=1;j<i;j++){ fprintf(_lfp,DELIM "%f",_clst_clst_dist_table[i][j]); } fprintf(_lfp,BRK_E); } fprintf(_lfp,BRK_E); } /* *) */ /* (* [13]. cluster delete */ if((_delete == 1)&&(a%_delete_interval == 0)){ th_del = _delete_threshold; num_del_clst = 0; for(i=0;i<_num_clst;i++){ del_clst_count_list[i] = 0; } fprintf(stderr,"\n--- del th:%f: ---\n",th_del); for(i=1;i<_num_clst;i++){ for(j=0;j<i;j++){ if(_clst_clst_dist_table[i][j] < th_del){ del_clst_count_list[i]++; } } if(del_clst_count_list[i] > 0){ del_clst_list[num_del_clst] = i; num_del_clst++; } } /* print clst matrix fprintf(stderr,"-----clst matrix-----\n"); fprintf(stderr,"_num_clst :%d:\n",_num_clst); for(i=0;i<_num_clst;i++){ for(j=0;j<_dim_clst;j++){ fprintf(stderr,"%f ",_clst_matrix[i][j]); } fprintf(stderr,"\n"); } fprintf(stderr,"----- -----\n"); */ for(k=0;k<num_del_clst;k++){ fprintf(stderr,"delete cluster %d\n",del_clst_list[k]); for(j=0;j<_dim_clst;j++){ _clst_matrix[del_clst_list[k]][j] = _clst_matrix[_num_clst - 1][j]; } _num_clst--; } fprintf(stderr,"--- --- --- ---\n"); }else if(_delete == 2){ ave_ave_radius_th_del = ave_ave_radius_th_del * _delete_threshold; num_del_clst = 0; for(i=0;i<_num_clst;i++){ del_clst_count_list[i] = 0; } fprintf(stderr,"\n--- del th:%f: ---\n",ave_ave_radius_th_del); for(i=1;i<_num_clst;i++){ for(j=0;j<i;j++){ if(_clst_clst_dist_table[i][j] < ave_ave_radius_th_del){ del_clst_count_list[i]++; } } if(del_clst_count_list[i] > 0){ del_clst_list[num_del_clst] = i; num_del_clst++; } } /* print clst matrix fprintf(stderr,"-----clst matrix-----\n"); fprintf(stderr,"_num_clst :%d:\n",_num_clst); for(i=0;i<_num_clst;i++){ for(j=0;j<_dim_clst;j++){ fprintf(stderr,"%f ",_clst_matrix[i][j]); } fprintf(stderr,"\n"); } fprintf(stderr,"----- -----\n"); */ for(k=0;k<num_del_clst;k++){ fprintf(stderr,"delete cluster %d\n",del_clst_list[k]); for(j=0;j<_dim_clst;j++){ _clst_matrix[del_clst_list[k]][j] = _clst_matrix[_num_clst - 1][j]; } _num_clst--; } fprintf(stderr,"--- --- --- ---\n"); } /* *) */ /* (* [14]. cluster unifying */ if((_unified == 1)&&(a > 0)&&(_num_clst > _u_suppress_clst_num)){ /* _r_unified : distance */ min_dist_table_position(_num_clst,_clst_clst_dist_table,&clst_clst_min_dist,clst_clst_min_position); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n" BRK_S "\"unified:on\"" DELIM "\n"); fprintf(_lfp,"\"clst-clst_min_pos:\"" DELIM "%d" DELIM "%d" DELIM "\n",clst_clst_min_position[0],clst_clst_min_position[1]); fprintf(_lfp,"\"clst-clst_min_dist:\"" DELIM "%f",clst_clst_min_dist); } if(a%_u_interval == 0){ if(_r_unified > clst_clst_min_dist){ merge_list(_dim_clst,_clst_matrix[clst_clst_min_position[0]],_clst_matrix[clst_clst_min_position[1]],merged_list); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n\"merged coordinate:\""); for(i=0;i<_dim_clst;i++){ fprintf(_lfp,DELIM "%f",merged_list[i]); } } j = 0; for(i=0;i<_num_clst;i++){ if((i != clst_clst_min_position[0])&&(i != clst_clst_min_position[1])){ _clst_matrix[j] = _clst_matrix[i]; j++; } } _clst_matrix[j] = merged_list; for(i=j;i<_num_clst;i++){ _clst_status_list[i].num_smpl_node = 0; } _num_clst--; } if((_monitor&129) == 129){ fprintf(_lfp,BRK_E); } } }else if((_unified == 2)&&(a > 0)&&(_num_clst > _u_suppress_clst_num)){ /* _r_unified : ratio */ min_dist_table_position(_num_clst,_clst_clst_dist_table,&clst_clst_min_dist,clst_clst_min_position); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n" BRK_S "\"unified:on\"" DELIM "\n"); fprintf(_lfp,"\"clst-clst_min_pos:\"" DELIM "%d" DELIM "%d" DELIM "\n",clst_clst_min_position[0],clst_clst_min_position[1]); fprintf(_lfp,"\"clst-clst_min_dist:\"" DELIM "%f",clst_clst_min_dist); } if(a%_u_interval == 0){ unifying_dist = _r_unified * (_clst_status_list[clst_clst_min_position[0]].ave_dist + _clst_status_list[clst_clst_min_position[1]].ave_dist); if(unifying_dist > clst_clst_min_dist){ merge_list(_dim_clst,_clst_matrix[clst_clst_min_position[0]],_clst_matrix[clst_clst_min_position[1]],merged_list); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n\"merged coordinate:\""); for(i=0;i<_dim_clst;i++){ fprintf(_lfp,DELIM "%f",merged_list[i]); } } j = 0; for(i=0;i<_num_clst;i++){ if((i != clst_clst_min_position[0])&&(i != clst_clst_min_position[1])){ _clst_matrix[j] = _clst_matrix[i]; j++; } } _clst_matrix[j] = merged_list; for(i=j;i<_num_clst;i++){ _clst_status_list[i].num_smpl_node = 0; } _num_clst--; } if((_monitor&129) == 129){ fprintf(_lfp,BRK_E); } } }else if((_unified == 3)&&(a > 0)&&(_num_clst > _u_suppress_clst_num)){ /* _r_unified : ratio */ min_dist_table_position(_num_clst,_clst_clst_dist_table,&clst_clst_min_dist,clst_clst_min_position); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n" BRK_S "\"unified:on\"" DELIM "\n"); fprintf(_lfp,"\"clst-clst_min_pos:\"" DELIM "%d" DELIM "%d" DELIM "\n",clst_clst_min_position[0],clst_clst_min_position[1]); fprintf(_lfp,"\"clst-clst_min_dist:\"" DELIM "%f",clst_clst_min_dist); } if(a%_u_interval == 0){ unifying_dist = (_r_unified + _clst_status_list[clst_clst_min_position[0]].ave_dist + _clst_status_list[clst_clst_min_position[1]].ave_dist); if(unifying_dist > clst_clst_min_dist){ merge_list(_dim_clst,_clst_matrix[clst_clst_min_position[0]],_clst_matrix[clst_clst_min_position[1]],merged_list); if((_monitor&129) == 129){ fprintf(_lfp,DELIM "\n\"merged coordinate:\""); for(i=0;i<_dim_clst;i++){ fprintf(_lfp,DELIM "%f",merged_list[i]); } } j = 0; for(i=0;i<_num_clst;i++){ if((i != clst_clst_min_position[0])&&(i != clst_clst_min_position[1])){ _clst_matrix[j] = _clst_matrix[i]; j++; } } _clst_matrix[j] = merged_list; for(i=j;i<_num_clst;i++){ _clst_status_list[i].num_smpl_node = 0; } _num_clst--; } if((_monitor&129) == 129){ fprintf(_lfp,BRK_E); } } } /* *) */ /* (* [15]. cluster generating */ /* TODO: if monitor == 129, print generting informations. */ if((_generated == 1)&&(a > 0)&&(_num_clst < _max_num_clst)&&(a%_generated_interval == 0)){ /* using absolute distance */ generated_node.pos = 0; generated_node.value = _attrb_list_min[0].value; for(i=0;i<_num_smpl;i++){ if(generated_node.value < _attrb_list_min[i].value){ generated_node.pos = i; generated_node.value = _attrb_list_min[i].value; } } if((_num_clst < _generated_suppress_clst_num)&&(generated_node.value > _r_generated)){ for(i=0;i<_dim_smpl;i++){ _clst_matrix[_num_clst][i] = _smpl_matrix[generated_node.pos][i]; } _num_clst++; } }else if((_generated == 2)&&(a > 0)&&(_num_clst < _max_num_clst)&&(a%_generated_interval == 0)){ /* using radius ratio */ for(i=0;i<_num_clst;i++){ if(_clst_status_list[i].num_smpl_node > 0){ ave_ave_clst_num++; ave_ave_radius_clst += _clst_status_list[i].ave_dist; } } ave_ave_radius_clst = ave_ave_radius_clst / ave_ave_clst_num; /* you can choose single radius or double radius */ /* _r_generated = ave_ave_radius_clst * _r_generated; */ _r_generated = ave_ave_radius_clst * _r_generated * 2; generated_node.pos = 0; generated_node.value = _attrb_list_min[0].value; for(i=0;i<_num_smpl;i++){ if(generated_node.value < _attrb_list_min[i].value){ generated_node.pos = i; generated_node.value = _attrb_list_min[i].value; } } if((_num_clst < _generated_suppress_clst_num)&&(generated_node.value > _r_generated)){ for(i=0;i<_dim_smpl;i++){ _clst_matrix[_num_clst][i] = _smpl_matrix[generated_node.pos][i]; } _num_clst++; } }else if((_generated == 4)&&(a > 0)&&(_num_clst < _max_num_clst)&&(a%_generated_interval == 0)){ /* using absolute distance */ generated_node.pos = 0; generated_node.value = _clst_status_list[0].num_smpl_node; for(i=0;i<_num_clst;i++){ if(generated_node.value < (float)_clst_status_list[i].num_smpl_node){ generated_node.pos = i; generated_node.value = _clst_status_list[i].num_smpl_node; } } if((_num_clst < _generated_suppress_clst_num)&&(generated_node.value > _r_generated)){ for(i=0;i<_dim_smpl;i++){ _clst_matrix[_num_clst][i] = _clst_matrix[generated_node.pos][i]; /* simple copy */ /*_clst_matrix[_num_clst][i] = (_clst_matrix[generated_node.pos][i] + _smpl_matrix[_clst_status_list[generated_node.pos].id_smpl_node[0]][i])/2;*/ } _num_clst++; } }else if((_generated == 8)&&(a > 0)&&(_num_clst < _max_num_clst)&&(a%_generated_interval == 0)){ /* using absolute distance */ generated_node.pos = 0; generated_node.value = _attrb_list_max[0].value; for(i=0;i<_num_smpl;i++){ if(generated_node.value < _attrb_list_max[i].value){ generated_node.pos = i; generated_node.value = _attrb_list_max[i].value; } } if((_num_clst < _generated_suppress_clst_num)&&(generated_node.value > _r_generated)){ for(i=0;i<_dim_smpl;i++){ _clst_matrix[_num_clst][i] = _smpl_matrix[generated_node.pos][i]; } _num_clst++; } } /* *) */ /* (* [16]. force clster moving */ if((_moved&1) == 1){ if((_monitor&257) == 257){ fprintf(_lfp,DELIM "\n" BRK_S "\"moved:on"); } if((a%_moved_interval) == 0){ for(i=0;i<_num_clst;i++){ dist_clst_to_ave_smpl = distance_func(_dim_clst,_clst_matrix[i],_ave_coordinate_smpl); if((_clst_status_list[i].num_smpl_node == 0)&&((dist_clst_to_ave_smpl > _r_moved_suppress))){ for(j=0;j<_dim_clst;j++){ _clst_matrix[i][j] = _clst_matrix[i][j] + (_ave_coordinate_smpl[j] - _clst_matrix[i][j])*_moved_rate; } if((_monitor&257) == 257){ fprintf(_lfp,DELIM "\nmoved node[%d] : ",i); fprintf(_lfp,BRK_S "%f",_clst_matrix[i][0]); for(j=1;j<_dim_clst;j++){ fprintf(_lfp,DELIM "%f",_clst_matrix[i][j]); } fprintf(_lfp,BRK_E " %f",dist_clst_to_ave_smpl); } } } } if((_monitor&257) == 257){ fprintf(_lfp,"\""BRK_E); } }else if((_moved&2) == 2){ min_pos_to_data_list = i_alloc_vec(_num_clst); min_dist_to_data_list = f_alloc_vec(_num_clst); min_pos_matrix(_num_clst,_num_smpl,_clst_smpl_dist_table,min_pos_to_data_list,min_dist_to_data_list,0); if((_monitor&257) == 257){ fprintf(_lfp,DELIM "\n" BRK_S "\"moved:on"); } if(a%_moved_interval == 0){ for(i=0;i<_num_clst;i++){ if((_clst_status_list[i].num_smpl_node == 0)&&((min_dist_to_data_list[i] > _r_moved_suppress))){ for(j=0;j<_dim_clst;j++){ _clst_matrix[i][j] = _clst_matrix[i][j] + (_smpl_matrix[min_pos_to_data_list[i]][j] - _clst_matrix[i][j])*_moved_rate; } if((_monitor&257) == 257){ fprintf(_lfp,DELIM "\nmoved node[%d] to " BRK_S,i); fprintf(_lfp,"%f",_clst_matrix[i][0]); for(j=1;j<_dim_clst;j++){ fprintf(_lfp,DELIM "%f",_clst_matrix[i][j]); } fprintf(_lfp,BRK_E " -> data[%d]",min_pos_to_data_list[i]); fprintf(_lfp," distance : %f",min_dist_to_data_list[i]); } } } } if((_monitor&257) == 257){ fprintf(_lfp,"\""BRK_E); } free(min_pos_to_data_list); free(min_dist_to_data_list); }else if((_moved&4) == 4){ max_pos_to_data_list = i_alloc_vec(_num_clst); max_dist_to_data_list = f_alloc_vec(_num_clst); max_pos_matrix(_num_clst,_num_smpl,_clst_smpl_dist_table,max_pos_to_data_list,max_dist_to_data_list,0); if((_monitor&257) == 257){ fprintf(_lfp,"\n" DELIM BRK_S "\"moved:on"); } if(a%_moved_interval == 0){ for(i=0;i<_num_clst;i++){ if((_clst_status_list[i].num_smpl_node == 0)&&((max_dist_to_data_list[i] > _r_moved_suppress))){ for(j=0;j<_dim_clst;j++){ _clst_matrix[i][j] = _clst_matrix[i][j] + (_smpl_matrix[max_pos_to_data_list[i]][j] - _clst_matrix[i][j])*_moved_rate; } if((_monitor&257) == 257){ fprintf(_lfp,DELIM "\nmoved node[%d] to " BRK_S,i); fprintf(_lfp,"%f",_clst_matrix[i][0]); for(j=1;j<_dim_clst;j++){ fprintf(_lfp,DELIM "%f",_clst_matrix[i][j]); } fprintf(_lfp,BRK_E " -> data[%d]",max_pos_to_data_list[i]); fprintf(_lfp," distance : %f",max_dist_to_data_list[i]); } } } } if((_monitor&257) == 257){ fprintf(_lfp,"\""BRK_E); } free(max_pos_to_data_list); free(max_dist_to_data_list); }else if(_moved > 4){ } /* *) */ if((_monitor >= 2)&&((_monitor&1) == 1)){ fprintf(_lfp,BRK_E"\n"); } } /*end for-loop*/ if((_monitor&1) == 1){ fprintf(_lfp,BRK_E); } *_alloc_num_clst = _num_clst; *_assigned_num_clst = assigned_num_clst; }/*end function learning-loop*/
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); }
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; struct edge RNG_edge; int edge,num_RNG_edge = 0; int level,max_level; int cmp_path,num_path; int **path_list; int num_path_new = 0; int **path_list_new; int i,j; int c; int adding_num_path; int cmp_path_new = 0; opt = alloc_options(); init_options(opt); get_options(argc-1, argv+1, opt); 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 edge from ef */ /* (* raed */ 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.p = i_alloc_vec(num_RNG_edge * 2); RNG_edge.t = i_alloc_vec(num_RNG_edge * 2); i = 0; while((fgets(line,LEN,fp)) != NULL){ sscanf(line,"%d %d",RNG_edge.p+i,RNG_edge.t+i); i++; } fclose(fp); /* *) */ /* (* extend data */ for(j=i;j<num_RNG_edge*2;j++){ RNG_edge.t[j] = RNG_edge.p[j-num_RNG_edge]; RNG_edge.p[j] = RNG_edge.t[j-num_RNG_edge]; } /* printf("RNG_edge both:\n"); for(j=0;j<num_RNG_edge*2;j++){ printf("%d,%d\n",RNG_edge.p[j],RNG_edge.t[j]); } printf(":\n"); */ /* *) */ /* *) */ /* (* analyze path */ /* (* create first pathes level 1 */ level = 1; num_path = (*opt).dsize; path_list = i_alloc_mat(num_path,level); for(i=0;i<num_path;i++){ path_list[i][0] = i; } printf("#path level %d:\n",level); for(i=0;i<num_path;i++){ for(j=0;j<level;j++){ printf("%d,",path_list[i][j]); } printf("*\n"); } printf("#;\n"); /* *) */ /* (* extend path */ max_level = (*opt).dsize; for(level=2;level<=max_level;level++){ printf("#path level %d:\n",level); /* current level : to be made */ /* TODO : count num_path */ /* comp_node : path_list[cmp_path][level-2] */ //path_list_new = i_calloc_mat(MEM_BLK,level); //num_path_new = 0; adding_num_path = 0; /* (* count */ for(cmp_path=0;cmp_path<num_path;cmp_path++){ /* comp to RNG edge */ for(edge=0;edge<num_RNG_edge*2;edge++){ //printf("%d vs %d\n",path_list[cmp_path][level-2],RNG_edge.p[edge]); /* if path_list[][] == RNG_edge.p[] ; comp RNG_edge.t[] != path_list[][0:level-2] then ; add */ if(path_list[cmp_path][level-2] == RNG_edge.p[edge]){ //printf(" t:%d:\n",RNG_edge.t[edge]); if(if_match_int_sc_vec(RNG_edge.t[edge],path_list[cmp_path],level-2) == 0){ /* for(j=0;j<level-1;j++){ printf("%d,",path_list[cmp_path][j]); } */ //printf("%d-*\n",RNG_edge.t[edge]); adding_num_path++; } } /* check for(i=0;i<num_path;i++){ for(j=0;j<level-1;j++){ printf("%d,",path_list[i][j]); } printf("* vs %d\n",RNG_edge.p[edge]); } */ } } /* *) */ /* (* add */ //printf(" add_path:%d:\n",adding_num_path); num_path_new = adding_num_path; path_list_new = i_alloc_mat(num_path_new,level); /* TODO : extend path at level from level-1 OK */ cmp_path_new = 0; for(cmp_path=0;cmp_path<num_path;cmp_path++){ /* comp to RNG edge */ for(edge=0;edge<num_RNG_edge*2;edge++){ if(path_list[cmp_path][level-2] == RNG_edge.p[edge]){ //printf(" t:%d:\n",RNG_edge.t[edge]); if(if_match_int_sc_vec(RNG_edge.t[edge],path_list[cmp_path],level-2) == 0){ //for(i=0;i<num_path;i++){ for(j=0;j<level-1;j++){ //printf("%d-",path_list[cmp_path][j]); path_list_new[cmp_path_new][j] = path_list[cmp_path][j]; } //} //printf("%d-*\n",RNG_edge.t[edge]); path_list_new[cmp_path_new][level-1] = RNG_edge.t[edge]; cmp_path_new++; //adding_num_path++; } } } } /* *) */ /* (* print cmp_path_new printf(" path_list_new:\n"); for(i=0;i<num_path_new;i++){ for(j=0;j<level;j++){ printf("%d,",path_list_new[i][j]); } printf("*\n"); } printf(" :\n"); *) */ /* (* copy */ /*TODO : free path_list at level-1 OK */ //printf(" num_path:%d:\n",num_path); //printf(" num_path_new:%d:\n",num_path_new); free(path_list[0]); free(path_list); num_path = num_path_new; path_list = i_alloc_mat(num_path,level); /* copy */ for(i=0;i<num_path;i++){ for(j=0;j<level;j++){ path_list[i][j] = path_list_new[i][j]; } } /* (* check */ //printf(" path_list <copy>:\n"); for(i=0;i<num_path;i++){ for(j=0;j<level;j++){ printf("%d,",path_list[i][j]); } printf("*\n"); } //printf(" :\n"); /* *) */ /* *) */ printf("#;\n"); } /* *) */ /* *) */ return(0); }