| | |
| | | |
| | | for(i=0;i<cstlist->n;i++){ |
| | | if(cstlist->cluster[i]==NULL){ |
| | | if(i>=n) break; |
| | | //printf("Have to do compacting n=%d\n ",n); |
| | | do{ |
| | | n--; |
| | | } while(cstlist->cluster[n]==NULL && n>i); |
| | | if(i<=n) break; |
| | | cstlist->cluster[i]=cstlist->cluster[n]; |
| | | cstlist->cluster[n]=NULL; |
| | | //printf("After compacting n=%d\n",n); |
| | | } |
| | | } |
| | | cstlist->cluster=(ts_cluster **)realloc(cstlist->cluster,n*sizeof(ts_cluster *)); |
| | |
| | | } |
| | | |
| | | |
| | | ts_bool cluster_join(ts_cluster *cluster1, ts_cluster *cluster2){ |
| | | ts_bool cluster_join(ts_cluster_list *cstlist, ts_cluster *cluster1, ts_cluster *cluster2){ |
| | | ts_cluster *master_cluster,*slave_cluster; |
| | | ts_uint i; |
| | | if(cluster1->idx<cluster2->idx){ |
| | |
| | | for(i=0;i<slave_cluster->nvtx;i++){ |
| | | cluster_add_vertex(master_cluster,slave_cluster->vtx[i]); |
| | | } |
| | | cluster_free(slave_cluster); |
| | | slave_cluster=NULL; |
| | | //find cluster in the list and free the location of the cluster |
| | | for(i=0;i<cstlist->n;i++){ |
| | | if(cstlist->cluster[i]==slave_cluster){ |
| | | cluster_free(slave_cluster); |
| | | cstlist->cluster[i]=NULL; |
| | | } |
| | | } |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | |
| | | |
| | | /* This is a stub function. User should check whether the vertex is clustering or not. */ |
| | | ts_bool is_clusterable(ts_vertex *vtx){ |
| | | |
| | | return 1; |
| | | if(fabs(vtx->c)>1e-6){ |
| | | return 1; |
| | | } |
| | | else { |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | return NULL; |
| | | } |
| | | |
| | | ts_bool cluster_vertex_neighbor_check(ts_vertex *vtx){ |
| | | ts_bool cluster_vertex_neighbor_check(ts_cluster_list *cstlist, ts_vertex *vtx){ |
| | | |
| | | int j; |
| | | for(j=0;j<vtx->neigh_no;j++){ |
| | | if(vtx->neigh[j]->cluster!=NULL){ |
| | | if(vtx->neigh[j]->cluster!=vtx->cluster){ |
| | | cluster_join(vtx->cluster, vtx->neigh[j]->cluster); |
| | | cluster_join(cstlist, vtx->cluster, vtx->neigh[j]->cluster); |
| | | } |
| | | } |
| | | } |
| | |
| | | //for each vertex |
| | | vtx=vesicle->vlist->vtx[i]; |
| | | if(is_clusterable(vtx)){ |
| | | if(vtx->cluster!=NULL){ |
| | | if(vtx->cluster==NULL){ |
| | | //find first neigbor with cluster index |
| | | cst=cluster_vertex_neighbor(vtx); |
| | | if(cst==NULL){ |
| | |
| | | } else { |
| | | //we are added to the first cluster found |
| | | cluster_add_vertex(cst,vtx); |
| | | cluster_vertex_neighbor_check(vtx); |
| | | cluster_vertex_neighbor_check(cstlist, vtx); |
| | | cluster_list_compact(cstlist); |
| | | } |
| | | |