From 2eaa9ed304d3cf22883db99a41a277cde6deb617 Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Wed, 27 Feb 2019 18:36:47 +0000
Subject: [PATCH] Fix in size of c0 for clustering

---
 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