skempi-foldx 0.2.2__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 (531) hide show
  1. skempi_foldx-0.2.2/CHANGELOG.md +636 -0
  2. skempi_foldx-0.2.2/CITATION.cff +155 -0
  3. skempi_foldx-0.2.2/CONTRIBUTING.md +163 -0
  4. skempi_foldx-0.2.2/LICENSE +21 -0
  5. skempi_foldx-0.2.2/MANIFEST.in +32 -0
  6. skempi_foldx-0.2.2/NOTICE +88 -0
  7. skempi_foldx-0.2.2/PKG-INFO +500 -0
  8. skempi_foldx-0.2.2/README.md +464 -0
  9. skempi_foldx-0.2.2/docs/DETERMINISM.md +360 -0
  10. skempi_foldx-0.2.2/docs/PROTOCOL.md +88 -0
  11. skempi_foldx-0.2.2/docs/REFERENCES.md +198 -0
  12. skempi_foldx-0.2.2/docs/STORE.md +328 -0
  13. skempi_foldx-0.2.2/docs/USAGE.md +387 -0
  14. skempi_foldx-0.2.2/docs/VERSIONS.md +366 -0
  15. skempi_foldx-0.2.2/docs/assets/STORE_COMPOSITION.txt +73 -0
  16. skempi_foldx-0.2.2/docs/assets/VERSION_COMPARE.txt +182 -0
  17. skempi_foldx-0.2.2/docs/assets/store_composition.png +0 -0
  18. skempi_foldx-0.2.2/docs/assets/version_compare.png +0 -0
  19. skempi_foldx-0.2.2/docs/assets/version_compare_matrix.png +0 -0
  20. skempi_foldx-0.2.2/experiments/agreement_stats.py +196 -0
  21. skempi_foldx-0.2.2/experiments/backfill_role_names.py +172 -0
  22. skempi_foldx-0.2.2/experiments/build_per_definition_store.py +310 -0
  23. skempi_foldx-0.2.2/experiments/compare_versions.py +844 -0
  24. skempi_foldx-0.2.2/experiments/coverage_report.py +188 -0
  25. skempi_foldx-0.2.2/experiments/recompute_alternate_interfaces.py +214 -0
  26. skempi_foldx-0.2.2/experiments/repair_ablation.py +493 -0
  27. skempi_foldx-0.2.2/experiments/repair_convergence.py +117 -0
  28. skempi_foldx-0.2.2/experiments/repair_sweep/README.md +147 -0
  29. skempi_foldx-0.2.2/experiments/repair_sweep/chain_finalize.sh +93 -0
  30. skempi_foldx-0.2.2/experiments/repair_sweep/launch_sweep.sh +36 -0
  31. skempi_foldx-0.2.2/experiments/repair_sweep/list_hashes.py +204 -0
  32. skempi_foldx-0.2.2/experiments/repair_sweep/residue_check.py +134 -0
  33. skempi_foldx-0.2.2/experiments/repair_sweep/sweep_mp.py +209 -0
  34. skempi_foldx-0.2.2/experiments/store_composition.py +571 -0
  35. skempi_foldx-0.2.2/pyproject.toml +78 -0
  36. skempi_foldx-0.2.2/setup.cfg +4 -0
  37. skempi_foldx-0.2.2/skempi_foldx/__init__.py +107 -0
  38. skempi_foldx-0.2.2/skempi_foldx/config.py +163 -0
  39. skempi_foldx-0.2.2/skempi_foldx/data/CONSOLIDATION_REPORT.txt +35 -0
  40. skempi_foldx-0.2.2/skempi_foldx/data/corrections_from_0_1_0.csv +32 -0
  41. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1A22_A_B.json +610 -0
  42. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1A4Y_A_B.json +226 -0
  43. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1AHW_AB_C.json +137 -0
  44. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1AK4_A_D.json +35 -0
  45. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1AO7_ABC_DE.json +969 -0
  46. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1B2S_A_D.json +35 -0
  47. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1B2U_A_D.json +35 -0
  48. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1B3S_A_D.json +35 -0
  49. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1B41_A_B.json +50 -0
  50. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1BD2_ABC_DE.json +136 -0
  51. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1BJ1_HL_VW.json +222 -0
  52. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1BP3_A_B.json +242 -0
  53. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1BRS_A_D.json +781 -0
  54. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1C1Y_A_B.json +66 -0
  55. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1C4Z_ABC_D.json +34 -0
  56. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1CHO_EFG_I.json +1446 -0
  57. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1CZ8_HL_VW.json +290 -0
  58. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1DAN_HL_UT.json +511 -0
  59. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1DQJ_AB_C.json +239 -0
  60. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1DVF_AB_CD.json +239 -0
  61. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1E50_A_B.json +34 -0
  62. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1EFN_A_B.json +34 -0
  63. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1EMV_A_B.json +226 -0
  64. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1FCC_A_C.json +35 -0
  65. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1FSS_A_B.json +82 -0
  66. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1GC1_G_C.json +52 -0
  67. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1GL0_E_I.json +35 -0
  68. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1GL1_A_I.json +35 -0
  69. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1GUA_A_B.json +66 -0
  70. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1HE8_A_B.json +242 -0
  71. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1JRH_LH_I.json +222 -0
  72. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1JTG_A_B.json +2194 -0
  73. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1K8R_A_B.json +34 -0
  74. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1KNE_A_P.json +578 -0
  75. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1LFD_A_B.json +514 -0
  76. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1MAH_A_F.json +82 -0
  77. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1MHP_HL_A.json +460 -0
  78. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1MLC_AB_E.json +289 -0
  79. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1MQ8_A_B.json +130 -0
  80. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1N8Z_AB_C.json +68 -0
  81. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1OHZ_A_B.json +98 -0
  82. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1PPF_E_I.json +970 -0
  83. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1QAB_ABCD_E.json +222 -0
  84. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1R0R_E_I.json +1310 -0
  85. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1REW_AB_C.json +443 -0
  86. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1SBB_A_B.json +34 -0
  87. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1TM1_E_I.json +86 -0
  88. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1VFB_AB_C.json +256 -0
  89. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1WQJ_I_B.json +35 -0
  90. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1XXM_A_C.json +35 -0
  91. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1Y4A_E_I.json +35 -0
  92. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1YCS_A_B.json +146 -0
  93. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1YQV_HL_Y.json +52 -0
  94. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1YY9_CD_A.json +69 -0
  95. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/1Z7X_W_X.json +86 -0
  96. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2ABZ_B_E.json +35 -0
  97. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2B2X_HL_A.json +1565 -0
  98. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2C5D_AB_CD.json +341 -0
  99. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2C5D_A_C.json +222 -0
  100. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2CCL_A_B.json +34 -0
  101. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2DVW_A_B.json +114 -0
  102. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2G2U_A_B.json +306 -0
  103. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2J0T_A_D.json +137 -0
  104. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2KSO_A_B.json +178 -0
  105. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2NOJ_A_B.json +34 -0
  106. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2NY7_HL_G.json +205 -0
  107. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2NYY_DC_A.json +52 -0
  108. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2NZ9_DC_A.json +35 -0
  109. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2O3B_A_B.json +34 -0
  110. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2OOB_A_B.json +82 -0
  111. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2P5E_ABC_DE.json +86 -0
  112. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2PCC_A_B.json +114 -0
  113. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2PYE_ABC_DE.json +103 -0
  114. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2QJ9_AB_C.json +69 -0
  115. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2QJA_AB_C.json +69 -0
  116. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2QJB_AB_C.json +69 -0
  117. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2VN5_A_B.json +402 -0
  118. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/2WPT_A_B.json +322 -0
  119. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3AAA_AB_C.json +82 -0
  120. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3BDY_HL_V.json +120 -0
  121. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3BE1_HL_A.json +137 -0
  122. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3BIW_A_E.json +34 -0
  123. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3BP8_A_C.json +35 -0
  124. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3D3V_ABC_DE.json +69 -0
  125. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3EG5_A_B.json +50 -0
  126. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3G6D_LH_A.json +137 -0
  127. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3HFM_HL_Y.json +460 -0
  128. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3HG1_ABC_DE.json +834 -0
  129. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3IDX_HL_G.json +205 -0
  130. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3KUD_A_B.json +258 -0
  131. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3L5X_A_HL.json +596 -0
  132. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3LZF_AB_HL.json +34 -0
  133. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3M63_A_B.json +34 -0
  134. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3MZG_A_B.json +34 -0
  135. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3MZW_A_B.json +370 -0
  136. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3NGB_HL_G.json +86 -0
  137. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3PWP_ABC_DE.json +35 -0
  138. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3QDG_ABC_DE.json +52 -0
  139. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3QDJ_ABC_DE.json +52 -0
  140. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3QIB_ABP_CD.json +52 -0
  141. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3S9D_A_B.json +994 -0
  142. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3SE3_B_A.json +528 -0
  143. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3SE3_B_C.json +52 -0
  144. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3SE4_B_C.json +52 -0
  145. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3SF4_A_D.json +51 -0
  146. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3SGB_E_I.json +1514 -0
  147. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3U82_A_B.json +34 -0
  148. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3UIG_A_P.json +34 -0
  149. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3UIH_A_P.json +34 -0
  150. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3UII_A_P.json +34 -0
  151. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/3VR6_ABCDEF_GH.json +222 -0
  152. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4B0M_A_BM.json +68 -0
  153. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4CPA_A_I.json +35 -0
  154. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4CVW_A_C.json +35 -0
  155. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4E6K_AB_G.json +86 -0
  156. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4FTV_ABC_DE.json +170 -0
  157. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4FZA_A_B.json +50 -0
  158. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4G0N_A_B.json +690 -0
  159. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4G2V_A_B.json +34 -0
  160. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4GNK_A_B.json +66 -0
  161. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4GU0_A_E.json +35 -0
  162. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4GXU_ABCDEF_MN.json +34 -0
  163. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4J2L_A_CD.json +82 -0
  164. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4JEU_A_B.json +34 -0
  165. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4JFD_ABC_DE.json +120 -0
  166. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4JFE_ABC_DE.json +120 -0
  167. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4JPK_HL_A.json +35 -0
  168. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4K71_A_BC.json +162 -0
  169. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4KRL_A_B.json +34 -0
  170. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4KRO_A_B.json +34 -0
  171. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4KRP_A_B.json +34 -0
  172. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4L3E_ABC_DE.json +120 -0
  173. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4MNQ_ABC_DE.json +273 -0
  174. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4MYW_A_B.json +34 -0
  175. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4N8V_G_ABC.json +35 -0
  176. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4NKQ_C_AB.json +290 -0
  177. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4OFY_A_D.json +50 -0
  178. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4RA0_A_C.json +137 -0
  179. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4RS1_A_B.json +226 -0
  180. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4UYP_A_D.json +171 -0
  181. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4UYQ_A_B.json +162 -0
  182. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4WND_A_B.json +34 -0
  183. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4X4M_AB_E.json +35 -0
  184. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4Y61_A_B.json +34 -0
  185. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4YFD_A_B.json +66 -0
  186. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/4YH7_A_B.json +66 -0
  187. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5C6T_HL_A.json +103 -0
  188. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5CYK_A_B.json +66 -0
  189. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5E9D_AB_CDE.json +154 -0
  190. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5M2O_A_B.json +146 -0
  191. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5TAR_A_B.json +34 -0
  192. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5UFE_A_B.json +66 -0
  193. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5UFQ_A_C.json +52 -0
  194. skempi_foldx-0.2.2/skempi_foldx/data/results_mp/5XCO_A_B.json +306 -0
  195. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1A22_A_B.json +2290 -0
  196. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1A4Y_A_B.json +530 -0
  197. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1ACB_E_I.json +120 -0
  198. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1AHW_AB_C.json +171 -0
  199. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1AK4_A_D.json +290 -0
  200. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1AO7_ABC_DE.json +1601 -0
  201. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1B2S_A_D.json +51 -0
  202. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1B2U_A_D.json +51 -0
  203. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1B3S_A_D.json +51 -0
  204. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1B41_A_B.json +386 -0
  205. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1BD2_ABC_DE.json +186 -0
  206. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1BJ1_HL_VW.json +188 -0
  207. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1BP3_A_B.json +738 -0
  208. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1BRS_A_D.json +507 -0
  209. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1C1Y_A_B.json +258 -0
  210. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1C4Z_ABC_D.json +812 -0
  211. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CBW_FGH_I.json +545 -0
  212. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CHO_EFG_I.json +3265 -0
  213. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CSE_E_I.json +120 -0
  214. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CSO_E_I.json +35 -0
  215. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CT0_E_I.json +35 -0
  216. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CT2_E_I.json +35 -0
  217. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CT4_E_I.json +35 -0
  218. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1CZ8_HL_VW.json +35 -0
  219. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1DAN_HL_UT.json +1531 -0
  220. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1DQJ_AB_C.json +370 -0
  221. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1DVF_AB_CD.json +454 -0
  222. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1E50_A_B.json +274 -0
  223. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1E96_A_B.json +114 -0
  224. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1EAW_A_B.json +450 -0
  225. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1EFN_A_B.json +50 -0
  226. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1EMV_A_B.json +754 -0
  227. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1F47_A_B.json +210 -0
  228. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1F5R_A_I.json +34 -0
  229. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FC2_C_D.json +324 -0
  230. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FCC_A_C.json +154 -0
  231. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FFW_A_B.json +322 -0
  232. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FR2_A_B.json +34 -0
  233. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FSS_A_B.json +386 -0
  234. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1FY8_E_I.json +52 -0
  235. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GC1_G_C.json +1123 -0
  236. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GCQ_AB_C.json +137 -0
  237. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GL0_E_I.json +35 -0
  238. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GL1_A_I.json +35 -0
  239. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GRN_A_B.json +50 -0
  240. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1GUA_A_B.json +210 -0
  241. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1H9D_A_B.json +114 -0
  242. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1HE8_A_B.json +34 -0
  243. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1IAR_A_B.json +658 -0
  244. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1JCK_A_B.json +178 -0
  245. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1JRH_LH_I.json +749 -0
  246. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1JTD_A_B.json +594 -0
  247. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1JTG_A_B.json +946 -0
  248. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1K8R_A_B.json +322 -0
  249. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KAC_A_B.json +50 -0
  250. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KIP_AB_C.json +35 -0
  251. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KIQ_AB_C.json +35 -0
  252. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KIR_AB_C.json +34 -0
  253. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KNE_A_P.json +230 -0
  254. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1KTZ_A_B.json +450 -0
  255. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1LFD_A_B.json +626 -0
  256. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1LP9_ABC_EF.json +66 -0
  257. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1M9E_A_D.json +35 -0
  258. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1MAH_A_F.json +162 -0
  259. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1MHP_HL_A.json +1174 -0
  260. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1MI5_ABC_DE.json +681 -0
  261. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1MLC_AB_E.json +202 -0
  262. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1N8O_ABC_E.json +69 -0
  263. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1N8Z_AB_C.json +219 -0
  264. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1NCA_N_LH.json +86 -0
  265. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1NMB_N_LH.json +154 -0
  266. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1OGA_ABC_DE.json +808 -0
  267. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1P69_A_B.json +34 -0
  268. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1P6A_A_B.json +34 -0
  269. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1PPF_E_I.json +3248 -0
  270. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1QRN_ABC_DE.json +35 -0
  271. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1QSE_ABC_DE.json +35 -0
  272. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1QSF_ABC_DE.json +35 -0
  273. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1R0R_E_I.json +3265 -0
  274. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1REW_AB_C.json +35 -0
  275. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1S0W_A_C.json +35 -0
  276. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1S1Q_A_B.json +114 -0
  277. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SBB_A_B.json +66 -0
  278. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SBN_E_I.json +35 -0
  279. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGD_E_I.json +35 -0
  280. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGE_E_I.json +35 -0
  281. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGN_E_I.json +35 -0
  282. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGP_E_I.json +35 -0
  283. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGQ_E_I.json +35 -0
  284. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SGY_E_I.json +35 -0
  285. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SIB_E_I.json +35 -0
  286. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1SMF_E_I.json +103 -0
  287. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TM1_E_I.json +307 -0
  288. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TM3_E_I.json +35 -0
  289. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TM4_E_I.json +35 -0
  290. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TM5_E_I.json +35 -0
  291. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TM7_E_I.json +35 -0
  292. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TMG_E_I.json +35 -0
  293. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1TO1_E_I.json +35 -0
  294. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1U7F_B_AC.json +52 -0
  295. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1UUZ_A_D.json +98 -0
  296. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1VFB_AB_C.json +837 -0
  297. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1WQJ_I_B.json +86 -0
  298. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1X1W_A_D.json +35 -0
  299. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1X1X_A_D.json +35 -0
  300. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XD3_A_B.json +306 -0
  301. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XGP_AB_C.json +86 -0
  302. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XGQ_AB_C.json +86 -0
  303. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XGR_AB_C.json +86 -0
  304. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XGT_AB_C.json +86 -0
  305. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1XGU_AB_C.json +86 -0
  306. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y1K_E_I.json +35 -0
  307. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y33_E_I.json +35 -0
  308. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y34_E_I.json +35 -0
  309. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y3B_E_I.json +35 -0
  310. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y3C_E_I.json +35 -0
  311. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y3D_E_I.json +35 -0
  312. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Y48_E_I.json +35 -0
  313. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1YCS_A_B.json +66 -0
  314. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1YQV_HL_Y.json +35 -0
  315. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1YY9_CD_A.json +290 -0
  316. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/1Z7X_W_X.json +307 -0
  317. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2A9K_A_B.json +50 -0
  318. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2AJF_A_E.json +184 -0
  319. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2AK4_ABC_DE.json +586 -0
  320. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2AW2_A_B.json +66 -0
  321. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B0U_AB_C.json +137 -0
  322. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B0Z_A_B.json +34 -0
  323. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B10_A_B.json +34 -0
  324. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B11_A_B.json +34 -0
  325. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B12_A_B.json +34 -0
  326. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B2X_HL_A.json +69 -0
  327. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2B42_A_B.json +66 -0
  328. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2BDN_HL_A.json +222 -0
  329. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2BNQ_ABC_DE.json +35 -0
  330. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2BNR_ABC_DE.json +435 -0
  331. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2BTF_A_P.json +86 -0
  332. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2C0L_A_B.json +82 -0
  333. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2C5D_A_C.json +86 -0
  334. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2DSQ_I_G.json +86 -0
  335. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2DVW_A_B.json +98 -0
  336. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2E7L_EQ_AD.json +35 -0
  337. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2FTL_E_I.json +545 -0
  338. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2G2U_A_B.json +450 -0
  339. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2G2W_A_B.json +34 -0
  340. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2GOX_A_B.json +50 -0
  341. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2GYK_A_B.json +34 -0
  342. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2HLE_A_B.json +50 -0
  343. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2HRK_A_B.json +146 -0
  344. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2I26_N_L.json +52 -0
  345. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2J0T_A_D.json +290 -0
  346. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2J12_A_B.json +34 -0
  347. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2J1K_C_T.json +69 -0
  348. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2J8U_ABC_EF.json +34 -0
  349. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2JCC_ABC_EF.json +34 -0
  350. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2JEL_LH_P.json +766 -0
  351. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2KSO_A_B.json +98 -0
  352. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NU0_E_I.json +35 -0
  353. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NU1_E_I.json +35 -0
  354. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NU2_E_I.json +35 -0
  355. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NU4_E_I.json +35 -0
  356. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NYY_DC_A.json +528 -0
  357. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2NZ9_DC_A.json +341 -0
  358. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2O3B_A_B.json +130 -0
  359. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2OI9_AQ_BC.json +35 -0
  360. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2OOB_A_B.json +66 -0
  361. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2P5E_ABC_DE.json +35 -0
  362. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2PCB_A_B.json +114 -0
  363. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2PCC_A_B.json +114 -0
  364. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2REX_A_B.json +66 -0
  365. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2SGP_E_I.json +35 -0
  366. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2SGQ_E_I.json +35 -0
  367. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2SIC_E_I.json +188 -0
  368. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2UWE_ABC_EF.json +34 -0
  369. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VIR_AB_C.json +52 -0
  370. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VIS_AB_C.json +35 -0
  371. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VLN_A_B.json +34 -0
  372. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VLO_A_B.json +34 -0
  373. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VLP_A_B.json +34 -0
  374. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VLQ_A_B.json +34 -0
  375. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2VLR_ABC_DE.json +35 -0
  376. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/2WPT_A_B.json +482 -0
  377. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3AAA_AB_C.json +199 -0
  378. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3B4V_AB_C.json +137 -0
  379. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BK3_A_C.json +239 -0
  380. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BN9_B_CD.json +613 -0
  381. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BP8_A_C.json +51 -0
  382. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BT1_A_U.json +4098 -0
  383. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTD_E_I.json +35 -0
  384. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTE_E_I.json +35 -0
  385. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTF_E_I.json +35 -0
  386. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTG_E_I.json +35 -0
  387. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTH_E_I.json +35 -0
  388. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTM_E_I.json +35 -0
  389. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTQ_E_I.json +35 -0
  390. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTT_E_I.json +35 -0
  391. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BTW_E_I.json +35 -0
  392. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3BX1_A_C.json +137 -0
  393. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3C60_CD_AB.json +613 -0
  394. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3D3V_ABC_DE.json +86 -0
  395. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3D5R_A_C.json +35 -0
  396. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3D5S_A_C.json +35 -0
  397. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3EG5_A_B.json +34 -0
  398. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3EQS_A_B.json +178 -0
  399. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3EQY_A_C.json +205 -0
  400. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3F1S_A_B.json +130 -0
  401. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3G6D_LH_A.json +69 -0
  402. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3H9S_ABC_DE.json +34 -0
  403. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3HFM_HL_Y.json +1225 -0
  404. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3HG1_ABC_DE.json +103 -0
  405. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3HH2_AB_C.json +137 -0
  406. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3KBH_A_E.json +133 -0
  407. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3KUD_A_B.json +66 -0
  408. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3L5X_A_HL.json +35 -0
  409. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3LB6_A_C.json +82 -0
  410. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3LNZ_A_B.json +34 -0
  411. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3LZF_AB_HL.json +50 -0
  412. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3M62_A_B.json +338 -0
  413. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3M63_A_B.json +194 -0
  414. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3MZG_A_B.json +178 -0
  415. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3MZW_A_B.json +66 -0
  416. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3N06_A_B.json +34 -0
  417. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3N0P_A_B.json +34 -0
  418. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3N4I_A_B.json +34 -0
  419. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3N85_A_LH.json +171 -0
  420. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NCB_A_B.json +34 -0
  421. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NCC_A_B.json +34 -0
  422. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NGB_HL_G.json +715 -0
  423. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NPS_A_BC.json +450 -0
  424. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NVN_B_A.json +86 -0
  425. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3NVQ_B_A.json +86 -0
  426. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3PWP_ABC_DE.json +35 -0
  427. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3Q3J_A_B.json +34 -0
  428. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3Q8D_A_E.json +194 -0
  429. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3QDG_ABC_DE.json +290 -0
  430. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3QDJ_ABC_DE.json +307 -0
  431. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3QFJ_ABC_DE.json +35 -0
  432. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3QHY_A_B.json +418 -0
  433. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3QIB_ABP_CD.json +437 -0
  434. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3R9A_AC_B.json +98 -0
  435. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3RF3_A_C.json +35 -0
  436. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3S9D_A_B.json +1314 -0
  437. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SE3_B_A.json +307 -0
  438. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SE4_B_A.json +324 -0
  439. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SE4_B_C.json +273 -0
  440. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SE8_HL_G.json +494 -0
  441. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SE9_HL_G.json +443 -0
  442. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SEK_B_C.json +137 -0
  443. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SF4_A_D.json +101 -0
  444. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SGB_E_I.json +3265 -0
  445. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3SZK_AB_C.json +375 -0
  446. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3TGK_E_I.json +35 -0
  447. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3U82_A_B.json +34 -0
  448. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3UIG_A_P.json +162 -0
  449. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3UII_A_P.json +34 -0
  450. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3VR6_ABCDEF_GH.json +120 -0
  451. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3W2D_A_HL.json +114 -0
  452. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/3WWN_A_B.json +66 -0
  453. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4B0M_A_BM.json +185 -0
  454. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4BFI_A_B.json +210 -0
  455. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4CPA_A_I.json +154 -0
  456. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4CVW_A_C.json +152 -0
  457. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4E6K_AB_G.json +69 -0
  458. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4EKD_A_B.json +34 -0
  459. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4FTV_ABC_DE.json +118 -0
  460. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4FZA_A_B.json +130 -0
  461. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4G0N_A_B.json +498 -0
  462. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4G2V_A_B.json +50 -0
  463. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4GNK_A_B.json +66 -0
  464. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4GXU_ABCDEF_MN.json +50 -0
  465. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4HFK_A_BD.json +147 -0
  466. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4HRN_A_D.json +86 -0
  467. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4HSA_AB_C.json +82 -0
  468. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4I77_HL_Z.json +222 -0
  469. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4J2L_A_CD.json +100 -0
  470. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JEU_A_B.json +114 -0
  471. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JFD_ABC_DE.json +35 -0
  472. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JFE_ABC_DE.json +35 -0
  473. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JFF_ABC_DE.json +137 -0
  474. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JGH_ABC_D.json +35 -0
  475. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4JPK_HL_A.json +171 -0
  476. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4K71_A_BC.json +114 -0
  477. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4KRL_A_B.json +50 -0
  478. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4KRO_A_B.json +50 -0
  479. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4KRP_A_B.json +34 -0
  480. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4L0P_A_B.json +114 -0
  481. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4L3E_ABC_DE.json +134 -0
  482. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4LRX_AB_CD.json +34 -0
  483. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4MNQ_ABC_DE.json +52 -0
  484. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4MYW_A_B.json +34 -0
  485. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4N8V_G_ABC.json +222 -0
  486. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4NKQ_C_AB.json +613 -0
  487. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4NM8_ABCDEF_HL.json +171 -0
  488. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4NZW_A_B.json +114 -0
  489. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4O27_A_B.json +130 -0
  490. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4OFY_A_D.json +198 -0
  491. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4OZG_ABJ_GH.json +222 -0
  492. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4P23_CD_AB.json +613 -0
  493. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4P5T_CD_AB.json +613 -0
  494. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4PWX_AB_CD.json +436 -0
  495. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4RA0_A_C.json +52 -0
  496. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4RS1_A_B.json +802 -0
  497. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4U6H_AB_E.json +69 -0
  498. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4WND_A_B.json +50 -0
  499. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4X4M_AB_E.json +120 -0
  500. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4Y61_A_B.json +114 -0
  501. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4YEB_A_B.json +114 -0
  502. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4YFD_A_B.json +130 -0
  503. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4YH7_A_B.json +114 -0
  504. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/4ZS6_HL_A.json +86 -0
  505. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5C6T_HL_A.json +341 -0
  506. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5CXB_A_B.json +98 -0
  507. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5CYK_A_B.json +50 -0
  508. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5DWU_HL_AB.json +86 -0
  509. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5E6P_A_B.json +130 -0
  510. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5E9D_AB_CDE.json +154 -0
  511. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5F4E_A_B.json +242 -0
  512. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5K39_A_B.json +130 -0
  513. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5M2O_A_B.json +258 -0
  514. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5TAR_A_B.json +146 -0
  515. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5UFE_A_B.json +82 -0
  516. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5UFQ_A_C.json +66 -0
  517. skempi_foldx-0.2.2/skempi_foldx/data/results_sp/5XCO_A_B.json +194 -0
  518. skempi_foldx-0.2.2/skempi_foldx/exclusions.py +280 -0
  519. skempi_foldx-0.2.2/skempi_foldx/lookup.py +730 -0
  520. skempi_foldx-0.2.2/skempi_foldx/run.py +591 -0
  521. skempi_foldx-0.2.2/skempi_foldx/skempi.py +211 -0
  522. skempi_foldx-0.2.2/skempi_foldx/store.py +550 -0
  523. skempi_foldx-0.2.2/skempi_foldx/terms.py +68 -0
  524. skempi_foldx-0.2.2/skempi_foldx.egg-info/PKG-INFO +500 -0
  525. skempi_foldx-0.2.2/skempi_foldx.egg-info/SOURCES.txt +529 -0
  526. skempi_foldx-0.2.2/skempi_foldx.egg-info/dependency_links.txt +1 -0
  527. skempi_foldx-0.2.2/skempi_foldx.egg-info/requires.txt +12 -0
  528. skempi_foldx-0.2.2/skempi_foldx.egg-info/top_level.txt +1 -0
  529. skempi_foldx-0.2.2/tests/conftest.py +24 -0
  530. skempi_foldx-0.2.2/tests/test_skempi_foldx.py +3061 -0
  531. skempi_foldx-0.2.2/tests/test_version_consistency.py +532 -0
@@ -0,0 +1,636 @@
1
+ # Changelog
2
+
3
+ Energy values are tied to a version. A mutation's ΔΔG depends on the whole mutation list it was
4
+ computed in, so a rebuilt store is mostly a different measurement rather than a correction of the
5
+ same one — values from two versions are not interchangeable within one table. Where a release does
6
+ correct a value rather than recompute it, the entry says so and counts them. Entries below say
7
+ explicitly whether a release changes them.
8
+
9
+ ## 0.2.2 — 2026-09-09
10
+
11
+ **First release on PyPI.** `pip install skempi-foldx==0.2.2` is now the documented install.
12
+ Earlier releases are installable only from their git tags, which is how every release before this
13
+ one was distributed.
14
+
15
+ **No data changed.** The shipped store is byte-identical to 0.2.0 — same 4340 single-point and
16
+ 1767 multi-point records, same values on all twelve terms, verified by the digest the suite pins
17
+ over every shipped `(arm, identifier, mutation, term, value)`. A version names a measurement in
18
+ this package, so a version that moves no measurement says so explicitly: **0.2.0 and 0.2.2 are the
19
+ same numbers**, and a result computed against either stays correct without qualification. Nothing
20
+ here supersedes 0.2.0 as a measurement; it supersedes it only as a distribution.
21
+
22
+ ### Why 0.2.2 and not 0.2.1
23
+
24
+ A `v0.2.1` tag was published in August and withdrawn, and `CHANGELOG.md` records that a pin naming
25
+ it now fails outright. Reusing the number would have made that true statement false and would have
26
+ silently re-pointed any surviving `@v0.2.1` pin at unrelated content — the same defect this
27
+ release series exists to correct. 0.2.1 is skipped.
28
+
29
+ ### Changed
30
+
31
+ - The install instructions name PyPI.
32
+ - **Every link in `README.md` is absolute and pinned to this tag.** The README is the long
33
+ description, so it is also the PyPI project page, and PyPI's renderer leaves a relative path
34
+ alone: `](docs/STORE.md)` resolves against the project page URL and 404s. Thirty-two links --
35
+ every `docs/` reference, `CHANGELOG.md`, `NOTICE`, `CITATION.cff` — were relative, correct on
36
+ GitHub and dead for anyone arriving from PyPI. They name `blob/v0.2.2/` rather than `blob/main/`
37
+ so an old release's page keeps showing that release's claims. In-page anchors were already
38
+ safe; the renderer rewrites those. A test now fails on any relative link, on a pinned link
39
+ naming another version, and on one naming a path not in the tree.
40
+ - **The install-identity command no longer raises on an install from a file.** It read
41
+ `direct_url.json['vcs_info']['commit_id']`, guarded only against the file's absence — but a
42
+ wheel or sdist installed from a path writes `archive_info` instead, so the command raised
43
+ `KeyError` for a case the surrounding paragraph named as handled. It now reports the commit for
44
+ a git install, the archive for a file install, and `installed from PyPI` when there is no
45
+ `direct_url.json` at all.
46
+ - `CONTRIBUTING.md` describes publishing to an existing project rather than creating one, since
47
+ the trusted publisher is now registered and the pending form no longer applies.
48
+ - `tests/test_version_consistency.py` now requires a `skempi-foldx==<version>` pin in the README
49
+ and checks it tracks `pyproject.toml`. Until this release it asserted the opposite, because a
50
+ PyPI pin was a command that failed for every reader.
51
+
52
+ ## 0.2.0 — 2026-09-08
53
+
54
+ **An earlier `v0.2.0` tag, and a `v0.2.1` that existed briefly, have been withdrawn and replaced
55
+ by this release.** The two behave differently. `v0.2.1` no longer exists, so a pin naming it fails
56
+ outright; an install from it also reports `__version__ == "0.2.1"`, a version this changelog does
57
+ not record, and moving off it lowers the version string while raising the content. `v0.2.0` still
58
+ exists but now points at this tree, so a pin naming it still resolves — silently, to different
59
+ content than before, and `__version__` does not distinguish the two. Neither tag reached PyPI,
60
+ which had no release of this package until 0.2.2. No energy value differs
61
+ between those trees and this one,
62
+ so a result quoting the numbers stays correct; what they lacked was the `role` field on 16
63
+ records, described under [chain
64
+ mappings](#chain-mappings-and-16-role-names-lost-to-a-fused-column) below, and corrected metadata.
65
+ `__version__` does not distinguish them — for a git install the `direct_url.json` in an installed
66
+ distribution records the commit, and does.
67
+
68
+ The `v0.2.0` tag has been moved more than once: it was re-pointed on 2026-09-09 after this
69
+ release's documentation was corrected, and the earlier object is unreachable. **No energy value
70
+ differs across any of those moves** — the shipped store is byte-identical, and the suite now pins
71
+ a digest over every value so that a silent change is impossible within a version. What changed was
72
+ documentation, tests and CI. An install taken from `v0.2.0` at any point holds the right numbers;
73
+ reinstall only to get the corrected documentation and the packaging fixes.
74
+
75
+ To move an install off any of them, pip needs telling, since the version already matches:
76
+
77
+ ```bash
78
+ pip install --force-reinstall \
79
+ "git+https://github.com/cchin29/skempi-foldx@v0.2.0"
80
+ ```
81
+
82
+ **Energy values: 1850 of 6003 changed, and 4145 did not**, and eight could not be compared.
83
+ 26 of those changes are corrections — the interface-definition fix below, where 0.1.0 scored a
84
+ record against a pairing excluding the chain it mutates. Five more such records were registered as
85
+ defective but are zero in both releases, so they are not among the 1850: the registry counts 31
86
+ defective records, of which 26 moved. All 31 are under `2C5D` and `3SE4`: `3SE3` is the third code
87
+ SKEMPI defines twice, but its second definition contributes no mutation the first lacks, so
88
+ 0.1.0's pooling under the first stranded nothing there. `3SE3`'s own values do change between the
89
+ releases, but as ordinary recomputation rather than as corrections. The other 1824 changes are not
90
+ corrections: the two releases disagree there because a FoldX energy is a property of the run that
91
+ produced it, not of the mutation alone, and neither run's value is the more correct one.
92
+
93
+ `BuildModel` is deterministic: the same repaired structure and the same `individual_list.txt`
94
+ prefix return the same number, to the last decimal, every time. What moves a number is the list it
95
+ was computed in —
96
+
97
+ a record is a function of (repaired structure, mutation list), not of the mutation
98
+
99
+ — so the same mutation computed in a per-benchmark subset and in its complex's union list are two
100
+ different measurements, and neither is the more correct one. The dependence is measured; the
101
+ mechanism is not established, and FoldX's own documentation describes each line of the list as an
102
+ independent mutant built from the input structure. [docs/DETERMINISM.md](docs/DETERMINISM.md) sets
103
+ out the evidence and is explicit about what it does not show.
104
+
105
+ 0.2.0 computes every record in its complex's full union list, one list per interface definition.
106
+ Records whose 0.1.0 list already matched came out identical across all twelve terms; the rest
107
+ moved. The split is very uneven between the arms, because 0.1.0's single-point values already came
108
+ mostly from union lists while its multi-point arm came from a per-benchmark campaign:
109
+
110
+ | arm | unchanged | changed | |
111
+ |---|---:|---:|---:|
112
+ | single-point | 3970 | 262 | 6% |
113
+ | multi-point | 175 | 1588 | 90% |
114
+
115
+ Eight of the 6003 are not comparable: the eight doubled-code mutations that no longer resolve by
116
+ code alone. `1S0W AB142F` was a ninth until the fixed chain-mapping parser gave its record a
117
+ `role` name; it now pairs, and is identical across the releases.
118
+
119
+ Among the 1850 that moved, the median shift in `Interaction Energy` is 0.208 kcal/mol and 69% are
120
+ under 0.5 — but the tail reaches 9.96, at `4K71_A_BC GA503R,AA545V` (11.05 → 1.09), and 129
121
+ records change sign between stabilising and destabilising.
122
+
123
+ The changes are concentrated rather than scattered: all 262 single-point ones fall in 29 of the
124
+ 323 paired interface definitions, and every multi-point definition that came through unchanged
125
+ holds four or fewer variants. Within a changed list, the size of the shift tracks side-chain
126
+ repacking freedom — crowded sites, many simultaneous substitutions, bulky flexible replacements —
127
+ while alanine substitutions barely move.
128
+
129
+ Against experiment the two releases are equivalent on the records they share: single-point Spearman
130
+ 0.435 → 0.436, multi-point 0.574 → 0.587, on 4053 and 1576 rows. Restricted to the records that
131
+ actually changed, a paired bootstrap puts every interval across zero, so **the data does not
132
+ separate the releases on agreement with experiment** — the multi-point figure moves in the
133
+ direction a union-list value should, and not by enough to claim. As a feature column they track at
134
+ ρ 0.994 (single-point, MAE 0.016) and ρ 0.944 (multi-point, MAE 0.469). **A single-point model
135
+ trained on 0.1.0 is not invalidated by 0.2.0**; a multi-point one is measurably sensitive to which
136
+ release produced its features, and a retrain is what settles the size.
137
+
138
+ The case for 0.2.0 is the interface-definition fix and one list composition per definition, not
139
+ better correlation with experiment.
140
+
141
+ **Do not mix 0.1.0 and 0.2.0 values in one table.** Two thirds of the store is unchanged, so a
142
+ mixed table looks self-consistent while a third of its rows are a different measurement. Pin a tag.
143
+
144
+ Record-by-record counts, magnitudes, the scatter and the reproduction recipe are in
145
+ [docs/VERSIONS.md](docs/VERSIONS.md).
146
+
147
+ ### The record unit — the SKEMPI identifier
148
+
149
+ A record is now named `<pdb>_<group1>_<group2>` — `1BRS_A_D`, `2C5D_A_C`, `2C5D_AB_CD` — because
150
+ that is what SKEMPI names a row by, and three codes appear under two such names. 0.1.0 keyed on the
151
+ code, kept whichever pairing came first, and pooled the rest under it, so 31 records were scored
152
+ against an interface excluding the chain they mutate. That failure was invisible in the output: a
153
+ mutation outside the analysed pair moves neither side of `IE(mut) − IE(wt)` and returns a clean
154
+ zero, indistinguishable from a measurement of no effect.
155
+
156
+ Across the three codes, 26 of 0.1.0's records were zero on all twelve terms — a different set of
157
+ 26 from the corrections counted above, overlapping it in 15 members. Recomputed against their own
158
+ pairings, **15 of those 26 carry real signal**, up to 6.85 kcal/mol — `3SE4_B_A RA226A` goes
159
+ 0.0000 → 6.8535.
160
+
161
+ `load_skempi` is keyed by identifier and `SkempiComplex` carries `.id`; `by_pdb()` regroups for the
162
+ steps that are per structure. `FoldxLookup` resolves a bare code wherever it names one record —
163
+ ambiguity is per `(code, mutation)`, not per code, and affects **8 of the 111** mutations under
164
+ those three (`2C5D`'s two definitions share none at all). For the 8, `get` returns its default and
165
+ `require` raises naming both identifiers rather than choosing. `definitions_of(code)` lists them.
166
+
167
+ **Removed**: `COLLAPSED_INTERFACES`, `CollapsedInterface`, `N_INTERFACE_SUSPECT`,
168
+ `interface_suspect()`, `FoldxLookup.is_interface_suspect()`, `SkempiComplex.alternate_groups` and
169
+ `mutations_outside_interface()`. They described a defect this layout does not have, and a guard
170
+ that can no longer fire is worse than no guard — it reads as a check that passed.
171
+
172
+ **Added**: `SkempiComplex.id`, `by_pdb()`, `pool_by_code()`, `code_of()`,
173
+ `FoldxLookup.definitions_of()`, `FoldxLookup.is_malformed()`, `MALFORMED_ROWS`, `MalformedRow`,
174
+ `is_malformed()` and `announce_malformed()`.
175
+
176
+ **Added — `skempi_foldx/data/corrections_from_0_1_0.csv`.** The 31 records the 0.1.0 registry
177
+ flagged as scored against a pairing excluding the chain they mutate: the 26 whose values moved and
178
+ the 5 that are zero in both releases. It carries *both* releases' keys, because 11 of the 26 are
179
+ keyed differently — 0.1.0 names them under the bare code with the other pairing's chain letter, so
180
+ `3SE4_B_A DA117A` here is `3SE4 DB117A` there — and a join on the 0.2.0 name alone finds nothing
181
+ for exactly the records with the largest corrections, which reads as "unaffected". It ships in
182
+ both the sdist and the wheel, so the question "is one of my rows provably wrong?" is answerable
183
+ from an install, without a checkout:
184
+
185
+ ```python
186
+ import csv, importlib.resources as res
187
+ with res.files("skempi_foldx").joinpath("data/corrections_from_0_1_0.csv").open() as fh:
188
+ corrections = {(r["pdb_010"], r["mutation_010"]) for r in csv.DictReader(fh)
189
+ if r["moved"] == "True"}
190
+ ```
191
+
192
+ Also added, all for asking a question that previously only a warning answered:
193
+ `check_identifier()` and `check_code()`, which validate a SKEMPI identifier and a PDB code where
194
+ either becomes a filename; `FoldxLookup.conflicts`, the names that resolved to more than one
195
+ record, one entry per additional claimant as `ConsolidationReport.summary` counts them; and
196
+ `FoldxLookup.pooled_codes`, the codes indexed both as a record key and as interface definitions.
197
+
198
+ That last one names the single route by which a bare doubled code can still answer. A store
199
+ keyed by PDB code — every store this package shipped before 0.2.0 — pools a code's definitions
200
+ under one name, and an exact key hit resolves before the ambiguity refusal is consulted, so
201
+ mixing that store with an identifier-keyed one returns the pooled record rather than the
202
+ pairing-specific one. Which record the caller wanted is not decidable here, so the condition is
203
+ reported rather than resolved. Loading one store convention at a time avoids it entirely.
204
+
205
+ **Changed — the agreement check no longer fails open.** `audit()` and `consolidate()` decide
206
+ whether two sources agree from `max|Δ|` across the shared terms, and two comparisons that cannot
207
+ be made were reading as comparisons that succeeded. A non-finite term returned `nan`, and every
208
+ comparison against `nan` is False, so a source pair disagreeing `1.0` against `NaN` was reported
209
+ as agreeing; `json.loads` accepts bare `NaN`, so a foreign results directory can supply one. Two
210
+ records sharing no term at all returned `0.0`, reported as identical. Both now return infinity.
211
+ `term_vector` refuses a non-finite term for the same reason, which `FoldxLookup.vector` already
212
+ did — the two are documented as the same operation and must not disagree about what a valid
213
+ record is.
214
+
215
+ **Changed — a `mapping_dir=` that contradicts the store is refused rather than believed.** A
216
+ record that ships a `role` already carries this computation's known-good answer. When the
217
+ recompute from a supplied mapping directory disagrees, the mapping files describe different
218
+ residue numbering than the ones that built the store, and installing the recomputed name would
219
+ alias a label belonging to another mutation — answered confidently and counted as covered. The
220
+ shipped name now wins, `FoldxLookup.role_mismatches` lists the disagreements and a warning names
221
+ them. With correct mappings the recompute is exactly idempotent, so this cannot fire on good
222
+ input. `load_chain_mapping` also now requires a single-character chain and a numeric residue
223
+ number, since a header row previously parsed as a chain of its own and shifted every later
224
+ offset — one way a mapping set comes to disagree in the first place.
225
+
226
+ **Changed — `reindex_by_skempi_id` announces a collision instead of dropping a record.** Two
227
+ records re-keying onto one name is a collision, not a merge; the first is kept, as `consolidate()`
228
+ does, and the rest are reported. It stays an identity map on the shipped store. The store-level
229
+ `coverage()` docstring now says plainly that it resolves no naming — on the bundled store it
230
+ reports 19.6% where `FoldxLookup.coverage()` reports 100% over the same rows.
231
+
232
+ **Changed — identity-based role inference no longer guesses a residue number.** With
233
+ `skempi_csv=` but no `mapping_dir=`, `FoldxLookup` infers a record's role-chain name by matching
234
+ substitution identity. The role convention renumbers each chain by the cumulative residue count of
235
+ the chains before it in its group; that inference has no residue counts, so the author position is
236
+ the role position only for the first chain of a group. For any other chain it produced a label in
237
+ neither convention — the role chain letter with the author number — which named no record and so
238
+ installed an alias onto whichever record carried that substitution. On the bundled store that was
239
+ 863 aliases, each answering a role label that belongs to a different mutation, counted as covered,
240
+ with `is_exact` still reporting `True`. Such labels are now refused, leaving them unresolved;
241
+ `mapping_dir=` resolves them exactly, as it always did.
242
+
243
+ **Changed — every name that becomes a path is validated where it becomes one.** A record
244
+ identifier and a PDB code are both parsed from column 0 of a caller-supplied `skempi_v2.csv`,
245
+ which nothing upstream constrains, and both reach the filesystem: `write_store` and
246
+ `FoldxConfig.result_path`/`complex_work_dir`/`find_repaired` build filenames from an identifier,
247
+ `run.py` and `load_chain_mapping` build them from a code. Each validates at the join rather than
248
+ at the parse, because the join is the one place every route passes through.
249
+ `experiments/build_per_definition_store.py` checks the whole store before it removes the previous
250
+ one, since a removal partway through would cost the data the check exists to protect.
251
+
252
+ ### Contents
253
+
254
+ | | definitions | codes | records | of SKEMPI | excluding `1KBH` |
255
+ |---|---:|---:|---:|---|---|
256
+ | single-point | 323 | 322 | **4340** | 4340 / 4343 | **100%** |
257
+ | multi-point | 154 | 152 | **1767** | 1767 / 1850 | **100%** |
258
+
259
+ The entire shortfall is `1KBH` — 3 single-point and 83 multi-point — whose `RepairPDB` does not
260
+ terminate under FoldX 5.1. No amount of compute closes it. Quote the denominators with the
261
+ exclusion stated; a bare "of 1850" implies a target that does not exist.
262
+
263
+ The denominators count per definition, which is why they differ from 0.1.0's by-code 4337 and 1848.
264
+
265
+ ### One key convention, and a shipped role name
266
+
267
+ Every key is SKEMPI's author-chain form: 4340 and 1767 records with `key == cleaned`, no
268
+ exceptions. 0.1.0's single-point arm split 3012/1226 between that form and the role-chain form;
269
+ its multi-point arm was already all author form, so the mixture was 4777/1226 across the store.
270
+
271
+ Because one convention alone would strand role-labelled split files, a record whose role name
272
+ differs from its key now carries that name in a **`role`** field, computed from the chain mappings
273
+ at build time — 3887 of 6107 records. For all 2220 of the rest the role form *is* the key, because
274
+ the chain sits first in its group and so carries offset 0. Asked by identifier, the two together
275
+ recover every one of 0.1.0's 1226 role keys.
276
+
277
+ A field rather than a second key convention, deliberately: `skempi_v2.csv` is not redistributable,
278
+ so a consumer resolving role labels at read time would need the one input they cannot have.
279
+
280
+ ### Chain mappings, and 16 role names lost to a fused column
281
+
282
+ `load_chain_mapping` reads each chain's residue count from a SKEMPI `.mapping` file, and
283
+ `to_role_form` accumulates those counts into the offsets a role-chain name is built from. The
284
+ files are fixed-width, so **an author number of 1000 or more runs into the chain letter** and the
285
+ line arrives as three whitespace fields rather than four — `ALA C1001 1`. Requiring four fields
286
+ dropped every such residue. Eleven of 345 mapping files carry them.
287
+
288
+ Two consequences, both silent:
289
+
290
+ * `2NYY` and `2NZ9` chain A measured **971 residues instead of 1267**, so `to_role_form` rejected
291
+ 14 in-range mutations as out of range.
292
+ * `1S0W` and `1XXM` lost the **whole** of chain C, whose residues are numbered 1001–1165, so the
293
+ group loop bailed before any arithmetic and 2 more records got no name.
294
+
295
+ Neither raises. A role-keyed join simply missed those 16 records, since `None` is also how
296
+ `to_role_form` refuses an insertion code. Worse in principle than in fact: for a *later* chain in
297
+ a group, a short count does not decline anything — it shifts every subsequent offset, aliasing
298
+ records onto residues they do not describe. The field is now split back apart in
299
+ `load_chain_mapping`, where the damage starts, rather than guarded against downstream.
300
+
301
+ The 16 names were added to the shipped store by `experiments/backfill_role_names.py`, which
302
+ derives them from the interface identifier alone and so needs neither the mapping files nor
303
+ `skempi_v2.csv`. It is an audit script, not a CI gate; what CI holds is the store, through
304
+ `test_shipped_store_matches_the_backfill_rule`.
305
+
306
+ Verified two ways rather than argued. Recomputing the role name of **all 6107** shipped records
307
+ with the fixed parser reproduces every one — 0 additions, 0 losses, 0 disagreements — so the store
308
+ and its build script agree again. And against the withdrawn `v0.2.0` tag the store gains 16 role
309
+ fields and **changes no value**: 6107 records compared field by field, 0 non-`role` differences.
310
+ The same holds against the tree the withdrawn `v0.2.1` tag pointed at, whose store is identical to
311
+ the first's. Neither tree is reachable from any tag now, so the comparison is stated here rather
312
+ than reproducible.
313
+
314
+ ### Coverage figures and the interface identifier
315
+
316
+ `experiments/coverage_report.py` reduced a split's sequence id to its bare PDB code, discarding
317
+ the chain groups the id carries. That made `3SE4` and `3SE3` — the codes SKEMPI defines under two
318
+ pairings — unresolvable, since a bare code then has two right answers, and it *conflated* the two
319
+ pairings' rows in the denominator as well. It now reads `1A22.A.B_A` as `1A22_A_B`.
320
+
321
+ **That fix alone accounts for the whole change**: the splits this store was built for go from
322
+ 4153/4159 and 1632/1634 to full coverage at 4165 and 1636, with the role names making no
323
+ difference to those two figures. The 16 recovered names move a different split — a 1100-row
324
+ S1102 partition goes from 1099 to 1100, on `1S0W`.
325
+
326
+ ### Provenance
327
+
328
+ Sources are the repair sweep's `round_1` for the 468 definition-arms whose code SKEMPI defines
329
+ once, and nine per-definition campaigns for `2C5D`, `3SE3` and `3SE4`, from
330
+ `recompute_alternate_interfaces.py --all-definitions`. `round_1` cannot serve those three: its
331
+ worklist pools both definitions into one list, so its values belong to no single pairing's list.
332
+
333
+ **Mixing the two is measured, not assumed.** `3SE3`'s `B,A` multi-point arm was recomputed as a
334
+ per-definition campaign seeded from the *original* campaign's repaired structure, while `round_1`
335
+ came from the *sweep's own* repair chain: 30 of 30 records agree to the last decimal, on an
336
+ identical mutation-list hash.
337
+
338
+ Per-record `_source` names the campaign. `CONSOLIDATION_REPORT.txt` is rewritten to match — each
339
+ record has exactly one source by construction, so there is no precedence order and no conflicts to
340
+ arbitrate. The report ships as written by `experiments/build_per_definition_store.py`; there is no
341
+ regeneration script, deliberately, since one pointed at this store would overwrite the shipped
342
+ report with a description of a store that no longer exists.
343
+
344
+ Against SKEMPI's measured ΔΔG the shipped values reach Spearman **0.437** single-point (4081 rows)
345
+ and **0.587** multi-point (1580), deduplicating on `(identifier, mutation)` and keeping the first
346
+ row. Keeping the last gives 0.439 and 0.589 — worth stating, since the two differ in the third
347
+ decimal and nothing in the data says which convention a reader assumed.
348
+
349
+ ### Substitution order in a multi-point label
350
+
351
+ Six multi-point *mutants* are written two ways — SKEMPI lists both orderings, and both are
352
+ computed and shipped, so these six mutants account for twelve of the 1767 records:
353
+
354
+ | record | spellings | \|Δ Interaction Energy\| |
355
+ |---|---|---:|
356
+ | `1JTG_A_B` | `DB49A,KA208A` / `KA208A,DB49A` | 0.499 |
357
+ | `1JTG_A_B` | `DB49A,RA217A` / `RA217A,DB49A` | 0.647 |
358
+ | `1JTG_A_B` | `DB49A,SA105A` / `SA105A,DB49A` | 0.481 |
359
+ | `2WPT_A_B` | `DA30A,FB79A` / `FB79A,DA30A` | 0.639 |
360
+ | `3S9D_A_B` | `EB66A,RA120A` / `RA120A,EB66A` | 0.014 |
361
+ | `4L3E_ABC_DE` | `RA65A,YD26A` / `YD26A,RA65A` | 0.078 |
362
+
363
+ They are not duplicates of each other: order is part of the mutation list, so the two spellings
364
+ are two positions in that list and the energies differ accordingly — by up to 0.647 kcal/mol here.
365
+ A consumer canonicalising a label by sorting its substitutions collapses each pair and keeps an
366
+ arbitrary one of the two. Neither is more correct; if you canonicalise, do it consistently and say
367
+ which you kept.
368
+
369
+ ### Malformed SKEMPI rows
370
+
371
+ `MALFORMED_ROWS` is a trust guard on computed values, not a compute guard. Nothing about the two
372
+ `2C5D` rows resists computation: the string names three substitutions, FoldX returns the energy of
373
+ those three, and every comparator pipeline whose source was read computes the same mutant. What is
374
+ defective is the arity the label claims — 3-substitution mutants recorded as 4.
375
+
376
+ So they are computed, shipped and flagged rather than dropped. Dropping them would leave
377
+ `is_malformed()` and the load-time warning guarding an empty set, and would move the other 17
378
+ values in that complex's list, since a record is a property of the list it was computed in.
379
+ `announce_malformed` names the rows and returns them without touching the list.
380
+
381
+ The registry is new in 0.2.0, so no 0.1.0 consumer has a symbol to migrate. It is recorded here
382
+ because the two rows are shipped in both releases and a reader needs to know what they are.
383
+
384
+ ### Findings from the 0.1.0-era campaign directories
385
+
386
+ Four results computed from the pipeline's own campaign output — the `scratch/` directories a run
387
+ leaves behind, which are not shipped. The first two answer questions the 0.1.0 documentation left
388
+ open; the last two came out of the same material:
389
+
390
+ - `CONSOLIDATION_REPORT.txt` became regenerable again, which established one correction to the
391
+ 0.1.0 report: its conflict line counted source-pair rows and called them mutations, so "1970
392
+ mutations present in more than one source" should have read "1027 mutations … giving 1970
393
+ source-pair disagreements". The overstatement was ~1.9×. The report this release ships is
394
+ written by `experiments/build_per_definition_store.py` and describes a store with one source
395
+ per record, so it has no conflict line at all.
396
+ - The repair-count question is **answered on both halves**. Energy by
397
+ `experiments/repair_convergence.py`; structure from the sweep's per-round `repair_round_<r>.pdb`
398
+ chain. `RepairPDB` moves side chains only (Cα RMSD exactly 0.0000 at every step, all 344
399
+ complexes). Against the structure's 0.23 convergence ratio, the *typical* single-point mutation
400
+ settles faster (median 0.16) and the *average* settles slower (mean 0.57); multi-point is
401
+ slower on both. Ranking is robust regardless — round 1 vs round 4 Spearman 0.9295 / 0.9492.
402
+ - **Two SKEMPI rows are malformed upstream**, both in `2C5D_AB_CD`, both shipped in 0.1.0:
403
+ `RA32E,KA34E,RB32E,KA34E` and `EC30R,EC33R,ED30R,EC33R` each repeat a substitution instead of
404
+ applying the symmetric partner (`KB34E`, `ED33R`). Verified against `skempi_v2.csv` — 2 of 7085
405
+ rows, the only such rows in the file. They are 3-substitution mutants labelled as 4-substitution.
406
+ **Registered** in `skempi_foldx.MALFORMED_ROWS` at mutation granularity and deliberately not
407
+ corrected. Reading the published source of the comparator pipelines shows no pipeline drops them
408
+ and all compute the same 3-substitution mutant, so the values here are not anomalous — the
409
+ discrepancy is confined to the arity label, which the surveyed pipelines record inconsistently (3
410
+ in USP-ddG, 4 in RDE-Network and MINT) while all compute the same three-substitution mutant.
411
+ - `docs/DETERMINISM.md`'s agreement statistics are recomputed and no longer marked unverified,
412
+ by `experiments/agreement_stats.py`. **A comparison count of 10631, quoted in 0.1.0's
413
+ `docs/DETERMINISM.md`, is not reproducible from the campaign directories and has been retired**;
414
+ the single correct population is 1527 shared mutations over 5870 comparisons, which the
415
+ determinism table already described. Every quantity in that table moved — pooled RMSD 0.45 →
416
+ 0.524, ICC 0.96 → 0.972, sign flips 2.4% → 3.0% — and the least-stable term is entropy mainchain
417
+ (0.923), not torsional clash. The qualitative conclusions are unchanged.
418
+
419
+ ### Fixed — claims about other groups' work, published in 0.1.0
420
+
421
+ These were measured or attributed wrongly in 0.1.0's documentation, which remains public. Each is
422
+ restated as what can be checked against the cited source:
423
+
424
+ - The CATH-ddG test split was described as 39% multi-point. It is **33%** — 270 of 813 rows,
425
+ recomputed from that project's own released split. The 13 complexes the repair-count measurement
426
+ runs on were labelled a "T≥10 tier"; that paper defines no such tier, and the threshold is its
427
+ per-PPI metric filter of ten rows per PPI. They hold 699 of the 813, `1JTG_A_B` alone
428
+ contributing 275 — rows rather than distinct mutations, a distinction the text now draws, since
429
+ those 275 rows are the 194 mutations this store holds for that definition.
430
+ - The repair sweep's rationale claimed 5× repair moved the per-structure Spearman "past the
431
+ published single-point FoldX row of 0.4458". The 5× interval is [0.3455, 0.5695] and spans that
432
+ value rather than resolving against it — which is what `docs/DETERMINISM.md` already said, and
433
+ what the sweep's own summary now says.
434
+ - The repair-count discussion asserted that two papers reporting gains on binding data "both
435
+ confound repair count with other pipeline changes", naming and citing neither. Restated as what
436
+ can be checked: no report isolates repair count from the other changes made alongside it.
437
+ - The comparator survey counted three works reporting a FoldX baseline that appears elsewhere.
438
+ There is a fourth outside the ΔΔG tables: PPIformer reports no FoldX ΔΔG row, but its
439
+ antibody-retrieval table carries one and states that it is reproduced from RDE-Network. The
440
+ survey's own thesis is that a reported FoldX baseline is not always a fresh run, so an em-dashed
441
+ row was hiding an instance of it. Of the three already counted, two were given an innocent
442
+ reading and the third now carries the caveat the section's own sourcing note implies: a value
443
+ may be attributed in a section not read.
444
+ - A comparator that dedupes without a comment was described as doing so "silently" beside one that
445
+ does it "deliberately". The evidence in the same paragraph shows the behaviour is load-bearing
446
+ either way, so the adverbs were doing work the data does not support.
447
+ - GearBind states "we use FoldX 4 for mutant structure generation" — the only work surveyed to
448
+ name a major version other than 5, and a comparability axis the survey raises for CATH-ddG's 5.0
449
+ against this store's 5.1. It went unrecorded.
450
+ - CATH-ddG's `RepairPDB` count was attributed to supplementary section 1.4, which prints the
451
+ command lines but states no count. The quoted string is in section 1.11, on computational
452
+ efficiency.
453
+ - RDE-Network's widely-quoted 0.3789 is a per-structure **Pearson**. Every other correlation in
454
+ these documents is a Spearman, so leaving the metric unnamed invited the wrong reading.
455
+ - The FoldX documentation says structures should be repaired before modelling without naming a
456
+ count; "FoldX's manual recommends one repair" is Usmanova et al.'s reading of it, and is now
457
+ attributed to them. The `--numberOfRuns` discussion likewise now records that the vendor's two
458
+ pages differ — one says "normally it should be set to 1", the other recommends 3.
459
+ - Two figures carrying the argument that the observed spread is not FoldX noise — the ±3.5 kcal/mol
460
+ binding interval and the 0.46 kcal/mol calibration SD — were quoted without sources. Both are now
461
+ in `docs/REFERENCES.md`, which claims to cover every work named under `docs/`.
462
+ - A claim that every published baseline row "was produced at the single-run default" was an
463
+ inference from the default presented as knowledge. What is checkable, and now stated, is that
464
+ none of those papers records a run count at all.
465
+
466
+ ### Fixed — citation metadata
467
+
468
+ - `CITATION.cff` carried `license: MIT AND CC-BY-4.0`. That is an SPDX *expression*, and CFF 1.2's
469
+ `license` field takes an identifier or an array of them — an array the schema reads as **OR**, so
470
+ neither spelling states the licence this work is under. The field is omitted rather than guessed
471
+ at: `LICENSE`, `NOTICE` and `pyproject.toml`'s `MIT AND CC-BY-4.0` are the record, and CFF cannot
472
+ express it. Dropping it is deliberate, not an oversight — an array here would publish that a
473
+ consumer may take the whole work under MIT alone, discarding the CC BY attribution that `NOTICE`
474
+ states as a licence term rather than a courtesy, on data derived from SKEMPI 2.0.
475
+ - Two works cited in the prose were absent from `references` — the Protein Data Bank, and
476
+ RDE-Network among the surveyed comparator pipelines.
477
+
478
+ ### Added
479
+
480
+ - Release-metadata tests, `tests/test_version_consistency.py`. The version is written in
481
+ `__version__`, `pyproject.toml`, `CITATION.cff`, this file's newest heading and three times in the
482
+ README; the supported Python range is written in the `requires-python` specifier, the
483
+ classifiers and the CI matrix. Nothing checked either group, and an unchecked version
484
+ declaration is how a tag comes to describe a tree it does not match.
485
+ - Among them, `test_readme_install_pin_matches_pyproject`: the install command is a version
486
+ declaration too, and the one with the shortest path to a reader. For a package distributed by
487
+ git tag, a stale `@vX.Y.Z` there does not merely misdocument, it installs the previous release.
488
+ - `test_dev_extra_names_the_parsers_this_file_needs`. Without `tomli` and `pyyaml` most of that
489
+ suite is import-guarded into silence — a green bar reporting that nothing ran. Read as raw text,
490
+ since using the TOML parser to check that the TOML parser is declared would skip in exactly the
491
+ case worth catching.
492
+ - `test_requires_python_excludes_nothing_it_advertises`, for the `!=3.x.*` form. A floor and a
493
+ ceiling cannot express it, so an exclusion would leave three files disagreeing with no bound out
494
+ of place to notice.
495
+ - A CI step refusing a tag whose name disagrees with the version in the tree it points at. The tag
496
+ is what publish.yml uploads, so it is the one version declaration that lives outside the
497
+ tree and could not be checked from inside it.
498
+ - The bundled multi-point definition count and the role-name alias are asserted in the suite as
499
+ well as in the wheel-build step of both workflows. There they read as duplicates of assertions
500
+ made elsewhere and are not: the wheel check answers whether the store survived packaging, which
501
+ no test of the source tree can.
502
+ - Continuous integration, `.github/workflows/tests.yml` — 0.1.0 shipped no `.github/` at all.
503
+ Six interpreters, and it runs on version tags as well as `main` and pull requests: a tag can
504
+ point at a commit the branch never ran, and for a git-tag-installed package that tag is what a
505
+ consumer resolves. Every action in both workflows is pinned by
506
+ commit SHA, with the version in a trailing comment: a tag is a mutable ref, and an action that
507
+ moves under a workflow holding `id-token: write` moves what can mint a PyPI token.
508
+ - `publish.yml` also accepts `workflow_dispatch`, against a tag. A tag push is still the release,
509
+ but a first upload to a project PyPI has never seen needs a trusted publisher registered first,
510
+ and that is a browser action outside this repository — so every gate here can pass and the
511
+ upload still fail on configuration alone. Without a manual trigger the only remedies are
512
+ re-running a failed run or moving a published tag. The version assert reads `GITHUB_REF_NAME`,
513
+ so dispatching against a branch is refused, which is the intended behaviour.
514
+ - The local-path scan, `.github/leakscan.sh`, a script rather than a command for each caller to
515
+ copy, so that CI and the pre-release checklist in `CONTRIBUTING.md` cannot drift apart — two
516
+ copies of a pattern this fiddly will not stay in step. The pattern does not match its own source
517
+ line, which is what lets it scan `.github/` at all. It reaches capitalised home directories, the
518
+ JSON-escaped spelling of a path separator, and remote-host forms that name no command, and it
519
+ scans `NOTICE` and `LICENSE` — while not firing on a PEP 508 direct reference, a registry
520
+ digest, or an email address followed by a colon.
521
+ - `CONTRIBUTING.md`. The licence is `MIT AND CC-BY-4.0`, not a plain OSI licence, so the terms a
522
+ contribution is offered under are not inferable from the file layout — and a data contribution
523
+ is not the same kind of thing as a code one here. It also carries the pre-release checks that
524
+ only hold for the tree a release is built from rather than for the commit.
525
+
526
+ ### Corrected before publication
527
+
528
+ A full review of every published surface — numeric recomputation against the shipped store,
529
+ cross-document consistency, standalone reading, three audiences, and release mechanics with
530
+ mutation testing — ran against this tree before the tag was moved. No energy value changed. What
531
+ it found:
532
+
533
+ - **The install instructions named PyPI, where this package does not exist.** The Quickstart's
534
+ first command was `pip install skempi-foldx==0.2.0`, and five further passages asserted a PyPI
535
+ presence. Every release installs from its git tag; the documents now say so, and a test refuses
536
+ a `skempi-foldx==` pin in the README.
537
+ - **"Neither withdrawn tag resolves" was half wrong, in the dangerous direction.** `v0.2.1` fails
538
+ outright, but `v0.2.0` resolves to this tree — silently, with different content than the
539
+ withdrawn one. Both cases are now stated separately.
540
+ - **The version-detection one-liner crashed on the install it was written for.**
541
+ `direct_url.json` exists only for a git or local install, so `json.loads` was handed `None`. It
542
+ now reports rather than raising, and the release's commit can be obtained from the remote, since
543
+ a release cannot state its own hash.
544
+ - **Counts that summed the two arms were labelled as distinct entities.** 477 is `(arm,
545
+ definition)` pairs, not interface definitions — there are 347, because 130 appear in both arms.
546
+ The same applied to 476 paired tiles, to 151 definitions holding one record (97 distinct), and
547
+ to "4343 single-point mutations", which counts entries: the shipped 4340 are 4334 distinct
548
+ mutations. Each is now labelled, with the distinct figure alongside.
549
+ - **`docs/DETERMINISM.md` gave a both-arms count in a single-point-only paragraph** (194 where the
550
+ arm holds 58), and the changelog called six multi-point *mutants* six *records*; they are twelve.
551
+ - **The repair-count claim this release retracted survived in two code files.**
552
+ `config.py` and `experiments/repair_ablation.py` still called one pass "FoldX's own documented
553
+ recommendation" after the prose had re-attributed that reading to Usmanova et al.
554
+ `docs/REFERENCES.md` stated their finding without the qualifier that it concerns *folding* ΔΔG.
555
+ - **The README under-stated the repair-count evidence its own docs carry**, quoting only a
556
+ 13-complex pilot and dismissing it, where the completed four-round sweep over 344 complexes
557
+ finds no round after which the store stops changing.
558
+ - **Platform provenance was in the wrong document.** The architecture split between the two inputs
559
+ is now in `docs/STORE.md`'s provenance section, alongside the repair count.
560
+ - **A statistic no shipped script computes has been removed** rather than restated: the χ-angle
561
+ Mann-Whitney p-value could not be reproduced from the tree. The counts and medians it summarised
562
+ remain, and are regenerable.
563
+ - **`experiments/repair_ablation.py` described the 0.1.0 store shape** and a scope size that the
564
+ rebuild changed (98 complexes, now 99).
565
+ - **Both `MALFORMED_ROWS` sat unmarked in the corrections table**, which a 0.1.0 consumer is told
566
+ to check against; they are now footnoted as wrong in *both* releases.
567
+ - **`CONTRIBUTING.md` mis-stated the release mechanics** — that the recommended push forces (it
568
+ does not), that pushing a tag is the whole release (the upload can still fail on configuration),
569
+ and that a *version* rather than a *project* PyPI has never seen is the case needing care.
570
+
571
+ ### Hardened
572
+
573
+ - **`publish.yml` refused a branch by name, not by kind.** The version assert compared
574
+ `GITHUB_REF_NAME` against `pyproject.toml`, so a `workflow_dispatch` against a branch named
575
+ `0.2.0` — a release-prep branch named after its version is an ordinary thing to make — passed
576
+ it and would have published an untagged tree. The job now refuses any ref that is not a tag,
577
+ and does so as a failure rather than a skipped step.
578
+ - `actions/checkout` no longer persists the job token into the one job that executes the tagged
579
+ tree.
580
+ - **Five invariants had no test that noticed them being broken**, found by mutating each and
581
+ re-running the suite: the refusal to infer an author form from a name SKEMPI does not list
582
+ (a third route to the fabricated-alias class this release exists to close); building a role name
583
+ from the record's own interface definition rather than another pairing of its code; first-store-
584
+ wins on a conflict; the shipped store containing no excluded complex; and the energy values
585
+ themselves, now pinned by digest.
586
+
587
+ ### Changed
588
+
589
+ - Python classifiers name **3.9 through 3.14** individually, and CI builds all six. 0.1.0's
590
+ metadata said only `Programming Language :: Python :: 3`; there was never a resolution reason to
591
+ advertise less than the package supports — it has no dependencies — only an untested one. The
592
+ 3.9 leg is pinned to `ubuntu-24.04` pre-emptively: `actions/python-versions` publishes no
593
+ `linux-26.04` build for 3.9 at any patch level, 3.9 having reached end of life before that image
594
+ existed. `ubuntu-latest` still resolves to 24.04 today, so that pin is
595
+ currently a no-op; 3.10 reaches end of life in October 2026 and its 26.04 coverage begins only
596
+ at 3.10.20, so a second entry is expected on the same grounds.
597
+ - `MANIFEST.in` names files by extension instead of grafting `docs/`, `tests/` and `experiments/`.
598
+ A graft walks the filesystem rather than git, so it shipped whatever running the pipeline left
599
+ behind — including `rotabase.txt`, which is FoldX's own licensed support data and not this
600
+ project's to redistribute, and a generated CSV withheld because it carries per-row SKEMPI
601
+ affinity data. The protection is defeated by a stale `egg-info/SOURCES.txt`, so `CONTRIBUTING.md`
602
+ gives the clean-build check that catches it.
603
+ - **This release was not distributed on PyPI**, and installs from its git tag. `publish.yml`
604
+ shipped ready — it uploads on a version tag via Trusted Publishing, gated on the ref being a
605
+ tag, on the tag matching `pyproject.toml`, on the suite, and on the shipped store being present
606
+ in the built wheel — but no upload was made from it. A PyPI upload cannot be undone, and here a
607
+ version names a measurement rather than a code state, so the first upload was made its own
608
+ release rather than a side effect of this one; that is 0.2.2, which carries these same energies.
609
+ - `Changelog` and `Issues` join the project URLs.
610
+ - The `dev` extra names `build`, which the pre-release checklist in `CONTRIBUTING.md` invokes.
611
+ - Entries here are newest-first, per Keep a Changelog.
612
+ - README code blocks are kept narrow, so they are not clipped where the rendered description
613
+ column is narrower than GitHub's.
614
+
615
+ ## 0.1.0 — 2026-08-01
616
+
617
+ First public release. **Energy values: initial.**
618
+
619
+ - 6003 records over 344 complexes: 4238 single-point mutations across 322, and 1765 multi-point
620
+ variants across 152. Twelve `AnalyseComplex` terms per record, as mutant minus wild-type.
621
+ - `FoldxLookup` resolves the naming conventions a mutation appears under, which is the
622
+ difference between 65.4% and 99.6% coverage on a split whose labels are role-chain.
623
+ - Every value computed with a single `RepairPDB` pass, at FoldX 5.1.
624
+
625
+ Known limitations, each documented where it applies:
626
+
627
+ - **Three PDB codes carry two SKEMPI interface definitions each** (`2C5D`, `3SE3`, `3SE4`). The
628
+ parser keys on the code, so 31 records are scored against an interface excluding the chain they
629
+ mutate. `interface_suspect()` identifies them; `experiments/recompute_alternate_interfaces.py`
630
+ recomputes them. Fixing the parser moves the coverage denominators, so it is held for 0.2.0
631
+ where the store is rebuilt to match.
632
+ - **2494 of 4238 single-point values came from a per-benchmark campaign** rather than from one
633
+ built around each complex's full mutation list. For 27 of those complexes, 287 records, that
634
+ list is a strict subset of the complex's full one, and a value is a property of the list it was
635
+ computed in.
636
+ - **`1KBH` is excluded**: `RepairPDB` does not terminate on it under FoldX 5.1.