pystatistics 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pystatistics-2.0.0 → pystatistics-2.0.1}/CHANGELOG.md +38 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/PKG-INFO +26 -1
- {pystatistics-2.0.0 → pystatistics-2.0.1}/README.md +25 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pyproject.toml +1 -1
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/GPU_BACKEND_CONVENTION.md +43 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/__init__.py +1 -1
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/mcar_test.py +13 -1
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_order.py +30 -5
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_gpu.py +29 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.github/workflows/publish.yml +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.github/workflows/trigger-docs-rebuild.yml +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.gitignore +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/CHECKLIST.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/UNRELEASED.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/release.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/CLAUDE.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/LICENSE +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/DESIGN.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/Forge.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/GPU_BACKEND_NOTES.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/Makefile +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/PYSTATSBIO_CONTEXT.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/ROADMAP.md +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/_static/custom.css +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/anova.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/conf.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/core.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/descriptive.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/hypothesis.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/index.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/mixed.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/montecarlo.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/mvnmle.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/regression.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/survival.rst +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_contrasts.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_levene.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_posthoc.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_repeated.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_ss.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/capabilities.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/device.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/batched.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/cholesky.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/determinant.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/qr.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/solve.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/svd.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/convergence.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/precision.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/timing.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/tolerances.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/datasource.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/exceptions.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/protocols.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/result.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/_missing.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/_quantile_types.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_basis.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_fit.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_gam.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_gcv.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_smooth.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/_gpu_family.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/gpu_pirls.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_design_factories.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_p_adjust.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_t_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_var_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_deviance.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_pirls.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_pls.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_random_effects.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_satterthwaite.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_ci.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_influence.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_likelihood.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_solver.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_factor.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_pca.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_rotation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/base.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_utils.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/em.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/datasets.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/patterns.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_likelihood.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_solver.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/py.typed +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_formatting.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_glm.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_linear.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_nb_theta.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/cpu_glm.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/gpu_glm.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/families.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_cox.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_discrete.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_km.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_logrank.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/cpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/solution.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/solvers.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_acf.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_batch.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_factored.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_fit.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_forecast.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_kalman.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_likelihood.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_common.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_decomposition.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_differencing.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_fit.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_forecast.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_models.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_stationarity.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_whittle.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_contrasts.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_design.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_factorial.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_levene.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_oneway.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_posthoc.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_repeated_measures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/benchmark_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_datasource.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_exceptions.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_result.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_cor.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_cov.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_describe.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_missing.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_moments.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_quantile.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_ancova_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_ancova_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_bonferroni_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_eta_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_eta_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_levene_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_levene_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_within_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_within_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_tukey_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_tukey_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_anova_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_glm_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_mixed_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_survival_fixtures.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_onesample_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_paired_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_paired_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_pooled_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_welch_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_welch_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_var_basic_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_var_basic_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_median_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_median_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_variance_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_greater_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_significant_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_ml.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_slope.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/mixed_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/mixed_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_anova_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_descriptive_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_glm_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_mixed_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_survival_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_validation.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_validation.sh +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_single_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_single_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_ties_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_basic_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_basic_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_ties_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_ties_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_peto_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny.csv +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny_meta.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny_r_results.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/validate_against_r.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/gam/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/gam/test_gam.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_chisq_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_design_split.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_fisher_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_ks_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_p_adjust.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_prop_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_t_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_var_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_wilcox_test.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_glmm.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_crossed.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_intercept.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_nested.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_slope.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_pls.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_random_effects.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_satterthwaite.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_batched_solver.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_boot_ci.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_bootstrap.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_influence.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_permutation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multinomial/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multinomial/test_multinom.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multivariate/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multivariate/test_multivariate.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/apple_em_reference.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/apple_reference.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_apple.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_complete.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_summary.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/missvals_em_reference.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/missvals_reference.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/small_test_reference.json +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_em.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_mlest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_no_silent_fallback.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/ordinal/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/ordinal/test_ordinal.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/benchmark.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/benchmark.r +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_fit.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_gamma_nb.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_module_split.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_stress_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/conftest.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_coxph.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_discrete_time.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_gpu.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_kaplan_meier.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_logrank.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_r_validation.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/test_code_quality.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/__init__.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_acf_stationarity.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_arima.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_decomposition.py +0 -0
- {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_ets.py +0 -0
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
- **GPU Backend Convention: codified when NOT to add a GPU backend**
|
|
6
|
+
(`pystatistics/GPU_BACKEND_CONVENTION.md`, new Section 0). Formalises
|
|
7
|
+
the Oprah-test rule: don't give every module a GPU backend — only
|
|
8
|
+
those where the algorithm is actually a good fit for GPU hardware
|
|
9
|
+
(large dense linear algebra, big-N likelihoods, batched independent
|
|
10
|
+
fits). Explicitly calls out the non-targets (many-small-fits,
|
|
11
|
+
sequential algorithms, transfer-bound cheap compute) and the ~100 ms
|
|
12
|
+
CPU-time threshold below which launch + PCIe overhead eats any
|
|
13
|
+
speedup. Names the deliberate CPU-only modules (`anova`,
|
|
14
|
+
`timeseries.ets`, `survival.coxph`, `multivariate.factor_analysis`,
|
|
15
|
+
acf / stationarity) so future contributors know these omissions are
|
|
16
|
+
intentional, not oversights.
|
|
17
|
+
- **`auto_arima` now accepts `backend=` and `method=`**
|
|
18
|
+
(`pystatistics/timeseries/_arima_order.py`). Parameters are threaded
|
|
19
|
+
through `_stepwise_search` / `_grid_search` / `_try_fit` to every
|
|
20
|
+
candidate `arima()` call. Previously there was no way to route the
|
|
21
|
+
per-candidate fits through the GPU Whittle path, so on a
|
|
22
|
+
GPU-equipped box the search was stuck on CPU even if the user
|
|
23
|
+
wanted frequency-domain speedups. Default `backend=None` → CPU
|
|
24
|
+
(R-reference); pass `method='Whittle', backend='gpu'` to run each
|
|
25
|
+
candidate on GPU.
|
|
26
|
+
- **`little_mcar_test` now accepts `backend=` and `algorithm=`**
|
|
27
|
+
(`pystatistics/mvnmle/mcar_test.py`). Previously the function had no
|
|
28
|
+
backend knob and always ran `mlest()` with the default — which after
|
|
29
|
+
2.0.0's CPU-default sweep meant there was no way to route Little's
|
|
30
|
+
MCAR test through the GPU path, defeating the purpose of having a
|
|
31
|
+
GPU MLE backend at all. The new `backend` parameter is forwarded
|
|
32
|
+
straight to `mlest`; default None → CPU (consistent with the 2.0.0
|
|
33
|
+
convention), `'gpu'` / `'auto'` opt in to GPU. The per-pattern
|
|
34
|
+
test-statistic accumulation still runs on CPU — it's O(P × v³) for
|
|
35
|
+
v = observed vars per pattern (typically < 50) and was never the
|
|
36
|
+
bottleneck; the ML estimation step is where GPU matters. Verified
|
|
37
|
+
GPU/CPU results agree within FP32 tolerance (Δ stat ≈ 1.4e-4 on
|
|
38
|
+
the apple dataset).
|
|
39
|
+
|
|
40
|
+
|
|
3
41
|
## 2.0.0
|
|
4
42
|
|
|
5
43
|
- **BREAKING: Default backend is now CPU across all public solvers**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystatistics
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: GPU-accelerated statistical computing for Python
|
|
5
5
|
Project-URL: Homepage, https://sgcx.org/technology/pystatistics/
|
|
6
6
|
Project-URL: Documentation, https://sgcx.org/docs/pystatistics/
|
|
@@ -51,6 +51,31 @@ GPU-accelerated statistical computing for Python.
|
|
|
51
51
|
|
|
52
52
|
## What's New
|
|
53
53
|
|
|
54
|
+
### 2.0.1 — GPU-backend exposure gaps and a convention rule
|
|
55
|
+
|
|
56
|
+
Two public functions had GPU-capable inner calls but no `backend=`
|
|
57
|
+
parameter, so there was no way to route them through the GPU path —
|
|
58
|
+
exactly the regression the 2.0.0 CPU-default sweep was trying *not*
|
|
59
|
+
to create. Both fixed:
|
|
60
|
+
|
|
61
|
+
- **`little_mcar_test`** now accepts `backend=` and `algorithm=`,
|
|
62
|
+
forwarded to `mlest`. The per-pattern test-statistic accumulation
|
|
63
|
+
still runs on CPU (O(P × v³) for tiny v — never the bottleneck).
|
|
64
|
+
GPU results match CPU within FP32 tolerance (Δ stat ≈ 1.4e-4 on
|
|
65
|
+
the apple dataset).
|
|
66
|
+
- **`auto_arima`** now accepts `backend=` and `method=`, threaded
|
|
67
|
+
through `_stepwise_search` / `_grid_search` / `_try_fit` so every
|
|
68
|
+
candidate fit honours the same backend. Pass
|
|
69
|
+
`method='Whittle', backend='gpu'` to run each candidate on GPU.
|
|
70
|
+
|
|
71
|
+
Also codified the "when to add a GPU backend, and when not to" rule
|
|
72
|
+
as Section 0 of `pystatistics/GPU_BACKEND_CONVENTION.md` — the
|
|
73
|
+
absence of `backends/gpu*.py` in a module (`anova`, `ets`, `coxph`,
|
|
74
|
+
`factor_analysis`, acf / stationarity) is a deliberate statement,
|
|
75
|
+
not an oversight. GPU backends belong on workloads that actually
|
|
76
|
+
map to GPU hardware (large dense linear algebra, big-N likelihoods,
|
|
77
|
+
batched fits, frequency-domain transforms), not on everything.
|
|
78
|
+
|
|
54
79
|
### 2.0.0 — CPU is now the default backend everywhere (breaking)
|
|
55
80
|
|
|
56
81
|
Every public solver that previously defaulted to `backend='auto'` now
|
|
@@ -4,6 +4,31 @@ GPU-accelerated statistical computing for Python.
|
|
|
4
4
|
|
|
5
5
|
## What's New
|
|
6
6
|
|
|
7
|
+
### 2.0.1 — GPU-backend exposure gaps and a convention rule
|
|
8
|
+
|
|
9
|
+
Two public functions had GPU-capable inner calls but no `backend=`
|
|
10
|
+
parameter, so there was no way to route them through the GPU path —
|
|
11
|
+
exactly the regression the 2.0.0 CPU-default sweep was trying *not*
|
|
12
|
+
to create. Both fixed:
|
|
13
|
+
|
|
14
|
+
- **`little_mcar_test`** now accepts `backend=` and `algorithm=`,
|
|
15
|
+
forwarded to `mlest`. The per-pattern test-statistic accumulation
|
|
16
|
+
still runs on CPU (O(P × v³) for tiny v — never the bottleneck).
|
|
17
|
+
GPU results match CPU within FP32 tolerance (Δ stat ≈ 1.4e-4 on
|
|
18
|
+
the apple dataset).
|
|
19
|
+
- **`auto_arima`** now accepts `backend=` and `method=`, threaded
|
|
20
|
+
through `_stepwise_search` / `_grid_search` / `_try_fit` so every
|
|
21
|
+
candidate fit honours the same backend. Pass
|
|
22
|
+
`method='Whittle', backend='gpu'` to run each candidate on GPU.
|
|
23
|
+
|
|
24
|
+
Also codified the "when to add a GPU backend, and when not to" rule
|
|
25
|
+
as Section 0 of `pystatistics/GPU_BACKEND_CONVENTION.md` — the
|
|
26
|
+
absence of `backends/gpu*.py` in a module (`anova`, `ets`, `coxph`,
|
|
27
|
+
`factor_analysis`, acf / stationarity) is a deliberate statement,
|
|
28
|
+
not an oversight. GPU backends belong on workloads that actually
|
|
29
|
+
map to GPU hardware (large dense linear algebra, big-N likelihoods,
|
|
30
|
+
batched fits, frequency-domain transforms), not on everything.
|
|
31
|
+
|
|
7
32
|
### 2.0.0 — CPU is now the default backend everywhere (breaking)
|
|
8
33
|
|
|
9
34
|
Every public solver that previously defaulted to `backend='auto'` now
|
|
@@ -10,6 +10,49 @@ Two exemplars to read alongside this doc:
|
|
|
10
10
|
- `pystatistics/multivariate/_pca.py` + `backends/gpu_pca.py`
|
|
11
11
|
- `pystatistics/multinomial/_solver.py` + `backends/gpu_likelihood.py`
|
|
12
12
|
|
|
13
|
+
## 0. When to add a GPU backend — and when not to
|
|
14
|
+
|
|
15
|
+
A GPU backend exists because the underlying computation is a good fit
|
|
16
|
+
for GPU hardware, not because the module is public and therefore
|
|
17
|
+
"deserves" one. Adding a GPU backend that doesn't make algorithmic
|
|
18
|
+
sense is worse than having none at all: it invites users to pick a
|
|
19
|
+
slower path, adds a maintenance surface, and forces convention
|
|
20
|
+
compliance (Rules 1–9 below) for no benefit.
|
|
21
|
+
|
|
22
|
+
**Reasonable targets:** large dense linear algebra (QR / SVD /
|
|
23
|
+
Cholesky), per-iteration gradient evaluations on large design
|
|
24
|
+
matrices, big-N likelihood evaluations, batched independent fits,
|
|
25
|
+
frequency-domain transforms.
|
|
26
|
+
|
|
27
|
+
**Not reasonable targets — do not add a GPU backend for these:**
|
|
28
|
+
|
|
29
|
+
- Many-small-fits workflows where per-call launch overhead dominates
|
|
30
|
+
compute (e.g. ANOVA SS computation, which fits a chain of tiny
|
|
31
|
+
regressions — the CPU LAPACK call is microseconds, the GPU kernel
|
|
32
|
+
launch is milliseconds).
|
|
33
|
+
- Inherently sequential algorithms without exploitable parallelism
|
|
34
|
+
(most EM variants below a certain dataset size, Cox PH partial
|
|
35
|
+
likelihood).
|
|
36
|
+
- Algorithms already bounded by PCIe / D2H transfer, where the
|
|
37
|
+
compute is cheap enough that you spend more time copying data than
|
|
38
|
+
running the kernel.
|
|
39
|
+
- Algorithms where the existing scipy / LAPACK implementation is
|
|
40
|
+
already within an order of magnitude of hardware peak — a 2× speedup
|
|
41
|
+
is not worth the convention-compliance + test + review cost.
|
|
42
|
+
|
|
43
|
+
**Signal that GPU makes sense:** measured CPU time > 100 ms on a
|
|
44
|
+
representative input, with > 80 % of that time in a compute kernel
|
|
45
|
+
that maps to cuBLAS / cuSOLVER / cuFFT. Below that threshold, the
|
|
46
|
+
launch + transfer overhead eats the win.
|
|
47
|
+
|
|
48
|
+
If a public module has no `backends/gpu*.py`, that is a deliberate
|
|
49
|
+
statement — like `anova`, `timeseries.ets`, `survival.coxph`,
|
|
50
|
+
`multivariate.factor_analysis`, and the acf / stationarity families.
|
|
51
|
+
The public API correspondingly does *not* expose a `backend=`
|
|
52
|
+
parameter, which is the correct state (Rule 1: don't offer choices
|
|
53
|
+
you can't honor; exposing `backend='gpu'` on a CPU-only module would
|
|
54
|
+
violate fail-fast).
|
|
55
|
+
|
|
13
56
|
## 1. Input type determines default backend
|
|
14
57
|
|
|
15
58
|
The top-level fit function accepts either a numpy array *or* a
|
|
@@ -102,6 +102,8 @@ def regularized_inverse(matrix: np.ndarray,
|
|
|
102
102
|
|
|
103
103
|
def little_mcar_test(data,
|
|
104
104
|
alpha: float = 0.05,
|
|
105
|
+
backend: str | None = None,
|
|
106
|
+
algorithm: str = 'direct',
|
|
105
107
|
verbose: bool = False) -> MCARTestResult:
|
|
106
108
|
"""
|
|
107
109
|
Little's test for Missing Completely at Random (MCAR).
|
|
@@ -112,6 +114,14 @@ def little_mcar_test(data,
|
|
|
112
114
|
Data matrix with missing values as np.nan.
|
|
113
115
|
alpha : float, default=0.05
|
|
114
116
|
Significance level
|
|
117
|
+
backend : str or None, default None
|
|
118
|
+
Backend for the ML estimation step (the dominant cost).
|
|
119
|
+
Default None → 'cpu' (R-reference path). Explicit: 'cpu',
|
|
120
|
+
'gpu', or 'auto' to prefer GPU when available. The per-pattern
|
|
121
|
+
test-statistic accumulation runs on CPU regardless — it's
|
|
122
|
+
O(P × v³) for tiny v and is not the bottleneck.
|
|
123
|
+
algorithm : str, default 'direct'
|
|
124
|
+
ML algorithm: 'direct' (BFGS) or 'em'. Forwarded to mlest.
|
|
115
125
|
verbose : bool, default=False
|
|
116
126
|
Print detailed progress
|
|
117
127
|
|
|
@@ -138,7 +148,9 @@ def little_mcar_test(data,
|
|
|
138
148
|
print("Step 1: Computing ML estimates...")
|
|
139
149
|
|
|
140
150
|
try:
|
|
141
|
-
ml_result = mlest(
|
|
151
|
+
ml_result = mlest(
|
|
152
|
+
data_array, backend=backend, algorithm=algorithm, verbose=False,
|
|
153
|
+
)
|
|
142
154
|
mu_ml = ml_result.muhat
|
|
143
155
|
sigma_ml = ml_result.sigmahat
|
|
144
156
|
except Exception as e:
|
|
@@ -117,6 +117,8 @@ def _try_fit(
|
|
|
117
117
|
ic: str,
|
|
118
118
|
tol: float,
|
|
119
119
|
max_iter: int,
|
|
120
|
+
method: str = "CSS-ML",
|
|
121
|
+
backend: str | None = None,
|
|
120
122
|
) -> tuple[object | None, float]:
|
|
121
123
|
"""Attempt to fit an ARIMA model; return (result, ic_value).
|
|
122
124
|
|
|
@@ -149,8 +151,10 @@ def _try_fit(
|
|
|
149
151
|
y,
|
|
150
152
|
order=order,
|
|
151
153
|
seasonal=seasonal_order,
|
|
154
|
+
method=method,
|
|
152
155
|
tol=tol,
|
|
153
156
|
max_iter=max_iter,
|
|
157
|
+
backend=backend,
|
|
154
158
|
)
|
|
155
159
|
if not result.converged:
|
|
156
160
|
return None, math.inf
|
|
@@ -229,6 +233,8 @@ def _stepwise_search(
|
|
|
229
233
|
ic: str,
|
|
230
234
|
tol: float,
|
|
231
235
|
max_iter: int,
|
|
236
|
+
method: str = "CSS-ML",
|
|
237
|
+
backend: str | None = None,
|
|
232
238
|
) -> tuple[object, tuple[int, int, int], float, list[tuple[tuple, float]]]:
|
|
233
239
|
"""Stepwise ARIMA order selection.
|
|
234
240
|
|
|
@@ -274,7 +280,9 @@ def _stepwise_search(
|
|
|
274
280
|
best_ic = math.inf
|
|
275
281
|
|
|
276
282
|
for order in initial_orders:
|
|
277
|
-
result, ic_val = _try_fit(
|
|
283
|
+
result, ic_val = _try_fit(
|
|
284
|
+
y, order, seasonal_order, ic, tol, max_iter, method, backend,
|
|
285
|
+
)
|
|
278
286
|
search_results.append((order, ic_val))
|
|
279
287
|
if ic_val < best_ic:
|
|
280
288
|
best_ic = ic_val
|
|
@@ -311,7 +319,7 @@ def _stepwise_search(
|
|
|
311
319
|
for order in neighbours:
|
|
312
320
|
visited.add(order)
|
|
313
321
|
result, ic_val = _try_fit(
|
|
314
|
-
y, order, seasonal_order, ic, tol, max_iter
|
|
322
|
+
y, order, seasonal_order, ic, tol, max_iter, method, backend,
|
|
315
323
|
)
|
|
316
324
|
search_results.append((order, ic_val))
|
|
317
325
|
if ic_val < best_ic:
|
|
@@ -336,6 +344,8 @@ def _grid_search(
|
|
|
336
344
|
ic: str,
|
|
337
345
|
tol: float,
|
|
338
346
|
max_iter: int,
|
|
347
|
+
method: str = "CSS-ML",
|
|
348
|
+
backend: str | None = None,
|
|
339
349
|
) -> tuple[object, tuple[int, int, int], float, list[tuple[tuple, float]]]:
|
|
340
350
|
"""Exhaustive grid search over all (p, d, q) combinations.
|
|
341
351
|
|
|
@@ -368,7 +378,9 @@ def _grid_search(
|
|
|
368
378
|
|
|
369
379
|
for p, q in itertools.product(range(max_p + 1), range(max_q + 1)):
|
|
370
380
|
order = (p, d, q)
|
|
371
|
-
result, ic_val = _try_fit(
|
|
381
|
+
result, ic_val = _try_fit(
|
|
382
|
+
y, order, seasonal_order, ic, tol, max_iter, method, backend,
|
|
383
|
+
)
|
|
372
384
|
search_results.append((order, ic_val))
|
|
373
385
|
if ic_val < best_ic:
|
|
374
386
|
best_ic = ic_val
|
|
@@ -403,6 +415,8 @@ def auto_arima(
|
|
|
403
415
|
stepwise: bool = True,
|
|
404
416
|
tol: float = 1e-8,
|
|
405
417
|
max_iter: int = 1000,
|
|
418
|
+
method: str = "CSS-ML",
|
|
419
|
+
backend: str | None = None,
|
|
406
420
|
) -> AutoARIMAResult:
|
|
407
421
|
"""Automatic ARIMA model selection.
|
|
408
422
|
|
|
@@ -436,6 +450,15 @@ def auto_arima(
|
|
|
436
450
|
Convergence tolerance passed to :func:`arima`.
|
|
437
451
|
max_iter : int
|
|
438
452
|
Maximum iterations passed to :func:`arima`.
|
|
453
|
+
method : str
|
|
454
|
+
Estimation method forwarded to every candidate fit. Default
|
|
455
|
+
``'CSS-ML'`` matches R. Use ``'Whittle'`` with ``backend='gpu'``
|
|
456
|
+
to route each candidate through the frequency-domain GPU path.
|
|
457
|
+
backend : str or None
|
|
458
|
+
Backend forwarded to every candidate fit. Default ``None`` →
|
|
459
|
+
CPU (R-reference path). Pass ``'gpu'`` or ``'auto'`` to
|
|
460
|
+
opt into the GPU path; only meaningful when the candidate
|
|
461
|
+
fits actually support it (e.g. ``method='Whittle'``).
|
|
439
462
|
|
|
440
463
|
Returns
|
|
441
464
|
-------
|
|
@@ -486,11 +509,13 @@ def auto_arima(
|
|
|
486
509
|
# --- Search ---
|
|
487
510
|
if stepwise:
|
|
488
511
|
best_result, best_order, best_ic_val, search_results = _stepwise_search(
|
|
489
|
-
arr, d, max_p, max_q, seasonal_order, ic, tol, max_iter
|
|
512
|
+
arr, d, max_p, max_q, seasonal_order, ic, tol, max_iter,
|
|
513
|
+
method, backend,
|
|
490
514
|
)
|
|
491
515
|
else:
|
|
492
516
|
best_result, best_order, best_ic_val, search_results = _grid_search(
|
|
493
|
-
arr, d, max_p, max_q, seasonal_order, ic, tol, max_iter
|
|
517
|
+
arr, d, max_p, max_q, seasonal_order, ic, tol, max_iter,
|
|
518
|
+
method, backend,
|
|
494
519
|
)
|
|
495
520
|
|
|
496
521
|
models_fitted = sum(1 for _, v in search_results if v < math.inf)
|
|
@@ -331,3 +331,32 @@ class TestGPUEdgeCases:
|
|
|
331
331
|
assert result_em.converged
|
|
332
332
|
assert np.all(np.isfinite(result_direct.muhat))
|
|
333
333
|
assert np.all(np.isfinite(result_direct.sigmahat))
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
# =====================================================================
|
|
337
|
+
# Little's MCAR test — backend forwarding
|
|
338
|
+
# =====================================================================
|
|
339
|
+
|
|
340
|
+
class TestLittleMCARGPU:
|
|
341
|
+
"""Little's MCAR test must accept and honor backend=.
|
|
342
|
+
|
|
343
|
+
Regression coverage for the gap exposed during Project Lacuna:
|
|
344
|
+
pre-fix, little_mcar_test had no backend knob, so there was no
|
|
345
|
+
way to route the (dominant) ML estimation step through the GPU
|
|
346
|
+
path even though a GPU MLE backend existed.
|
|
347
|
+
"""
|
|
348
|
+
|
|
349
|
+
def test_gpu_backend_runs(self):
|
|
350
|
+
from pystatistics.mvnmle import little_mcar_test
|
|
351
|
+
result = little_mcar_test(datasets.apple, backend='gpu')
|
|
352
|
+
assert np.isfinite(result.statistic)
|
|
353
|
+
assert 0.0 <= result.p_value <= 1.0
|
|
354
|
+
assert result.df > 0
|
|
355
|
+
|
|
356
|
+
def test_gpu_matches_cpu_within_fp32_tolerance(self):
|
|
357
|
+
from pystatistics.mvnmle import little_mcar_test
|
|
358
|
+
cpu = little_mcar_test(datasets.apple, backend='cpu')
|
|
359
|
+
gpu = little_mcar_test(datasets.apple, backend='gpu')
|
|
360
|
+
assert gpu.df == cpu.df
|
|
361
|
+
# FP32 mlest → ~1e-3 level agreement on the chi-sq statistic
|
|
362
|
+
assert abs(gpu.statistic - cpu.statistic) < 1e-2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/__init__.py
RENAMED
|
File without changes
|
{pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/convergence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|