Consensus(trees, p) now retains a split present in exactly a proportion p
of trees (i.e. in ceiling(p * length(trees)) trees) for p > 0.5, matching
the documentation and ape::consensus(); previously such a split was dropped
at exact thresholds (e.g. a split in 2 of 3 trees with p = 2/3). The
majority threshold p = 0.5 is unchanged (a split must occur in more than
half the trees).root_on_node() to simplify Consensus()
internal pre-processingConsensus() and SplitFrequency() defer materialising a split's bit pattern
until it is needed, so splits that never reach the consensus threshold are no
longer built. Identical results; up to ~13× faster for large trees (greatest
gains for tall trees / many tips), with no change at small sizes.RenumberTips() relabels an unlabelled multiPhylo or list of trees in a
single C++ pass instead of a per-tree R loop, with a no-op fast path for trees
already in the target order. Speeds up Consensus() and other callers when
combining many trees; results are unchanged.Consensus() no longer copies every input tree to strip branch lengths and
node labels (the consensus core ignores both); it now coerces in place,
trimming wrapper overhead (~25% faster on small forests of many short trees).
Results are unchanged.RandomTree(), YuleTree(), PectinateTree(), BalancedTree(),
StarTree(), and SingleTaxonTree() allow lengths to accept a function
that generates edge lengths (e.g. RandomTree(8, lengths = runif)).PaintTree() assigns colours to every edge, leaf, and internal node such
that sister clades occupy adjacent hue bands proportional to their tip
counts, with saturation growing from zero at the root to one at every tip.NexusTokensToInteger() converts character data to integers,
mapping uncertain tokens to NA.ReadTntCharacters() attaches an xgroup attribute (factor) when a TNT
xgroup partition block is present.Consensus() computes majority-rule and threshold consensus trees in time
linear in the number of trees (previously quadratic), after
Jansson, Shen & Sung (2016); implementation informed by their FACT package.
SplitFrequency() inherits the same single-pass speed-up.NexusTokens() once again handles polymorphism tokens with internal
whitespace (e.g. (1 2), {0 1}).ReadTntCharacters() now handles multi-line comments, bare & continuations,
@taxonomy suffixes, name-only taxon lines, mid-line xread, smart-quote
names (Windows-1252), and packed multi-taxon lines.stringi dependency.as.character.Splits() re-implemented in C++; ~3× faster on 200-tip trees.Consensus() and SplitFrequency() now respond to user interrupts during
long-running computations.SL_MAX_TIPS compile-time constant increased to 32704, allowing support
for larger trees.EdgeRatio() reports the ratio of external:internal edges.SplitInformation() supports Splits and phylo objects.sort and order support Splits objects.SplitFrequency(reference = NULL) returns frequency of all splits.as.TreeNumber() now supports trees with up to 51 leaves (previously 19).
Trees with 20–51 leaves have more than 2^64 distinct topologies, so their
TreeNumber is stored as a decimal character string rather than integer64.
The 19-leaf limit for integer64-backed storage (and as.MixedBase()
round-trips) is unchanged.as.TreeNumber() no longer warns for trees with 20–44 leaves.inst/include/TreeTools/tree_number.h added to support downstream packages
(e.g. TBRDist) via LinkingTo: TreeTools. Provides 256-bit tree number
encoding/decoding supporting up to 51 leaves, extended from the 44-leaf
limit of the previous uint64_t-based implementation.SplitFrequency(reference = NULL): split normalization moved to C++;
internal split de-duplication uses hash map instead of ordered map.NodeDepth() for unrooted trees rewritten as O(n) two-pass C++ algorithm,
replacing iterative R while-loop.duplicated.Splits() uses hash-based O(n) de-duplication, replacing
O(n²) pairwise comparison.RenumberTips.multiPhylo() applies tip permutation in a single C++ call,
avoiding per-tree overhead.PhyDatToMatrix() no longer crashes on zero-character phyDat objects
(e.g. from a star tree); returns a 0-column matrix with correct row names.AddUnconstrained() handles zero-character phyDat input gracefully.RCurl moved from Imports to Suggests; ReadMrBayesTrees() uses
RCurl::url.exists() when available, falling back to base R url() for
URL checks.RenumberTips.Splits().FirstMatchingSplit(x) provides performant alternative to match(x)[[1]].pole in PolarizeSplits().RenumberTree() supports numeric tipOrder input.ClusterTable objects.
CT_PUSH and CT_POP macros.Consensus().
SplitList.MatrixToPhyDat() gains tipLabels parameter.J1Index().Cherries() counts the cherries in a binary tree.as.Splits.integer().NULL objects.RoguePlot(sort = TRUE)
(Rogue#33).UnrootedKeys() now uses a native cache
implementation.AllDescendantEdges(), .EnforceOutgroup(),
ForestSplits(), in.Splits(), PhylogeneticInfo(), SpectrumLegend(),
SplitNumber(), TreeSplits().TREETOOLS_SPLITLIST_INIT.SplitConsistent() calculates split (dis)agreement.LongBranch() identifies long-branched taxa.Treeness() computes the treeness (=stemminess) of a tree, a proxy for its
phylogenetic signal.KeepTip() methods to correspond to DropTip().Preorder() gains topologyOnly argument.MakeTreeBinary() explicitly removes edge lengths.ClusterTable class.NSplits().as.ClusterTable() when leaf order varies.as.ClusterTable() that caused downstream errors.PhyToString().Reweight().Reweight() sets the weight of characters in a phylogenetic dataset.MatchStrings() checks for mismatched tip labels, suggesting corrections.RootTree() gains fallback argument to handle outgroups that do not root a
tree.MakeTreeBinary() labelling trees as in preorder.as.Splits.matrix(tipLabels != NULL).PhyToString().AddTip(lengthBelow = NA) adds leaf at node without adding a new edge.
BalancedTree() and equivalent gain a lengths parameter to specify edge
lengths.
Fix taxa misplaced by RoguePlot(sort = TRUE).
Fix unexpected polytomies in Consensus()
(#168).
DropTip() checks.%in% and match methods for phylo / multiPhylo objects.
Decompose() decomposes additive (ordered) phylogenetic characters by
binary decomposition.
Check for overflow in splits functions.
TopologyOnly() removes metadata from phylo objects.J1Index() computes the robust, universal tree balance measure of
Lemant et al. 2022 doi:10.1093/sysbio/syac027, incorporating code by Rob Noble.RandomTree() returns trees for < 3 leaves.root_on_node() handles trees with < 2 leaves.TotalCopheneticIndex(), fixing
#158.YuleTree() generates a random tree by the Yule process.DescendantTips() complements DescendantEdges(), rewritten in C++,
fixing a bug when edges were not in preorder.NodeNumbers() returns the indices of nodes within a tree.RandomTree(root = TRUE) roots the tree on a random edge.RoguePlot()$legendLabels returns suggested labels for legend.AddTip(), CollapseNode(), DropTip(),
MakeTreeBinary(), Renumber(), Reorder(), SortTree(), Subtree()
(#149).AddTip(edgeLength = NULL) defaults to lengthBelow. This will become the
default in a future release.root_on_node() is now exported
(intended for expert use only).root_on_node().KeepTip() internally so SplitFrequency() supports Splits objects
as documented.TipTimedTree() displays trees where leaves are associated with absolute
ages.ReadMrBayesTrees() samples trees from posterior of MrBayes output.is.TreeNumber() method.as.Splits() and NSplits().AddUnconstrained().WriteTntCharacters() to support continuous
characters (#139).DescendantEdges()AllDescendantEdges(); use DescendantEdges() instead.EnforceOutgroup(); use RootTree() instead.NonDuplicateRoot() and in.Splits().ReadNotes().''s in ReadCharacters().legend parameter to RoguePlot().RoguePlot() now returns invisibly.SpectrumLegend() -- spun off to separate
"PlotTools" package.AddUnconstrained() and ImposeConstraint() handle wider range of inputs.
PhyDatToMatrix() can (and by default does) override levels to write
ambiguous tokens in custom formats such as {01}.
Call C functions using symbols, not strings.
ZeroTaxonTree() creates a phylo object with no leaves.
DropTip() gains new methods DropTip.list() and DropTip.NULL().
as.matrix.phylo() converts a tree to a matrix representation, allowing
a tree to be passed as a constraint to ImposeConstraint().
as.matrix.Splits() and as.matrix.phyDat() methods added as synonyms to
as.logical.Splits() and PhyDatToMatrix().
Handle TipLabels(0) and BalancedTree(0).
Support zero-leaf trees in as.Splits() and duplicated.Splits().
Support non-identical tip labels in as.Splits().
Try Latin-1 encoding if ReadCharacters() family fail under UTF-8.
TntOrder() renumbers a tree's nodes to match TNT's convention.
head() and tail() methods for Splits objects.
Set names of splits object with names(splits) <- ....
as.Splits() support character vectors in the form "...***".
ReadTntTree() reads tree tags and follows TNT node numbering conventions.
SpectrumLegend() gains title parameter and more styling options.
Support > 32767 trees in Consensus()
(#127).
DropTip() speed improved when branch lengths are present.
ReadTntTree() supports multi-line trees.
as.MixedBase() supports larger trees (44-32767 tips).
Add deprecation warning to in.Splits().
RenumberTips() drops "preorder" attribute, as reordering tip labels may
break edge ordering guarantee.
Native implementation of ClusterTable class.
Replace throw with stop in C++ scripts.
AddTip(): Fix bug when adding tip to root of weighted tree.rev.Splits() reverses order in which splits are listed.
KeepTip.Splits() is a faster alternative to SubSplit().
%in%.Splits() retains names when comparing small splits
(#40).
sort.multiPhylo() sorts lists of trees according to their mixed base
representation (#84).
Bitwise manipulation of splits with |, &, xor.
as.MixedBase() uniquely represents binary trees as a mixed-base vector.
PathLengths() describes all paths within a tree.
KeptVerts() and KeptPaths() identify elements in reduced trees.
PostorderOrder() describes a sequence of edges corresponding to a
postorder traversal of a tree.
SpectrumLegend() adds gradients to plot legends.
Improve handling of zero-split trees.
DropTip() no longer adds a root to unrooted trees, and retains edge lengths.
Improve speed of DropTip(), by an order of magnitude in some cases.
Support edge lengths in Preorder(), RootTree(), UnrootTree() and
Postorder() (#49,
#89).
Fix bug when tree is rooted on a discontinuous outgroup.
SortTree() handles weighted and non-binary trees
(#25,
#25),
and gains option to sort by tip labels.
TipsInSplits(smallest = TRUE) counts tips in smaller bipartition.
Fix a bug with phyDat objects in ArtificialExtinction().
RenumberTips() allows tipOrder to contain elements not present in tree.
Use lighter Rcpp headers.
Small improvements to computational efficiency.
PostorderEdges()
(#35).RoguePlot() plots the positions of rogue taxa.DropTip() gains check parameter to allow slightly faster operation where
input is guaranteed to be valid.
RandomTree() gains nodes parameter allow the inclusion of polytomies.
Infer tips parameter if missing in StringToPhyDat().
Remove dependency on "phangorn" (allowing use on R < 4.1)
Improve parsing of information from nexus files.
Export DropTipPhylo() as wrapper to DropTip.phylo().
PhyDatToMatrix() optionally encodes ambiguous / inapplicable tokens as NA.
Implement sort.multiPhylo().
Update test suite for compatibility with "testthat" > 3.0.4 (@hadley, #83).
ConstrainedNJ() returns an approximation to a neighbour-joining tree
that respects constraints.
PolarizeSplits() marks a specified taxon as representing the ingroup of all
splits.
Add KeepTip() and improve performance of DropTip().
ImposeConstraint() makes a tree consistent with topological constraints.
as.phylo.Splits() represents a Splits object as a tree.
Consensus() is a faster C++ implementation of ape::consensus().
ClusterTable() C++ functionality imported from "TreeDist".
Warn when empty cells passed to MatrixToPhyDat().
Warn when LabelSplits(labels) lack names.
SplitFrequency() drops tips from forest that aren't in reference.
AddTipEverywhere() supports trees with < 3 leaves.
Make RootTree() and PhyDatToMatrix() more robust.
Support encoding option in ReadCharacters() function family.
Support CHARSTATELABELS in ReadCharacters().
Support for more formatting quirks in ReadNotes().
Better support ambiguous tokens in WriteTntCharacters().
Fast matching functions from "fastmatch".
Improve efficiency of Preorder() and Postorder(),
and lift limit on tree size.
TCIContext().StringToPhyDat().AddTip(tree, where = "tip name").SplitFrequency() supports four-leaf trees.RootTree.matrix() method for edge matrices.TipLabels.phyDat() method.NULL methods for tree reordering functions.NTip.phyDat() method.MakeTreeBinary() docs and tests to reflect updated behaviour of
ape::multi2di() in 'ape' v5.5.AddTip() supports edge lengths.CladisticInfo() supports Splits objects.as.multiPhylo() converts trees, datasets and Splits objects into
multiPhylo objects.LabelSplits(labels = NULL) labels each split with its associated node.PhyDatToMatrix() supports integer-only levels.SortTree() supports lists of trees.ReadTntCharacters() character block extraction
(#50).RootTree().root_on_node().MSTEdges() supports distance matrices with > 256 entries.MSTLength() reports length of minimum spanning tree.AllTipLabels() returns all labels from all trees in a list.PairwiseDistances() (from 'TreeDistData') computes distances between all
pairs of trees in a list.ArtificialExtinction() gains replaceAll option.WriteTntCharacters(types = ...) writes different character types to TNT
file..default and .NULL.MSTEdges() implemented in C++, improving runtime by orders of magnitude.SisterSize() and RootNodeDist() measure sister-clade size and root-node
distance.MSTEdges(): Edges of minimum spanning tree.SplitImbalance(): how balanced is each split?root_on_node() and root_binary() to root trees quickly
and robustly.TNTReadTree() handles additional punctuation characters.
Import RdMacros package 'Rdpack'.
C++ implementation of TipsInSplits().
Export C++ functions preorder_edges_and_nodes() and postorder_edges().
Remove obsolete copy of C++ code from 'phangorn'.
ArtificialExtinction(): Remove characters that are absent in a fossil
template.WriteTntCharacters(): Write morphological dataset in TNT format.RandomTree(): Draw tree from uniform distribution, instead of via
ape::rtree().MakeTreeBinary(): Uniform equivalent of ape::multi2di().match.list() method for lists of splits.SplitsInBinaryTree(): How many splits occur in an n-leaf binary tree?vapply64(), sapply64(), replicate64(): helper functions when a function
returns a 64-bit integer.UnrootTree(), RootTree(), RootOnNode() to support
lists of trees.CladisticInfo(): Calculate the information content of a tree.RootNode(): Which node is a tree's root?UnrootTree(): Safely remove a root node.NodeDepth(): Discriminate shallow from deep nodes.NodeOrder(), NDescendants(): Count edges incident to each node.CladeSizes(): Count leaves / nodes descended from each node.ListAncestors(): List ancestors of a node.LabelSplits(): Label splits on plotted tree.DropTip(): Remove tip, handling weird node orders.LeafLabelInterchange(): Exchange position of n tips.StarTree(): Generate unresolved tree.TotalCopheneticIndex() integrated from 'tci' package.PostorderEdges(): use Postorder() instead.NonDuplicateRoot(): unused internal function.match.Splits(): use match() instead.in.Splits(): use %in%.Splits() instead.as.Splits().Reorder functions can handle multiPhylo objects and edges.ReadCharacters().as.logical.Splits() and related functions.as.Splits().RootOnNode().doubleFactorials cache to fix as.integer() rounding error.AddTipEverywhere().RootOnNode(): Quickly root a tree on a specified node.as.Newick: Fast conversion to Newick format.as.TreeNumber: Tree shape enumeration.RenumberTips can extract tip order from phylo and Splits objects.