bifrost 0.2.0
Baseline-only search results now consistently retain regime label
"0"and include the fitted global BM covariance inVCVs[["0"]], without an additional fit. Covariance summaries no longer warn about proportional multi-regime matrices for this single global covariance. Search decisions are unchanged.-
Simulation tuning:
-
runSearchTuningGrid()now pairs simulated datasets across all settings, using shared scenario seeds consistently in serial and parallel execution. Separate GIC and BIC calls with matching simulation inputs and seeds are also paired. Its arguments are unchanged; returned objects recordpaired_settingsandstudy_seeds. Previously seeded grid results will change under this sampling design; existing cached results are not replaced.
-
-
Search progress:
-
searchOptimalConfiguration()now displays persistent, Future-compatible CLI progress for candidate scoring, greedy shift evaluation, and IC-weight re-estimation by default. - Reached stage rows remain stacked at the bottom while
verbose = TRUEoutput streams above them. - Stage spinners now redraw continuously during long model fits while completion counts, percentages, and ETA advance only after a fit finishes.
- Added
progress = FALSEas an explicit opt-out independent of detailedverbosemessages. - Captured expression-valued search inputs now print safely in
print.bifrost_search()output.
-
-
Search inputs and diagnostics:
Formula-based searches now accept formula objects as well as character strings, numeric response-only data frames for intercept-only searches, and named-column data-frame formulas for pGLS-style workflows.
When
IC = "BIC"andmethodis omitted, searches now usemethod = "LL"; an explicitly supplied method still takes precedence. GIC searches continue to use themvgls()fitting-method default whenmethodis omitted.Added
icTrajectory()and itsplot()method for inspecting stored search histories.Removed the superseded
plot_ic_acceptance_matrix()wrapper. For abifrost_searchor compatible search-result list, migrate toplot(icTrajectory(x)).-
Legacy callers that passed a raw two-column
matrix_dataobject must wrap it as a search-like list before plotting:legacy <- list( baseline_ic = baseline_ic, IC_used = "GIC", model_fit_history = list(ic_acceptance_matrix = matrix_data) ) plot(icTrajectory(legacy))The former plotting arguments map as follows:
plot_titletomain,plot_rate_of_improvementtoshow_delta,rate_limitstodelta_limits, andbaseline_icto theicTrajectory()call. Search results now include
candidate_nodes, anduser_inputrecords the resolvedprogresssetting. Stored model-fit histories retain proposal step, node, regime, IC, status, and explicit accepted, rejected, and errored records.Search input validation now requires an integer of at least 2 for
min_descendant_tipsand rejects simultaneousuncertaintyweights = TRUEanduncertaintyweights_par = TRUEbefore fitting begins.Search input validation now also rejects missing, nonscalar, nonnumeric, nonfinite, and negative
shift_acceptance_thresholdvalues before fitting begins.Search diagnostics now flag minimum clade sizes below 10 and IC acceptance thresholds below 10, contextualize the simulation and focal settings from Berv et al. (2026), report when no non-root candidates are eligible, and reject descendant-tip cutoffs larger than the tree. Repeated simulation searches muffle only the classed settings advisory while preserving fitting and optimizer warnings.
-
Search controls now default to
min_descendant_tips = 10andshift_acceptance_threshold = 20, matching the focal settings of Berv et al.- and providing conservative empirical starting points.
-
Branch-rate summaries:
- Added the
rateMap()workflow and supporting view, control, flagging, print, and plot methods for summarizing branch-rate patterns across completed searches. - Category legends represent uneven rate breaks proportionally, with strengthened validation of category-color counts.
-
generateViridisColorScale()now explicitly requires numeric input, and its documentation clarifies that colors encode sorted rank rather than numeric magnitude or distance.
- Added the
-
Lineage-rate and shift-distribution analyses:
- Added
lineage_rates()for tip-level summaries of inherited rate histories and associated branch and shift diagnostics. - Added tools for extracting shift nodes, transitions, waiting times, and magnitude groups; fitting waiting-time and lineage-rate distributions; bootstrapping rate-distribution summaries; and comparing shift magnitudes.
- Added
-
Regime covariance and integration analyses:
- Added
fit_regime_covariances(),fit_regime_covariance_runs(), and their summary helpers for post-hoc covariance estimation across fitted regimes and search runs. - Added module diagnostics, correlation-matrix PCA, integration-relationship summaries, and
regime_integration_pgls()for examining regime-specific covariance structure and downstream relationships.
- Added
-
Simulation studies and tuning:
- Fixed recovery evaluation excluding successful searches with an explicitly
NULLshift-node vector. Zero-shift results now contribute missed shifts to strict, fuzzy, and weighted recovery summaries; saved results can be reassessed without refitting searches. Failed or incomplete records remain excluded. - Added reproducible simulation templates, null and shifted dataset generators, false-positive and shift-recovery studies, recovery evaluation, and fixed-IC tuning grids.
- Added empirical null, proportional-shift, and integration-rate robustness workflows centered on fitted residual covariance, with
simulation_generator = c("original", "empirical")for explicit generator selection. - The new simulation generators default to
"original"for exact reproduction of the published operations; the full-covariance Wishart/spectral generator remains available explicitly assimulation_generator = "empirical". -
selectTunedSearchParameters()filters settings using null false-positive and evaluability safeguards, then ranks feasible settings by fuzzy balanced accuracy by default. - Reduced multisession transfer size by using compact namespace-level workers and by avoiding a complete calibration template inside every replicate’s call record.
- Fixed recovery evaluation excluding successful searches with an explicitly
-
Documentation / vignettes:
- All vignettes are now website-only. The source package and installed package no longer include
vignettes/or builtinst/docarticles; the complete worked documentation remains available on the package website. - Removed all former
system.file("extdata", ...)empirical paths intentionally. Usebifrost_example_file()instead for the eight named artifacts:jaw-tree,jaw-landmarks,passerine-tree,passerine-traits,passerine-search,passerine-sensitivity,passerine-posthoc, andsimulation-preview-tables. - Reduced installed package size by no longer distributing repository/site empirical payloads through CRAN. Normal package installation, attachment, examples, and checks remain network-free.
- Documented that the first uncached
bifrost_example_file()request uses the checksum-verified artifact currently tracked on GitHubmain; later calls reuse the verified cache unlessrefresh = TRUErequests a new check. - Added small, deterministic, runnable help examples for regime-integration, simulation, rate-map, lineage-rate, and tuning workflows; longer model-fitting examples now use bounded
\donttest{}blocks that are exercised in CI. - Added two rate-map jaw-shape workflows and refreshed the existing jaw-shape vignette.
- Added a five-part avian skeleton case study covering search inspection, lineage rates, shift distributions, magnitude comparisons, and post-hoc covariance and integration analyses.
- Added a two-part empirically calibrated simulation guide covering performance assessment, search tuning, and empirical application.
- Added downloadable vignette PDFs and executable Colab notebooks to the website articles.
- Updated Berv et al. (2026) citation metadata and avian skeleton references for the published Nature Ecology & Evolution article DOI.
- All vignettes are now website-only. The source package and installed package no longer include
-
Maintenance:
- Increased the minimum supported R version from 4.1 to 4.2.
- Added minimum versions
future (>= 1.49.0)andphytools (>= 2.0-3), corrected runtime and optional dependency declarations, moved website-only packages toConfig/Needs/website, and removedVignetteBuilderbecause vignettes are not built into the package. - Added
plotrixas a direct dependency for rate-map arc and fan geometry. - Refactored
searchOptimalConfiguration()into dedicated internal helpers for candidate evaluation, greedy search orchestration, history bookkeeping, and parallel result handling; the public entry point remainssearchOptimalConfiguration(), and existing positional arguments remain compatible. - Parallel search and simulation paths preserve the caller’s Future plan and reproducible RNG state while avoiding nested worker oversubscription.
- Hardened lineage-rate, regime-integration, simulation, and tuning workflows around malformed inputs, failed fits, reproducible parallel execution, and infeasible selections.
- Added a CRAN downloads chart to the README and development website.
bifrost 0.1.4
CRAN release: 2026-04-17
- Documentation / vignettes:
- Added a new “Quick Start with bifrost” vignette with a minimal end-to-end simulated example.
- Clarified
searchOptimalConfiguration()documentation around acceptable tree inputs, recommendedmvgls()methods ("H&L"vs"LL"), and the role oferror = TRUE. - Reworked the README to foreground installation, documentation, and citation guidance.
- Added two pkgdown-only background articles on multivariate Brownian motion / shifts and on whole-tree PCA / model-selection issues.
- Citation / metadata:
- Updated package authorship metadata to reflect the current author list.
- Updated
citation("bifrost")for the live bioRxiv preprint and the application paper. - Added the foundational
mvMORPHcitations to the package citation metadata. - Added a formatted citation section and dynamic bioRxiv badge to the README.
- Maintenance:
- Disabled a deprecated vignette-preview step in GitHub Actions CI.
bifrost 0.1.3
CRAN release: 2026-01-21
- Addressed CRAN reviewer feedback following review of 0.1.2:
- Added explicit return-value documentation (
@return/\value{}) for the exportedprint.bifrost_search()method, clarifying that the function returns the input object invisibly and is called for its printing side effects.
- Added explicit return-value documentation (
- Plotting:
-
plot_ic_acceptance_matrix()gains an optionalbaseline_icargument to plot and computediff(IC)relative to the true no-shift baseline (useful whenmatrix_databegins at the first evaluated shift model rather than the true baseline).
-
- Documentation / vignettes:
- Updated the jaw-shape vignette with additional static figures (evolutionary correlation heatmap, IC-trajectory plot, and branch-rate visualization) and improved plotting annotations.
bifrost 0.1.2
- Addressed CRAN reviewer feedback following review of 0.1.1:
- Plotting:
- Added
rate_limitsargument toplot_ic_acceptance_matrix()(defaultc(-400, 150)) to control the secondary y-axis limits for the rate-of-improvement overlay (validated numeric length-2, finite).
- Added
- Search results output:
- Added a
bifrost_searchS3 class andprint.bifrost_search()method forsearchOptimalConfiguration()results (compact console summary; optional ASCII IC-history plot viatxtplotwhenstore_model_fit_history = TRUE; prints IC weights when present). - Print output includes a citation hint (
citation("bifrost")); package citation metadata updated ininst/CITATION.
- Added a
- IC weights / no-shift behavior:
- Standardized
ic_weightsoutput across serial and parallel uncertainty-weight modes; always returns adata.framewith consistent columns, and returns an emptydata.framewith the same schema when no shifts are detected. - When no shifts are detected,
model_no_uncertaintynow returns the baselinemvglsmodel (instead ofNULL).
- Standardized
- Documentation / vignettes / tests:
- Updated jaw-shape vignette chunk printing of
ic_weightsto avoid RStudio paged/Unicode rendering issues. - Expanded and stabilized unit tests and CI configuration (including
Config/testthat/parallel: false).
- Updated jaw-shape vignette chunk printing of
bifrost 0.1.1
- Addressed CRAN reviewer feedback following review of 0.1.0:
- Replaced all uses of shorthand
T/FwithTRUE/FALSE. - Ensured all informational output is suppressible via
message()/warning()and controlled by averboseflag. - Redirected all on-disk output generated during model fitting to
tempdir()to comply with CRAN file system policies and avoid writing to the user’s working directory. - Ensured graphical parameters and global options are restored using immediate
on.exit()calls. - Refined parallelization behavior to be CRAN-safe and cross-platform:
- Parallel candidate evaluation uses
futurewithmulticoreon Unix outside RStudio andmultisessionotherwise. - BLAS/OpenMP threads are capped to one per worker during parallel execution to avoid CPU oversubscription.
- Sequential execution remains the default when
num_cores = 1.
- Parallel candidate evaluation uses
- Improved documentation clarity around parallel execution, verbosity, and model fit history storage.
- Replaced all uses of shorthand
