]> git.donarmstrong.com Git - ape.git/blobdiff - src/dist_dna.c
final wrap for ape 3.0
[ape.git] / src / dist_dna.c
index 210479e37b2ba29c623e9379d7dfffe621ba24db..7174af6d013d961c80dba33b453c78ad5e3c8bfe 100644 (file)
@@ -1,6 +1,6 @@
-/* dist_dna.c       2011-06-23 */
+/* dist_dna.c       2012-01-10 */
 
-/* Copyright 2005-2011 Emmanuel Paradis
+/* Copyright 2005-2012 Emmanuel Paradis
 
 /* This file is part of the R-package `ape'. */
 /* See the file ../COPYING for licensing issues. */
@@ -989,31 +989,60 @@ void distDNA_ParaLin_pairdel(unsigned char *x, int *n, int *s, double *d,
 /*     if (! *freq) for (i = 0; i < 4; i++) BF[i] /= m; */
 /* } */
 
+/* void BaseProportion(unsigned char *x, int *n, double *BF) */
+/* { */
+/*     int i; */
+
+/*     for (i = 0; i < *n; i++) { */
+/*         switch (x[i]) { */
+/*         case 136 : BF[0]++; break; */
+/*         case 40 : BF[1]++; break; */
+/*         case 72 : BF[2]++; break; */
+/*         case 24 : BF[3]++; break; */
+/*         case 192 : BF[4]++; break; */
+/*         case 160 : BF[5]++; break; */
+/*         case 144 : BF[6]++; break; */
+/*         case 96 : BF[7]++; break; */
+/*         case 80 : BF[8]++; break; */
+/*         case 48 : BF[9]++; break; */
+/*         case 224 : BF[10]++; break; */
+/*         case 176 : BF[11]++; break; */
+/*         case 208 : BF[12]++; break; */
+/*         case 112 : BF[13]++; break; */
+/*         case 240 : BF[14]++; break; */
+/*         case 4 : BF[15]++; break; */
+/*         case 2 : BF[16]++; break; */
+/*         } */
+/*     } */
+/* } */
+
+/* a hash table is much faster than switch (2012-01-10) */
 void BaseProportion(unsigned char *x, int *n, double *BF)
 {
-    int i;
-
-    for (i = 0; i < *n; i++) {
-           switch (x[i]) {
-           case 136 : BF[0]++; break;
-           case 40 : BF[1]++; break;
-           case 72 : BF[2]++; break;
-           case 24 : BF[3]++; break;
-           case 192 : BF[4]++; break;
-           case 160 : BF[5]++; break;
-           case 144 : BF[6]++; break;
-           case 96 : BF[7]++; break;
-           case 80 : BF[8]++; break;
-           case 48 : BF[9]++; break;
-           case 224 : BF[10]++; break;
-           case 176 : BF[11]++; break;
-           case 208 : BF[12]++; break;
-           case 112 : BF[13]++; break;
-           case 240 : BF[14]++; break;
-           case 4 : BF[15]++; break;
-           case 2 : BF[16]++; break;
-           }
-    }
+       int i;
+       double count[256];
+
+       memset(count, 0, 256*sizeof(double));
+
+       for (i = 0; i < *n; i++) count[x[i]]++;
+
+       BF[0] = count[136];
+       BF[1] = count[40];
+       BF[2] = count[72];
+       BF[3] = count[24];
+       BF[4] = count[192];
+       BF[5] = count[160];
+       BF[6] = count[144];
+       BF[7] = count[96];
+       BF[8] = count[80];
+       BF[9] = count[48];
+       BF[10] = count[224];
+       BF[11] = count[176];
+       BF[12] = count[208];
+       BF[13] = count[112];
+       BF[14] = count[240];
+       BF[15] = count[4];
+       BF[16] = count[2];
 }
 
 void SegSites(unsigned char *x, int *n, int *s, int *seg)