Skip to content

Commit

Permalink
Node numbers in CollapseNode() (#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
ms609 committed Mar 28, 2024
1 parent 9fd43f9 commit 3ee3cfd
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 3 deletions.
4 changes: 2 additions & 2 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
- `RoguePlot()$legendLabels` returns suggested labels for legend.
- `DescendantTips()` complements `DescendantEdges()`.
- `NodeNumbers()` returns the indices of nodes within a tree.
- `AddTip()` supports node labels.
- Support node labels in `AddTip()`, `CollapseNode()`
([#149](https://github.com/ms609/TreeTools/issues/149)).
- `AddTip(edgeLength = NULL)` defaults to `lengthBelow`. This will become the
default in a future release.
([#149](https://github.com/ms609/TreeTools/issues/149)).
- An entry point to the C++ function `root_on_node()` is now exported
(intended for expert use only).
- Use `KeepTip()` internally so `SplitFrequency()` supports `Splits` objects
Expand Down
9 changes: 8 additions & 1 deletion R/tree_rearrangement.R
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,8 @@ CollapseNode.phylo <- function(tree, nodes) {
edge <- tree[["edge"]]
lengths <- tree[["edge.length"]]
hasLengths <- !is.null(lengths)
nodeLabels <- tree[["node.label"]]
hasLabels <- !is.null(nodeLabels)
parent <- edge[, 1]
child <- edge[, 2]
root <- RootNode(edge)
Expand All @@ -428,7 +430,9 @@ CollapseNode.phylo <- function(tree, nodes) {

for (node in nodes[order(depths)]) {
newParent <- parent[edgeBelow[node]]
if (hasLengths) lengths[parent == node] <- lengths[parent == node] + lengths[child == node]
if (hasLengths) {
lengths[parent == node] <- lengths[parent == node] + lengths[child == node]
}
parent[parent == node] <- newParent
}

Expand All @@ -438,6 +442,9 @@ CollapseNode.phylo <- function(tree, nodes) {
newNumber[child[keptEdges]])
tree[["edge.length"]] <- lengths[keptEdges]
tree[["Nnode"]] <- tree[["Nnode"]] - length(nodes)
if (hasLabels) {
tree[["node.label"]] <- nodeLabels[-(nodes - nTip)]
}

# TODO Renumber nodes sequentially
# TODO Re-write this in C++.
Expand Down
36 changes: 36 additions & 0 deletions tests/testthat/test-tree_rearrange.R
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,42 @@ test_that("CollapseNode() works", {
expect_error(CollapseEdge(tree, 9))
})

test_that("CollapseNode() handles node labels", {
bal6 <- BalancedTree(6)
startLabels <- paste("Node", 7:11)
bal6[["node.label"]] <- startLabels
if (interactive()) {
plot(bal6, show.node.label = TRUE)
}

# Collapse a cherry
expect_equal(
CollapseNode(bal6, 9)[["node.label"]],
startLabels[-3]
)

# Collapse an internal node
expect_equal(
CollapseNode(bal6, 8)[["node.label"]],
startLabels[-2]
)

# Collapse an internal node
expect_equal(
CollapseEdge(bal6, 1)[["node.label"]],
startLabels[-2]
)

# case = 3 -> y is bound on an internal edge
expect_equal(
CollapseNode(bal6, c(8, 11))[["node.label"]],
startLabels[-c(2, 5)]
)

expect_equal(AddTipEverywhere(bal6)[[1]][["node.label"]],
AddTip(bal6, where = 1)[["node.label"]])
})

test_that("Binarification is uniform", {
set.seed(0)
Test <- function(tree, nTree, nSamples = 200L, ape = FALSE) {
Expand Down

0 comments on commit 3ee3cfd

Please sign in to comment.