synkit 2.0.0b1__tar.gz → 2.0.0b2__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 (357) hide show
  1. {synkit-2.0.0b1 → synkit-2.0.0b2}/PKG-INFO +2 -2
  2. {synkit-2.0.0b1 → synkit-2.0.0b2}/README.md +1 -1
  3. {synkit-2.0.0b1 → synkit-2.0.0b2}/pyproject.toml +1 -1
  4. synkit-2.0.0b2/synkit/Graph/Fusion/__init__.py +71 -0
  5. synkit-2.0.0b2/synkit/Graph/Fusion/candidate.py +175 -0
  6. synkit-2.0.0b2/synkit/Graph/Fusion/constructor.py +461 -0
  7. synkit-2.0.0b2/synkit/Graph/Fusion/identity.py +183 -0
  8. synkit-2.0.0b2/synkit/Graph/Fusion/interface.py +598 -0
  9. synkit-2.0.0b2/synkit/Graph/Fusion/search.py +237 -0
  10. synkit-2.0.0b2/synkit/Graph/Morphism/__init__.py +55 -0
  11. synkit-2.0.0b2/synkit/Graph/Morphism/constraints.py +451 -0
  12. synkit-2.0.0b2/synkit/Graph/Morphism/morphism.py +349 -0
  13. synkit-2.0.0b2/synkit/Graph/Morphism/stereo.py +254 -0
  14. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/fusion_validation.py +53 -21
  15. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rbl_engine.py +180 -6
  16. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rbl_policy.py +4 -0
  17. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/version.py +1 -1
  18. {synkit-2.0.0b1 → synkit-2.0.0b2}/.gitignore +0 -0
  19. {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/README.md +0 -0
  20. {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/polar.json +0 -0
  21. {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/radical.json +0 -0
  22. {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/stereo.json +0 -0
  23. {synkit-2.0.0b1 → synkit-2.0.0b2}/LICENSE +0 -0
  24. {synkit-2.0.0b1 → synkit-2.0.0b2}/LICENSES/StereoMolGraph-MIT.txt +0 -0
  25. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/DAG/__init__.py +0 -0
  26. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
  27. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/__init__.py +0 -0
  28. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/abstract.py +0 -0
  29. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/arity.py +0 -0
  30. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/builder.py +0 -0
  31. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/derivation.py +0 -0
  32. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/flattener.py +0 -0
  33. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/keys.py +0 -0
  34. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/mixtures.py +0 -0
  35. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/smiles.py +0 -0
  36. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/state.py +0 -0
  37. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/strategy.py +0 -0
  38. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/worker.py +0 -0
  39. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/__init__.py +0 -0
  40. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/_adapter.py +0 -0
  41. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/pathfinder.py +0 -0
  42. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/reachability.py +0 -0
  43. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/realizability.py +0 -0
  44. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/__init__.py +0 -0
  45. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/analyzer.py +0 -0
  46. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/net.py +0 -0
  47. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/persistence.py +0 -0
  48. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/semiflows.py +0 -0
  49. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/structure.py +0 -0
  50. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/__init__.py +0 -0
  51. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/dynamics.py +0 -0
  52. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/helper.py +0 -0
  53. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/stoich.py +0 -0
  54. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/thermo.py +0 -0
  55. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/__init__.py +0 -0
  56. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_api.py +0 -0
  57. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_extract.py +0 -0
  58. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_impute.py +0 -0
  59. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_parse.py +0 -0
  60. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/__init__.py +0 -0
  61. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/reaction.py +0 -0
  62. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/rule.py +0 -0
  63. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/species.py +0 -0
  64. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/syncrn.py +0 -0
  65. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/__init__.py +0 -0
  66. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/_common.py +0 -0
  67. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/_ir.py +0 -0
  68. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/automorphism.py +0 -0
  69. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/canon.py +0 -0
  70. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/isomorphism.py +0 -0
  71. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/symmetry.py +0 -0
  72. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/wl_canon.py +0 -0
  73. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/__init__.py +0 -0
  74. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/crn_vis.py +0 -0
  75. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/labels.py +0 -0
  76. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/layout.py +0 -0
  77. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/palette.py +0 -0
  78. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/validation.py +0 -0
  79. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/vis.py +0 -0
  80. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/__init__.py +0 -0
  81. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
  82. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
  83. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
  84. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
  85. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
  86. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
  87. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
  88. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
  89. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
  90. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
  91. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/__init__.py +0 -0
  92. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
  93. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/loader.py +0 -0
  94. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/models.py +0 -0
  95. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/constants.py +0 -0
  96. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/crn_formula.py +0 -0
  97. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/deficiency.py +0 -0
  98. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/enumerator.py +0 -0
  99. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/exceptions.py +0 -0
  100. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/explorer.py +0 -0
  101. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/helpers.py +0 -0
  102. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/injectivity.py +0 -0
  103. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/motif.py +0 -0
  104. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/network.py +0 -0
  105. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/pathway.py +0 -0
  106. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/properties.py +0 -0
  107. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/reaction.py +0 -0
  108. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/utils.py +0 -0
  109. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/viz.py +0 -0
  110. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Cluster/__init__.py +0 -0
  111. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Cluster/butina.py +0 -0
  112. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/__init__.py +0 -0
  113. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
  114. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
  115. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
  116. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/__init__.py +0 -0
  117. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/atom_features.py +0 -0
  118. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/descriptors.py +0 -0
  119. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/formula.py +0 -0
  120. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/graph_annotator.py +0 -0
  121. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/standardize.py +0 -0
  122. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/valence.py +0 -0
  123. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
  124. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/aam_validator.py +0 -0
  125. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
  126. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
  127. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/its.py +0 -0
  128. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
  129. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
  130. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/branching.py +0 -0
  131. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/certificate.py +0 -0
  132. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +0 -0
  133. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +0 -0
  134. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/kernel.py +0 -0
  135. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/milp.py +0 -0
  136. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
  137. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -0
  138. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +0 -0
  139. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
  140. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/refine.py +0 -0
  141. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
  142. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
  143. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +0 -0
  144. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
  145. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/lap.py +0 -0
  146. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
  147. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/__init__.py +0 -0
  148. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/aam_validator.py +0 -0
  149. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/balance_check.py +0 -0
  150. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
  151. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/cleaning.py +0 -0
  152. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/deionize.py +0 -0
  153. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
  154. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/fix_aam.py +0 -0
  155. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/neutralize.py +0 -0
  156. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
  157. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/standardize.py +0 -0
  158. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/tautomerize.py +0 -0
  159. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/__init__.py +0 -0
  160. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/utils.py +0 -0
  161. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/__init__.py +0 -0
  162. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/aldol.json.gz +0 -0
  163. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/gen_partial_aam.py +0 -0
  164. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/paracetamol.json.gz +0 -0
  165. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/__init__.py +0 -0
  166. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/canon_algs.py +0 -0
  167. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/canon_graph.py +0 -0
  168. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/nauty.py +0 -0
  169. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/__init__.py +0 -0
  170. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/hier_context.py +0 -0
  171. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/radius_expand.py +0 -0
  172. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/__init__.py +0 -0
  173. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/api.py +0 -0
  174. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/audit.py +0 -0
  175. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/catalog.py +0 -0
  176. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/detector.py +0 -0
  177. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/model.py +0 -0
  178. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/ring_system.py +0 -0
  179. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
  180. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
  181. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
  182. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/__init__.py +0 -0
  183. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_descriptors.py +0 -0
  184. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_fps.py +0 -0
  185. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_signature.py +0 -0
  186. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/hash_fps.py +0 -0
  187. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/morgan_fps.py +0 -0
  188. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/path_fps.py +0 -0
  189. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/wl_hash.py +0 -0
  190. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/__init__.py +0 -0
  191. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/_misc.py +0 -0
  192. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
  193. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/hextend.py +0 -0
  194. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/__init__.py +0 -0
  195. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_builder.py +0 -0
  196. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_construction.py +0 -0
  197. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_decompose.py +0 -0
  198. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_destruction.py +0 -0
  199. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_expand.py +0 -0
  200. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_relabel.py +0 -0
  201. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_reverter.py +0 -0
  202. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/normalize_aam.py +0 -0
  203. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/partial_its.py +0 -0
  204. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/rc_extractor.py +0 -0
  205. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/__init__.py +0 -0
  206. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mcs_matcher.py +0 -0
  207. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mtg.py +0 -0
  208. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mtg_explore.py +0 -0
  209. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/utils.py +0 -0
  210. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/__init__.py +0 -0
  211. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/approx_mcs.py +0 -0
  212. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/auto_est.py +0 -0
  213. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/automorphism.py +0 -0
  214. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/batch_cluster.py +0 -0
  215. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/dedup_matches.py +0 -0
  216. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_cluster.py +0 -0
  217. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_matcher.py +0 -0
  218. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_morphism.py +0 -0
  219. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
  220. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
  221. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/orbit.py +0 -0
  222. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/partial_matcher.py +0 -0
  223. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/sing.py +0 -0
  224. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
  225. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/turbo_iso.py +0 -0
  226. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/wl_sel.py +0 -0
  227. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/__init__.py +0 -0
  228. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/conversion.py +0 -0
  229. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/electron_accounting.py +0 -0
  230. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/lwg_editor.py +0 -0
  231. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/lwg_ops.py +0 -0
  232. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/__init__.py +0 -0
  233. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/changes.py +0 -0
  234. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/couplings.py +0 -0
  235. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/descriptors.py +0 -0
  236. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/identity.py +0 -0
  237. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/interchange.py +0 -0
  238. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/matching.py +0 -0
  239. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/outcomes.py +0 -0
  240. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/rdkit_adapter.py +0 -0
  241. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/__init__.py +0 -0
  242. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
  243. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/graph_wc.py +0 -0
  244. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/its_merge.py +0 -0
  245. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/radwc.py +0 -0
  246. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
  247. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/wildcard.py +0 -0
  248. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/__init__.py +0 -0
  249. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/canon_graph.py +0 -0
  250. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/syn_graph.py +0 -0
  251. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/utils.py +0 -0
  252. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/__init__.py +0 -0
  253. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/chem_converter.py +0 -0
  254. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/__init__.py +0 -0
  255. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
  256. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
  257. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
  258. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_expander.py +0 -0
  259. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
  260. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
  261. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/conversion.py +0 -0
  262. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/data_io.py +0 -0
  263. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/data_process.py +0 -0
  264. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/debug.py +0 -0
  265. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/gml_to_nx.py +0 -0
  266. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/graph_to_mol.py +0 -0
  267. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/mol_to_graph.py +0 -0
  268. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/nx_to_gml.py +0 -0
  269. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/smiles_to_id.py +0 -0
  270. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/__init__.py +0 -0
  271. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/adapters.py +0 -0
  272. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/audit.py +0 -0
  273. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/benchmark.py +0 -0
  274. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/compatibility.py +0 -0
  275. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/drawing.py +0 -0
  276. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/equivalence.py +0 -0
  277. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/evidence.py +0 -0
  278. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/interchange.py +0 -0
  279. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/model.py +0 -0
  280. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/radical_data.py +0 -0
  281. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/replay.py +0 -0
  282. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/schema.py +0 -0
  283. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/stereo_state.py +0 -0
  284. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/symbols.py +0 -0
  285. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Apply/__init__.py +0 -0
  286. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Apply/rule_matcher.py +0 -0
  287. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Compose/__init__.py +0 -0
  288. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Compose/_identity.py +0 -0
  289. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/__init__.py +0 -0
  290. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/implict_rule.py +0 -0
  291. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/longest_path.py +0 -0
  292. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/molecule_rule.py +0 -0
  293. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/prune_templates.py +0 -0
  294. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/rule_utils.py +0 -0
  295. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/strip_rule.py +0 -0
  296. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/__init__.py +0 -0
  297. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/stereo_identity.py +0 -0
  298. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/syn_rule.py +0 -0
  299. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/MSR/__init__.py +0 -0
  300. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/MSR/path_finder.py +0 -0
  301. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/__init__.py +0 -0
  302. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_base.py +0 -0
  303. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_plot.py +0 -0
  304. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_ranking.py +0 -0
  305. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/__init__.py +0 -0
  306. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
  307. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/benchmark.py +0 -0
  308. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
  309. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
  310. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/post_syn.py +0 -0
  311. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
  312. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/strategy.py +0 -0
  313. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/syn_reactor.py +0 -0
  314. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/__init__.py +0 -0
  315. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/reactor_utils.py +0 -0
  316. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Utils/__init__.py +0 -0
  317. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Utils/utils.py +0 -0
  318. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/__init__.py +0 -0
  319. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/crn/__init__.py +0 -0
  320. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/crn/visualizer.py +0 -0
  321. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/__init__.py +0 -0
  322. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/arrows.py +0 -0
  323. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/chem.py +0 -0
  324. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/constants.py +0 -0
  325. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/layout.py +0 -0
  326. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/mapping.py +0 -0
  327. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/models.py +0 -0
  328. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/render.py +0 -0
  329. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/utils.py +0 -0
  330. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/visualizer.py +0 -0
  331. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/graph_visualizer.py +0 -0
  332. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its/__init__.py +0 -0
  333. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its/drawer.py +0 -0
  334. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its_drawer.py +0 -0
  335. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/__init__.py +0 -0
  336. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/drawer.py +0 -0
  337. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/reaction.py +0 -0
  338. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule_drawer.py +0 -0
  339. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg/__init__.py +0 -0
  340. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg/drawer.py +0 -0
  341. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg_drawer.py +0 -0
  342. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/pdf_writer.py +0 -0
  343. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/__init__.py +0 -0
  344. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/rule.py +0 -0
  345. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/rxn.py +0 -0
  346. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction_drawer.py +0 -0
  347. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/__init__.py +0 -0
  348. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/chemical.py +0 -0
  349. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/embedding.py +0 -0
  350. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
  351. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
  352. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
  353. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/vis.py +0 -0
  354. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/visual_drawer.py +0 -0
  355. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/visual_model.py +0 -0
  356. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/__init__.py +0 -0
  357. {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/examples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synkit
3
- Version: 2.0.0b1
3
+ Version: 2.0.0b2
4
4
  Summary: Utility for reaction modeling using graph grammar
5
5
  Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
6
6
  Project-URL: source, https://github.com/TieuLongPhan/SynKit
@@ -87,7 +87,7 @@ non-tetrahedral or atrop orientation fails explicitly instead of disappearing.
87
87
  Coordinate inference, rigid-bond descriptor variants, enhanced stereo groups,
88
88
  face-selectivity prediction, and physical inference of configurational
89
89
  stability remain outside the current claims. The prerelease package version is
90
- `2.0.0b1`; its mechanism schema remains `2.0.0-draft1` while that schema is
90
+ `2.0.0b2`; its mechanism schema remains `2.0.0-draft1` while that schema is
91
91
  still under prerelease review.
92
92
 
93
93
  Stereo-bearing reaction rules keep three concerns separate:
@@ -47,7 +47,7 @@ non-tetrahedral or atrop orientation fails explicitly instead of disappearing.
47
47
  Coordinate inference, rigid-bond descriptor variants, enhanced stereo groups,
48
48
  face-selectivity prediction, and physical inference of configurational
49
49
  stability remain outside the current claims. The prerelease package version is
50
- `2.0.0b1`; its mechanism schema remains `2.0.0-draft1` while that schema is
50
+ `2.0.0b2`; its mechanism schema remains `2.0.0-draft1` while that schema is
51
51
  still under prerelease review.
52
52
 
53
53
  Stereo-bearing reaction rules keep three concerns separate:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synkit"
7
- version = "2.0.0b1"
7
+ version = "2.0.0b2"
8
8
  description = "Utility for reaction modeling using graph grammar"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,71 @@
1
+ """Verified pushout-style graph fusion and proof-bearing deterministic search."""
2
+
3
+ from .candidate import (
4
+ FUSION_PROOF_SCHEMA,
5
+ FusionCandidate,
6
+ FusionScore,
7
+ default_fusion_score,
8
+ fusion_candidate_from_construction,
9
+ fusion_candidates_exactly_equivalent,
10
+ )
11
+ from .constructor import (
12
+ EndpointCertificate,
13
+ FusionConstruction,
14
+ FusionConstructionError,
15
+ FusionConstructionIssue,
16
+ FusionConstructionIssueCode,
17
+ FusionProvenance,
18
+ construct_pushout,
19
+ )
20
+ from .identity import (
21
+ FUSION_EDGE_IDENTITY_KEYS,
22
+ FUSION_NODE_IDENTITY_KEYS,
23
+ FUSION_WL_ITERATIONS,
24
+ graph_identity_digest,
25
+ graphs_exactly_equivalent,
26
+ )
27
+ from .interface import (
28
+ DEFAULT_INTERFACE_EDGE_KEYS,
29
+ DEFAULT_INTERFACE_NODE_KEYS,
30
+ FusionInterface,
31
+ FusionInterfaceError,
32
+ FusionInterfaceIssue,
33
+ FusionInterfaceIssueCode,
34
+ )
35
+ from .search import (
36
+ FusionProposal,
37
+ FusionSearchCounts,
38
+ FusionSearchResult,
39
+ VerifiedFusionSearch,
40
+ )
41
+
42
+ __all__ = [
43
+ "DEFAULT_INTERFACE_EDGE_KEYS",
44
+ "DEFAULT_INTERFACE_NODE_KEYS",
45
+ "EndpointCertificate",
46
+ "FUSION_EDGE_IDENTITY_KEYS",
47
+ "FUSION_NODE_IDENTITY_KEYS",
48
+ "FUSION_WL_ITERATIONS",
49
+ "FUSION_PROOF_SCHEMA",
50
+ "FusionCandidate",
51
+ "FusionConstruction",
52
+ "FusionConstructionError",
53
+ "FusionConstructionIssue",
54
+ "FusionConstructionIssueCode",
55
+ "FusionInterface",
56
+ "FusionInterfaceError",
57
+ "FusionInterfaceIssue",
58
+ "FusionInterfaceIssueCode",
59
+ "FusionProposal",
60
+ "FusionProvenance",
61
+ "FusionScore",
62
+ "FusionSearchCounts",
63
+ "FusionSearchResult",
64
+ "VerifiedFusionSearch",
65
+ "construct_pushout",
66
+ "default_fusion_score",
67
+ "fusion_candidate_from_construction",
68
+ "fusion_candidates_exactly_equivalent",
69
+ "graph_identity_digest",
70
+ "graphs_exactly_equivalent",
71
+ ]
@@ -0,0 +1,175 @@
1
+ """Proof-bearing verified-fusion result values."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ from dataclasses import dataclass, field
8
+ from typing import Any, Mapping
9
+
10
+ import networkx as nx
11
+
12
+ from .constructor import EndpointCertificate, FusionConstruction, FusionProvenance
13
+ from .identity import graph_identity_digest, graphs_exactly_equivalent, stable_value
14
+ from .interface import FusionInterface
15
+
16
+
17
+ FUSION_PROOF_SCHEMA = "synkit.fusion-proof/1"
18
+
19
+
20
+ @dataclass(frozen=True, order=True)
21
+ class FusionScore:
22
+ """Interpretable structural penalties; lower values rank first."""
23
+
24
+ unresolved_wildcards: int
25
+ added_nodes: int
26
+ added_edges: int
27
+
28
+ def to_dict(self) -> dict[str, int]:
29
+ return {
30
+ "unresolved_wildcards": self.unresolved_wildcards,
31
+ "added_nodes": self.added_nodes,
32
+ "added_edges": self.added_edges,
33
+ }
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class FusionCandidate:
38
+ """A valid graph completion plus reproducible construction evidence."""
39
+
40
+ its: nx.Graph = field(compare=False, repr=False)
41
+ rsmi: str | None
42
+ interface: FusionInterface
43
+ wildcard_substitution: tuple[tuple[Any, tuple[Any, ...]], ...]
44
+ validation: tuple[Mapping[str, Any], ...]
45
+ endpoint_proof: EndpointCertificate
46
+ provenance: FusionProvenance
47
+ canonical_signature: str
48
+ proof_digest: str
49
+ score: FusionScore | None = None
50
+ proof_schema: str = FUSION_PROOF_SCHEMA
51
+
52
+ @property
53
+ def forward_morphism(self):
54
+ return self.interface.forward_morphism
55
+
56
+ @property
57
+ def backward_morphism(self):
58
+ return self.interface.backward_morphism
59
+
60
+ def to_dict(self) -> dict[str, Any]:
61
+ return {
62
+ "proof_schema": self.proof_schema,
63
+ "rsmi": self.rsmi,
64
+ "interface": self.interface.to_dict(),
65
+ "wildcard_substitution": [
66
+ {"interface_node": repr(node), "constraint": stable_value(value)}
67
+ for node, value in self.wildcard_substitution
68
+ ],
69
+ "validation": [stable_value(item) for item in self.validation],
70
+ "endpoint_proof": self.endpoint_proof.to_dict(),
71
+ "provenance": self.provenance.to_dict(),
72
+ "canonical_signature": self.canonical_signature,
73
+ "proof_digest": self.proof_digest,
74
+ "score": self.score.to_dict() if self.score is not None else None,
75
+ }
76
+
77
+
78
+ def _proof_digest(
79
+ construction: FusionConstruction,
80
+ graph_signature: str,
81
+ validation: tuple[Mapping[str, Any], ...],
82
+ ) -> str:
83
+ validation_digest = []
84
+ for item in validation:
85
+ evidence = item.get("evidence", {})
86
+ validation_digest.append(
87
+ {
88
+ "valid": item.get("valid"),
89
+ "issues": [
90
+ {
91
+ "code": issue.get("code"),
92
+ "stage": issue.get("stage"),
93
+ }
94
+ for issue in item.get("issues", ())
95
+ ],
96
+ "matcher": evidence.get("matcher"),
97
+ "stereo_policy": evidence.get("stereo_policy"),
98
+ "reactant_embeddings": len(evidence.get("reactant_embeddings", ())),
99
+ "product_embeddings": len(evidence.get("product_embeddings", ())),
100
+ }
101
+ )
102
+ payload = {
103
+ "schema": FUSION_PROOF_SCHEMA,
104
+ "interface": stable_value(construction.interface.canonical_signature()),
105
+ "graph": graph_signature,
106
+ "wildcards": stable_value(construction.provenance.wildcard_substitutions),
107
+ "endpoint": construction.endpoint_certificate.digest_payload(),
108
+ "validation": validation_digest,
109
+ }
110
+ encoded = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
111
+ return hashlib.sha256(encoded).hexdigest()
112
+
113
+
114
+ def default_fusion_score(construction: FusionConstruction) -> FusionScore:
115
+ """Rank valid constructions by transparent structural penalties only."""
116
+ graph = construction.graph
117
+ wildcard_count = sum(
118
+ attributes.get("element") in {"*", ("*", "*")}
119
+ for _, attributes in graph.nodes(data=True)
120
+ )
121
+ interface_nodes = len(construction.interface.interface_nodes)
122
+ interface_edges = len(construction.interface.edges)
123
+ return FusionScore(
124
+ wildcard_count,
125
+ graph.number_of_nodes() - interface_nodes,
126
+ graph.number_of_edges() - interface_edges,
127
+ )
128
+
129
+
130
+ def fusion_candidate_from_construction(
131
+ construction: FusionConstruction,
132
+ *,
133
+ rsmi: str | None = None,
134
+ validation: tuple[Mapping[str, Any], ...] = (),
135
+ score: FusionScore | None = None,
136
+ graph: nx.Graph | None = None,
137
+ ) -> FusionCandidate:
138
+ """Create an immutable proof-bearing candidate from a valid construction."""
139
+ candidate_graph = construction.graph if graph is None else graph
140
+ signature = graph_identity_digest(candidate_graph)
141
+ wildcard_substitution = construction.provenance.wildcard_substitutions
142
+ return FusionCandidate(
143
+ candidate_graph.copy(),
144
+ rsmi,
145
+ construction.interface,
146
+ wildcard_substitution,
147
+ tuple(dict(item) for item in validation),
148
+ construction.endpoint_certificate,
149
+ construction.provenance,
150
+ signature,
151
+ _proof_digest(construction, signature, validation),
152
+ score or default_fusion_score(construction),
153
+ )
154
+
155
+
156
+ def fusion_candidates_exactly_equivalent(
157
+ left: FusionCandidate,
158
+ right: FusionCandidate,
159
+ ) -> bool:
160
+ """Reject hash-only deduplication; prove graph and substitution equality."""
161
+ if left.canonical_signature != right.canonical_signature:
162
+ return False
163
+ if left.wildcard_substitution != right.wildcard_substitution:
164
+ return False
165
+ return graphs_exactly_equivalent(left.its, right.its)
166
+
167
+
168
+ __all__ = [
169
+ "FUSION_PROOF_SCHEMA",
170
+ "FusionCandidate",
171
+ "FusionScore",
172
+ "default_fusion_score",
173
+ "fusion_candidate_from_construction",
174
+ "fusion_candidates_exactly_equivalent",
175
+ ]