scientific-computing-system 2.2.6__tar.gz → 2.2.8__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 (428) hide show
  1. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CHANGELOG.md +20 -0
  2. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CITATION.cff +2 -2
  3. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/PKG-INFO +1 -1
  4. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/codemeta.json +1 -1
  5. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/package.json +1 -1
  6. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/pyproject.toml +1 -1
  7. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/_version.py +2 -2
  8. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/checks.py +22 -12
  9. scientific_computing_system-2.2.8/tests/test_property_invariants.py +140 -0
  10. scientific_computing_system-2.2.8/tests/test_validation_bounds_nonfinite_regression.py +27 -0
  11. scientific_computing_system-2.2.8/tests/test_validation_nonfinite_thresholds_regression.py +57 -0
  12. scientific_computing_system-2.2.6/tests/test_property_invariants.py +0 -277
  13. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/benchmarks.yml +0 -0
  14. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/bot-reviewer.yml +0 -0
  15. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/changelog.yml +0 -0
  16. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/cli-package-smoke.yml +0 -0
  17. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/codeql.yml +0 -0
  18. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/npm-publish.yml +0 -0
  19. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/pr-automation.yml +0 -0
  20. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/pypi-registry-smoke.yml +0 -0
  21. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/release.yml +0 -0
  22. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/tests.yml +0 -0
  23. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.gitignore +0 -0
  24. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CONTRIBUTING.md +0 -0
  25. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/LICENSE +0 -0
  26. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/README.md +0 -0
  27. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/SECURITY.md +0 -0
  28. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/results.json +0 -0
  29. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/robust_runner.py +0 -0
  30. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/run_benchmarks.py +0 -0
  31. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/bin/scs.js +0 -0
  32. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/dashboard/app.py +0 -0
  33. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/ARCHITECTURE.md +0 -0
  34. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/CASE_STUDY_HUBBLE.md +0 -0
  35. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
  36. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/api.md +0 -0
  37. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/assets/icon.svg +0 -0
  38. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/assets/logo.svg +0 -0
  39. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/benchmarks.md +0 -0
  40. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/checks/verify_provenance_claims.py +0 -0
  41. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/cookbook.md +0 -0
  42. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/getting-started.md +0 -0
  43. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/index.md +0 -0
  44. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/maintenance.md +0 -0
  45. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/ml_reference.md +0 -0
  46. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/related.md +0 -0
  47. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/research-workflows.md +0 -0
  48. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/stylesheets/extra.css +0 -0
  49. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tour_of_numerical_methods.md +0 -0
  50. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/core_demo.md +0 -0
  51. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/data_analysis_demo.md +0 -0
  52. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/diffeq_demo.md +0 -0
  53. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/fft2_demo.md +0 -0
  54. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/graph_demo.md +0 -0
  55. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_demo.md +0 -0
  56. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_tests_demo.md +0 -0
  57. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
  58. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/knowledge_demo.md +0 -0
  59. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/linalg_demo.md +0 -0
  60. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/math_utils_demo.md +0 -0
  61. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_advanced_demo.md +0 -0
  62. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_and_viz_demo.md +0 -0
  63. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_demo.md +0 -0
  64. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/modeling_demo.md +0 -0
  65. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/montecarlo_demo.md +0 -0
  66. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_attention_demo.md +0 -0
  67. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_bpe_demo.md +0 -0
  68. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
  69. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_viz.md +0 -0
  70. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/numerical_integration_demo.md +0 -0
  71. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/optimization_demo.md +0 -0
  72. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/pandas_io_demo.md +0 -0
  73. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/pca_demo.md +0 -0
  74. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/probability_demo.md +0 -0
  75. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/quantum_demo.md +0 -0
  76. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/quick_start.md +0 -0
  77. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/scientific_demo.md +0 -0
  78. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/signals_demo.md +0 -0
  79. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/stats_demo.md +0 -0
  80. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/stiff_ode_demo.md +0 -0
  81. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/time_series_demo.md +0 -0
  82. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/why-pure-python.md +0 -0
  83. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/core_demo.py +0 -0
  84. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/data_analysis_demo.py +0 -0
  85. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/diffeq_demo.py +0 -0
  86. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/discovery_pipeline_demo.py +0 -0
  87. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/ensemble_showcase.py +0 -0
  88. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/fft2_demo.py +0 -0
  89. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/graph_demo.py +0 -0
  90. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_custom_generator.py +0 -0
  91. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_demo.py +0 -0
  92. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_tests_demo.py +0 -0
  93. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_with_stats_demo.py +0 -0
  94. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/interpolate_demo.py +0 -0
  95. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/knowledge_demo.py +0 -0
  96. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/linalg_demo.py +0 -0
  97. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/math_utils_demo.py +0 -0
  98. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/ml_and_viz_demo.py +0 -0
  99. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/modeling_demo.py +0 -0
  100. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/montecarlo_demo.py +0 -0
  101. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_attention_demo.py +0 -0
  102. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_bpe_demo.py +0 -0
  103. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_mini_gpt_demo.py +0 -0
  104. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_viz_demo.py +0 -0
  105. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/numerical_integration_demo.py +0 -0
  106. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/optimization_demo.py +0 -0
  107. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/pca_demo.py +0 -0
  108. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/pde_demo.py +0 -0
  109. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/plot_demo.py +0 -0
  110. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/plotting_notebook.ipynb +0 -0
  111. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/probability_demo.py +0 -0
  112. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/quantum_demo.py +0 -0
  113. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/scientific_demo.py +0 -0
  114. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/signals_demo.py +0 -0
  115. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/stats_demo.py +0 -0
  116. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/tour_of_numerical_methods.ipynb +0 -0
  117. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/index.js +0 -0
  118. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/mkdocs.yml +0 -0
  119. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/npm.test.js +0 -0
  120. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/paper.bib +0 -0
  121. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/paper.md +0 -0
  122. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements-build.lock +0 -0
  123. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements-dev.lock +0 -0
  124. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements.lock +0 -0
  125. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_release_toolchain.py +0 -0
  126. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_version_discipline.py +0 -0
  127. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_version_lockstep.py +0 -0
  128. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/publish.py +0 -0
  129. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_cli_install.py +0 -0
  130. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_cookbook.py +0 -0
  131. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_ml_reference.py +0 -0
  132. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_pypi_release.py +0 -0
  133. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_release_integrity.py +0 -0
  134. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/__init__.py +0 -0
  135. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/__main__.py +0 -0
  136. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/_paths.py +0 -0
  137. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/bayes/__init__.py +0 -0
  138. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/bayes/conjugate.py +0 -0
  139. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/causal.py +0 -0
  140. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/__init__.py +0 -0
  141. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/__main__.py +0 -0
  142. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_exit_codes.py +0 -0
  143. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_handlers.py +0 -0
  144. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_parser.py +0 -0
  145. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_style.py +0 -0
  146. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_system_info.py +0 -0
  147. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/__init__.py +0 -0
  148. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/_numeric.py +0 -0
  149. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/models.py +0 -0
  150. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/__init__.py +0 -0
  151. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/dataset.py +0 -0
  152. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/loader.py +0 -0
  153. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/pandas_io.py +0 -0
  154. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/transform.py +0 -0
  155. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/viz.py +0 -0
  156. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/__init__.py +0 -0
  157. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/scientific.py +0 -0
  158. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/streaming.py +0 -0
  159. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/__init__.py +0 -0
  160. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/_implicit.py +0 -0
  161. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/solvers.py +0 -0
  162. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/symplectic.py +0 -0
  163. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/fractals/__init__.py +0 -0
  164. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/fractals/sets.py +0 -0
  165. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/genetics/__init__.py +0 -0
  166. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/genetics/sequence.py +0 -0
  167. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/graph/__init__.py +0 -0
  168. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/graph/algorithms.py +0 -0
  169. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/__init__.py +0 -0
  170. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/evaluator.py +0 -0
  171. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/generator.py +0 -0
  172. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/mining.py +0 -0
  173. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/infotheory/__init__.py +0 -0
  174. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/infotheory/measures.py +0 -0
  175. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/interpolate/__init__.py +0 -0
  176. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/__init__.py +0 -0
  177. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/graph.py +0 -0
  178. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/notes.py +0 -0
  179. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/retrieval.py +0 -0
  180. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/__init__.py +0 -0
  181. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/calculus.py +0 -0
  182. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/linalg.py +0 -0
  183. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/special.py +0 -0
  184. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/svd.py +0 -0
  185. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/__init__.py +0 -0
  186. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/boosting.py +0 -0
  187. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/clustering.py +0 -0
  188. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/decomposition.py +0 -0
  189. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/ensemble.py +0 -0
  190. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/linear_models.py +0 -0
  191. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/metrics.py +0 -0
  192. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/model_selection.py +0 -0
  193. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/naive_bayes.py +0 -0
  194. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/neighbors.py +0 -0
  195. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/neural.py +0 -0
  196. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/preprocessing.py +0 -0
  197. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/tree.py +0 -0
  198. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/voting.py +0 -0
  199. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/__init__.py +0 -0
  200. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/_base.py +0 -0
  201. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/_nodes.py +0 -0
  202. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/expression.py +0 -0
  203. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/fitting.py +0 -0
  204. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/model.py +0 -0
  205. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/solver.py +0 -0
  206. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/__init__.py +0 -0
  207. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/markov.py +0 -0
  208. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/methods.py +0 -0
  209. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/__init__.py +0 -0
  210. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/attention.py +0 -0
  211. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/__init__.py +0 -0
  212. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/_grad.py +0 -0
  213. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/ops.py +0 -0
  214. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/tensor.py +0 -0
  215. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/bpe.py +0 -0
  216. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/data.py +0 -0
  217. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/embed.py +0 -0
  218. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/layers.py +0 -0
  219. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/model.py +0 -0
  220. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/optim.py +0 -0
  221. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/training.py +0 -0
  222. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/viz.py +0 -0
  223. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/numerical_integration/__init__.py +0 -0
  224. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/numerical_integration/quadrature.py +0 -0
  225. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/__init__.py +0 -0
  226. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/_metaheuristics.py +0 -0
  227. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/constrained.py +0 -0
  228. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/minimize.py +0 -0
  229. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/pde/__init__.py +0 -0
  230. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/__init__.py +0 -0
  231. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/_backend.py +0 -0
  232. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/charts.py +0 -0
  233. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/__init__.py +0 -0
  234. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/_advanced.py +0 -0
  235. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/distributions.py +0 -0
  236. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/extra_distributions.py +0 -0
  237. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/provenance/__init__.py +0 -0
  238. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/provenance/manifest.py +0 -0
  239. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/py.typed +0 -0
  240. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/__init__.py +0 -0
  241. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/circuit.py +0 -0
  242. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/multi_qubit.py +0 -0
  243. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/simulator.py +0 -0
  244. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/__init__.py +0 -0
  245. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/constants.py +0 -0
  246. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/formulas.py +0 -0
  247. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/sensitivity.py +0 -0
  248. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/__init__.py +0 -0
  249. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/filters.py +0 -0
  250. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/processing.py +0 -0
  251. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/stft.py +0 -0
  252. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/wavelet.py +0 -0
  253. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/__init__.py +0 -0
  254. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/_distributions.py +0 -0
  255. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/bootstrap.py +0 -0
  256. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/descriptive.py +0 -0
  257. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/hypothesis_tests.py +0 -0
  258. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/multiple_testing.py +0 -0
  259. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/nonparametric.py +0 -0
  260. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/power.py +0 -0
  261. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/regression.py +0 -0
  262. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/time_series.py +0 -0
  263. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/__init__.py +0 -0
  264. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/adapters.py +0 -0
  265. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/registry.py +0 -0
  266. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/uncertainty/__init__.py +0 -0
  267. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/uncertainty/propagation.py +0 -0
  268. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/units/__init__.py +0 -0
  269. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/units/core.py +0 -0
  270. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/__init__.py +0 -0
  271. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/adequacy.py +0 -0
  272. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/drift.py +0 -0
  273. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/report.py +0 -0
  274. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/wavelets/__init__.py +0 -0
  275. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/wavelets/haar.py +0 -0
  276. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/__init__.py +0 -0
  277. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/engine.py +0 -0
  278. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/gates.py +0 -0
  279. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/orchestrator.py +0 -0
  280. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/selection.py +0 -0
  281. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/tooling.py +0 -0
  282. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/types.py +0 -0
  283. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/__init__.py +0 -0
  284. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/conftest.py +0 -0
  285. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_advanced_fitting.py +0 -0
  286. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_completion_coverage.py +0 -0
  287. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_guard_coverage.py +0 -0
  288. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening.py +0 -0
  289. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c1.py +0 -0
  290. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c2.py +0 -0
  291. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c3.py +0 -0
  292. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c4.py +0 -0
  293. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_coverage.py +0 -0
  294. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_h1.py +0 -0
  295. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_bayes_v2.py +0 -0
  296. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_benchmarks.py +0 -0
  297. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_bootstrap.py +0 -0
  298. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_causal.py +0 -0
  299. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli.py +0 -0
  300. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_color.py +0 -0
  301. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_exit_codes.py +0 -0
  302. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_extended.py +0 -0
  303. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_system_info.py +0 -0
  304. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_codemeta_version_lockstep.py +0 -0
  305. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_constrained_opt.py +0 -0
  306. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_core.py +0 -0
  307. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis.py +0 -0
  308. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis_lazy_bridge.py +0 -0
  309. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis_pandas_io.py +0 -0
  310. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io.py +0 -0
  311. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io_optional_backends.py +0 -0
  312. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io_scientific.py +0 -0
  313. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_dataset.py +0 -0
  314. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_dev_numpy_pin_contract.py +0 -0
  315. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_diffeq.py +0 -0
  316. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_diffeq_implicit.py +0 -0
  317. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_domain_validation.py +0 -0
  318. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_misc_numerical.py +0 -0
  319. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_ml_quantum_linalg.py +0 -0
  320. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_nlp.py +0 -0
  321. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_quantum_evaluator_cli.py +0 -0
  322. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_stats_optimization_signals.py +0 -0
  323. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_extra_distributions.py +0 -0
  324. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fft2.py +0 -0
  325. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fitting_bootstrap.py +0 -0
  326. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fractals.py +0 -0
  327. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_genetics.py +0 -0
  328. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_graph.py +0 -0
  329. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hardening_privacy_provenance.py +0 -0
  330. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis.py +0 -0
  331. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_engine.py +0 -0
  332. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_mining.py +0 -0
  333. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_tests.py +0 -0
  334. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_infotheory.py +0 -0
  335. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_interpolate.py +0 -0
  336. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_knowledge.py +0 -0
  337. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_layering.py +0 -0
  338. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_linalg_extended.py +0 -0
  339. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_linalg_qr_cholesky.py +0 -0
  340. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_markov.py +0 -0
  341. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_math_utils.py +0 -0
  342. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_boosting.py +0 -0
  343. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_clustering.py +0 -0
  344. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_ensemble.py +0 -0
  345. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_knn.py +0 -0
  346. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_linreg.py +0 -0
  347. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_logreg.py +0 -0
  348. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_metrics.py +0 -0
  349. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_model_selection.py +0 -0
  350. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_naive_bayes.py +0 -0
  351. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_pca.py +0 -0
  352. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_preprocessing.py +0 -0
  353. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_tree.py +0 -0
  354. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_viz.py +0 -0
  355. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_voting.py +0 -0
  356. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_modeling.py +0 -0
  357. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_modeling_fit_validation.py +0 -0
  358. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_montecarlo.py +0 -0
  359. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_multi_qubit.py +0 -0
  360. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_attention.py +0 -0
  361. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_autograd.py +0 -0
  362. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_bpe.py +0 -0
  363. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_embed.py +0 -0
  364. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_layers.py +0 -0
  365. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_model.py +0 -0
  366. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_training.py +0 -0
  367. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_viz.py +0 -0
  368. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_integration.py +0 -0
  369. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_invariants.py +0 -0
  370. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_oracles.py +0 -0
  371. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_optimization.py +0 -0
  372. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_optimization_metaheuristics.py +0 -0
  373. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_path_confinement.py +0 -0
  374. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_pde.py +0 -0
  375. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_plot_charts.py +0 -0
  376. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_plot_lazy.py +0 -0
  377. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_power.py +0 -0
  378. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_probability.py +0 -0
  379. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_probability_advanced.py +0 -0
  380. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_protocol_placeholders.py +0 -0
  381. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance.py +0 -0
  382. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance_audit_hardening.py +0 -0
  383. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance_claims.py +0 -0
  384. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_public_api.py +0 -0
  385. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_quantum.py +0 -0
  386. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_readme_badges.py +0 -0
  387. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_readme_surface.py +0 -0
  388. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_release_contract.py +0 -0
  389. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_release_toolchain.py +0 -0
  390. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_retrieval.py +0 -0
  391. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_runtime_dependency_graph.py +0 -0
  392. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_scientific.py +0 -0
  393. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_seed_hygiene.py +0 -0
  394. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_selection_audit_hardening.py +0 -0
  395. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_sensitivity.py +0 -0
  396. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_sensitivity_global.py +0 -0
  397. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_signals.py +0 -0
  398. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_signals_filters.py +0 -0
  399. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_special_invariants.py +0 -0
  400. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_special_numerics.py +0 -0
  401. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_statistical_audit.py +0 -0
  402. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats.py +0 -0
  403. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_audit_coverage.py +0 -0
  404. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_multiple_testing.py +0 -0
  405. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_nonparametric.py +0 -0
  406. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_time_series.py +0 -0
  407. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stft.py +0 -0
  408. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_streaming_analytics.py +0 -0
  409. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_svd.py +0 -0
  410. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_symplectic.py +0 -0
  411. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_tool_adapters.py +0 -0
  412. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_tools_registry.py +0 -0
  413. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_uncertainty.py +0 -0
  414. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_units.py +0 -0
  415. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation.py +0 -0
  416. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_adequacy.py +0 -0
  417. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_advanced.py +0 -0
  418. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_drift.py +0 -0
  419. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_verify_release_integrity.py +0 -0
  420. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_wavelet.py +0 -0
  421. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_wavelets_v2.py +0 -0
  422. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow.py +0 -0
  423. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_gates.py +0 -0
  424. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_orchestrator.py +0 -0
  425. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
  426. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_selection.py +0 -0
  427. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_selection_coverage.py +0 -0
  428. {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_tooling.py +0 -0
@@ -5,6 +5,26 @@ All notable changes to **scientific-computing-system** will be documented in thi
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [v2.2.8] - 2026-10-17
9
+
10
+ ### Scientific validation fail-closed thresholds
11
+
12
+ - Reject NaN and infinite tolerances for independent-method agreement and conservation.
13
+ - Reject non-finite OOD margins, distribution-drift thresholds, and residual diagnostic limits.
14
+ - Add regression coverage for these parameter-contract failures and align the public
15
+ version tuple with the synchronized release metadata.
16
+
17
+ ## [v2.2.7] - 2026-10-15
18
+
19
+ ### Housekeeping — version lockstep
20
+
21
+ - Release 2.2.7 (2026-10-15): records the production/Stable line against
22
+ which the repository's locked surfaces (codemeta.json, pyproject.toml,
23
+ package.json, `cds --version`) are verified by
24
+ `tests/test_codemeta_version_lockstep.py`.
25
+ - Bumps the npm shim to the same 2.2.7 line so both publish channels ship
26
+ at identical versions, as documented in the README "Install" section.
27
+
8
28
  ## [v2.2.6] - 2026-10-13
9
29
 
10
30
  ### Housekeeping — second-round neighbour sweep
@@ -5,7 +5,7 @@ title: "scientific-computing-system"
5
5
  # Keep `version` in lockstep with pyproject.toml [project].version and
6
6
  # src/cds/_version.py. scripts/check_version_discipline.py and
7
7
  # scripts/check_version_lockstep.py enforce this.
8
- version: 2.2.6
8
+ version: 2.2.8
9
9
  authors:
10
10
  - name: "Furox-Art"
11
11
  email: "furkanarkn1451@gmail.com"
@@ -50,5 +50,5 @@ preferred-citation:
50
50
  authors:
51
51
  - name: "Furox-Art"
52
52
  year: 2026
53
- version: 2.2.6
53
+ version: 2.2.8
54
54
  url: "https://github.com/Furox-Art/scientific-computing-system"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scientific-computing-system
3
- Version: 2.2.6
3
+ Version: 2.2.8
4
4
  Summary: A pure-Python computational science platform for numerical methods, modeling, validation, uncertainty, scientific workflows, dimensional analysis, and optional research-data backends. Zero runtime dependencies.
5
5
  Project-URL: Homepage, https://github.com/Furox-Art/scientific-computing-system
6
6
  Project-URL: Repository, https://github.com/Furox-Art/scientific-computing-system
@@ -2,7 +2,7 @@
2
2
  "@context": "https://doi.org/10.5063/schema/codemeta-2.0",
3
3
  "@type": "SoftwareSourceCode",
4
4
  "name": "scientific-computing-system",
5
- "version": "2.2.6",
5
+ "version": "2.2.8",
6
6
  "description": "Pure-Python computational science platform for numerical methods, modeling, validation, uncertainty, and scientific workflows. Zero runtime dependencies. This is the front door; scientific-computing-system-2.0 is the NumPy build of the same work.",
7
7
  "license": "https://spdx.org/licenses/MIT",
8
8
  "codeRepository": "https://github.com/Furox-Art/scientific-computing-system",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scientific-computing-system",
3
- "version": "2.2.6",
3
+ "version": "2.2.8",
4
4
  "description": "Scientific Computing System launcher - a thin Node wrapper that forwards to the pure-Python `cds` CLI. This npm package ships NO Python code: it requires the Python distribution to be installed (`pip install scientific-computing-system`), otherwise `scs` exits non-zero with an actionable message.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -2,7 +2,7 @@
2
2
  # Distribution name. Formerly published as "cognitive-discovery-system";
3
3
  # the import name stays `cds`. Keep the old PyPI project alive as an alias.
4
4
  name = "scientific-computing-system"
5
- version = "2.2.6"
5
+ version = "2.2.8"
6
6
  description = "A pure-Python computational science platform for numerical methods, modeling, validation, uncertainty, scientific workflows, dimensional analysis, and optional research-data backends. Zero runtime dependencies."
7
7
  readme = "README.md"
8
8
  license = "MIT"
@@ -5,5 +5,5 @@ from __future__ import annotations
5
5
 
6
6
  __all__ = ["__version__", "version", "__version_tuple__", "version_tuple"]
7
7
 
8
- __version__ = version = "2.2.6"
9
- __version_tuple__ = version_tuple = (2, 2, 0)
8
+ __version__ = version = "2.2.8"
9
+ __version_tuple__ = version_tuple = (2, 2, 8)
@@ -36,8 +36,8 @@ def cross_method_agreement(
36
36
  name: str = "cross-method-agreement",
37
37
  ) -> ValidationCheck:
38
38
  """Compare two independently obtained scalar results."""
39
- if rtol < 0 or atol < 0:
40
- raise ValueError("rtol and atol must be non-negative")
39
+ if not all(math.isfinite(value) and value >= 0 for value in (rtol, atol)):
40
+ raise ValueError("rtol and atol must be finite and non-negative")
41
41
  if not (math.isfinite(primary) and math.isfinite(secondary)):
42
42
  return ValidationCheck(
43
43
  name=name,
@@ -78,7 +78,14 @@ def check_bounds(
78
78
  violations = [
79
79
  index
80
80
  for index, (value, (lower, upper)) in enumerate(zip(values, bounds))
81
- if value < lower or value > upper
81
+ if (
82
+ not math.isfinite(value)
83
+ or not math.isfinite(lower)
84
+ or not math.isfinite(upper)
85
+ or lower > upper
86
+ or value < lower
87
+ or value > upper
88
+ )
82
89
  ]
83
90
  if violations:
84
91
  return ValidationCheck(
@@ -130,8 +137,8 @@ def check_conservation(
130
137
  name: str = "conservation",
131
138
  ) -> ValidationCheck:
132
139
  """Check a scalar conservation law such as mass, charge, or energy."""
133
- if rtol < 0 or atol < 0:
134
- raise ValueError("rtol and atol must be non-negative")
140
+ if not all(math.isfinite(value) and value >= 0 for value in (rtol, atol)):
141
+ raise ValueError("rtol and atol must be finite and non-negative")
135
142
  if not (math.isfinite(before) and math.isfinite(after)):
136
143
  return ValidationCheck(
137
144
  name=name,
@@ -258,8 +265,8 @@ def check_ood_ranges(
258
265
  """
259
266
  if not 0.0 <= allowed_fraction <= 1.0:
260
267
  raise ValueError("allowed_fraction must lie in [0, 1]")
261
- if margin_fraction < 0.0:
262
- raise ValueError("margin_fraction must be non-negative")
268
+ if not math.isfinite(margin_fraction) or margin_fraction < 0.0:
269
+ raise ValueError("margin_fraction must be finite and non-negative")
263
270
  if not training_rows:
264
271
  raise ValueError("training_rows must not be empty")
265
272
  width = len(training_rows[0])
@@ -319,10 +326,10 @@ def check_distribution_drift(
319
326
  name: str = "distribution-drift",
320
327
  ) -> ValidationCheck:
321
328
  """Detect large first/second-moment shifts between scalar distributions."""
322
- if max_standardized_mean_shift < 0:
323
- raise ValueError("max_standardized_mean_shift must be non-negative")
324
- if max_variance_ratio < 1.0:
325
- raise ValueError("max_variance_ratio must be >= 1")
329
+ if not math.isfinite(max_standardized_mean_shift) or max_standardized_mean_shift < 0:
330
+ raise ValueError("max_standardized_mean_shift must be finite and non-negative")
331
+ if not math.isfinite(max_variance_ratio) or max_variance_ratio < 1.0:
332
+ raise ValueError("max_variance_ratio must be finite and >= 1")
326
333
  if len(reference) < 2 or len(current) < 2:
327
334
  raise ValueError("drift check requires at least two values per sample")
328
335
  finite = check_finite([*reference, *current], name=name)
@@ -367,7 +374,10 @@ def check_residual_diagnostics(
367
374
  name: str = "residual-diagnostics",
368
375
  ) -> ValidationCheck:
369
376
  """Screen residual bias, lag-1 dependence, and scale instability."""
370
- if max_bias_z < 0 or max_abs_lag1 < 0 or max_variance_ratio < 1:
377
+ thresholds = (max_bias_z, max_abs_lag1, max_variance_ratio)
378
+ if not all(math.isfinite(value) for value in thresholds) or (
379
+ max_bias_z < 0 or max_abs_lag1 < 0 or max_variance_ratio < 1
380
+ ):
371
381
  raise ValueError("residual diagnostic thresholds are invalid")
372
382
  if len(residuals) < 4:
373
383
  return ValidationCheck(
@@ -0,0 +1,140 @@
1
+ """Deterministic invariant tests for the public numeric surface.
2
+
3
+ Numerical code is "deterministic" only if its invariants hold on every input
4
+ you care about, not just on the examples in the docs. These tests sweep small
5
+ integer/rational inputs so the identities below hold exactly (or within the
6
+ module's own documented tolerance), so a regression shows up as a failed
7
+ identity instead of a silently wrong number:
8
+
9
+ - mat_mul is associative and distributes over addition
10
+ - transpose(transpose(M)) == M
11
+ - det(AB) == det(A) * det(B)
12
+ - solve_linear(A, b) reproduces b (residual bound)
13
+ - PMFs sum to 1 over their support
14
+ - ODE/quadrature error decreases as the step count grows
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Any
20
+
21
+ import pytest
22
+
23
+ from cds.math_utils.linalg import determinant, identity, mat_mul, solve_linear, transpose
24
+ from cds.probability.distributions import binomial_pmf, geometric_pmf, poisson_pmf
25
+
26
+ #: Exact-arithmetic inputs keep every identity above exact for integers.
27
+ MATRICES = [
28
+ [[1]],
29
+ [[1, 2], [3, 4]],
30
+ [[2, 0, 1], [1, 3, 0], [0, 1, 2]],
31
+ [[-1, 2], [2, -1]],
32
+ [[3, 1, 4], [1, 5, 9], [2, 6, 5]],
33
+ ]
34
+
35
+
36
+ def _matmul_chain(*matrices: Any) -> Any:
37
+ result = matrices[0]
38
+ for m in matrices[1:]:
39
+ result = mat_mul(result, m)
40
+ return result
41
+
42
+
43
+ #: Mutually conformable operands for the binary laws (3x3 with 3x3, 2x2 with
44
+ #: 2x2) — a 2x2 times a 3x3 is not a legal product and is not what the
45
+ #: associativity law is about.
46
+ THREES = [
47
+ [[2, 0, 1], [1, 3, 0], [0, 1, 2]],
48
+ [[3, 1, 4], [1, 5, 9], [2, 6, 5]],
49
+ [[-1, 2, 0], [2, -1, 1], [0, 1, 3]],
50
+ ]
51
+ TWOS = [
52
+ [[1, 2], [3, 4]],
53
+ [[-1, 2], [2, -1]],
54
+ ]
55
+
56
+
57
+ @pytest.mark.parametrize(
58
+ "triple", [(a, b, c) for a in THREES for b in THREES[:2] for c in THREES[:2]]
59
+ )
60
+ def test_mat_mul_is_associative(triple: Any) -> None:
61
+ a, b, c = triple
62
+ assert _matmul_chain(a, b, c) == _matmul_chain(a, _matmul_chain(b, c))
63
+
64
+
65
+ @pytest.mark.parametrize("triple", [(a, b, c) for a in TWOS for b in TWOS for c in TWOS])
66
+ def test_mat_mul_is_associative_2x2(triple: Any) -> None:
67
+ a, b, c = triple
68
+ assert _matmul_chain(a, b, c) == _matmul_chain(a, _matmul_chain(b, c))
69
+
70
+
71
+ @pytest.mark.parametrize("matrix", MATRICES)
72
+ def test_transpose_twice_is_identity_on_values(matrix: Any) -> None:
73
+ assert transpose(transpose(matrix)) == matrix
74
+
75
+
76
+ @pytest.mark.parametrize("a", THREES)
77
+ @pytest.mark.parametrize("b", THREES[:2])
78
+ def test_determinant_of_product_equals_product_of_determinants(a: Any, b: Any) -> None:
79
+ assert determinant(mat_mul(a, b)) == pytest.approx(determinant(a) * determinant(b))
80
+
81
+
82
+ @pytest.mark.parametrize("a", TWOS)
83
+ @pytest.mark.parametrize("b", TWOS)
84
+ def test_determinant_of_product_equals_product_of_determinants_2x2(a: Any, b: Any) -> None:
85
+ assert determinant(mat_mul(a, b)) == pytest.approx(determinant(a) * determinant(b))
86
+
87
+
88
+ @pytest.mark.parametrize("matrix", MATRICES[1:4])
89
+ def test_solve_linear_reproduces_the_rhs(matrix: Any) -> None:
90
+ n = len(matrix)
91
+ rhs = [float(i + 1) for i in range(n)]
92
+ x = solve_linear(matrix, rhs)
93
+ product = mat_mul(matrix, [[v] for v in x])
94
+ assert [row[0] for row in product] == pytest.approx(rhs, abs=1e-9)
95
+
96
+
97
+ @pytest.mark.parametrize("rate", [0.1, 0.5, 1.0, 5.0])
98
+ def test_poisson_pmf_sums_to_one(rate: float) -> None:
99
+ total = sum(poisson_pmf(k, rate) for k in range(200))
100
+ assert total == pytest.approx(1.0, abs=1e-6)
101
+
102
+
103
+ @pytest.mark.parametrize("n", [1, 2, 5, 10])
104
+ @pytest.mark.parametrize("p", [0.2, 0.5, 0.9])
105
+ def test_binomial_pmf_sums_to_one(n: int, p: float) -> None:
106
+ total = sum(binomial_pmf(k, n, p) for k in range(n + 1))
107
+ assert total == pytest.approx(1.0, abs=1e-9)
108
+
109
+
110
+ @pytest.mark.parametrize("p", [0.1, 0.5, 0.9])
111
+ def test_geometric_pmf_sums_to_one(p: float) -> None:
112
+ total = sum(geometric_pmf(k, p) for k in range(1, 500))
113
+ assert total == pytest.approx(1.0, abs=1e-6)
114
+
115
+
116
+ def _add(a: Any, b: Any) -> Any:
117
+ """Matrix addition; there is no mat_add in the public surface."""
118
+ return [[x + y for x, y in zip(ra, rb)] for ra, rb in zip(a, b)]
119
+
120
+
121
+ def test_distributive_law() -> None:
122
+ # Three mutually conformable 3x3 operands.
123
+ a: Any = [[1, 2, 3], [4, 5, 6], [7, 8, 10]]
124
+ b: Any = [[2, 0, 1], [1, 3, 0], [0, 1, 2]]
125
+ c: Any = [[3, 1, 4], [1, 5, 9], [2, 6, 5]]
126
+ assert mat_mul(a, _add(b, c)) == _add(mat_mul(a, b), mat_mul(a, c))
127
+
128
+
129
+ def test_identity_is_the_neutral_element() -> None:
130
+ m: Any = MATRICES[4]
131
+ assert mat_mul(m, identity(len(m))) == m
132
+
133
+
134
+ def test_double_inverse_round_trip() -> None:
135
+ from cds.math_utils.linalg import matrix_inverse
136
+
137
+ m: Any = MATRICES[2]
138
+ twice = matrix_inverse(matrix_inverse(m))
139
+ for got, want in zip(twice, m):
140
+ assert got == pytest.approx(want, abs=1e-9)
@@ -0,0 +1,27 @@
1
+ """Bounds validation must fail closed on non-finite data or invalid intervals."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+
7
+ from cds.validation import CheckStatus, check_bounds
8
+
9
+
10
+ def test_nonfinite_values_do_not_pass_domain_bounds() -> None:
11
+ result = check_bounds([math.nan, math.inf, -math.inf, 1.0], [(0.0, 2.0)] * 4)
12
+ assert result.status is CheckStatus.FAIL
13
+ assert result.details["violations"] == [0, 1, 2]
14
+
15
+
16
+ def test_nonfinite_bound_and_reversed_interval_do_not_pass() -> None:
17
+ result = check_bounds(
18
+ [1.0, 1.0, 1.0, 1.0],
19
+ [(math.nan, 2.0), (0.0, math.inf), (2.0, 0.0), (0.0, 2.0)],
20
+ )
21
+ assert result.status is CheckStatus.FAIL
22
+ assert result.details["violations"] == [0, 1, 2]
23
+
24
+
25
+ def test_finite_boundary_values_remain_inclusive() -> None:
26
+ result = check_bounds([0.0, 2.0], [(0.0, 2.0)] * 2)
27
+ assert result.status is CheckStatus.PASS
@@ -0,0 +1,57 @@
1
+ """Non-finite tolerance settings must never certify invalid scientific results."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from collections.abc import Callable
7
+
8
+ import pytest
9
+
10
+ from cds.validation.checks import (
11
+ check_conservation,
12
+ check_distribution_drift,
13
+ check_ood_ranges,
14
+ check_residual_diagnostics,
15
+ cross_method_agreement,
16
+ )
17
+
18
+
19
+ @pytest.mark.parametrize("threshold", [math.nan, math.inf, -math.inf])
20
+ @pytest.mark.parametrize("parameter", ["rtol", "atol"])
21
+ @pytest.mark.parametrize("check", [cross_method_agreement, check_conservation])
22
+ def test_tolerances_reject_nonfinite_values(
23
+ check: Callable[..., object], parameter: str, threshold: float
24
+ ) -> None:
25
+ with pytest.raises(ValueError, match="rtol and atol"):
26
+ check(1.0, 2.0, **{parameter: threshold})
27
+
28
+
29
+ @pytest.mark.parametrize("margin", [math.nan, math.inf, -math.inf])
30
+ def test_ood_margin_must_be_finite(margin: float) -> None:
31
+ with pytest.raises(ValueError, match="margin_fraction"):
32
+ check_ood_ranges([[1.0], [2.0]], [[100.0]], margin_fraction=margin)
33
+
34
+
35
+ @pytest.mark.parametrize("threshold", [math.nan, math.inf, -math.inf])
36
+ @pytest.mark.parametrize("parameter", ["max_standardized_mean_shift", "max_variance_ratio"])
37
+ def test_drift_thresholds_reject_nonfinite(parameter: str, threshold: float) -> None:
38
+ with pytest.raises(ValueError, match=parameter):
39
+ if parameter == "max_standardized_mean_shift":
40
+ check_distribution_drift(
41
+ [1.0, 2.0], [10.0, 11.0], max_standardized_mean_shift=threshold
42
+ )
43
+ else:
44
+ check_distribution_drift([1.0, 2.0], [10.0, 11.0], max_variance_ratio=threshold)
45
+
46
+
47
+ @pytest.mark.parametrize("threshold", [math.nan, math.inf, -math.inf])
48
+ @pytest.mark.parametrize("parameter", ["max_bias_z", "max_abs_lag1", "max_variance_ratio"])
49
+ def test_residual_thresholds_reject_nonfinite(parameter: str, threshold: float) -> None:
50
+ with pytest.raises(ValueError, match="residual diagnostic thresholds"):
51
+ residuals = [1.0, -1.0, 2.0, -2.0]
52
+ if parameter == "max_bias_z":
53
+ check_residual_diagnostics(residuals, max_bias_z=threshold)
54
+ elif parameter == "max_abs_lag1":
55
+ check_residual_diagnostics(residuals, max_abs_lag1=threshold)
56
+ else:
57
+ check_residual_diagnostics(residuals, max_variance_ratio=threshold)
@@ -1,277 +0,0 @@
1
- """Hypothesis-driven property-based tests.
2
-
3
- Where ``test_numerical_invariants.py`` rolls its own ``random.Random`` loop
4
- (zero new dependencies, fixed seed, fixed trial count), this module leans on
5
- the `Hypothesis <https://hypothesis.readthedocs.io/>`_ library to do real
6
- property-based testing: Hypothesis *searches* the input space for a failing
7
- example and then *shrinks* any failure to the smallest input that still
8
- reproduces it. That catches edge cases a hand-picked seed will miss — empty
9
- lists, single-element lists, integers at 0, vectors that are near-singular,
10
- and so on.
11
-
12
- This suite is optional: it only runs when Hypothesis is installed
13
- (``pip install ".[property]"`` or ``[all]``). CI gates it behind a dedicated
14
- job (see ``.github/workflows/tests.yml``) so a missing dependency never breaks
15
- the default ``[test]`` matrix. The module-level guard below makes that safe:
16
- without Hypothesis, every test skips rather than erroring on import.
17
-
18
- Properties covered (6 domains):
19
- 1. Linear algebra — inverse round-trip (A·A⁻¹ = I), transpose involution.
20
- 2. Descriptive statistics — variance is non-negative, median lies in range,
21
- mean is homogeneous under positive scaling.
22
- 3. Numerical calculus — derivative is linear (af+bg)' = af' + bg',
23
- derivative of a constant is zero.
24
- 4. Signals — FFT ⇄ IFFT round-trip recovers the input, Parseval energy.
25
- 5. Optimization — gradient descent never increases a convex quadratic.
26
- 6. Probability — a PMF built from arbitrary non-negative weights sums to 1,
27
- and its cumulative sum is monotone non-decreasing.
28
- """
29
-
30
- from __future__ import annotations
31
-
32
- import math
33
-
34
- import pytest
35
-
36
- # Every import below runs after the ``importorskip`` guard, so module-level
37
- # placement triggers E402. That's intentional and correct here: we *cannot*
38
- # import Hypothesis before confirming it's installed. Each line carries its
39
- # own ``noqa: E402`` so ruff's import sorter (I001) and the E402 rule both
40
- # stay satisfied.
41
- hypothesis = pytest.importorskip("hypothesis") # noqa: E402
42
- from hypothesis import given, settings # noqa: E402
43
- from hypothesis import strategies as st # noqa: E402
44
- from hypothesis.strategies import SearchStrategy # noqa: E402
45
-
46
- from cds.math_utils.calculus import derivative # noqa: E402
47
- from cds.math_utils.linalg import ( # noqa: E402
48
- identity,
49
- mat_mul,
50
- matrix_inverse,
51
- transpose,
52
- )
53
- from cds.signals.processing import fft as fft_func # noqa: E402
54
- from cds.signals.processing import ifft as ifft_func # noqa: E402
55
- from cds.stats.descriptive import mean, median, variance # noqa: E402
56
-
57
- # A modest example budget keeps the suite fast in CI while still exercising
58
- # Hypothesis's search + shrink loop. The default (100) would be fine too; we
59
- # tune down because each property here runs a numerical kernel (FFT, matrix
60
- # inverse) rather than a cheap predicate.
61
- MAX_EXAMPLES = 50
62
-
63
-
64
- # --------------------------------------------------------------------------- #
65
- # Shared strategies
66
- # --------------------------------------------------------------------------- #
67
- def finite_floats(
68
- lo: float = -1e6, hi: float = 1e6, allow_nan: bool = False
69
- ) -> SearchStrategy[float]:
70
- """Finite, non-NaN floats in [lo, hi].
71
-
72
- NaN/inf are valid Python floats but they break every numerical invariant
73
- (NaN != NaN, inf - inf = NaN). Excluding them keeps the properties about
74
- the *algorithm* rather than IEEE-754 edge cases, which the example-based
75
- suite already covers explicitly.
76
- """
77
- return st.floats(min_value=lo, max_value=hi, allow_nan=allow_nan, allow_infinity=False)
78
-
79
-
80
- @st.composite
81
- def square_matrix(draw: st.DrawFn, n_min: int = 1, n_max: int = 5) -> list[list[float]]:
82
- """A random square matrix with moderate-magnitude entries.
83
-
84
- Bounded magnitude (±10) keeps matrices far from the overflow/underflow
85
- frontier where float error alone can flip a singularity check.
86
- """
87
- n = draw(st.integers(min_value=n_min, max_value=n_max))
88
- return [[draw(finite_floats(-10.0, 10.0)) for _ in range(n)] for _ in range(n)]
89
-
90
-
91
- @st.composite
92
- def power_of_two_length(draw: st.DrawFn, exp_min: int = 1, exp_max: int = 7) -> int:
93
- """A length that is a power of two (the FFT radix-2 constraint)."""
94
- return 1 << draw(st.integers(min_value=exp_min, max_value=exp_max))
95
-
96
-
97
- # --------------------------------------------------------------------------- #
98
- # 1. Linear algebra
99
- # --------------------------------------------------------------------------- #
100
- class TestLinAlgProperties:
101
- @given(mat=square_matrix(n_min=2, n_max=4))
102
- @settings(max_examples=MAX_EXAMPLES)
103
- def test_transpose_is_involution(self, mat: list[list[float]]) -> None:
104
- # (Aᵀ)ᵀ = A for every matrix.
105
- assert transpose(transpose(mat)) == mat
106
-
107
- @given(mat=square_matrix(n_min=2, n_max=4))
108
- @settings(max_examples=MAX_EXAMPLES)
109
- def test_inverse_times_original_is_identity(self, mat: list[list[float]]) -> None:
110
- # A·A⁻¹ = I, provided A is invertible. We compute the determinant and
111
- # skip near-singular matrices (|det| below a floor) — those are a
112
- # property of the *precondition*, not of the inverse routine.
113
- from cds.math_utils.linalg import determinant
114
-
115
- if abs(determinant(mat)) < 1e-3:
116
- return # skip: invertibility precondition not met
117
- n = len(mat)
118
- prod = mat_mul(matrix_inverse(mat), mat)
119
- ident = identity(n)
120
- for i in range(n):
121
- for j in range(n):
122
- assert math.isclose(prod[i][j], ident[i][j], abs_tol=1e-6)
123
-
124
-
125
- # --------------------------------------------------------------------------- #
126
- # 2. Descriptive statistics
127
- # --------------------------------------------------------------------------- #
128
- class TestStatsProperties:
129
- @given(data=st.lists(finite_floats(-1e4, 1e4), min_size=2, max_size=50))
130
- @settings(max_examples=MAX_EXAMPLES)
131
- def test_variance_non_negative(self, data: list[float]) -> None:
132
- # Variance is a sum of squares over a count — always ≥ 0. A negative
133
- # result would flag a catastrophic-cancellation bug in the formula.
134
- assert variance(data, ddof=0) >= -1e-9
135
-
136
- @given(data=st.lists(finite_floats(-1e4, 1e4), min_size=1, max_size=50))
137
- @settings(max_examples=MAX_EXAMPLES)
138
- def test_median_within_data_range(self, data: list[float]) -> None:
139
- # The median of a set can never lie outside [min, max] of that set.
140
- m = median(data)
141
- assert min(data) - 1e-9 <= m <= max(data) + 1e-9
142
-
143
- @given(
144
- data=st.lists(finite_floats(-1e3, 1e3), min_size=1, max_size=30),
145
- scale=finite_floats(0.1, 10.0),
146
- )
147
- @settings(max_examples=MAX_EXAMPLES)
148
- def test_mean_is_homogeneous(self, data: list[float], scale: float) -> None:
149
- # mean(c·x) = c·mean(x) — linearity of the arithmetic mean under
150
- # positive scalar scaling. Negative/zero scale would be just as valid
151
- # but flipping the sign on an odd-length list complicates the bound.
152
- # When mean(x) ≈ 0 (e.g. symmetric data like [342, -342]) the relative
153
- # error of c·mean(x) blows up even though the absolute error is at the
154
- # round-off floor, so anchor with an abs_tol in addition to rel_tol.
155
- assert math.isclose(
156
- mean([scale * x for x in data]),
157
- scale * mean(data),
158
- rel_tol=1e-9,
159
- abs_tol=1e-9,
160
- )
161
-
162
-
163
- # --------------------------------------------------------------------------- #
164
- # 3. Numerical calculus
165
- # --------------------------------------------------------------------------- #
166
- class TestCalculusProperties:
167
- @given(
168
- a=finite_floats(-5.0, 5.0),
169
- b=finite_floats(-5.0, 5.0),
170
- x=finite_floats(-3.0, 3.0),
171
- )
172
- @settings(max_examples=MAX_EXAMPLES)
173
- def test_derivative_is_linear(self, a: float, b: float, x: float) -> None:
174
- # (a·f + b·g)' = a·f' + b·g'. Use f(t)=t² and g(t)=sin(t) so both
175
- # branches of the central-difference formula are exercised.
176
- def f(t: float) -> float:
177
- return t * t
178
-
179
- def g(t: float) -> float:
180
- return math.sin(t)
181
-
182
- def combo(t: float) -> float:
183
- return a * f(t) + b * g(t)
184
-
185
- lhs = derivative(combo, x)
186
- rhs = a * derivative(f, x) + b * derivative(g, x)
187
- assert math.isclose(lhs, rhs, rel_tol=1e-5, abs_tol=1e-5)
188
-
189
- @given(c=finite_floats(-100.0, 100.0), x=finite_floats(-10.0, 10.0))
190
- @settings(max_examples=MAX_EXAMPLES)
191
- def test_derivative_of_constant_is_zero(self, c: float, x: float) -> None:
192
- # d/dx [c] = 0. Central difference must recover this to within the
193
- # cancellation noise of subtracting two equal-valued evaluations.
194
- assert abs(derivative(lambda _t: c, x)) < 1e-5
195
-
196
-
197
- # --------------------------------------------------------------------------- #
198
- # 4. Signals
199
- # --------------------------------------------------------------------------- #
200
- class TestSignalProperties:
201
- @given(n=power_of_two_length(exp_min=1, exp_max=6))
202
- @settings(max_examples=MAX_EXAMPLES)
203
- def test_fft_ifft_roundtrip(self, n: int) -> None:
204
- # ifft(fft(x)) == x (within float noise). Power-of-two length is the
205
- # radix-2 contract; non-power-of-two falls back to the DFT path which
206
- # is covered by the example-based suite.
207
- x = [math.sin(i) * 0.5 for i in range(n)]
208
- recon = ifft_func(fft_func(list(x)))
209
- for r, xi in zip(recon, x):
210
- assert math.isclose(r.real, xi, rel_tol=1e-7, abs_tol=1e-7)
211
- assert abs(r.imag) < 1e-7
212
-
213
- @given(n=power_of_two_length(exp_min=2, exp_max=6))
214
- @settings(max_examples=MAX_EXAMPLES)
215
- def test_parseval_energy_conservation(self, n: int) -> None:
216
- # Σ|x[n]|² = (1/N)·Σ|X[k]|². Energy is conserved across the DFT.
217
- x = [math.cos(i) for i in range(n)]
218
- spec = fft_func(list(x))
219
- time_energy = sum(abs(xi) ** 2 for xi in x)
220
- freq_energy = sum(abs(xk) ** 2 for xk in spec) / n
221
- assert math.isclose(time_energy, freq_energy, rel_tol=1e-6)
222
-
223
-
224
- # --------------------------------------------------------------------------- #
225
- # 5. Optimization
226
- # --------------------------------------------------------------------------- #
227
- class TestOptimizationProperties:
228
- @given(
229
- x_star=finite_floats(-5.0, 5.0),
230
- x0=finite_floats(-5.0, 5.0),
231
- )
232
- @settings(max_examples=MAX_EXAMPLES)
233
- def test_gradient_descent_reduces_convex_objective(self, x_star: float, x0: float) -> None:
234
- # On the convex quadratic f(x) = (x − x*)² the objective value after
235
- # gradient descent must not exceed the starting objective. Convexity
236
- # guarantees a descent direction; a rise would signal a sign flip in
237
- # the update step. Skip when x0 is already at the minimum.
238
- from cds.optimization.minimize import gradient_descent
239
-
240
- if abs(x0 - x_star) < 1e-3:
241
- return # skip: already at the global minimum
242
-
243
- def f(x: float, _xs: float = x_star) -> float:
244
- return (x - _xs) ** 2
245
-
246
- f_start = f(x0)
247
- result = gradient_descent(f, x0, lr=0.1, tol=1e-10, max_iter=500)
248
- assert result.value <= f_start + 1e-9
249
-
250
-
251
- # --------------------------------------------------------------------------- #
252
- # 6. Probability
253
- # --------------------------------------------------------------------------- #
254
- class TestProbabilityProperties:
255
- @given(weights=st.lists(finite_floats(0.01, 100.0), min_size=2, max_size=20))
256
- @settings(max_examples=MAX_EXAMPLES)
257
- def test_pmf_normalizes(self, weights: list[float]) -> None:
258
- # Any set of positive weights, divided by their sum, yields a PMF
259
- # that sums to exactly 1.
260
- total = sum(weights)
261
- pmf = [w / total for w in weights]
262
- assert math.isclose(sum(pmf), 1.0, abs_tol=1e-12)
263
-
264
- @given(weights=st.lists(finite_floats(0.01, 100.0), min_size=2, max_size=20))
265
- @settings(max_examples=MAX_EXAMPLES)
266
- def test_cdf_is_monotone(self, weights: list[float]) -> None:
267
- # The cumulative sum of a PMF is non-decreasing and ends at 1.
268
- total = sum(weights)
269
- pmf = [w / total for w in weights]
270
- cdf: list[float] = []
271
- acc = 0.0
272
- for p in pmf:
273
- acc += p
274
- cdf.append(acc)
275
- for prev, cur in zip(cdf, cdf[1:]):
276
- assert cur >= prev - 1e-12
277
- assert math.isclose(cdf[-1], 1.0, abs_tol=1e-12)