                     Changes in version 2.15.0.9007                     

Bug fixes

  - Fix MASTSize() under-counting on some trees: the root of each tree
    was never compared with the subtrees of the other, so a maximum
    agreement subtree confined to one side of a root could be missed.
    Affects both rooted = TRUE and rooted = FALSE, and thus MASTInfo().

  - C++ code no longer executes the x86 POPCNT instruction on CPUs that
    lack it, which crashed R with "illegal operation" on some virtual
    machines (ms609/TreeTools#287).

Performance

  - SPRDist(method = "Rogue") bounds each candidate's clustering
    information with the optimal dual prices of the parent pair,
    skipping most assignment problems and warm-starting the rest: c. 50%
    faster at 80 leaves and 65% at 150 leaves on unrelated trees.

  - Improve performance when comparing many similar trees with
    ClusteringInfoDistance(), MatchingSplitDistance(),
    InfoRobinsonFoulds() and JaccardRobinsonFoulds().

  - Improve performance of PathVector(), and thus PathDist().

  - Improve performance of NNIMaxStep().

  - Improve performance of SPRDist(method = "Rogue"): candidate leaves
    are scored in C++, and abandoned once they cannot beat the best
    candidate so far.

  - Improve performance of SharedPhylogeneticInfo() and
    PhylogeneticInfoDistance() when comparing similar trees.

                 Changes in version 2.15.0 (2026-09-11)                 

  - New function NNIMaxStep() computes the largest clustering
    information distance attainable by a single nearest neighbour
    interchange on an n-leaf tree.

  - Use grDevices palettes to drop colorspace dependency.

                 Changes in version 2.14.1 (2026-06-10)                 

  - TransferConsensus() is deprecated, moving to ConsTree::Transfer().

  - Fixed: PhylogeneticInformationDistance() now calculates correct
    score for identical 4-leaf trees.

  - Improve KMeansPP() performance: O(k²n) → O(kn).

                 Changes in version 2.14.0 (2026-05-09)                 

New features

  - TransferConsensus() constructs a consensus tree that minimizes the
    sum of transfer distances to a set of input trees, using a greedy
    add-and-prune heuristic.

  - TransferDist() computes the transfer dissimilarity between
    phylogenetic trees, with scaled and unscaled variants.

  - LAP (Jonker–Volgenant linear assignment) and Mutual Clustering
    Information C++ implementations exposed via LinkingTo: TreeDist.

Internals

  - Large-tree support: all distance functions now accept trees with up
    to 32 767 tips. Requires TreeTools ≥ 2.3.0.

Performance

  - RobinsonFoulds() now uses a fast C++ batch path when comparing lists
    of trees, providing a ~20× speedup on typical inputs.

                       Changes in version 2.13.0                        

New features

  - MCITree() selects the tree from a posterior sample with the highest
    total split information content — a Maximum Clade Information
    analogue of the Maximum Clade Credibility tree.

Performance

Pairwise distance computation has been optimized. Typical speedups over
v2.12.0 for tree sets where many splits are shared:

| Metric | 100 × 50 tips | 40 × 200 tips |
|-----------------------------|--------------:|--------------:| |
ClusteringInfoDistance | ~5× | ~12× | | MatchingSplitDistance | ~7× |
~11× | | InfoRobinsonFoulds | ~4× | ~5× |

OpenMP parallelism

  - Pairwise distance functions now use OpenMP parallelism when
    supported and enabled with options(mc.cores = N), superseding
    StartParallel().

Kendall & Colijn distance

  - KCVector() reimplemented in C++, giving ~220× speedup per tree.

  - All-pairs and cross-pairs KendallColijn() Euclidean distances now
    computed in C++ (pair_diff_euclidean(), vec_diff_euclidean()).

                 Changes in version 2.12.0 (2026-02-13)                 

  - Support larger trees in some functions by updating some functions to
    use 32-bit integers, per TreeTools v2.1.0.

  - AHMI() now returns negative values (previously zeroed in error).

  - Experimental support for a new method of SPR distance calculation:
    subject to change or removal.

                 Changes in version 2.11.1 (2025-10-13)                 

  - Improve robustness of SpectralEigens() tests.

                 Changes in version 2.11.0 (2025-09-28)                 

  - HierarchicalMutualInformation() calculates the information shared
    between pairs of hierarchical partition structures
    \doi{10.1103/PhysRevE.92.062825}.

  - Fix bug in calculation of MutualClusteringInfo(): the matching
    chosen was not always the global optimum, causing distances to be
    overestimated in some circumstances (#163).

  - Fix crash in robinson_foulds_all_pairs() and RobinsonFoulds(list).

  - Support larger trees in NNI distance calculations.

                 Changes in version 2.10.1 (2025-08-25)                 

  - Compiler-safe vector initialization, resolving M1-SAN warnings.

                 Changes in version 2.10.0 (2025-08-22)                 

Note - this release introduced a bug in the computation of the mutual
clustering information / clustering information distance. The globally
optimal matching between splits was not always found. This was fixed in
v2.11.0.

  - Ntropy() computes entropy from integer counts.

  - C++ optimizations and reformatting:
    
      - Faster tree distance calculation.
      - 2x speed-up of LAPJV for large matrices.

  - Require R4.0; discontinue tests against R4.0.

                 Changes in version 2.9.2 (2025-01-11)                  

  - Fix crash when calculating NNI distance for large trees.

                 Changes in version 2.9.1 (2024-09-07)                  

  - Avoid false positive in MKL testing environment.

                 Changes in version 2.9.0 (2024-09-03)                  

  - VisualizeMatching() allows more control over output format, and
    returns the matching (#124).

  - DistanceFromMedian(Average = median) allows calculation of MAD.

  - SpectralEigens() returns correct eigenvalues (smallest was
    overlooked).

  - SpectralEigens() handles values of nEig larger than the input.

  - Anticipate new behaviour of unlist(use.names = TRUE) in R 4.5.

                 Changes in version 2.8.0 (2024-07-26)                  

  - Islands() allows the identification of islands of trees.

  - Internal implementation of path and SPR distances, removing
    dependency on phangorn (and thus R 4.4).

  - Add progress bar within .MaxValue()

                        Changes in version 2.7.1                        

  - Documentation improvements.

  - Fix KCDiameter.multiPhylo() for multiple trees.

                 Changes in version 2.7.0 (2023-10-25)                  

  - Fix calculation error in StrainCol().

  - App: Display strain in 3D tree space viewer.

  - Support for distances between larger trees.

  - Support unrooted trees in VisualizeMatching() (#103).

                 Changes in version 2.6.3 (2023-08-25)                  

  - Fix bug when comparing a "multiPhylo" object containing a single
    tree.

  - Documentation clarification: finding non-matching leaves.

                 Changes in version 2.6.2 (2023-06-29)                  

  - Support non-square matrices in LAPJV().

                 Changes in version 2.6.1 (2023-05-01)                  

  - StopParallel() gains quietly argument to suppress unnecessary
    messages.

  - Use "PlotTools" package for spectrum legends.

  - Minor documentation tweaks.

                 Changes in version 2.6.0 (2023-02-20)                  

  - Support comparison of trees with different tips.

  - Fix caching errors in MapDist() (#98).

  - Update tests for compatibility with ape 5.7.

                 Changes in version 2.5.0 (2022-10-07)                  

  - New functions to measure cluster sizes (see ?"cluster-statistics").

  - KMeansPP() conducts clustering using K-means++, replacing K-means in
    app.

  - New vignette on tree landscape analysis.

                 Changes in version 2.4.1 (2022-07-20)                  

  - New vignette on how to compare tree sets.

  - PathVector() now treats trees with a root node as rooted.

  - Fix plot layout in treespace vignette.

  - Informative failure when not enough memory for consensus_info().

  - Replace throw with stop in C++.

                 Changes in version 2.4.0 (2022-03-23)                  

  - Correct calculation of trustworthiness and continuity metrics.

  - Depict strain in minimum spanning trees with StrainCol() and helper
    function MSTSegments().

  - Update tests for consistency with "TreeTools" v1.7.

  - Use lighter Rcpp headers.

                 Changes in version 2.3.0 (2022-01-03)                  

  - Support ConsensusInfo(p > 0.5).

  - Address hypervolume comparison in vignettes.

  - Support uniform manifold approximation and projection in app.

                 Changes in version 2.2.0 (2021-09-13)                  

  - Speed improvements, using optimizations suggested by Alexis
    Stamatakis' Bioinformatics group.

  - Support for parallel computation via StartParallel().

  - Progress bars.

                 Changes in version 2.1.1 (2021-07-13)                  

  - Solaris compatibility.

  - Modest vignette improvements.

  - spic/scic abbreviation recognition.

                 Changes in version 2.1.0 (2021-07-12)                  

New features

  - ConsensusInfo() quickly calculates the splitwise information content
    of the consensus of a set of trees, after Smith (forthcoming).

  - SplitwiseInfo() and ClusteringInfo() gain a p parameter to reflect
    the reduced information content of splits with lower support values,
    and a sum parameter to allow return of individual split information
    content.

  - KCDiameter() approximates the diameter of the Kendall-Colijn metric.

  - Plot3() (experimental) provides pseudo-3D plotting.

Renamed functions

  - Project()/ProjectionQuality() re-named to
    MapTrees()/MappingQuality().

  - SpectralClustering() re-named to SpectralEigens().

Improvements

  - Add self-organizing map example to treespace vignette.

  - Allow the specification of custom vectors in the Kendall--Colijn
    metric.

  - Faster all-to-all tree distance calculation.

                 Changes in version 2.0.3 (2021-01-31)                  

  - Diagnose and fix memory leaks, including over-long reported
    matchings.

  - Explicitly import shiny/shinyjs functions.

                 Changes in version 2.0.0 (2021-01-20)                  

  - Project() launches 'shiny' app for projection and analysis of tree
    space.

  - ProjectionQuality() calculates trustworthiness and continuity of
    tree space mappings.

  - Faster calculation of Robinson–Foulds distance (using algorithm of
    Day (1985)) and clustering information distance.

  - New class ClusterTable to allow faster distance computation with Day
    (1985) algorithm.

  - Improve error messages in CalculateTreeDist().

  - Improvements to vignettes.

  - Use package 'vdiffr' conditionally.

                 Changes in version 1.2.1 (2020-09-17)                  

  - Import RdMacros package 'RdPack'.

                 Changes in version 1.2.0 (2020-08-28)                  

  - TreeDistance() and related functions now return a dist object when
    computing all distances between all pairs of trees in a list.

  - Improve floating-point arithmetic in TreeDistance() functions.

  - TreeDistance() now returns a distance (as documented), rather than a
    similarity.

  - Fix rounding error in NNI 'Li' upper estimate, and improve NNI
    performance.

  - Reduce precision of LAPJV so rounding errors do not result in
    interminable run times.

                 Changes in version 1.1.1 (2020-07-10)                  

  - Fix range errors when calculating tree distances.

                        Changes in version 1.1.0                        

  - Improvements to NNIDist() in light of Fack et al. (2002).

  - Add NNIDiameter(): approximate diameter of NNI distance.

  - Remove vignette 'Interpreting tree distances': duplicates
    https://ms609.github.io/TreeDistData/articles/09-expected-similarity.html.

  - Remove redundant data object oneOverlap.

  - Fix an issue when installing on R 3.x (require C++11 to ensure
    declaration of UINT_FAST16_MAX).

  - Fix memory-handling bug in lapjv().

                 Changes in version 1.0.0 (2020-06-30)                  

  - Initial release, building on some draft functions included in
    'TreeSearch' 0.3.2.9005.
