]> git.donarmstrong.com Git - ape.git/blobdiff - R/is.ultrametric.R
final commit for ape 3.0
[ape.git] / R / is.ultrametric.R
index ae4c43937ea6f08ea6a8cae0afcf7d40a684195a..792684f000e1a8c1dcc3a9b358cb2996063129b0 100644 (file)
@@ -1,8 +1,8 @@
-## is.ultrametric.R (2009-05-10)
+## is.ultrametric.R (2012-02-09)
 
 ##   Test if a Tree is Ultrametric
 
-## Copyright 2003-2009 Emmanuel Paradis
+## Copyright 2003-2012 Emmanuel Paradis
 
 ## This file is part of the R-package `ape'.
 ## See the file ../COPYING for licensing issues.
 is.ultrametric <- function(phy, tol = .Machine$double.eps^0.5)
 {
     if (!inherits(phy, "phylo"))
-      stop('object "phy" is not of class "phylo".')
+        stop('object "phy" is not of class "phylo"')
     if (is.null(phy$edge.length))
-      stop("the tree has no branch lengths.")
+        stop("the tree has no branch lengths")
+
     phy <- reorder(phy)
     n <- length(phy$tip.label)
-    n.node <- phy$Nnode
+    e1 <- phy$edge[, 1]
+    e2 <- phy$edge[, 2]
+    EL <- phy$edge.length
+
+    ## xx: vecteur donnant la distance d'un noeud
+    ##     ou d'un tip à partir de la racine
+    xx <- numeric(n + phy$Nnode)
 
-    ## xx: vecteur donnant la distance d'un
-    ## noeud ou tip à partir de la racine
-    xx <- numeric(n + n.node)
+    ## the following must start at the root and follow the
+    ## edges contiguously; so the tree must be either in cladewise
+    ## order (or in pruningwise but the for loop must start from
+    ## the bottom of the edge matrix)
 
-    for (i in 1:dim(phy$edge)[1])
-      xx[phy$edge[i, 2]] <- xx[phy$edge[i, 1]] + phy$edge.length[i]
+    for (i in seq_len(length(e1)))
+        xx[e2[i]] <- xx[e1[i]] + EL[i]
 
-    if (identical(all.equal.numeric(var(xx[1:n]),
-                                    0, tolerance = tol), TRUE)) TRUE
-    else FALSE
+    isTRUE(all.equal.numeric(var(xx[1:n]), 0, tolerance = tol))
 }