Changelog
Source:NEWS.md
OmicSelector 2.6.8
- For reproducible foundation-model scores across machines, set CPU dispatch in the process environment before R starts:
ATEN_CPU_CAPABILITY=avx2,MKL_ENABLE_INSTRUCTIONS=AVX2,ONEDNN_MAX_CPU_ISA=AVX2,DNNL_MAX_CPU_ISA=AVX2, and a matchedOPENBLAS_CORETYPE(Zenin the measured environment). Match numerical-library versions and thread counts. With these launcher settings, measured TabPFN/TabDPT scores on s8, s5, cpd and AVX-512 Argos nodes agreed within 8.05e-7, with no changed calls or AUC differences. Without matched dispatch, AVX-512 differences reached 0.030 for TabDPT and 0.0003 for TabPFN. Repeated CPU TabICL runs differed by up to 5.96e-7. These measurements do not establish bitwise identity across machines. See the README for the startup recipe. - Bound TabPFN batch scoring by a 4 GiB float32 math-attention workspace budget, estimated from the fitted key/value cache dimensions with room for three dense attention matrices. CPU and CUDA use the same limit. Existing balanced query chunks remain unchanged when they fit; larger batches use smaller balanced chunks. An informative error reports a context that cannot fit even one query. The budget excludes retained context, parameters and other process memory. The default training context is capped at 4,096 rows; scoring 15,313 training rows does not create a 15,313-row fitted context.
- TabPFN caches the frozen transformer training context once on CPU. Singleton scoring reuses this float32 context on CPU or CUDA, including after device round trips; the complete cache remains in the frozen-state fingerprint.
- TabPFN inference explicitly uses float32 on CPU and CUDA, cached training preprocessing, a fixed preprocessing seed, and a memory-saving choice based only on frozen training dimensions, shared by CPU and CUDA. Internal normalization and frozen column embeddings use CPU arithmetic on every inference device. Query preprocessing uses the singleton path before batched neural inference, preventing batch-dependent fingerprint hashes.
- TabDPT disables flash attention on both devices and fits its projection with an explicitly seeded CPU generator. The frozen CPU projection and projected context are reused when scoring, including after moving the model.
- Foundation-model scoring selects full-precision math attention and disables TF32, restoring the caller’s settings afterwards. Deployment retains its singleton scoring contract and input guards.
- Avoid a duplicate estimator copy during deployment. Private prediction copies share read-only neural parameter storage; buffers and query state stay private.
- Release temporary inference-copy and fingerprint references immediately, including on errors. Recursive Python helper closures previously retained estimators and context tensors until cyclic garbage collection.
- Release private Python estimator copies after every Python-backed scoring call, including errors, through both
singlesample_score_call()and deployedscore_specimen(). This includes TabPFN, TabDPT and TabICL. R’s memory threshold does not account for their Python tensor buffers. All 38 measured routes retained zero private copies after each call; 940 before/after scores were identical. Fitted caches and score calculations are unchanged. In separate-process measurements from c3cd24a7 to a55f6c2b, mean per-call time changed by -2.0% to +10.8% across the six TabPFN/TabDPT/TabICL routes (-21.0 to +39.8 ms). Across all 38 routes the range was -36.8% to +10.8%; the other routes took 2.25-23.75 ms after the fix. These timings include process and load variability. - Allow memory for the fitted TabPFN context and temporary scoring buffers. On Toray with 1,600 training specimens and 79 features, the fitted model held 3.22 GiB of unique tensor storage: 2.95 GiB for the training-context cache and 0.24 GiB for parameters. Total live tensor storage reached 6.17 GiB after training-set scoring during deployment. Process RSS was 4.6-7.9 GiB across 100 deployed singleton calls and final memory cleanup, with a 15.8 GiB peak across fitting and deployment. RSS fell by 554 MB between calls 1 and 100. These CPU measurements used c3cd24a7 in a 32 GiB job; an independent reference fit was released before deployment. Provision headroom above the observed peak; model tensor storage alone is not a process memory budget.
- CPU context-cache measurements on shared s8 hardware reduced GSE117063 singleton scoring from 15.842 to 3.10175 seconds at deployed defaults and 6.905 to 1.2235 seconds with four threads (four timed specimens per stage). With 1,600 Toray training specimens, corresponding times were 1,014.722 to 11.999 seconds (one timed specimen) and 490.62925 to 6.44125 seconds (four timed specimens). Each stage followed a warm-up; the comparison disabled only the context cache, and maximum score differences were below 1e-6, with unchanged calls. These measurements used 1b526ed5, before the reference-release fixes; they measure the cache effect. The per-call measurements above assess the later release fix.
- Repair the Docker release workflow to build Dockerfile, smoke-test the package, tag images with the package version, and push only with registry credentials.
OmicSelector 2.6.7
Remove the
sel-stablematetransfer route and the optional StableMate dependency, which declares no licence. The roster has 73 methods: 50 for use within one cohort and 23 for transfer.TabICL now builds a full-precision context cache at fit on every device (
offload_mode = FALSE,kv_cache = TRUE,use_amp = FALSE). Scoring retains the single-row path and RNG guard, with private copies protecting the fitted cache covered by the state fingerprint.Accept documented qPCR, small-RNA/miRNA sequencing, HTG EdgeSeq count and 3D-Gene technology aliases without changing kit or biofluid metadata. Unrecognized technology strings still raise
UNSEEN_METADATA_LEVELin deployment. Generic microarrays and mixed-platform labels remain unsupported.Cross-technology anchor selection, fitting, scoring and deployment now default to the known technology classes present in training after alias mapping. At least two are required (
INSUFFICIENT_TECHNOLOGY_CLASSES);unknowndoes not count. Explicitrequired_technologiesvectors retain their meaning. The resolved default is frozen in the fit and never inferred from test data.Reject insufficient frozen support in cross-technology rCLR, biofluid-anchor rCLR and technology-residualized ALR with
INSUFFICIENT_CROSS_TECH_ANCHORS,INSUFFICIENT_BIOFLUID_ANCHORSandINSUFFICIENT_ALR_PIVOTS, respectively. These input errors replace all-NA vectors that deployment misreported as non-scalar scorers. Pivot minima and arithmetic for supported inputs are unchanged.Enable Python-tier deployment when its backend imports. Live Python models use frozen evaluation state and one query per forward pass with fixed seeds. Query-specific estimator copies discard prediction-cache writes. Optional
hpexposes existing fitter settings without changing defaults.Add SHA-256 state fingerprints that include Python parameters, buffers, preprocessing and frozen context in deployment verification.
Adapt legacy matrix, anomaly and metadata interfaces to specimen scoring. Freeze training panels and metadata levels. Reject missing/unseen metadata and absent hemolysis anchors with machine-readable codes.
Extend the deployability probe helper to accept specimen metadata.
OmicSelector 2.6.6
Add frozen count and Ct preprocessing for
deploy_singlesample(), with specimen-local conversion, detection masks and raw-input verification. Required NA or non-finite abundance values now raiseNONFINITE_REQUIRED_VALUEwith affected rows before scoring. Raw Ct non-detects, including NA, convert to abundance 1 with detection FALSE. Row-equivariance checks accept an optional domain-specific extreme transform.Add optional
group_trainto deployment, selector fits, and routes with inner resampling. Pair-ratio, group-DRO, scattering, and path-signature tuning keep groups in one fold; conformal anomaly calibration and prototype episodes keep groups on one side; StableMate excludes held-out biological groups from its environment-training complement. Invalid groups raiseINVALID_GROUPS.group_train = NULLretains the existing fitting paths.Correct the roxygen declaration for the
mlr3pipelinespipe import so the generated installed-package namespace loads.Add session-level custom scorer registration, listing and removal. Registered routes use deployment input guards and default probe audits for specimen-local scores and unchanged fitted state. Custom strict support is declared at registration; existing deployment objects retain their resolved callback after registry changes. Built-in roster rows and dispatch are unchanged.
Expose
strict = FALSEthroughscore_specimen()andsinglesample_score_call(). Strict checking reaches k-TSP, pair-ratio, trimmed rCLR and balance ILR. Other routes and custom adapters fail closed withSTRICT_UNSUPPORTED. Balance ILR rejects missing frozen balance members in strict mode and reports distinct member counts in itssupportattribute. Complement and abundance-ranked balances count the frozen training universe. Default score arithmetic and missing-feature policies are unchanged.Narrow the package Title to specimen-local scoring audits and grouped validation; remove the broader “Zero-Leakage” claim.
Make partial-panel policy explicit.
score_reo_ktsp()averages votes over available fitted pairs.score_reo_pairratio()retains the frozen intercept and coefficients for available pairs without rescaling. These are reduced- support scores; a complete-panel fit does not establish their discrimination or calibration.strict = TRUErejects any missing fitted-pair feature.score_ws_rclr_panel()transforms the entire supplied matrix before selecting its panel. Background columns affect centering and the default pseudocount. Missing panel columns always fail;strict = TRUEalso requires every frozen training-universe column. Extra columns still enter the transform. Correct the matrix shape for one-column rCLR batches so a one-feature panel remains consistent between singleton and batch scoring.These three scorers default to
strict = FALSEto preserve existing scoring arithmetic and missing-feature policies. Numeric outputs now have asupportdata-frame attribute with per-scoren_available,n_fitted, andfull_support. Pair methods count pairs; rCLR counts training-universe features. The flag records column availability, not assay quality or score equivalence.score_specimen()preserves this attribute and acceptsstrict = TRUEfor complete-support checking. Numeric coercion and subsetting can discard attributes. New rejection codes areINVALID_STRICT,MISSING_REQUIRED_FEATURES, andMISSING_FITTED_UNIVERSE.Clarify
fit_platt_scaling()as logistic regression on probabilities clipped to [1e-10, 1 - 1e-10], with the same clipping at prediction. It does not take log-odds inputs or transform the predictor to log-odds. Arithmetic is unchanged.Verify the StableMate fallback in
R/zzz.RandR/singlesample-sel-stablemate-scorers.R: when active-library lookup fails, try the first login-home library containing an installed package, in orderR/omicselector,R/library, then version directories underR/x86_64-pc-linux-gnu-library. Active libraries remain first in the load search;.libPaths()is unchanged. No package is installed. Failed loading ends in an explicit missing-dependency error. This is not restricted to R 4.5. The earlier NEWS wording was too narrow and is corrected.DEP_AUDIT.mdwas absent from the supplied checkout, so its claim could not be compared.Behavior change: single-specimen deployment rejects empty input, absence of every frozen required feature, and rows with no detected required feature. The k-TSP, pair-ratio, ILR and trimmed-rCLR scorer wrappers apply these input checks directly. Pair and ILR scorers also reject unusable support. k-TSP and pair-ratio fits record empty/constant training support; ILR rejects empty balance coverage at fitting and records constant training scores. These states no longer produce neutral or intercept-only deployment scores.
Rejections inherit
singlesample_input_errorand exposecodeandrows:EMPTY_INPUT,INVALID_INPUT,INVALID_FEATURE_NAMES,ALL_REQUIRED_ABSENT,ALL_NONDETECT,EMPTY_FITTED_SUPPORT,CONSTANT_FITTED_SUPPORT, andNO_USABLE_SUPPORT. Invalid detection masks and thresholds useINVALID_DETECTION_MASKandINVALID_NONDETECT_LIMIT. A batch with any invalid row fails as a whole; row numbers identify all-nondetect rows. No variance or threshold is estimated from a scored batch.deploy_singlesample(nondetect_limit = 0)freezes the assay’s abundance threshold; use 1 when Ct 40 nondetects are mapped to abundance 1.score_specimen(detected = ...)accepts a logical detection mask retained before imputation. Positive imputed values cannot in general be distinguished from measurements without this mask or an appropriate frozen threshold. Uniform positive profiles and constant held-out scores are not automatically invalid. Refit old models to record the training support status; legacy objects still receive input and structurally empty support checks.Valid-input scoring arithmetic is unchanged. Singleton and batch regression checks and the RJ1/RJ6/RJ7 evidence are under
tests/input-guards-20261003/.When
RETICULATE_PYTHONis unset, package load points reticulate at/usr/bin/python3and, when that login-home user site already contains torch, setsPYTHONUSERBASEthere. Existing TabPFN and Hugging Face caches under the login home are used when those variables are unset. No Python or R package is installed.sel-stablematecan load an already installed StableMate namespace from a login-home R library. StableMate declaresLicense: Noneand is not vendored.selbalis GPL-3, is absent from Bioconductor 3.23, and is not vendored. Tier R2 methods remain outsidedeploy_singlesample().
OmicSelector 2.6.5.9001 (development)
Cache each specimen’s detrended MFDFA window variances once per scale in
frac-mfdfaand reuse them across q values. This removes sixfold redundant least-squares work under the default q grid while preserving the legacy descriptor exactly.Clarify the paper benchmark’s held-out support contract so complete finite constant scores are retained as valid midrank-AUC evidence (AUC 0.5), while incomplete or non-finite score vectors still fail closed. The external rank-tree runner now applies this rule uniformly, binds both approved design amendments, and resolves its installed dependency closure only within the active R libraries so a pinned
pkgloadsource checkout cannot invalidate final runtime re-attestation. The shared paper runtime-receipt producer now uses the same installed-library resolution contract.Return explicit intercept-only frozen states when every training log-ratio is constant for
reo-pairratio, or when no within-sample pair ordering varies for the external rank-forest and rank-boost routes. These zero-information states score each specimen deterministically, preserve RNG and model state, and expose their fit status instead of failing inside a dependency backend.Preserve rank-boost’s requested 0.5 bag fraction in the audit state and apply a conservative one-training-observation effective bag-fraction floor for small folds. This avoids the pinned
gbmnode-size boundary; folds that remain mathematically too small at a fraction of one fail explicitly.Correct
os_detect_cross_cohort_duplicates()so its documentedtoleranceandmin_featuresarguments are enforced. Exact matching no longer rounds profiles to eight decimals, tolerant/partially observed matching is explicit, and malformed identifiers or thresholds fail closed.Bound the external
ranktreeEnsembleadapters’ training-only preliminary importance screen to a fixed 128-feature target before quadratic pair expansion. This preserves the backend’s top-quartile default on ordinary panels while preventing protection/C-stack failure on high-dimensional miRNA inputs. Prediction now reconstructs and requires only the exact screened raw-feature subset rather than requiring and expanding all original inputs again; the frozen target, realized backend quantile, and selected feature order are stored in every model.Add audited
ranktreeEnsemble0.24 adapters for random rank forests and boosted rank trees, plus an explicit external-competitor registry. These post-freeze sensitivity routes preserve the 74-row primary roster, construct every learned representation inside training folds, enforce a frozen feature map and usedatrank = FALSEto avoid the backend’s train/predict representation mismatch. The adapter also confines random-forest screening to its reproducible single-core RNG route and preserves singleton probability array dimensions.Add audited group-collapsed and profile-weighted inference helpers for fair comparison of the full registered single-sample method roster, including corrected repeated-CV uncertainty, frozen multiplicity families, and outcome-independent complete-support panels. The paper runner uses the group-collapsed estimand as primary when biological groups have repeated profiles and reports equal-profile weighting as a sensitivity analysis.
Add an experimental grouped cross-fitted single-sample selector with best-AUC, lower-confidence-limit, and simplex-stack routes. The three routes can share one inner cross-fit pass and return pure-R frozen scoring objects. Deployed selector scores now route every base method and the final simplex affine reduction through the same one-specimen arithmetic path, guaranteeing exact batch-versus-singleton equality across BLAS implementations.
Add immutable paper-analysis producers for snapshot integration, all-method comparison, fully nested selector tasks, and selector synthesis. These scripts fail closed on provenance, split, support, fit-budget, and manifest inconsistencies.
Add a fail-closed 34-by-five nested-selector task-grid producer and portable one-task launcher that pin cache bytes, clean package commit, runtime inputs, and atomic output paths.
Pin nested-selector tasks to exact container and R-library snapshot hashes, record the executing R/package environment, and carry the frozen modality/biospecimen and 33-primary/one-sensitivity unit accounting into synthesis.
Add a fail-closed, serialization-only splitter for the paper’s frozen optional-dependency benchmark. It verifies the complete 13-by-five-by-34 task contract, provenance-group folds, result cardinality, and package/code pins before atomically emitting one-cell task bundles and a final manifest; arbitrary fit, score, dependency, and runtime failures cannot be relabelled as structural ineligibility.
Add a package-owned structural-witness producer for generic ineligibility in that dependency benchmark. It replays only explicitly pinned cells from a clean historical package commit, preserves every finite held-out score, and authorizes sharding only when exact cache, task, analysis, fold-engine, and producer bytes prove a fold-local constant-score limitation rather than a hidden fit, scoring, dependency, or runtime error.
Make the paper’s all-method comparison consume an immutable, fully validated dependency-overlay candidate rather than mutable aggregate tables. The snapshot now binds every upstream validation row and input byte, exact source and installed-package pins, route-specific execution receipts, splitter manifests, and the structural witness transitively through the candidate manifest. Snapshot construction, execution, and validation additionally bind a deterministic digest of every file in the loaded OmicSelector installation, preventing a same-version but stale lazy-load database from passing a source-script check. Fair-inference snapshots export predictions only for method–unit pairs completing all five registered seeds, while preserving every partial seed failure and reason in the complete cell/eligibility audit.
Add a package-owned, atomic runtime-receipt producer and shared start/end guard for the paper analyses. It pins the immutable image, canonical executables, exact R/platform/RNG/BLAS and one-thread state, and recursive installed dependency trees rooted at OmicSelector, data.table, digest, and metafor; snapshot, runner, and validator manifests carry the same receipt and image digests.
Add a package-owned post-run validator for the fair all-method comparison. It verifies the exact artifact inventory, frozen dimensions and pair family, common-support held-out joins, multiplicity families, inference and resampling contracts, provenance identity, and source/snapshot/runtime pins before atomically promoting a PASS receipt.
OmicSelector 2.6.5 (2026-07-17)
- Reimplemented the exact
os_ktsp_fit()candidate-pair enumeration as vectorized feature blocks with top-k retention. The fitted pair ordering and scores are identical to the prior pairwise implementation, while large miRNA feature spaces no longer incur millions of interpreted-R loop iterations.
OmicSelector 2.6.4 (2026-07-16)
-
score_lrt_bw()now reuses the fit-time Bures-Wasserstein class representation when the complete fitted feature universe is present. This removes amplified eigensolver round-off differences between singleton and batch scoring while preserving the documented partial-overlap route.
OmicSelector 2.6.3 (2026-07-16)
- Promoted the benchmark’s trimmed-rCLR signed-panel reference to canonical
fit_ws_rclr_panel()/score_ws_rclr_panel()package functions. The frozen model selects a 20-feature panel and score signs from training data only and exposes the same one-score-per-specimen deployment contract as the other rostered methods.
OmicSelector 2.6.2 (2026-07-15)
- Made
orient = "fixed"the default forsinglesample_paired_auc_diff_se(). Outcome-dependent"median"and sign-invariant"auc"orientation remain explicit opt-ins.
OmicSelector 2.6.1 (2026-07-15)
- Added
orient = "fixed"tosinglesample_paired_auc_diff_se()so a training-frozen score direction can be evaluated without using held-out outcomes to reflect the ROC curve.
OmicSelector 2.6.0 (2026-07-08)
Single-sample deployment API
- Added a single-sample deployment API —
deploy_singlesample()freezes one rostered scorer,score_specimen()scores an incoming specimen from its own panel values plus frozen fit-time parameters (no test batch, reference cohort, or batch-correction step), andis_singlesample_deployable()checks the singleton-equals-batch guarantee; about 30 roster methods deploy and the rest reject cleanly. This exposes deployability only and is not a superiority claim over batch-corrected pipelines. Seevignette("single-sample-deployment"). - inv-scatter: replaced the O(D^3) frozen ridge head with an exact SVD row-space solve so the scattering scorer is shippable when D >> n; results are unchanged up to numerical-rank tolerance (added
test-inv-scatter-head-equivalence.R).
Single-sample miRNA scoring method bank (74 methods)
Completed the frozen 74-method single-sample scoring bank under
R/singlesample-*.R, rostered ininst/extdata/singlesample_method_manifest.csvand enumerable viasinglesample_method_roster()/singlesample_method_bank(). Every method is a single-sample (per-row) scorer: a deployed sample is scored using only its own panel values plus frozen parameters learned at fit time, with no batch-correction step and no requirement for a co-resident reference cohort at deployment. Methods carry awithin(within-cohort) ortransfer(cross-cohort generalisation) estimand and a role of baseline, discriminator, or negative control. The bank is grouped into the following families (manifestfamilycodes A-O, NC, which are short grouping letters, not descriptive names):Compositional within-sample baselines (family A): trimmed robust-CLR reference (
ws_rclr_trimmed, the reference, not a candidate), additive log-ratio with a frozen pivot pool, MAD log-ratio, and a panel-internal dominance score for pre-analytical-failure detection.Frozen denoisers (family B): frozen-RUV factor removal, robust-PCA residual, and robust-regression hemolysis residual removal.
Kit-aware compositional transfer scorers (family D): kit-stratified rCLR, kit fixed-effect-adjusted ALR, kit-orthogonal ILR, and kit-residual MAD.
Anchor/reference denoising transfer scorers (family E): kit-stable-anchor rCLR, hemolysis-and-kit dual-anchor, and RIN-weighted reference scoring.
Technology-aware transfer scorers (family F): technology-stratified rCLR, cross-technology harmonised rCLR, and technology-residualised ALR.
Biofluid-aware transfer scorers (family G): biofluid-stratified rCLR, biofluid-anchor rCLR, biofluid-residualised ALR, and blood-cell/platelet marker-exclusion rCLR.
Rank / relative-ordering and balance methods (family K): k-TSP relative expression ordering (
reo_ktsp), pairwise-log-ratio penalised logistic (reo_pairratio), singscore and UCell within-sample rank scores, a meta-analytic cross-cohort k-TSP (reo_metaktsp), theselbalbalance selection + log-contrast logistic scorer (bal_selbal), and the ILR balance scorer (ws_balance_ilr).Likelihood-ratio, optimal-transport, kernel and density-ratio scorers (family L): class-conditional likelihood-ratio tests including Bures-Wasserstein (
lrt_bw), KDE naive-Bayes (lrt_nbkde), Gaussian-copula (lrt_copula), tail-aware Student-t-copula (lrt_tcopula), vine-copula (lrt_vinecopula, viarvinecopulib), Mondrian-conformal LRT (conf_mondrian), linearised OT embedding to a frozen reference (ot_lot), sliced-Wasserstein-view Gaussian LRT (ot_slicedlrt), kernel mean-embedding witness (kme_witness), Fisher-Rao geodesic LRT (ig_fisherrao), and direct density-ratio uLSIF (dre_ulsif).Image / invariance / signal-descriptor scorers (family M): wavelet scattering + frozen head (
inv_scatter, viakymatio), ordinal-LBP (inv_olbp), sublevel persistent homology persistence image (tda_ph), path-signature features (sig_path), multifractal-DFA spectrum descriptors (frac_mfdfa), GASF-image-to-frozen-CNN embedding (img_gasfcnn, via torch/torchvision), graph-Fourier transform on a frozen co-expression graph (gsp_gft), Nystrom out-of-sample diffusion-map (man_nystrom), Haralick GLCM (inv_glcm), quantile-function FDA (inv_fdaqf), and curvature-scale-space descriptor (inv_css).Neural / domain-generalisation / self-supervised scorers (family N): most use a torch backend at fit and export frozen weights for a pure-R per-row score. Members are domain-adversarial encoder (
dann), counterfactual class-conditional VAE (cvae), Invariant Causal Prediction (icp), SCARF contrastive (ai_scarf), group-DRO (dro_group), V-REx (dro_vrex), self-gated mixture of frozen experts (moe_gated), spectral-normalised neural GP (unc_sngp), VICReg self-supervised embedding (ssl_vicreg), prototypical network (proto_net), deep Mahalanobis on a learned frozen embedding (lrt_deepmaha), Fishr (dg_fishr), IB-IRM (dg_ibirm), and StableMate stable-predictor selection (sel_stablemate).Foundation-model and non-linear-compositional scorers (family O): in-context tabular foundation models scored against a frozen reference context (TabPFN-v2
tabpfn, large-context TabICLtabicl, retrieval-based TabDPTtabdpt), non-linear log-contrast network DeepCoDA (coda_deepcoda), and sparse log-ratio balances CoDaCoRe (coda_codacore).Negative controls (family NC): deliberately weak atypicality / outlier detectors used as a calibration floor, not biomarker candidates – frozen MCD Mahalanobis (
fit_compositional_mahalanobis), conformal anomaly p-value (fit_conformal_anomaly), log-ratio isolation forest (fit_isolation_forest_logratio), ECOD/COPOD global tail outlier (ecod_copod, via PyOD), and a forced n=1 entropic-kernel single-sample Sinkhorn control (sinkhorn_single).Methods using a Python backend (torch, kymatio, torchvision, PyOD, TabPFN, TabICL, TabDPT, via
reticulate) train at fit time and, where applicable, export frozen weights so the deployment-time score runs in base R; their optional backends are not declared as hard dependencies. The bank can be audited against exported package functions withsinglesample_assert_method_bank_exports().Vectorized the
ws_balance_ilr()matrix/data.frame path for deployment throughput (a large speed-up on realistic panels) while preserving byte-identical results versus the prior per-row path on realistic inputs. This incidentally fixes data.frame recursion and single-column matrix name-dropping. The pre-existingTOP_K_BY_ABUNDANCEp <= kempty-tail quirk is intentionally preserved for frozen within-sample result identity and is flagged for a future separate fix because changing it alters scores.
Maintenance
- Corrected the compositional Mahalanobis scorer to use full-rank coordinates rather than a singular full-composition covariance representation.
- Preserved exact row-wise TabICL scoring for large feature panels and ensured TabDPT receives writable, owned NumPy arrays from R inputs.
- Prevented pair-ratio logistic fits from using a truncated regularization path when selecting the frozen deployment model.
- Added a project
renv.lockand activation bootstrap for reproducible package development and checks. - Renamed the single-sample-deployable method-bank machinery from the internal codename
paper3_*/R/paper3-*.Rto the descriptivesinglesample_*/R/singlesample-*.R(e.g.singlesample_method_roster(),singlesample_score_call(),singlesample_assert_row_equivariant();inst/extdata/singlesample_method_manifest.csv). The formerpaper3_*exported names are retained as thin, exported back-compatibility aliases, so existing code keeps working; prefer thesinglesample_*names.
OmicSelector 2.5.0 (2026-05-29)
- Aligned promoted Paper 3 matched-null nested-CV scoring with the CLOSED A2 F4 repair: the CV p-value now requires both per-fold null validity (
fold_fallback_frac < 0.5) and at leastK/2complete null draws across null-valid folds. Degenerate matched-null cells now fail closed witheligible = FALSEandp_emp_cv = NA_real_. - Added
singlesample_paired_auc_diff_se()andsinglesample_technology_lift_delong()for empirical paired DeLong AUC-lift standard errors, matching the manuscript’s F6 mean-of-folds estimand and technology-transfer orientation. - Package-ized the promoted Paper 3 runner utilities: hardcoded manuscript-workspace input/output paths were replaced with caller-supplied input paths, package
extdatalookup where available, andtempdir()output defaults. - Verified the F5 transfer-LOPBO and F3 brms-retirement fixes are manuscript-driver concerns with no clean package counterpart in the exported Paper 3 scorer primitives; no brms/Stan alternative-inference branch is present in the package.
OmicSelector 2.4.0 (2026-05-07)
Round 5 additions (2026-05-22):
- Promoted the remaining OmicSelector Paper 3 method-family scorer implementations from the manuscript analysis workspace into the package: provenance-aware, kit-aware, anchor/reference, technology-aware, biofluid-aware, learned kit-aware, Group-DRO, and Sinkhorn-OT scorers.
- Added
singlesample_method_bank()andsinglesample_assert_method_bank_exports()so the manuscript method bank can be audited directly against exported package functions. - Added
singlesample_make_loco_splits()andsinglesample_make_locto_splits()for same-provenance-block-excluding leave-one-cohort-out and leave-one-cancer-type-out validation protocols. - Added focused unit tests for the promoted method families and shipped the optional Sinkhorn Python helper under
inst/python/.
Round 4 additions (2026-05-08):
- Added MIMAT ↔︎ hsa-miR namespace lookup table (miRBase 22.1; 2,656 human mature miRNA entries) and
resolve_mimat_to_hsa()/resolve_hsa_to_mimat()helpers (mimat_hsa_lookup_v22_1.tsvshipped underinst/extdata/). Matching is case-insensitive; canonical-case output (MIMAT uppercase, hsa-miR lowercase).
Round 3 additions (2026-05-07) — manuscript-alignment patches (Paper 3 audit patches 1 through 9; orchestrator patch 10 deferred):
- Added qPCR non-detect handling in
R/singlesample-nondetects.R:qpcr_nondetect_impute()(Bayesian hierarchical imputation via thenondetectsBioconductor package, with fall-through to LOD whennondetects,HTqPCR, orBiobaseis unavailable) andqpcr_nondetect_lod_fallback()(limit-of-detection fallback at Ct = 40). Mirrors manuscript Methods §“Non-detect handling for quantitative PCR data”. Addednondetects,HTqPCR, andBiobasetoSuggests:. - Added
hemolysis_index_blondal()inR/singlesample-hemolysis.R: Blondal-style log(miR-451a) − log(miR-23a-3p) helper accepting both canonical mature miRNA names and MIMAT accessions. Closes the manuscript-claimed Blondal-canonical hemolysis index gap; pair withfit_hemolysis_rr()/apply_hemolysis_rr()for the manuscript-specified Module B nuisance correction. - Added
os_provenance_preflight()inR/singlesample-provenance-preflight.R: specimen-overlap pre-flight gate that reads a TSV manifest and returns one ofNO_OVERLAP,KNOWN_OVERLAP, orUNKNOWN_ACCESSION. Ships a curated default manifest atinst/extdata/provenance_manifest.tsvcovering the Toray-3D cluster, Toray-V20 cluster, COSMOS-LDCT pair, VUMC-PDAC NanoString pair, and the audited-independent accessions used by the manuscript. - Added
singlesample_matched_null_benchmark_cv()inR/singlesample-matched-null.R: the 5-fold nested-CV matched-null benchmark (panel selection by univariate AUC on the training fold; matched-null strata computed on the training fold; held-out test fold scored). Supports grouped folds viagroup_id, deterministic per-draw seeding via thev0.6_per_draw_seed_schedule_independentRNG protocol, and the three-tier matched-null fallback. This is the engine that produced the manuscript’s per-cell numbers; promoting it fromOmicSelector_paper/code/methods/matched_null_benchmark.Rmakes the headline tables and figures reproducible from the package alone. - Extended
singlesample_bh_fdr_correct_blocked(): now reports BOTH the conservative reference (q_block_BH,p_block; S/c against chi-square(2k)) and the textbook Brown 1975 / Kost-McDermott 2002 reference (q_block_BH_textbook,p_block_textbook; S/c against chi-square(2k/c)). Added arhoargument (default 0.25) so the manuscript-required sensitivity analysis at rho ∈ {0.10, 0.50, 1.00} can be reproduced from the package. Backwards-compatible: existing call signatures continue to work and therhodefault reproduces the previous numerical behaviour exactly. New columns are added, not replaced. - Added
auc_ci_methodargument to bothsinglesample_matched_null_benchmark()andsinglesample_matched_null_benchmark_cv():"hanley_mcneil"(default; closed-form Hanley-McNeil 1982 SE),"delong"(viapROC::ci.auc(method = "delong"); pooled fold-level scores in the CV variant), or"none". Returnsauc_obs_ci_lo/auc_obs_ci_hialongsideauc_obs/auc_obs_cv. Closes the v5 per-cell-AUC-CI gap flagged in the manuscript Discussion. - Exported
singlesample_hanley_mcneil_auc_ci()as the user-facing Hanley-McNeil 1982 AUC confidence-interval helper used internally by the matched-null benchmark functions. - Added
min_balance_coverageargument tows_balance_ilr()(default 0.8, per manuscript Methods §“Within-sample compositional methods”). When the input panel computes fewer than 80% of the eight balances, the returned vector / matrix is filled with NA and carriesattr(., "coverage_failed") <- TRUEandattr(., "coverage")to let the caller distinguish coverage failure from a real all-NA cell. Behaviour change: previously the function silently returned a partially-NA vector. Existing callers that need the old behaviour can passmin_balance_coverage = 0. - Documented the
ws_alr_pivot()fail-closed default in roxygen@details. Default remainsallow_global_fallback = FALSE; the manuscript pipeline opts in viaallow_global_fallback = TRUEwith per-cell logging. No code change beyond the docstring. - Bumped DESCRIPTION version from 2.3.0.9000 to 2.4.0.
- Release-check notes:
R CMD check --as-cranmay report CRAN incoming NOTEs for a new submission, tarball size, and optionalcatboost/selbalbackends that are not in the mainstream CRAN/Bioconductor repositories. These are optional backend/release-distribution notes, not package-code warnings. - Added unit tests for every new entry point:
tests/testthat/test-singlesample-nondetects.R,test-singlesample-provenance-preflight.R,test-singlesample-hemolysis.R(Blondal index block),test-singlesample-matched-null.R(rho / textbook / per-cell AUC CI / nested-CV blocks), andtest-singlesample-within-sample.R(ILR coverage block).
Patch 10 (end-to-end pipeline orchestrator wrapping OmicSelector_paper/code/run_singlesample_pipeline.R as omicselector_singlesample_run()) is deferred to a follow-up release; it is the only manuscript-alignment gap that remains after this round.
OmicSelector 2.3.0.9000 (2026-05-04 / 2026-05-05, in development; v2.4.0 release accompanies Paper 3 publishable manuscript)
Round 2 additions (2026-05-05):
- Added Paper 3 miRNA name resolver in
R/singlesample-mirna-name-resolver.R:mirna_alias_table()(88 curated miRNAs from miRBase v22.1 covering the within-sample sequential-binary-partition dictionary, the additive log-ratio pivot pool, the haemolysis markers, and Mitchell 2008 / miRBiT / Toray-FirePlex frequent targets),resolve_mirna_aliases(), andapply_mirna_aliases(). Unblocks within-sample isometric-log-ratio scoring on platforms that deposit MIMAT or platform-specific probe IDs (Toray 3D-Gene, Affymetrix miRNA-3_0/-4_0, Agilent miRNA arrays) by resolving feature namespaces back to canonical mature-miRNA names before the biology-keyed partition is applied. - Added Paper 3 matched-null benchmark in
R/singlesample-matched-null.R:singlesample_matched_null_benchmark()(the joint detection-rate × abundance stratified matched-null benchmark; coexists with the simpleros_panel_null_benchmark()stub inR/panel-gates.R),singlesample_bh_fdr_correct_matched_null(),singlesample_holm_correct_familywise(),singlesample_bh_fdr_correct_blocked(). - Added Paper 3 preprocessing in
R/singlesample-preprocessing.R:preprocess_inverse_log()(inverse-log preprocessing for pre-log-transformed microarray deposits). - Added Paper 3 batch correction in
R/singlesample-batch-correction.R:fit_frozen_ruv()/apply_frozen_ruv()(frozen RUV factor estimator),fit_robust_pca_residual()/apply_robust_pca_residual(). - Added Paper 3 robust-regression haemolysis correction in
R/singlesample-hemolysis.R:fit_hemolysis_rr()/apply_hemolysis_rr()(per-feature M-estimator regression of expression on haemolysis index; coexists with the existingfit_hemolysis_prefilter()marker-ratio gating method inR/hemolysis-correction.R). - Added Paper 3 outlier detection in
R/singlesample-outlier-detection.R:fit_compositional_mahalanobis()/apply_compositional_mahalanobis()(minimum-covariance-determinant Mahalanobis distance on log-ratio coordinates),fit_conformal_anomaly()/os_conformal_anomaly()(conformal anomaly p-value with held-out calibration partition),fit_isolation_forest_logratio()/apply_isolation_forest_logratio()(pure-R isolation forest on rCLR inputs). - Added Paper 3 additional within-sample methods in
R/singlesample-additional-within-sample.R:fit_logistic_normal_eb()/apply_logistic_normal_eb()(frozen-reference Empirical-Bayes denoiser),fit_frozen_quantile()/apply_frozen_quantile()(monotone quantile calibrator for cross-platform mapping). - Added 6 new test files in
tests/testthat/covering 44 test_that blocks for the round-2 methods (1 skip onfit_compositional_mahalanobisheadline test whenrobustbasenot installed, handled byskip_if_not_installed). All other tests pass.
Round 1 additions (2026-05-04):
- Added Paper 3 within-sample compositional methods (Module A, P1) in
R/singlesample-within-sample.R:ws_rclr_trimmed()(robust trimmed CLR with hemolysis-marker exclusion),ws_balance_ilr()(orthonormal ILR balances on a frozen sequential binary partition encoding circulating miRNA biology),ws_alr_pivot()(additive log-ratio with a frozen 6-miRNA pivot pool, fail-closed on missing pivots),ws_mad_logratio()(median-centred log-ratio with optional MAD scaling), andws_dominance_score()/fit_dominance_threshold()/ws_dominance_flag()(panel-internal QC dominance score for pre-analytical-failure detection). Helpersws_default_sbp()andws_default_pivot_pool()return the curated v1 SBP tree and v1 pivot pool used by the balance and ALR methods respectively. - All five methods are single-sample and reference-cohort-free: each sample is normalised, scored, or projected using only its own panel values, with no requirement for an external training cohort to exist at deployment time. This is the property that makes the methods suitable for clinical translation of circulating-miRNA biomarkers (Paper 3 framing: per-sample denoising for batch-effect-free diagnostic tests).
- Added synthetic-data unit tests in
tests/testthat/test-singlesample-within-sample.R. - Pending for v2.4.0 release with Paper 3 v0.4 publishable manuscript: matched-null benchmark (
os_panel_null_benchmark()extension), block-aware Benjamini-Hochberg with provenance blocks, MIMAT ↔︎ miR-name resolver for Toray and other MIMAT-keyed deposits, hemolysis-injection benchmark, frozen-RUV factor estimator, conformal anomaly p-value with Mondrian group-conditional coverage, outcome-dictionary tooling, and per-cohort missingness audit. Module E (TabPFN, biolord, GroupDRO, horseshoe) remains scaffolded only.
OmicSelector 2.3.0
- Added bias-audit module (6 exported functions) for cohort-provenance and method-ceiling diagnostics.
- Added grouped resampling helpers, provenance-floor diagnostics, identifiability gates, matched random-panel null benchmarks, operating-point summaries, and hemolysis-aware panel robustness utilities for public-omics biomarker-panel validation.
- Cleaned package release metadata and public documentation for the 2.3.0 source release.
OmicSelector 2.2.0
- Added within-sample biomarker panel methods: CLR transforms, CLR + MLP training and prediction, pairwise log-ratio CNN multi-seed reproducibility, and a CoDaCoRe interface with deterministic fallback.
- Registered new
mlr3learners on package load:classif.ratio_cnn,classif.clr_mlp, andclassif.codacore. - Added
ws_perturbation_benchmark()for baseline, shift, scale, and combined perturbation benchmarking with per-condition AUC summaries. - Expanded test coverage for image-encoding identities, additive-shift invariance, CLR invariance, and learner smoke tests.
- Added CoDA-aware feature selection methods:
codaFS_plr_variance(),codaFS_selbal_wrapper(),codaFS_codacore_wrapper(),codaFS_logcontrast_lasso(), andcodaFS_stability_logratio(). - Registered the new CoDA selectors as
mlr3filtersfilters and wired them intoOmicPipelineunder the filter idscoda_plr_variance,coda_selbal,coda_codacore,coda_logcontrast_lasso, andcoda_stability_logratio. - Added unit tests covering additive-shift invariance, zero-sum log-contrast projection, synthetic discriminative log-ratio recovery, and smoke-scale execution at 14, 100, and 500 features.