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.
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CHANGELOG.md +20 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CITATION.cff +2 -2
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/PKG-INFO +1 -1
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/codemeta.json +1 -1
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/package.json +1 -1
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/pyproject.toml +1 -1
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/_version.py +2 -2
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/checks.py +22 -12
- scientific_computing_system-2.2.8/tests/test_property_invariants.py +140 -0
- scientific_computing_system-2.2.8/tests/test_validation_bounds_nonfinite_regression.py +27 -0
- scientific_computing_system-2.2.8/tests/test_validation_nonfinite_thresholds_regression.py +57 -0
- scientific_computing_system-2.2.6/tests/test_property_invariants.py +0 -277
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/benchmarks.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/bot-reviewer.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/changelog.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/cli-package-smoke.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/codeql.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/npm-publish.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/pr-automation.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/pypi-registry-smoke.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/release.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.github/workflows/tests.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/.gitignore +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/CONTRIBUTING.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/LICENSE +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/README.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/SECURITY.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/results.json +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/robust_runner.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/benchmarks/run_benchmarks.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/bin/scs.js +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/dashboard/app.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/ARCHITECTURE.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/CASE_STUDY_HUBBLE.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/api.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/assets/icon.svg +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/assets/logo.svg +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/benchmarks.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/checks/verify_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/cookbook.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/getting-started.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/index.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/maintenance.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/ml_reference.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/related.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/research-workflows.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/stylesheets/extra.css +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tour_of_numerical_methods.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/core_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/data_analysis_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/diffeq_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/fft2_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/graph_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_tests_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/knowledge_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/linalg_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/math_utils_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_advanced_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_and_viz_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/ml_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/modeling_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/montecarlo_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_attention_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_bpe_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/nlp_viz.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/numerical_integration_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/optimization_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/pandas_io_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/pca_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/probability_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/quantum_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/quick_start.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/scientific_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/signals_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/stats_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/stiff_ode_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/tutorials/time_series_demo.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/docs/why-pure-python.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/core_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/data_analysis_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/diffeq_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/discovery_pipeline_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/ensemble_showcase.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/fft2_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/graph_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_custom_generator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_tests_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/hypothesis_with_stats_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/interpolate_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/knowledge_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/linalg_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/math_utils_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/ml_and_viz_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/modeling_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/montecarlo_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_attention_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_bpe_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_mini_gpt_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/nlp_viz_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/numerical_integration_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/optimization_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/pca_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/pde_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/plot_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/plotting_notebook.ipynb +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/probability_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/quantum_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/scientific_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/signals_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/stats_demo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/examples/tour_of_numerical_methods.ipynb +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/index.js +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/mkdocs.yml +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/npm.test.js +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/paper.bib +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/paper.md +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements-build.lock +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements-dev.lock +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/requirements.lock +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_version_discipline.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/check_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/publish.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_cli_install.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_cookbook.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_ml_reference.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_pypi_release.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/scripts/verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/__main__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/_paths.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/bayes/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/bayes/conjugate.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/causal.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/__main__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_exit_codes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_handlers.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_parser.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_style.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/cli/_system_info.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/_numeric.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/core/models.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/dataset.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/loader.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/pandas_io.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/transform.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_analysis/viz.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/scientific.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/data_io/streaming.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/_implicit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/solvers.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/diffeq/symplectic.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/fractals/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/fractals/sets.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/genetics/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/genetics/sequence.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/graph/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/graph/algorithms.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/evaluator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/generator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/hypothesis/mining.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/infotheory/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/infotheory/measures.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/interpolate/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/graph.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/notes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/knowledge/retrieval.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/calculus.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/linalg.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/special.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/math_utils/svd.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/boosting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/clustering.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/decomposition.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/ensemble.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/linear_models.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/metrics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/model_selection.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/naive_bayes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/neighbors.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/neural.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/preprocessing.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/tree.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/ml/voting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/_base.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/_nodes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/expression.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/fitting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/model.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/modeling/solver.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/markov.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/montecarlo/methods.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/attention.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/_grad.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/ops.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/autograd/tensor.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/bpe.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/data.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/embed.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/layers.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/model.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/optim.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/training.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/nlp/viz.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/numerical_integration/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/numerical_integration/quadrature.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/constrained.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/optimization/minimize.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/pde/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/_backend.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/plot/charts.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/_advanced.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/distributions.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/probability/extra_distributions.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/provenance/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/provenance/manifest.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/py.typed +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/circuit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/multi_qubit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/quantum/simulator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/constants.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/scientific/formulas.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/sensitivity.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/filters.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/processing.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/stft.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/signals/wavelet.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/_distributions.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/bootstrap.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/descriptive.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/multiple_testing.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/nonparametric.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/power.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/regression.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/stats/time_series.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/adapters.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/tools/registry.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/uncertainty/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/uncertainty/propagation.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/units/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/units/core.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/adequacy.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/drift.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/report.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/wavelets/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/wavelets/haar.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/engine.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/gates.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/orchestrator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/selection.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/tooling.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/workflow/types.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/__init__.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/conftest.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_advanced_fitting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_completion_coverage.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_guard_coverage.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c1.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c2.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c3.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_c4.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_coverage.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_audit_hardening_h1.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_bayes_v2.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_benchmarks.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_bootstrap.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_causal.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_color.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_exit_codes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_extended.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_cli_system_info.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_codemeta_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_constrained_opt.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_core.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis_lazy_bridge.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_analysis_pandas_io.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io_optional_backends.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_data_io_scientific.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_dataset.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_dev_numpy_pin_contract.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_diffeq.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_diffeq_implicit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_domain_validation.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_misc_numerical.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_ml_quantum_linalg.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_nlp.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_quantum_evaluator_cli.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_edge_stats_optimization_signals.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_extra_distributions.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fft2.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fitting_bootstrap.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_fractals.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_genetics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_graph.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hardening_privacy_provenance.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_engine.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_mining.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_infotheory.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_interpolate.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_knowledge.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_layering.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_linalg_extended.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_linalg_qr_cholesky.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_markov.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_math_utils.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_boosting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_clustering.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_ensemble.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_knn.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_linreg.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_logreg.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_metrics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_model_selection.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_naive_bayes.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_pca.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_preprocessing.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_tree.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_viz.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_ml_voting.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_modeling.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_modeling_fit_validation.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_montecarlo.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_multi_qubit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_attention.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_autograd.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_bpe.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_embed.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_layers.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_model.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_training.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_nlp_viz.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_integration.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_invariants.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_numerical_oracles.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_optimization.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_optimization_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_path_confinement.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_pde.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_plot_charts.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_plot_lazy.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_power.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_probability.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_probability_advanced.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_protocol_placeholders.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_public_api.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_quantum.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_readme_badges.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_readme_surface.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_release_contract.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_retrieval.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_runtime_dependency_graph.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_scientific.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_seed_hygiene.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_selection_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_sensitivity.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_sensitivity_global.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_signals.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_signals_filters.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_special_invariants.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_special_numerics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_statistical_audit.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_audit_coverage.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_multiple_testing.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_nonparametric.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stats_time_series.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_stft.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_streaming_analytics.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_svd.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_symplectic.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_tool_adapters.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_tools_registry.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_uncertainty.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_units.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_adequacy.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_advanced.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_validation_drift.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_wavelet.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_wavelets_v2.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_gates.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_orchestrator.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_selection.py +0 -0
- {scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/tests/test_workflow_selection_coverage.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
9
|
-
__version_tuple__ = version_tuple = (2, 2,
|
|
8
|
+
__version__ = version = "2.2.8"
|
|
9
|
+
__version_tuple__ = version_tuple = (2, 2, 8)
|
{scientific_computing_system-2.2.6 → scientific_computing_system-2.2.8}/src/cds/validation/checks.py
RENAMED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|
|
File without changes
|
|
File without changes
|