The first release since 1.0.0, and mostly a correctness one. The expensive class
of bug here is not a crash: it is a run that returns a matrix that looks
entirely reasonable and is wrong. Most of what follows is that.
📖 Documentation: https://pathogenomics-lab.github.io/distree/ ·
🎓 Tutorial ·
📋 Full changelog
Highlights
Trees that used to fail, or quietly lie
- A leading
[&R]/[&U]rooting marker, which IQ-TREE, MrBayes and BEAST all
write, made a tree unparseable. - Non-ASCII labels came out as mojibake, so any name with an accent, a Greek
letter or CJK text stopped matching the samples it came from. - A truncated tree was accepted, with every dangling internal node silently
losing its branch length. A file holding several trees produced a matrix for
the first one without saying so. A:1e910parsed as infinity, giving a matrix ofinfwithNaNdown the
diagonal and an exit code saying success.--midpoint --topologyadded a hop to every distance crossing the midpoint.- Negative patristic distances were rounded up to zero, claiming two distinct
taxa were the same sample.
Faster
Rows are computed in batches rather than one parallel job each, every worker
formats its own output, and fixed-precision formatting is done by hand where the
rounding is unambiguous. An 8,000-tip run went from 2.52 s to 0.13 s on 14
cores; a 20,000-tip matrix from 10.6 s to 1.0 s. Output is byte-identical.
New
--npywrites a NumPy array of 64-bit floats: exact, half the size of text,
2.6x faster. With--lower, the condensed vector SciPy reads directly.--taxa FILErestricts the matrix to a list of tips, with the distances the
full tree gives.--statsprints a run summary to stderr.- Gzipped input is read directly, detected by content rather than file name.
Checked against something other than itself
Distances are cross-validated against R's ape (cophenetic.phylo, vcv.phylo)
and phangorn::midpoint over 250 generated trees: agreement to under 1e-9, and
exact for edge counts. The parser and pipeline are fuzzed. 96 tests, up from 31.
Breaking changes
The parser is stricter. All of these were previously accepted:
- A file holding more than one tree is now an error. Split it first.
- A truncated tree is an error rather than being closed at end of input.
- Trailing content after the tree, and unclosed quotes or comments, are errors.
- A label containing whitespace is rejected in
--lowermode, because PHYLIP
readers treat whitespace as the end of the name. - A branch length that is not finite is rejected.
--threads 0and--precisionabove 30 are rejected.- Negative patristic distances are reported rather than rounded to zero.
Install
conda install -c bioconda distreeOr download the binary for your platform below. On macOS, clear the quarantine
flag first: xattr -d com.apple.quarantine distree-macos-aarch64.
| Platform | Asset |
|---|---|
| Linux x86-64 | distree-linux-x86_64 |
| Linux arm64 | distree-linux-aarch64 |
| macOS Apple silicon | distree-macos-aarch64 |
| macOS Intel | distree-macos-x86_64 |