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.
Files changed (532) hide show
  1. {pystatistics-2.0.0 → pystatistics-2.0.1}/CHANGELOG.md +38 -0
  2. {pystatistics-2.0.0 → pystatistics-2.0.1}/PKG-INFO +26 -1
  3. {pystatistics-2.0.0 → pystatistics-2.0.1}/README.md +25 -0
  4. {pystatistics-2.0.0 → pystatistics-2.0.1}/pyproject.toml +1 -1
  5. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/GPU_BACKEND_CONVENTION.md +43 -0
  6. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/__init__.py +1 -1
  7. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/mcar_test.py +13 -1
  8. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_order.py +30 -5
  9. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_gpu.py +29 -0
  10. {pystatistics-2.0.0 → pystatistics-2.0.1}/.github/workflows/publish.yml +0 -0
  11. {pystatistics-2.0.0 → pystatistics-2.0.1}/.github/workflows/trigger-docs-rebuild.yml +0 -0
  12. {pystatistics-2.0.0 → pystatistics-2.0.1}/.gitignore +0 -0
  13. {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/CHECKLIST.md +0 -0
  14. {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/UNRELEASED.md +0 -0
  15. {pystatistics-2.0.0 → pystatistics-2.0.1}/.release/release.py +0 -0
  16. {pystatistics-2.0.0 → pystatistics-2.0.1}/CLAUDE.md +0 -0
  17. {pystatistics-2.0.0 → pystatistics-2.0.1}/LICENSE +0 -0
  18. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/DESIGN.md +0 -0
  19. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/Forge.md +0 -0
  20. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/GPU_BACKEND_NOTES.md +0 -0
  21. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/Makefile +0 -0
  22. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/PYSTATSBIO_CONTEXT.md +0 -0
  23. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/ROADMAP.md +0 -0
  24. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/_static/custom.css +0 -0
  25. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/anova.rst +0 -0
  26. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/conf.py +0 -0
  27. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/core.rst +0 -0
  28. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/descriptive.rst +0 -0
  29. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/hypothesis.rst +0 -0
  30. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/index.rst +0 -0
  31. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/mixed.rst +0 -0
  32. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/montecarlo.rst +0 -0
  33. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/mvnmle.rst +0 -0
  34. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/regression.rst +0 -0
  35. {pystatistics-2.0.0 → pystatistics-2.0.1}/docs/survival.rst +0 -0
  36. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/__init__.py +0 -0
  37. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_common.py +0 -0
  38. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_contrasts.py +0 -0
  39. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_levene.py +0 -0
  40. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_posthoc.py +0 -0
  41. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_repeated.py +0 -0
  42. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/_ss.py +0 -0
  43. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/design.py +0 -0
  44. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/solution.py +0 -0
  45. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/anova/solvers.py +0 -0
  46. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/__init__.py +0 -0
  47. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/capabilities.py +0 -0
  48. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/__init__.py +0 -0
  49. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/device.py +0 -0
  50. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/__init__.py +0 -0
  51. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/batched.py +0 -0
  52. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/cholesky.py +0 -0
  53. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/determinant.py +0 -0
  54. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/qr.py +0 -0
  55. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/solve.py +0 -0
  56. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/linalg/svd.py +0 -0
  57. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/__init__.py +0 -0
  58. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/optimization/convergence.py +0 -0
  59. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/precision.py +0 -0
  60. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/timing.py +0 -0
  61. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/compute/tolerances.py +0 -0
  62. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/datasource.py +0 -0
  63. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/exceptions.py +0 -0
  64. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/protocols.py +0 -0
  65. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/result.py +0 -0
  66. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/core/validation.py +0 -0
  67. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/__init__.py +0 -0
  68. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/_missing.py +0 -0
  69. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/_quantile_types.py +0 -0
  70. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/__init__.py +0 -0
  71. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/cpu.py +0 -0
  72. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/backends/gpu.py +0 -0
  73. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/design.py +0 -0
  74. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/solution.py +0 -0
  75. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/descriptive/solvers.py +0 -0
  76. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/__init__.py +0 -0
  77. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_basis.py +0 -0
  78. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_common.py +0 -0
  79. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_fit.py +0 -0
  80. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_gam.py +0 -0
  81. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_gcv.py +0 -0
  82. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/_smooth.py +0 -0
  83. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/__init__.py +0 -0
  84. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/_gpu_family.py +0 -0
  85. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/backends/gpu_pirls.py +0 -0
  86. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/gam/solution.py +0 -0
  87. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/__init__.py +0 -0
  88. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_common.py +0 -0
  89. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_design_factories.py +0 -0
  90. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/_p_adjust.py +0 -0
  91. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/__init__.py +0 -0
  92. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_chisq_test.py +0 -0
  93. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_fisher_test.py +0 -0
  94. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_ks_test.py +0 -0
  95. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_prop_test.py +0 -0
  96. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_t_test.py +0 -0
  97. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_var_test.py +0 -0
  98. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/_wilcox_test.py +0 -0
  99. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/cpu.py +0 -0
  100. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/backends/gpu.py +0 -0
  101. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/design.py +0 -0
  102. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/solution.py +0 -0
  103. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/hypothesis/solvers.py +0 -0
  104. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/__init__.py +0 -0
  105. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_common.py +0 -0
  106. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_deviance.py +0 -0
  107. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_pirls.py +0 -0
  108. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_pls.py +0 -0
  109. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_random_effects.py +0 -0
  110. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/_satterthwaite.py +0 -0
  111. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/design.py +0 -0
  112. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/solution.py +0 -0
  113. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mixed/solvers.py +0 -0
  114. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/__init__.py +0 -0
  115. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_ci.py +0 -0
  116. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_common.py +0 -0
  117. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/_influence.py +0 -0
  118. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/__init__.py +0 -0
  119. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/cpu.py +0 -0
  120. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/backends/gpu.py +0 -0
  121. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/design.py +0 -0
  122. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/solution.py +0 -0
  123. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/montecarlo/solvers.py +0 -0
  124. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/__init__.py +0 -0
  125. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_common.py +0 -0
  126. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_likelihood.py +0 -0
  127. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/_solver.py +0 -0
  128. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/backends/__init__.py +0 -0
  129. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/backends/gpu_likelihood.py +0 -0
  130. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multinomial/solution.py +0 -0
  131. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/__init__.py +0 -0
  132. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_common.py +0 -0
  133. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_factor.py +0 -0
  134. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_pca.py +0 -0
  135. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/_rotation.py +0 -0
  136. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/backends/__init__.py +0 -0
  137. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/multivariate/backends/gpu_pca.py +0 -0
  138. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/__init__.py +0 -0
  139. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/__init__.py +0 -0
  140. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/base.py +0 -0
  141. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/cpu.py +0 -0
  142. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/gpu_fp32.py +0 -0
  143. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/gpu_fp64.py +0 -0
  144. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_objectives/parameterizations.py +0 -0
  145. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/_utils.py +0 -0
  146. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/__init__.py +0 -0
  147. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/cpu.py +0 -0
  148. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/em.py +0 -0
  149. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/backends/gpu.py +0 -0
  150. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/datasets.py +0 -0
  151. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/design.py +0 -0
  152. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/patterns.py +0 -0
  153. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/solution.py +0 -0
  154. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/mvnmle/solvers.py +0 -0
  155. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/__init__.py +0 -0
  156. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_common.py +0 -0
  157. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_likelihood.py +0 -0
  158. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/_solver.py +0 -0
  159. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/backends/__init__.py +0 -0
  160. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/backends/gpu_likelihood.py +0 -0
  161. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/ordinal/solution.py +0 -0
  162. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/py.typed +0 -0
  163. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/__init__.py +0 -0
  164. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_formatting.py +0 -0
  165. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_glm.py +0 -0
  166. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_linear.py +0 -0
  167. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/_nb_theta.py +0 -0
  168. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/__init__.py +0 -0
  169. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/cpu.py +0 -0
  170. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/cpu_glm.py +0 -0
  171. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/gpu.py +0 -0
  172. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/backends/gpu_glm.py +0 -0
  173. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/design.py +0 -0
  174. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/families.py +0 -0
  175. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/solution.py +0 -0
  176. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/regression/solvers.py +0 -0
  177. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/__init__.py +0 -0
  178. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_common.py +0 -0
  179. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_cox.py +0 -0
  180. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_discrete.py +0 -0
  181. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_km.py +0 -0
  182. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/_logrank.py +0 -0
  183. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/__init__.py +0 -0
  184. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/cpu.py +0 -0
  185. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/backends/gpu.py +0 -0
  186. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/design.py +0 -0
  187. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/solution.py +0 -0
  188. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/survival/solvers.py +0 -0
  189. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/__init__.py +0 -0
  190. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_acf.py +0 -0
  191. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_batch.py +0 -0
  192. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_factored.py +0 -0
  193. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_fit.py +0 -0
  194. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_forecast.py +0 -0
  195. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_kalman.py +0 -0
  196. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_arima_likelihood.py +0 -0
  197. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_common.py +0 -0
  198. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_decomposition.py +0 -0
  199. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_differencing.py +0 -0
  200. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_fit.py +0 -0
  201. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_forecast.py +0 -0
  202. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_ets_models.py +0 -0
  203. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_stationarity.py +0 -0
  204. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/_whittle.py +0 -0
  205. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/__init__.py +0 -0
  206. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/whittle_batch_gpu.py +0 -0
  207. {pystatistics-2.0.0 → pystatistics-2.0.1}/pystatistics/timeseries/backends/whittle_gpu.py +0 -0
  208. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/__init__.py +0 -0
  209. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/conftest.py +0 -0
  210. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_contrasts.py +0 -0
  211. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_design.py +0 -0
  212. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_factorial.py +0 -0
  213. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_levene.py +0 -0
  214. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_oneway.py +0 -0
  215. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_posthoc.py +0 -0
  216. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_r_validation.py +0 -0
  217. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/anova/test_repeated_measures.py +0 -0
  218. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/benchmark_gpu.py +0 -0
  219. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/conftest.py +0 -0
  220. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_datasource.py +0 -0
  221. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_exceptions.py +0 -0
  222. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_result.py +0 -0
  223. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/core/test_validation.py +0 -0
  224. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/__init__.py +0 -0
  225. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/conftest.py +0 -0
  226. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_cor.py +0 -0
  227. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_cov.py +0 -0
  228. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_describe.py +0 -0
  229. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_gpu.py +0 -0
  230. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_missing.py +0 -0
  231. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_moments.py +0 -0
  232. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_quantile.py +0 -0
  233. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/descriptive/test_r_validation.py +0 -0
  234. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_ancova_meta.json +0 -0
  235. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_ancova_r_results.json +0 -0
  236. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_bonferroni_meta.json +0 -0
  237. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_bonferroni_r_results.json +0 -0
  238. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_eta_meta.json +0 -0
  239. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_eta_r_results.json +0 -0
  240. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_levene_meta.json +0 -0
  241. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_levene_r_results.json +0 -0
  242. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_balanced_meta.json +0 -0
  243. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_balanced_r_results.json +0 -0
  244. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_unbalanced_meta.json +0 -0
  245. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_oneway_unbalanced_r_results.json +0 -0
  246. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_mixed_meta.json +0 -0
  247. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_mixed_r_results.json +0 -0
  248. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_within_meta.json +0 -0
  249. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_rm_within_r_results.json +0 -0
  250. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_tukey_meta.json +0 -0
  251. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_tukey_r_results.json +0 -0
  252. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_balanced_meta.json +0 -0
  253. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_balanced_r_results.json +0 -0
  254. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_unbalanced_meta.json +0 -0
  255. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/anova_twoway_unbalanced_r_results.json +0 -0
  256. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3.csv +0 -0
  257. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3_meta.json +0 -0
  258. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/basic_100x3_r_results.json +0 -0
  259. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost.csv +0 -0
  260. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost_meta.json +0 -0
  261. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/collinear_almost_r_results.json +0 -0
  262. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5.csv +0 -0
  263. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5_meta.json +0 -0
  264. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_basic_100x5_r_results.json +0 -0
  265. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column.csv +0 -0
  266. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column_meta.json +0 -0
  267. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_constant_column_r_results.json +0 -0
  268. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values.csv +0 -0
  269. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values_meta.json +0 -0
  270. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_extreme_values_r_results.json +0 -0
  271. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10.csv +0 -0
  272. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10_meta.json +0 -0
  273. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_large_1000x10_r_results.json +0 -0
  274. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise.csv +0 -0
  275. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise_meta.json +0 -0
  276. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_columnwise_r_results.json +0 -0
  277. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered.csv +0 -0
  278. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered_meta.json +0 -0
  279. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_nan_scattered_r_results.json +0 -0
  280. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation.csv +0 -0
  281. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation_meta.json +0 -0
  282. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_negative_correlation_r_results.json +0 -0
  283. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation.csv +0 -0
  284. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation_meta.json +0 -0
  285. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_perfect_correlation_r_results.json +0 -0
  286. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column.csv +0 -0
  287. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column_meta.json +0 -0
  288. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_single_column_r_results.json +0 -0
  289. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties.csv +0 -0
  290. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties_meta.json +0 -0
  291. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/desc_ties_r_results.json +0 -0
  292. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales.csv +0 -0
  293. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales_meta.json +0 -0
  294. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/different_scales_r_results.json +0 -0
  295. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_anova_fixtures.py +0 -0
  296. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_descriptive_fixtures.py +0 -0
  297. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_fixtures.py +0 -0
  298. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_glm_fixtures.py +0 -0
  299. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_hypothesis_fixtures.py +0 -0
  300. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_mixed_fixtures.py +0 -0
  301. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_montecarlo_fixtures.py +0 -0
  302. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/generate_survival_fixtures.py +0 -0
  303. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced.csv +0 -0
  304. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced_meta.json +0 -0
  305. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_balanced_r_results.json +0 -0
  306. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic.csv +0 -0
  307. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic_meta.json +0 -0
  308. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_basic_r_results.json +0 -0
  309. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large.csv +0 -0
  310. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large_meta.json +0 -0
  311. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_large_r_results.json +0 -0
  312. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated.csv +0 -0
  313. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated_meta.json +0 -0
  314. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_binomial_separated_r_results.json +0 -0
  315. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic.csv +0 -0
  316. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic_meta.json +0 -0
  317. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_basic_r_results.json +0 -0
  318. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large.csv +0 -0
  319. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large_meta.json +0 -0
  320. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_gaussian_large_r_results.json +0 -0
  321. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic.csv +0 -0
  322. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic_meta.json +0 -0
  323. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_basic_r_results.json +0 -0
  324. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts.csv +0 -0
  325. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts_meta.json +0 -0
  326. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_large_counts_r_results.json +0 -0
  327. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros.csv +0 -0
  328. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros_meta.json +0 -0
  329. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/glm_poisson_zeros_r_results.json +0 -0
  330. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise.csv +0 -0
  331. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise_meta.json +0 -0
  332. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/high_noise_r_results.json +0 -0
  333. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_2x2_yates_meta.json +0 -0
  334. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_2x2_yates_r_results.json +0 -0
  335. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_3x3_meta.json +0 -0
  336. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_3x3_r_results.json +0 -0
  337. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_meta.json +0 -0
  338. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_r_results.json +0 -0
  339. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_unequal_meta.json +0 -0
  340. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_chisq_gof_unequal_r_results.json +0 -0
  341. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_less_meta.json +0 -0
  342. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_less_r_results.json +0 -0
  343. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_meta.json +0 -0
  344. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_2x2_r_results.json +0 -0
  345. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_3x3_meta.json +0 -0
  346. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_fisher_3x3_r_results.json +0 -0
  347. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_onesample_norm_meta.json +0 -0
  348. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_onesample_norm_r_results.json +0 -0
  349. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_twosample_meta.json +0 -0
  350. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_ks_twosample_r_results.json +0 -0
  351. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_onesample_meta.json +0 -0
  352. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_onesample_r_results.json +0 -0
  353. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_twosample_meta.json +0 -0
  354. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_prop_twosample_r_results.json +0 -0
  355. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_onesample_meta.json +0 -0
  356. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_onesample_r_results.json +0 -0
  357. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_paired_meta.json +0 -0
  358. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_paired_r_results.json +0 -0
  359. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_pooled_meta.json +0 -0
  360. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_pooled_r_results.json +0 -0
  361. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_welch_meta.json +0 -0
  362. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_t_welch_r_results.json +0 -0
  363. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_var_basic_meta.json +0 -0
  364. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_var_basic_r_results.json +0 -0
  365. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_ranksum_meta.json +0 -0
  366. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_ranksum_r_results.json +0 -0
  367. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_signed_meta.json +0 -0
  368. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/htest_wilcox_signed_r_results.json +0 -0
  369. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned.csv +0 -0
  370. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned_meta.json +0 -0
  371. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/ill_conditioned_r_results.json +0 -0
  372. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs.csv +0 -0
  373. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs_meta.json +0 -0
  374. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/large_coeffs_r_results.json +0 -0
  375. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_90_meta.json +0 -0
  376. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_90_r_results.json +0 -0
  377. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_normal_meta.json +0 -0
  378. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_normal_r_results.json +0 -0
  379. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_skewed_meta.json +0 -0
  380. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_ci_skewed_r_results.json +0 -0
  381. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_balanced_meta.json +0 -0
  382. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_balanced_r_results.json +0 -0
  383. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_ordinary_meta.json +0 -0
  384. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_mean_ordinary_r_results.json +0 -0
  385. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_median_meta.json +0 -0
  386. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_median_r_results.json +0 -0
  387. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_variance_meta.json +0 -0
  388. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_boot_variance_r_results.json +0 -0
  389. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_greater_meta.json +0 -0
  390. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_greater_r_results.json +0 -0
  391. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_not_significant_meta.json +0 -0
  392. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_not_significant_r_results.json +0 -0
  393. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_significant_meta.json +0 -0
  394. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mc_perm_significant_r_results.json +0 -0
  395. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/glmm_binomial.csv +0 -0
  396. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/glmm_poisson.csv +0 -0
  397. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_crossed.csv +0 -0
  398. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_intercept.csv +0 -0
  399. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_ml.csv +0 -0
  400. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_no_effect.csv +0 -0
  401. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/lmm_slope.csv +0 -0
  402. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/mixed_meta.json +0 -0
  403. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/mixed/mixed_r_results.json +0 -0
  404. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square.csv +0 -0
  405. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square_meta.json +0 -0
  406. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/near_square_r_results.json +0 -0
  407. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept.csv +0 -0
  408. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept_meta.json +0 -0
  409. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/no_intercept_r_results.json +0 -0
  410. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_anova_validation.R +0 -0
  411. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_descriptive_validation.R +0 -0
  412. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_glm_validation.R +0 -0
  413. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_hypothesis_validation.R +0 -0
  414. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_mixed_validation.R +0 -0
  415. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_montecarlo_validation.R +0 -0
  416. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_survival_validation.R +0 -0
  417. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_r_validation.R +0 -0
  418. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/run_validation.sh +0 -0
  419. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise.csv +0 -0
  420. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise_meta.json +0 -0
  421. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/small_noise_r_results.json +0 -0
  422. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_breslow_meta.json +0 -0
  423. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_breslow_r_results.json +0 -0
  424. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_single_meta.json +0 -0
  425. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_single_r_results.json +0 -0
  426. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_ties_meta.json +0 -0
  427. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_ties_r_results.json +0 -0
  428. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_two_cov_meta.json +0 -0
  429. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_cox_two_cov_r_results.json +0 -0
  430. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_basic_meta.json +0 -0
  431. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_basic_r_results.json +0 -0
  432. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_heavy_cens_meta.json +0 -0
  433. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_heavy_cens_r_results.json +0 -0
  434. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_loglog_ci_meta.json +0 -0
  435. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_loglog_ci_r_results.json +0 -0
  436. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_no_cens_meta.json +0 -0
  437. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_no_cens_r_results.json +0 -0
  438. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_plain_ci_meta.json +0 -0
  439. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_plain_ci_r_results.json +0 -0
  440. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_ties_meta.json +0 -0
  441. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_km_ties_r_results.json +0 -0
  442. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_peto_meta.json +0 -0
  443. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_peto_r_results.json +0 -0
  444. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_three_group_meta.json +0 -0
  445. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_three_group_r_results.json +0 -0
  446. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_two_group_meta.json +0 -0
  447. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/surv_lr_two_group_r_results.json +0 -0
  448. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny.csv +0 -0
  449. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny_meta.json +0 -0
  450. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/tall_skinny_r_results.json +0 -0
  451. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/fixtures/validate_against_r.py +0 -0
  452. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/gam/__init__.py +0 -0
  453. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/gam/test_gam.py +0 -0
  454. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/__init__.py +0 -0
  455. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/conftest.py +0 -0
  456. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_chisq_test.py +0 -0
  457. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_design_split.py +0 -0
  458. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_fisher_test.py +0 -0
  459. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_gpu.py +0 -0
  460. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_ks_test.py +0 -0
  461. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_p_adjust.py +0 -0
  462. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_prop_test.py +0 -0
  463. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_r_validation.py +0 -0
  464. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_t_test.py +0 -0
  465. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_var_test.py +0 -0
  466. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/hypothesis/test_wilcox_test.py +0 -0
  467. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/__init__.py +0 -0
  468. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/conftest.py +0 -0
  469. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_glmm.py +0 -0
  470. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_crossed.py +0 -0
  471. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_intercept.py +0 -0
  472. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_nested.py +0 -0
  473. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_lmm_slope.py +0 -0
  474. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_pls.py +0 -0
  475. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_r_validation.py +0 -0
  476. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_random_effects.py +0 -0
  477. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mixed/test_satterthwaite.py +0 -0
  478. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/__init__.py +0 -0
  479. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/conftest.py +0 -0
  480. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_batched_solver.py +0 -0
  481. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_boot_ci.py +0 -0
  482. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_bootstrap.py +0 -0
  483. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_gpu.py +0 -0
  484. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_influence.py +0 -0
  485. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_permutation.py +0 -0
  486. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/montecarlo/test_r_validation.py +0 -0
  487. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multinomial/__init__.py +0 -0
  488. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multinomial/test_multinom.py +0 -0
  489. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multivariate/__init__.py +0 -0
  490. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/multivariate/test_multivariate.py +0 -0
  491. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/apple_em_reference.json +0 -0
  492. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/apple_reference.json +0 -0
  493. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/generate_em_fixtures.R +0 -0
  494. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_apple.json +0 -0
  495. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_complete.json +0 -0
  496. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_extreme.json +0 -0
  497. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_missvals.json +0 -0
  498. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_simple_mcar.json +0 -0
  499. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/little_mcar_summary.json +0 -0
  500. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/missvals_em_reference.json +0 -0
  501. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/missvals_reference.json +0 -0
  502. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/references/small_test_reference.json +0 -0
  503. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_em.py +0 -0
  504. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_mlest.py +0 -0
  505. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/mvnmle/test_no_silent_fallback.py +0 -0
  506. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/ordinal/__init__.py +0 -0
  507. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/ordinal/test_ordinal.py +0 -0
  508. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/benchmark.py +0 -0
  509. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/benchmark.r +0 -0
  510. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/conftest.py +0 -0
  511. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_fit.py +0 -0
  512. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_gamma_nb.py +0 -0
  513. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm.py +0 -0
  514. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm_gpu.py +0 -0
  515. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_glm_r_validation.py +0 -0
  516. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_module_split.py +0 -0
  517. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_r_validation.py +0 -0
  518. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/regression/test_stress_gpu.py +0 -0
  519. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/__init__.py +0 -0
  520. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/conftest.py +0 -0
  521. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_coxph.py +0 -0
  522. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_discrete_time.py +0 -0
  523. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_gpu.py +0 -0
  524. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_kaplan_meier.py +0 -0
  525. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_logrank.py +0 -0
  526. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/survival/test_r_validation.py +0 -0
  527. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/test_code_quality.py +0 -0
  528. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/__init__.py +0 -0
  529. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_acf_stationarity.py +0 -0
  530. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_arima.py +0 -0
  531. {pystatistics-2.0.0 → pystatistics-2.0.1}/tests/timeseries/test_decomposition.py +0 -0
  532. {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.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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pystatistics"
7
- version = "2.0.0"
7
+ version = "2.0.1"
8
8
  description = "GPU-accelerated statistical computing for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -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
@@ -16,7 +16,7 @@ Usage:
16
16
  result = fit(design)
17
17
  """
18
18
 
19
- __version__ = "2.0.0"
19
+ __version__ = "2.0.1"
20
20
  __author__ = "Hai-Shuo"
21
21
  __email__ = "contact@sgcx.org"
22
22
 
@@ -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(data_array, verbose=False)
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(y, order, seasonal_order, ic, tol, max_iter)
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(y, order, seasonal_order, ic, tol, max_iter)
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