CodeEntropy 2.0.0__tar.gz → 2.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/daily.yaml +6 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/pr.yaml +64 -26
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/release.yaml +11 -5
- codeentropy-2.1.1/.github/workflows/weekly-regression.yaml +90 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.gitignore +1 -1
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CITATION.cff +2 -2
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/__init__.py +1 -1
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/argparse.py +20 -14
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/runtime.py +3 -3
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/core/logging.py +2 -3
- codeentropy-2.1.1/CodeEntropy/entropy/configurational.py +86 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/graph.py +13 -7
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/aggregate.py +9 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/configurational.py +17 -25
- codeentropy-2.1.1/CodeEntropy/entropy/nodes/orientational.py +84 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/vibrational.py +31 -14
- codeentropy-2.1.1/CodeEntropy/entropy/orientational.py +117 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/vibrational.py +36 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/water.py +9 -8
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/workflow.py +42 -18
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/axes.py +7 -7
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/dihedrals.py +138 -98
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/forces.py +18 -13
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/frame_dag.py +11 -11
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/hierarchy.py +7 -8
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/level_dag.py +22 -18
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/linalg.py +4 -5
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/mda.py +8 -9
- codeentropy-2.1.1/CodeEntropy/levels/neighbors.py +251 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/accumulators.py +12 -11
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/beads.py +12 -11
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/conformations.py +28 -13
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/covariance.py +45 -45
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/detect_levels.py +5 -5
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/detect_molecules.py +3 -3
- codeentropy-2.1.1/CodeEntropy/levels/nodes/find_neighbors.py +93 -0
- codeentropy-2.1.1/CodeEntropy/levels/search.py +241 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/molecules/grouping.py +7 -7
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/results/reporter.py +37 -38
- {codeentropy-2.0.0 → codeentropy-2.1.1}/PKG-INFO +7 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/README.md +3 -2
- {codeentropy-2.0.0 → codeentropy-2.1.1}/conda-recipe/meta.yaml +12 -6
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/conf.py +3 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/config.yaml +4 -1
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/developer_guide.rst +1 -1
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/getting_started.rst +17 -4
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/science.rst +33 -6
- {codeentropy-2.0.0 → codeentropy-2.1.1}/pyproject.toml +15 -3
- codeentropy-2.1.1/tests/__init__.py +1 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/combined_forcetorque_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/benzene/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/cyclohexane/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/dna/axes_off.json +61 -0
- codeentropy-2.1.1/tests/regression/baselines/dna/combined_forcetorque_off.json +61 -0
- codeentropy-2.0.0/tests/regression/baselines/dna.json → codeentropy-2.1.1/tests/regression/baselines/dna/default.json +16 -13
- codeentropy-2.1.1/tests/regression/baselines/dna/frame_window.json +61 -0
- codeentropy-2.1.1/tests/regression/baselines/dna/grouping_each.json +61 -0
- codeentropy-2.1.1/tests/regression/baselines/dna/selection_subset.json +61 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/axes_off.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/combined_forcetorque_off.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/default.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/frame_window.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/grouping_each.json +123 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/rad.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methane/selection_subset.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/combined_forcetorque_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/methanol/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/axes_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/combined_forcetorque_off.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/default.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/frame_window.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/grouping_each.json +153 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/rad.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/octonol/selection_subset.json +45 -0
- codeentropy-2.1.1/tests/regression/baselines/water/axes_off.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/combined_forcetorque_off.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/default.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/frame_window.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/grouping_each.json +123 -0
- codeentropy-2.1.1/tests/regression/baselines/water/rad.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/selection_subset.json +42 -0
- codeentropy-2.1.1/tests/regression/baselines/water/water_off.json +42 -0
- codeentropy-2.1.1/tests/regression/cases.py +103 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/combined_forcetorque_false.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/benzaldehyde/config.yaml → codeentropy-2.1.1/tests/regression/configs/benzaldehyde/rad.yaml +2 -0
- codeentropy-2.1.1/tests/regression/configs/benzaldehyde/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/benzene/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/benzene/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/benzene/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/benzene/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/benzene/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/benzene/config.yaml → codeentropy-2.1.1/tests/regression/configs/benzene/rad.yaml +4 -2
- codeentropy-2.1.1/tests/regression/configs/benzene/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/cyclohexane/config.yaml → codeentropy-2.1.1/tests/regression/configs/cyclohexane/rad.yaml +4 -2
- codeentropy-2.1.1/tests/regression/configs/cyclohexane/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/dna/axes_off.yaml +11 -0
- codeentropy-2.1.1/tests/regression/configs/dna/combined_forcetorque_off.yaml +11 -0
- codeentropy-2.0.0/tests/regression/configs/dna/config.yaml → codeentropy-2.1.1/tests/regression/configs/dna/default.yaml +1 -1
- codeentropy-2.1.1/tests/regression/configs/dna/frame_window.yaml +10 -0
- codeentropy-2.1.1/tests/regression/configs/dna/grouping_each.yaml +11 -0
- codeentropy-2.1.1/tests/regression/configs/dna/selection_subset.yaml +10 -0
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/ethyl-acetate/config.yaml → codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/rad.yaml +4 -2
- codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/methane/axes_off.yaml +16 -0
- codeentropy-2.1.1/tests/regression/configs/methane/combined_forcetorque_off.yaml +16 -0
- codeentropy-2.1.1/tests/regression/configs/methane/default.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/methane/frame_window.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/methane/grouping_each.yaml +16 -0
- codeentropy-2.0.0/tests/regression/configs/methane/config.yaml → codeentropy-2.1.1/tests/regression/configs/methane/rad.yaml +5 -3
- codeentropy-2.1.1/tests/regression/configs/methane/selection_subset.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/methanol/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/methanol/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/methanol/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/methanol/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/methanol/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/methanol/config.yaml → codeentropy-2.1.1/tests/regression/configs/methanol/rad.yaml +4 -2
- codeentropy-2.1.1/tests/regression/configs/methanol/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/octonol/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/octonol/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/octonol/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/octonol/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/octonol/grouping_each.yaml +15 -0
- codeentropy-2.0.0/tests/regression/configs/octonol/config.yaml → codeentropy-2.1.1/tests/regression/configs/octonol/rad.yaml +4 -2
- codeentropy-2.1.1/tests/regression/configs/octonol/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/water/axes_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/water/combined_forcetorque_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/water/default.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/water/frame_window.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/water/grouping_each.yaml +15 -0
- codeentropy-2.1.1/tests/regression/configs/water/rad.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/water/selection_subset.yaml +14 -0
- codeentropy-2.1.1/tests/regression/configs/water/water_off.yaml +15 -0
- codeentropy-2.1.1/tests/regression/conftest.py +84 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/regression/helpers.py +8 -9
- codeentropy-2.1.1/tests/regression/list_systems.py +12 -0
- codeentropy-2.1.1/tests/regression/test_regression.py +187 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_export_console.py +1 -1
- codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/nodes/test_orientational_node.py +39 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_vibrational_node.py +16 -7
- codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_configurational_edges.py +12 -0
- codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_configurational_entropy_math.py +25 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_graph.py +2 -0
- codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_orientational_entropy.py +34 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_vibrational_entropy_math.py +11 -2
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_workflow.py +23 -11
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_conformations_node.py +1 -1
- codeentropy-2.1.1/tests/unit/CodeEntropy/levels/nodes/test_find_neighbors.py +33 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_dihedrals.py +28 -9
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_forces_force_torque_calculator.py +29 -0
- codeentropy-2.1.1/tests/unit/CodeEntropy/levels/test_neighbors.py +489 -0
- codeentropy-2.1.1/tests/unit/CodeEntropy/levels/test_search.py +277 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/results/test_reporter.py +1 -2
- codeentropy-2.0.0/.github/workflows/weekly-regression.yaml +0 -52
- codeentropy-2.0.0/CodeEntropy/entropy/configurational.py +0 -266
- codeentropy-2.0.0/CodeEntropy/entropy/orientational.py +0 -158
- codeentropy-2.0.0/tests/__init__.py +0 -4
- codeentropy-2.0.0/tests/pytest.ini +0 -10
- codeentropy-2.0.0/tests/regression/baselines/benzaldehyde.json +0 -43
- codeentropy-2.0.0/tests/regression/baselines/benzene.json +0 -43
- codeentropy-2.0.0/tests/regression/baselines/cyclohexane.json +0 -43
- codeentropy-2.0.0/tests/regression/baselines/ethyl-acetate.json +0 -43
- codeentropy-2.0.0/tests/regression/baselines/methane.json +0 -40
- codeentropy-2.0.0/tests/regression/baselines/methanol.json +0 -43
- codeentropy-2.0.0/tests/regression/baselines/octonol.json +0 -43
- codeentropy-2.0.0/tests/regression/conftest.py +0 -46
- codeentropy-2.0.0/tests/regression/test_regression.py +0 -154
- codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_configurational_edges.py +0 -90
- codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_configurational_entropy_math.py +0 -120
- codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_orientational_entropy.py +0 -54
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/CONTRIBUTING.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/general_report.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/renovate.json +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/update-copyright-years-in-license-file.yaml +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/weekly-docs.yaml +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/.pre-commit-config.yaml +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CODE_OF_CONDUCT.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/__main__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/cli.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/core/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/molecules/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/results/__init__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/LICENSE +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/Makefile +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/README.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/README.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/custom.css +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/logos/biosim-codeentropy_logo_dark.png +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/logos/biosim-codeentropy_logo_light.png +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_templates/README.md +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.cli.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.argparse.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.runtime.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.core.logging.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.core.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.configurational.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.graph.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.aggregate.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.configurational.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.vibrational.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.orientational.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.vibrational.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.water.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.workflow.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.axes.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.dihedrals.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.forces.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.frame_dag.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.hierarchy.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.level_dag.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.linalg.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.mda.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.accumulators.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.beads.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.conformations.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.covariance.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.detect_levels.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.detect_molecules.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.molecules.grouping.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.molecules.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.results.reporter.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.results.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/modules.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/faq.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/index.rst +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/readthedocs.yml +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/cli/test___main__.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/cli/test_cli.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/conftest.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_build_parser.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_load_config.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_resolve.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_str2bool.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_validate_inputs.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/conftest.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_build_universe_branches.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_citation_data.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_create_job_folder.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_print_args_table.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_required_args.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_run_entropy_workflow_branches.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_runtime_properties.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_show_splash.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_unit_conversions.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_universe_io.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/conftest.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_configure_loggers.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_error_filter.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_get_console_singleton.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_handlers_setup.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_set_level.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/conftest.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_aggregate_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_configurational_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_water_entropy.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/conftest.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_build_beads_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_detect_levels_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_detect_molecules_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_frame_covariance_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_init_covariance_accumulators_node.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_axes.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_frame_graph.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_hierarchy_builder.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_orchestration.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_reduce.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_reduction.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_linalg_matrix_utils.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_mda_universe_operations.py +0 -0
- {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/molecules/test_grouping.py +0 -0
|
@@ -11,14 +11,16 @@ concurrency:
|
|
|
11
11
|
|
|
12
12
|
jobs:
|
|
13
13
|
unit:
|
|
14
|
-
name: Unit (${{ matrix.os }}, ${{ matrix.python-version }})
|
|
14
|
+
name: Unit (${{ matrix.os }}, py${{ matrix.python-version }})
|
|
15
15
|
runs-on: ${{ matrix.os }}
|
|
16
16
|
timeout-minutes: 30
|
|
17
|
+
|
|
17
18
|
strategy:
|
|
18
19
|
fail-fast: false
|
|
19
20
|
matrix:
|
|
20
21
|
os: [ubuntu-24.04, macos-15, windows-2025]
|
|
21
22
|
python-version: ["3.12", "3.13", "3.14"]
|
|
23
|
+
|
|
22
24
|
steps:
|
|
23
25
|
- name: Checkout
|
|
24
26
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
|
@@ -29,10 +31,10 @@ jobs:
|
|
|
29
31
|
python-version: ${{ matrix.python-version }}
|
|
30
32
|
cache: pip
|
|
31
33
|
|
|
32
|
-
- name: Install
|
|
34
|
+
- name: Install testing dependencies
|
|
33
35
|
run: |
|
|
34
36
|
python -m pip install --upgrade pip
|
|
35
37
|
python -m pip install -e .[testing]
|
|
36
38
|
|
|
37
|
-
- name:
|
|
38
|
-
run: python -m pytest tests/unit
|
|
39
|
+
- name: Run unit tests
|
|
40
|
+
run: python -m pytest tests/unit
|
|
@@ -17,12 +17,13 @@ jobs:
|
|
|
17
17
|
matrix:
|
|
18
18
|
os: [ubuntu-24.04, macos-15, windows-2025]
|
|
19
19
|
python-version: ["3.12", "3.13", "3.14"]
|
|
20
|
+
|
|
20
21
|
steps:
|
|
21
22
|
- name: Checkout
|
|
22
|
-
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
23
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
23
24
|
|
|
24
25
|
- name: Set up Python ${{ matrix.python-version }}
|
|
25
|
-
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
26
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
26
27
|
with:
|
|
27
28
|
python-version: ${{ matrix.python-version }}
|
|
28
29
|
cache: pip
|
|
@@ -33,19 +34,52 @@ jobs:
|
|
|
33
34
|
python -m pip install -e .[testing]
|
|
34
35
|
|
|
35
36
|
- name: Pytest (unit) • ${{ matrix.os }}, ${{ matrix.python-version }}
|
|
36
|
-
run: python -m pytest tests/unit
|
|
37
|
+
run: python -m pytest tests/unit
|
|
38
|
+
|
|
39
|
+
discover-systems:
|
|
40
|
+
name: Discover regression systems
|
|
41
|
+
runs-on: ubuntu-24.04
|
|
42
|
+
outputs:
|
|
43
|
+
systems: ${{ steps.set-systems.outputs.systems }}
|
|
44
|
+
|
|
45
|
+
steps:
|
|
46
|
+
- name: Checkout
|
|
47
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
48
|
+
|
|
49
|
+
- name: Set up Python 3.14
|
|
50
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
51
|
+
with:
|
|
52
|
+
python-version: "3.14"
|
|
53
|
+
cache: pip
|
|
54
|
+
|
|
55
|
+
- name: Install testing dependencies
|
|
56
|
+
run: |
|
|
57
|
+
python -m pip install --upgrade pip
|
|
58
|
+
python -m pip install -e .[testing]
|
|
59
|
+
|
|
60
|
+
- name: Discover systems
|
|
61
|
+
id: set-systems
|
|
62
|
+
run: |
|
|
63
|
+
SYSTEMS=$(python -m tests.regression.list_systems)
|
|
64
|
+
echo "systems=$SYSTEMS" >> $GITHUB_OUTPUT
|
|
37
65
|
|
|
38
66
|
regression-quick:
|
|
39
|
-
name: Regression (
|
|
40
|
-
needs: unit
|
|
67
|
+
name: Regression (fast) • ${{ matrix.system }}
|
|
68
|
+
needs: [unit, discover-systems]
|
|
41
69
|
runs-on: ubuntu-24.04
|
|
42
70
|
timeout-minutes: 35
|
|
71
|
+
|
|
72
|
+
strategy:
|
|
73
|
+
fail-fast: false
|
|
74
|
+
matrix:
|
|
75
|
+
system: ${{ fromJson(needs.discover-systems.outputs.systems) }}
|
|
76
|
+
|
|
43
77
|
steps:
|
|
44
78
|
- name: Checkout
|
|
45
|
-
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
79
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
46
80
|
|
|
47
81
|
- name: Set up Python 3.14
|
|
48
|
-
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
82
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
49
83
|
with:
|
|
50
84
|
python-version: "3.14"
|
|
51
85
|
cache: pip
|
|
@@ -54,28 +88,31 @@ jobs:
|
|
|
54
88
|
uses: actions/cache@v4
|
|
55
89
|
with:
|
|
56
90
|
path: .testdata
|
|
57
|
-
key: codeentropy-testdata
|
|
91
|
+
key: codeentropy-testdata-${{ runner.os }}-py314
|
|
58
92
|
|
|
59
|
-
- name: Install
|
|
93
|
+
- name: Install testing dependencies
|
|
60
94
|
run: |
|
|
61
95
|
python -m pip install --upgrade pip
|
|
62
96
|
python -m pip install -e .[testing]
|
|
63
97
|
|
|
64
|
-
- name:
|
|
65
|
-
run:
|
|
98
|
+
- name: Run fast regression tests (per system)
|
|
99
|
+
run: |
|
|
100
|
+
python -m pytest tests/regression \
|
|
101
|
+
-m "not slow" \
|
|
102
|
+
-n auto \
|
|
103
|
+
--dist=loadscope \
|
|
104
|
+
-k "${{ matrix.system }}" \
|
|
105
|
+
-vv \
|
|
106
|
+
--durations=20
|
|
66
107
|
|
|
67
108
|
- name: Upload artifacts (failure)
|
|
68
109
|
if: failure()
|
|
69
110
|
uses: actions/upload-artifact@v4
|
|
70
111
|
with:
|
|
71
|
-
name: quick-regression-failure
|
|
112
|
+
name: quick-regression-failure-${{ matrix.system }}
|
|
72
113
|
path: |
|
|
73
114
|
.testdata/**
|
|
74
|
-
|
|
75
|
-
/tmp/pytest-of-*/pytest-*/**/config.yaml
|
|
76
|
-
/tmp/pytest-of-*/pytest-*/**/codeentropy_stdout.txt
|
|
77
|
-
/tmp/pytest-of-*/pytest-*/**/codeentropy_stderr.txt
|
|
78
|
-
/tmp/pytest-of-*/pytest-*/**/codeentropy_output.json
|
|
115
|
+
/tmp/pytest-of-*/pytest-*/**
|
|
79
116
|
|
|
80
117
|
docs:
|
|
81
118
|
name: Docs
|
|
@@ -93,7 +130,7 @@ jobs:
|
|
|
93
130
|
python-version: "3.14"
|
|
94
131
|
cache: pip
|
|
95
132
|
|
|
96
|
-
- name: Install
|
|
133
|
+
- name: Install docs dependencies
|
|
97
134
|
run: |
|
|
98
135
|
python -m pip install --upgrade pip
|
|
99
136
|
python -m pip install -e .[docs]
|
|
@@ -114,23 +151,23 @@ jobs:
|
|
|
114
151
|
name: Pre-commit
|
|
115
152
|
runs-on: ubuntu-24.04
|
|
116
153
|
timeout-minutes: 15
|
|
154
|
+
|
|
117
155
|
steps:
|
|
118
156
|
- name: Checkout
|
|
119
|
-
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
157
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
120
158
|
|
|
121
159
|
- name: Set up Python 3.14
|
|
122
|
-
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
160
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
123
161
|
with:
|
|
124
162
|
python-version: "3.14"
|
|
125
163
|
cache: pip
|
|
126
164
|
|
|
127
|
-
- name: Install
|
|
165
|
+
- name: Install pre-commit dependencies
|
|
128
166
|
run: |
|
|
129
167
|
python -m pip install --upgrade pip
|
|
130
168
|
python -m pip install -e .[pre-commit]
|
|
131
169
|
|
|
132
170
|
- name: Run pre-commit
|
|
133
|
-
shell: bash
|
|
134
171
|
run: |
|
|
135
172
|
pre-commit install
|
|
136
173
|
pre-commit run --all-files || {
|
|
@@ -144,8 +181,9 @@ jobs:
|
|
|
144
181
|
needs: unit
|
|
145
182
|
runs-on: ubuntu-24.04
|
|
146
183
|
timeout-minutes: 30
|
|
184
|
+
|
|
147
185
|
steps:
|
|
148
|
-
- name: Checkout
|
|
186
|
+
- name: Checkout
|
|
149
187
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
150
188
|
|
|
151
189
|
- name: Set up Python 3.14
|
|
@@ -154,12 +192,12 @@ jobs:
|
|
|
154
192
|
python-version: "3.14"
|
|
155
193
|
cache: pip
|
|
156
194
|
|
|
157
|
-
- name: Install
|
|
195
|
+
- name: Install testing dependencies
|
|
158
196
|
run: |
|
|
159
197
|
python -m pip install --upgrade pip
|
|
160
198
|
python -m pip install -e .[testing]
|
|
161
199
|
|
|
162
|
-
- name: Run
|
|
200
|
+
- name: Run coverage
|
|
163
201
|
run: |
|
|
164
202
|
pytest tests/unit \
|
|
165
203
|
--cov CodeEntropy \
|
|
@@ -167,7 +205,7 @@ jobs:
|
|
|
167
205
|
--cov-report xml \
|
|
168
206
|
-q
|
|
169
207
|
|
|
170
|
-
- name: Upload to Coveralls
|
|
208
|
+
- name: Upload coverage to Coveralls
|
|
171
209
|
uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e
|
|
172
210
|
with:
|
|
173
211
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -163,30 +163,36 @@ jobs:
|
|
|
163
163
|
sed -i "s/^{% set version = \".*\" %}$/{% set version = \"${{ github.event.inputs.version }}\" %}/" conda-recipe/meta.yaml
|
|
164
164
|
grep '{% set version' conda-recipe/meta.yaml
|
|
165
165
|
|
|
166
|
-
- name: Setup Conda
|
|
166
|
+
- name: Setup Conda (conda-forge only)
|
|
167
167
|
uses: conda-incubator/setup-miniconda@v3
|
|
168
168
|
with:
|
|
169
169
|
miniforge-variant: Miniforge3
|
|
170
170
|
python-version: "3.12"
|
|
171
|
-
auto-activate
|
|
171
|
+
auto-activate: false
|
|
172
|
+
conda-remove-defaults: true
|
|
173
|
+
channels: conda-forge
|
|
174
|
+
channel-priority: strict
|
|
172
175
|
|
|
173
176
|
- name: Install build tools
|
|
174
177
|
shell: bash -l {0}
|
|
175
178
|
run: |
|
|
176
179
|
conda install -y conda-build anaconda-client
|
|
177
|
-
conda config --add channels conda-forge
|
|
178
|
-
conda config --set channel_priority strict
|
|
179
180
|
conda config --set anaconda_upload no
|
|
180
181
|
|
|
181
182
|
- name: Build package
|
|
182
183
|
shell: bash -l {0}
|
|
184
|
+
env:
|
|
185
|
+
PIP_NO_INDEX: "0"
|
|
183
186
|
run: |
|
|
187
|
+
PKG_PATH=$(conda build conda-recipe --output)
|
|
188
|
+
echo "PKG_PATH=$PKG_PATH" >> "$GITHUB_ENV"
|
|
184
189
|
conda build conda-recipe
|
|
190
|
+
test -f "$PKG_PATH"
|
|
191
|
+
echo "Built: $PKG_PATH"
|
|
185
192
|
|
|
186
193
|
- name: Upload to Anaconda
|
|
187
194
|
shell: bash -l {0}
|
|
188
195
|
env:
|
|
189
196
|
ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_TOKEN }}
|
|
190
197
|
run: |
|
|
191
|
-
PKG_PATH=$(conda build conda-recipe --output)
|
|
192
198
|
anaconda -t "$ANACONDA_API_TOKEN" upload "$PKG_PATH" --user CCPBioSim --force
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
name: Weekly Regression Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: '0 8 * * 1'
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: weekly-regression-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
discover:
|
|
14
|
+
name: Discover regression systems
|
|
15
|
+
runs-on: ubuntu-24.04
|
|
16
|
+
|
|
17
|
+
outputs:
|
|
18
|
+
systems: ${{ steps.set.outputs.systems }}
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
23
|
+
|
|
24
|
+
- name: Set up Python 3.14
|
|
25
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.14"
|
|
28
|
+
cache: pip
|
|
29
|
+
|
|
30
|
+
- name: Install testing dependencies
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
python -m pip install -e .[testing]
|
|
34
|
+
|
|
35
|
+
- name: Generate system matrix
|
|
36
|
+
id: set
|
|
37
|
+
run: |
|
|
38
|
+
systems=$(python -m tests.regression.list_systems)
|
|
39
|
+
echo "systems=$systems" >> $GITHUB_OUTPUT
|
|
40
|
+
|
|
41
|
+
regression:
|
|
42
|
+
name: Regression (${{ matrix.system }})
|
|
43
|
+
needs: discover
|
|
44
|
+
runs-on: ubuntu-24.04
|
|
45
|
+
timeout-minutes: 360
|
|
46
|
+
|
|
47
|
+
strategy:
|
|
48
|
+
fail-fast: false
|
|
49
|
+
matrix:
|
|
50
|
+
system: ${{ fromJson(needs.discover.outputs.systems) }}
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- name: Checkout
|
|
54
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
|
|
55
|
+
|
|
56
|
+
- name: Set up Python 3.14
|
|
57
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
|
|
58
|
+
with:
|
|
59
|
+
python-version: "3.14"
|
|
60
|
+
cache: pip
|
|
61
|
+
|
|
62
|
+
- name: Cache regression test data
|
|
63
|
+
uses: actions/cache@v4
|
|
64
|
+
with:
|
|
65
|
+
path: .testdata
|
|
66
|
+
key: codeentropy-testdata-${{ runner.os }}-py314
|
|
67
|
+
|
|
68
|
+
- name: Install testing dependencies
|
|
69
|
+
run: |
|
|
70
|
+
python -m pip install --upgrade pip
|
|
71
|
+
python -m pip install -e .[testing]
|
|
72
|
+
|
|
73
|
+
- name: Run regression tests (slow, per system)
|
|
74
|
+
run: |
|
|
75
|
+
pytest tests/regression \
|
|
76
|
+
-k "${{ matrix.system }}" \
|
|
77
|
+
--run-slow \
|
|
78
|
+
-n auto \
|
|
79
|
+
--dist=loadscope \
|
|
80
|
+
-vv \
|
|
81
|
+
--durations=20
|
|
82
|
+
|
|
83
|
+
- name: Upload regression artifacts (failure)
|
|
84
|
+
if: failure()
|
|
85
|
+
uses: actions/upload-artifact@v4
|
|
86
|
+
with:
|
|
87
|
+
name: regression-${{ matrix.system }}-artifacts
|
|
88
|
+
path: |
|
|
89
|
+
.testdata/**
|
|
90
|
+
/tmp/pytest-of-*/pytest-*/**
|
|
@@ -25,7 +25,7 @@ import glob
|
|
|
25
25
|
import logging
|
|
26
26
|
import os
|
|
27
27
|
from dataclasses import dataclass
|
|
28
|
-
from typing import Any
|
|
28
|
+
from typing import Any
|
|
29
29
|
|
|
30
30
|
import yaml
|
|
31
31
|
|
|
@@ -48,11 +48,11 @@ class ArgSpec:
|
|
|
48
48
|
help: str
|
|
49
49
|
default: Any = None
|
|
50
50
|
type: Any = None
|
|
51
|
-
action:
|
|
52
|
-
nargs:
|
|
51
|
+
action: str | None = None
|
|
52
|
+
nargs: str | None = None
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
ARG_SPECS:
|
|
55
|
+
ARG_SPECS: dict[str, ArgSpec] = {
|
|
56
56
|
"top_traj_file": ArgSpec(
|
|
57
57
|
type=str,
|
|
58
58
|
nargs="+",
|
|
@@ -145,6 +145,12 @@ ARG_SPECS: Dict[str, ArgSpec] = {
|
|
|
145
145
|
default=True,
|
|
146
146
|
help="Use bonded axes to rotate forces for UA level vibrational entropies",
|
|
147
147
|
),
|
|
148
|
+
"search_type": ArgSpec(
|
|
149
|
+
type=str,
|
|
150
|
+
default="RAD",
|
|
151
|
+
help="Type of neighbor search to use."
|
|
152
|
+
"Default RAD; grid search is also available",
|
|
153
|
+
),
|
|
148
154
|
}
|
|
149
155
|
|
|
150
156
|
|
|
@@ -159,7 +165,7 @@ class ConfigResolver:
|
|
|
159
165
|
- validating trajectory-related numeric parameters
|
|
160
166
|
"""
|
|
161
167
|
|
|
162
|
-
def __init__(self, arg_specs:
|
|
168
|
+
def __init__(self, arg_specs: dict[str, ArgSpec] | None = None) -> None:
|
|
163
169
|
"""Initialize the manager.
|
|
164
170
|
|
|
165
171
|
Args:
|
|
@@ -168,7 +174,7 @@ class ConfigResolver:
|
|
|
168
174
|
"""
|
|
169
175
|
self._arg_specs = dict(arg_specs or ARG_SPECS)
|
|
170
176
|
|
|
171
|
-
def load_config(self, directory_path: str) ->
|
|
177
|
+
def load_config(self, directory_path: str) -> dict[str, Any]:
|
|
172
178
|
"""Load the first YAML config file found in a directory.
|
|
173
179
|
|
|
174
180
|
The current behavior matches your existing workflow:
|
|
@@ -188,7 +194,7 @@ class ConfigResolver:
|
|
|
188
194
|
|
|
189
195
|
config_path = yaml_files[0]
|
|
190
196
|
try:
|
|
191
|
-
with open(config_path,
|
|
197
|
+
with open(config_path, encoding="utf-8") as file:
|
|
192
198
|
config = yaml.safe_load(file) or {"run1": {}}
|
|
193
199
|
logger.info("Loaded configuration from: %s", config_path)
|
|
194
200
|
return config
|
|
@@ -253,7 +259,7 @@ class ConfigResolver:
|
|
|
253
259
|
)
|
|
254
260
|
continue
|
|
255
261
|
|
|
256
|
-
kwargs:
|
|
262
|
+
kwargs: dict[str, Any] = {}
|
|
257
263
|
if spec.type is not None:
|
|
258
264
|
kwargs["type"] = spec.type
|
|
259
265
|
if spec.default is not None:
|
|
@@ -266,7 +272,7 @@ class ConfigResolver:
|
|
|
266
272
|
return parser
|
|
267
273
|
|
|
268
274
|
def resolve(
|
|
269
|
-
self, args: argparse.Namespace, run_config:
|
|
275
|
+
self, args: argparse.Namespace, run_config: dict[str, Any] | None
|
|
270
276
|
) -> argparse.Namespace:
|
|
271
277
|
"""Merge CLI arguments with YAML configuration and adjust logging level.
|
|
272
278
|
|
|
@@ -306,8 +312,8 @@ class ConfigResolver:
|
|
|
306
312
|
|
|
307
313
|
@staticmethod
|
|
308
314
|
def _detect_cli_overrides(
|
|
309
|
-
args_dict:
|
|
310
|
-
) ->
|
|
315
|
+
args_dict: dict[str, Any], default_dict: dict[str, Any]
|
|
316
|
+
) -> set[str]:
|
|
311
317
|
"""Detect which args were explicitly overridden in the CLI.
|
|
312
318
|
|
|
313
319
|
Args:
|
|
@@ -322,8 +328,8 @@ class ConfigResolver:
|
|
|
322
328
|
def _apply_yaml_defaults(
|
|
323
329
|
self,
|
|
324
330
|
args: argparse.Namespace,
|
|
325
|
-
run_config:
|
|
326
|
-
cli_provided:
|
|
331
|
+
run_config: dict[str, Any],
|
|
332
|
+
cli_provided: set[str],
|
|
327
333
|
) -> None:
|
|
328
334
|
"""Apply YAML values onto args for keys not provided by CLI.
|
|
329
335
|
|
|
@@ -336,7 +342,7 @@ class ConfigResolver:
|
|
|
336
342
|
if yaml_value is None or key in cli_provided:
|
|
337
343
|
continue
|
|
338
344
|
if key in self._arg_specs:
|
|
339
|
-
logger.debug("Using YAML value for
|
|
345
|
+
logger.debug(f"Using YAML value for {key}: {yaml_value}")
|
|
340
346
|
setattr(args, key, yaml_value)
|
|
341
347
|
|
|
342
348
|
def _ensure_defaults(self, args: argparse.Namespace) -> None:
|
|
@@ -18,7 +18,7 @@ from __future__ import annotations
|
|
|
18
18
|
import logging
|
|
19
19
|
import os
|
|
20
20
|
import pickle
|
|
21
|
-
from typing import Any
|
|
21
|
+
from typing import Any
|
|
22
22
|
|
|
23
23
|
import MDAnalysis as mda
|
|
24
24
|
import requests
|
|
@@ -112,7 +112,7 @@ class CodeEntropyRunner:
|
|
|
112
112
|
|
|
113
113
|
return new_folder_path
|
|
114
114
|
|
|
115
|
-
def load_citation_data(self) ->
|
|
115
|
+
def load_citation_data(self) -> dict[str, Any] | None:
|
|
116
116
|
"""Load CITATION.cff from GitHub.
|
|
117
117
|
|
|
118
118
|
If the request fails (offline, blocked, etc.), returns None.
|
|
@@ -335,7 +335,7 @@ class CodeEntropyRunner:
|
|
|
335
335
|
kcal_units = args.kcal_force_units
|
|
336
336
|
|
|
337
337
|
if forcefile is None:
|
|
338
|
-
logger.debug("Loading Universe with
|
|
338
|
+
logger.debug(f"Loading Universe with {tprfile} and {trrfile}")
|
|
339
339
|
return mda.Universe(tprfile, trrfile, format=fileformat)
|
|
340
340
|
|
|
341
341
|
return universe_operations.merge_forces(
|
|
@@ -16,7 +16,6 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import logging
|
|
18
18
|
import os
|
|
19
|
-
from typing import Dict, Optional
|
|
20
19
|
|
|
21
20
|
from rich.console import Console
|
|
22
21
|
from rich.logging import RichHandler
|
|
@@ -55,7 +54,7 @@ class LoggingConfig:
|
|
|
55
54
|
handlers: Mapping of handler name to handler instance.
|
|
56
55
|
"""
|
|
57
56
|
|
|
58
|
-
_console:
|
|
57
|
+
_console: Console | None = None
|
|
59
58
|
|
|
60
59
|
@classmethod
|
|
61
60
|
def get_console(cls) -> Console:
|
|
@@ -80,7 +79,7 @@ class LoggingConfig:
|
|
|
80
79
|
|
|
81
80
|
self.level = level
|
|
82
81
|
self.console = self.get_console()
|
|
83
|
-
self.handlers:
|
|
82
|
+
self.handlers: dict[str, logging.Handler] = {}
|
|
84
83
|
|
|
85
84
|
self._setup_handlers()
|
|
86
85
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Conformational entropy utilities.
|
|
2
|
+
|
|
3
|
+
This module provides:
|
|
4
|
+
|
|
5
|
+
- Assignment of discrete conformational states for a single dihedral time series.
|
|
6
|
+
- Computation of conformational entropy from a sequence of state labels.
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ConformationalEntropy:
|
|
21
|
+
"""Compute conformational entropy from states information."""
|
|
22
|
+
|
|
23
|
+
_GAS_CONST: float = 8.3144598484848
|
|
24
|
+
|
|
25
|
+
def __init__(self) -> None:
|
|
26
|
+
"""Math-only engine.
|
|
27
|
+
|
|
28
|
+
This class assigns conformational states and computes conformational entropy.
|
|
29
|
+
It does not depend on the workflow runner, universe, grouping, or reporting.
|
|
30
|
+
"""
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
def conformational_entropy_calculation(self, states: Any) -> float:
|
|
34
|
+
"""Compute conformational entropy for a sequence of state labels.
|
|
35
|
+
|
|
36
|
+
Entropy is computed as:
|
|
37
|
+
|
|
38
|
+
S = -R * sum_i p_i * ln(p_i)
|
|
39
|
+
|
|
40
|
+
where p_i is the observed probability of state i in ``states``.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
states: Sequence/array of discrete state labels. Empty/None yields 0.0.
|
|
44
|
+
number_frames: Frame count metadata.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
float: Conformational entropy in J/mol/K.
|
|
48
|
+
"""
|
|
49
|
+
arr = self._to_1d_array(states)
|
|
50
|
+
if arr is None or arr.size == 0:
|
|
51
|
+
return 0.0
|
|
52
|
+
|
|
53
|
+
values, counts = np.unique(arr, return_counts=True)
|
|
54
|
+
total_count = int(np.sum(counts))
|
|
55
|
+
if total_count <= 0 or values.size <= 1:
|
|
56
|
+
return 0.0
|
|
57
|
+
|
|
58
|
+
probs = counts.astype(float) / float(total_count)
|
|
59
|
+
probs = probs[probs > 0.0]
|
|
60
|
+
|
|
61
|
+
s_conf = -self._GAS_CONST * float(np.sum(probs * np.log(probs)))
|
|
62
|
+
logger.debug(f"Total conformational entropy: {s_conf}")
|
|
63
|
+
return s_conf
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def _to_1d_array(states: Any) -> np.ndarray | None:
|
|
67
|
+
"""Convert a state sequence into a 1D numpy array.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
states: Input sequence/array.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
1D numpy array, or None if input is not usable.
|
|
74
|
+
"""
|
|
75
|
+
if states is None:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
if isinstance(states, np.ndarray):
|
|
79
|
+
arr = states.reshape(-1)
|
|
80
|
+
else:
|
|
81
|
+
try:
|
|
82
|
+
arr = np.asarray(list(states)).reshape(-1)
|
|
83
|
+
except TypeError:
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
return arr
|
|
@@ -15,18 +15,19 @@ from __future__ import annotations
|
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
17
|
from dataclasses import dataclass
|
|
18
|
-
from typing import Any
|
|
18
|
+
from typing import Any
|
|
19
19
|
|
|
20
20
|
import networkx as nx
|
|
21
21
|
|
|
22
22
|
from CodeEntropy.entropy.nodes.aggregate import AggregateEntropyNode
|
|
23
23
|
from CodeEntropy.entropy.nodes.configurational import ConfigurationalEntropyNode
|
|
24
|
+
from CodeEntropy.entropy.nodes.orientational import OrientationalEntropyNode
|
|
24
25
|
from CodeEntropy.entropy.nodes.vibrational import VibrationalEntropyNode
|
|
25
26
|
|
|
26
27
|
logger = logging.getLogger(__name__)
|
|
27
28
|
|
|
28
29
|
|
|
29
|
-
SharedData =
|
|
30
|
+
SharedData = dict[str, Any]
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
@dataclass(frozen=True)
|
|
@@ -57,9 +58,9 @@ class EntropyGraph:
|
|
|
57
58
|
def __init__(self) -> None:
|
|
58
59
|
"""Initialize an empty entropy graph."""
|
|
59
60
|
self._graph: nx.DiGraph = nx.DiGraph()
|
|
60
|
-
self._nodes:
|
|
61
|
+
self._nodes: dict[str, Any] = {}
|
|
61
62
|
|
|
62
|
-
def build(self) ->
|
|
63
|
+
def build(self) -> EntropyGraph:
|
|
63
64
|
"""Populate the graph with the standard entropy workflow.
|
|
64
65
|
|
|
65
66
|
Returns:
|
|
@@ -68,10 +69,15 @@ class EntropyGraph:
|
|
|
68
69
|
specs = (
|
|
69
70
|
NodeSpec("vibrational_entropy", VibrationalEntropyNode()),
|
|
70
71
|
NodeSpec("configurational_entropy", ConfigurationalEntropyNode()),
|
|
72
|
+
NodeSpec("orientational_entropy", OrientationalEntropyNode()),
|
|
71
73
|
NodeSpec(
|
|
72
74
|
"aggregate_entropy",
|
|
73
75
|
AggregateEntropyNode(),
|
|
74
|
-
deps=(
|
|
76
|
+
deps=(
|
|
77
|
+
"vibrational_entropy",
|
|
78
|
+
"configurational_entropy",
|
|
79
|
+
"orientational_entropy",
|
|
80
|
+
),
|
|
75
81
|
),
|
|
76
82
|
)
|
|
77
83
|
|
|
@@ -82,7 +88,7 @@ class EntropyGraph:
|
|
|
82
88
|
|
|
83
89
|
def execute(
|
|
84
90
|
self, shared_data: SharedData, *, progress: object | None = None
|
|
85
|
-
) ->
|
|
91
|
+
) -> dict[str, Any]:
|
|
86
92
|
"""Execute the entropy graph in topological order.
|
|
87
93
|
|
|
88
94
|
Nodes are executed in dependency order (topological sort). Each node reads
|
|
@@ -105,7 +111,7 @@ class EntropyGraph:
|
|
|
105
111
|
Raises:
|
|
106
112
|
KeyError: If a node name is missing from the internal node registry.
|
|
107
113
|
"""
|
|
108
|
-
results:
|
|
114
|
+
results: dict[str, Any] = {}
|
|
109
115
|
|
|
110
116
|
for node_name in nx.topological_sort(self._graph):
|
|
111
117
|
node = self._nodes[node_name]
|