]> git.donarmstrong.com Git - ape.git/blobdiff - src/bipartition.c
bunch of fixes for ape 3.0-2
[ape.git] / src / bipartition.c
index 86d5bbd299dabd8c241ea99e02e8a4fd261948a1..d29d554a58386c0ec0d0911b91540d208b99c5c1 100644 (file)
@@ -1,6 +1,6 @@
-/* bipartition.c    2007-06-29 */
+/* bipartition.c    2012-03-26 */
 
-/* Copyright 2005-2007 Emmanuel Paradis, and 2007 R Development Core Team */
+/* Copyright 2005-2012 Emmanuel Paradis, and 2007 R Development Core Team */
 
 /* This file is part of the R-package `ape'. */
 /* See the file ../COPYING for licensing issues. */
@@ -112,7 +112,8 @@ SEXP bipartition(SEXP edge, SEXP nbtip, SEXP nbnode)
     return ans;
 } /* bipartition */
 
-/* From R-ext: */
+/* From R-ext manual
+   (not the same than in library/stats/src/nls.c) */
 SEXP getListElement(SEXP list, char *str)
 {
     SEXP elmt = R_NilValue, names = getAttrib(list, R_NamesSymbol);
@@ -142,7 +143,7 @@ int SameClade(SEXP clade1, SEXP clade2)
 
 SEXP prop_part(SEXP TREES, SEXP nbtree, SEXP keep_partitions)
 {
-    int i, j, k, l, KeepPartition, Ntree, Ntip, Nnode, Npart, NpartCurrent, *no;
+    int i, j, k, KeepPartition, Ntree, Ntip, Nnode, Npart, NpartCurrent, *no;
     SEXP bp, ans, nbtip, nbnode, number;
 
     PROTECT(nbtree = coerceVector(nbtree, INTSXP));
@@ -159,8 +160,8 @@ SEXP prop_part(SEXP TREES, SEXP nbtree, SEXP keep_partitions)
     INTEGER(nbtip)[0] = Ntip;
     INTEGER(nbnode)[0] = Nnode;
 
-    if (KeepPartition) Npart = Ntree*(Nnode - 1) + 1;
-    else Npart = Nnode;
+    if (KeepPartition) Npart = Ntree * (Ntip - 2) + 1;
+    else Npart = Ntip - 1;
 
     PROTECT(number = allocVector(INTSXP, Npart));
     no = INTEGER(number); /* copy the pointer */
@@ -188,6 +189,11 @@ SEXP prop_part(SEXP TREES, SEXP nbtree, SEXP keep_partitions)
 
     /* We start on the 2nd tree: */
     for (k = 1; k < Ntree; k++) {
+
+/* in case there are trees with multichotomies: */
+       nbnode = getListElement(VECTOR_ELT(TREES, k), "Nnode");
+       Nnode = INTEGER(nbnode)[0];
+
         PROTECT(bp = bipartition(getListElement(VECTOR_ELT(TREES, k), "edge"),
                                 nbtip, nbnode));
        for (i = 1; i < Nnode; i++) {