synkit 1.6.0__tar.gz → 1.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. synkit-1.6.1/.gitignore +108 -0
  2. synkit-1.6.1/PKG-INFO +182 -0
  3. synkit-1.6.1/README.md +143 -0
  4. {synkit-1.6.0 → synkit-1.6.1}/pyproject.toml +2 -5
  5. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/_ir.py +114 -9
  6. synkit-1.6.1/synkit/Chem/Molecule/_chirality_loci.py +165 -0
  7. synkit-1.6.1/synkit/Chem/Molecule/_chirality_types.py +231 -0
  8. synkit-1.6.1/synkit/Chem/Molecule/_helical_loci.py +167 -0
  9. synkit-1.6.1/synkit/Chem/Molecule/_stereo_axis_evidence.py +200 -0
  10. synkit-1.6.1/synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
  11. synkit-1.6.1/synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
  12. synkit-1.6.1/synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
  13. synkit-1.6.1/synkit/Chem/Molecule/chirality.py +1041 -0
  14. synkit-1.6.1/synkit/Chem/Molecule/cip_assignment.py +569 -0
  15. synkit-1.6.1/synkit/Chem/Molecule/cip_ranking.py +843 -0
  16. synkit-1.6.1/synkit/Chem/Molecule/coordinate_stereo.py +503 -0
  17. synkit-1.6.1/synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
  18. synkit-1.6.1/synkit/Chem/Molecule/global_stereo.py +175 -0
  19. synkit-1.6.1/synkit/Chem/Molecule/stereo_evidence.py +179 -0
  20. synkit-1.6.1/synkit/Chem/Molecule/stereo_perception.py +1032 -0
  21. synkit-1.6.1/synkit/Graph/Canon/__init__.py +16 -0
  22. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Canon/canon_algs.py +2 -1
  23. {synkit-1.6.0/synkit/Graph → synkit-1.6.1/synkit/Graph/Canon}/canon_graph.py +2 -2
  24. synkit-1.6.1/synkit/Graph/Canon/exact.py +957 -0
  25. synkit-1.6.1/synkit/Graph/Canon/exact_refinement.py +368 -0
  26. synkit-1.6.1/synkit/Graph/Canon/nauty.py +143 -0
  27. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/candidate.py +33 -2
  28. synkit-1.6.1/synkit/Graph/Hyrogen/__init__.py +6 -0
  29. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Hyrogen/hcomplete.py +287 -339
  30. synkit-1.6.1/synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
  31. synkit-1.6.1/synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
  32. synkit-1.6.1/synkit/Graph/Hyrogen/hextend.py +557 -0
  33. synkit-1.6.1/synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
  34. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_construction.py +40 -0
  35. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_destruction.py +11 -0
  36. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/rc_extractor.py +23 -7
  37. synkit-1.6.1/synkit/Graph/ITS/stereo.py +74 -0
  38. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/dedup_matches.py +10 -5
  39. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/subgraph_matcher.py +91 -11
  40. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/conversion.py +40 -0
  41. synkit-1.6.1/synkit/Graph/Stereo/__init__.py +368 -0
  42. synkit-1.6.1/synkit/Graph/Stereo/_descriptor_core.py +207 -0
  43. synkit-1.6.1/synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
  44. synkit-1.6.1/synkit/Graph/Stereo/canonical.py +635 -0
  45. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/changes.py +220 -8
  46. synkit-1.6.1/synkit/Graph/Stereo/composition.py +391 -0
  47. synkit-1.6.1/synkit/Graph/Stereo/configured.py +981 -0
  48. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/couplings.py +23 -2
  49. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/descriptors.py +434 -232
  50. synkit-1.6.1/synkit/Graph/Stereo/enumeration.py +590 -0
  51. synkit-1.6.1/synkit/Graph/Stereo/extended_descriptors.py +402 -0
  52. synkit-1.6.1/synkit/Graph/Stereo/global_configured.py +152 -0
  53. synkit-1.6.1/synkit/Graph/Stereo/global_stereo.py +304 -0
  54. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/identity.py +37 -0
  55. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/matching.py +79 -0
  56. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/orbits.py +44 -0
  57. synkit-1.6.1/synkit/Graph/Stereo/pairwise.py +224 -0
  58. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/rdkit_adapter.py +42 -18
  59. synkit-1.6.1/synkit/Graph/Stereo/reaction_interchange.py +266 -0
  60. synkit-1.6.1/synkit/Graph/Stereo/semantics.py +296 -0
  61. synkit-1.6.1/synkit/Graph/Stereo/supports.py +257 -0
  62. synkit-1.6.1/synkit/Graph/Stereo/wire.py +339 -0
  63. synkit-1.6.1/synkit/Graph/canon_graph.py +14 -0
  64. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/chem_converter.py +60 -2
  65. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/__init__.py +10 -1
  66. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/equivalence.py +75 -1
  67. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/evidence.py +9 -4
  68. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/interchange.py +31 -14
  69. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/model.py +238 -0
  70. synkit-1.6.1/synkit/Mechanism/neighbor_stereo.py +312 -0
  71. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/replay.py +53 -1
  72. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/schema.py +58 -0
  73. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/stereo_state.py +68 -0
  74. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/generic_stereo.py +114 -1
  75. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/syn_rule.py +39 -0
  76. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/__init__.py +4 -1
  77. synkit-1.6.1/synkit/Synthesis/Reactor/assignment.py +35 -0
  78. synkit-1.6.1/synkit/Synthesis/Reactor/deduplication.py +830 -0
  79. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/graph_rewrite.py +136 -28
  80. synkit-1.6.1/synkit/Synthesis/Reactor/matching_policy.py +235 -0
  81. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/product_state.py +122 -44
  82. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/reactor_matching.py +65 -40
  83. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/reactor_stereo.py +238 -5
  84. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/serialization.py +12 -2
  85. synkit-1.6.1/synkit/Synthesis/Reactor/serialization_policy.py +16 -0
  86. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/syn_reactor.py +120 -23
  87. {synkit-1.6.0 → synkit-1.6.1}/synkit/version.py +1 -1
  88. synkit-1.6.0/.gitignore +0 -73
  89. synkit-1.6.0/Data/Mech/README.md +0 -46
  90. synkit-1.6.0/Data/Mech/polar.json +0 -15921
  91. synkit-1.6.0/Data/Mech/radical.json +0 -12062
  92. synkit-1.6.0/Data/Mech/stereo.json +0 -7875
  93. synkit-1.6.0/LICENSES/ACS-StereoMolGraph-SI-NOTICE.md +0 -19
  94. synkit-1.6.0/LICENSES/StereoMolGraph-MIT.txt +0 -30
  95. synkit-1.6.0/PKG-INFO +0 -212
  96. synkit-1.6.0/README.md +0 -171
  97. synkit-1.6.0/synkit/Chem/Molecule/chirality.py +0 -761
  98. synkit-1.6.0/synkit/Graph/Canon/__init__.py +0 -3
  99. synkit-1.6.0/synkit/Graph/Canon/canon_graph.py +0 -530
  100. synkit-1.6.0/synkit/Graph/Canon/nauty.py +0 -320
  101. synkit-1.6.0/synkit/Graph/Hyrogen/hextend.py +0 -305
  102. synkit-1.6.0/synkit/Graph/Stereo/__init__.py +0 -152
  103. synkit-1.6.0/synkit/Synthesis/Reactor/assignment.py +0 -16
  104. synkit-1.6.0/synkit/Synthesis/Reactor/deduplication.py +0 -361
  105. synkit-1.6.0/synkit/Utils/__init__.py +0 -0
  106. {synkit-1.6.0 → synkit-1.6.1}/LICENSE +0 -0
  107. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/DAG/__init__.py +0 -0
  108. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
  109. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/__init__.py +0 -0
  110. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/abstract.py +0 -0
  111. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/arity.py +0 -0
  112. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/builder.py +0 -0
  113. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/derivation.py +0 -0
  114. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/flattener.py +0 -0
  115. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/keys.py +0 -0
  116. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/mixtures.py +0 -0
  117. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/smiles.py +0 -0
  118. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/state.py +0 -0
  119. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/strategy.py +0 -0
  120. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/worker.py +0 -0
  121. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/__init__.py +0 -0
  122. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/_adapter.py +0 -0
  123. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/pathfinder.py +0 -0
  124. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/reachability.py +0 -0
  125. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/realizability.py +0 -0
  126. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/__init__.py +0 -0
  127. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/analyzer.py +0 -0
  128. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/net.py +0 -0
  129. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/persistence.py +0 -0
  130. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/semiflows.py +0 -0
  131. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/structure.py +0 -0
  132. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/__init__.py +0 -0
  133. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/dynamics.py +0 -0
  134. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/helper.py +0 -0
  135. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/stoich.py +0 -0
  136. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/thermo.py +0 -0
  137. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/__init__.py +0 -0
  138. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_api.py +0 -0
  139. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_extract.py +0 -0
  140. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_impute.py +0 -0
  141. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_parse.py +0 -0
  142. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/__init__.py +0 -0
  143. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/reaction.py +0 -0
  144. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/rule.py +0 -0
  145. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/species.py +0 -0
  146. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/syncrn.py +0 -0
  147. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/__init__.py +0 -0
  148. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/_common.py +0 -0
  149. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/automorphism.py +0 -0
  150. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/canon.py +0 -0
  151. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/isomorphism.py +0 -0
  152. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/symmetry.py +0 -0
  153. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/wl_canon.py +0 -0
  154. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/__init__.py +0 -0
  155. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/crn_vis.py +0 -0
  156. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/labels.py +0 -0
  157. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/layout.py +0 -0
  158. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/palette.py +0 -0
  159. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/validation.py +0 -0
  160. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/vis.py +0 -0
  161. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/__init__.py +0 -0
  162. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
  163. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
  164. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
  165. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
  166. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
  167. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
  168. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
  169. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
  170. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
  171. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
  172. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/__init__.py +0 -0
  173. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
  174. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/loader.py +0 -0
  175. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/models.py +0 -0
  176. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/constants.py +0 -0
  177. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/crn_formula.py +0 -0
  178. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/deficiency.py +0 -0
  179. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/enumerator.py +0 -0
  180. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/exceptions.py +0 -0
  181. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/explorer.py +0 -0
  182. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/helpers.py +0 -0
  183. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/injectivity.py +0 -0
  184. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/motif.py +0 -0
  185. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/network.py +0 -0
  186. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/pathway.py +0 -0
  187. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/properties.py +0 -0
  188. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/reaction.py +0 -0
  189. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/utils.py +0 -0
  190. {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/viz.py +0 -0
  191. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Cluster/__init__.py +0 -0
  192. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Cluster/butina.py +0 -0
  193. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/__init__.py +0 -0
  194. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
  195. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
  196. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
  197. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/__init__.py +0 -0
  198. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/atom_features.py +0 -0
  199. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/descriptors.py +0 -0
  200. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/formula.py +0 -0
  201. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/graph_annotator.py +0 -0
  202. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/standardize.py +0 -0
  203. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/valence.py +0 -0
  204. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
  205. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/aam_validator.py +0 -0
  206. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
  207. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
  208. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/its.py +0 -0
  209. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
  210. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
  211. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/branching.py +0 -0
  212. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/certificate.py +0 -0
  213. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +0 -0
  214. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/enumeration_result.py +0 -0
  215. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +0 -0
  216. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/kernel.py +0 -0
  217. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/milp.py +0 -0
  218. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
  219. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -0
  220. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +0 -0
  221. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
  222. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/refine.py +0 -0
  223. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
  224. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
  225. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +0 -0
  226. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
  227. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/lap.py +0 -0
  228. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
  229. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/__init__.py +0 -0
  230. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/aam_validator.py +0 -0
  231. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/balance_check.py +0 -0
  232. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
  233. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/cleaning.py +0 -0
  234. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/deionize.py +0 -0
  235. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
  236. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/fix_aam.py +0 -0
  237. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/neutralize.py +0 -0
  238. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
  239. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/standardize.py +0 -0
  240. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/tautomerize.py +0 -0
  241. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/__init__.py +0 -0
  242. {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/utils.py +0 -0
  243. {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/__init__.py +0 -0
  244. {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/aldol.json.gz +0 -0
  245. {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/gen_partial_aam.py +0 -0
  246. {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/paracetamol.json.gz +0 -0
  247. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/__init__.py +0 -0
  248. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/hier_context.py +0 -0
  249. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/radius_expand.py +0 -0
  250. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/__init__.py +0 -0
  251. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/api.py +0 -0
  252. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/audit.py +0 -0
  253. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/catalog.py +0 -0
  254. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/detector.py +0 -0
  255. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/model.py +0 -0
  256. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/recognizers.py +0 -0
  257. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/ring_system.py +0 -0
  258. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
  259. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
  260. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
  261. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/__init__.py +0 -0
  262. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_descriptors.py +0 -0
  263. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_fps.py +0 -0
  264. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_signature.py +0 -0
  265. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/hash_fps.py +0 -0
  266. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/morgan_fps.py +0 -0
  267. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/path_fps.py +0 -0
  268. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/wl_hash.py +0 -0
  269. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/__init__.py +0 -0
  270. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/constructor.py +0 -0
  271. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/identity.py +0 -0
  272. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/interface.py +0 -0
  273. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/search.py +0 -0
  274. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Hyrogen/_misc.py +0 -0
  275. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/__init__.py +0 -0
  276. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_builder.py +0 -0
  277. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_decompose.py +0 -0
  278. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_expand.py +0 -0
  279. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_relabel.py +0 -0
  280. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_reverter.py +0 -0
  281. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/normalize_aam.py +0 -0
  282. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/partial_its.py +0 -0
  283. {synkit-1.6.0/synkit/Graph/Hyrogen → synkit-1.6.1/synkit/Graph/MTG}/__init__.py +0 -0
  284. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mcs_matcher.py +0 -0
  285. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mtg.py +0 -0
  286. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mtg_explore.py +0 -0
  287. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/utils.py +0 -0
  288. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/__init__.py +0 -0
  289. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/approx_mcs.py +0 -0
  290. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/auto_est.py +0 -0
  291. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/automorphism.py +0 -0
  292. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/batch_cluster.py +0 -0
  293. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_cluster.py +0 -0
  294. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_matcher.py +0 -0
  295. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_morphism.py +0 -0
  296. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
  297. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
  298. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/orbit.py +0 -0
  299. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/partial_matcher.py +0 -0
  300. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/sing.py +0 -0
  301. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/turbo_iso.py +0 -0
  302. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/wl_sel.py +0 -0
  303. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/__init__.py +0 -0
  304. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/conversion_debug.py +0 -0
  305. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/electron_accounting.py +0 -0
  306. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/lwg_editor.py +0 -0
  307. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/lwg_ops.py +0 -0
  308. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/__init__.py +0 -0
  309. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/constraints.py +0 -0
  310. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/morphism.py +0 -0
  311. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo.py +0 -0
  312. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
  313. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
  314. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
  315. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/interchange.py +0 -0
  316. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/legacy.py +0 -0
  317. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/outcomes.py +0 -0
  318. {synkit-1.6.0/synkit/Graph/MTG → synkit-1.6.1/synkit/Graph/Wildcard}/__init__.py +0 -0
  319. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
  320. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/graph_wc.py +0 -0
  321. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/its_merge.py +0 -0
  322. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/radwc.py +0 -0
  323. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
  324. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/wildcard.py +0 -0
  325. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/__init__.py +0 -0
  326. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/syn_graph.py +0 -0
  327. {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/utils.py +0 -0
  328. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/__init__.py +0 -0
  329. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/__init__.py +0 -0
  330. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
  331. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
  332. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
  333. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_expander.py +0 -0
  334. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
  335. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
  336. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/conversion.py +0 -0
  337. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/data_io.py +0 -0
  338. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/data_process.py +0 -0
  339. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/debug.py +0 -0
  340. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/gml_to_nx.py +0 -0
  341. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/graph_to_mol.py +0 -0
  342. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/mol_to_graph.py +0 -0
  343. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/mol_to_graph_chemistry.py +0 -0
  344. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/nx_to_gml.py +0 -0
  345. {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/smiles_to_id.py +0 -0
  346. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/adapters.py +0 -0
  347. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/audit.py +0 -0
  348. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/benchmark.py +0 -0
  349. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/compatibility.py +0 -0
  350. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/drawing.py +0 -0
  351. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/electron_models.py +0 -0
  352. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/radical_data.py +0 -0
  353. {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/symbols.py +0 -0
  354. {synkit-1.6.0/synkit/Graph/Wildcard → synkit-1.6.1/synkit/Rule/Apply}/__init__.py +0 -0
  355. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Apply/rule_matcher.py +0 -0
  356. {synkit-1.6.0/synkit/Rule/Apply → synkit-1.6.1/synkit/Rule/Compose}/__init__.py +0 -0
  357. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Compose/_identity.py +0 -0
  358. {synkit-1.6.0/synkit/Rule/Compose → synkit-1.6.1/synkit/Rule/Modify}/__init__.py +0 -0
  359. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/implict_rule.py +0 -0
  360. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/longest_path.py +0 -0
  361. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/molecule_rule.py +0 -0
  362. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/prune_templates.py +0 -0
  363. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/rule_utils.py +0 -0
  364. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/strip_rule.py +0 -0
  365. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/__init__.py +0 -0
  366. {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/stereo_identity.py +0 -0
  367. {synkit-1.6.0/synkit/Rule/Modify → synkit-1.6.1/synkit/Synthesis/MSR}/__init__.py +0 -0
  368. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/MSR/path_finder.py +0 -0
  369. {synkit-1.6.0/synkit/Synthesis/MSR → synkit-1.6.1/synkit/Synthesis/Metrics}/__init__.py +0 -0
  370. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_base.py +0 -0
  371. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_plot.py +0 -0
  372. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_ranking.py +0 -0
  373. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
  374. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/benchmark.py +0 -0
  375. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/fusion_validation.py +0 -0
  376. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
  377. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
  378. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/post_syn.py +0 -0
  379. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_engine.py +0 -0
  380. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_matching.py +0 -0
  381. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_policy.py +0 -0
  382. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_reaction.py +0 -0
  383. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
  384. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/strategy.py +0 -0
  385. {synkit-1.6.0/synkit/Synthesis/Metrics → synkit-1.6.1/synkit/Synthesis}/__init__.py +0 -0
  386. {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/reactor_utils.py +0 -0
  387. {synkit-1.6.0/synkit/Synthesis → synkit-1.6.1/synkit/Utils}/__init__.py +0 -0
  388. {synkit-1.6.0 → synkit-1.6.1}/synkit/Utils/utils.py +0 -0
  389. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/__init__.py +0 -0
  390. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/crn/__init__.py +0 -0
  391. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/crn/visualizer.py +0 -0
  392. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/__init__.py +0 -0
  393. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/arrows.py +0 -0
  394. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/chem.py +0 -0
  395. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/constants.py +0 -0
  396. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/layout.py +0 -0
  397. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/mapping.py +0 -0
  398. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/models.py +0 -0
  399. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/render.py +0 -0
  400. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/utils.py +0 -0
  401. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/visualizer.py +0 -0
  402. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/graph_visualizer.py +0 -0
  403. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its/__init__.py +0 -0
  404. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its/drawer.py +0 -0
  405. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its_drawer.py +0 -0
  406. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/__init__.py +0 -0
  407. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/drawer.py +0 -0
  408. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/reaction.py +0 -0
  409. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule_drawer.py +0 -0
  410. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg/__init__.py +0 -0
  411. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg/drawer.py +0 -0
  412. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg_drawer.py +0 -0
  413. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/pdf_writer.py +0 -0
  414. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/__init__.py +0 -0
  415. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/rule.py +0 -0
  416. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/rxn.py +0 -0
  417. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction_drawer.py +0 -0
  418. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/__init__.py +0 -0
  419. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/chemical.py +0 -0
  420. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/embedding.py +0 -0
  421. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
  422. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
  423. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
  424. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/vis.py +0 -0
  425. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/visual_drawer.py +0 -0
  426. {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/visual_model.py +0 -0
  427. {synkit-1.6.0 → synkit-1.6.1}/synkit/__init__.py +0 -0
  428. {synkit-1.6.0 → synkit-1.6.1}/synkit/examples.py +0 -0
@@ -0,0 +1,108 @@
1
+ *.pyc
2
+ *cachedir
3
+ *.csv
4
+ !Experiment/Lewis/Data/all.csv
5
+ !Experiment/Lewis/Data/combinatorial_all.csv
6
+ !Experiment/Lewis/mech_path/Data/reconstruction_audit/polar-failures.csv
7
+ !Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-failures.csv
8
+ !Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-arrow-review.csv
9
+ */catboost_info/*
10
+
11
+
12
+ *.pkl.gz
13
+ *.pdf
14
+
15
+ .coverage
16
+ dev/*
17
+ /debug/
18
+ /Test/Conformance/
19
+ *.rdf
20
+ test_syn_reactor.py
21
+
22
+ Data/Benchmark/*
23
+ !Data/Benchmark/partial_expand/
24
+ !Data/Benchmark/partial_expand/**
25
+ Data/Benchmark/partial_expand/results/
26
+ !Data/Benchmark/mech/
27
+ Data/Benchmark/mech/*
28
+ !Data/Benchmark/mech/README.md
29
+ !Data/Benchmark/mech/polar-failures.csv
30
+ !Data/Benchmark/mech/radical-failures.csv
31
+ *.json.gz
32
+ !Experiment/Lewis/Data/benchmark.json.gz
33
+ # *.png
34
+
35
+ run.sh
36
+ docs/*
37
+ run_rdcanon.py
38
+ Data/Fragment/*
39
+ test_partial.py
40
+ Data/Benchmark/synthesis/*
41
+ Data/USPTO/*
42
+ crn/*
43
+ test_run.py
44
+ Data/Study/CRN/case_formose/*
45
+
46
+ synkit/Graph/dev/*
47
+ *.ipynb
48
+ *.json
49
+ # Stereo benchmark inputs are versioned for reproducible fresh-clone runs.
50
+ # Generated reports stay Git-visible so completed results can be committed
51
+ # explicitly, including reports created by the long raw stress stages.
52
+ !Experiment/Stereo/Data/**/*.csv
53
+ !Experiment/Stereo/Data/**/*.json
54
+ !Data/Schema/
55
+ !Data/Schema/attribute_propagation_v1_5.json
56
+ !/tools/python_file_size_baseline.json
57
+ !Data/Mech/polar.json
58
+ !Data/Mech/radical.json
59
+ !Data/Mech/stereo.json
60
+ !Experiment/Lewis/Data/hydrogen.pkl.gz
61
+ # Canonical reviewed MechanismBench partitions are executable test data.
62
+ !Experiment/Lewis/mech_path/Data/MechanismBench/polar.json
63
+ !Experiment/Lewis/mech_path/Data/MechanismBench/radical.json
64
+ !Experiment/Lewis/mech_path/Data/MechanismBench/stereo.json
65
+ !Experiment/Lewis/mech_path/Data/MechanismBench/electrocyclic_machinery.json
66
+ !Experiment/Lewis/mech_path/Data/MechanismBench/stereo_branch_coverage.json
67
+ !Experiment/Lewis/mech_path/Data/MechanismBench/stereo_couplings.json
68
+ !Experiment/Lewis/mech_path/Data/MechanismBench/evidence/mechanismbench_evidence.json
69
+ !Experiment/Lewis/rule_replay/Data/bidirectional-replay/results.json
70
+ !Experiment/Lewis/rule_replay/Data/relative-lone-pair/results.json
71
+ !Experiment/Stereo/Data/manifest.json
72
+ !Experiment/Stereo/Data/Perception/perception_conformance_cases.json
73
+ !Experiment/Stereo/Data/Perception/full_detection_report.json
74
+ !Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
75
+ !Data/Conformance/stereomolgraph_graph_conformance.json
76
+ !Data/Benchmark/Stereo/
77
+ !Data/Benchmark/Stereo/**
78
+ *.txt
79
+ !LICENSES/*.txt
80
+ *.log
81
+ /dist/
82
+ sprint/
83
+ sprint/*
84
+ test_syn.py
85
+ .gitignore
86
+ measure_candidate_stages.py
87
+ run_valid_bug_cases.py
88
+ paper/*
89
+ # Nested standalone Git repository.
90
+ /paper/og_paper/
91
+
92
+ # Fresh benchmark runs are reproducible and can be large. Retained reference
93
+ # outputs live inside each experiment's Data directory.
94
+ Experiment/Lewis/Runs/
95
+
96
+ # Generated FLOWER intermediates and long-run evidence. The portable
97
+ # full-reaction batch payload is intentionally retained in Git.
98
+ Experiment/Lewis/FLOWER/batches/
99
+ Experiment/Lewis/FLOWER/full_reactions/
100
+ Experiment/Lewis/FLOWER/replay-debug/
101
+ Experiment/Lewis/FLOWER/replay-runs/
102
+ Experiment/Lewis/FLOWER/replay-results*/
103
+ !Experiment/Lewis/FLOWER/full-reaction-batches/manifest.json
104
+ !Experiment/Lewis/FLOWER/full-reaction-replay-summary.json
105
+
106
+ # Keep generated Python bytecode ignored after directory re-inclusions above.
107
+ **/__pycache__/
108
+ *.py[cod]
synkit-1.6.1/PKG-INFO ADDED
@@ -0,0 +1,182 @@
1
+ Metadata-Version: 2.4
2
+ Name: synkit
3
+ Version: 1.6.1
4
+ Summary: Utility for reaction modeling using graph grammar
5
+ Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
6
+ Project-URL: source, https://github.com/TieuLongPhan/SynKit
7
+ Project-URL: issues, https://github.com/TieuLongPhan/SynKit/issues
8
+ Project-URL: documentation, https://tieulongphan.github.io/SynKit/
9
+ Author-email: Tieu Long Phan <tieu@bioinf.uni-leipzig.de>
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Requires-Python: >=3.11
16
+ Requires-Dist: networkx>=3.3
17
+ Requires-Dist: pandas>=1.5.3
18
+ Requires-Dist: rdkit>=2025.3.1
19
+ Requires-Dist: regex>=2024.11.6
20
+ Requires-Dist: requests>=2.32.3
21
+ Requires-Dist: scikit-learn>=1.4.0
22
+ Requires-Dist: scipy>=1.14.0
23
+ Requires-Dist: seaborn>=0.13.2
24
+ Provides-Extra: all
25
+ Requires-Dist: numpy>=2.2.0; extra == 'all'
26
+ Requires-Dist: sympy>=1.13.1; extra == 'all'
27
+ Requires-Dist: torch>=2.2.0; extra == 'all'
28
+ Provides-Extra: docs
29
+ Requires-Dist: graphviz; extra == 'docs'
30
+ Requires-Dist: myst-parser; extra == 'docs'
31
+ Requires-Dist: pydata-sphinx-theme; extra == 'docs'
32
+ Requires-Dist: sphinx-copybutton; extra == 'docs'
33
+ Requires-Dist: sphinx-design; extra == 'docs'
34
+ Requires-Dist: sphinx-rtd-theme; extra == 'docs'
35
+ Requires-Dist: sphinx-togglebutton; extra == 'docs'
36
+ Requires-Dist: sphinx>=6.0; extra == 'docs'
37
+ Requires-Dist: sphinxcontrib-bibtex; extra == 'docs'
38
+ Description-Content-Type: text/markdown
39
+
40
+ # SynKit
41
+
42
+ [![PyPI version](https://img.shields.io/pypi/v/synkit.svg)](https://pypi.org/project/synkit/)
43
+ [![Conda version](https://img.shields.io/conda/vn/tieulongphan/synkit.svg)](https://anaconda.org/tieulongphan/synkit)
44
+ [![Docker Pulls](https://img.shields.io/docker/pulls/tieulongphan/synkit.svg)](https://hub.docker.com/r/tieulongphan/synkit)
45
+ [![Docker Image Version](https://img.shields.io/docker/v/tieulongphan/synkit/latest?label=container)](https://hub.docker.com/r/tieulongphan/synkit)
46
+ [![License](https://img.shields.io/github/license/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
47
+ [![Release](https://img.shields.io/github/v/release/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/releases)
48
+ [![Last Commit](https://img.shields.io/github/last-commit/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/commits)
49
+ [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.15269901.svg)](https://doi.org/10.5281/zenodo.15269901)
50
+ [![CI](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml/badge.svg?branch=main)](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
51
+ [![Stars](https://img.shields.io/github/stars/tieulongphan/synkit.svg?style=social&label=Star)](https://github.com/tieulongphan/synkit/stargazers)
52
+
53
+ **Graph-native reaction informatics and executable electron-flow models**
54
+
55
+ SynKit is a Python toolkit for atom-mapped reactions, chemical graph
56
+ transformations, Lewis-labelled graphs, and explicitly supplied reaction
57
+ mechanisms. It connects reaction representation, rule extraction, graph
58
+ rewriting, stereochemistry, and mechanism verification through a common
59
+ attributed-graph model.
60
+
61
+ SynKit verifies mechanisms supplied by the user; it does not claim to predict
62
+ the kinetically or thermodynamically preferred mechanism.
63
+
64
+ ![SynKit graphical abstract](https://raw.githubusercontent.com/TieuLongPhan/SynKit/main/Data/Figure/synkit_graphical_abstract.svg)
65
+
66
+ ## Highlights
67
+
68
+ - Convert mapped reaction SMILES into ITS and reaction-centre graphs.
69
+ - Extract and apply attributed graph-transformation rules.
70
+ - Represent lone pairs, radicals, and separate sigma and pi occupancies with
71
+ Lewis-labelled graphs.
72
+ - Execute curved-arrow and atomically coupled fishhook events.
73
+ - Preserve tetrahedral, axial, and extended stereochemical information.
74
+ - Build and analyse mechanism trajectory graphs and chemical reaction
75
+ networks.
76
+
77
+ ## Installation
78
+
79
+ SynKit requires Python 3.11 or later.
80
+
81
+ ```bash
82
+ python -m pip install synkit
83
+ ```
84
+
85
+ Install the optional dependencies with:
86
+
87
+ ```bash
88
+ python -m pip install "synkit[all]"
89
+ ```
90
+
91
+ Alternatively, use the published container:
92
+
93
+ ```bash
94
+ docker pull tieulongphan/synkit:latest
95
+ docker run --rm tieulongphan/synkit:latest \
96
+ python -c "import synkit; print(synkit.__version__)"
97
+ ```
98
+
99
+ ## Quick start
100
+
101
+ This self-contained example converts an atom-mapped substitution into an
102
+ imaginary transition-state graph and reports its changed bonds:
103
+
104
+ ```python
105
+ from synkit.IO import rsmi_to_its
106
+
107
+ reaction = "[CH3:1][Br:2].[OH-:3]>>[CH3:1][OH:3].[Br-:2]"
108
+ its = rsmi_to_its(reaction, core=False, format="tuple")
109
+
110
+ changed_bonds = [
111
+ (source, target, data["order"])
112
+ for source, target, data in its.edges(data=True)
113
+ if data["order"][0] != data["order"][1]
114
+ ]
115
+ print(changed_bonds)
116
+ ```
117
+
118
+ The output records the broken C-Br bond as `(1.0, 0.0)` and the formed C-O
119
+ bond as `(0.0, 1.0)`. Continue with the
120
+ [graph](https://tieulongphan.github.io/SynKit/graph.html),
121
+ [rule](https://tieulongphan.github.io/SynKit/rule.html), and
122
+ [synthesis](https://tieulongphan.github.io/SynKit/synthesis.html) guides.
123
+
124
+ ## Supplied-mechanism verification
125
+
126
+ SynKit can parse typed electron-flow annotations, replay their elementary
127
+ steps, and return a verification certificate and mechanism trajectory graph.
128
+ Canonical electron loci distinguish lone pairs, sigma bonds, pi bonds, and
129
+ radical electrons. Curved arrows carry two electrons; fishhooks carry one;
130
+ coupled radical events commit atomically from a common pre-state.
131
+
132
+ See the
133
+ [mechanism documentation](https://tieulongphan.github.io/SynKit/mechanism.html)
134
+ for the supported interchange formats, verification policies, and complete
135
+ examples.
136
+
137
+ ## Documentation
138
+
139
+ - [Documentation](https://tieulongphan.github.io/SynKit/)
140
+ - [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
141
+ - [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
142
+ - [Changelog](doc/changelog.rst)
143
+
144
+ ## Publications
145
+
146
+ - [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
147
+ transfers](https://arxiv.org/abs/2607.26088), arXiv:2607.26088 (2026).
148
+ - [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
149
+ Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
150
+ of Chemical Information and Modeling* (2025).
151
+
152
+ ## Contributing
153
+
154
+ Contributions and bug reports are welcome. Create a branch from the current
155
+ mainline, make a focused change, and run the repository checks before opening
156
+ a pull request:
157
+
158
+ ```bash
159
+ git switch -c feature/short-description
160
+ bash scripts/lint.sh
161
+ bash scripts/pytest.sh
162
+ ```
163
+
164
+ Questions can be sent to
165
+ [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
166
+
167
+ ## Contributors
168
+
169
+ - [Tieu-Long Phan](https://tieulongphan.github.io/)
170
+ - [Klaus Weinbauer](https://github.com/klausweinbauer)
171
+ - [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
172
+ - [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
173
+
174
+ ## License
175
+
176
+ SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
177
+
178
+ ## Acknowledgments
179
+
180
+ This project received funding from the European Union's Horizon Europe
181
+ Doctoral Network programme under Marie Skłodowska-Curie grant agreement No.
182
+ 101072930 ([TACsy](https://tacsy.eu/)).
synkit-1.6.1/README.md ADDED
@@ -0,0 +1,143 @@
1
+ # SynKit
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/synkit.svg)](https://pypi.org/project/synkit/)
4
+ [![Conda version](https://img.shields.io/conda/vn/tieulongphan/synkit.svg)](https://anaconda.org/tieulongphan/synkit)
5
+ [![Docker Pulls](https://img.shields.io/docker/pulls/tieulongphan/synkit.svg)](https://hub.docker.com/r/tieulongphan/synkit)
6
+ [![Docker Image Version](https://img.shields.io/docker/v/tieulongphan/synkit/latest?label=container)](https://hub.docker.com/r/tieulongphan/synkit)
7
+ [![License](https://img.shields.io/github/license/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
8
+ [![Release](https://img.shields.io/github/v/release/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/releases)
9
+ [![Last Commit](https://img.shields.io/github/last-commit/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/commits)
10
+ [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.15269901.svg)](https://doi.org/10.5281/zenodo.15269901)
11
+ [![CI](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml/badge.svg?branch=main)](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
12
+ [![Stars](https://img.shields.io/github/stars/tieulongphan/synkit.svg?style=social&label=Star)](https://github.com/tieulongphan/synkit/stargazers)
13
+
14
+ **Graph-native reaction informatics and executable electron-flow models**
15
+
16
+ SynKit is a Python toolkit for atom-mapped reactions, chemical graph
17
+ transformations, Lewis-labelled graphs, and explicitly supplied reaction
18
+ mechanisms. It connects reaction representation, rule extraction, graph
19
+ rewriting, stereochemistry, and mechanism verification through a common
20
+ attributed-graph model.
21
+
22
+ SynKit verifies mechanisms supplied by the user; it does not claim to predict
23
+ the kinetically or thermodynamically preferred mechanism.
24
+
25
+ ![SynKit graphical abstract](https://raw.githubusercontent.com/TieuLongPhan/SynKit/main/Data/Figure/synkit_graphical_abstract.svg)
26
+
27
+ ## Highlights
28
+
29
+ - Convert mapped reaction SMILES into ITS and reaction-centre graphs.
30
+ - Extract and apply attributed graph-transformation rules.
31
+ - Represent lone pairs, radicals, and separate sigma and pi occupancies with
32
+ Lewis-labelled graphs.
33
+ - Execute curved-arrow and atomically coupled fishhook events.
34
+ - Preserve tetrahedral, axial, and extended stereochemical information.
35
+ - Build and analyse mechanism trajectory graphs and chemical reaction
36
+ networks.
37
+
38
+ ## Installation
39
+
40
+ SynKit requires Python 3.11 or later.
41
+
42
+ ```bash
43
+ python -m pip install synkit
44
+ ```
45
+
46
+ Install the optional dependencies with:
47
+
48
+ ```bash
49
+ python -m pip install "synkit[all]"
50
+ ```
51
+
52
+ Alternatively, use the published container:
53
+
54
+ ```bash
55
+ docker pull tieulongphan/synkit:latest
56
+ docker run --rm tieulongphan/synkit:latest \
57
+ python -c "import synkit; print(synkit.__version__)"
58
+ ```
59
+
60
+ ## Quick start
61
+
62
+ This self-contained example converts an atom-mapped substitution into an
63
+ imaginary transition-state graph and reports its changed bonds:
64
+
65
+ ```python
66
+ from synkit.IO import rsmi_to_its
67
+
68
+ reaction = "[CH3:1][Br:2].[OH-:3]>>[CH3:1][OH:3].[Br-:2]"
69
+ its = rsmi_to_its(reaction, core=False, format="tuple")
70
+
71
+ changed_bonds = [
72
+ (source, target, data["order"])
73
+ for source, target, data in its.edges(data=True)
74
+ if data["order"][0] != data["order"][1]
75
+ ]
76
+ print(changed_bonds)
77
+ ```
78
+
79
+ The output records the broken C-Br bond as `(1.0, 0.0)` and the formed C-O
80
+ bond as `(0.0, 1.0)`. Continue with the
81
+ [graph](https://tieulongphan.github.io/SynKit/graph.html),
82
+ [rule](https://tieulongphan.github.io/SynKit/rule.html), and
83
+ [synthesis](https://tieulongphan.github.io/SynKit/synthesis.html) guides.
84
+
85
+ ## Supplied-mechanism verification
86
+
87
+ SynKit can parse typed electron-flow annotations, replay their elementary
88
+ steps, and return a verification certificate and mechanism trajectory graph.
89
+ Canonical electron loci distinguish lone pairs, sigma bonds, pi bonds, and
90
+ radical electrons. Curved arrows carry two electrons; fishhooks carry one;
91
+ coupled radical events commit atomically from a common pre-state.
92
+
93
+ See the
94
+ [mechanism documentation](https://tieulongphan.github.io/SynKit/mechanism.html)
95
+ for the supported interchange formats, verification policies, and complete
96
+ examples.
97
+
98
+ ## Documentation
99
+
100
+ - [Documentation](https://tieulongphan.github.io/SynKit/)
101
+ - [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
102
+ - [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
103
+ - [Changelog](doc/changelog.rst)
104
+
105
+ ## Publications
106
+
107
+ - [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
108
+ transfers](https://arxiv.org/abs/2607.26088), arXiv:2607.26088 (2026).
109
+ - [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
110
+ Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
111
+ of Chemical Information and Modeling* (2025).
112
+
113
+ ## Contributing
114
+
115
+ Contributions and bug reports are welcome. Create a branch from the current
116
+ mainline, make a focused change, and run the repository checks before opening
117
+ a pull request:
118
+
119
+ ```bash
120
+ git switch -c feature/short-description
121
+ bash scripts/lint.sh
122
+ bash scripts/pytest.sh
123
+ ```
124
+
125
+ Questions can be sent to
126
+ [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
127
+
128
+ ## Contributors
129
+
130
+ - [Tieu-Long Phan](https://tieulongphan.github.io/)
131
+ - [Klaus Weinbauer](https://github.com/klausweinbauer)
132
+ - [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
133
+ - [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
134
+
135
+ ## License
136
+
137
+ SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
138
+
139
+ ## Acknowledgments
140
+
141
+ This project received funding from the European Union's Horizon Europe
142
+ Doctoral Network programme under Marie Skłodowska-Curie grant agreement No.
143
+ 101072930 ([TACsy](https://tacsy.eu/)).
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synkit"
7
- version = "1.6.0"
7
+ version = "1.6.1"
8
8
  description = "Utility for reaction modeling using graph grammar"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  license = { text = "MIT" }
12
- license-files = ["LICENSE", "LICENSES/*"]
12
+ license-files = ["LICENSE", "synkit/Graph/Stereo/LICENSES/*"]
13
13
  authors = [
14
14
  { name = "Tieu Long Phan", email = "tieu@bioinf.uni-leipzig.de" }
15
15
  ]
@@ -67,12 +67,10 @@ packages = ["synkit"]
67
67
  [tool.hatch.build.targets.wheel.force-include]
68
68
  "synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
69
69
  "synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
70
- "Data/Mech" = "synkit/Data/Mech"
71
70
 
72
71
  [tool.hatch.build.targets.sdist]
73
72
  include = [
74
73
  "/synkit",
75
- "/Data/Mech",
76
74
  "/LICENSE",
77
75
  "/LICENSES",
78
76
  "/README.md",
@@ -82,4 +80,3 @@ include = [
82
80
  [tool.hatch.build.targets.sdist.force-include]
83
81
  "synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
84
82
  "synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
85
- "Data/Mech" = "Data/Mech"
@@ -7,6 +7,13 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple
7
7
 
8
8
  import networkx as nx
9
9
 
10
+ from synkit.Graph.Canon.exact import (
11
+ CanonicalSearchIncomplete,
12
+ ExactCanonicalResult,
13
+ ExactColoredGraphCanonicalizer,
14
+ IncompleteCanonicalResult,
15
+ )
16
+
10
17
  from ._common import (
11
18
  AutomorphismResult,
12
19
  CanonicalResult,
@@ -723,6 +730,91 @@ class IRCanonicalEngine:
723
730
  Exact-search internal result.
724
731
  :rtype: IRInternalResult
725
732
  """
733
+ if max_count is not None or timeout_sec is not None or stop_after_two:
734
+ return self._run_bounded_compatibility(
735
+ max_count=max_count,
736
+ timeout_sec=timeout_sec,
737
+ stop_after_two=stop_after_two,
738
+ )
739
+ cached = self._reuse_cached_run(
740
+ max_count=max_count,
741
+ timeout_sec=timeout_sec,
742
+ stop_after_two=stop_after_two,
743
+ )
744
+ if cached is not None:
745
+ return cached
746
+
747
+ native = ExactColoredGraphCanonicalizer(
748
+ self.G,
749
+ node_color=lambda attrs: node_token(attrs, self.config),
750
+ edge_color=lambda attrs: edge_token(attrs, self.config),
751
+ ).search(timeout_seconds=timeout_sec)
752
+ if isinstance(native, IncompleteCanonicalResult):
753
+ raise CanonicalSearchIncomplete(
754
+ "CRN canonicalization did not complete: " f"{native.reason}."
755
+ )
756
+ if not isinstance(native, ExactCanonicalResult):
757
+ raise RuntimeError("Native exact canonicalizer returned no result.")
758
+
759
+ full_mappings = [witness.as_dict() for witness in native.automorphisms]
760
+ cap = 2 if stop_after_two else max_count
761
+ stopped = cap is not None and len(full_mappings) > cap
762
+ sample_mappings = full_mappings if cap is None else full_mappings[:cap]
763
+ best_order = list(native.canonical_order)
764
+ sample_perms = [
765
+ [mapping[node] for node in best_order] for mapping in sample_mappings
766
+ ]
767
+ orbits = orbits_from_mappings(
768
+ best_order,
769
+ (
770
+ sample_mappings
771
+ if sample_mappings
772
+ else [{node: node for node in best_order}]
773
+ ),
774
+ )
775
+ result = IRInternalResult(
776
+ canonical_order=best_order,
777
+ canonical_key=graph_key_from_order(
778
+ self.G,
779
+ best_order,
780
+ self.config,
781
+ ),
782
+ automorphism_count=len(sample_mappings),
783
+ sample_permutations=sample_perms,
784
+ sample_mappings=sample_mappings,
785
+ orbits=orbits,
786
+ elapsed_seconds=native.statistics.elapsed_seconds,
787
+ stopped_early=stopped,
788
+ )
789
+ if timeout_sec is None:
790
+ full_result = IRInternalResult(
791
+ canonical_order=best_order,
792
+ canonical_key=result.canonical_key,
793
+ automorphism_count=len(full_mappings),
794
+ sample_permutations=[
795
+ [mapping[node] for node in best_order] for mapping in full_mappings
796
+ ],
797
+ sample_mappings=full_mappings,
798
+ orbits=[set(cell) for cell in native.orbits],
799
+ elapsed_seconds=native.statistics.elapsed_seconds,
800
+ stopped_early=False,
801
+ )
802
+ self._exact_full_cache = full_result
803
+ return result
804
+
805
+ def _run_bounded_compatibility(
806
+ self,
807
+ *,
808
+ max_count: Optional[int],
809
+ timeout_sec: Optional[float],
810
+ stop_after_two: bool,
811
+ ) -> IRInternalResult:
812
+ """Run the historical bounded diagnostic IR traversal.
813
+
814
+ This path preserves CRN automorphism-count and timeout diagnostics.
815
+ ``stopped_early`` is authoritative: callers may inspect the partial
816
+ evidence, but :meth:`canonical_result` refuses to promote it.
817
+ """
726
818
  cached = self._reuse_cached_run(
727
819
  max_count=max_count,
728
820
  timeout_sec=timeout_sec,
@@ -742,7 +834,12 @@ class IRCanonicalEngine:
742
834
  nonlocal best_key, best_order, sample_perms, count, stopped
743
835
  if stopped:
744
836
  return
745
- if should_stop(start, timeout_sec, count=count, max_count=max_count):
837
+ if should_stop(
838
+ start,
839
+ timeout_sec,
840
+ count=count,
841
+ max_count=max_count,
842
+ ):
746
843
  stopped = True
747
844
  return
748
845
 
@@ -770,18 +867,25 @@ class IRCanonicalEngine:
770
867
 
771
868
  target = self._target_cell(refined)
772
869
  ordered_candidates = sorted(
773
- target, key=lambda v: self._candidate_order_key(v, refined)
870
+ target,
871
+ key=lambda value: self._candidate_order_key(
872
+ value,
873
+ refined,
874
+ ),
774
875
  )
775
- for v in ordered_candidates:
776
- child = self._build_child_partition(refined, target, v)
876
+ for value in ordered_candidates:
877
+ child = self._build_child_partition(
878
+ refined,
879
+ target,
880
+ value,
881
+ )
777
882
  dfs(child)
778
883
  if stopped:
779
884
  return
780
885
 
781
886
  dfs(init)
782
887
  assert best_key is not None and best_order is not None
783
-
784
- result = self._assemble_result(
888
+ return self._assemble_result(
785
889
  start=start,
786
890
  best_key=best_key,
787
891
  best_order=best_order,
@@ -789,9 +893,6 @@ class IRCanonicalEngine:
789
893
  count=count,
790
894
  stopped=stopped,
791
895
  )
792
- if timeout_sec is None and not result.stopped_early and not stop_after_two:
793
- self._exact_full_cache = result
794
- return result
795
896
 
796
897
  def canonical_result(
797
898
  self, *, timeout_sec: Optional[float] = None
@@ -808,6 +909,10 @@ class IRCanonicalEngine:
808
909
  :rtype: CanonicalResult
809
910
  """
810
911
  res = self.run(timeout_sec=timeout_sec)
912
+ if res.stopped_early:
913
+ raise CanonicalSearchIncomplete(
914
+ "CRN canonical identity requires a complete search."
915
+ )
811
916
  return CanonicalResult(
812
917
  canonical_order=res.canonical_order,
813
918
  canonical_key=res.canonical_key,