From 6487a03362d35589c286d0660eba123a7ab00535 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Mon, 10 May 2021 11:14:04 +0000 Subject: [PATCH] Raj and Yoav session in making multiple protein species --- src/cluster.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 112 insertions(+), 0 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index 0c81fd0..85907f9 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -32,6 +32,52 @@ return TS_SUCCESS; } +ts_bool cluster_list_compact(ts_cluster_list *cstlist){ + + + ts_uint i,n=cstlist->n; + + 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); + 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 *)); + cstlist->n=n; + return TS_SUCCESS; +} + + +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){ + master_cluster=cluster1; + slave_cluster=cluster2; + } else { + master_cluster=cluster2; + slave_cluster=cluster1; + } + for(i=0;i<slave_cluster->nvtx;i++){ + cluster_add_vertex(master_cluster,slave_cluster->vtx[i]); + } + //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; +} + ts_bool cluster_free(ts_cluster *cluster){ if(cluster!=NULL){ if(cluster->vtx!=NULL) @@ -47,8 +93,74 @@ for(i=0;i<cstlist->n;i++){ cluster_free(cstlist->cluster[i]); } + free(cstlist->cluster); free(cstlist); } 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){ + if(fabs(vtx->c)>1e-15){ + return 1; + } + else { + return 0; + } +} + + +ts_cluster *cluster_vertex_neighbor(ts_vertex *vtx){ + int j; + for(j=0;j<vtx->neigh_no;j++){ + if(vtx->neigh[j]->cluster!=NULL) + return vtx->neigh[j]->cluster; + } + return NULL; +} + +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(cstlist, vtx->cluster, vtx->neigh[j]->cluster); + } + } + } + return TS_SUCCESS; +} + + +ts_bool clusterize_vesicle(ts_vesicle *vesicle, ts_cluster_list *cstlist){ + + int i; + ts_vertex *vtx; + ts_cluster *cst; + for(i=0;i<vesicle->vlist->n;i++){ + //for each vertex + vtx=vesicle->vlist->vtx[i]; + if(is_clusterable(vtx)){ + if(vtx->cluster==NULL){ + //find first neigbor with cluster index + cst=cluster_vertex_neighbor(vtx); + if(cst==NULL){ + //no clusters are around us, vo we are probably lonely vertex or no surronding vertex has been mapped yet. + cst=new_cluster(cstlist); + cluster_add_vertex(cst,vtx); + } else { + //we are added to the first cluster found + cluster_add_vertex(cst,vtx); + cluster_vertex_neighbor_check(cstlist, vtx); + cluster_list_compact(cstlist); + } + + } + } + } + + + return TS_SUCCESS; +} -- Gitblit v1.9.3