int DIS_list(Group * group, List *list, int A, int B) { int A_dis = group[list[A].group_idx].list_idx[!(list[A].group_idx_order)]; int B_dis = group[list[B].group_idx].list_idx[!(list[B].group_idx_order)]; if (A==B) return 0; merge_list(group, list, A,B_dis); merge_list(group, list, A_dis, B); printf(" DIS (%d,%d) \n", A, B); return 1; }
int recur_list(t_file **file, t_file **dir, t_env *e) { t_file *tmp; t_file *tmp2; struct stat info_file; t_file *dirtmp; dirtmp = NULL; tmp = *file; tmp2 = *dir; while (tmp) { if (!good_file(tmp->str, e)) { if (lstat(tmp->total, &info_file) != 0) error_dir(tmp->str, e); if (S_ISDIR(info_file.st_mode & S_IFMT)) add_link(tmp->total, ".", &dirtmp); } tmp = tmp->next; } if (dirtmp) return (merge_list(dir, &dirtmp)); else return (0); }
link_t mergesort_list(link_t head) { link_t heada,headb; link_t x,t; if(head==NULL || head->next==NULL){ return(head); } heada=head; headb=head; x=head->next; while(x!=NULL && x->next!=NULL){ headb=headb->next; x=x->next->next; } t=headb; headb=t->next; t->next=NULL; heada=mergesort_list(heada); headb=mergesort_list(headb); head=merge_list(heada,headb); return(head); }
int main() { int list2[] = {2, 3, 4, 9, 10, 12, 21, 25}; int list1[] = {10, 14, 15, 17, 20, 21, 35, 40, 41}; int *new_list = NULL; int len = (sizeof(list1) + sizeof(list2)) / sizeof(int); int len1 = sizeof(list1) / sizeof(int); int len2 = sizeof(list2) / sizeof(int); int i = 0; if (!len1 && !len2) { printf("NULL"); } else if (!len1) { new_list = list2; } else if (!len2) { new_list = list1; } else { new_list = merge_list(list1, list2, len, len1, len2); } if (new_list) { for (i = 0; i < len; i++) { printf("%d ", new_list[i]); } } }
/* ** The implementation of top-down list mergesort that carries the ** list length as a parameter to the recursive procedure and uses ** it to split the lists. */ link_t mergesort_list(link_t head,int length) { link_t heada,headb; link_t t; int middle=(length+1)/2; int i; if(head==NULL || head->next==NULL){ return(head); } heada=head; headb=head; for(i=1;i<middle;i++){ headb=headb->next; } t=headb; headb=t->next; t->next=NULL; heada=mergesort_list(heada,middle); headb=mergesort_list(headb,length-middle); head=merge_list(heada,headb); return(head); }
int main(void){ SqList la, lb, lc; init_linerseq(&la); init_linerseq(&lb); int a1[] = {2, 4, 5, 7, 9, 11}; int a2[] = {1, 2, 4, 5, 6, 9, 10}; cp_array_linerseq(&la, a1, sizeof(a1)/sizeof(a1[0])); cp_array_linerseq(&lb, a2, sizeof(a2)/sizeof(a2[0])); print_linerseq(&la); print_linerseq(&lb); merge_list(&la, &lb, &lc); print_linerseq(&lc); destory_linerseq(&la); destory_linerseq(&lb); destory_linerseq(&lc); return 0; }
/** * Merge sort * * * @return LIST */ LIST *merge_sort( LIST *head ) { LIST *list1 = head; if( (list1 == NULL) || (list1->next == NULL) ) { return list1; } LIST *list2 = list_bisect(list1); return merge_list(merge_sort(list1), merge_sort(list2)); }
void RegionGrowing::seedCorrespondingRegion( int *labels, const PointCloud::Ptr cloud, const PointNormal::Ptr normals, const int parent_index, const int seed_index) { Eigen::Vector4f seed_point = cloud->points[seed_index].getVector4fMap(); Eigen::Vector4f seed_normal = normals->points[ seed_index].getNormalVector4fMap(); std::vector<int> neigbor_indices; this->getPointNeigbour<int>(neigbor_indices, cloud->points[parent_index], 18); int neigb_lenght = static_cast<int>(neigbor_indices.size()); std::vector<int> merge_list(neigb_lenght); merge_list[0] = -1; #ifdef _OPENMP #pragma omp parallel for num_threads(this->num_threads_) #endif for (int i = 1; i < neigbor_indices.size(); i++) { int index = neigbor_indices[i]; if (index != parent_index && labels[index] == -1) { Eigen::Vector4f parent_pt = cloud->points[ parent_index].getVector4fMap(); Eigen::Vector4f child_pt = cloud->points[index].getVector4fMap(); Eigen::Vector4f child_norm = normals->points[ index].getNormalVector4fMap(); if (this->seedVoxelConvexityCriteria( seed_point, seed_normal, parent_pt, child_pt, child_norm, -0.01f) == 1) { merge_list[i] = index; labels[index] = 1; } else { merge_list[i] = -1; } } else { merge_list[i] = -1; } } #ifdef _OPENMP #pragma omp parallel for num_threads(this->num_threads_) schedule(guided, 1) #endif for (int i = 0; i < merge_list.size(); i++) { int index = merge_list[i]; if (index != -1) { seedCorrespondingRegion(labels, cloud, normals, index, seed_index); } } }
/** * 需要对变量结构进行改变的时候才传指针 */ int main(){ LinkList L=NULL; //&L是一个指向*node的指针,*node是取指向node的指针的值,两者不同 LinkList la=0,lb=0,lc=0; test(&la); traverse_list(la); printf("---------\n"); test1(&lb); traverse_list(lb); printf("---------\n"); merge_list(&la,&lb,&lc); traverse_list(lc); return 0; }
int main(void) { int count_a, count_b; LinkList la, lb, merge; count_a = count_b = 0; la = Creat_LinkList(&count_a); lb = Creat_LinkList(&count_b); printf("la:"); print_link(la); printf("lb:"); print_link(lb); merge = merge_list(la, lb, count_a, count_b); printf("merge:"); print_link(merge); return 0; }
/* testing program */ int main(void) { ListNode *head = NULL; ListNode *head1 = NULL; ListNode *head2 = NULL; ListNode *merge = NULL; if((head = create_list(10)) == NULL) fprintf(stderr,"failed to create list!\n"); #if 0/* reverse the list */ fprintf(stdout,"the list before reverse:\n"); print_list(head); reverse_list(&head); fprintf(stdout,"the list after reverse:\n"); print_list(head); #endif #if 0/* printf the last kth node */ print_list(head); print_the_last_kth_node(head,1); print_the_last_kth_node(head,10); print_the_last_kth_node(head,11); print_the_last_kth_node(head,5); #endif #if 0/* merge the two ordered list */ if((head1 = create_list_even(3)) == NULL) fprintf(stderr,"failed to create list!\n"); if((head2 = create_list_odd(5)) == NULL) fprintf(stderr,"failed to create list!\n"); printf("the even list:\n"); reverse_list(&head1); print_list(head1); printf("the odd list:\n"); reverse_list(&head2); print_list(head2); merge = merge_list(head1, head2); printf("the merge list:\n"); print_list(merge); #endif fprintf(stdout,"the origin list:\n"); print_list(head); print_list_reversely(head); return 0; }
//連結リスト版マージソート struct node *merge_sort_list(struct node *x) { struct node *a, *b, *p; //連結リストに要素が無いか、1つしか無いときはそのまま返す if (x == NULL || x->next == NULL) { return x; } //連結リストをスキャンするポインタ初期化 //aは1番目の要素を示す a = x; //bは3番目の要素(もし連結リストの長さが2なら2)を指す b = x->next; if (b != NULL) { b = b->next; } //ポインタbが連結リストの末尾に到達するまでポインタaを1つ進め、ポインタbを2つ進める //ポインタbが末尾に到達した時、ポインタaは連結リストのほぼ中央の要素をさしているはずである while (b != NULL) { a = a->next; b = b->next; if (b != NULL) { b = b->next; } } //連結リストをポインタaが指す要素の直後で2つに切断する p = a->next; a->next = NULL; //切断した連結リストを個別に整列して、その結果をマージする return merge_list(merge_sort_list(x), merge_sort_list(p)); }
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*/