Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
773eec1
feat(bremer): Bremer (decay) support via converse-constraint + pool
ms609 Jul 9, 2026
02a7f7e
fix(bremer): address red-team findings (scoring guard, reach, soundness)
ms609 Jul 9, 2026
952120e
feat(bremer): parallelise per-clade converse searches over a cluster
ms609 Jul 9, 2026
2845b22
fix(bremer): address self-review findings on the red-team fixes
ms609 Jul 9, 2026
c5f700b
fix(bremer): guard converse sector/prune-reinsert against rebuilding …
ms609 Jul 10, 2026
8a0f56b
fix(bremer): validate optimalScore, make censored attr consistent, st…
ms609 Jul 10, 2026
22e6646
fix(bremer): make the scoring-mismatch guard a reliable warning, not …
ms609 Jul 10, 2026
9ee1d3c
feat(bremer): record scoring provenance on MaximizeParsimony output; …
ms609 Jul 10, 2026
2cc6311
test(bremer): cover zero-clade early return and pool-eviction score a…
ms609 Jul 10, 2026
41556cd
test(bremer): close TA-3/TA-4 via a search-injection seam
ms609 Jul 10, 2026
b26f948
Merge cpp-search into bremer-support-calculation
ms609 Jul 10, 2026
855c199
fix(bremer): green the R CMD check (examples, spelling, docs, deps)
ms609 Jul 10, 2026
9a67c04
fix(bremer): make the runnable example cheap, seeded, and hang-proof
ms609 Jul 10, 2026
5387ec2
fix(bremer): run the example serially (nThreads = 1)
ms609 Jul 10, 2026
88cb280
fix(bremer): serialize the SuboptimalTrees example too (nThreads = 1)
ms609 Jul 11, 2026
ba61fea
fix(bremer): bound the pool example's search so --run-donttest can't …
ms609 Jul 11, 2026
808c9aa
ci(probe): open a null graphics device before running plot-bearing ex…
ms609 Jul 11, 2026
b6d09ae
ci(probe): test the bgs-kernel hypothesis; portable gtimeout; add win…
ms609 Jul 11, 2026
3d4d660
ci(probe): faithful one-process concatenated donttest repro with mark…
ms609 Jul 11, 2026
a6f61f6
ci(probe): localize the hang to a TreeLength sub-call; RNG vs C++-sta…
ms609 Jul 11, 2026
5a8e75c
ci(probe): per-pattern profile timing to localize the macOS profile hang
ms609 Jul 11, 2026
f255220
ci: remove the donttest-hang debugging probe (investigation resolved …
ms609 Jul 11, 2026
8104429
Merge branch 'cpp-search' into claude/bremer-support-calculation-857d5f
ms609 Jul 12, 2026
837d95c
Merge branch 'cpp-search' into claude/bremer-support-calculation-857d5f
ms609 Jul 12, 2026
78ee3d9
fix: replace deprecated .Dim and .Dimnames with dim and dimnames in s…
ms609 Jul 30, 2026
cc8d7d8
Merge branch 'cpp-search' into claude/bremer-support-calculation-857d5f
ms609 Aug 5, 2026
ed41dfc
fix(bremer): address xhigh code-review findings
ms609 Aug 5, 2026
c31ee4e
Merge branch 'main' into claude/bremer-support-calculation-857d5f
ms609 Aug 18, 2026
8c9b0eb
Merge current Bremer work (ed41dfcea) into the PR branch
ms609-agent Aug 18, 2026
e7951a7
Merge cpp-search into claude/bremer-support-calculation-857d5f
ms609-agent Aug 18, 2026
b7bfb77
Merge cpp-search into claude/bremer-support-calculation-857d5f
ms609-agent Aug 18, 2026
43db1c4
Merge branch 'cpp-search' into claude/bremer-support-calculation-857d5f
ms609 Sep 7, 2026
ab42f42
Suboptimality → SuboptimalTrees.R
ms609 Sep 8, 2026
812eb14
ise→ize
ms609 Sep 8, 2026
c775248
cache
ms609 Sep 8, 2026
9c423c5
ucfirst
ms609 Sep 8, 2026
2803423
Tighten doc
ms609 Sep 8, 2026
1c1c9d8
Brand loyalty
ms609 Sep 8, 2026
1871768
Update test-Bremer.R
ms609 Sep 8, 2026
8d8cc0e
TreeTools::Consensus
ms609 Sep 8, 2026
32db72d
ren
ms609 Sep 8, 2026
dcb9183
Redoc; inheritParams
ms609 Sep 8, 2026
96774c2
rm Bremer's `cl`
ms609 Sep 8, 2026
eca95dc
roxygen 8.1.0
ms609 Sep 8, 2026
68de43d
rm babble
ms609 Sep 8, 2026
e928a0a
ws
ms609 Sep 8, 2026
720d6d8
explanation
ms609 Sep 8, 2026
1299080
no warning
ms609 Sep 8, 2026
3ce868b
no chat if verb = 0
ms609 Sep 8, 2026
939d4d8
expect_silent
ms609 Sep 8, 2026
cbb6cf9
No message, just warn
ms609 Sep 8, 2026
3201e6b
ds→vinther
ms609 Sep 8, 2026
549b0ad
ssh
ms609 Sep 8, 2026
f25e377
silence
ms609 Sep 8, 2026
71eda6d
hush
ms609 Sep 8, 2026
5d8b544
hush
ms609 Sep 8, 2026
b9526d6
Capture output
ms609 Sep 8, 2026
7737a25
Examples
ms609 Sep 8, 2026
664b842
maxSeconds; mcSamples
ms609 Sep 8, 2026
f5b6113
Merge branch 'ms609-approximation-time-budget' into claude/bremer-sup…
ms609 Sep 8, 2026
8c00607
document
ms609 Sep 8, 2026
370a85d
slim
ms609 Sep 8, 2026
b706f6a
TT 2.4.0.9002
ms609 Sep 8, 2026
f615e02
extra-repositories
ms609 Sep 8, 2026
d179415
Get TreeTools?
ms609 Sep 8, 2026
bfa648f
tighten needs
ms609 Sep 8, 2026
7d88bfb
Comment out unregistered DOI
ms609 Sep 8, 2026
7956605
Simply use remotes; cache-1 is gone
ms609 Sep 8, 2026
566c90f
missing ,
ms609 Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .Rprofile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ local({
# when content changes). Patching here intercepts every caller — devtools,
# pkgbuild, RStudio auto-build — not just our manual wrapper script.
local({
.normalise_lf <- function(pkgdir) {
.normalize_lf <- function(pkgdir) {
for (f in file.path(pkgdir, c("src/RcppExports.cpp", "R/RcppExports.R"))) {
if (!file.exists(f)) next
lines <- readLines(f, warn = FALSE)
Expand All @@ -42,7 +42,7 @@ local({
if (isTRUE(attr(orig, ".lf_patched"))) return()
patched <- function(pkgdir = ".", verbose = getOption("verbose")) {
result <- orig(pkgdir = pkgdir, verbose = verbose)
.normalise_lf(pkgdir)
.normalize_lf(pkgdir)
invisible(result)
}
attr(patched, ".lf_patched") <- TRUE
Expand Down
40 changes: 8 additions & 32 deletions .github/workflows/R-CMD-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,26 +113,18 @@ jobs:
# shinytest2 pulls chromote, whose declared system requirement is
# `chromium`. On Linux that makes pak add the ppa:xtradeb/apps PPA,
# re-run `apt-get update`, and install Chromium and its GTK/X11
# dependency tree -- ~70 s on EVERY run, including cache hits, since
# the sysreqs pass is not cached. Nothing here needs it: shinytest2
# is used only by inst/Parsimony/tests, which is .Rbuildignore'd and
# so absent from the tarball R CMD check sees, and those tests run in
# the dedicated `shiny` job on Windows.
# dependency tree -- ~70 s on every run, including cache hits, since
# the sysreqs pass is not cached. Nothing here needs it.
#
# Coreset isn't on CRAN, so without this pak fetches and compiles it
# from source on every cache miss -- ~67 s of the ~174 s dependency
# step (measured on this exact leg, run 30697330564). This URL is a
# prebuilt binary for this exact platform/R combo (aarch64,
# release), published by ms609/packages' build-maxmin workflow.
# The URL has no version/commit in it -- it always points at
# whatever Coreset build is current -- so it never needs updating
# here when Coreset changes.
# from source on every cache miss -- ~67 s. The URL is a prebuilt
# binary for this exact platform/R combo (aarch64, release),
# published by ms609/packages' build-maxmin workflow.
#
# Remove ms609/TreeTools when >=2.4.1 reaches CRAN (exptd 2026-09-16)
extra-packages: |
shinytest2=?ignore
url::https://ms609.github.io/packages/bin/linux/aarch64-release/Coreset_latest.tar.gz
# cache-version bumped to 2: the v1 caches were built while a
# project-level .Rprofile shadowed ~/.Rprofile, so every package
# in them was compiled from source. Retire them once.
cache-version: 2

- name: Check package
uses: r-lib/actions/check-r-package@v2
Expand Down Expand Up @@ -252,10 +244,6 @@ jobs:
# fails on Coreset by name; the branch only fires when pandoc is off
# PATH, which is why only the non-Linux legs hit it.
install-pandoc: true
# cache-version bumped to 2: the v1 caches were built while a
# project-level .Rprofile shadowed ~/.Rprofile, so every package
# in them was compiled from source. Retire them once.
cache-version: 2

- name: Set up R dependencies
uses: r-lib/actions/setup-r-dependencies@v2
Expand All @@ -278,10 +266,6 @@ jobs:
shinytest2=?ignore
${{ matrix.config.r == '4.1' && 'url::https://ms609.github.io/packages/bin/linux/x86_64-4.1/Coreset_latest.tar.gz' || 'url::https://ms609.github.io/packages/bin/linux/aarch64-devel/Coreset_latest.tar.gz' }}
${{ matrix.config.r == '4.1' && 'url::https://cran.r-project.org/src/contrib/Archive/highs/highs_1.12.0-3.tar.gz' || '' }}
# cache-version bumped to 2: the v1 caches were built while a
# project-level .Rprofile shadowed ~/.Rprofile, so every package
# in them was compiled from source. Retire them once.
cache-version: 2

- name: Check package
uses: r-lib/actions/check-r-package@v2
Expand Down Expand Up @@ -354,10 +338,6 @@ jobs:
# (auto-detect's `pak::pkg_deps(".")` solve cannot see extra-packages).
# `false` here: this job runs shinytest2, not vignettes.
install-pandoc: false
# cache-version bumped to 2: the v1 caches were built while a
# project-level .Rprofile shadowed ~/.Rprofile, so every package
# in them was compiled from source. Retire them once.
cache-version: 2

- name: Run EasyTrees shinytest2 suite
run: |
Expand Down Expand Up @@ -448,10 +428,6 @@ jobs:
# pre-emptive, since whether a macOS runner ships pandoc on PATH is
# exactly the condition that decides whether the bad branch fires.
install-pandoc: true
# cache-version bumped to 2: the v1 caches were built while a
# project-level .Rprofile shadowed ~/.Rprofile, so every package
# in them was compiled from source. Retire them once.
cache-version: 2

- name: Check package
uses: r-lib/actions/check-r-package@v2
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ whose comment names a worktree is being worked there — often by the human deve
Closing **without** a fix (not-a-bug, superseded design, negative result) needs more: close
as *not planned* with `deferred`/`wontfix` **and** a comment carrying the reasoning and
**what would make it live again**. A stated reopening condition is what let a later round
recognise T-377 firing rather than re-hunt it. Long reasoning goes in `dev/benchmarks/*.md`,
recognize T-377 firing rather than re-hunt it. Long reasoning goes in `dev/benchmarks/*.md`,
linked.

**Blocked on GHA, Hamilton or review?** Comment what you await, its reference, and the
Expand Down Expand Up @@ -261,7 +261,7 @@ Run these before committing whenever the trigger applies:
|---------|---------|
| Function signature or roxygen block changed | `Rscript -e "devtools::check_man()"` |
| Documentation prose changed | `Rscript -e "spelling::spell_check_package()"` |
| C++ signature changed | `Rscript .claude/tools/compile-attrs.R` (normalises LF + verifies `ts_rcpp.cpp` / `TreeSearch-init.c` arg counts) |
| C++ signature changed | `Rscript .claude/tools/compile-attrs.R` (normalizes LF + verifies `ts_rcpp.cpp` / `TreeSearch-init.c` arg counts) |
| Search behaviour changed (heuristics, scoring, stopping, pool) | Update `vignettes/search-algorithm.Rmd` |

Full details: `.AGENTS/memory/r-package-conventions.md`.
Expand Down
8 changes: 6 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,17 @@ Imports:
Rdpack (>= 0.7),
stats,
TreeDist (>= 2.6.3),
TreeTools (>= 2.3.0.9002),
TreeTools (>= 2.4.0.9002),
utils,
Remotes: ms609/TreeTools,
Suggests:
cluster,
Coreset,
future,
highs,
knitr,
phangorn (>= 2.2.1),
pkgload,
PlotTools,
promises,
protoclust,
Expand Down Expand Up @@ -90,11 +92,12 @@ Config/Needs/website:
pkgdown,
remotes,
shinylive,
Config/roxygen2/version: 8.0.0
Config/roxygen2/version: 8.1.0
Config/testthat/edition: 3
Collate:
'AdditionTree.R'
'Bootstrap.R'
'Bremer.R'
'CharacterHierarchy.R'
'ClusterStrings.R'
'Concordance.R'
Expand Down Expand Up @@ -122,6 +125,7 @@ Collate:
'recode_hierarchy.R'
'SPR.R'
'ScoreSpectrum.R'
'SuboptimalTrees.R'
'SuccessiveApproximations.R'
'TBR.R'
'TaxonInfluence.R'
Expand Down
210 changes: 116 additions & 94 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export(.NonDuplicateRoot)
export(.UniqueExceptHits)
export(AdditionTree)
export(BootstrapTree)
export(Bremer)
export(Carter1)
export(CharacterHierarchy)
export(CharacterLength)
Expand Down Expand Up @@ -111,6 +112,7 @@ export(SingleCharData)
export(SingleCharMorphy)
export(StepInformation)
export(StopUnlessBifurcating)
export(SuboptimalTrees)
export(Suboptimality)
export(SuccessiveApproximations)
export(SuccessiveWeights)
Expand All @@ -135,99 +137,119 @@ export(is.morphyPtr)
export(mc_fitch_scores)
importFrom(Rcpp,compileAttributes)
importFrom(Rdpack,reprompt)
importFrom(TreeDist,ClusteringEntropy)
importFrom(TreeDist,ClusteringInfo)
importFrom(TreeDist,ClusteringInfoDistance)
importFrom(TreeDist,Entropy)
importFrom(TreeDist,MutualClusteringInfo)
importFrom(TreeDist,SharedPhylogeneticInfo)
importFrom(TreeDist,entropy_int)
importFrom(TreeTools,AddUnconstrained)
importFrom(TreeTools,CharacterInformation)
importFrom(TreeTools,CladeSizes)
importFrom(TreeTools,CladisticInfo)
importFrom(TreeTools,CompatibleSplits)
importFrom(TreeTools,Consensus)
importFrom(TreeTools,DescendantEdges)
importFrom(TreeTools,DescendantTips)
importFrom(TreeTools,DoubleFactorial)
importFrom(TreeTools,EdgeAncestry)
importFrom(TreeTools,KeepTip)
importFrom(TreeTools,LnUnrooted)
importFrom(TreeTools,Log2DoubleFactorial)
importFrom(TreeTools,Log2Unrooted)
importFrom(TreeTools,Log2UnrootedMult)
importFrom(TreeTools,LogDoubleFactorial)
importFrom(TreeTools,MakeTreeBinary)
importFrom(TreeTools,MatchStrings)
importFrom(TreeTools,MatrixToPhyDat)
importFrom(TreeTools,NRooted)
importFrom(TreeTools,NSplits)
importFrom(TreeTools,NTip)
importFrom(TreeTools,NUnrooted)
importFrom(TreeTools,NUnrootedMult)
importFrom(TreeTools,NexusTokens)
importFrom(TreeTools,PaintTree)
importFrom(TreeTools,PectinateTree)
importFrom(TreeTools,PhyDatToMatrix)
importFrom(TreeTools,PolarizeSplits)
importFrom(TreeTools,Postorder)
importFrom(TreeTools,PostorderOrder)
importFrom(TreeTools,Preorder)
importFrom(TreeTools,RandomTree)
importFrom(TreeTools,Renumber)
importFrom(TreeTools,RenumberEdges)
importFrom(TreeTools,RenumberTips)
importFrom(TreeTools,RenumberTree)
importFrom(TreeTools,RootNode)
importFrom(TreeTools,RootTree)
importFrom(TreeTools,SampleOne)
importFrom(TreeTools,SplitConflicts)
importFrom(TreeTools,SplitFrequency)
importFrom(TreeTools,StringToPhyDat)
importFrom(TreeTools,Subsplit)
importFrom(TreeTools,SupportColour)
importFrom(TreeTools,TipLabels)
importFrom(TreeTools,TreeIsRooted)
importFrom(TreeTools,as.Splits)
importFrom(TreeTools,as.multiPhylo)
importFrom(TreeDist,
ClusteringEntropy,
ClusteringInfo,
ClusteringInfoDistance,
Entropy,
MutualClusteringInfo,
SharedPhylogeneticInfo,
entropy_int
)
importFrom(TreeTools,
AddUnconstrained,
CharacterInformation,
CladeSizes,
CladisticInfo,
CompatibleSplits,
Consensus,
DescendantEdges,
DescendantTips,
DoubleFactorial,
EdgeAncestry,
KeepTip,
LnUnrooted,
Log2DoubleFactorial,
Log2Unrooted,
Log2UnrootedMult,
LogDoubleFactorial,
MakeTreeBinary,
MatchStrings,
MatrixToPhyDat,
NRooted,
NSplits,
NTip,
NUnrooted,
NUnrootedMult,
NexusTokens,
PaintTree,
PectinateTree,
PhyDatToMatrix,
PolarizeSplits,
Postorder,
PostorderOrder,
Preorder,
RandomTree,
Renumber,
RenumberEdges,
RenumberTips,
RenumberTree,
RootNode,
RootTree,
SampleOne,
SplitConflicts,
SplitFrequency,
StringToPhyDat,
Subsplit,
SupportColour,
TipLabels,
TreeIsRooted,
as.Splits,
as.multiPhylo
)
importFrom(abind,abind)
importFrom(ape,consensus)
importFrom(ape,keep.tip)
importFrom(ape,nodelabels)
importFrom(ape,plot.phylo)
importFrom(ape,read.nexus)
importFrom(ape,root)
importFrom(ape,write.nexus)
importFrom(cli,cli_alert)
importFrom(cli,cli_alert_info)
importFrom(cli,cli_alert_success)
importFrom(cli,cli_alert_warning)
importFrom(cli,cli_h1)
importFrom(cli,cli_progress_bar)
importFrom(cli,cli_progress_update)
importFrom(colorspace,hex)
importFrom(colorspace,max_chroma)
importFrom(colorspace,polarLUV)
importFrom(fastmatch,"%fin%")
importFrom(fastmatch,fmatch)
importFrom(grDevices,col2rgb)
importFrom(grDevices,convertColor)
importFrom(grDevices,rgb)
importFrom(graphics,abline)
importFrom(graphics,image)
importFrom(graphics,mtext)
importFrom(graphics,par)
importFrom(stats,as.dist)
importFrom(stats,cophenetic)
importFrom(stats,cutree)
importFrom(stats,dnorm)
importFrom(stats,median)
importFrom(stats,runif)
importFrom(stats,sd)
importFrom(stats,setNames)
importFrom(stats,weighted.mean)
importFrom(utils,adist)
importFrom(utils,combn)
importFrom(utils,head)
importFrom(ape,
consensus,
keep.tip,
nodelabels,
plot.phylo,
read.nexus,
root,
write.nexus
)
importFrom(cli,
cli_alert,
cli_alert_info,
cli_alert_success,
cli_alert_warning,
cli_h1,
cli_progress_bar,
cli_progress_update
)
importFrom(colorspace,
hex,
max_chroma,
polarLUV
)
importFrom(fastmatch,
"%fin%",
fmatch
)
importFrom(grDevices,
col2rgb,
convertColor,
rgb
)
importFrom(graphics,
abline,
image,
mtext,
par
)
importFrom(stats,
as.dist,
cophenetic,
cutree,
dnorm,
median,
runif,
sd,
setNames,
weighted.mean
)
importFrom(utils,
adist,
combn,
head
)
useDynLib(TreeSearch, .registration = TRUE)
Loading
Loading