X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fbipartition.c;h=d29d554a58386c0ec0d0911b91540d208b99c5c1;hb=984f527e672e911c74f5c2f09ad98a934312fe2f;hp=86d5bbd299dabd8c241ea99e02e8a4fd261948a1;hpb=c827059eeafc8cbe41c812b26979543ab287803e;p=ape.git diff --git a/src/bipartition.c b/src/bipartition.c index 86d5bbd..d29d554 100644 --- a/src/bipartition.c +++ b/src/bipartition.c @@ -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++) {