synkit 1.6.2__tar.gz → 1.6.3__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 (504) hide show
  1. {synkit-1.6.2 → synkit-1.6.3}/.gitignore +15 -3
  2. synkit-1.6.3/Experiment/CRN/LICENSES/BIOMODELS.txt +13 -0
  3. synkit-1.6.3/Experiment/CRN/LICENSES/KEGG.txt +15 -0
  4. synkit-1.6.3/PKG-INFO +122 -0
  5. synkit-1.6.3/README.md +73 -0
  6. {synkit-1.6.2 → synkit-1.6.3}/pyproject.toml +15 -8
  7. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/__init__.py +2 -3
  8. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/kegg.py +2 -3
  9. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/scaling.py +87 -28
  10. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/validate.py +2 -4
  11. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/IO/sbml.py +8 -2
  12. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/__init__.py +6 -0
  13. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/realizability.py +226 -23
  14. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/deficiency.py +1 -2
  15. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/helper.py +1 -1
  16. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_graph_io.py +5 -3
  17. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/__init__.py +6 -0
  18. synkit-1.6.3/synkit/Chem/Mapper/README.rst +281 -0
  19. synkit-1.6.3/synkit/Chem/Mapper/__init__.py +232 -0
  20. synkit-1.6.3/synkit/Chem/Mapper/_compat.py +77 -0
  21. synkit-1.6.3/synkit/Chem/Mapper/adapters/__init__.py +1 -0
  22. synkit-1.6.3/synkit/Chem/Mapper/adapters/prediction.py +126 -0
  23. synkit-1.6.3/synkit/Chem/Mapper/adapters/template.py +412 -0
  24. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/__init__.py +6 -0
  25. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/aam.py +239 -5
  26. synkit-1.6.3/synkit/Chem/Mapper/chem/blind.py +160 -0
  27. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/smiles.py +40 -0
  28. synkit-1.6.3/synkit/Chem/Mapper/exact/__init__.py +141 -0
  29. synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/__init__.py +1 -0
  30. synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_certificate.py +113 -0
  31. synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_domains.py +162 -0
  32. synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_verification.py +58 -0
  33. synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/incremental_assignment.py +247 -0
  34. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/exact/certificate.py +2 -2
  35. synkit-1.6.3/synkit/Chem/Mapper/exact/core.py +183 -0
  36. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/__init__.py +1 -0
  37. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/bounds.py +319 -0
  38. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search}/exhaustive.py +5 -27
  39. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/inputs.py +283 -0
  40. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/records.py +242 -0
  41. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/search.py +1025 -0
  42. synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/verify.py +378 -0
  43. synkit-1.6.3/synkit/Chem/Mapper/exact/edit_support.py +375 -0
  44. synkit-1.6.3/synkit/Chem/Mapper/exact/hybrid.py +224 -0
  45. synkit-1.6.3/synkit/Chem/Mapper/exact/hydrogen.py +264 -0
  46. synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers/__init__.py +1 -0
  47. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/branching.py +27 -41
  48. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/enumerate.py +5 -5
  49. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/kernel.py +31 -34
  50. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/milp.py +8 -1
  51. synkit-1.6.3/synkit/Chem/Mapper/exact/native/__init__.py +1 -0
  52. synkit-1.6.3/synkit/Chem/Mapper/exact/native/build.py +154 -0
  53. synkit-1.6.3/synkit/Chem/Mapper/exact/native/candidates.py +349 -0
  54. synkit-1.6.3/synkit/Chem/Mapper/exact/native/canonical.py +396 -0
  55. synkit-1.6.3/synkit/Chem/Mapper/exact/native/disk_frontier.py +415 -0
  56. synkit-1.6.3/synkit/Chem/Mapper/exact/native/frontier.py +390 -0
  57. synkit-1.6.3/synkit/Chem/Mapper/exact/native/its.py +528 -0
  58. synkit-1.6.3/synkit/Chem/Mapper/exact/native/native_distance.cpp +1021 -0
  59. synkit-1.6.3/synkit/Chem/Mapper/exact/native/orbit_aggregation.py +328 -0
  60. synkit-1.6.3/synkit/Chem/Mapper/exact/native/parallel.py +205 -0
  61. synkit-1.6.3/synkit/Chem/Mapper/exact/native/runtime.py +40 -0
  62. synkit-1.6.3/synkit/Chem/Mapper/exact/native/search.py +196 -0
  63. synkit-1.6.3/synkit/Chem/Mapper/exact/native_build.py +12 -0
  64. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/__init__.py +1 -0
  65. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/cost_lattice.py +43 -0
  66. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/factor_spectrum.py +110 -0
  67. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/multi_shell.py +368 -0
  68. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation.py +679 -0
  69. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_bounds.py +436 -0
  70. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_limits.py +13 -0
  71. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_search.py +856 -0
  72. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_symmetry.py +66 -0
  73. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/residual_typed_bonds.py +136 -0
  74. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/reward_frontier.py +201 -0
  75. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/separator_bound.py +258 -0
  76. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/separator_spectrum.py +308 -0
  77. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/sparse_reward_bound.py +207 -0
  78. synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/suffix_spectrum.py +299 -0
  79. synkit-1.6.3/synkit/Chem/Mapper/exact/search.py +55 -0
  80. synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/__init__.py +1 -0
  81. synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed.py +104 -0
  82. synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed_fragments.py +148 -0
  83. synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed_relaxation.py +181 -0
  84. synkit-1.6.3/synkit/Chem/Mapper/exact/symmetry.py +223 -0
  85. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/__init__.py +7 -1
  86. synkit-1.6.3/synkit/Chem/Mapper/graph/automorphism.py +395 -0
  87. synkit-1.6.3/synkit/Chem/Mapper/mapper.py +451 -0
  88. synkit-1.6.3/synkit/Chem/Mapper/reaction_search.py +499 -0
  89. synkit-1.6.3/synkit/Chem/Mapper/reporting/__init__.py +1 -0
  90. synkit-1.6.3/synkit/Chem/Mapper/reporting/alternatives.py +451 -0
  91. synkit-1.6.3/synkit/Chem/Mapper/reporting/analysis.py +681 -0
  92. synkit-1.6.3/synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
  93. synkit-1.6.3/synkit/Chem/Mapper/reporting/spectrum.py +642 -0
  94. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/__init__.py +8 -1
  95. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/lap.py +8 -5
  96. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/sequential.py +8 -3
  97. synkit-1.6.3/synkit/Chem/Mapper/validation/__init__.py +1 -0
  98. {synkit-1.6.2/synkit/Chem/Reaction/Mapper → synkit-1.6.3/synkit/Chem/Mapper/validation}/aam_validator.py +3 -5
  99. synkit-1.6.3/synkit/Chem/Mapper/validation/annotations.py +274 -0
  100. synkit-1.6.3/synkit/Chem/Mapper/validation/bonds.py +124 -0
  101. synkit-1.6.3/synkit/Chem/Mapper/validation/cohorts.py +72 -0
  102. synkit-1.6.3/synkit/Chem/Mapper/validation/identifiability.py +150 -0
  103. synkit-1.6.3/synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
  104. synkit-1.6.3/synkit/Chem/Mapper/validation/orbits.py +137 -0
  105. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_axis_evidence.py +5 -3
  106. synkit-1.6.3/synkit/Chem/Reaction/Mapper/__init__.py +41 -0
  107. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/aam_validator.py +1 -1
  108. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/exact.py +75 -12
  109. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/__init__.py +49 -0
  110. synkit-1.6.3/synkit/Graph/MTG/gluing.py +451 -0
  111. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/history.py +284 -17
  112. synkit-1.6.3/synkit/Graph/MTG/inventory.py +118 -0
  113. synkit-1.6.3/synkit/Graph/MTG/local.py +447 -0
  114. synkit-1.6.3/synkit/Graph/MTG/observation.py +209 -0
  115. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/process.py +17 -2
  116. synkit-1.6.3/synkit/Graph/MTG/queries.py +66 -0
  117. synkit-1.6.3/synkit/Graph/MTG/realization.py +95 -0
  118. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/__init__.py +4 -0
  119. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/llg.py +96 -15
  120. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/__init__.py +8 -0
  121. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/canonical.py +16 -3
  122. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/changes.py +41 -3
  123. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/configured.py +49 -84
  124. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/enumeration.py +7 -0
  125. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/extended_descriptors.py +4 -0
  126. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/orbits.py +5 -1
  127. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/pairwise.py +145 -19
  128. synkit-1.6.3/synkit/Graph/Stereo/rdkit_identity.py +118 -0
  129. synkit-1.6.3/synkit/Graph/Stereo/rdkit_resonance.py +140 -0
  130. synkit-1.6.3/synkit/Rule/Apply/conditions.py +45 -0
  131. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/dpo.py +192 -159
  132. synkit-1.6.3/synkit/Rule/Apply/validation.py +354 -0
  133. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/composition.py +142 -14
  134. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/laws.py +45 -3
  135. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/search.py +27 -4
  136. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/syn_rule.py +2 -2
  137. {synkit-1.6.2 → synkit-1.6.3}/synkit/version.py +1 -1
  138. synkit-1.6.2/PKG-INFO +0 -183
  139. synkit-1.6.2/README.md +0 -143
  140. synkit-1.6.2/synkit/Chem/Reaction/Mapper/__init__.py +0 -70
  141. synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -58
  142. synkit-1.6.2/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -110
  143. {synkit-1.6.2 → synkit-1.6.3}/LICENSE +0 -0
  144. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/crosschecks.py +0 -0
  145. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/data/kegg_modules.json +0 -0
  146. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/networks.py +0 -0
  147. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/__init__.py +0 -0
  148. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/abstract.py +0 -0
  149. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/arity.py +0 -0
  150. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/builder.py +0 -0
  151. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/derivation.py +0 -0
  152. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/flattener.py +0 -0
  153. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/keys.py +0 -0
  154. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/mixtures.py +0 -0
  155. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/smiles.py +0 -0
  156. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/state.py +0 -0
  157. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/strategy.py +0 -0
  158. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/worker.py +0 -0
  159. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/IO/__init__.py +0 -0
  160. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/_adapter.py +0 -0
  161. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/pathfinder.py +0 -0
  162. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/reachability.py +0 -0
  163. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/__init__.py +0 -0
  164. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/analyzer.py +0 -0
  165. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/minimal_semiflows.py +0 -0
  166. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/net.py +0 -0
  167. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/persistence.py +0 -0
  168. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/semiflows.py +0 -0
  169. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/siphon_search.py +0 -0
  170. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/structure.py +0 -0
  171. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/__init__.py +0 -0
  172. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/dynamics.py +0 -0
  173. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/stoich.py +0 -0
  174. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/thermo.py +0 -0
  175. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/__init__.py +0 -0
  176. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_api.py +0 -0
  177. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_extract.py +0 -0
  178. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_impute.py +0 -0
  179. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_parse.py +0 -0
  180. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/to_syncrn.py +0 -0
  181. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/__init__.py +0 -0
  182. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_matrices.py +0 -0
  183. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_parse.py +0 -0
  184. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/reaction.py +0 -0
  185. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/rule.py +0 -0
  186. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/species.py +0 -0
  187. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/syncrn.py +0 -0
  188. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/__init__.py +0 -0
  189. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/_common.py +0 -0
  190. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/_ir.py +0 -0
  191. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/automorphism.py +0 -0
  192. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/canon.py +0 -0
  193. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/isomorphism.py +0 -0
  194. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/symmetry.py +0 -0
  195. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/wl_canon.py +0 -0
  196. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/__init__.py +0 -0
  197. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/labels.py +0 -0
  198. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/layout.py +0 -0
  199. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/palette.py +0 -0
  200. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/validation.py +0 -0
  201. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/vis.py +0 -0
  202. {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/kinds.py +0 -0
  203. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Cluster/__init__.py +0 -0
  204. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Cluster/butina.py +0 -0
  205. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/__init__.py +0 -0
  206. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
  207. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
  208. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
  209. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/its.py +0 -0
  210. {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/enumeration_result.py +0 -0
  211. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/blockcut.py +0 -0
  212. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/labeled_graph.py +0 -0
  213. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/refine.py +0 -0
  214. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/synkit_adapter.py +0 -0
  215. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/io/__init__.py +0 -0
  216. {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/io/idxmapstr.py +0 -0
  217. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/__init__.py +0 -0
  218. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_chirality_loci.py +0 -0
  219. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_chirality_types.py +0 -0
  220. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_helical_loci.py +0 -0
  221. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_element_detection.py +0 -0
  222. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_orientation_constraints.py +0 -0
  223. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_tetrahedral_carriers.py +0 -0
  224. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/atom_features.py +0 -0
  225. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/chirality.py +0 -0
  226. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/cip_assignment.py +0 -0
  227. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/cip_ranking.py +0 -0
  228. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/coordinate_stereo.py +0 -0
  229. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/derived_stereo_naming.py +0 -0
  230. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/descriptors.py +0 -0
  231. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/formula.py +0 -0
  232. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/global_stereo.py +0 -0
  233. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/graph_annotator.py +0 -0
  234. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/standardize.py +0 -0
  235. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/stereo_evidence.py +0 -0
  236. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/stereo_perception.py +0 -0
  237. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/valence.py +0 -0
  238. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/__init__.py +0 -0
  239. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/balance_check.py +0 -0
  240. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
  241. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/cleaning.py +0 -0
  242. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/deionize.py +0 -0
  243. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
  244. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/fix_aam.py +0 -0
  245. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/neutralize.py +0 -0
  246. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
  247. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/standardize.py +0 -0
  248. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/tautomerize.py +0 -0
  249. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/__init__.py +0 -0
  250. {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/utils.py +0 -0
  251. {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/__init__.py +0 -0
  252. {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/aldol.json.gz +0 -0
  253. {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/gen_partial_aam.py +0 -0
  254. {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/paracetamol.json.gz +0 -0
  255. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/__init__.py +0 -0
  256. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/canon_algs.py +0 -0
  257. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/canon_graph.py +0 -0
  258. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/exact_refinement.py +0 -0
  259. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/nauty.py +0 -0
  260. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/__init__.py +0 -0
  261. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/hier_context.py +0 -0
  262. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/radius_expand.py +0 -0
  263. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/__init__.py +0 -0
  264. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/api.py +0 -0
  265. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/audit.py +0 -0
  266. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/catalog.py +0 -0
  267. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/detector.py +0 -0
  268. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/model.py +0 -0
  269. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/recognizers.py +0 -0
  270. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/ring_system.py +0 -0
  271. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
  272. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
  273. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
  274. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/__init__.py +0 -0
  275. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_descriptors.py +0 -0
  276. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_fps.py +0 -0
  277. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_signature.py +0 -0
  278. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/hash_fps.py +0 -0
  279. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/morgan_fps.py +0 -0
  280. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/path_fps.py +0 -0
  281. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/wl_hash.py +0 -0
  282. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/__init__.py +0 -0
  283. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/candidate.py +0 -0
  284. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/constructor.py +0 -0
  285. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/identity.py +0 -0
  286. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/interface.py +0 -0
  287. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/search.py +0 -0
  288. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/__init__.py +0 -0
  289. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/_misc.py +0 -0
  290. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
  291. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcomplete_legacy.py +0 -0
  292. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcompletion_algorithms.py +0 -0
  293. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hextend.py +0 -0
  294. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hextend_legacy.py +0 -0
  295. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/__init__.py +0 -0
  296. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_builder.py +0 -0
  297. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_construction.py +0 -0
  298. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_decompose.py +0 -0
  299. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_destruction.py +0 -0
  300. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_expand.py +0 -0
  301. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_relabel.py +0 -0
  302. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_reverter.py +0 -0
  303. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/normalize_aam.py +0 -0
  304. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/partial_its.py +0 -0
  305. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/rc_extractor.py +0 -0
  306. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/stereo.py +0 -0
  307. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mcs_matcher.py +0 -0
  308. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mtg.py +0 -0
  309. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mtg_explore.py +0 -0
  310. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/series_parallel.py +0 -0
  311. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/utils.py +0 -0
  312. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/__init__.py +0 -0
  313. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/approx_mcs.py +0 -0
  314. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/auto_est.py +0 -0
  315. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/automorphism.py +0 -0
  316. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/batch_cluster.py +0 -0
  317. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/dedup_matches.py +0 -0
  318. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_cluster.py +0 -0
  319. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_matcher.py +0 -0
  320. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_morphism.py +0 -0
  321. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
  322. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
  323. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/orbit.py +0 -0
  324. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/partial_matcher.py +0 -0
  325. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/sing.py +0 -0
  326. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
  327. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/turbo_iso.py +0 -0
  328. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/wl_sel.py +0 -0
  329. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/__init__.py +0 -0
  330. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/conversion.py +0 -0
  331. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/conversion_debug.py +0 -0
  332. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/electron_accounting.py +0 -0
  333. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/lwg_editor.py +0 -0
  334. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/lwg_ops.py +0 -0
  335. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/constraints.py +0 -0
  336. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/morphism.py +0 -0
  337. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo.py +0 -0
  338. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
  339. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
  340. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
  341. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/_descriptor_core.py +0 -0
  342. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/_descriptor_serialization.py +0 -0
  343. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/composition.py +0 -0
  344. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/couplings.py +0 -0
  345. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/descriptors.py +0 -0
  346. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/global_configured.py +0 -0
  347. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/global_stereo.py +0 -0
  348. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/identity.py +0 -0
  349. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/interchange.py +0 -0
  350. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/legacy.py +0 -0
  351. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/matching.py +0 -0
  352. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/outcomes.py +0 -0
  353. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/rdkit_adapter.py +0 -0
  354. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/reaction_interchange.py +0 -0
  355. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/semantics.py +0 -0
  356. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/supports.py +0 -0
  357. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/wire.py +0 -0
  358. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/__init__.py +0 -0
  359. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
  360. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/graph_wc.py +0 -0
  361. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/its_merge.py +0 -0
  362. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/radwc.py +0 -0
  363. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
  364. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/wildcard.py +0 -0
  365. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/__init__.py +0 -0
  366. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/canon_graph.py +0 -0
  367. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/syn_graph.py +0 -0
  368. {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/utils.py +0 -0
  369. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/__init__.py +0 -0
  370. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/chem_converter.py +0 -0
  371. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/__init__.py +0 -0
  372. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
  373. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
  374. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
  375. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_expander.py +0 -0
  376. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
  377. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
  378. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/conversion.py +0 -0
  379. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/data_io.py +0 -0
  380. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/data_process.py +0 -0
  381. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/debug.py +0 -0
  382. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/gml_to_nx.py +0 -0
  383. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/graph_to_mol.py +0 -0
  384. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/mol_to_graph.py +0 -0
  385. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/mol_to_graph_chemistry.py +0 -0
  386. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/nx_to_gml.py +0 -0
  387. {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/smiles_to_id.py +0 -0
  388. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/__init__.py +0 -0
  389. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/adapters.py +0 -0
  390. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/audit.py +0 -0
  391. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/benchmark.py +0 -0
  392. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/compatibility.py +0 -0
  393. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/drawing.py +0 -0
  394. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/electron_models.py +0 -0
  395. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/equivalence.py +0 -0
  396. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/evidence.py +0 -0
  397. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/interchange.py +0 -0
  398. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/model.py +0 -0
  399. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/neighbor_stereo.py +0 -0
  400. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/radical_data.py +0 -0
  401. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/replay.py +0 -0
  402. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/schema.py +0 -0
  403. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/stereo_state.py +0 -0
  404. {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/symbols.py +0 -0
  405. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/__init__.py +0 -0
  406. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/rule_matcher.py +0 -0
  407. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/__init__.py +0 -0
  408. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/_identity.py +0 -0
  409. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/synrule.py +0 -0
  410. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/__init__.py +0 -0
  411. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/implict_rule.py +0 -0
  412. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/longest_path.py +0 -0
  413. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/molecule_rule.py +0 -0
  414. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/prune_templates.py +0 -0
  415. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/rule_utils.py +0 -0
  416. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/strip_rule.py +0 -0
  417. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/__init__.py +0 -0
  418. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/generic_stereo.py +0 -0
  419. {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/stereo_identity.py +0 -0
  420. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/MSR/__init__.py +0 -0
  421. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/MSR/path_finder.py +0 -0
  422. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/__init__.py +0 -0
  423. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_base.py +0 -0
  424. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_plot.py +0 -0
  425. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_ranking.py +0 -0
  426. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/__init__.py +0 -0
  427. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/engine.py +0 -0
  428. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/matching.py +0 -0
  429. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/overlap.py +0 -0
  430. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/pipeline.py +0 -0
  431. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/policy.py +0 -0
  432. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/proof.py +0 -0
  433. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/reaction.py +0 -0
  434. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/state.py +0 -0
  435. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/validation.py +0 -0
  436. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/__init__.py +0 -0
  437. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/__init__.py +0 -0
  438. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/engine.py +0 -0
  439. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/product.py +0 -0
  440. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/rewrite.py +0 -0
  441. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/strategy.py +0 -0
  442. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/__init__.py +0 -0
  443. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/mixin.py +0 -0
  444. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/policy.py +0 -0
  445. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/symmetry.py +0 -0
  446. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/__init__.py +0 -0
  447. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/deduplication.py +0 -0
  448. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/policy.py +0 -0
  449. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/serialization.py +0 -0
  450. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/structural.py +0 -0
  451. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/__init__.py +0 -0
  452. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/assignment.py +0 -0
  453. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/mixin.py +0 -0
  454. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/__init__.py +0 -0
  455. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/imbalanced.py +0 -0
  456. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/partial.py +0 -0
  457. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/__init__.py +0 -0
  458. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/batch.py +0 -0
  459. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/benchmark.py +0 -0
  460. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/postprocess.py +0 -0
  461. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/rule_filter.py +0 -0
  462. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/__init__.py +0 -0
  463. {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/reactor_utils.py +0 -0
  464. {synkit-1.6.2 → synkit-1.6.3}/synkit/Utils/__init__.py +0 -0
  465. {synkit-1.6.2 → synkit-1.6.3}/synkit/Utils/utils.py +0 -0
  466. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/__init__.py +0 -0
  467. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/crn/__init__.py +0 -0
  468. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/__init__.py +0 -0
  469. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/arrows.py +0 -0
  470. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/chem.py +0 -0
  471. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/constants.py +0 -0
  472. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/layout.py +0 -0
  473. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/mapping.py +0 -0
  474. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/models.py +0 -0
  475. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/render.py +0 -0
  476. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/utils.py +0 -0
  477. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/visualizer.py +0 -0
  478. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/graph_visualizer.py +0 -0
  479. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its/__init__.py +0 -0
  480. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its/drawer.py +0 -0
  481. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its_drawer.py +0 -0
  482. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/__init__.py +0 -0
  483. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/drawer.py +0 -0
  484. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/reaction.py +0 -0
  485. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule_drawer.py +0 -0
  486. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg/__init__.py +0 -0
  487. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg/drawer.py +0 -0
  488. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg_drawer.py +0 -0
  489. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/pdf_writer.py +0 -0
  490. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/__init__.py +0 -0
  491. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/rule.py +0 -0
  492. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/rxn.py +0 -0
  493. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction_drawer.py +0 -0
  494. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/__init__.py +0 -0
  495. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/chemical.py +0 -0
  496. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/embedding.py +0 -0
  497. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
  498. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
  499. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
  500. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/vis.py +0 -0
  501. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/visual_drawer.py +0 -0
  502. {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/visual_model.py +0 -0
  503. {synkit-1.6.2 → synkit-1.6.3}/synkit/__init__.py +0 -0
  504. {synkit-1.6.2 → synkit-1.6.3}/synkit/examples.py +0 -0
@@ -16,12 +16,16 @@ venv/
16
16
  /dist/
17
17
  /docs/
18
18
  *.egg-info/
19
+ # Optional Mapper kernel artifacts are rebuilt from the shipped C++ source.
20
+ libsynkit_distance_*.so
21
+ libsynkit_distance_*.json
19
22
 
20
23
  # Generated logs, reports, notebooks, and data files
21
24
  *.log
22
25
  *.pdf
23
26
  *.rdf
24
27
  *.ipynb
28
+ !Experiment/CRN/notebooks/crn_glycolysis_case_study.ipynb
25
29
  *.csv
26
30
  *.json
27
31
  *.json.gz
@@ -29,7 +33,7 @@ venv/
29
33
  *.txt
30
34
 
31
35
  # Package resources and repository evidence retained despite the broad rules
32
- !LICENSES/*.txt
36
+ !Experiment/CRN/LICENSES/*.txt
33
37
  !synkit/CRN/Benchmark/data/kegg_modules.json
34
38
  !Data/Conformance/stereomolgraph_graph_conformance.json
35
39
  !Data/Mech/polar.json
@@ -37,7 +41,7 @@ venv/
37
41
  !Data/Mech/stereo.json
38
42
  !Data/Schema/
39
43
  !Data/Schema/attribute_propagation_v1_5.json
40
- !/tools/python_file_size_baseline.json
44
+ !/scripts/python_file_size_baseline.json
41
45
  !Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
42
46
 
43
47
  # Lewis benchmark inputs and reviewed evidence
@@ -65,6 +69,10 @@ venv/
65
69
  !Experiment/Stereo/Data/Perception/full_detection_report.json
66
70
  !Experiment/Stereo/Data/Perception/perception_conformance_cases.json
67
71
 
72
+ # Historical reaction-stereo records consumed by experiment audits
73
+ !Experiment/StereoReaction/evidence/stereo_rxn_closeout.json
74
+ !Experiment/StereoReaction/evidence/stereo_rxn_validation.json
75
+
68
76
  # Large or reproducible data products
69
77
  /Data/Benchmark/*
70
78
  !/Data/Benchmark/mech/
@@ -99,7 +107,8 @@ venv/
99
107
  /crn/
100
108
  /debug/
101
109
  /dev/
102
- /paper/*
110
+ # Manuscripts, evidence, figures, and local cleanup archives
111
+ /paper/
103
112
  /sprint/
104
113
  /synkit/Graph/dev/
105
114
 
@@ -114,3 +123,6 @@ test_partial.py
114
123
  test_run.py
115
124
  test_syn.py
116
125
  test_syn_reactor.py
126
+
127
+ # Local benchmark outputs and frozen source copies stay local.
128
+ /benchmark_results/
@@ -0,0 +1,13 @@
1
+ BioModels input notice
2
+ ======================
3
+
4
+ The optional interoperability study downloads models from BioModels. The
5
+ BioModels dataset, including encoded models and annotations, is made available
6
+ under the Creative Commons CC0 1.0 Public Domain Dedication:
7
+
8
+ https://www.ebi.ac.uk/biomodels/termsofuse
9
+
10
+ Downloaded model files are cached locally under
11
+ ``Experiment/CRN/data/biomodels`` but are excluded from SynKit distribution
12
+ artifacts. Evidence reports retain identifiers, source URLs, file sizes and
13
+ SHA-256 checksums.
@@ -0,0 +1,15 @@
1
+ KEGG-derived cache notice
2
+ =========================
3
+
4
+ The file ``synkit/CRN/Benchmark/data/kegg_modules.json`` contains records
5
+ derived from the Kyoto Encyclopedia of Genes and Genomes (KEGG), retrieved on
6
+ the date recorded inside that file. KEGG is copyright Kanehisa Laboratories.
7
+
8
+ This cache is not covered by SynKit's MIT licence. KEGG's current terms state
9
+ that academic users may use the KEGG website and that non-academic use requires
10
+ a commercial licence. See: https://www.kegg.jp/kegg/legal.html
11
+
12
+ Release maintainers must confirm that their intended redistribution of this
13
+ cache is authorized under the applicable KEGG terms. If it is not, the cache
14
+ must be excluded from the release and users must retrieve the source records
15
+ under their own authorized access.
synkit-1.6.3/PKG-INFO ADDED
@@ -0,0 +1,122 @@
1
+ Metadata-Version: 2.4
2
+ Name: synkit
3
+ Version: 1.6.3
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-Expression: MIT
11
+ License-File: LICENSE
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.11
15
+ Requires-Dist: joblib>=1.2.0
16
+ Requires-Dist: matplotlib>=3.9
17
+ Requires-Dist: networkx>=3.3
18
+ Requires-Dist: numpy>=2.2.0
19
+ Requires-Dist: pandas>=2.2.2
20
+ Requires-Dist: pillow
21
+ Requires-Dist: rdkit>=2025.3.1
22
+ Requires-Dist: regex>=2024.11.6
23
+ Requires-Dist: requests>=2.32.3
24
+ Requires-Dist: scikit-learn>=1.4.2
25
+ Requires-Dist: scipy>=1.14.0
26
+ Requires-Dist: seaborn>=0.13.2
27
+ Requires-Dist: tqdm
28
+ Provides-Extra: all
29
+ Requires-Dist: pulp; extra == 'all'
30
+ Requires-Dist: sympy>=1.13.1; extra == 'all'
31
+ Requires-Dist: torch>=2.2.0; extra == 'all'
32
+ Provides-Extra: docs
33
+ Requires-Dist: graphviz; extra == 'docs'
34
+ Requires-Dist: myst-parser; extra == 'docs'
35
+ Requires-Dist: pydata-sphinx-theme; extra == 'docs'
36
+ Requires-Dist: sphinx-copybutton; extra == 'docs'
37
+ Requires-Dist: sphinx-design; extra == 'docs'
38
+ Requires-Dist: sphinx-rtd-theme; extra == 'docs'
39
+ Requires-Dist: sphinx-togglebutton; extra == 'docs'
40
+ Requires-Dist: sphinx>=6.0; extra == 'docs'
41
+ Requires-Dist: sphinxcontrib-bibtex; extra == 'docs'
42
+ Provides-Extra: milp
43
+ Requires-Dist: pulp; extra == 'milp'
44
+ Provides-Extra: test
45
+ Requires-Dist: flake8; extra == 'test'
46
+ Requires-Dist: psutil<8,>=5.9; extra == 'test'
47
+ Requires-Dist: pytest; extra == 'test'
48
+ Description-Content-Type: text/markdown
49
+
50
+ # SynKit
51
+
52
+ [![PyPI version](https://img.shields.io/pypi/v/synkit.svg)](https://pypi.org/project/synkit/)
53
+ [![License](https://img.shields.io/github/license/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
54
+ [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.15269901.svg)](https://doi.org/10.5281/zenodo.15269901)
55
+ [![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)
56
+
57
+ **Graph-native reaction informatics and executable electron-flow models**
58
+
59
+ SynKit is a Python toolkit for atom mapping, chemical graph transformations,
60
+ reaction rules, stereochemistry, and chemical reaction networks. It also
61
+ represents Lewis-labelled graphs and verifies user-supplied electron-flow
62
+ mechanisms. It does not predict the kinetically or thermodynamically preferred
63
+ mechanism.
64
+
65
+ ![SynKit graphical abstract](https://raw.githubusercontent.com/TieuLongPhan/SynKit/main/Data/Figure/synkit_graphical_abstract.svg)
66
+
67
+ ## Installation
68
+
69
+ Requires Python 3.11 or later.
70
+
71
+ ```bash
72
+ python -m pip install synkit
73
+ ```
74
+
75
+ See [Getting Started](doc/getting_started.rst) for examples, optional
76
+ dependencies, and Docker installation.
77
+
78
+ ## Documentation
79
+
80
+ - [Documentation](https://tieulongphan.github.io/SynKit/)
81
+ - [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
82
+ - [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
83
+ - [Changelog](doc/changelog.rst)
84
+
85
+ ## Publications
86
+
87
+ - [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
88
+ transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
89
+ - [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
90
+ Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
91
+ of Chemical Information and Modeling* (2025).
92
+
93
+ ## Contributing
94
+
95
+ Contributions and bug reports are welcome. Create a branch from the current
96
+ mainline, make a focused change, and run the repository checks before opening
97
+ a pull request:
98
+
99
+ ```bash
100
+ git switch -c feature/short-description
101
+ bash scripts/lint.sh
102
+ bash scripts/pytest.sh
103
+ ```
104
+
105
+ Questions can be sent to [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
106
+
107
+ ## Contributors
108
+
109
+ - [Tieu-Long Phan](https://tieulongphan.github.io/)
110
+ - [Klaus Weinbauer](https://github.com/klausweinbauer)
111
+ - [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
112
+ - [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
113
+
114
+ ## License
115
+
116
+ SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
117
+
118
+ ## Acknowledgments
119
+
120
+ This project received funding from the European Union’s Horizon Europe
121
+ Doctoral Network programme under Marie Skłodowska-Curie grant agreement
122
+ No. 101072930 ([TACsy](https://tacsy.eu/)).
synkit-1.6.3/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # SynKit
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/synkit.svg)](https://pypi.org/project/synkit/)
4
+ [![License](https://img.shields.io/github/license/tieulongphan/synkit.svg)](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
5
+ [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.15269901.svg)](https://doi.org/10.5281/zenodo.15269901)
6
+ [![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)
7
+
8
+ **Graph-native reaction informatics and executable electron-flow models**
9
+
10
+ SynKit is a Python toolkit for atom mapping, chemical graph transformations,
11
+ reaction rules, stereochemistry, and chemical reaction networks. It also
12
+ represents Lewis-labelled graphs and verifies user-supplied electron-flow
13
+ mechanisms. It does not predict the kinetically or thermodynamically preferred
14
+ mechanism.
15
+
16
+ ![SynKit graphical abstract](https://raw.githubusercontent.com/TieuLongPhan/SynKit/main/Data/Figure/synkit_graphical_abstract.svg)
17
+
18
+ ## Installation
19
+
20
+ Requires Python 3.11 or later.
21
+
22
+ ```bash
23
+ python -m pip install synkit
24
+ ```
25
+
26
+ See [Getting Started](doc/getting_started.rst) for examples, optional
27
+ dependencies, and Docker installation.
28
+
29
+ ## Documentation
30
+
31
+ - [Documentation](https://tieulongphan.github.io/SynKit/)
32
+ - [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
33
+ - [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
34
+ - [Changelog](doc/changelog.rst)
35
+
36
+ ## Publications
37
+
38
+ - [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
39
+ transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
40
+ - [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
41
+ Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
42
+ of Chemical Information and Modeling* (2025).
43
+
44
+ ## Contributing
45
+
46
+ Contributions and bug reports are welcome. Create a branch from the current
47
+ mainline, make a focused change, and run the repository checks before opening
48
+ a pull request:
49
+
50
+ ```bash
51
+ git switch -c feature/short-description
52
+ bash scripts/lint.sh
53
+ bash scripts/pytest.sh
54
+ ```
55
+
56
+ Questions can be sent to [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
57
+
58
+ ## Contributors
59
+
60
+ - [Tieu-Long Phan](https://tieulongphan.github.io/)
61
+ - [Klaus Weinbauer](https://github.com/klausweinbauer)
62
+ - [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
63
+ - [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
64
+
65
+ ## License
66
+
67
+ SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
68
+
69
+ ## Acknowledgments
70
+
71
+ This project received funding from the European Union’s Horizon Europe
72
+ Doctoral Network programme under Marie Skłodowska-Curie grant agreement
73
+ No. 101072930 ([TACsy](https://tacsy.eu/)).
@@ -1,37 +1,42 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
2
+ requires = ["hatchling>=1.27.0"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synkit"
7
- version = "1.6.2"
7
+ version = "1.6.3"
8
8
  description = "Utility for reaction modeling using graph grammar"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
- license = { text = "MIT" }
11
+ license = "MIT"
12
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
  ]
16
16
  classifiers = [
17
17
  "Programming Language :: Python :: 3",
18
- "License :: OSI Approved :: MIT License",
19
18
  "Operating System :: OS Independent",
20
19
  ]
21
20
  dependencies = [
22
21
  "numpy>=2.2.0",
23
- "scikit-learn>=1.4.0",
24
- "pandas>=1.5.3",
22
+ "scikit-learn>=1.4.2",
23
+ "pandas>=2.2.2",
25
24
  "rdkit>=2025.3.1",
26
25
  "networkx>=3.3",
27
26
  "scipy>=1.14.0",
28
27
  "seaborn>=0.13.2",
29
28
  "requests>=2.32.3",
30
29
  "regex>=2024.11.6",
30
+ "joblib>=1.2.0",
31
+ "matplotlib>=3.9",
32
+ "pillow",
33
+ "tqdm",
31
34
  ]
32
35
 
33
36
  [project.optional-dependencies]
34
- all = ["numpy>=2.2.0", "torch>=2.2.0", "sympy>=1.13.1"]
37
+ test = ["flake8", "pytest", "psutil>=5.9,<8"]
38
+ milp = ["pulp"]
39
+ all = ["torch>=2.2.0", "sympy>=1.13.1", "pulp"]
35
40
  docs = [
36
41
  # Core Sphinx
37
42
  "sphinx>=6.0",
@@ -66,6 +71,7 @@ packages = ["synkit"]
66
71
  core-metadata-version = "2.4"
67
72
 
68
73
  [tool.hatch.build.targets.wheel.force-include]
74
+ "synkit/Chem/Mapper/exact/native/native_distance.cpp" = "synkit/Chem/Mapper/exact/native/native_distance.cpp"
69
75
  "synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
70
76
  "synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
71
77
  "synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
@@ -75,12 +81,13 @@ core-metadata-version = "2.4"
75
81
  include = [
76
82
  "/synkit",
77
83
  "/LICENSE",
78
- "/LICENSES",
84
+ "/Experiment/CRN/LICENSES",
79
85
  "/README.md",
80
86
  "/pyproject.toml",
81
87
  ]
82
88
 
83
89
  [tool.hatch.build.targets.sdist.force-include]
90
+ "synkit/Chem/Mapper/exact/native/native_distance.cpp" = "synkit/Chem/Mapper/exact/native/native_distance.cpp"
84
91
  "synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
85
92
  "synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
86
93
  "synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
@@ -1,7 +1,6 @@
1
1
  """Benchmark, validation and case-study material for :mod:`synkit.CRN`.
2
2
 
3
- Three things live here, all runnable and all shipped with the package so the
4
- results in the paper can be regenerated by a reader:
3
+ The package includes:
5
4
 
6
5
  - **A validation set** (:mod:`~synkit.CRN.Benchmark.networks`,
7
6
  :mod:`~synkit.CRN.Benchmark.validate`) — literature and regression networks
@@ -11,7 +10,7 @@ results in the paper can be regenerated by a reader:
11
10
  - **A scaling benchmark** (:mod:`~synkit.CRN.Benchmark.scaling`) — wall-clock
12
11
  timings of the analysis stack against network size.
13
12
  - **A metabolic case study** (:mod:`~synkit.CRN.Benchmark.kegg`) — cached KEGG
14
- modules pushed through the whole chain, from pathway retrieval to
13
+ modules processed from pathway retrieval through
15
14
  conservation laws, persistence and flux realizability.
16
15
 
17
16
  .. rubric:: Example
@@ -504,11 +504,10 @@ def check_glycolysis_flux(
504
504
  reaction="label",
505
505
  )
506
506
  checker.build_petri_net_from_flow()
507
- realizable, certificate = checker.is_realizable(max_states=max_states)
507
+ outcome = checker.realizability_result(max_states=max_states)
508
508
 
509
509
  return {
510
- "realizable": bool(realizable),
511
- "certificate": certificate,
510
+ **outcome.to_dict(),
512
511
  "flux": requested,
513
512
  "initial_marking": {"alpha-D-Glucose": initial_glucose},
514
513
  }
@@ -1,12 +1,8 @@
1
1
  """Scaling benchmark for the :mod:`synkit.CRN` analysis stack.
2
2
 
3
- Measures wall-clock time of each analysis against network size, over families
4
- of synthetic networks whose size is a single parameter. The point is to show
5
- where the practical ceiling of each analysis lies, since the analyses have very
6
- different complexity: stoichiometric rank and conservation laws are polynomial,
7
- minimal semiflows and canonicalization are worst-case exponential in theory but
8
- tractable on the sparse networks chemistry produces, and minimal-siphon
9
- enumeration is the one that used to be the wall.
3
+ Measures wall-clock time against network size for parameterized synthetic
4
+ network families. The results locate practical runtime limits for the selected
5
+ families; they do not establish asymptotic complexity.
10
6
 
11
7
  Network families
12
8
  ----------------
@@ -16,13 +12,13 @@ Network families
16
12
  linear metabolic pathway.
17
13
  ``reversible_chain``
18
14
  The same chain with every reaction reversed as well. Weakly reversible, so
19
- every analysis has to do real work rather than bail out early.
15
+ exercises analyses that can terminate early on non-reversible networks.
20
16
  ``cycle``
21
17
  A closed chain ``S0 -> ... -> Sn -> S0``, which is weakly reversible and has
22
18
  a single conservation law.
23
19
  ``random_sparse``
24
20
  Random bimolecular reactions at a fixed reaction-to-species ratio. The
25
- hardest of the four, and the closest to a rule-expanded network.
21
+ densest of the four benchmark families.
26
22
 
27
23
  .. rubric:: Example
28
24
 
@@ -39,6 +35,7 @@ from __future__ import annotations
39
35
  import random
40
36
  import time
41
37
  from dataclasses import dataclass
38
+ from multiprocessing import get_all_start_methods, get_context
42
39
  from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
43
40
 
44
41
  from ..Petrinet.structure import find_siphons
@@ -305,6 +302,10 @@ class ScalingRecord:
305
302
  :param error:
306
303
  Exception text when the task raised.
307
304
  :type error: Optional[str]
305
+
306
+ :param timed_out:
307
+ Whether the task was terminated at the measurement budget.
308
+ :type timed_out: bool
308
309
  """
309
310
 
310
311
  family: str
@@ -315,6 +316,7 @@ class ScalingRecord:
315
316
  seconds: Optional[float] = None
316
317
  result: Any = None
317
318
  error: Optional[str] = None
319
+ timed_out: bool = False
318
320
 
319
321
  def to_dict(self) -> Dict[str, Any]:
320
322
  """Return the record as a serializable mapping.
@@ -331,19 +333,50 @@ class ScalingRecord:
331
333
  "seconds": self.seconds,
332
334
  "result": self.result,
333
335
  "error": self.error,
336
+ "timed_out": self.timed_out,
334
337
  }
335
338
 
336
339
 
340
+ def _time_task_worker(
341
+ task: Callable[[SynCRN], Any],
342
+ crn: SynCRN,
343
+ repeats: int,
344
+ connection: Any,
345
+ ) -> None:
346
+ """Execute a timed task in a process that the parent can terminate.
347
+
348
+ :param task: Callable to time.
349
+ :type task: Callable[[SynCRN], Any]
350
+ :param crn: Network to pass to the task.
351
+ :type crn: SynCRN
352
+ :param repeats: Number of repeats.
353
+ :type repeats: int
354
+ :param connection: One-way multiprocessing connection.
355
+ :type connection: Any
356
+ """
357
+ best: Optional[float] = None
358
+ result: Any = None
359
+ try:
360
+ for _ in range(max(1, repeats)):
361
+ started = time.perf_counter()
362
+ result = task(crn)
363
+ elapsed = time.perf_counter() - started
364
+ best = elapsed if best is None else min(best, elapsed)
365
+ connection.send((best, result, None))
366
+ except Exception as exc: # pragma: no cover - returned to parent
367
+ connection.send((None, None, f"{type(exc).__name__}: {exc}"))
368
+ finally:
369
+ connection.close()
370
+
371
+
337
372
  def _time_task(
338
373
  task: Callable[[SynCRN], Any],
339
374
  crn: SynCRN,
340
375
  *,
341
376
  repeats: int,
342
- ) -> Tuple[Optional[float], Any, Optional[str]]:
343
- """Time one task, reporting the best of ``repeats`` runs.
344
-
345
- The best rather than the mean, because the slow runs measure the machine's
346
- other work rather than the algorithm.
377
+ time_budget: Optional[float],
378
+ ) -> Tuple[Optional[float], Any, Optional[str], bool]:
379
+ """Time one task and report the minimum of ``repeats`` runs.
347
380
 
348
381
  :param task: Callable to time.
349
382
  :type task: Callable[[SynCRN], Any]
@@ -351,9 +384,34 @@ def _time_task(
351
384
  :type crn: SynCRN
352
385
  :param repeats: Number of repeats.
353
386
  :type repeats: int
354
- :return: Tuple ``(seconds, result, error)``.
355
- :rtype: Tuple[Optional[float], Any, Optional[str]]
387
+ :param time_budget: Hard wall-clock budget, or ``None`` for no limit.
388
+ :type time_budget: Optional[float]
389
+ :return: Tuple ``(seconds, result, error, timed_out)``.
390
+ :rtype: Tuple[Optional[float], Any, Optional[str], bool]
356
391
  """
392
+ if time_budget is not None:
393
+ start_method = "fork" if "fork" in get_all_start_methods() else "spawn"
394
+ context = get_context(start_method)
395
+ receiver, sender = context.Pipe(duplex=False)
396
+ process = context.Process(
397
+ target=_time_task_worker,
398
+ args=(task, crn, repeats, sender),
399
+ )
400
+ process.start()
401
+ sender.close()
402
+ process.join(max(0.0, time_budget))
403
+ if process.is_alive():
404
+ process.terminate()
405
+ process.join()
406
+ receiver.close()
407
+ return None, None, None, True
408
+ if receiver.poll():
409
+ seconds, result, error = receiver.recv()
410
+ receiver.close()
411
+ return seconds, result, error, False
412
+ receiver.close()
413
+ return None, None, f"worker exited with code {process.exitcode}", False
414
+
357
415
  best: Optional[float] = None
358
416
  result: Any = None
359
417
 
@@ -362,11 +420,11 @@ def _time_task(
362
420
  try:
363
421
  result = task(crn)
364
422
  except Exception as exc: # pragma: no cover - reported, not raised
365
- return None, None, f"{type(exc).__name__}: {exc}"
423
+ return None, None, f"{type(exc).__name__}: {exc}", False
366
424
  elapsed = time.perf_counter() - started
367
425
  best = elapsed if best is None else min(best, elapsed)
368
426
 
369
- return best, result, None
427
+ return best, result, None, False
370
428
 
371
429
 
372
430
  def run_scaling_benchmark(
@@ -381,8 +439,8 @@ def run_scaling_benchmark(
381
439
  ) -> List[ScalingRecord]:
382
440
  """Time each analysis across network families and sizes.
383
441
 
384
- Once a task exceeds ``time_budget`` on some size of a family, it is skipped
385
- for every larger size of that family, so one slow analysis cannot make the
442
+ A task is terminated when it reaches ``time_budget`` and is skipped for
443
+ every larger size of that family, so one slow analysis cannot make the
386
444
  whole run open-ended.
387
445
 
388
446
  :param sizes:
@@ -445,8 +503,11 @@ def run_scaling_benchmark(
445
503
  if (family, task) in exhausted:
446
504
  continue
447
505
 
448
- seconds, result, error = _time_task(
449
- TASKS[task], crn, repeats=repeats
506
+ seconds, result, error, timed_out = _time_task(
507
+ TASKS[task],
508
+ crn,
509
+ repeats=repeats,
510
+ time_budget=time_budget,
450
511
  )
451
512
  records.append(
452
513
  ScalingRecord(
@@ -458,15 +519,13 @@ def run_scaling_benchmark(
458
519
  seconds=seconds,
459
520
  result=result,
460
521
  error=error,
522
+ timed_out=timed_out,
461
523
  )
462
524
  )
463
525
 
464
- over_budget = (
465
- time_budget is not None
466
- and seconds is not None
467
- and seconds > time_budget
468
- )
469
- if error is not None or over_budget:
526
+ if error is not None:
527
+ exhausted.add((family, task))
528
+ if timed_out:
470
529
  exhausted.add((family, task))
471
530
 
472
531
  return records
@@ -3,10 +3,8 @@
3
3
  This is the reproducible form of the paper's validation table: every benchmark
4
4
  network is analysed, every asserted quantity is compared with the expected
5
5
  value, and every quantity is additionally recomputed by an independent route
6
- from :mod:`synkit.CRN.Benchmark.crosschecks`. A run that reports
7
- ``all_passed`` therefore establishes two things at once — that the package
8
- reproduces the expected verdicts, and that it agrees with a second, disjoint
9
- computation of the same numbers.
6
+ from :mod:`synkit.CRN.Benchmark.crosschecks`. ``all_passed`` requires agreement
7
+ with both the expected verdicts and the independent computations.
10
8
 
11
9
  .. rubric:: Example
12
10
 
@@ -12,7 +12,7 @@ stoichiometry). No kinetic law is written, because a ``SynCRN`` carries none;
12
12
  structural analysis does not need one. Files that *do* carry kinetic laws are
13
13
  read fine — the laws are simply ignored.
14
14
 
15
- Two conversion choices are worth knowing:
15
+ Conversion policies:
16
16
 
17
17
  - **Reversible reactions.** SBML marks a reaction ``reversible="true"``; a
18
18
  ``SynCRN`` reaction is always directed. On import, a reversible reaction is
@@ -564,6 +564,7 @@ def _read_species(
564
564
  "label": element.get("name") or sid,
565
565
  "smiles": annotation.get("smiles"),
566
566
  "sbml_id": sid,
567
+ "source_node_id": annotation.get("sourceNodeId", sid),
567
568
  }
568
569
 
569
570
  return species, dropped
@@ -799,7 +800,12 @@ def crn_from_sbml(
799
800
  reversible = _is_true(element.get("reversible"))
800
801
  annotation = _annotation_values(element, "reactionInfo")
801
802
 
802
- extra: Dict[str, Any] = {"sbml_id": rid}
803
+ extra: Dict[str, Any] = {
804
+ "sbml_id": rid,
805
+ "source_node_id": annotation.get("sourceNodeId", rid),
806
+ }
807
+ if annotation.get("sourceKind"):
808
+ extra["source_kind"] = annotation["sourceKind"]
803
809
  if annotation.get("ruleRepr"):
804
810
  extra["rule_repr"] = annotation["ruleRepr"]
805
811
 
@@ -33,6 +33,9 @@ from .reachability import (
33
33
  from .realizability import (
34
34
  PathwayRealizability,
35
35
  RealizabilityConfig,
36
+ RealizabilityResult,
37
+ RealizabilitySearchLimit,
38
+ RealizabilityStatus,
36
39
  RealizabilitySummary,
37
40
  run_realizability_from_syncrn,
38
41
  syncrn_to_pr_inputs,
@@ -55,6 +58,9 @@ __all__ = [
55
58
  # realizability
56
59
  "PathwayRealizability",
57
60
  "RealizabilityConfig",
61
+ "RealizabilityResult",
62
+ "RealizabilitySearchLimit",
63
+ "RealizabilityStatus",
58
64
  "RealizabilitySummary",
59
65
  "run_realizability_from_syncrn",
60
66
  "syncrn_to_pr_inputs",