From 8ed8fdb663089e2bc53fd537611a6b45a09cc502 Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Sat, 30 Nov 2013 16:54:34 +0000
Subject: [PATCH] Seems to solve everything until bondflip

---
 src/vertex.c |  156 ++++++++++++++-------------------------------------
 1 files changed, 43 insertions(+), 113 deletions(-)

diff --git a/src/vertex.c b/src/vertex.c
index f1ae60b..871fe29 100644
--- a/src/vertex.c
+++ b/src/vertex.c
@@ -8,12 +8,11 @@
 
 ts_vertex_list *init_vertex_list(ts_uint N){	
 	ts_int i;
-    ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list));
-    
+    ts_vertex_list *vlist=(ts_vertex_list *)calloc(1,sizeof(ts_vertex_list));
+ 
 	if(N==0){
-		err("Initialized vertex list with zero elements. Pointer set to NULL");
-        vlist->n=0;
-		vlist->vtx=NULL;
+        	vlist->n=0;
+		vlist->vtx=(ts_vertex **)calloc(1,sizeof(ts_vertex *)); /*Allocate one memory space for vlist anyway */
 		return vlist;
 	}
 	
@@ -23,19 +22,11 @@
     for(i=0;i<N;i++) {
         vlist->vtx[i]=(ts_vertex *)calloc(1,sizeof(ts_vertex));
         vlist->vtx[i]->idx=i;
-
-    /* initialize Ylm for spherical hamonics DONE in sh.c */
-/*    for(i=0;i<l;i++){
-        vlist->vtx[i]->Ylm[i]=(ts_double **)calloc(2*i+1,sizeof(ts_double *));
-        for(j=0;j<(2*i+1);j++){
-            clist->vtx[i]->Ylm[i][j]=(ts_double *)calloc(sizeof(ts_double));
-        }
-    }
-*/
-
-
-    }
+	vlist->vtx[i]->neigh=init_vertex_list(0);
+    	/* initialize Ylm for spherical hamonics DONE in sh.c */
+    	}
     vlist->n=N;
+	vlist->list_size=TS_VLIST_CHUNK; //TODO: can be buggy in some cases, when N>0 and we want to delete some vertices.
 	return vlist;
 }
 
@@ -43,7 +34,12 @@
 ts_bool vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
 
 #ifdef DEBUG
-	if(vtx==NULL || vlist==NULL) return TS_FAIL;
+	if(vtx==NULL)
+	err("VTX is null");
+	if(vlist==NULL) err("VLIST is null");
+
+	if(vtx==NULL || vlist==NULL)
+		return TS_FAIL;
 #endif
 	if(vlist->list_size < vlist->n+1){
 		vlist->vtx=(ts_vertex **)realloc(vlist->vtx, (vlist->list_size+TS_VLIST_CHUNK)*sizeof(ts_vertex*));
@@ -52,7 +48,8 @@
 		}
 		vlist->list_size+=TS_VLIST_CHUNK;
 	}
-	vlist->vtx[n]=vtx;
+//	printf("Test %u (max %u)!\n", vlist->n, vlist->list_size);
+	vlist->vtx[vlist->n]=vtx;
 	vlist->n++;
 	return TS_SUCCESS;
 }
@@ -65,9 +62,10 @@
 #ifdef DEBUG
 	if(vtx==NULL || vlist==NULL) return TS_FAIL;
 #endif
+	ts_uint i;
 	for(i=0; i<vlist->n;i++){
 		if(vlist->vtx[i]==vtx){
-			vlist->vtx[i]=vlist->vtx[n-1];
+			vlist->vtx[i]=vlist->vtx[vlist->n-1];
 			vlist->n--;
 			if(vlist->list_size-vlist->n > TS_VLIST_CHUNK){
 				vlist->vtx=(ts_vertex **)realloc(vlist->vtx, (vlist->list_size-TS_VLIST_CHUNK)*sizeof(ts_vertex*));
@@ -80,63 +78,6 @@
 		}
 	}
 	return TS_FAIL;
-}
-
-
-ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){
-    ts_uint i;
-    /* no neighbour can be null! */
-    if(vtx==NULL || nvtx==NULL) return TS_FAIL;
-    
-    /*if it is already a neighbour don't add it to the list */
-    for(i=0; i<vtx->neigh->n;i++){
-        if(vtx->neigh->vtx[i]==nvtx) return TS_FAIL;
-    }
-    ts_uint nn=++vtx->neigh->n;
-    vtx->neigh=(ts_vertex **)realloc(vtx->neigh, nn*sizeof(ts_vertex *));
-    vtx->neigh[nn-1]=nvtx;
-
-    return TS_SUCCESS;
-}
-
-/* TODO: optimize this. test this. */
-ts_bool vtx_remove_neighbour(ts_vertex *vtx, ts_vertex *nvtx){
-/* find a neighbour */
-/* remove it from the list while shifting remaining neighbours up */
-    ts_uint i,j=0;
-    for(i=0;i<vtx->neigh_no;i++){
-//		fprintf(stderr,"neigh_addr=%ld\n", (long)vtx->neigh[i]);
-        if(vtx->neigh[i]!=nvtx){
-            vtx->neigh[j]=vtx->neigh[i];
-            j++;
-        }
-    }
-//	fprintf(stderr,"remove_neighbour: vtx1_addr=%ld, vtx2_addr=%ld\n",(long)vtx,(long)nvtx);
-/* resize memory. potentionally time consuming */
-    vtx->neigh_no--;
-    vtx->neigh=(ts_vertex **)realloc(vtx->neigh,vtx->neigh_no*sizeof(ts_vertex *));
-    if(vtx->neigh == NULL && vtx->neigh_no!=0)
-        fatal("(1) Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
-//fprintf(stderr,"first alloc");
-/* repeat for the neighbour */
-/* find a neighbour */
-/* remove it from the list while shifting remaining neighbours up */
-	j=0;
-    for(i=0;i<nvtx->neigh_no;i++){
-        if(nvtx->neigh[i]!=vtx){
-            nvtx->neigh[j]=nvtx->neigh[i];
-            j++;
-        }
-    }
-/* resize memory. potentionally time consuming. */
-//	fprintf(stderr,"Neigbours=%d\n",nvtx->neigh_no);
-    nvtx->neigh_no--;
-    		nvtx->neigh=(ts_vertex **)realloc(nvtx->neigh,nvtx->neigh_no*sizeof(ts_vertex *));
-//	fprintf(stderr,"Neigbours=%d\n",nvtx->neigh_no);
-    if(nvtx->neigh == NULL && nvtx->neigh_no!=0)
-        fatal("(2) Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
-
-    return TS_SUCCESS;
 }
 
 
@@ -158,12 +99,28 @@
     return TS_SUCCESS;
 }
 
+
+ts_bool vtx_add_neighbour(ts_vertex *vtx1, ts_vertex *vtx2){
+	ts_uint i;
+	if(vtx1==NULL || vtx2==NULL) return TS_FAIL;
+	for(i=0;i<vtx1->neigh->n;i++){
+		if (vtx1->neigh->vtx[i]==vtx2){
+			return TS_FAIL;
+		}
+	}
+		vertex_list_add_vtx(vtx1->neigh, vtx2);
+	return TS_SUCCESS;
+}
+
 ts_bool vtx_add_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex *vtx2){
     ts_bool retval;
-    retval=vtx_add_neighbour(vtx1,vtx2);
-  //  retval=vtx_add_neighbour(vtx2,vtx1);
-    if(retval==TS_SUCCESS)
-    retval=vtx_add_bond(blist,vtx1,vtx2); 
+	retval=vtx_add_neighbour(vtx1, vtx2);
+//    retval=vertex_list_add_vtx(vtx1->neigh, vtx2);
+//    retval=vertex_list_add_vtx(vtx2->neigh, vtx1);
+    if(retval==TS_SUCCESS){
+	//	fprintf(stderr,"Bond added\n");
+	   retval=vtx_add_bond(blist,vtx1,vtx2); 
+		}
     return retval;
 }
 
@@ -179,7 +136,10 @@
 
 
 ts_bool vtx_free(ts_vertex  *vtx){
-    if(vtx->neigh!=NULL)   free(vtx->neigh);
+    if(vtx->neigh!=NULL)  {
+		if (vtx->neigh->vtx!=NULL) free(vtx->neigh->vtx);
+		free(vtx->neigh);
+    }
     if(vtx->tristar!=NULL) free(vtx->tristar);
     if(vtx->bond!=NULL)    free(vtx->bond);
     free(vtx);
@@ -247,35 +207,6 @@
 }
 
 
-/* Insert neighbour is a function that is required in bondflip. It inserts a
- * neighbour exactly in the right place. */
-inline ts_bool vtx_insert_neighbour(ts_vertex *vtx, ts_vertex *nvtx, ts_vertex *vtxm){
-//nvtx is a vertex that is to be inserted after vtxm!
-        ts_uint i,j,midx;
-        vtx->neigh_no++;
-        if(vtxm==NULL ||  nvtx==NULL || vtx==NULL)
-                fatal("vertex_insert_neighbour: one of pointers has been zero.. Cannot proceed.",3);
-        //We need to reallocate space! The pointer *neight must be zero if not having neighbours jey (if neigh_no was 0 at thime of calling
-        vtx->neigh=realloc(vtx->neigh,vtx->neigh_no*sizeof(ts_vertex *));
-        if(vtx->neigh == NULL){
-            fatal("Reallocation of memory failed during insertion of vertex neighbour in vertex_insert_neighbour",3);
-        }
-        midx=0;
-        for(i=0;i<vtx->neigh_no-1;i++) if(vtx->neigh[i]==vtxm) {midx=i; break;}
-     //   fprintf(stderr,"midx=%d, vseh=%d\n",midx,vtx->neigh_no-2);
-        if(midx==vtx->neigh_no-2) {
-            vtx->neigh[vtx->neigh_no-1]=nvtx;
-        } else {
-            for(j=vtx->neigh_no-2;j>midx;j--) {
-                vtx->neigh[j+1]=vtx->neigh[j];
-//                vtx->bond_length[j+1]=vtx->bond_length[j];
-//                vtx->bond_length_dual[j+1]=vtx->bond_length_dual[j];
-            }
-            vtx->neigh[midx+1]=nvtx;
-        }
-    return TS_SUCCESS;
-}
-
 
 /* vtx remove tristar is required in  bondflip. */
 /* TODO: Check whether it is important to keep the numbering of tristar
@@ -304,8 +235,7 @@
 
 ts_bool vtx_copy(ts_vertex *cvtx, ts_vertex *ovtx){
     memcpy((void *)cvtx,(void *)ovtx,sizeof(ts_vertex));
-    cvtx->neigh=NULL;
-    cvtx->neigh_no=0;
+    cvtx->neigh=init_vertex_list(0);
     cvtx->tristar_no=0;
     cvtx->bond_no=0;
     cvtx->tristar=NULL;

--
Gitblit v1.9.3