chython 3.3.2__tar.gz → 3.5__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 (563) hide show
  1. {chython-3.3.2/chython.egg-info → chython-3.5}/PKG-INFO +1 -1
  2. {chython-3.3.2 → chython-3.5}/chython/__init__.py +21 -4
  3. {chython-3.3.2 → chython-3.5}/chython/chemistry/__init__.py +6 -3
  4. {chython-3.3.2 → chython-3.5}/chython/chemistry/_canonicalize.py +95 -30
  5. {chython-3.3.2 → chython-3.5}/chython/chemistry/_hydrogens.py +31 -11
  6. {chython-3.3.2 → chython-3.5}/chython/chemistry/_isomers.py +246 -46
  7. {chython-3.3.2 → chython-3.5}/chython/chemistry/_kekule_form.py +92 -22
  8. {chython-3.3.2 → chython-3.5}/chython/chemistry/_protomers.py +31 -8
  9. {chython-3.3.2 → chython-3.5}/chython/chemistry/_salts.py +2 -2
  10. {chython-3.3.2 → chython-3.5}/chython/chemistry/_standardize.py +18 -5
  11. chython-3.5/chython/chemistry/_stereo_audit.py +762 -0
  12. {chython-3.3.2 → chython-3.5}/chython/chemistry/_tables.py +33 -4
  13. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/acids.tsv +2 -2
  14. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/salts.tsv +1 -0
  15. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/standardize_groups.tsv +9 -2
  16. chython-3.5/chython/chemistry/tables/stereo_audit.tsv +21 -0
  17. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/gen_standardize_rules.py +11 -4
  18. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_canonicalize.py +113 -3
  19. chython-3.5/chython/chemistry/test/test_canonicalize_atom_order.py +268 -0
  20. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_isomers.py +66 -0
  21. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_protomers.py +2 -2
  22. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_salts.py +1 -0
  23. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_groups_port.py +1 -1
  24. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_merges.py +3 -3
  25. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_tsv.py +33 -11
  26. chython-3.5/chython/chemistry/test/test_stereo_audit.py +626 -0
  27. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_thiele_is_single_purpose.py +4 -11
  28. {chython-3.3.2 → chython-3.5}/chython/core/__init__.py +5 -6
  29. {chython-3.3.2 → chython-3.5}/chython/core/_canonical.pxi +356 -119
  30. {chython-3.3.2 → chython-3.5}/chython/core/_cip.pxi +219 -60
  31. {chython-3.3.2 → chython-3.5}/chython/core/_core.pyx +5 -1
  32. {chython-3.3.2 → chython-3.5}/chython/core/_features.pxi +15 -7
  33. {chython-3.3.2 → chython-3.5}/chython/core/_hydrogens.pxi +7 -5
  34. {chython-3.3.2 → chython-3.5}/chython/core/_inchi.pxi +100 -1
  35. {chython-3.3.2 → chython-3.5}/chython/core/_kekule.pxi +161 -4
  36. chython-3.5/chython/core/_layout_score.pxi +340 -0
  37. {chython-3.3.2 → chython-3.5}/chython/core/_molecule_arena.pxi +70 -9
  38. {chython-3.3.2 → chython-3.5}/chython/core/_molecule_container.pxi +773 -122
  39. {chython-3.3.2 → chython-3.5}/chython/core/_morgan.pxi +86 -7
  40. {chython-3.3.2 → chython-3.5}/chython/core/_pach3.pxi +27 -14
  41. {chython-3.3.2 → chython-3.5}/chython/core/_query_container.pxi +36 -0
  42. {chython-3.3.2 → chython-3.5}/chython/core/_reaction_passes.py +44 -16
  43. {chython-3.3.2 → chython-3.5}/chython/core/_rings.pxi +143 -18
  44. {chython-3.3.2 → chython-3.5}/chython/core/_smiles_read.pxi +579 -53
  45. {chython-3.3.2 → chython-3.5}/chython/core/_smiles_write.pxi +585 -83
  46. {chython-3.3.2 → chython-3.5}/chython/core/_smirks_patch.pxi +61 -11
  47. {chython-3.3.2 → chython-3.5}/chython/core/_smirks_read.pxi +97 -2
  48. {chython-3.3.2 → chython-3.5}/chython/core/_stereo.pxi +4201 -410
  49. chython-3.5/chython/core/_stereo_meaning.pxi +820 -0
  50. {chython-3.3.2 → chython-3.5}/chython/core/_thiele.pxi +180 -14
  51. chython-3.5/chython/core/chains.py +280 -0
  52. chython-3.5/chython/core/monomers.py +421 -0
  53. {chython-3.3.2 → chython-3.5}/chython/core/reaction.py +19 -6
  54. {chython-3.3.2 → chython-3.5}/chython/core/test/pach3_corpus.py +5 -5
  55. chython-3.5/chython/core/test/pach_v3_corpus.bin.gz +0 -0
  56. chython-3.5/chython/core/test/pach_v4_corpus.bin.gz +0 -0
  57. chython-3.5/chython/core/test/peptides.py +117 -0
  58. {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_v3_compat.py +21 -26
  59. {chython-3.3.2 → chython-3.5}/chython/core/test/test_aromatic_storage.py +9 -6
  60. chython-3.5/chython/core/test/test_atropisomer_axis.py +100 -0
  61. chython-3.5/chython/core/test/test_brace_bond_fields.py +103 -0
  62. chython-3.5/chython/core/test/test_bridgehead_realisability.py +534 -0
  63. {chython-3.3.2 → chython-3.5}/chython/core/test/test_canonical.py +50 -0
  64. chython-3.5/chython/core/test/test_canonical_groups.py +243 -0
  65. {chython-3.3.2 → chython-3.5}/chython/core/test/test_canonical_mirror.py +5 -3
  66. chython-3.5/chython/core/test/test_canonical_stereogenic.py +93 -0
  67. chython-3.5/chython/core/test/test_canonicalize_stereo_groups.py +251 -0
  68. chython-3.5/chython/core/test/test_chains.py +104 -0
  69. chython-3.5/chython/core/test/test_cip_budget.py +97 -0
  70. {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_cases.py +10 -1
  71. {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_storage.py +9 -8
  72. {chython-3.3.2 → chython-3.5}/chython/core/test/test_container_log.py +6 -3
  73. chython-3.5/chython/core/test/test_cx_wedges.py +160 -0
  74. chython-3.5/chython/core/test/test_dead_stereo_groups.py +319 -0
  75. chython-3.5/chython/core/test/test_helical_units.py +189 -0
  76. {chython-3.3.2 → chython-3.5}/chython/core/test/test_hydrogens.py +16 -0
  77. chython-3.5/chython/core/test/test_identity_memo.py +70 -0
  78. {chython-3.3.2 → chython-3.5}/chython/core/test/test_kekule.py +25 -0
  79. {chython-3.3.2 → chython-3.5}/chython/core/test/test_log.py +2 -2
  80. {chython-3.3.2 → chython-3.5}/chython/core/test/test_magic.py +9 -8
  81. chython-3.5/chython/core/test/test_monomers.py +139 -0
  82. {chython-3.3.2 → chython-3.5}/chython/core/test/test_pach3.py +22 -6
  83. chython-3.5/chython/core/test/test_planar_units.py +307 -0
  84. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_passes.py +27 -1
  85. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_smiles.py +3 -3
  86. {chython-3.3.2 → chython-3.5}/chython/core/test/test_rings.py +128 -1
  87. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smarts_read.py +15 -6
  88. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_read.py +106 -58
  89. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_roundtrip.py +14 -10
  90. chython-3.5/chython/core/test/test_smiles_stereo_marks.py +90 -0
  91. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write.py +16 -2
  92. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_cis_trans.py +79 -30
  93. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_detached.py +3 -3
  94. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_differential.py +95 -30
  95. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_stereo.py +37 -30
  96. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_patch.py +75 -4
  97. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_stereo.py +20 -19
  98. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_acceptance.py +132 -2
  99. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_anchor_identity.py +2 -2
  100. chython-3.5/chython/core/test/test_stereo_group_meaning.py +382 -0
  101. chython-3.5/chython/core/test/test_stereo_group_signs.py +240 -0
  102. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_group_storage.py +2 -2
  103. chython-3.5/chython/core/test/test_stereo_liveness.py +70 -0
  104. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_owners.py +2 -2
  105. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_parity.py +6 -6
  106. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_perception.py +10 -16
  107. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_query.py +159 -84
  108. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_units.py +27 -12
  109. {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_v2_differential.py +11 -2
  110. chython-3.5/chython/core/test/test_stereogenicity_symmetry.py +169 -0
  111. chython-3.5/chython/core/test/test_thiele_atom_order.py +89 -0
  112. {chython-3.3.2 → chython-3.5}/chython/core/wedge.py +464 -32
  113. {chython-3.3.2 → chython-3.5}/chython/depict/__init__.py +6 -4
  114. {chython-3.3.2 → chython-3.5}/chython/depict/_config.py +31 -4
  115. {chython-3.3.2 → chython-3.5}/chython/depict/figure.py +55 -3
  116. {chython-3.3.2 → chython-3.5}/chython/depict/label.py +43 -17
  117. {chython-3.3.2 → chython-3.5}/chython/depict/layout/__init__.py +2 -2
  118. chython-3.5/chython/depict/layout/approved.py +181 -0
  119. chython-3.5/chython/depict/layout/cascade.py +979 -0
  120. chython-3.5/chython/depict/layout/edits.py +524 -0
  121. chython-3.5/chython/depict/layout/env.py +257 -0
  122. chython-3.5/chython/depict/layout/features.py +224 -0
  123. chython-3.5/chython/depict/layout/greedy.py +56 -0
  124. chython-3.5/chython/depict/layout/lattice.py +228 -0
  125. chython-3.5/chython/depict/layout/learn/__init__.py +25 -0
  126. chython-3.5/chython/depict/layout/learn/alphazero.py +564 -0
  127. chython-3.5/chython/depict/layout/learn/demos.py +263 -0
  128. chython-3.5/chython/depict/layout/learn/evaluate.py +94 -0
  129. chython-3.5/chython/depict/layout/learn/judge.py +145 -0
  130. chython-3.5/chython/depict/layout/learn/mcts.py +190 -0
  131. chython-3.5/chython/depict/layout/learn/policy.py +129 -0
  132. chython-3.5/chython/depict/layout/learn/replay.py +114 -0
  133. chython-3.5/chython/depict/layout/learn/sweep.py +81 -0
  134. chython-3.5/chython/depict/layout/learn/targets.py +79 -0
  135. chython-3.5/chython/depict/layout/learn/tensors.py +76 -0
  136. chython-3.5/chython/depict/layout/learn/train.py +264 -0
  137. {chython-3.3.2 → chython-3.5}/chython/depict/layout/molecule.py +248 -44
  138. chython-3.5/chython/depict/layout/peptide.py +1231 -0
  139. chython-3.5/chython/depict/layout/pose.py +240 -0
  140. chython-3.5/chython/depict/layout/primitive.py +564 -0
  141. chython-3.5/chython/depict/layout/quality.py +303 -0
  142. {chython-3.3.2 → chython-3.5}/chython/depict/layout/reaction.py +7 -6
  143. chython-3.5/chython/depict/layout/relax.py +1029 -0
  144. chython-3.5/chython/depict/layout/review.py +593 -0
  145. chython-3.5/chython/depict/layout/rings.py +1498 -0
  146. chython-3.5/chython/depict/layout/score.py +303 -0
  147. chython-3.5/chython/depict/layout/scorecard.py +340 -0
  148. chython-3.5/chython/depict/layout/search.py +364 -0
  149. chython-3.5/chython/depict/layout/shapes.py +332 -0
  150. chython-3.5/chython/depict/layout/templates.py +220 -0
  151. chython-3.5/chython/depict/layout/tree.py +431 -0
  152. chython-3.5/chython/depict/peptide.py +383 -0
  153. chython-3.5/chython/depict/test/learn/test_alphazero.py +66 -0
  154. chython-3.5/chython/depict/test/learn/test_demos.py +106 -0
  155. chython-3.5/chython/depict/test/learn/test_judge.py +56 -0
  156. chython-3.5/chython/depict/test/learn/test_mcts.py +79 -0
  157. chython-3.5/chython/depict/test/learn/test_policy.py +91 -0
  158. chython-3.5/chython/depict/test/learn/test_replay.py +78 -0
  159. chython-3.5/chython/depict/test/learn/test_targets.py +60 -0
  160. chython-3.5/chython/depict/test/learn/test_train.py +146 -0
  161. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_clean2d.py +70 -2
  162. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_label.py +18 -0
  163. chython-3.5/chython/depict/test/test_layout_cascade.py +617 -0
  164. chython-3.5/chython/depict/test/test_layout_controller.py +543 -0
  165. chython-3.5/chython/depict/test/test_layout_conventions.py +1338 -0
  166. chython-3.5/chython/depict/test/test_layout_engine.py +196 -0
  167. chython-3.5/chython/depict/test/test_layout_env.py +411 -0
  168. chython-3.5/chython/depict/test/test_layout_primitive.py +295 -0
  169. chython-3.5/chython/depict/test/test_layout_relax.py +85 -0
  170. chython-3.5/chython/depict/test/test_peptide_draw.py +387 -0
  171. chython-3.5/chython/depict/test/test_peptide_layout.py +502 -0
  172. chython-3.5/chython/depict/test/test_quality.py +264 -0
  173. chython-3.5/chython/depict/test/test_review.py +201 -0
  174. chython-3.5/chython/depict/test/test_scorecard.py +175 -0
  175. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_wedge_draw.py +36 -0
  176. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_ctab.py +36 -1
  177. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_facade.py +1 -2
  178. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_sgroup.py +34 -2
  179. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_v2000.py +15 -2
  180. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_v3000.py +26 -9
  181. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_data_labels.py +57 -31
  182. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_facade.py +13 -1
  183. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_fidelity.py +32 -5
  184. chython-3.5/chython/formats/ctfile/test/test_stereo_drawings.py +430 -0
  185. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_stereo_label.py +2 -2
  186. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_v2000.py +12 -8
  187. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_v3000.py +105 -6
  188. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_wedge.py +148 -39
  189. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_mrv.py +5 -6
  190. chython-3.5/chython/formats/xml/test/test_dead_stereo_groups.py +83 -0
  191. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_equivalence.py +2 -1
  192. {chython-3.3.2 → chython-3.5}/chython/interop/_stereo.py +2 -1
  193. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_rdkit.py +30 -4
  194. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_stereo.py +4 -3
  195. {chython-3.3.2 → chython-3.5}/chython/reactions/__init__.py +8 -8
  196. {chython-3.3.2 → chython-3.5}/chython/reactions/_enumerate.py +404 -31
  197. {chython-3.3.2 → chython-3.5}/chython/reactions/_reconstruct.py +542 -110
  198. {chython-3.3.2 → chython-3.5}/chython/reactions/_stickers.py +46 -14
  199. {chython-3.3.2 → chython-3.5}/chython/reactions/_tables.py +253 -15
  200. chython-3.5/chython/reactions/tables/functional.tsv +524 -0
  201. chython-3.5/chython/reactions/tables/protective.tsv +128 -0
  202. chython-3.5/chython/reactions/tables/reactions.tsv +1821 -0
  203. {chython-3.3.2 → chython-3.5}/chython/reactions/tables/roles.tsv +2 -0
  204. chython-3.5/chython/reactions/test/__init__.py +18 -0
  205. chython-3.5/chython/reactions/test/_frozen_ids.py +2260 -0
  206. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_enumerate.py +22 -5
  207. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_functional.py +10 -0
  208. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_probes.py +4 -1
  209. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_protective.py +115 -39
  210. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_reconstruct.py +409 -65
  211. chython-3.5/chython/reactions/test/test_reconstruct_labels.py +158 -0
  212. chython-3.5/chython/reactions/test/test_retro.py +172 -0
  213. chython-3.5/chython/reactions/test/test_retro_probes.py +61 -0
  214. chython-3.5/chython/reactions/test/test_retro_tables.py +142 -0
  215. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_roles.py +1 -1
  216. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_stickers.py +87 -0
  217. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_tables.py +59 -7
  218. {chython-3.3.2 → chython-3.5}/chython/test/test_container_methods.py +22 -2
  219. {chython-3.3.2 → chython-3.5}/chython/test/test_facade_names.py +4 -4
  220. {chython-3.3.2 → chython-3.5}/chython/test/test_performance.py +3 -4
  221. {chython-3.3.2 → chython-3.5}/chython/test/test_stereo_bluebook.py +38 -53
  222. {chython-3.3.2 → chython-3.5/chython.egg-info}/PKG-INFO +1 -1
  223. {chython-3.3.2 → chython-3.5}/chython.egg-info/SOURCES.txt +89 -2
  224. {chython-3.3.2 → chython-3.5}/pyproject.toml +2 -2
  225. chython-3.3.2/chython/core/test/pach_v3_corpus.bin.gz +0 -0
  226. chython-3.3.2/chython/core/test/pach_v4_corpus.bin.gz +0 -0
  227. chython-3.3.2/chython/reactions/tables/functional.tsv +0 -321
  228. chython-3.3.2/chython/reactions/tables/protective.tsv +0 -138
  229. chython-3.3.2/chython/reactions/tables/reactions.tsv +0 -427
  230. chython-3.3.2/chython/reactions/test/_frozen_ids.py +0 -780
  231. chython-3.3.2/chython/reactions/test/gen_corpus_glossary.py +0 -146
  232. chython-3.3.2/chython/reactions/test/test_corpus_glossary.py +0 -91
  233. {chython-3.3.2 → chython-3.5}/LICENSE +0 -0
  234. {chython-3.3.2 → chython-3.5}/MANIFEST.in +0 -0
  235. {chython-3.3.2 → chython-3.5}/README.md +0 -0
  236. {chython-3.3.2 → chython-3.5}/build_inchi.py +0 -0
  237. {chython-3.3.2 → chython-3.5}/chython/_functions.py +0 -0
  238. {chython-3.3.2 → chython-3.5}/chython/chemistry/_abbreviations.py +0 -0
  239. {chython-3.3.2 → chython-3.5}/chython/chemistry/_counts.py +0 -0
  240. {chython-3.3.2 → chython-3.5}/chython/chemistry/_crippen.py +0 -0
  241. {chython-3.3.2 → chython-3.5}/chython/chemistry/_implicit.py +0 -0
  242. {chython-3.3.2 → chython-3.5}/chython/chemistry/_maccs.py +0 -0
  243. {chython-3.3.2 → chython-3.5}/chython/chemistry/_organometallics.py +0 -0
  244. {chython-3.3.2 → chython-3.5}/chython/chemistry/_perceive.py +0 -0
  245. {chython-3.3.2 → chython-3.5}/chython/chemistry/_pharmacophore.py +0 -0
  246. {chython-3.3.2 → chython-3.5}/chython/chemistry/_qed.py +0 -0
  247. {chython-3.3.2 → chython-3.5}/chython/chemistry/_residues.py +0 -0
  248. {chython-3.3.2 → chython-3.5}/chython/chemistry/_resonance.py +0 -0
  249. {chython-3.3.2 → chython-3.5}/chython/chemistry/_saturate.py +0 -0
  250. {chython-3.3.2 → chython-3.5}/chython/chemistry/_smarts.py +0 -0
  251. {chython-3.3.2 → chython-3.5}/chython/chemistry/_tpsa.py +0 -0
  252. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/abbreviations.tsv +0 -0
  253. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/covalent_radii.tsv +0 -0
  254. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/crippen.tsv +0 -0
  255. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/hbond.tsv +0 -0
  256. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/maccs.tsv +0 -0
  257. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/maccs_corpus.tsv +0 -0
  258. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/pharmacophore.tsv +0 -0
  259. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/qed_alerts.tsv +0 -0
  260. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/residues.tsv +0 -0
  261. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/resonance.tsv +0 -0
  262. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/rotatable.tsv +0 -0
  263. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/standardize_metals.tsv +0 -0
  264. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/sybyl_types.tsv +0 -0
  265. {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/tpsa.tsv +0 -0
  266. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/__init__.py +0 -0
  267. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/_corpus.py +0 -0
  268. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/_oracle.py +0 -0
  269. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_abbreviations.py +0 -0
  270. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_acids_tsv.py +0 -0
  271. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_counts.py +0 -0
  272. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_covalent_radii_tsv.py +0 -0
  273. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_crippen.py +0 -0
  274. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_crippen_tsv.py +0 -0
  275. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_dependency_direction.py +0 -0
  276. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_featurizer_injection.py +0 -0
  277. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_featurizer_tables_lazy.py +0 -0
  278. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_kekule_form.py +0 -0
  279. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs.py +0 -0
  280. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs_corpus.py +0 -0
  281. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs_tsv.py +0 -0
  282. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_organometallics.py +0 -0
  283. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_perceive.py +0 -0
  284. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_pharmacophore.py +0 -0
  285. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_qed.py +0 -0
  286. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_qed_alerts_tsv.py +0 -0
  287. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_reaction_hydrogen_repair.py +0 -0
  288. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_reaction_passes.py +0 -0
  289. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_residues.py +0 -0
  290. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_resonance.py +0 -0
  291. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_resonance_tsv.py +0 -0
  292. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_saturate.py +0 -0
  293. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_smarts.py +0 -0
  294. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_differential.py +0 -0
  295. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_overvalent_nitrogen.py +0 -0
  296. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_examples.py +0 -0
  297. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_tpsa.py +0 -0
  298. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_tpsa_tsv.py +0 -0
  299. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_valence_report.py +0 -0
  300. {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_z_translation.py +0 -0
  301. {chython-3.3.2 → chython-3.5}/chython/core/RULES.md +0 -0
  302. {chython-3.3.2 → chython-3.5}/chython/core/_descriptors.pxi +0 -0
  303. {chython-3.3.2 → chython-3.5}/chython/core/_elements.pxi +0 -0
  304. {chython-3.3.2 → chython-3.5}/chython/core/_facade.py +0 -0
  305. {chython-3.3.2 → chython-3.5}/chython/core/_fingerprints.pxi +0 -0
  306. {chython-3.3.2 → chython-3.5}/chython/core/_isomorphism.pxi +0 -0
  307. {chython-3.3.2 → chython-3.5}/chython/core/_log.py +0 -0
  308. {chython-3.3.2 → chython-3.5}/chython/core/_ml.pxi +0 -0
  309. {chython-3.3.2 → chython-3.5}/chython/core/_molecule_topology.pxi +0 -0
  310. {chython-3.3.2 → chython-3.5}/chython/core/_molecule_views.pxi +0 -0
  311. {chython-3.3.2 → chython-3.5}/chython/core/_pach.pxi +0 -0
  312. {chython-3.3.2 → chython-3.5}/chython/core/_query_arena.pxi +0 -0
  313. {chython-3.3.2 → chython-3.5}/chython/core/_query_boxes.pxi +0 -0
  314. {chython-3.3.2 → chython-3.5}/chython/core/_query_seal.pxi +0 -0
  315. {chython-3.3.2 → chython-3.5}/chython/core/_smarts_read.pxi +0 -0
  316. {chython-3.3.2 → chython-3.5}/chython/core/_sssr.pxi +0 -0
  317. {chython-3.3.2 → chython-3.5}/chython/core/_valence.pxi +0 -0
  318. {chython-3.3.2 → chython-3.5}/chython/core/elements.tsv +0 -0
  319. {chython-3.3.2 → chython-3.5}/chython/core/isotopes.tsv +0 -0
  320. {chython-3.3.2 → chython-3.5}/chython/core/test/__init__.py +0 -0
  321. {chython-3.3.2 → chython-3.5}/chython/core/test/arena_v4_corpus.bin.gz +0 -0
  322. {chython-3.3.2 → chython-3.5}/chython/core/test/bench_ml.py +0 -0
  323. {chython-3.3.2 → chython-3.5}/chython/core/test/chytorch_oracle.py +0 -0
  324. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_element_tables.py +0 -0
  325. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_modeling_view_corpus.py +0 -0
  326. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_pach3_corpus.py +0 -0
  327. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_reaction_pach_corpus.py +0 -0
  328. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_v3_fixtures.py +0 -0
  329. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_v4_fixtures.py +0 -0
  330. {chython-3.3.2 → chython-3.5}/chython/core/test/gen_valence_rules.py +0 -0
  331. {chython-3.3.2 → chython-3.5}/chython/core/test/modeling_view_corpus.json.gz +0 -0
  332. {chython-3.3.2 → chython-3.5}/chython/core/test/modeling_view_corpus.py +0 -0
  333. {chython-3.3.2 → chython-3.5}/chython/core/test/oracle.py +0 -0
  334. {chython-3.3.2 → chython-3.5}/chython/core/test/pach_bond_group_corpus.bin.gz +0 -0
  335. {chython-3.3.2 → chython-3.5}/chython/core/test/pach_corpus.py +0 -0
  336. {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v0_corpus.bin.gz +0 -0
  337. {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v0_native_corpus.bin.gz +0 -0
  338. {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v2_corpus.bin.gz +0 -0
  339. {chython-3.3.2 → chython-3.5}/chython/core/test/reaction_pach_corpus.py +0 -0
  340. {chython-3.3.2 → chython-3.5}/chython/core/test/reaction_pach_v2_corpus.bin.gz +0 -0
  341. {chython-3.3.2 → chython-3.5}/chython/core/test/test_aggregates.py +0 -0
  342. {chython-3.3.2 → chython-3.5}/chython/core/test/test_alternative_spellings.py +0 -0
  343. {chython-3.3.2 → chython-3.5}/chython/core/test/test_apply_scratch_probe.py +0 -0
  344. {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_f60.py +0 -0
  345. {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_identity.py +0 -0
  346. {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_v4_compat.py +0 -0
  347. {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_assign.py +0 -0
  348. {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_digraph.py +0 -0
  349. {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_ranking.py +0 -0
  350. {chython-3.3.2 → chython-3.5}/chython/core/test/test_clean_isotopes_and_coordinate_bonds.py +0 -0
  351. {chython-3.3.2 → chython-3.5}/chython/core/test/test_clean_stereo.py +0 -0
  352. {chython-3.3.2 → chython-3.5}/chython/core/test/test_conformers.py +0 -0
  353. {chython-3.3.2 → chython-3.5}/chython/core/test/test_copy_caches.py +0 -0
  354. {chython-3.3.2 → chython-3.5}/chython/core/test/test_derive.py +0 -0
  355. {chython-3.3.2 → chython-3.5}/chython/core/test/test_descriptors.py +0 -0
  356. {chython-3.3.2 → chython-3.5}/chython/core/test/test_element_tables.py +0 -0
  357. {chython-3.3.2 → chython-3.5}/chython/core/test/test_enrich.py +0 -0
  358. {chython-3.3.2 → chython-3.5}/chython/core/test/test_facade.py +0 -0
  359. {chython-3.3.2 → chython-3.5}/chython/core/test/test_features.py +0 -0
  360. {chython-3.3.2 → chython-3.5}/chython/core/test/test_featurizer_injection.py +0 -0
  361. {chython-3.3.2 → chython-3.5}/chython/core/test/test_fingerprints.py +0 -0
  362. {chython-3.3.2 → chython-3.5}/chython/core/test/test_geometry.py +0 -0
  363. {chython-3.3.2 → chython-3.5}/chython/core/test/test_h_unknown.py +0 -0
  364. {chython-3.3.2 → chython-3.5}/chython/core/test/test_inchi.py +0 -0
  365. {chython-3.3.2 → chython-3.5}/chython/core/test/test_interop_injection.py +0 -0
  366. {chython-3.3.2 → chython-3.5}/chython/core/test/test_isomorphism.py +0 -0
  367. {chython-3.3.2 → chython-3.5}/chython/core/test/test_meta.py +0 -0
  368. {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_encoding.py +0 -0
  369. {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_reaction_transition.py +0 -0
  370. {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_state_view.py +0 -0
  371. {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_transition_view.py +0 -0
  372. {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_unpack_differential.py +0 -0
  373. {chython-3.3.2 → chython-3.5}/chython/core/test/test_modeling_view_frozen.py +0 -0
  374. {chython-3.3.2 → chython-3.5}/chython/core/test/test_molecule.py +0 -0
  375. {chython-3.3.2 → chython-3.5}/chython/core/test/test_morgan.py +0 -0
  376. {chython-3.3.2 → chython-3.5}/chython/core/test/test_no_chython_two_imports.py +0 -0
  377. {chython-3.3.2 → chython-3.5}/chython/core/test/test_oracle.py +0 -0
  378. {chython-3.3.2 → chython-3.5}/chython/core/test/test_pach.py +0 -0
  379. {chython-3.3.2 → chython-3.5}/chython/core/test/test_pack.py +0 -0
  380. {chython-3.3.2 → chython-3.5}/chython/core/test/test_query.py +0 -0
  381. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_edit.py +0 -0
  382. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_query.py +0 -0
  383. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_semantics.py +0 -0
  384. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_serialisation.py +0 -0
  385. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_smirks.py +0 -0
  386. {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_storage.py +0 -0
  387. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_container.py +0 -0
  388. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_identity.py +0 -0
  389. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_pach.py +0 -0
  390. {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_patch_stereo.py +0 -0
  391. {chython-3.3.2 → chython-3.5}/chython/core/test/test_rings_c60.py +0 -0
  392. {chython-3.3.2 → chython-3.5}/chython/core/test/test_set_element.py +0 -0
  393. {chython-3.3.2 → chython-3.5}/chython/core/test/test_sgroups.py +0 -0
  394. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_r.py +0 -0
  395. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_aromatic.py +0 -0
  396. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_h_unknown.py +0 -0
  397. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_sticky.py +0 -0
  398. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_filter.py +0 -0
  399. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_read.py +0 -0
  400. {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_report.py +0 -0
  401. {chython-3.3.2 → chython-3.5}/chython/core/test/test_structure.py +0 -0
  402. {chython-3.3.2 → chython-3.5}/chython/core/test/test_thiele.py +0 -0
  403. {chython-3.3.2 → chython-3.5}/chython/core/test/test_title.py +0 -0
  404. {chython-3.3.2 → chython-3.5}/chython/core/test/test_topology.py +0 -0
  405. {chython-3.3.2 → chython-3.5}/chython/core/test/test_union_stereo.py +0 -0
  406. {chython-3.3.2 → chython-3.5}/chython/core/test/test_valence.py +0 -0
  407. {chython-3.3.2 → chython-3.5}/chython/core/test/test_view_surface.py +0 -0
  408. {chython-3.3.2 → chython-3.5}/chython/core/test/v3_fixtures.py +0 -0
  409. {chython-3.3.2 → chython-3.5}/chython/core/test/v4_fixtures.py +0 -0
  410. {chython-3.3.2 → chython-3.5}/chython/core/valence_rules.tsv +0 -0
  411. {chython-3.3.2 → chython-3.5}/chython/depict/_hooks.py +0 -0
  412. {chython-3.3.2 → chython-3.5}/chython/depict/bonds.py +0 -0
  413. {chython-3.3.2 → chython-3.5}/chython/depict/colorbar.py +0 -0
  414. {chython-3.3.2 → chython-3.5}/chython/depict/colormap.py +0 -0
  415. {chython-3.3.2 → chython-3.5}/chython/depict/field.py +0 -0
  416. {chython-3.3.2 → chython-3.5}/chython/depict/layout/clean2d.js +0 -0
  417. {chython-3.3.2 → chython-3.5}/chython/depict/metrics/__init__.py +0 -0
  418. {chython-3.3.2 → chython-3.5}/chython/depict/metrics/helvetica.tsv +0 -0
  419. {chython-3.3.2 → chython-3.5}/chython/depict/metrics/times.tsv +0 -0
  420. {chython-3.3.2 → chython-3.5}/chython/depict/overlay.py +0 -0
  421. {chython-3.3.2 → chython-3.5}/chython/depict/render/__init__.py +0 -0
  422. {chython-3.3.2 → chython-3.5}/chython/depict/render/svg.py +0 -0
  423. {chython-3.3.2 → chython-3.5}/chython/depict/scene.py +0 -0
  424. {chython-3.3.2 → chython-3.5}/chython/depict/style.py +0 -0
  425. {chython-3.3.2 → chython-3.5}/chython/depict/test/__init__.py +0 -0
  426. {chython-3.3.2/chython/formats/test → chython-3.5/chython/depict/test/learn}/__init__.py +0 -0
  427. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_bonds.py +0 -0
  428. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_colorbar.py +0 -0
  429. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_colormap.py +0 -0
  430. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_field.py +0 -0
  431. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_figure.py +0 -0
  432. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_metrics.py +0 -0
  433. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_overlay.py +0 -0
  434. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_package.py +0 -0
  435. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_r_atom.py +0 -0
  436. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_scene.py +0 -0
  437. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_style.py +0 -0
  438. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_svg.py +0 -0
  439. {chython-3.3.2 → chython-3.5}/chython/depict/test/test_x3dom.py +0 -0
  440. {chython-3.3.2 → chython-3.5}/chython/depict/wedge.py +0 -0
  441. {chython-3.3.2 → chython-3.5}/chython/depict/x3dom.py +0 -0
  442. {chython-3.3.2 → chython-3.5}/chython/exceptions.py +0 -0
  443. {chython-3.3.2 → chython-3.5}/chython/formats/__init__.py +0 -0
  444. {chython-3.3.2 → chython-3.5}/chython/formats/_text.py +0 -0
  445. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/CTFILE.md +0 -0
  446. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/__init__.py +0 -0
  447. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_errors.py +0 -0
  448. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_hydrogens.py +0 -0
  449. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_rdf.py +0 -0
  450. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_rxn.py +0 -0
  451. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_sdf.py +0 -0
  452. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_stream.py +0 -0
  453. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_tokens.py +0 -0
  454. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/__init__.py +0 -0
  455. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/conftest.py +0 -0
  456. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_aromatic.py +0 -0
  457. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_container_log.py +0 -0
  458. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_hydrogens.py +0 -0
  459. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_r_atom.py +0 -0
  460. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_rdf.py +0 -0
  461. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_rxn.py +0 -0
  462. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_sdf.py +0 -0
  463. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_sgroup.py +0 -0
  464. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_stream.py +0 -0
  465. {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_tokens.py +0 -0
  466. {chython-3.3.2 → chython-3.5}/chython/formats/mol2.py +0 -0
  467. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/__init__.py +0 -0
  468. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_builder.py +0 -0
  469. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_legacy.py +0 -0
  470. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_mmcif.py +0 -0
  471. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_records.py +0 -0
  472. {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_star.py +0 -0
  473. {chython-3.3.2/chython/reactions → chython-3.5/chython/formats}/test/__init__.py +0 -0
  474. {chython-3.3.2 → chython-3.5}/chython/formats/test/conftest.py +0 -0
  475. {chython-3.3.2 → chython-3.5}/chython/formats/test/oracles.py +0 -0
  476. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_conformance.py +0 -0
  477. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_done_when.py +0 -0
  478. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_isolation.py +0 -0
  479. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_log_prefix.py +0 -0
  480. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_mmcif.py +0 -0
  481. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_mol2.py +0 -0
  482. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_no_review_bookkeeping.py +0 -0
  483. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_oracles.py +0 -0
  484. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_pdb.py +0 -0
  485. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_pdb_builder.py +0 -0
  486. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_perceive_agreement.py +0 -0
  487. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_read_only_facades.py +0 -0
  488. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_xyz.py +0 -0
  489. {chython-3.3.2 → chython-3.5}/chython/formats/test/test_xyz_builder.py +0 -0
  490. {chython-3.3.2 → chython-3.5}/chython/formats/xml/__init__.py +0 -0
  491. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_cml.py +0 -0
  492. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_dialect.py +0 -0
  493. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_errors.py +0 -0
  494. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_facade.py +0 -0
  495. {chython-3.3.2 → chython-3.5}/chython/formats/xml/_tree.py +0 -0
  496. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/__init__.py +0 -0
  497. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/conftest.py +0 -0
  498. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_cml.py +0 -0
  499. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_container_log.py +0 -0
  500. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_dialect.py +0 -0
  501. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_facade.py +0 -0
  502. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_mrv.py +0 -0
  503. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_mrv_census.py +0 -0
  504. {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_tree.py +0 -0
  505. {chython-3.3.2 → chython-3.5}/chython/formats/xyz.py +0 -0
  506. {chython-3.3.2 → chython-3.5}/chython/interop/__init__.py +0 -0
  507. {chython-3.3.2 → chython-3.5}/chython/interop/_cdk.py +0 -0
  508. {chython-3.3.2 → chython-3.5}/chython/interop/_cdpkit.py +0 -0
  509. {chython-3.3.2 → chython-3.5}/chython/interop/_indigo.py +0 -0
  510. {chython-3.3.2 → chython-3.5}/chython/interop/_iupac.py +0 -0
  511. {chython-3.3.2 → chython-3.5}/chython/interop/_java.py +0 -0
  512. {chython-3.3.2 → chython-3.5}/chython/interop/_openbabel.py +0 -0
  513. {chython-3.3.2 → chython-3.5}/chython/interop/_pandas.py +0 -0
  514. {chython-3.3.2 → chython-3.5}/chython/interop/_rdkit.py +0 -0
  515. {chython-3.3.2 → chython-3.5}/chython/interop/_records.py +0 -0
  516. {chython-3.3.2 → chython-3.5}/chython/interop/config.py +0 -0
  517. {chython-3.3.2 → chython-3.5}/chython/interop/conformers.py +0 -0
  518. {chython-3.3.2 → chython-3.5}/chython/interop/test/__init__.py +0 -0
  519. {chython-3.3.2 → chython-3.5}/chython/interop/test/conftest.py +0 -0
  520. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_cdk.py +0 -0
  521. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_cdpkit.py +0 -0
  522. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_config.py +0 -0
  523. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_conformers.py +0 -0
  524. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_coordinate_honesty.py +0 -0
  525. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_dispatch.py +0 -0
  526. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_indigo.py +0 -0
  527. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_iupac.py +0 -0
  528. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_log_delivery.py +0 -0
  529. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_openbabel.py +0 -0
  530. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_pandas.py +0 -0
  531. {chython-3.3.2 → chython-3.5}/chython/interop/test/test_v2_oracle.py +0 -0
  532. {chython-3.3.2 → chython-3.5}/chython/reactions/_numbering.py +0 -0
  533. {chython-3.3.2 → chython-3.5}/chython/reactions/attention/__init__.py +0 -0
  534. {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_assign.py +0 -0
  535. {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_encode.py +0 -0
  536. {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_session.py +0 -0
  537. {chython-3.3.2 → chython-3.5}/chython/reactions/test/golden_subset.smi +0 -0
  538. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention.py +0 -0
  539. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_assign.py +0 -0
  540. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_encode.py +0 -0
  541. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_isolation.py +0 -0
  542. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_dependency_direction.py +0 -0
  543. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_id_stability.py +0 -0
  544. {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_numbering.py +0 -0
  545. {chython-3.3.2 → chython-3.5}/chython/test/__init__.py +0 -0
  546. {chython-3.3.2 → chython-3.5}/chython/test/test_code_hygiene.py +0 -0
  547. {chython-3.3.2 → chython-3.5}/chython/test/test_doc_figures.py +0 -0
  548. {chython-3.3.2 → chython-3.5}/chython/test/test_doc_references.py +0 -0
  549. {chython-3.3.2 → chython-3.5}/chython/test/test_doc_samples.py +0 -0
  550. {chython-3.3.2 → chython-3.5}/chython/test/test_hydrogen_parity.py +0 -0
  551. {chython-3.3.2 → chython-3.5}/chython/test/test_libinchi_staging.py +0 -0
  552. {chython-3.3.2 → chython-3.5}/chython/test/test_log_records.py +0 -0
  553. {chython-3.3.2 → chython-3.5}/chython/test/test_optional_numpy.py +0 -0
  554. {chython-3.3.2 → chython-3.5}/chython/test/test_packaging.py +0 -0
  555. {chython-3.3.2 → chython-3.5}/chython/test/test_r_atom_integration.py +0 -0
  556. {chython-3.3.2 → chython-3.5}/chython/test/test_release_build.py +0 -0
  557. {chython-3.3.2 → chython-3.5}/chython/test/test_v2_boundary.py +0 -0
  558. {chython-3.3.2 → chython-3.5}/chython/test/test_writer_posture.py +0 -0
  559. {chython-3.3.2 → chython-3.5}/chython.egg-info/dependency_links.txt +0 -0
  560. {chython-3.3.2 → chython-3.5}/chython.egg-info/requires.txt +0 -0
  561. {chython-3.3.2 → chython-3.5}/chython.egg-info/top_level.txt +0 -0
  562. {chython-3.3.2 → chython-3.5}/setup.cfg +0 -0
  563. {chython-3.3.2 → chython-3.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chython
3
- Version: 3.3.2
3
+ Version: 3.5
4
4
  Summary: Library for processing molecules and reactions in python way
5
5
  Author-email: Ramil Nugmanov <nougmanoff@protonmail.com>
6
6
  License-Expression: LGPL-3.0-or-later
@@ -29,8 +29,8 @@ from sys import modules as _modules
29
29
  from types import ModuleType as _ModuleType
30
30
  from .core import *
31
31
  from .core import read_smarts as smarts
32
- from .depict import (Clean2DEngine, DepictStyle, get_clean2d_engine, get_depict_style,
33
- set_clean2d_engine, set_depict_style)
32
+ from .depict import (Clean2DEngine, DepictStyle, get_chain_layout, get_clean2d_engine, get_depict_style,
33
+ get_peptide_layout, set_chain_layout, set_clean2d_engine, set_depict_style, set_peptide_layout)
34
34
  from .formats import *
35
35
  # By full path, not through `formats`' star: `pdb` is that subpackage's name too and the function
36
36
  # would shadow it.
@@ -45,8 +45,9 @@ from .interop.config import _facade_alias as _interop_facade_alias
45
45
 
46
46
 
47
47
  class _Facade(_ModuleType):
48
- """Gives `chython` itself a property, so `chython.clean2d_engine` forwards both the read and the
49
- write to its one home in `depict/_config.py` and the setter validates the name on the spot.
48
+ """Gives `chython` itself properties, so `chython.clean2d_engine` and `chython.chain_layout` (alias
49
+ `chython.peptide_layout`) forward both the read and the write to their one home in `depict/_config.py`,
50
+ validated on the spot.
50
51
  """
51
52
  @property
52
53
  def clean2d_engine(self) -> Clean2DEngine:
@@ -56,6 +57,22 @@ class _Facade(_ModuleType):
56
57
  def clean2d_engine(self, engine: Clean2DEngine):
57
58
  set_clean2d_engine(engine)
58
59
 
60
+ @property
61
+ def chain_layout(self) -> bool:
62
+ return get_chain_layout()
63
+
64
+ @chain_layout.setter
65
+ def chain_layout(self, flag: bool):
66
+ set_chain_layout(flag)
67
+
68
+ @property
69
+ def peptide_layout(self) -> bool:
70
+ return get_peptide_layout()
71
+
72
+ @peptide_layout.setter
73
+ def peptide_layout(self, flag: bool):
74
+ set_peptide_layout(flag)
75
+
59
76
 
60
77
  _modules[__name__].__class__ = _Facade
61
78
 
@@ -49,6 +49,7 @@ from ._salts import ComponentRow, DEFAULT_STABILIZER_CLASSES, SaltComposition, d
49
49
  from ._saturate import saturate
50
50
  from ._smarts import SmartsSyntaxError, compile_smarts
51
51
  from ._standardize import LogRecord, standardize
52
+ from ._stereo_audit import Fix, Finding, StereoAudit, audit_stereo
52
53
  from ._tables import (ACID_ROLES, AbbreviationRow, AcidRow, Endpoint, RESONANCE_ROLES, Rule,
53
54
  SALT_CLASSES, SALT_MATCHES, SaltRow, abbreviation_row, abbreviations_rows,
54
55
  acids_rules, acids_rules_by_role, acids_table_text, groups_rules,
@@ -56,6 +57,7 @@ from ._tables import (ACID_ROLES, AbbreviationRow, AcidRow, Endpoint, RESONANCE_
56
57
  resonance_table_text, salts_rows, salts_rows_by_klass, salts_species_keys,
57
58
  salts_table_text, standardize_rules)
58
59
  from ._tpsa import tpsa
60
+ from ..core.monomers import PeptideBranch, Peptide, Residue, monomers
59
61
  from ..core._core import (_set_canonicalize_fn, _set_featurizer_fns, _set_hydrogens_fns,
60
62
  _set_isomers_fn, _set_kekule_form_fn, _set_protomers_fn,
61
63
  _set_resonance_fn, _set_salts_fns, _set_standardize_fn,
@@ -63,13 +65,14 @@ from ..core._core import (_set_canonicalize_fn, _set_featurizer_fns, _set_hydrog
63
65
 
64
66
 
65
67
  __all__ = ['ACID_ROLES', 'AbbreviationRow', 'ComponentRow', 'DEFAULT_STABILIZER_CLASSES',
66
- 'LogRecord', 'SALT_CLASSES', 'SALT_MATCHES', 'SaltComposition',
67
- 'abbreviation_row', 'abbreviations_rows', 'alert_count',
68
+ 'Finding', 'Fix', 'LogRecord', 'Peptide', 'PeptideBranch', 'Residue',
69
+ 'SALT_CLASSES', 'SALT_MATCHES', 'SaltComposition', 'StereoAudit',
70
+ 'abbreviation_row', 'abbreviations_rows', 'alert_count', 'audit_stereo',
68
71
  'calc_implicit', 'canonicalize', 'check_valence', 'crippen_logp', 'crippen_mr',
69
72
  'decompose_salts', 'expand_abbreviations', 'explicify_hydrogens', 'fix_resonance',
70
73
  'hydrogen_bond_acceptors_count',
71
74
  'hydrogen_bond_donors_count', 'implicify_hydrogens', 'maccs_bit_set', 'maccs_keys',
72
- 'neutralize', 'perceive_bonds', 'pharmacophore_invariants', 'qed', 'qed_properties',
75
+ 'monomers', 'neutralize', 'perceive_bonds', 'pharmacophore_invariants', 'qed', 'qed_properties',
73
76
  'rotatable_bonds_count',
74
77
  'saturate', 'split_salts', 'standardize', 'standardize_isomers',
75
78
  'standardize_kekule', 'tpsa']
@@ -19,9 +19,9 @@
19
19
  """`canonicalize()` -- the pre-pass that makes `canonical_bytes` a compound identity rather than a
20
20
  drawing identity, so equal compounds hash equal and a corpus deduplicates by hash. The stage order
21
21
  is a correctness constraint, not taste: `kekule()`, `validate_stereo()`, `standardize()`,
22
- `implicify_hydrogens()`, `neutralize()`, `standardize_kekule()`, `thiele()`, `standardize_isomers()`, and
23
- `kekule()` again only under `keep_kekule=True`. Each ordering pair is justified at its numbered step
24
- below.
22
+ `implicify_hydrogens()`, `neutralize()`, `standardize_kekule()`, `thiele()`, `standardize_isomers()`,
23
+ `kekule()` again only under `keep_kekule=True`, and `canonicalize_stereo_groups()`. Each ordering pair
24
+ is justified at its numbered step below.
25
25
 
26
26
  The order alone is not enough, because the last stage can unblock the third one: a `tautomer` row
27
27
  wanting a free ring nitrogen cannot fire while the mobile hydrogen sits on it, and the placement is
@@ -48,8 +48,46 @@ _RULE_ROUNDS = 'canonicalize:rounds'
48
48
  _ROUNDS_MAX = 5
49
49
 
50
50
 
51
+ def _pin_lactim(molecule: MoleculeContainer) -> bool:
52
+ """Kekulise `molecule` with the C=N of one aromatic lactim pinned, when that lets a row repair it.
53
+
54
+ A site is `[O,S;D1]-c:n` with a bare two-connected ring nitrogen. Sites are tried in `atoms_order`,
55
+ which the placement stage has already made spelling-independent, and a site is taken only when a
56
+ trial `standardize()` on the pinned form turns its C-OH into C=O -- the rows stay the only authority
57
+ on which lactims are lactams. Returns True with the molecule kekulised and the repair still to run.
58
+ """
59
+ ranks = molecule.atoms_order
60
+ sites = []
61
+ for o in molecule.atom_numbers:
62
+ if molecule.element_of(o) not in (8, 16) or molecule.charge_of(o) or molecule.implicit_h_of(o) != 1:
63
+ continue
64
+ neighbors = tuple(molecule.neighbors_of(o))
65
+ if len(neighbors) != 1 or molecule.order_of(o, neighbors[0]) != 1:
66
+ continue
67
+ c = neighbors[0]
68
+ for n in molecule.neighbors_of(c):
69
+ if (molecule.element_of(n) == 7 and molecule.order_of(c, n) == 4 and not molecule.charge_of(n)
70
+ and not molecule.implicit_h_of(n) and len(tuple(molecule.neighbors_of(n))) == 2):
71
+ sites.append((ranks[o], ranks[n], o, c, n))
72
+ for *_, o, c, n in sorted(sites):
73
+ trial = molecule.copy()
74
+ with trial.edit():
75
+ trial.set_order(c, n, 2)
76
+ if trial.kekule(canonical=True).unresolved or trial.order_of(c, n) != 2:
77
+ continue
78
+ standardize(trial)
79
+ if trial.order_of(o, c) != 2:
80
+ continue
81
+ with molecule.edit():
82
+ molecule.set_order(c, n, 2)
83
+ molecule.kekule(canonical=True)
84
+ return True
85
+ return False
86
+
87
+
51
88
  def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
52
- keep_kekule: bool = False) -> bool:
89
+ keep_kekule: bool = False, stereo_groups: bool = True,
90
+ recover_racemate: bool = False) -> bool:
53
91
  """Bring `molecule` to the representation two drawings of one compound share. Did it change?
54
92
 
55
93
  Run before deduplicating by `canonical_bytes`, `__hash__` or `__eq__`, which otherwise answer "same
@@ -61,7 +99,10 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
61
99
  (`Oc1ccccn1` and `O=c1cccc[nH]1` stop hashing equal); it deliberately does not reach
62
100
  `standardize_isomers()`, which picks between two valid annular forms rather than repairing one.
63
101
  `keep_kekule=True` costs a second kekulisation rather than a skipped `thiele()`, the placement stage
64
- needing the aromatic form.
102
+ needing the aromatic form. `stereo_groups=False` skips step 11 and keeps the stored collection
103
+ labels and AND phases, which a reaction needs for a collection joined across its arrow.
104
+ `recover_racemate` is forwarded to `validate_stereo()`: a bridgehead pair no bicycle realises is then
105
+ read as the racemate instead of cleared.
65
106
 
66
107
  CHARGES ARE PAIRED OFF, not preserved atom by atom: glycine's zwitterion and its neutral drawing
67
108
  share a key, because step 5 runs `neutralize()`. `neutralize()` leaves the NET charge untouched, so
@@ -95,7 +136,11 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
95
136
  # Nothing is recorded here about `result.unresolved`: the kekuliser writes a `LOST` record per
96
137
  # system to `molecule.log` itself, naming it in `atoms`, so a second one here would summarise an
97
138
  # event already reported. `check_valence()` is still how those atoms are found.
98
- molecule.kekule()
139
+ # Canonically, so the group rules see one form of the compound whatever the atom order. A drawing
140
+ # already in a Kekule form is aromatised first, or the rules would read whichever form was drawn:
141
+ # the two Kekule drawings of HBTU's benzotriazole oxide repair to two resonance forms.
142
+ molecule.thiele()
143
+ molecule.kekule(canonical=True)
99
144
 
100
145
  # 2. Drop the parities the constitution does not justify, on the localised form and before step 6
101
146
  # hides a bond order behind an aromatic one. A cis/trans sign on a double bond an alternating
@@ -103,28 +148,34 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
103
148
  # `canonical_bytes` whether or not the unit is stereogenic -- so the two bond-shift drawings of
104
149
  # 1,2-dimethylcyclooctatetraene keep two keys until it is gone. The report is not recorded: the
105
150
  # parities it names are the reader's own input and `validate_stereo()` returns them to a caller
106
- # that wants them.
107
- molecule.validate_stereo()
151
+ # that wants them. A coupled bridgehead set signed as no bicycle is built is cleared, or with
152
+ # `recover_racemate` read as the racemate its drawer most likely meant.
153
+ molecule.validate_stereo(recover_racemate=recover_racemate)
108
154
 
109
- # 3. Repair the drawing.
110
- standardize(molecule, fix_tautomers=fix_tautomers)
111
-
112
- # 4. Explicit hydrogens are a `canonical_bytes` difference, so they have to go.
155
+ # 3. Explicit hydrogens are a `canonical_bytes` difference, so they have to go -- before step 4,
156
+ # whose rows read implicit counts and move no hydrogen atom: `[H]Oc1ccncc1` would flip to the
157
+ # 4-pyridone with its hydrogen atom still on the oxygen.
113
158
  implicify_hydrogens(molecule)
114
159
 
160
+ # 4. Repair the drawing.
161
+ repaired = standardize(molecule, fix_tautomers=fix_tautomers)
162
+
115
163
  # 5. Pair off the charges an acid/base row can pair off, so a zwitterion and its neutral drawing
116
- # hash equal. AFTER step 4, because `acids.tsv` reads implicit hydrogens: a cation drawn with
164
+ # hash equal. AFTER step 3, because `acids.tsv` reads implicit hydrogens: a cation drawn with
117
165
  # hydrogen ATOMS is invisible to it until they have been folded in. `keep_charge` stays at its
118
166
  # default -- the net charge is part of the compound, so a canonical form may move a proton but
119
167
  # never create or destroy one. A quaternary ammonium keeps its counterion: it has no proton to
120
- # give, so the pass finds no donor and declines.
121
- neutralize(molecule)
168
+ # give, so the pass finds no donor and declines. A repair or a pairing moves bonds and hydrogens
169
+ # step 2 judged, so it is asked again: a parity a moved hydrogen leaves on an alternating cycle
170
+ # would be dropped by the next canonicalisation, and the first answer would not be a fixed point.
171
+ if neutralize(molecule) | repaired:
172
+ molecule.validate_stereo(recover_racemate=recover_racemate)
122
173
 
123
174
  # 6. Which Kekule form, decided before step 7 reads one. `thiele()` refuses a candidate ring whose
124
175
  # atom holds its double bond outside the ring, so a compound with several Kekule forms has one
125
176
  # aromatic form per form until this stage picks between them; a ring too big for `thiele()` to
126
177
  # consider gets a canonical alternation here instead, nothing later collapsing its two. AFTER
127
- # step 3, whose group rules are written against the orders the drawing carried, and after step 2,
178
+ # step 4, whose group rules are written against the orders the drawing carried, and after step 2,
128
179
  # whose parities would otherwise pin the very bond this stage moves.
129
180
  standardize_kekule(molecule)
130
181
 
@@ -142,32 +193,40 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
142
193
 
143
194
  # 9. Steps 3 to 8 again, while the placement keeps unblocking a repair. `Oc1[nH]cnc2nncc1-2` is
144
195
  # the shape: its mobile hydrogen sits on the one ring nitrogen the hydroxy-azine rows need free,
145
- # so step 3 declines, and by the time step 8 has moved it the repair is behind us -- the drawing
196
+ # so step 4 declines, and by the time step 8 has moved it the repair is behind us -- the drawing
146
197
  # kept its hydroxy form and the same compound drawn the other way got the oxo form and a
147
198
  # different key. Only the placement is re-entered from, since it is the one stage that can put
148
199
  # the molecule back into a shape an earlier stage would have acted on.
149
200
  #
150
201
  # `kekule()` leads, and not for the reason step 1 does: the `tautomer` rows are written against
151
202
  # definite bond orders, so on the aromatic form step 7 left behind they match nothing at all and
152
- # re-running step 3 would be a guaranteed no-op. Step 5 is re-entered only behind a repair,
153
- # which is the only thing that can hand it a charged site it has not already seen. Step 6 rides
203
+ # re-running step 4 would be a guaranteed no-op. Step 5 is re-entered every round: a repair and
204
+ # the placement both hand it charged sites it has not seen -- the placement moves an N-oxide's
205
+ # charge onto an azole NH, `c1ccc2[nH]cnc2[n+]1[O-]` to `c1ccc2nc[nH+]c2n1[O-]`, a zwitterion
206
+ # step 5 pairs off -- and what it pairs off can unblock the placement again. It cannot cycle:
207
+ # step 5 only ever reduces the number of charged atoms and step 8 never adds one. Step 6 rides
154
208
  # with the aromatisation and not with the repair: the kekulisation above is free to come back with
155
209
  # a different Kekule form than the one it was handed, which is the form step 7 would then read.
156
- # Step 2 is not re-entered: the parities it can justify are a property of the constitution, which
157
- # no stage from here on changes.
210
+ # Step 2 is re-entered every round, on the localised form ahead of step 6: the placement moved a
211
+ # hydrogen, and which double bonds an alternating cycle can move depends on where it sits.
212
+ #
213
+ # A round the placement did not ask for is opened by a lactim `kekule()` left unrepairable: the
214
+ # hydroxy-azine rows need the C=N beside the C-OH, and which Kekule form comes back depends on the
215
+ # atom order. `_pin_lactim` pins that C=N and kekulises around it, so 3-hydroxyisoquinoline
216
+ # reaches isoquinolin-3(2H)-one from every order.
158
217
  for _ in range(_ROUNDS_MAX):
159
- if not moved:
218
+ if moved:
219
+ molecule.kekule(canonical=True)
220
+ elif not (fix_tautomers and _pin_lactim(molecule)):
160
221
  break
161
- molecule.kekule()
162
222
  changed = standardize(molecule, fix_tautomers=fix_tautomers)
163
223
  if changed:
164
224
  implicify_hydrogens(molecule)
165
- neutralize(molecule)
225
+ changed |= neutralize(molecule)
226
+ molecule.validate_stereo(recover_racemate=recover_racemate) # the placement moved a hydrogen
166
227
  standardize_kekule(molecule)
167
228
  molecule.thiele() # unconditional: step 6's form is what a caller compares, and
168
- if not changed: # the kekulisation above has to be undone either way
169
- break
170
- moved = standardize_isomers(molecule)
229
+ moved = changed and standardize_isomers(molecule) # the kekulisation has to be undone either way
171
230
  else:
172
231
  with recording(molecule, stage='canonicalize') as log:
173
232
  log.append(LogRecord(_RULE_ROUNDS, (), f'repair and placement were still changing the '
@@ -178,8 +237,14 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
178
237
  # 10. `keep_kekule` undoes step 7 rather than skipping it: skipping 7 would skip 8 with it, and the
179
238
  # flag would then decide which tautomer the caller gets. Step 6 is not re-run behind it and
180
239
  # would have nothing to do: an aromatic ring is unwound into a ring holding every double bond it
181
- # has room for, and which of its alternations comes back is the kekuliser's answer to give.
240
+ # has room for, and which of its alternations comes back is the kekuliser's answer to give --
241
+ # canonical, so the flag keeps the guarantee.
182
242
  if keep_kekule:
183
- molecule.kekule()
243
+ molecule.kekule(canonical=True)
244
+
245
+ # 11. Store the collections the canonical SMILES states: dead labels dropped, canonical ids, each AND
246
+ # collection in its canonical phase. Last, because every stage above can move a parity or a
247
+ # unit. `canonical_bytes` does not see it, so its answer is ORed in.
248
+ grouped = stereo_groups and molecule.canonicalize_stereo_groups()
184
249
 
185
- return molecule.canonical_bytes != before
250
+ return molecule.canonical_bytes != before or grouped
@@ -92,13 +92,31 @@ def _plan(molecule: MoleculeContainer, log):
92
92
  doomed.append(n)
93
93
  counts[other] = current + 1
94
94
 
95
- # Read every affected anchor's parity now. `delete_atom` clears it, and it cannot be read back
96
- # from inside the session.
97
- parities: dict[int, int] = {}
98
- for n in counts:
99
- p = molecule.parity_of(n)
100
- if p:
101
- parities[n] = p
95
+ # Read every affected anchor's configuration now, in a direction order that already puts each doomed
96
+ # hydrogen where the implicit direction will be: last in its group, the whole frame for a centre and
97
+ # its own pair for a bond unit. `delete_atom` clears the parity, and the unit's refs after the fold
98
+ # are not the refs before it, so a verbatim copy of the byte inverts the centre whenever the move is
99
+ # an odd permutation -- `[2H][C@@]([H])(Cl)Br` folded to the enantiomer of `[H][C@]([2H])(Cl)Br`.
100
+ gone = frozenset(doomed)
101
+ parities: dict[int, tuple[int, tuple]] = {}
102
+ for u in molecule.stereo_units():
103
+ n = u['anchor']
104
+ if n not in counts or not molecule.parity_of(n):
105
+ continue
106
+ refs = u['refs']
107
+ groups = [refs] if u['kind'] == 0 else [refs[:2], refs[2:]]
108
+ before, after = [], []
109
+ for group in groups:
110
+ kept = [r for r in group if r not in gone]
111
+ dropped = [r for r in group if r in gone]
112
+ before.extend(kept + dropped)
113
+ after.extend(kept + [None] * len(dropped))
114
+ if sum(r is None for r in after) > 1:
115
+ continue # two unnamed directions: no configuration survives the fold
116
+ try:
117
+ parities[n] = (molecule.translate_stereo(n, tuple(before)), tuple(after))
118
+ except ValueError: # a kind whose refs are not read in these groups: as stored
119
+ parities[n] = (molecule.parity_of(n), None)
102
120
  return doomed, counts, parities
103
121
 
104
122
 
@@ -129,10 +147,12 @@ def _implicify_apply(molecule, doomed, counts, parities):
129
147
  molecule.delete_atom(n)
130
148
  for n, total in counts.items():
131
149
  molecule.set_hydrogens(n, total)
132
- for n, p in parities.items():
133
- # restore what `delete_atom` cleared, verbatim: without this, deleting the explicit
134
- # hydrogen of `F[C@]([H])(Cl)Br` racemises the centre.
135
- molecule.set_parity(n, p)
150
+ if parities:
151
+ # restore what `delete_atom` cleared, in the order `_plan` read it: a second session, since
152
+ # `order=` reads the frame and the first one changed the graph
153
+ with molecule.edit():
154
+ for n, (p, order) in parities.items():
155
+ molecule.set_parity(n, p, order=order)
136
156
 
137
157
 
138
158
  def explicify_hydrogens(molecule: MoleculeContainer) -> int: