void done_mat(t_mat **m) { done_matrix((*m)->n1, &((*m)->mat)); sfree((*m)->m_ind); sfree((*m)->erow); sfree(*m); *m = NULL; }
static void jarvis_patrick(int n1,real **mat,int M,int P, real rmsdcut,t_clusters *clust) { t_dist *row; t_clustid *c; int **nnb; int i,j,k,cid,diff,max; bool bChange; real **mcpy=NULL; if (rmsdcut < 0) rmsdcut = 10000; /* First we sort the entries in the RMSD matrix row by row. * This gives us the nearest neighbor list. */ snew(nnb,n1); snew(row,n1); for(i=0; (i<n1); i++) { for(j=0; (j<n1); j++) { row[j].j = j; row[j].dist = mat[i][j]; } qsort(row,n1,sizeof(row[0]),rms_dist_comp); if (M>0) { /* Put the M nearest neighbors in the list */ snew(nnb[i],M+1); for(j=k=0; (k<M) && (j<n1) && (mat[i][row[j].j] < rmsdcut); j++) if (row[j].j != i) { nnb[i][k] = row[j].j; k++; } nnb[i][k] = -1; } else { /* Put all neighbors nearer than rmsdcut in the list */ max=0; k=0; for(j=0; (j<n1) && (mat[i][row[j].j] < rmsdcut); j++) if (row[j].j != i) { if (k >= max) { max += 10; srenew(nnb[i],max); } nnb[i][k] = row[j].j; k++; } if (k == max) srenew(nnb[i],max+1); nnb[i][k] = -1; } } sfree(row); if (debug) { fprintf(debug,"Nearest neighborlist. M = %d, P = %d\n",M,P); for(i=0; (i<n1); i++) { fprintf(debug,"i:%5d nbs:",i); for(j=0; nnb[i][j]>=0; j++) fprintf(debug,"%5d[%5.3f]",nnb[i][j],mat[i][nnb[i][j]]); fprintf(debug,"\n"); } } c = new_clustid(n1); fprintf(stderr,"Linking structures "); /* Use mcpy for temporary storage of booleans */ mcpy = mk_matrix(n1,n1,FALSE); for(i=0; i<n1; i++) for(j=i+1; j<n1; j++) mcpy[i][j] = jp_same(nnb,i,j,P); do { fprintf(stderr,"*"); bChange=FALSE; for(i=0; i<n1; i++) { for(j=i+1; j<n1; j++) if (mcpy[i][j]) { diff = c[j].clust - c[i].clust; if (diff) { bChange = TRUE; if (diff > 0) c[j].clust = c[i].clust; else c[i].clust = c[j].clust; } } } } while (bChange); fprintf(stderr,"\nSorting and renumbering clusters\n"); /* Sort on cluster number */ qsort(c,n1,sizeof(c[0]),clust_id_comp); /* Renumber clusters */ cid = 1; for(k=1; k<n1; k++) { if (c[k].clust != c[k-1].clust) { c[k-1].clust = cid; cid ++; } else c[k-1].clust = cid; } c[k-1].clust = cid; clust->ncl = cid; for(k=0; k<n1; k++) clust->cl[c[k].conf] = c[k].clust; if (debug) for(k=0; (k<n1); k++) fprintf(debug,"Cluster index for conformation %d: %d\n", c[k].conf,c[k].clust); /* Again, I don't see the point in this... (AF) */ /* for(i=0; (i<n1); i++) { */ /* for(j=0; (j<n1); j++) */ /* mcpy[c[i].conf][c[j].conf] = mat[i][j]; */ /* } */ /* for(i=0; (i<n1); i++) { */ /* for(j=0; (j<n1); j++) */ /* mat[i][j] = mcpy[i][j]; */ /* } */ done_matrix(n1,&mcpy); sfree(c); for(i=0; (i<n1); i++) sfree(nnb[i]); sfree(nnb); }