Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

RobustCov

RobustCov — robust multivariate geometry

PyPI Python Docs CI Wheels License

Robust covariance, anomaly scoring, PCA, and monitoring for difficult multivariate data.

robustcov is a Python/C++ library for robust multivariate geometry. It estimates covariance, scatter, precision, principal subspaces, and related latent structure when empirical covariance is unreliable because the data are contaminated, heavy-tailed, high-dimensional, incomplete, structured, or shifting.

Use it to:

  • fit robust covariance or scatter and compute Mahalanobis anomaly scores;
  • convert held-out anomaly or monitoring scores into conformal p-values and calibrated alert labels;
  • perform robust PCA, low-rank-plus-sparse decomposition, reconstruction diagnostics, and subspace monitoring;
  • build robust whitening transforms, kernels, and metrics for learned features or embeddings;
  • handle bad cells, missing values, matrix-valued observations, and multilinear low-rank structure;
  • estimate sparse precision graphs or recover robust independent sources and latent factors.

The package provides numerical estimators and diagnostics with sklearn-style fit APIs. It does not train neural networks or replace a production monitoring platform.

Status: alpha / experimental. Core estimator interfaces are intended to remain recognizable, but some APIs may change before 1.0.

Start from your problem

Your data or goal Start with
A minority of complete rows are outliers and n is comfortably larger than p FastMCD, DetS, or DetMM
Broad heavy tails or an ill-conditioned/high-dimensional covariance RegularizedCauchy, StudentTScatter, RegularizedTyler, or MRCD
Isolated bad cells or missing entries CellMCD, CellRCov, CellPCA, or SparseCellPCA
A matrix is low rank plus sparse, arbitrarily large cell corruption PrincipalComponentPursuit (PCP)
Matrix-valued or multilinear observations MMCD or RobustMultilinearPCA
Robust dimensionality reduction or a fixed-reference subspace monitor RobustPCA, DistributionallyRobustPCA, SubspaceStability, or RobustSubspaceMonitor
Follow a slowly changing subspace in a stream Experimental OnlineRobustSubspaceTracker
Turn a held-out anomaly or monitoring score into a finite-sample alert ConformalAlertCalibrator
Sparse conditional-dependence structure RobustGraphicalLasso or SGLASSO
Learned features, embeddings, whitening, or robust kernels FeatureGeometry
Independent or temporally correlated latent sources TwoScatterICA, RobustSOBI, or RobustFactorModel

See the documentation for the task-oriented workflow map, estimator selection guide, examples, benchmarks, and API reference.

Method families

  • Covariance and scatter: FastMCD, DetS, DetMM, MRCD, KMRCD, regularized Cauchy, Student-t, and Tyler estimators.
  • Cellwise and structured data: CellMCD, CellRCov, MMCD, RobustMultilinearPCA, CellPCA, and SparseCellPCA.
  • Matrix decomposition, PCA, and monitoring: PrincipalComponentPursuit, RobustPCA, DensityPowerRobustPCA, experimental DistributionallyRobustPCA, SubspaceStability, RobustSubspaceMonitor, experimental OnlineRobustSubspaceTracker, and ConformalAlertCalibrator.
  • Sparse precision: RobustGraphicalLasso and SGLASSO.
  • Latent structure: TwoScatterICA, SOBI, RobustSOBI, and RobustFactorModel.
  • Reusable geometry: robust distances, anomaly diagnostics, whitening, FeatureGeometry, full-matrix kernels, SPD utilities, and optional OpenMP acceleration.

Installation

From PyPI after a release is published:

python -m pip install -U pip
python -m pip install robustcov

Supported release wheels are built for CPython 3.12, 3.13, and 3.14 on Ubuntu, Windows, and macOS by GitHub Actions. The package uses a C++/pybind11 backend built with scikit-build-core.

Dependency lower bounds are selected per Python version so Python 3.12 users are not forced onto the versions needed only for Python 3.14. The exact oldest tested sets are recorded in requirements/minimum.txt and exercised by CI.

Plotting is optional and is not installed with the numerical core:

python -m pip install "robustcov[plot]"

The package can be imported without the compiled extension. NumPy-backed estimators continue to work, while native-only estimators such as FastMCD and TylerShape raise an actionable error when fitted. Check the active installation with robustcov.native_available(). A native-free development wheel can be built explicitly with:

python -m build --wheel -Ccmake.define.ROBUSTCOV_BUILD_NATIVE=OFF

Inside a conda environment, install the PyPI wheels with pip:

conda create -n robustcov python=3.12 pip
conda activate robustcov
python -m pip install robustcov

For local development:

git clone https://github.com/smiryusupov/robustcov.git
cd robustcov

python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

python -m pip install -U pip
python -m pip install -e ".[dev,docs,examples]"
python -m compileall -q robustcov tests examples benchmarks docs
python -m pytest -q

Quickstart

import numpy as np
import robustcov as rc

rng = np.random.default_rng(0)

# Heavy-tailed data with injected outliers
X = rng.standard_t(df=3, size=(400, 5))
X[:30] += 8.0

est = rc.FastMCD(quality="balanced", random_state=42).fit(X)

print(est.location_)
print(est.covariance_)
print(est.radial_kurtosis_)

det = rc.RobustOutlierDetector(
    estimator=rc.FastMCD(quality="balanced", random_state=42),
    contamination=0.075,
).fit(X)
print(det.labels_)

Calibrate a separate held-out set of anomaly scores instead of choosing an operational alert threshold heuristically:

calibrator = rc.ConformalAlertCalibrator(alpha=0.05).fit(
    -det.score_samples(X_calibration)
)
p_values = calibrator.p_values(-det.score_samples(X_new))
alerts = calibrator.predict_alerts(-det.score_samples(X_new))

The usual finite-sample marginal interpretation requires exchangeability between the held-out calibration scores and future inlier scores.

For a normal subspace that is expected to evolve gradually, use the experimental online tracker rather than silently updating a frozen monitor:

tracker = rc.OnlineRobustSubspaceTracker(
    n_components=3,
    update_interval=64,
    buffer_size=256,
    adaptation_rate=0.5,
).fit(X_initial)

update = tracker.update(X_next_batch)
print(update.n_accepted, update.n_rejected, update.change_detected)

The tracker is a RobustCov composition inspired by robust subspace-tracking research; it is not an implementation of NORST and does not inherit NORST's theoretical guarantees.

For deterministic smooth high-breakdown scatter and an efficiency refinement:

dets = rc.DetS(breakdown=0.50).fit(X)
detmm = rc.DetMM(breakdown=0.50, efficiency=0.95).fit(X)

print(dets.weights_)
print(detmm.covariance_)

These estimators require the central half-sample to be nonsingular. Use MRCD when p is too large for that condition.

For small-sample or high-dimensional heavy-tailed data:

est = rc.RegularizedCauchy(alpha=0.10).fit(X)
print(est.covariance_)

student = rc.StudentTScatter(df=3, alpha=0.05).fit(X)
print(student.radial_kurtosis_)

For high-dimensional data with a minority of contaminated rows:

mrcd = rc.MRCD(
    contamination=0.20,
    max_condition_number=50,
    random_state=0,
).fit(X)

print(mrcd.regularization_)
print(mrcd.standardized_condition_number_)
print(mrcd.support_)

For non-elliptical inlier structure, fit MRCD in a kernel feature space:

kmrcd = rc.KMRCD(
    kernel="rbf",
    gamma="median",
    contamination=0.15,
    random_state=0,
).fit(X)

print(kmrcd.support_)
print(kmrcd.distances_)

The RBF bandwidth strongly affects the geometry. The median heuristic is a useful starting point, not an automatic guarantee of good separation.

For matrix-valued observations such as sensor-by-time windows:

mmcd = rc.MMCD(
    contamination=0.20,
    random_state=0,
).fit(X_matrices)

print(mmcd.row_covariance_)
print(mmcd.column_covariance_)
print(mmcd.mahalanobis(X_matrices))

For tables with isolated bad cells and missing entries:

cellmcd = rc.CellMCD(alpha=0.75, quantile=0.99).fit(X)

print(cellmcd.cell_outlier_mask_)
X_corrected = cellmcd.corrected_data_

For high-dimensional tables with bad cells, abnormal rows, and missing entries:

cellrcov = rc.CellRCov(
    n_components=4,
    residual_shrinkage="auto",
).fit(X)

print(cellrcov.covariance_)
print(cellrcov.residual_shrinkage_)
print(cellrcov.cell_outlier_mask_)

For sparse interpretable loadings under the same contamination model:

sparse_pca = rc.SparseCellPCA(
    n_components=3,
    alpha=0.05,
    sparsity_threshold=0.01,
).fit(X)

print(sparse_pca.n_nonzero_loadings_)
print(sparse_pca.loading_support_)

For a sparse conditional-dependence graph:

graph = rc.RobustGraphicalLasso(
    alpha="ebic",
    scatter_estimator=rc.CellMCD(
        alpha=0.75,
        min_samples_per_feature=None,
    ),
).fit(X)

print(graph.partial_correlation_)
print(graph.edge_list(feature_names))

For a sparse graph when radial magnitudes are extremely heavy-tailed:

shape_graph = rc.SGLASSO(
    alpha=0.12,
).fit(X)

print(shape_graph.partial_correlation_)
print(shape_graph.edge_list(feature_names))

SGLASSO estimates a shape precision matrix up to a common scale. It is not cellwise robust; use a CellMCD-based RobustGraphicalLasso when individual coordinates are corrupted.

For dimensionality reduction under cellwise and rowwise contamination:

cellpca = rc.CellPCA(n_components=3).fit(X)

Z = cellpca.transform(X)
print(cellpca.cell_outlier_mask_)
print(cellpca.case_outlier_mask_)
X_corrected = cellpca.corrected_data_

For automatic exploratory selection:

auto = rc.AutoRobustScatter(selection="diagnostic").fit(X)

print(auto.best_estimator_name_)
print(auto.summary())

Low-rank plus sparse decomposition

PrincipalComponentPursuit implements the canonical convex program often called robust PCA in the matrix-decomposition literature. It separates one observed matrix into a low-rank signal and sparse, arbitrarily large cell corruption:

pcp = rc.PrincipalComponentPursuit(tol=1e-7).fit(X)

low_rank = pcp.low_rank_
sparse_corruption = pcp.sparse_
flagged_cells = pcp.sparse_support_
print(pcp.decomposition_summary())

Use it when the scientific model is X = low_rank + sparse. It is not a covariance estimator, does not handle missing values or dense noise, and does not replace RobustPCA for heavy tails or rowwise outliers.

Robust PCA

RobustPCA computes principal components from any compatible robust scatter estimator. The interface follows ordinary PCA, with additional distances for diagnosing unusual observations.

pca = rc.RobustPCA(
    n_components=0.95,
    estimator=rc.RegularizedCauchy(alpha=0.10),
).fit(X)

Z = pca.transform(X)
score_distance = pca.score_distances(X)
orthogonal_distance = pca.orthogonal_distances(X)

rc.plot_robust_pca_outlier_map(
    pca,
    output_path="robust_pca_outlier_map.png",
    show=False,
)

Score distance measures how far a row lies along the retained components. Orthogonal distance measures the part that those components cannot reconstruct. This implementation uses an eigendecomposition of a robust scatter matrix; it is not the low-rank-plus-sparse method with the same common name.

For a direct low-rank fit with density-power residual weighting:

dpd_pca = rc.DensityPowerRobustPCA(
    n_components=5,
    alpha=0.30,
).fit(X)

Z_dpd = dpd_pca.transform(X)
cell_weights = dpd_pca.cell_weights(X)

This estimator requires a fixed component count and complete finite input.

Bootstrap the fitted loadings and retained subspace with:

stability = rc.SubspaceStability(
    pca=pca,
    n_resamples=200,
    resampling="stationary",
    block_length=20,
    random_state=0,
).fit(X)

print(stability.loading_interval_)
print(stability.max_principal_angle_degrees_)

Use resampling="iid" for independent rows, a block or stationary bootstrap for ordered weakly dependent observations, and resampling="cluster" for repeated measurements grouped by subject, site, or account.

Experimental adversarial covariance filtering

For an approximately Gaussian reference with a known upper bound on arbitrarily replaced rows, robustcov.experimental provides a practical spectral-filtering composite:

from robustcov.experimental import SpectralFilteringCovariance

filtered = SpectralFilteringCovariance(
    contamination=0.10,
    random_state=0,
).fit(X)

print(filtered.n_removed_)
print(filtered.covariance_)

The estimator filters dominant directions in lifted quadratic features and exposes its support and iteration diagnostics. It is inspired by algorithmic robust-statistics filtering, but it is not the optimal Gaussian algorithm from the cited papers and carries no corresponding finite-sample guarantee. Use the Tyler/Student-t/Cauchy family instead for clean heavy-tailed data, and CellMCD or CellRCov for cellwise corruption. See docs/adversarial_covariance_filtering.rst.

Experimental distributionally robust PCA

DistributionallyRobustPCA is available only from robustcov.experimental. It evaluates a weighted-Wasserstein worst-case reconstruction risk over a deterministic adaptive candidate path. Identity transport geometry is retained as a required ordinary-PCA control; anisotropic geometry is what expresses the assumed train-to-deployment shift.

from robustcov.experimental import DistributionallyRobustPCA

dro_pca = DistributionallyRobustPCA(
    n_components=2,
    radius=2.5,
    transport_geometry="residual",
    formulation="exact",
).fit(X_train)

print(dro_pca.exact_worst_case_risk_)
print(dro_pca.selected_gamma_)

The current exact formulation ranks a finite deterministic path using the exact scalar-dual ambiguity-set risk; it does not claim a global solution of the non-convex Grassmann problem. See docs/distributionally_robust_pca.rst and the held-out shift benchmark before using it in scientific comparisons.

Rolling subspace monitoring

RobustSubspaceMonitor compares incoming batches with a fixed reference fit. A separate robust model is fitted to the current rolling window, allowing the monitor to distinguish movement of the center from changes in scale, covariance shape, or principal directions.

monitor = rc.RobustSubspaceMonitor(
    n_components=0.95,
    estimator=rc.RegularizedCauchy(alpha=0.10),
    window_size=256,
    threshold_scale=1.2,
    alarm_patience=2,
).fit(X_reference)

result = monitor.update(X_batch)
if result.ready:
    print(result.summary())
    print(result.exceeded)

New rows are scored against the reference before the rolling model is updated. A persistent production problem therefore cannot redefine the baseline before it is detected.

Main estimators

Estimator Best use case Notes
FastMCD Separable contamination, n >> p Fast robust covariance and support diagnostics
DetS Rowwise contamination with smooth high-breakdown weighting Deterministic Tukey-bisquare S-estimator; requires ceil(n/2) > p
DetMM The same regime when higher Gaussian efficiency is desired DetS start with fixed robust scale and a less aggressive MM refinement
MRCD Rowwise contamination with p close to or greater than n Regularized high-breakdown subset covariance with automatic condition control
KMRCD Non-elliptical inlier structure or implicit kernel data MRCD subset search in a positive-semidefinite kernel feature space
MMCD Matrix-valued observations with contaminated rows/samples Robust mean matrix and Kronecker row/column covariance factors
RobustMultilinearPCA Matrix-valued low-rank data with bad cells, abnormal samples, and missing entries Robust Tucker-2 fit with cellwise and casewise redescending weights
CellMCD Tables with isolated corrupted or missing cells and n > p Observed-likelihood covariance fit with cell-level flags and conditional predictions
CellRCov High-dimensional tables with bad cells, abnormal rows, and missing entries Robust low-rank covariance plus a diagonally regularized residual covariance
CellPCA Low-rank tables with cell errors, abnormal rows, and missing entries Cellwise and casewise redescending weights in a weighted low-rank fit
SparseCellPCA Interpretable low-rank tables with the same contamination model CellPCA weights plus exact-zero elastic-net loading updates
RegularizedCauchy Very heavy tails, small samples, p close to n Strong radial downweighting plus shrinkage
StudentTScatter Diffuse heavy tails Smooth heavy-tail scatter estimator
RegularizedTyler Heavy-tailed shape estimation Scale-free shape unless scale correction is requested
AutoRobustScatter Exploratory estimator selection Diagnostic or stability-based selector
ClusterRobustOutlierDetector Multimodal data Cluster-then-local-robust-scatter diagnostic
PrincipalComponentPursuit One matrix is low rank plus sparse gross cell corruption Nuclear-norm plus entrywise-L1 convex decomposition solved by inexact ALM
RobustPCA Robust dimensionality reduction and subspace diagnostics Eigendecomposition of a robust location and scatter estimate
DensityPowerRobustPCA Direct robust low-rank fitting with cell residual weights Gaussian density-power-divergence alternating regressions
experimental DistributionallyRobustPCA Principal subspaces under stated train-to-target distribution shift Exact weighted-Wasserstein risk over a deterministic adaptive candidate path

KLRegularizedTyler and WieselTyler are currently documented as aliases/prototype variants around the regularized Tyler implementation. HellingerRegularizedTyler is experimental.

For a scenario-specific decision table, capability limits, and cross-method results, see docs/method_comparison.rst. The comparison separates covariance, PCA, matrix-valued, and sparse-graph tasks rather than declaring one global winner.

Robust kernels for GP and kernel methods

A robust scatter estimate can be used as a fixed full-matrix input metric for kernel methods. robustcov supplies the metric and kernel adapters; model fitting remains in scikit-learn, GPyTorch, or another downstream library.

import robustcov as rc

metric = rc.RobustInputMetric(
    estimator=rc.RegularizedCauchy(alpha=0.05, scale_correction="radial_median"),
).fit(X_train)

K = rc.robust_rbf_kernel(
    X_train,
    precision=metric.precision_,
    center=metric.location_,
    length_scale=1.0,
)

For scikit-learn's GaussianProcessRegressor, use the optional adapter:

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import ConstantKernel, WhiteKernel
from robustcov.sklearn_kernels import RobustMahalanobisRBF

kernel = (
    ConstantKernel(1.0)
    * RobustMahalanobisRBF(precision=metric.precision_, center=metric.location_)
    + WhiteKernel(1e-2)
)

gp = GaussianProcessRegressor(kernel=kernel).fit(X_train, y_train)

For GPyTorch, robustcov.gpytorch_kernels.RobustMahalanobisRBFKernel and RobustMahalanobisMaternKernel provide frozen robust metric kernels that can be wrapped by gpytorch.kernels.ScaleKernel.

Visual diagnostics

est = rc.FastMCD(quality="balanced", random_state=0).fit(X)

rc.plot_robust_distance_profile(
    est,
    output_path="distance_profile.png",
    show=False,
)

rc.plot_mahalanobis_qq(
    est,
    output_path="qq.png",
    show=False,
)

rc.plot_covariance_heatmap(
    est.covariance_,
    title="FastMCD covariance",
    output_path="covariance.png",
    show=False,
)

Diagnostic reports summarize robust-distance behavior:

report = rc.diagnostic_report(est)
print(report.summary())

Reports include radial kurtosis, detected fraction, condition number, support fraction, QQ tail deviation, and heuristic recommendations.

Multimodal data

A single global robust covariance model can fail when the data have several legitimate modes. Use cluster-aware diagnostics when modes correspond to meaningful groups, regimes, or segments.

det = rc.ClusterRobustOutlierDetector(
    n_clusters=3,
    contamination=0.05,
    random_state=0,
).fit(X)

scores = det.decision_function(X)
labels = det.predict(X)

rc.plot_cluster_robust_distances(
    det,
    X,
    output_path="cluster_distances.png",
    show=False,
)

This is not a full robust mixture model. It is a practical cluster-then-robust-scatter diagnostic.

OpenMP acceleration

If OpenMP is available at build time, the C++ backend can parallelize distance evaluation, covariance accumulation, Tyler scatter updates, and FastMCD candidate evaluation.

import robustcov as rc

print(rc.native_available())
print(rc.has_openmp())
rc.set_num_threads(4)

est = rc.FastMCD(n_init=500, n_jobs=4, random_state=0).fit(X)

For reproducible scaling benchmarks, avoid BLAS/OpenMP oversubscription:

OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 \
python benchmarks/openmp_scaling.py \
  --n 8000 \
  --p 20 \
  --threads 1 2 4 \
  --csv results/openmp_scaling.csv

Documentation

Build the Sphinx docs locally:

python -m pip install -e ".[docs]"
python -m sphinx -b html docs docs/_build/html

Main documentation entry points:

  • What RobustCov does: package scope, boundaries, and the reusable geometry model
  • Workflows: anomaly scoring, PCA and monitoring, feature geometry, structured data, sparse precision, and latent factors
  • Choose an estimator: recommendations by contamination model and dimensional regime
  • Examples by task and domain: runnable examples with source and generated figures
  • Benchmarks and validation: task-specific comparisons, failure cases, performance, and reviewed C-MAPSS snapshots
  • Methods and API reference: mathematical details, provenance, fitted attributes, and public interfaces

Do not commit docs/_build/; it is generated by Sphinx.

Benchmarks

Run the task-specific cross-method comparison:

OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 OMP_NUM_THREADS=2 \
python benchmarks/compare_methods.py \
  --profile quick \
  --csv results/method_comparison.csv \
  --rst results/method_comparison.rst

The script compares methods only where their fitted quantities and ground-truth metrics are compatible. It now covers scatter, kernel outlier detection, robust PCA, matrix/tensor methods, sparse precision, ICA, SOBI, and robust factor models. Use --profile full --families scatter --repeats 3 (and repeat for the other families) for slower, more stable local timing runs.

Run the focused latent-structure benchmark and generate its plots:

OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 OMP_NUM_THREADS=2 \
python benchmarks/latent_structure_benchmarks.py \
  --profile quick \
  --families ica sobi pca factor \
  --csv results/latent_structure.csv \
  --plot-dir results/latent_structure_plots

Audit benchmark ownership across the public estimator surface:

python benchmarks/benchmark_inventory.py --strict

Generate the older benchmark report:

OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 \
python benchmarks/make_report.py --outdir results/report

This writes CSV files, plots, a Markdown report, and a standalone HTML report:

results/report/benchmark_report.html
results/report/benchmark_report.md
results/report/*.csv
results/report/*.png
results/report/latent_structure/*.png

The benchmark pages report both successful and weak cases. Covariance-based methods are most appropriate when anomalies or changes are expressed through location, scale, correlation, or a low-dimensional subspace.

Examples

The example gallery is grouped by method family. List the available groups:

python examples/run_use_case_gallery.py --list

Run one family:

python examples/run_use_case_gallery.py --group ica
python examples/run_use_case_gallery.py --group pca
python examples/run_use_case_gallery.py --group robust
python examples/run_use_case_gallery.py --group monitoring

The new source-separation and factor-model examples are explicit scripts:

python examples/ica_two_scatter.py
python examples/sobi_source_separation.py
python examples/robust_factor_model.py

Run every registered gallery example with:

python examples/run_use_case_gallery.py --all

Refresh generated gallery assets after editing examples:

python docs/generate_gallery_assets.py
python -m sphinx -b html docs docs/_build/html

External and Kaggle examples

External examples live under examples_external/. Raw datasets are never bundled with the package or committed to the repository. Optional loaders cache explicit downloads under ROBUSTCOV_DATA_DIR, XDG_CACHE_HOME/robustcov, or ~/.cache/robustcov.

List supported cached datasets:

python -m robustcov.datasets list
python -m robustcov.datasets info gas_sensor_drift
python -m robustcov.datasets info cmapss

Run the distribution-shift examples without storing data in the repository:

python examples_external/gas_sensor_drift_dro_pca.py --download
python examples_external/cmapss_dro_pca_monitoring.py --download --subset FD002

Kaggle-style manual example:

python examples_external/kaggle_credit_card_fraud.py \
  --data /path/to/creditcard.csv \
  --outdir results/external/credit_card_fraud

Collect external result summaries:

python examples_external/collect_external_results.py \
  --root results/external \
  --outdir results/external_registry

External result pages should be read as evidence, not as leaderboard claims. Some datasets are strong wins, some are competitive but slower, and some are included mainly to show limitations.

Scope

robustcov currently focuses on a coherent robust multivariate workflow:

  1. covariance, scatter, and sparse precision estimation under rowwise, cellwise, heavy-tailed, and high-dimensional contamination;
  2. robust PCA, low-rank-plus-sparse decomposition, latent-factor methods, and source separation;
  3. anomaly scoring, conformal alert calibration, and fixed or adaptive subspace monitoring; and
  4. reproducible method benchmarks and reviewed external case studies.

The package does not attempt to cover every robust-learning problem. Methods are added when they fit this geometry-and-monitoring workflow and can be supported by clear provenance, tests, diagnostics, and evidence.

Development

python -m pip install -e ".[dev,docs]"
python -m pytest -q
python -m sphinx -b html docs docs/_build/html

Build distribution artifacts:

python -m build
python -m twine check dist/*

Release wheels are built by .github/workflows/wheels.yml using cibuildwheel. A manual workflow dispatch publishes the release candidate to TestPyPI and smoke-tests the installed package outside the checkout. A matching signed v* tag publishes the same checked artifacts to PyPI through a protected Trusted Publisher environment. See RELEASE.md for the full checklist.

Project status

This is a pre-1.0 alpha package. Public APIs may change. The goal of the early releases is to make the estimators, diagnostics, benchmarks, and documentation easy to inspect before stabilizing the interface.

License

Apache-2.0. See LICENSE.

Methods, attribution, and citation

robustcov distinguishes published algorithms, literature-based adaptations, package-specific compositions, and software utilities. Each canonical estimator records its primary references, the package's implementation contribution, and material differences from the cited method.

import robustcov as rc

info = rc.get_method_provenance(rc.RobustSOBI)
print(info.status)
print(info.references)
print(info.robustcov_contribution)

The full registry is documented in docs/methods_and_references.rst. Method pages cite the underlying literature and document implementation-specific behavior, assumptions, and limitations.

When using robustcov, cite both:

  1. the software release using CITATION.cff; and
  2. the primary methodological references for the estimators used.

The machine-readable method bibliography is available in docs/references.bib. A JOSS paper draft is maintained in the paper/ directory.

Contributing

Contributions are welcome. See CONTRIBUTING.md for development setup and checks before opening a pull request. New public estimators must add both benchmark ownership and method-provenance metadata. Release notes are tracked in CHANGELOG.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

robustcov-0.1.0a2.tar.gz (11.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

robustcov-0.1.0a2-cp314-cp314-win_amd64.whl (656.2 kB view details)

Uploaded CPython 3.14Windows x86-64

robustcov-0.1.0a2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (467.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

robustcov-0.1.0a2-cp314-cp314-macosx_11_0_x86_64.whl (335.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

robustcov-0.1.0a2-cp314-cp314-macosx_11_0_arm64.whl (325.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

robustcov-0.1.0a2-cp313-cp313-win_amd64.whl (643.2 kB view details)

Uploaded CPython 3.13Windows x86-64

robustcov-0.1.0a2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (467.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

robustcov-0.1.0a2-cp313-cp313-macosx_11_0_x86_64.whl (335.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

robustcov-0.1.0a2-cp313-cp313-macosx_11_0_arm64.whl (325.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

robustcov-0.1.0a2-cp312-cp312-win_amd64.whl (643.2 kB view details)

Uploaded CPython 3.12Windows x86-64

robustcov-0.1.0a2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (467.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

robustcov-0.1.0a2-cp312-cp312-macosx_11_0_x86_64.whl (335.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

robustcov-0.1.0a2-cp312-cp312-macosx_11_0_arm64.whl (325.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file robustcov-0.1.0a2.tar.gz.

File metadata

  • Download URL: robustcov-0.1.0a2.tar.gz
  • Upload date:
  • Size: 11.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for robustcov-0.1.0a2.tar.gz
Algorithm Hash digest
SHA256 54950ee4847396484e20862a4526ceaabee4b0bddc6ced32a496ddf9f4849a29
MD5 581ff2ee068a367c73faa79f730f6021
BLAKE2b-256 383fae585ae33b3f496e88d4ef24a8e962cd51e25fa29607d3f21b93ff7b9b95

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2.tar.gz:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: robustcov-0.1.0a2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 656.2 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for robustcov-0.1.0a2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 1a9176e00a90c0de9f901e2977a9c1f4ccef1ffffd6a87a5dd9d780daf1594ef
MD5 37fbf60730ea4084f76630bb0868c92c
BLAKE2b-256 81210eae44e4459601f834e8992078a5c0fbaf2eff57925a4da4543500fc6e4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp314-cp314-win_amd64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 46e5a1e05cdc437b332478eed8b70798c7bc46b9f99a231c84b773ca686568cb
MD5 17c232242bac2aa9f31922476cb23adb
BLAKE2b-256 0c8228ea9bfb910e0d0ed12c994ecb7e3c4257d39ebb1046a705ded63b4bf653

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3160d3c5498bd24b5203d95954452697691fb3012f2a3040645f63889cd18ccb
MD5 82573f02185e0ba0f089d5f5d77cac3b
BLAKE2b-256 cc84f5fa333a2edbaecd138b5ba0ddcf4ffaf05e911027b44d31ca5f7bda1c16

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp314-cp314-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 845d77568396829321b033256939c8dbc9063f1342f8176a0410802eb2516b25
MD5 a2e5fe4b360f5ba5afb2c8721dc048e3
BLAKE2b-256 a85c5e80bd89f70262f6a49a95c32c786d60ed097bb28bb26c8551dcc91c6297

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: robustcov-0.1.0a2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 643.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for robustcov-0.1.0a2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ed1baad8201ae00f566569ea41c6b6e293aedbf9b88e774c95b8e561aa26d444
MD5 fb740b36ba4aa80784957de46bb360bf
BLAKE2b-256 c89377d96e98b9534ca4ecafdc32753d644b98d9fb0ad2714f7e74b972ce7ed8

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp313-cp313-win_amd64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f3b4955f9538be6db0fc96912bb4c869ebb311ca9d8917a8e7c8246496b6171a
MD5 bfe6a6cd511d2c486101f0b49d6e769d
BLAKE2b-256 c4e4e1b9cfacbdf4e0b7b15ba335e794f30ef60b915507d9018381ef2e266aed

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 18c5048b69360c3af0faf47b9ad4103e447fea085f8c14711ead5754ef111578
MD5 fae744773495d0a87c330fdb6aed615a
BLAKE2b-256 0c04ffe78ea43b3f40c69ecce377ca332583187e6c416531a2d9a5456b551fde

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp313-cp313-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd920363e9b3979371d651e1889dc61119357f24c37aeba4e48f6d559b65a19e
MD5 8ce1760f478981a2d41058c5ddefefa3
BLAKE2b-256 123b036872ee9f2fa95e59bc10bcccab08b508f104982ca818b4bc6fce60f606

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: robustcov-0.1.0a2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 643.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for robustcov-0.1.0a2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b6316d2dc97b6a7dc6932413bffca61a4a9d18be9cb60aaf6004ba78d9399238
MD5 62ea5e965a7c2885f081278c7a698254
BLAKE2b-256 1a3694e8c0813abb31b85ec30162921d40f7714638d3cd17742cc595983f1730

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0a7d64a61985e545eaa8799b69b75733dd75d46b40d6ac4b94c7d3d054b79083
MD5 b406a676d88022d2c66d5d30e50de524
BLAKE2b-256 2692e571ece8953c29e653e8df7137883fe69e4048b7aa297bdca9ecdd97e382

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3e9574a9cc32765027544a443f00ec9953dbaffc746f4d5be000409079ab90d9
MD5 7eb8db3ce0c3105cd79696ffe6699ff3
BLAKE2b-256 479eae173011410aeedd717535943003746ad94d3a5ce358881a0dcec8e8acc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp312-cp312-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file robustcov-0.1.0a2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for robustcov-0.1.0a2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 160b029cfb951535540c90e7f89b8a3d73a29c79daedf00adbd2b587cdd11066
MD5 cbbda8474529ce13e420891522ada771
BLAKE2b-256 c1c2524d0f1fa2c45402960376fdd9a475e015fd42d63ddb01b436f56653d3d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for robustcov-0.1.0a2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on smiryusupov/robustcov

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.0

13 files

0.1.0

13 files

This release

0.1.0a2 This release

13 files

0.0.2

13 files

0.0.1

13 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page