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.
Files changed (329) hide show
  1. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/daily.yaml +6 -4
  2. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/pr.yaml +64 -26
  3. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/release.yaml +11 -5
  4. codeentropy-2.1.1/.github/workflows/weekly-regression.yaml +90 -0
  5. {codeentropy-2.0.0 → codeentropy-2.1.1}/.gitignore +1 -1
  6. {codeentropy-2.0.0 → codeentropy-2.1.1}/CITATION.cff +2 -2
  7. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/__init__.py +1 -1
  8. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/argparse.py +20 -14
  9. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/runtime.py +3 -3
  10. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/core/logging.py +2 -3
  11. codeentropy-2.1.1/CodeEntropy/entropy/configurational.py +86 -0
  12. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/graph.py +13 -7
  13. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/aggregate.py +9 -4
  14. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/configurational.py +17 -25
  15. codeentropy-2.1.1/CodeEntropy/entropy/nodes/orientational.py +84 -0
  16. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/vibrational.py +31 -14
  17. codeentropy-2.1.1/CodeEntropy/entropy/orientational.py +117 -0
  18. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/vibrational.py +36 -4
  19. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/water.py +9 -8
  20. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/workflow.py +42 -18
  21. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/axes.py +7 -7
  22. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/dihedrals.py +138 -98
  23. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/forces.py +18 -13
  24. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/frame_dag.py +11 -11
  25. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/hierarchy.py +7 -8
  26. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/level_dag.py +22 -18
  27. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/linalg.py +4 -5
  28. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/mda.py +8 -9
  29. codeentropy-2.1.1/CodeEntropy/levels/neighbors.py +251 -0
  30. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/accumulators.py +12 -11
  31. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/beads.py +12 -11
  32. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/conformations.py +28 -13
  33. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/covariance.py +45 -45
  34. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/detect_levels.py +5 -5
  35. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/detect_molecules.py +3 -3
  36. codeentropy-2.1.1/CodeEntropy/levels/nodes/find_neighbors.py +93 -0
  37. codeentropy-2.1.1/CodeEntropy/levels/search.py +241 -0
  38. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/molecules/grouping.py +7 -7
  39. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/results/reporter.py +37 -38
  40. {codeentropy-2.0.0 → codeentropy-2.1.1}/PKG-INFO +7 -4
  41. {codeentropy-2.0.0 → codeentropy-2.1.1}/README.md +3 -2
  42. {codeentropy-2.0.0 → codeentropy-2.1.1}/conda-recipe/meta.yaml +12 -6
  43. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/conf.py +3 -4
  44. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/config.yaml +4 -1
  45. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/developer_guide.rst +1 -1
  46. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/getting_started.rst +17 -4
  47. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/science.rst +33 -6
  48. {codeentropy-2.0.0 → codeentropy-2.1.1}/pyproject.toml +15 -3
  49. codeentropy-2.1.1/tests/__init__.py +1 -0
  50. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/axes_off.json +45 -0
  51. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/combined_forcetorque_false.json +45 -0
  52. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/default.json +45 -0
  53. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/frame_window.json +45 -0
  54. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/grouping_each.json +153 -0
  55. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/rad.json +45 -0
  56. codeentropy-2.1.1/tests/regression/baselines/benzaldehyde/selection_subset.json +45 -0
  57. codeentropy-2.1.1/tests/regression/baselines/benzene/axes_off.json +45 -0
  58. codeentropy-2.1.1/tests/regression/baselines/benzene/combined_forcetorque_off.json +45 -0
  59. codeentropy-2.1.1/tests/regression/baselines/benzene/default.json +45 -0
  60. codeentropy-2.1.1/tests/regression/baselines/benzene/frame_window.json +45 -0
  61. codeentropy-2.1.1/tests/regression/baselines/benzene/grouping_each.json +153 -0
  62. codeentropy-2.1.1/tests/regression/baselines/benzene/rad.json +45 -0
  63. codeentropy-2.1.1/tests/regression/baselines/benzene/selection_subset.json +45 -0
  64. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/axes_off.json +45 -0
  65. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/combined_forcetorque_off.json +45 -0
  66. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/default.json +45 -0
  67. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/frame_window.json +45 -0
  68. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/grouping_each.json +153 -0
  69. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/rad.json +45 -0
  70. codeentropy-2.1.1/tests/regression/baselines/cyclohexane/selection_subset.json +45 -0
  71. codeentropy-2.1.1/tests/regression/baselines/dna/axes_off.json +61 -0
  72. codeentropy-2.1.1/tests/regression/baselines/dna/combined_forcetorque_off.json +61 -0
  73. codeentropy-2.0.0/tests/regression/baselines/dna.json → codeentropy-2.1.1/tests/regression/baselines/dna/default.json +16 -13
  74. codeentropy-2.1.1/tests/regression/baselines/dna/frame_window.json +61 -0
  75. codeentropy-2.1.1/tests/regression/baselines/dna/grouping_each.json +61 -0
  76. codeentropy-2.1.1/tests/regression/baselines/dna/selection_subset.json +61 -0
  77. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/axes_off.json +45 -0
  78. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/combined_forcetorque_off.json +45 -0
  79. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/default.json +45 -0
  80. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/frame_window.json +45 -0
  81. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/grouping_each.json +153 -0
  82. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/rad.json +45 -0
  83. codeentropy-2.1.1/tests/regression/baselines/ethyl-acetate/selection_subset.json +45 -0
  84. codeentropy-2.1.1/tests/regression/baselines/methane/axes_off.json +42 -0
  85. codeentropy-2.1.1/tests/regression/baselines/methane/combined_forcetorque_off.json +42 -0
  86. codeentropy-2.1.1/tests/regression/baselines/methane/default.json +42 -0
  87. codeentropy-2.1.1/tests/regression/baselines/methane/frame_window.json +42 -0
  88. codeentropy-2.1.1/tests/regression/baselines/methane/grouping_each.json +123 -0
  89. codeentropy-2.1.1/tests/regression/baselines/methane/rad.json +42 -0
  90. codeentropy-2.1.1/tests/regression/baselines/methane/selection_subset.json +42 -0
  91. codeentropy-2.1.1/tests/regression/baselines/methanol/axes_off.json +45 -0
  92. codeentropy-2.1.1/tests/regression/baselines/methanol/combined_forcetorque_off.json +45 -0
  93. codeentropy-2.1.1/tests/regression/baselines/methanol/default.json +45 -0
  94. codeentropy-2.1.1/tests/regression/baselines/methanol/frame_window.json +45 -0
  95. codeentropy-2.1.1/tests/regression/baselines/methanol/grouping_each.json +153 -0
  96. codeentropy-2.1.1/tests/regression/baselines/methanol/rad.json +45 -0
  97. codeentropy-2.1.1/tests/regression/baselines/methanol/selection_subset.json +45 -0
  98. codeentropy-2.1.1/tests/regression/baselines/octonol/axes_off.json +45 -0
  99. codeentropy-2.1.1/tests/regression/baselines/octonol/combined_forcetorque_off.json +45 -0
  100. codeentropy-2.1.1/tests/regression/baselines/octonol/default.json +45 -0
  101. codeentropy-2.1.1/tests/regression/baselines/octonol/frame_window.json +45 -0
  102. codeentropy-2.1.1/tests/regression/baselines/octonol/grouping_each.json +153 -0
  103. codeentropy-2.1.1/tests/regression/baselines/octonol/rad.json +45 -0
  104. codeentropy-2.1.1/tests/regression/baselines/octonol/selection_subset.json +45 -0
  105. codeentropy-2.1.1/tests/regression/baselines/water/axes_off.json +42 -0
  106. codeentropy-2.1.1/tests/regression/baselines/water/combined_forcetorque_off.json +42 -0
  107. codeentropy-2.1.1/tests/regression/baselines/water/default.json +42 -0
  108. codeentropy-2.1.1/tests/regression/baselines/water/frame_window.json +42 -0
  109. codeentropy-2.1.1/tests/regression/baselines/water/grouping_each.json +123 -0
  110. codeentropy-2.1.1/tests/regression/baselines/water/rad.json +42 -0
  111. codeentropy-2.1.1/tests/regression/baselines/water/selection_subset.json +42 -0
  112. codeentropy-2.1.1/tests/regression/baselines/water/water_off.json +42 -0
  113. codeentropy-2.1.1/tests/regression/cases.py +103 -0
  114. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/axes_off.yaml +15 -0
  115. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/combined_forcetorque_false.yaml +15 -0
  116. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/default.yaml +14 -0
  117. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/frame_window.yaml +14 -0
  118. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/grouping_each.yaml +15 -0
  119. codeentropy-2.0.0/tests/regression/configs/benzaldehyde/config.yaml → codeentropy-2.1.1/tests/regression/configs/benzaldehyde/rad.yaml +2 -0
  120. codeentropy-2.1.1/tests/regression/configs/benzaldehyde/selection_subset.yaml +14 -0
  121. codeentropy-2.1.1/tests/regression/configs/benzene/axes_off.yaml +15 -0
  122. codeentropy-2.1.1/tests/regression/configs/benzene/combined_forcetorque_off.yaml +15 -0
  123. codeentropy-2.1.1/tests/regression/configs/benzene/default.yaml +14 -0
  124. codeentropy-2.1.1/tests/regression/configs/benzene/frame_window.yaml +14 -0
  125. codeentropy-2.1.1/tests/regression/configs/benzene/grouping_each.yaml +15 -0
  126. codeentropy-2.0.0/tests/regression/configs/benzene/config.yaml → codeentropy-2.1.1/tests/regression/configs/benzene/rad.yaml +4 -2
  127. codeentropy-2.1.1/tests/regression/configs/benzene/selection_subset.yaml +14 -0
  128. codeentropy-2.1.1/tests/regression/configs/cyclohexane/axes_off.yaml +15 -0
  129. codeentropy-2.1.1/tests/regression/configs/cyclohexane/combined_forcetorque_off.yaml +15 -0
  130. codeentropy-2.1.1/tests/regression/configs/cyclohexane/default.yaml +14 -0
  131. codeentropy-2.1.1/tests/regression/configs/cyclohexane/frame_window.yaml +14 -0
  132. codeentropy-2.1.1/tests/regression/configs/cyclohexane/grouping_each.yaml +15 -0
  133. codeentropy-2.0.0/tests/regression/configs/cyclohexane/config.yaml → codeentropy-2.1.1/tests/regression/configs/cyclohexane/rad.yaml +4 -2
  134. codeentropy-2.1.1/tests/regression/configs/cyclohexane/selection_subset.yaml +14 -0
  135. codeentropy-2.1.1/tests/regression/configs/dna/axes_off.yaml +11 -0
  136. codeentropy-2.1.1/tests/regression/configs/dna/combined_forcetorque_off.yaml +11 -0
  137. codeentropy-2.0.0/tests/regression/configs/dna/config.yaml → codeentropy-2.1.1/tests/regression/configs/dna/default.yaml +1 -1
  138. codeentropy-2.1.1/tests/regression/configs/dna/frame_window.yaml +10 -0
  139. codeentropy-2.1.1/tests/regression/configs/dna/grouping_each.yaml +11 -0
  140. codeentropy-2.1.1/tests/regression/configs/dna/selection_subset.yaml +10 -0
  141. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/axes_off.yaml +15 -0
  142. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/combined_forcetorque_off.yaml +15 -0
  143. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/default.yaml +14 -0
  144. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/frame_window.yaml +14 -0
  145. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/grouping_each.yaml +15 -0
  146. codeentropy-2.0.0/tests/regression/configs/ethyl-acetate/config.yaml → codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/rad.yaml +4 -2
  147. codeentropy-2.1.1/tests/regression/configs/ethyl-acetate/selection_subset.yaml +14 -0
  148. codeentropy-2.1.1/tests/regression/configs/methane/axes_off.yaml +16 -0
  149. codeentropy-2.1.1/tests/regression/configs/methane/combined_forcetorque_off.yaml +16 -0
  150. codeentropy-2.1.1/tests/regression/configs/methane/default.yaml +15 -0
  151. codeentropy-2.1.1/tests/regression/configs/methane/frame_window.yaml +15 -0
  152. codeentropy-2.1.1/tests/regression/configs/methane/grouping_each.yaml +16 -0
  153. codeentropy-2.0.0/tests/regression/configs/methane/config.yaml → codeentropy-2.1.1/tests/regression/configs/methane/rad.yaml +5 -3
  154. codeentropy-2.1.1/tests/regression/configs/methane/selection_subset.yaml +15 -0
  155. codeentropy-2.1.1/tests/regression/configs/methanol/axes_off.yaml +15 -0
  156. codeentropy-2.1.1/tests/regression/configs/methanol/combined_forcetorque_off.yaml +15 -0
  157. codeentropy-2.1.1/tests/regression/configs/methanol/default.yaml +14 -0
  158. codeentropy-2.1.1/tests/regression/configs/methanol/frame_window.yaml +14 -0
  159. codeentropy-2.1.1/tests/regression/configs/methanol/grouping_each.yaml +15 -0
  160. codeentropy-2.0.0/tests/regression/configs/methanol/config.yaml → codeentropy-2.1.1/tests/regression/configs/methanol/rad.yaml +4 -2
  161. codeentropy-2.1.1/tests/regression/configs/methanol/selection_subset.yaml +14 -0
  162. codeentropy-2.1.1/tests/regression/configs/octonol/axes_off.yaml +15 -0
  163. codeentropy-2.1.1/tests/regression/configs/octonol/combined_forcetorque_off.yaml +15 -0
  164. codeentropy-2.1.1/tests/regression/configs/octonol/default.yaml +14 -0
  165. codeentropy-2.1.1/tests/regression/configs/octonol/frame_window.yaml +14 -0
  166. codeentropy-2.1.1/tests/regression/configs/octonol/grouping_each.yaml +15 -0
  167. codeentropy-2.0.0/tests/regression/configs/octonol/config.yaml → codeentropy-2.1.1/tests/regression/configs/octonol/rad.yaml +4 -2
  168. codeentropy-2.1.1/tests/regression/configs/octonol/selection_subset.yaml +14 -0
  169. codeentropy-2.1.1/tests/regression/configs/water/axes_off.yaml +15 -0
  170. codeentropy-2.1.1/tests/regression/configs/water/combined_forcetorque_off.yaml +15 -0
  171. codeentropy-2.1.1/tests/regression/configs/water/default.yaml +14 -0
  172. codeentropy-2.1.1/tests/regression/configs/water/frame_window.yaml +14 -0
  173. codeentropy-2.1.1/tests/regression/configs/water/grouping_each.yaml +15 -0
  174. codeentropy-2.1.1/tests/regression/configs/water/rad.yaml +14 -0
  175. codeentropy-2.1.1/tests/regression/configs/water/selection_subset.yaml +14 -0
  176. codeentropy-2.1.1/tests/regression/configs/water/water_off.yaml +15 -0
  177. codeentropy-2.1.1/tests/regression/conftest.py +84 -0
  178. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/regression/helpers.py +8 -9
  179. codeentropy-2.1.1/tests/regression/list_systems.py +12 -0
  180. codeentropy-2.1.1/tests/regression/test_regression.py +187 -0
  181. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_export_console.py +1 -1
  182. codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/nodes/test_orientational_node.py +39 -0
  183. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_vibrational_node.py +16 -7
  184. codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_configurational_edges.py +12 -0
  185. codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_configurational_entropy_math.py +25 -0
  186. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_graph.py +2 -0
  187. codeentropy-2.1.1/tests/unit/CodeEntropy/entropy/test_orientational_entropy.py +34 -0
  188. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_vibrational_entropy_math.py +11 -2
  189. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_workflow.py +23 -11
  190. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_conformations_node.py +1 -1
  191. codeentropy-2.1.1/tests/unit/CodeEntropy/levels/nodes/test_find_neighbors.py +33 -0
  192. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_dihedrals.py +28 -9
  193. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_forces_force_torque_calculator.py +29 -0
  194. codeentropy-2.1.1/tests/unit/CodeEntropy/levels/test_neighbors.py +489 -0
  195. codeentropy-2.1.1/tests/unit/CodeEntropy/levels/test_search.py +277 -0
  196. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/results/test_reporter.py +1 -2
  197. codeentropy-2.0.0/.github/workflows/weekly-regression.yaml +0 -52
  198. codeentropy-2.0.0/CodeEntropy/entropy/configurational.py +0 -266
  199. codeentropy-2.0.0/CodeEntropy/entropy/orientational.py +0 -158
  200. codeentropy-2.0.0/tests/__init__.py +0 -4
  201. codeentropy-2.0.0/tests/pytest.ini +0 -10
  202. codeentropy-2.0.0/tests/regression/baselines/benzaldehyde.json +0 -43
  203. codeentropy-2.0.0/tests/regression/baselines/benzene.json +0 -43
  204. codeentropy-2.0.0/tests/regression/baselines/cyclohexane.json +0 -43
  205. codeentropy-2.0.0/tests/regression/baselines/ethyl-acetate.json +0 -43
  206. codeentropy-2.0.0/tests/regression/baselines/methane.json +0 -40
  207. codeentropy-2.0.0/tests/regression/baselines/methanol.json +0 -43
  208. codeentropy-2.0.0/tests/regression/baselines/octonol.json +0 -43
  209. codeentropy-2.0.0/tests/regression/conftest.py +0 -46
  210. codeentropy-2.0.0/tests/regression/test_regression.py +0 -154
  211. codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_configurational_edges.py +0 -90
  212. codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_configurational_entropy_math.py +0 -120
  213. codeentropy-2.0.0/tests/unit/CodeEntropy/entropy/test_orientational_entropy.py +0 -54
  214. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/CONTRIBUTING.md +0 -0
  215. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  216. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  217. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  218. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  219. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/ISSUE_TEMPLATE/general_report.md +0 -0
  220. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  221. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/renovate.json +0 -0
  222. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/update-copyright-years-in-license-file.yaml +0 -0
  223. {codeentropy-2.0.0 → codeentropy-2.1.1}/.github/workflows/weekly-docs.yaml +0 -0
  224. {codeentropy-2.0.0 → codeentropy-2.1.1}/.pre-commit-config.yaml +0 -0
  225. {codeentropy-2.0.0 → codeentropy-2.1.1}/CODE_OF_CONDUCT.md +0 -0
  226. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/__main__.py +0 -0
  227. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/cli.py +0 -0
  228. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/config/__init__.py +0 -0
  229. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/core/__init__.py +0 -0
  230. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/__init__.py +0 -0
  231. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/entropy/nodes/__init__.py +0 -0
  232. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/__init__.py +0 -0
  233. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/levels/nodes/__init__.py +0 -0
  234. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/molecules/__init__.py +0 -0
  235. {codeentropy-2.0.0 → codeentropy-2.1.1}/CodeEntropy/results/__init__.py +0 -0
  236. {codeentropy-2.0.0 → codeentropy-2.1.1}/LICENSE +0 -0
  237. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/Makefile +0 -0
  238. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/README.md +0 -0
  239. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/README.md +0 -0
  240. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/custom.css +0 -0
  241. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/logos/biosim-codeentropy_logo_dark.png +0 -0
  242. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_static/logos/biosim-codeentropy_logo_light.png +0 -0
  243. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/_templates/README.md +0 -0
  244. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.cli.rst +0 -0
  245. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.argparse.rst +0 -0
  246. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.rst +0 -0
  247. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.config.runtime.rst +0 -0
  248. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.core.logging.rst +0 -0
  249. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.core.rst +0 -0
  250. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.configurational.rst +0 -0
  251. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.graph.rst +0 -0
  252. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.aggregate.rst +0 -0
  253. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.configurational.rst +0 -0
  254. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.rst +0 -0
  255. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.nodes.vibrational.rst +0 -0
  256. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.orientational.rst +0 -0
  257. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.rst +0 -0
  258. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.vibrational.rst +0 -0
  259. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.water.rst +0 -0
  260. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.entropy.workflow.rst +0 -0
  261. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.axes.rst +0 -0
  262. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.dihedrals.rst +0 -0
  263. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.forces.rst +0 -0
  264. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.frame_dag.rst +0 -0
  265. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.hierarchy.rst +0 -0
  266. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.level_dag.rst +0 -0
  267. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.linalg.rst +0 -0
  268. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.mda.rst +0 -0
  269. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.accumulators.rst +0 -0
  270. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.beads.rst +0 -0
  271. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.conformations.rst +0 -0
  272. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.covariance.rst +0 -0
  273. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.detect_levels.rst +0 -0
  274. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.detect_molecules.rst +0 -0
  275. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.nodes.rst +0 -0
  276. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.levels.rst +0 -0
  277. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.molecules.grouping.rst +0 -0
  278. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.molecules.rst +0 -0
  279. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.results.reporter.rst +0 -0
  280. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.results.rst +0 -0
  281. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/CodeEntropy.rst +0 -0
  282. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/api/modules.rst +0 -0
  283. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/faq.rst +0 -0
  284. {codeentropy-2.0.0 → codeentropy-2.1.1}/docs/index.rst +0 -0
  285. {codeentropy-2.0.0 → codeentropy-2.1.1}/readthedocs.yml +0 -0
  286. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/cli/test___main__.py +0 -0
  287. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/cli/test_cli.py +0 -0
  288. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/conftest.py +0 -0
  289. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_build_parser.py +0 -0
  290. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_load_config.py +0 -0
  291. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_resolve.py +0 -0
  292. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_str2bool.py +0 -0
  293. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/argparse/test_argparse_validate_inputs.py +0 -0
  294. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/conftest.py +0 -0
  295. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_build_universe_branches.py +0 -0
  296. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_citation_data.py +0 -0
  297. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_create_job_folder.py +0 -0
  298. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_print_args_table.py +0 -0
  299. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_required_args.py +0 -0
  300. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_run_entropy_workflow_branches.py +0 -0
  301. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_runtime_properties.py +0 -0
  302. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_show_splash.py +0 -0
  303. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_unit_conversions.py +0 -0
  304. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/config/runtime/test_universe_io.py +0 -0
  305. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/conftest.py +0 -0
  306. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_configure_loggers.py +0 -0
  307. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_error_filter.py +0 -0
  308. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_get_console_singleton.py +0 -0
  309. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_handlers_setup.py +0 -0
  310. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/core/logging/test_set_level.py +0 -0
  311. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/conftest.py +0 -0
  312. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_aggregate_node.py +0 -0
  313. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/nodes/test_configurational_node.py +0 -0
  314. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/entropy/test_water_entropy.py +0 -0
  315. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/conftest.py +0 -0
  316. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_build_beads_node.py +0 -0
  317. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_detect_levels_node.py +0 -0
  318. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_detect_molecules_node.py +0 -0
  319. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_frame_covariance_node.py +0 -0
  320. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/nodes/test_init_covariance_accumulators_node.py +0 -0
  321. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_axes.py +0 -0
  322. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_frame_graph.py +0 -0
  323. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_hierarchy_builder.py +0 -0
  324. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_orchestration.py +0 -0
  325. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_reduce.py +0 -0
  326. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_level_dag_reduction.py +0 -0
  327. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_linalg_matrix_utils.py +0 -0
  328. {codeentropy-2.0.0 → codeentropy-2.1.1}/tests/unit/CodeEntropy/levels/test_mda_universe_operations.py +0 -0
  329. {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 (testing)
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: Pytest (unit) • ${{ matrix.os }} • py${{ matrix.python-version }}
38
- run: python -m pytest tests/unit -q
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 # v6
23
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
23
24
 
24
25
  - name: Set up Python ${{ matrix.python-version }}
25
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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 -q
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 (quick)
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 # v6
79
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
46
80
 
47
81
  - name: Set up Python 3.14
48
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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-v1-${{ runner.os }}-py3.14
91
+ key: codeentropy-testdata-${{ runner.os }}-py314
58
92
 
59
- - name: Install (testing)
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: Pytest (regression quick)
65
- run: python -m pytest tests/regression -q
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
- tests/regression/**/.pytest_cache/**
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 # v6
157
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
120
158
 
121
159
  - name: Set up Python 3.14
122
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
160
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
123
161
  with:
124
162
  python-version: "3.14"
125
163
  cache: pip
126
164
 
127
- - name: Install (pre-commit)
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 repo
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 (testing)
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 unit test suite with coverage
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-base: false
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-*/**
@@ -129,4 +129,4 @@ job*
129
129
  .testdata/
130
130
 
131
131
  !tests/regression/baselines/
132
- !tests/regression/baselines/*.json
132
+ !tests/regression/baselines/*/*.json
@@ -76,5 +76,5 @@ keywords:
76
76
  - biomolecular simulations
77
77
  - protein flexibility
78
78
  license: MIT
79
- version: 2.0.0
80
- date-released: '2026-02-27'
79
+ version: 2.1.1
80
+ date-released: '2026-04-01'
@@ -8,4 +8,4 @@ entropy estimates, supporting a wide range of applications in molecular simulati
8
8
  and statistical mechanics.
9
9
  """
10
10
 
11
- __version__ = "2.0.0"
11
+ __version__ = "2.1.1"
@@ -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, Dict, Optional, Set
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: Optional[str] = None
52
- nargs: Optional[str] = None
51
+ action: str | None = None
52
+ nargs: str | None = None
53
53
 
54
54
 
55
- ARG_SPECS: Dict[str, ArgSpec] = {
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: Optional[Dict[str, ArgSpec]] = None) -> None:
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) -> Dict[str, Any]:
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, "r", encoding="utf-8") as file:
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: Dict[str, Any] = {}
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: Optional[Dict[str, Any]]
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: Dict[str, Any], default_dict: Dict[str, Any]
310
- ) -> Set[str]:
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: Dict[str, Any],
326
- cli_provided: Set[str],
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 %s: %s", key, yaml_value)
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, Dict, Optional
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) -> Optional[Dict[str, Any]]:
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 %s and %s", tprfile, trrfile)
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: Optional[Console] = None
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: Dict[str, logging.Handler] = {}
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, Dict
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 = Dict[str, Any]
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: Dict[str, Any] = {}
61
+ self._nodes: dict[str, Any] = {}
61
62
 
62
- def build(self) -> "EntropyGraph":
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=("vibrational_entropy", "configurational_entropy"),
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
- ) -> Dict[str, Any]:
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: Dict[str, Any] = {}
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]