Skip to contents

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 matched OPENBLAS_CORETYPE (Zen in 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 deployed score_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-stablemate transfer 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_LEVEL in 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); unknown does not count. Explicit required_technologies vectors 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_ANCHORS and INSUFFICIENT_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 hp exposes 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 raise NONFINITE_REQUIRED_VALUE with 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_train to 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 raise INVALID_GROUPS. group_train = NULL retains the existing fitting paths.

  • Correct the roxygen declaration for the mlr3pipelines pipe 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 = FALSE through score_specimen() and singlesample_score_call(). Strict checking reaches k-TSP, pair-ratio, trimmed rCLR and balance ILR. Other routes and custom adapters fail closed with STRICT_UNSUPPORTED. Balance ILR rejects missing frozen balance members in strict mode and reports distinct member counts in its support attribute. 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 = TRUE rejects 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 = TRUE also 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 = FALSE to preserve existing scoring arithmetic and missing-feature policies. Numeric outputs now have a support data-frame attribute with per-score n_available, n_fitted, and full_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 accepts strict = TRUE for complete-support checking. Numeric coercion and subsetting can discard attributes. New rejection codes are INVALID_STRICT, MISSING_REQUIRED_FEATURES, and MISSING_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.R and R/singlesample-sel-stablemate-scorers.R: when active-library lookup fails, try the first login-home library containing an installed package, in order R/omicselector, R/library, then version directories under R/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.md was 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_error and expose code and rows: EMPTY_INPUT, INVALID_INPUT, INVALID_FEATURE_NAMES, ALL_REQUIRED_ABSENT, ALL_NONDETECT, EMPTY_FITTED_SUPPORT, CONSTANT_FITTED_SUPPORT, and NO_USABLE_SUPPORT. Invalid detection masks and thresholds use INVALID_DETECTION_MASK and INVALID_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_PYTHON is unset, package load points reticulate at /usr/bin/python3 and, when that login-home user site already contains torch, sets PYTHONUSERBASE there. 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-stablemate can load an already installed StableMate namespace from a login-home R library. StableMate declares License: None and is not vendored. selbal is GPL-3, is absent from Bioconductor 3.23, and is not vendored. Tier R2 methods remain outside deploy_singlesample().

OmicSelector 2.6.5.9001 (development)

  • Cache each specimen’s detrended MFDFA window variances once per scale in frac-mfdfa and 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 pkgload source 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 gbm node-size boundary; folds that remain mathematically too small at a fraction of one fail explicitly.

  • Correct os_detect_cross_cohort_duplicates() so its documented tolerance and min_features arguments 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 ranktreeEnsemble adapters’ 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 ranktreeEnsemble 0.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 use datrank = FALSE to 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)

OmicSelector 2.6.1 (2026-07-15)

  • Added orient = "fixed" to singlesample_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), and is_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. See vignette("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 in inst/extdata/singlesample_method_manifest.csv and enumerable via singlesample_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 a within (within-cohort) or transfer (cross-cohort generalisation) estimand and a role of baseline, discriminator, or negative control. The bank is grouped into the following families (manifest family codes 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), the selbal balance 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, via rvinecopulib), 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, via kymatio), 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 TabICL tabicl, retrieval-based TabDPT tabdpt), 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 with singlesample_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-existing TOP_K_BY_ABUNDANCE p <= k empty-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.lock and activation bootstrap for reproducible package development and checks.
  • Renamed the single-sample-deployable method-bank machinery from the internal codename paper3_* / R/paper3-*.R to the descriptive singlesample_* / R/singlesample-*.R (e.g. singlesample_method_roster(), singlesample_score_call(), singlesample_assert_row_equivariant(); inst/extdata/singlesample_method_manifest.csv). The former paper3_* exported names are retained as thin, exported back-compatibility aliases, so existing code keeps working; prefer the singlesample_* 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 least K/2 complete null draws across null-valid folds. Degenerate matched-null cells now fail closed with eligible = FALSE and p_emp_cv = NA_real_.
  • Added singlesample_paired_auc_diff_se() and singlesample_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 extdata lookup where available, and tempdir() 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() and singlesample_assert_method_bank_exports() so the manuscript method bank can be audited directly against exported package functions.
  • Added singlesample_make_loco_splits() and singlesample_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.tsv shipped under inst/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 the nondetects Bioconductor package, with fall-through to LOD when nondetects, HTqPCR, or Biobase is unavailable) and qpcr_nondetect_lod_fallback() (limit-of-detection fallback at Ct = 40). Mirrors manuscript Methods §“Non-detect handling for quantitative PCR data”. Added nondetects, HTqPCR, and Biobase to Suggests:.
  • Added hemolysis_index_blondal() in R/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 with fit_hemolysis_rr() / apply_hemolysis_rr() for the manuscript-specified Module B nuisance correction.
  • Added os_provenance_preflight() in R/singlesample-provenance-preflight.R: specimen-overlap pre-flight gate that reads a TSV manifest and returns one of NO_OVERLAP, KNOWN_OVERLAP, or UNKNOWN_ACCESSION. Ships a curated default manifest at inst/extdata/provenance_manifest.tsv covering 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() in R/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 via group_id, deterministic per-draw seeding via the v0.6_per_draw_seed_schedule_independent RNG protocol, and the three-tier matched-null fallback. This is the engine that produced the manuscript’s per-cell numbers; promoting it from OmicSelector_paper/code/methods/matched_null_benchmark.R makes 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 a rho argument (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 the rho default reproduces the previous numerical behaviour exactly. New columns are added, not replaced.
  • Added auc_ci_method argument to both singlesample_matched_null_benchmark() and singlesample_matched_null_benchmark_cv(): "hanley_mcneil" (default; closed-form Hanley-McNeil 1982 SE), "delong" (via pROC::ci.auc(method = "delong"); pooled fold-level scores in the CV variant), or "none". Returns auc_obs_ci_lo / auc_obs_ci_hi alongside auc_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_coverage argument to ws_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 carries attr(., "coverage_failed") <- TRUE and attr(., "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 pass min_balance_coverage = 0.
  • Documented the ws_alr_pivot() fail-closed default in roxygen @details. Default remains allow_global_fallback = FALSE; the manuscript pipeline opts in via allow_global_fallback = TRUE with 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-cran may report CRAN incoming NOTEs for a new submission, tarball size, and optional catboost / selbal backends 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), and test-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):

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), and ws_dominance_score() / fit_dominance_threshold() / ws_dominance_flag() (panel-internal QC dominance score for pre-analytical-failure detection). Helpers ws_default_sbp() and ws_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 mlr3 learners on package load: classif.ratio_cnn, classif.clr_mlp, and classif.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(), and codaFS_stability_logratio().
  • Registered the new CoDA selectors as mlr3filters filters and wired them into OmicPipeline under the filter ids coda_plr_variance, coda_selbal, coda_codacore, coda_logcontrast_lasso, and coda_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.