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 |  193 +++++++++++++++++++-----------------------------
 1 files changed, 77 insertions(+), 116 deletions(-)

diff --git a/src/vertex.c b/src/vertex.c
index 38647aa..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,89 +22,62 @@
     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;
 }
 
-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_no;i++){
-        if(vtx->neigh[i]==nvtx) return TS_FAIL;
-    }
-    ts_uint nn=++vtx->neigh_no;
-    vtx->neigh=(ts_vertex **)realloc(vtx->neigh, nn*sizeof(ts_vertex *));
-    vtx->neigh[nn-1]=nvtx;
-/* This was a bug in creating DIPYRAMID (the neighbours were not in right
- * order).
- */
-    /* pa se sosedu dodamo vertex */
-    /*if it is already a neighbour don't add it to the list */
-/*
-    for(i=0; i<nvtx->data->neigh_no;i++){
-        if(nvtx->data->neigh[i]==vtx) return TS_FAIL;
-    } 
-    nn=++nvtx->data->neigh_no;
-    nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh, nn*sizeof(ts_vertex *));
-    nvtx->data->neigh[nn-1]=vtx;
-*/
 
-    return TS_SUCCESS;
+ts_bool vertex_list_add_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
+
+#ifdef DEBUG
+	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*));
+		if(vlist->vtx==NULL){
+			fatal("Error in vertex_list_add. Could not reallocate memory space.",9999);
+		}
+		vlist->list_size+=TS_VLIST_CHUNK;
+	}
+//	printf("Test %u (max %u)!\n", vlist->n, vlist->list_size);
+	vlist->vtx[vlist->n]=vtx;
+	vlist->n++;
+	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;
+/* Idea is to delete vertex by removing it from list. The emply place is then filled in by the last 
+vertex in the list. List can then be resized by one -- unless resize is required when max list size - 
+real list size > predefined value */
+ts_bool vertex_list_remove_vtx(ts_vertex_list *vlist, ts_vertex *vtx){
+#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[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*));
+				if(vlist->vtx==NULL){
+					fatal("Error in vertex_list_add. Could not reallocate memory space.",9999);
+				}
+				vlist->list_size-=TS_VLIST_CHUNK;
+			}
+			return TS_SUCCESS;
+		}
+	}
+	return TS_FAIL;
 }
 
 
@@ -127,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;
 }
 
@@ -148,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);
@@ -216,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
@@ -273,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