synkit 1.6.5__py3-none-win_amd64.whl

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 (636) hide show
  1. synkit/CRN/Benchmark/__init__.py +53 -0
  2. synkit/CRN/Benchmark/crosschecks.py +13 -0
  3. synkit/CRN/Benchmark/kegg.py +12 -0
  4. synkit/CRN/Benchmark/networks.py +13 -0
  5. synkit/CRN/Benchmark/scaling.py +13 -0
  6. synkit/CRN/Benchmark/validate.py +13 -0
  7. synkit/CRN/Construct/__init__.py +16 -0
  8. synkit/CRN/Construct/abstract.py +668 -0
  9. synkit/CRN/Construct/arity.py +36 -0
  10. synkit/CRN/Construct/builder.py +619 -0
  11. synkit/CRN/Construct/derivation.py +63 -0
  12. synkit/CRN/Construct/flattener.py +100 -0
  13. synkit/CRN/Construct/keys.py +14 -0
  14. synkit/CRN/Construct/mixtures.py +117 -0
  15. synkit/CRN/Construct/rdkit_worker.py +69 -0
  16. synkit/CRN/Construct/smiles.py +99 -0
  17. synkit/CRN/Construct/state.py +31 -0
  18. synkit/CRN/Construct/strategy.py +75 -0
  19. synkit/CRN/Construct/worker.py +42 -0
  20. synkit/CRN/IO/__init__.py +36 -0
  21. synkit/CRN/IO/sbml.py +925 -0
  22. synkit/CRN/Pathway/__init__.py +72 -0
  23. synkit/CRN/Pathway/_adapter.py +333 -0
  24. synkit/CRN/Pathway/pathfinder.py +500 -0
  25. synkit/CRN/Pathway/reachability.py +796 -0
  26. synkit/CRN/Pathway/realizability.py +1322 -0
  27. synkit/CRN/Petrinet/__init__.py +93 -0
  28. synkit/CRN/Petrinet/analyzer.py +486 -0
  29. synkit/CRN/Petrinet/minimal_semiflows.py +436 -0
  30. synkit/CRN/Petrinet/net.py +1041 -0
  31. synkit/CRN/Petrinet/persistence.py +97 -0
  32. synkit/CRN/Petrinet/semiflows.py +483 -0
  33. synkit/CRN/Petrinet/siphon_search.py +402 -0
  34. synkit/CRN/Petrinet/structure.py +286 -0
  35. synkit/CRN/Props/__init__.py +130 -0
  36. synkit/CRN/Props/_rank.py +29 -0
  37. synkit/CRN/Props/deficiency.py +953 -0
  38. synkit/CRN/Props/dynamics.py +832 -0
  39. synkit/CRN/Props/helper.py +151 -0
  40. synkit/CRN/Props/stoich.py +751 -0
  41. synkit/CRN/Props/thermo.py +584 -0
  42. synkit/CRN/Query/__init__.py +66 -0
  43. synkit/CRN/Query/cache.py +41 -0
  44. synkit/CRN/Query/kegg_api.py +99 -0
  45. synkit/CRN/Query/kegg_extract.py +714 -0
  46. synkit/CRN/Query/kegg_impute.py +707 -0
  47. synkit/CRN/Query/kegg_parse.py +480 -0
  48. synkit/CRN/Query/to_syncrn.py +290 -0
  49. synkit/CRN/README.md +234 -0
  50. synkit/CRN/Structure/__init__.py +12 -0
  51. synkit/CRN/Structure/_graph_io.py +713 -0
  52. synkit/CRN/Structure/_matrices.py +88 -0
  53. synkit/CRN/Structure/_parse.py +544 -0
  54. synkit/CRN/Structure/reaction.py +237 -0
  55. synkit/CRN/Structure/rule.py +55 -0
  56. synkit/CRN/Structure/species.py +46 -0
  57. synkit/CRN/Structure/syncrn.py +929 -0
  58. synkit/CRN/Symmetry/__init__.py +20 -0
  59. synkit/CRN/Symmetry/_common.py +1059 -0
  60. synkit/CRN/Symmetry/_ir.py +940 -0
  61. synkit/CRN/Symmetry/automorphism.py +472 -0
  62. synkit/CRN/Symmetry/canon.py +441 -0
  63. synkit/CRN/Symmetry/isomorphism.py +412 -0
  64. synkit/CRN/Symmetry/symmetry.py +61 -0
  65. synkit/CRN/Symmetry/wl_canon.py +967 -0
  66. synkit/CRN/Visualize/__init__.py +11 -0
  67. synkit/CRN/Visualize/labels.py +113 -0
  68. synkit/CRN/Visualize/layout.py +708 -0
  69. synkit/CRN/Visualize/palette.py +292 -0
  70. synkit/CRN/Visualize/validation.py +122 -0
  71. synkit/CRN/Visualize/vis.py +1152 -0
  72. synkit/CRN/__init__.py +233 -0
  73. synkit/CRN/_build.py +50 -0
  74. synkit/CRN/_native_build.py +175 -0
  75. synkit/CRN/analysis.py +629 -0
  76. synkit/CRN/backend.py +74 -0
  77. synkit/CRN/cpp/CMakeLists.txt +58 -0
  78. synkit/CRN/cpp/algebra.cpp +46 -0
  79. synkit/CRN/cpp/closure.cpp +29 -0
  80. synkit/CRN/cpp/exact.h +55 -0
  81. synkit/CRN/cpp/pathway.cpp +46 -0
  82. synkit/CRN/cpp/semiflows.cpp +209 -0
  83. synkit/CRN/cpp/structural.cpp +240 -0
  84. synkit/CRN/cpp/symmetry.cpp +45 -0
  85. synkit/CRN/cpp/write_manifest.cmake +28 -0
  86. synkit/CRN/kinds.py +137 -0
  87. synkit/CRN/lib/synkit_crn.dll +0 -0
  88. synkit/CRN/lib/synkit_crn.json +33 -0
  89. synkit/CRN/native.py +388 -0
  90. synkit/CRN/native_analysis.py +459 -0
  91. synkit/Chem/Cluster/__init__.py +0 -0
  92. synkit/Chem/Cluster/butina.py +140 -0
  93. synkit/Chem/Fingerprint/__init__.py +0 -0
  94. synkit/Chem/Fingerprint/fp_calculator.py +155 -0
  95. synkit/Chem/Fingerprint/smiles_featurizer.py +258 -0
  96. synkit/Chem/Fingerprint/transformation_fp.py +139 -0
  97. synkit/Chem/Mapper/README.rst +43 -0
  98. synkit/Chem/Mapper/__init__.py +255 -0
  99. synkit/Chem/Mapper/_compat.py +130 -0
  100. synkit/Chem/Mapper/adapters/__init__.py +1 -0
  101. synkit/Chem/Mapper/adapters/prediction.py +126 -0
  102. synkit/Chem/Mapper/adapters/template.py +412 -0
  103. synkit/Chem/Mapper/chem/__init__.py +52 -0
  104. synkit/Chem/Mapper/chem/aam.py +673 -0
  105. synkit/Chem/Mapper/chem/blind.py +160 -0
  106. synkit/Chem/Mapper/chem/its.py +309 -0
  107. synkit/Chem/Mapper/chem/smiles.py +564 -0
  108. synkit/Chem/Mapper/graph/__init__.py +66 -0
  109. synkit/Chem/Mapper/graph/automorphism.py +395 -0
  110. synkit/Chem/Mapper/graph/blockcut.py +98 -0
  111. synkit/Chem/Mapper/graph/labeled_graph.py +104 -0
  112. synkit/Chem/Mapper/graph/refine.py +176 -0
  113. synkit/Chem/Mapper/graph/synkit_adapter.py +110 -0
  114. synkit/Chem/Mapper/io/__init__.py +13 -0
  115. synkit/Chem/Mapper/io/idxmapstr.py +82 -0
  116. synkit/Chem/Mapper/mapper.py +685 -0
  117. synkit/Chem/Mapper/reaction_search.py +554 -0
  118. synkit/Chem/Mapper/reporting/__init__.py +1 -0
  119. synkit/Chem/Mapper/reporting/alternatives.py +451 -0
  120. synkit/Chem/Mapper/reporting/analysis.py +681 -0
  121. synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
  122. synkit/Chem/Mapper/reporting/spectrum.py +642 -0
  123. synkit/Chem/Mapper/solvers/__init__.py +1 -0
  124. synkit/Chem/Mapper/solvers/exact/__init__.py +141 -0
  125. synkit/Chem/Mapper/solvers/exact/assignment/__init__.py +1 -0
  126. synkit/Chem/Mapper/solvers/exact/assignment/assignment_certificate.py +113 -0
  127. synkit/Chem/Mapper/solvers/exact/assignment/assignment_domains.py +162 -0
  128. synkit/Chem/Mapper/solvers/exact/assignment/assignment_verification.py +58 -0
  129. synkit/Chem/Mapper/solvers/exact/assignment/incremental_assignment.py +247 -0
  130. synkit/Chem/Mapper/solvers/exact/certificate.py +128 -0
  131. synkit/Chem/Mapper/solvers/exact/core.py +183 -0
  132. synkit/Chem/Mapper/solvers/exact/distance_search/__init__.py +1 -0
  133. synkit/Chem/Mapper/solvers/exact/distance_search/bounds.py +319 -0
  134. synkit/Chem/Mapper/solvers/exact/distance_search/exhaustive.py +179 -0
  135. synkit/Chem/Mapper/solvers/exact/distance_search/inputs.py +283 -0
  136. synkit/Chem/Mapper/solvers/exact/distance_search/records.py +242 -0
  137. synkit/Chem/Mapper/solvers/exact/distance_search/search.py +1025 -0
  138. synkit/Chem/Mapper/solvers/exact/distance_search/verify.py +378 -0
  139. synkit/Chem/Mapper/solvers/exact/edit_support.py +375 -0
  140. synkit/Chem/Mapper/solvers/exact/hybrid.py +224 -0
  141. synkit/Chem/Mapper/solvers/exact/hydrogen.py +264 -0
  142. synkit/Chem/Mapper/solvers/exact/kernel_solvers/__init__.py +1 -0
  143. synkit/Chem/Mapper/solvers/exact/kernel_solvers/branching.py +499 -0
  144. synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumerate.py +1050 -0
  145. synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumeration_result.py +30 -0
  146. synkit/Chem/Mapper/solvers/exact/kernel_solvers/kernel.py +256 -0
  147. synkit/Chem/Mapper/solvers/exact/kernel_solvers/milp.py +194 -0
  148. synkit/Chem/Mapper/solvers/exact/native/__init__.py +1 -0
  149. synkit/Chem/Mapper/solvers/exact/native/build.py +154 -0
  150. synkit/Chem/Mapper/solvers/exact/native/candidates.py +593 -0
  151. synkit/Chem/Mapper/solvers/exact/native/canonical.py +396 -0
  152. synkit/Chem/Mapper/solvers/exact/native/disk_frontier.py +415 -0
  153. synkit/Chem/Mapper/solvers/exact/native/frontier.py +390 -0
  154. synkit/Chem/Mapper/solvers/exact/native/hydrogen_quotient.py +213 -0
  155. synkit/Chem/Mapper/solvers/exact/native/its.py +528 -0
  156. synkit/Chem/Mapper/solvers/exact/native/native_distance.cpp +2803 -0
  157. synkit/Chem/Mapper/solvers/exact/native/orbit_aggregation.py +328 -0
  158. synkit/Chem/Mapper/solvers/exact/native/parallel.py +205 -0
  159. synkit/Chem/Mapper/solvers/exact/native/pmcd.py +203 -0
  160. synkit/Chem/Mapper/solvers/exact/native/runtime.py +40 -0
  161. synkit/Chem/Mapper/solvers/exact/native/search.py +294 -0
  162. synkit/Chem/Mapper/solvers/exact/native/separator.py +224 -0
  163. synkit/Chem/Mapper/solvers/exact/native_build.py +12 -0
  164. synkit/Chem/Mapper/solvers/exact/pabs/__init__.py +1 -0
  165. synkit/Chem/Mapper/solvers/exact/pabs/cost_lattice.py +43 -0
  166. synkit/Chem/Mapper/solvers/exact/pabs/factor_spectrum.py +110 -0
  167. synkit/Chem/Mapper/solvers/exact/pabs/multi_shell.py +368 -0
  168. synkit/Chem/Mapper/solvers/exact/pabs/propagation.py +679 -0
  169. synkit/Chem/Mapper/solvers/exact/pabs/propagation_bounds.py +436 -0
  170. synkit/Chem/Mapper/solvers/exact/pabs/propagation_limits.py +13 -0
  171. synkit/Chem/Mapper/solvers/exact/pabs/propagation_search.py +856 -0
  172. synkit/Chem/Mapper/solvers/exact/pabs/propagation_symmetry.py +66 -0
  173. synkit/Chem/Mapper/solvers/exact/pabs/residual_typed_bonds.py +136 -0
  174. synkit/Chem/Mapper/solvers/exact/pabs/reward_frontier.py +201 -0
  175. synkit/Chem/Mapper/solvers/exact/pabs/separator_bound.py +258 -0
  176. synkit/Chem/Mapper/solvers/exact/pabs/separator_spectrum.py +308 -0
  177. synkit/Chem/Mapper/solvers/exact/pabs/sparse_reward_bound.py +207 -0
  178. synkit/Chem/Mapper/solvers/exact/pabs/suffix_spectrum.py +299 -0
  179. synkit/Chem/Mapper/solvers/exact/search.py +55 -0
  180. synkit/Chem/Mapper/solvers/exact/seeds/__init__.py +1 -0
  181. synkit/Chem/Mapper/solvers/exact/seeds/seed.py +104 -0
  182. synkit/Chem/Mapper/solvers/exact/seeds/seed_fragments.py +148 -0
  183. synkit/Chem/Mapper/solvers/exact/seeds/seed_relaxation.py +181 -0
  184. synkit/Chem/Mapper/solvers/exact/symmetry.py +223 -0
  185. synkit/Chem/Mapper/solvers/native/__init__.py +4 -0
  186. synkit/Chem/Mapper/solvers/native/assignment.py +99 -0
  187. synkit/Chem/Mapper/solvers/native/astar.py +22 -0
  188. synkit/Chem/Mapper/solvers/native/build.py +385 -0
  189. synkit/Chem/Mapper/solvers/native/classification.py +641 -0
  190. synkit/Chem/Mapper/solvers/native/core.py +378 -0
  191. synkit/Chem/Mapper/solvers/native/cpp/CMakeLists.txt +120 -0
  192. synkit/Chem/Mapper/solvers/native/cpp/examples/map_reaction.cpp +29 -0
  193. synkit/Chem/Mapper/solvers/native/cpp/examples/slap_graph.cpp +63 -0
  194. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/assignment/assignment.h +18 -0
  195. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/astar.h +18 -0
  196. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/bound.h +33 -0
  197. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/pmcd_witness.h +16 -0
  198. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/runtime.h +130 -0
  199. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/hydrogen/hydrogen.h +73 -0
  200. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mapper.h +175 -0
  201. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mces/mces.h +9 -0
  202. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/pabs/seed.h +34 -0
  203. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/reaction/reaction.h +30 -0
  204. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/sepdp/sepdp.h +21 -0
  205. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/slap.h +72 -0
  206. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/solvers/solvers.h +16 -0
  207. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/classification.h +140 -0
  208. synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/cpabs.h +33 -0
  209. synkit/Chem/Mapper/solvers/native/cpp/src/assignment/abb.cpp +302 -0
  210. synkit/Chem/Mapper/solvers/native/cpp/src/astar/CMakeLists.txt +12 -0
  211. synkit/Chem/Mapper/solvers/native/cpp/src/astar/README.md +47 -0
  212. synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar.cpp +228 -0
  213. synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar_graph.cpp +37 -0
  214. synkit/Chem/Mapper/solvers/native/cpp/src/astar/bound.cpp +212 -0
  215. synkit/Chem/Mapper/solvers/native/cpp/src/core/dispatch.cpp +272 -0
  216. synkit/Chem/Mapper/solvers/native/cpp/src/core/pmcd_witness.cpp +36 -0
  217. synkit/Chem/Mapper/solvers/native/cpp/src/hydrogen/hydrogen.cpp +380 -0
  218. synkit/Chem/Mapper/solvers/native/cpp/src/mces/README.md +57 -0
  219. synkit/Chem/Mapper/solvers/native/cpp/src/mces/mces.cpp +287 -0
  220. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/bridge.cpp +334 -0
  221. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/chemical_floor.inc +181 -0
  222. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/endpoint_symmetry.inc +104 -0
  223. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/exact_helpers.h +20 -0
  224. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_assignment_certificate.h +165 -0
  225. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_certificate.h +125 -0
  226. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_model.h +365 -0
  227. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_provider.inc +319 -0
  228. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_rounding.inc +170 -0
  229. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_test_hooks.h +342 -0
  230. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/objective_reduction.inc +137 -0
  231. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/overlap_dual.inc +351 -0
  232. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/profile_seed.inc +214 -0
  233. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/seed_heuristics.inc +640 -0
  234. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_embedding.cpp +430 -0
  235. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_root_lp.h +176 -0
  236. synkit/Chem/Mapper/solvers/native/cpp/src/pabs/test_hooks.inc +262 -0
  237. synkit/Chem/Mapper/solvers/native/cpp/src/reaction/reaction.cpp +611 -0
  238. synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/README.md +61 -0
  239. synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/sepdp.cpp +253 -0
  240. synkit/Chem/Mapper/solvers/native/cpp/src/slap.cpp +810 -0
  241. synkit/Chem/Mapper/solvers/native/cpp/src/solvers/formulation.h +138 -0
  242. synkit/Chem/Mapper/solvers/native/cpp/src/solvers/maxsat.cpp +526 -0
  243. synkit/Chem/Mapper/solvers/native/cpp/src/solvers/ortools.cpp +475 -0
  244. synkit/Chem/Mapper/solvers/native/cpp/src/solvers/seed.h +80 -0
  245. synkit/Chem/Mapper/solvers/native/cpp/src/solvers/weighted_cnf.h +256 -0
  246. synkit/Chem/Mapper/solvers/native/cpp/src/supporting/README.md +43 -0
  247. synkit/Chem/Mapper/solvers/native/cpp/src/supporting/dfs.cpp +123 -0
  248. synkit/Chem/Mapper/solvers/native/cpp/src/supporting/edit_support.cpp +224 -0
  249. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification.cpp +553 -0
  250. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_pipeline.cpp +124 -0
  251. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_stream.h +13 -0
  252. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/cpabs.cpp +455 -0
  253. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/edge_deck.cpp +743 -0
  254. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
  255. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
  256. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naugraph.c +732 -0
  257. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.c +94 -0
  258. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.h +49 -0
  259. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.c +1771 -0
  260. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.h +133 -0
  261. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nautil.c +750 -0
  262. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naututil.h +355 -0
  263. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.c +1256 -0
  264. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.h +1544 -0
  265. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.c +1131 -0
  266. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.h +70 -0
  267. synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/sorttemplates.c +580 -0
  268. synkit/Chem/Mapper/solvers/native/hydrogen.py +711 -0
  269. synkit/Chem/Mapper/solvers/native/implicit.py +506 -0
  270. synkit/Chem/Mapper/solvers/native/implicit_certificate.py +187 -0
  271. synkit/Chem/Mapper/solvers/native/implicit_preparation.py +309 -0
  272. synkit/Chem/Mapper/solvers/native/lib/synkit_mapper.dll +0 -0
  273. synkit/Chem/Mapper/solvers/native/mces.py +16 -0
  274. synkit/Chem/Mapper/solvers/native/reaction.py +179 -0
  275. synkit/Chem/Mapper/solvers/native/reaction_build.py +277 -0
  276. synkit/Chem/Mapper/solvers/native/reaction_text.py +26 -0
  277. synkit/Chem/Mapper/solvers/native/runtime.py +242 -0
  278. synkit/Chem/Mapper/solvers/native/sepdp.py +47 -0
  279. synkit/Chem/Mapper/solvers/native/slap.py +266 -0
  280. synkit/Chem/Mapper/solvers/native/solvers.py +67 -0
  281. synkit/Chem/Mapper/solvers/native/stereo.py +86 -0
  282. synkit/Chem/Mapper/solvers/native/supporting.py +34 -0
  283. synkit/Chem/Mapper/solvers/native/symmetry.py +91 -0
  284. synkit/Chem/Mapper/solvers/slap/__init__.py +29 -0
  285. synkit/Chem/Mapper/solvers/slap/lap.py +174 -0
  286. synkit/Chem/Mapper/solvers/slap/sequential.py +696 -0
  287. synkit/Chem/Mapper/validation/__init__.py +1 -0
  288. synkit/Chem/Mapper/validation/aam_validator.py +442 -0
  289. synkit/Chem/Mapper/validation/annotations.py +274 -0
  290. synkit/Chem/Mapper/validation/bonds.py +124 -0
  291. synkit/Chem/Mapper/validation/cohorts.py +72 -0
  292. synkit/Chem/Mapper/validation/identifiability.py +150 -0
  293. synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
  294. synkit/Chem/Mapper/validation/orbits.py +137 -0
  295. synkit/Chem/Molecule/__init__.py +0 -0
  296. synkit/Chem/Molecule/_chirality_loci.py +165 -0
  297. synkit/Chem/Molecule/_chirality_types.py +231 -0
  298. synkit/Chem/Molecule/_helical_loci.py +167 -0
  299. synkit/Chem/Molecule/_stereo_axis_evidence.py +202 -0
  300. synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
  301. synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
  302. synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
  303. synkit/Chem/Molecule/atom_features.py +379 -0
  304. synkit/Chem/Molecule/chirality.py +1041 -0
  305. synkit/Chem/Molecule/cip_assignment.py +569 -0
  306. synkit/Chem/Molecule/cip_ranking.py +843 -0
  307. synkit/Chem/Molecule/coordinate_stereo.py +503 -0
  308. synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
  309. synkit/Chem/Molecule/descriptors.py +452 -0
  310. synkit/Chem/Molecule/formula.py +249 -0
  311. synkit/Chem/Molecule/global_stereo.py +175 -0
  312. synkit/Chem/Molecule/graph_annotator.py +300 -0
  313. synkit/Chem/Molecule/standardize.py +817 -0
  314. synkit/Chem/Molecule/stereo_evidence.py +179 -0
  315. synkit/Chem/Molecule/stereo_perception.py +1032 -0
  316. synkit/Chem/Molecule/valence.py +123 -0
  317. synkit/Chem/Reaction/Mapper/__init__.py +44 -0
  318. synkit/Chem/Reaction/__init__.py +20 -0
  319. synkit/Chem/Reaction/aam_validator.py +5 -0
  320. synkit/Chem/Reaction/balance_check.py +138 -0
  321. synkit/Chem/Reaction/canon_rsmi.py +249 -0
  322. synkit/Chem/Reaction/cleaning.py +58 -0
  323. synkit/Chem/Reaction/deionize.py +199 -0
  324. synkit/Chem/Reaction/explicit_h_audit.py +232 -0
  325. synkit/Chem/Reaction/fix_aam.py +64 -0
  326. synkit/Chem/Reaction/neutralize.py +207 -0
  327. synkit/Chem/Reaction/radical_wildcard.py +224 -0
  328. synkit/Chem/Reaction/standardize.py +203 -0
  329. synkit/Chem/Reaction/tautomerize.py +205 -0
  330. synkit/Chem/__init__.py +1 -0
  331. synkit/Chem/utils.py +315 -0
  332. synkit/Data/__init__.py +0 -0
  333. synkit/Data/aldol.json.gz +1 -0
  334. synkit/Data/gen_partial_aam.py +147 -0
  335. synkit/Data/paracetamol.json.gz +1 -0
  336. synkit/Graph/Canon/__init__.py +16 -0
  337. synkit/Graph/Canon/_native/__init__.py +13 -0
  338. synkit/Graph/Canon/_native/build.py +93 -0
  339. synkit/Graph/Canon/_native/lib/synkit_canon.dll +0 -0
  340. synkit/Graph/Canon/_native/prepare.py +49 -0
  341. synkit/Graph/Canon/_native/runtime.py +140 -0
  342. synkit/Graph/Canon/_native/search.py +137 -0
  343. synkit/Graph/Canon/canon_algs.py +228 -0
  344. synkit/Graph/Canon/canon_graph.py +531 -0
  345. synkit/Graph/Canon/cpp/CMakeLists.txt +42 -0
  346. synkit/Graph/Canon/cpp/README.md +123 -0
  347. synkit/Graph/Canon/cpp/examples/canonical_graph.cpp +16 -0
  348. synkit/Graph/Canon/cpp/include/synkit_canon/canon.h +85 -0
  349. synkit/Graph/Canon/cpp/src/canonical.cpp +391 -0
  350. synkit/Graph/Canon/cpp/src/symmetry.h +83 -0
  351. synkit/Graph/Canon/cpp/tests/symmetry.cpp +93 -0
  352. synkit/Graph/Canon/exact.py +1020 -0
  353. synkit/Graph/Canon/exact_refinement.py +368 -0
  354. synkit/Graph/Canon/nauty.py +143 -0
  355. synkit/Graph/Context/__init__.py +0 -0
  356. synkit/Graph/Context/hier_context.py +244 -0
  357. synkit/Graph/Context/radius_expand.py +252 -0
  358. synkit/Graph/FG/__init__.py +19 -0
  359. synkit/Graph/FG/api.py +39 -0
  360. synkit/Graph/FG/audit.py +155 -0
  361. synkit/Graph/FG/catalog.py +919 -0
  362. synkit/Graph/FG/detector.py +288 -0
  363. synkit/Graph/FG/model.py +97 -0
  364. synkit/Graph/FG/recognizers.py +274 -0
  365. synkit/Graph/FG/ring_system.py +154 -0
  366. synkit/Graph/Feature/Descriptors/topology.py +857 -0
  367. synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
  368. synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +222 -0
  369. synkit/Graph/Feature/__init__.py +5 -0
  370. synkit/Graph/Feature/graph_descriptors.py +323 -0
  371. synkit/Graph/Feature/graph_fps.py +96 -0
  372. synkit/Graph/Feature/graph_signature.py +239 -0
  373. synkit/Graph/Feature/hash_fps.py +133 -0
  374. synkit/Graph/Feature/morgan_fps.py +88 -0
  375. synkit/Graph/Feature/path_fps.py +81 -0
  376. synkit/Graph/Feature/wl_hash.py +134 -0
  377. synkit/Graph/Fusion/__init__.py +85 -0
  378. synkit/Graph/Fusion/candidate.py +559 -0
  379. synkit/Graph/Fusion/constructor.py +877 -0
  380. synkit/Graph/Fusion/identity.py +184 -0
  381. synkit/Graph/Fusion/interface.py +700 -0
  382. synkit/Graph/Fusion/search.py +241 -0
  383. synkit/Graph/Hyrogen/__init__.py +6 -0
  384. synkit/Graph/Hyrogen/_misc.py +591 -0
  385. synkit/Graph/Hyrogen/hcomplete.py +995 -0
  386. synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
  387. synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
  388. synkit/Graph/Hyrogen/hextend.py +570 -0
  389. synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
  390. synkit/Graph/ITS/__init__.py +4 -0
  391. synkit/Graph/ITS/its_builder.py +120 -0
  392. synkit/Graph/ITS/its_construction.py +719 -0
  393. synkit/Graph/ITS/its_decompose.py +572 -0
  394. synkit/Graph/ITS/its_destruction.py +331 -0
  395. synkit/Graph/ITS/its_expand.py +1251 -0
  396. synkit/Graph/ITS/its_relabel.py +187 -0
  397. synkit/Graph/ITS/its_reverter.py +356 -0
  398. synkit/Graph/ITS/normalize_aam.py +145 -0
  399. synkit/Graph/ITS/partial_its.py +238 -0
  400. synkit/Graph/ITS/rc_extractor.py +656 -0
  401. synkit/Graph/ITS/stereo.py +74 -0
  402. synkit/Graph/MTG/__init__.py +107 -0
  403. synkit/Graph/MTG/gluing.py +451 -0
  404. synkit/Graph/MTG/history.py +928 -0
  405. synkit/Graph/MTG/inventory.py +118 -0
  406. synkit/Graph/MTG/local.py +447 -0
  407. synkit/Graph/MTG/mcs_matcher.py +246 -0
  408. synkit/Graph/MTG/mtg.py +611 -0
  409. synkit/Graph/MTG/mtg_explore.py +74 -0
  410. synkit/Graph/MTG/observation.py +209 -0
  411. synkit/Graph/MTG/process.py +577 -0
  412. synkit/Graph/MTG/queries.py +66 -0
  413. synkit/Graph/MTG/realization.py +95 -0
  414. synkit/Graph/MTG/series_parallel.py +107 -0
  415. synkit/Graph/MTG/utils.py +424 -0
  416. synkit/Graph/Matcher/__init__.py +10 -0
  417. synkit/Graph/Matcher/approx_mcs.py +1264 -0
  418. synkit/Graph/Matcher/auto_est.py +736 -0
  419. synkit/Graph/Matcher/automorphism.py +314 -0
  420. synkit/Graph/Matcher/batch_cluster.py +224 -0
  421. synkit/Graph/Matcher/dedup_matches.py +247 -0
  422. synkit/Graph/Matcher/graph_cluster.py +191 -0
  423. synkit/Graph/Matcher/graph_matcher.py +312 -0
  424. synkit/Graph/Matcher/graph_morphism.py +421 -0
  425. synkit/Graph/Matcher/mcs_matcher.py +804 -0
  426. synkit/Graph/Matcher/multi_turbo_iso.py +186 -0
  427. synkit/Graph/Matcher/orbit.py +284 -0
  428. synkit/Graph/Matcher/partial_matcher.py +694 -0
  429. synkit/Graph/Matcher/sing.py +544 -0
  430. synkit/Graph/Matcher/subgraph_matcher.py +812 -0
  431. synkit/Graph/Matcher/turbo_iso.py +272 -0
  432. synkit/Graph/Matcher/wl_sel.py +537 -0
  433. synkit/Graph/Mech/__init__.py +26 -0
  434. synkit/Graph/Mech/conversion.py +1466 -0
  435. synkit/Graph/Mech/conversion_debug.py +237 -0
  436. synkit/Graph/Mech/electron_accounting.py +200 -0
  437. synkit/Graph/Mech/lwg_editor.py +406 -0
  438. synkit/Graph/Mech/lwg_ops.py +313 -0
  439. synkit/Graph/Morphism/__init__.py +99 -0
  440. synkit/Graph/Morphism/constraints.py +460 -0
  441. synkit/Graph/Morphism/llg.py +999 -0
  442. synkit/Graph/Morphism/morphism.py +349 -0
  443. synkit/Graph/Morphism/stereo.py +258 -0
  444. synkit/Graph/Morphism/stereo_morphism.py +383 -0
  445. synkit/Graph/Morphism/stereo_morphism_helpers.py +957 -0
  446. synkit/Graph/Morphism/stereo_morphism_types.py +117 -0
  447. synkit/Graph/Stereo/__init__.py +376 -0
  448. synkit/Graph/Stereo/_descriptor_core.py +207 -0
  449. synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
  450. synkit/Graph/Stereo/canonical.py +648 -0
  451. synkit/Graph/Stereo/changes.py +964 -0
  452. synkit/Graph/Stereo/composition.py +391 -0
  453. synkit/Graph/Stereo/configured.py +946 -0
  454. synkit/Graph/Stereo/couplings.py +245 -0
  455. synkit/Graph/Stereo/descriptors.py +1030 -0
  456. synkit/Graph/Stereo/enumeration.py +597 -0
  457. synkit/Graph/Stereo/extended_descriptors.py +406 -0
  458. synkit/Graph/Stereo/global_configured.py +152 -0
  459. synkit/Graph/Stereo/global_stereo.py +304 -0
  460. synkit/Graph/Stereo/identity.py +648 -0
  461. synkit/Graph/Stereo/interchange.py +496 -0
  462. synkit/Graph/Stereo/legacy.py +460 -0
  463. synkit/Graph/Stereo/matching.py +899 -0
  464. synkit/Graph/Stereo/native.py +154 -0
  465. synkit/Graph/Stereo/orbits.py +668 -0
  466. synkit/Graph/Stereo/outcomes.py +99 -0
  467. synkit/Graph/Stereo/pairwise.py +350 -0
  468. synkit/Graph/Stereo/rdkit_adapter.py +662 -0
  469. synkit/Graph/Stereo/rdkit_identity.py +118 -0
  470. synkit/Graph/Stereo/rdkit_resonance.py +140 -0
  471. synkit/Graph/Stereo/reaction_interchange.py +266 -0
  472. synkit/Graph/Stereo/semantics.py +296 -0
  473. synkit/Graph/Stereo/supports.py +257 -0
  474. synkit/Graph/Stereo/wire.py +339 -0
  475. synkit/Graph/Wildcard/__init__.py +0 -0
  476. synkit/Graph/Wildcard/fuse_graph.py +156 -0
  477. synkit/Graph/Wildcard/graph_wc.py +303 -0
  478. synkit/Graph/Wildcard/its_merge.py +857 -0
  479. synkit/Graph/Wildcard/radwc.py +114 -0
  480. synkit/Graph/Wildcard/wc_matcher.py +576 -0
  481. synkit/Graph/Wildcard/wildcard.py +225 -0
  482. synkit/Graph/__init__.py +17 -0
  483. synkit/Graph/canon_graph.py +14 -0
  484. synkit/Graph/syn_graph.py +199 -0
  485. synkit/Graph/utils.py +324 -0
  486. synkit/IO/__init__.py +4 -0
  487. synkit/IO/chem_converter.py +1059 -0
  488. synkit/IO/combinatorial/__init__.py +8 -0
  489. synkit/IO/combinatorial/gml_to_graph.py +223 -0
  490. synkit/IO/combinatorial/graph_to_gml.py +280 -0
  491. synkit/IO/combinatorial/graph_to_smarts.py +186 -0
  492. synkit/IO/combinatorial/smarts_expander.py +147 -0
  493. synkit/IO/combinatorial/smarts_generalizer.py +133 -0
  494. synkit/IO/combinatorial/smarts_to_graph.py +179 -0
  495. synkit/IO/conversion.py +42 -0
  496. synkit/IO/data_io.py +269 -0
  497. synkit/IO/data_process.py +143 -0
  498. synkit/IO/debug.py +73 -0
  499. synkit/IO/gml_to_nx.py +150 -0
  500. synkit/IO/graph_to_mol.py +199 -0
  501. synkit/IO/mol_to_graph.py +1105 -0
  502. synkit/IO/mol_to_graph_chemistry.py +545 -0
  503. synkit/IO/nx_to_gml.py +209 -0
  504. synkit/IO/smiles_to_id.py +123 -0
  505. synkit/Mechanism/__init__.py +151 -0
  506. synkit/Mechanism/adapters.py +136 -0
  507. synkit/Mechanism/audit.py +323 -0
  508. synkit/Mechanism/benchmark.py +638 -0
  509. synkit/Mechanism/compatibility.py +13 -0
  510. synkit/Mechanism/drawing.py +85 -0
  511. synkit/Mechanism/electron_models.py +725 -0
  512. synkit/Mechanism/equivalence.py +521 -0
  513. synkit/Mechanism/evidence.py +262 -0
  514. synkit/Mechanism/interchange.py +141 -0
  515. synkit/Mechanism/model.py +918 -0
  516. synkit/Mechanism/neighbor_stereo.py +312 -0
  517. synkit/Mechanism/radical_data.py +740 -0
  518. synkit/Mechanism/replay.py +986 -0
  519. synkit/Mechanism/schema.py +264 -0
  520. synkit/Mechanism/stereo_state.py +416 -0
  521. synkit/Mechanism/symbols.py +91 -0
  522. synkit/Rule/Apply/__init__.py +35 -0
  523. synkit/Rule/Apply/conditions.py +45 -0
  524. synkit/Rule/Apply/dpo.py +998 -0
  525. synkit/Rule/Apply/rule_matcher.py +218 -0
  526. synkit/Rule/Apply/validation.py +354 -0
  527. synkit/Rule/Compose/__init__.py +106 -0
  528. synkit/Rule/Compose/_identity.py +43 -0
  529. synkit/Rule/Compose/composition.py +976 -0
  530. synkit/Rule/Compose/laws.py +439 -0
  531. synkit/Rule/Compose/search.py +771 -0
  532. synkit/Rule/Compose/synrule.py +170 -0
  533. synkit/Rule/Modify/__init__.py +0 -0
  534. synkit/Rule/Modify/implict_rule.py +56 -0
  535. synkit/Rule/Modify/longest_path.py +92 -0
  536. synkit/Rule/Modify/molecule_rule.py +115 -0
  537. synkit/Rule/Modify/prune_templates.py +78 -0
  538. synkit/Rule/Modify/rule_utils.py +194 -0
  539. synkit/Rule/Modify/strip_rule.py +97 -0
  540. synkit/Rule/__init__.py +28 -0
  541. synkit/Rule/generic_stereo.py +884 -0
  542. synkit/Rule/stereo_identity.py +271 -0
  543. synkit/Rule/syn_rule.py +1090 -0
  544. synkit/Synthesis/MSR/__init__.py +0 -0
  545. synkit/Synthesis/MSR/path_finder.py +239 -0
  546. synkit/Synthesis/Metrics/__init__.py +0 -0
  547. synkit/Synthesis/Metrics/_base.py +52 -0
  548. synkit/Synthesis/Metrics/_plot.py +129 -0
  549. synkit/Synthesis/Metrics/_ranking.py +179 -0
  550. synkit/Synthesis/RBL/__init__.py +80 -0
  551. synkit/Synthesis/RBL/engine.py +1249 -0
  552. synkit/Synthesis/RBL/matching.py +652 -0
  553. synkit/Synthesis/RBL/overlap.py +336 -0
  554. synkit/Synthesis/RBL/pipeline.py +376 -0
  555. synkit/Synthesis/RBL/policy.py +139 -0
  556. synkit/Synthesis/RBL/proof.py +370 -0
  557. synkit/Synthesis/RBL/reaction.py +506 -0
  558. synkit/Synthesis/RBL/state.py +169 -0
  559. synkit/Synthesis/RBL/validation.py +1060 -0
  560. synkit/Synthesis/Reactor/__init__.py +60 -0
  561. synkit/Synthesis/Reactor/core/__init__.py +1 -0
  562. synkit/Synthesis/Reactor/core/engine.py +967 -0
  563. synkit/Synthesis/Reactor/core/product.py +621 -0
  564. synkit/Synthesis/Reactor/core/rewrite.py +561 -0
  565. synkit/Synthesis/Reactor/core/strategy.py +44 -0
  566. synkit/Synthesis/Reactor/matching/__init__.py +1 -0
  567. synkit/Synthesis/Reactor/matching/mixin.py +920 -0
  568. synkit/Synthesis/Reactor/matching/policy.py +345 -0
  569. synkit/Synthesis/Reactor/matching/symmetry.py +309 -0
  570. synkit/Synthesis/Reactor/output/__init__.py +1 -0
  571. synkit/Synthesis/Reactor/output/deduplication.py +703 -0
  572. synkit/Synthesis/Reactor/output/policy.py +16 -0
  573. synkit/Synthesis/Reactor/output/serialization.py +485 -0
  574. synkit/Synthesis/Reactor/output/structural.py +893 -0
  575. synkit/Synthesis/Reactor/stereo/__init__.py +1 -0
  576. synkit/Synthesis/Reactor/stereo/assignment.py +35 -0
  577. synkit/Synthesis/Reactor/stereo/mixin.py +780 -0
  578. synkit/Synthesis/Reactor/variants/__init__.py +1 -0
  579. synkit/Synthesis/Reactor/variants/imbalanced.py +180 -0
  580. synkit/Synthesis/Reactor/variants/partial.py +84 -0
  581. synkit/Synthesis/Reactor/workflow/__init__.py +1 -0
  582. synkit/Synthesis/Reactor/workflow/batch.py +550 -0
  583. synkit/Synthesis/Reactor/workflow/benchmark.py +143 -0
  584. synkit/Synthesis/Reactor/workflow/postprocess.py +267 -0
  585. synkit/Synthesis/Reactor/workflow/rule_filter.py +210 -0
  586. synkit/Synthesis/__init__.py +0 -0
  587. synkit/Synthesis/reactor_utils.py +316 -0
  588. synkit/Utils/__init__.py +0 -0
  589. synkit/Utils/utils.py +172 -0
  590. synkit/Vis/__init__.py +91 -0
  591. synkit/Vis/crn/__init__.py +40 -0
  592. synkit/Vis/epd/__init__.py +20 -0
  593. synkit/Vis/epd/arrows.py +425 -0
  594. synkit/Vis/epd/chem.py +197 -0
  595. synkit/Vis/epd/constants.py +83 -0
  596. synkit/Vis/epd/layout.py +283 -0
  597. synkit/Vis/epd/mapping.py +51 -0
  598. synkit/Vis/epd/models.py +136 -0
  599. synkit/Vis/epd/render.py +543 -0
  600. synkit/Vis/epd/utils.py +108 -0
  601. synkit/Vis/epd/visualizer.py +811 -0
  602. synkit/Vis/graph_visualizer.py +375 -0
  603. synkit/Vis/its/__init__.py +19 -0
  604. synkit/Vis/its/drawer.py +615 -0
  605. synkit/Vis/its_drawer.py +35 -0
  606. synkit/Vis/molecule/__init__.py +31 -0
  607. synkit/Vis/molecule/drawer.py +563 -0
  608. synkit/Vis/molecule/reaction.py +285 -0
  609. synkit/Vis/molecule_drawer.py +33 -0
  610. synkit/Vis/mtg/__init__.py +17 -0
  611. synkit/Vis/mtg/drawer.py +769 -0
  612. synkit/Vis/mtg_drawer.py +34 -0
  613. synkit/Vis/pdf_writer.py +146 -0
  614. synkit/Vis/reaction/__init__.py +19 -0
  615. synkit/Vis/reaction/rule.py +141 -0
  616. synkit/Vis/reaction/rxn.py +532 -0
  617. synkit/Vis/reaction_drawer.py +41 -0
  618. synkit/Vis/space/__init__.py +17 -0
  619. synkit/Vis/space/chemical.py +80 -0
  620. synkit/Vis/space/embedding.py +87 -0
  621. synkit/Vis/vis_synedu/Vis/__init__.py +7 -0
  622. synkit/Vis/vis_synedu/Vis/dpo.py +862 -0
  623. synkit/Vis/vis_synedu/rxn_vis.py +377 -0
  624. synkit/Vis/vis_synedu/vis.py +501 -0
  625. synkit/Vis/visual_drawer.py +215 -0
  626. synkit/Vis/visual_model.py +520 -0
  627. synkit/__init__.py +3 -0
  628. synkit/_native.py +91 -0
  629. synkit/examples.py +50 -0
  630. synkit/version.py +23 -0
  631. synkit-1.6.5.dist-info/METADATA +156 -0
  632. synkit-1.6.5.dist-info/RECORD +636 -0
  633. synkit-1.6.5.dist-info/WHEEL +4 -0
  634. synkit-1.6.5.dist-info/licenses/LICENSE +21 -0
  635. synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
  636. synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
@@ -0,0 +1,316 @@
1
+ from typing import List
2
+ from collections import Counter
3
+ from synkit.Chem.Reaction.standardize import Standardize
4
+ from synkit.Graph.Matcher.graph_cluster import GraphCluster
5
+ from synkit.IO.chem_converter import rsmi_to_its, gml_to_smart
6
+
7
+
8
+ def _get_unique_aam(list_aam: list) -> list:
9
+ """Retrieves the unique atom-atom mappings (AAM) by clustering a list of
10
+ ITS graphs.
11
+
12
+ This function first converts each item in the provided list of AAM strings to an ITS graph
13
+ using the `rsmi_to_its` function. Then, it performs iterative clustering of the ITS graphs
14
+ based on matching nodes and edges, returning a list of unique AAMs based on the clustering results.
15
+
16
+ :param list_aam: A list of AAM strings that will be converted to ITS graphs and clustered.
17
+ :type list_aam: list
18
+
19
+ :return: A list of unique AAMs based on the iterative clustering process.
20
+ :rtype: list
21
+
22
+ :raises Exception: If an error occurs during the conversion or clustering process, an exception is raised.
23
+ """
24
+ its_list = [rsmi_to_its(i) for i in list_aam]
25
+
26
+ cluster = GraphCluster()
27
+
28
+ cls, _ = cluster.iterative_cluster(
29
+ its_list,
30
+ attributes=None,
31
+ nodeMatch=cluster.nodeMatch,
32
+ edgeMatch=cluster.edgeMatch,
33
+ )
34
+ unique = []
35
+ for subset in cls:
36
+ unique.append(list_aam[list(subset)[0]])
37
+ return unique
38
+
39
+
40
+ def _get_connected_subgraphs(gml: str, invert: bool = False):
41
+ """Given a GML string, this function returns the number of connected
42
+ subgraphs based on the 'smart' representation split or a list of subgraphs,
43
+ depending on the invert flag.
44
+
45
+ :param gml: GML string to convert to SMARTS.
46
+ :type gml: str
47
+ :param invert: Count product components instead of reactant components.
48
+ :type invert: bool
49
+ :return: Number of connected components on the selected reaction side.
50
+ :rtype: int
51
+ :raises ValueError: If ``gml`` is empty or lacks the ``>>`` delimiter.
52
+ """
53
+ # Validate GML input (ensure it's a valid non-empty string)
54
+ if not isinstance(gml, str) or not gml.strip():
55
+ raise ValueError("Invalid GML string provided.")
56
+
57
+ # Convert GML to 'smart' representation
58
+ smart = gml_to_smart(gml, sanitize=False)
59
+
60
+ # Split the 'smart' string by the delimiter '>>' to get the left (r) and right (p) parts
61
+ try:
62
+ left_part, right_part = smart.split(">>")
63
+ except ValueError:
64
+ raise ValueError("GML string does not contain the expected '>>' delimiter.")
65
+
66
+ # Handle the result based on the invert flag
67
+ if invert:
68
+ # Return the count of subgraphs in the right part (p)
69
+ return len(right_part.split("."))
70
+ else:
71
+ # Return a list of subgraphs from the left part (r)
72
+ return len(left_part.split("."))
73
+
74
+
75
+ def _get_reagent(original_smiles: list, output_rsmi: str, invert: bool = False):
76
+ """Identifies reagents present in the original SMILES list that are absent
77
+ in the processed output SMILES string.
78
+
79
+ :param original_smiles: list of SMILES strings representing the original reagents.
80
+ :param output_rsmi: SMILES string of the reaction, which is standardized and split to obtain new SMILES strings.
81
+ :param invert: bool, flag to choose between reactants or products for comparison.
82
+
83
+ :return: List of SMILES strings found in original but not in the new list.
84
+ """
85
+ output_rsmi = Standardize().fit(output_rsmi)
86
+ reactants, products = output_rsmi.split(">>")
87
+ smiles = products.split(".") if invert else reactants.split(".")
88
+
89
+ # Use Counter to find differences
90
+ original_count = Counter(original_smiles)
91
+ new_count = Counter(smiles)
92
+ reagent_difference = (
93
+ original_count - new_count
94
+ ) # Subtract counts to find unique in original
95
+
96
+ # Extract unique reagents
97
+ unique_reagents = list(reagent_difference.elements())
98
+
99
+ return unique_reagents
100
+
101
+
102
+ def _get_reagent_rsmi(rsmi: str) -> List[str]:
103
+ """Identifies reagents that appear in both the reactant and product sides
104
+ of a reaction SMILES string, suggesting these elements are unchanged by the
105
+ chemical reaction.
106
+
107
+ :param rsmi: A reaction SMILES string formatted as "reactants>>products".
108
+ :type rsmi: str
109
+
110
+ :return: A list of unique reagents that appear on both sides of the reaction, unchanged.
111
+ :rtype: List[str]
112
+ """
113
+ # Standardize the input reaction SMILES
114
+ rsmi = Standardize().fit(rsmi)
115
+
116
+ # Splitting the standardized rSMI into reactants and products
117
+ reactants, products = rsmi.split(">>")
118
+ reactants = reactants.split(".")
119
+ products = products.split(".")
120
+
121
+ # Count occurrences of each molecule in reactants and products
122
+ reactants_count = Counter(reactants)
123
+ products_count = Counter(products)
124
+
125
+ # Find common elements in reactants and products
126
+ common_elements = reactants_count & products_count # Use intersection
127
+
128
+ # Extract and return the unique reagents that are common
129
+ unique_reagents = list(common_elements.elements())
130
+
131
+ return unique_reagents
132
+
133
+
134
+ def _remove_reagent(rsmi: str) -> str:
135
+ """Removes common molecules from the reactants and products in a SMILES
136
+ reaction string.
137
+
138
+ This function identifies the molecules that appear on both sides of the reaction
139
+ (reactants and products) and removes one occurrence of each common molecule from
140
+ both sides.
141
+
142
+ :param rsmi: A SMILES string representing a chemical reaction in the form:
143
+ 'reactant1.reactant2...>>product1.product2...'
144
+ :type rsmi: str
145
+
146
+ :return: Reaction SMILES with common molecules removed from both sides.
147
+
148
+ Example: >>> remove_reagent_from_smiles('CC=O.CC=O.CCC=O>>CC=CO.CC=O.CC=O') 'CCC=O>>CC=CO'
149
+ :rtype: str
150
+ """
151
+
152
+ # Split the input SMILES string into reactants and products
153
+ reactants, products = rsmi.split(">>")
154
+
155
+ # Split the reactants and products by '.' to separate molecules
156
+ reactant_molecules = reactants.split(".")
157
+ product_molecules = products.split(".")
158
+
159
+ # Count the occurrences of each molecule in reactants and products
160
+ reactant_count = Counter(reactant_molecules)
161
+ product_count = Counter(product_molecules)
162
+
163
+ # Find common molecules between reactants and products
164
+ common_molecules = set(reactant_count) & set(product_count)
165
+
166
+ # Remove common molecules by the minimum occurrences in both reactants and products
167
+ for molecule in common_molecules:
168
+ common_occurrences = min(reactant_count[molecule], product_count[molecule])
169
+
170
+ # Decrease the count by the common occurrences
171
+ reactant_count[molecule] -= common_occurrences
172
+ product_count[molecule] -= common_occurrences
173
+
174
+ # Rebuild the lists of reactant and product molecules after removal
175
+ filtered_reactant_molecules = [
176
+ molecule for molecule, count in reactant_count.items() for _ in range(count)
177
+ ]
178
+ filtered_product_molecules = [
179
+ molecule for molecule, count in product_count.items() for _ in range(count)
180
+ ]
181
+
182
+ # Join the remaining molecules back into SMILES strings
183
+ new_reactants = ".".join(filtered_reactant_molecules)
184
+ new_products = ".".join(filtered_product_molecules)
185
+
186
+ # Return the updated reaction string
187
+ return f"{new_reactants}>>{new_products}"
188
+
189
+
190
+ def _add_reagent(rsmi: str, reagents: list):
191
+ """Modifies the SMILES representation of a reaction by adding additional
192
+ reagents.
193
+
194
+ :param rsmi: str, the SMILES reaction string, expected to contain '>>' separating reactants and products.
195
+ :param reagents: list, a list of reagent SMILES strings to be added.
196
+
197
+ :return: a new SMILES string with reagents added to both reactants and products.
198
+ :rtype: str
199
+ """
200
+ if not reagents:
201
+ return rsmi # Return original if no reagents are added
202
+
203
+ try:
204
+ reactants, products = rsmi.split(">>")
205
+ except ValueError:
206
+ raise ValueError("Input SMILES string does not contain '>>'")
207
+
208
+ # Prepare the reagents string only once
209
+ reagents_string = ".".join(reagents)
210
+
211
+ # Incorporate reagents into both reactants and products
212
+ modified_reactants = (
213
+ f"{reactants}.{reagents_string}" if reactants else reagents_string
214
+ )
215
+ modified_products = f"{products}.{reagents_string}" if products else reagents_string
216
+
217
+ return f"{modified_reactants}>>{modified_products}"
218
+
219
+
220
+ def _calculate_max_depth(reaction_tree, current_node=None, depth=0):
221
+ """Calculate the maximum depth of a reaction tree.
222
+
223
+ :param reaction_tree: A dictionary where keys are reaction SMILES (RSMI)
224
+ and values are lists of product reactions.
225
+ :type reaction_tree: dict
226
+ :param current_node: The current node in the tree being explored (reaction SMILES).
227
+ :type current_node: str
228
+ :param depth: The current depth of the tree.
229
+ :type depth: int
230
+
231
+ :return: The maximum depth of the tree.
232
+ :rtype: int
233
+ """
234
+ # If current_node is None, start from the root node (first key in the reaction tree)
235
+ if current_node is None:
236
+ current_node = list(reaction_tree.keys())[0]
237
+
238
+ # Get the products of the current node (reaction)
239
+ products = reaction_tree.get(current_node, [])
240
+
241
+ # If no products, we are at a leaf node, return the current depth
242
+ if not products:
243
+ return depth
244
+
245
+ # Recursively calculate the depth for each product and return the maximum
246
+ max_subtree_depth = max(
247
+ _calculate_max_depth(reaction_tree, product, depth + 1) for product in products
248
+ )
249
+ return max_subtree_depth
250
+
251
+
252
+ def _find_all_paths(
253
+ reaction_tree,
254
+ target_products,
255
+ current_node,
256
+ target_depth,
257
+ current_depth=0,
258
+ path=None,
259
+ ):
260
+ """Recursively find all paths from the root to the maximum depth in the
261
+ reaction tree.
262
+
263
+ :param reaction_tree: A dictionary of reaction SMILES with products.
264
+ :type reaction_tree: dict
265
+ :param current_node: The current node (reaction SMILES).
266
+ :type current_node: str
267
+ :param target_depth: The depth at which the product matches the root's product.
268
+ :type target_depth: int
269
+ :param current_depth: The current depth of the search.
270
+ :type current_depth: int
271
+ :param path: The current path in the tree.
272
+ :type path: list
273
+
274
+ :return: List of all paths to the max depth.
275
+ """
276
+ if path is None:
277
+ path = []
278
+
279
+ # Add the current node (reaction SMILES) to the path
280
+ path.append(current_node)
281
+
282
+ # If we have reached the target depth, check the product
283
+ if current_depth == target_depth:
284
+ # Extract products of the current node
285
+ current_products = sorted(
286
+ current_node.split(">>")[1].split("."), key=len
287
+ ) # Sort by length of SMILES
288
+ largest_current_product = current_products[-1] if current_products else None
289
+
290
+ # Process target_products to get the largest product
291
+
292
+ sorted_target_products = sorted(
293
+ target_products, key=len
294
+ ) # target_products should be a string here
295
+
296
+ largest_target_product = (
297
+ sorted_target_products[-1] if sorted_target_products else None
298
+ )
299
+
300
+ # Compare the largest elements
301
+ return [path] if largest_current_product == largest_target_product else []
302
+
303
+ # If we haven't reached the target depth, recurse on the products
304
+ paths = []
305
+ for product in reaction_tree.get(current_node, []):
306
+ paths.extend(
307
+ _find_all_paths(
308
+ reaction_tree,
309
+ target_products,
310
+ product,
311
+ target_depth,
312
+ current_depth + 1,
313
+ path.copy(),
314
+ )
315
+ )
316
+ return paths
File without changes
synkit/Utils/utils.py ADDED
@@ -0,0 +1,172 @@
1
+ import random
2
+ from typing import Dict, List, Optional
3
+ from datetime import datetime
4
+ import networkx as nx
5
+ from typing import Iterable
6
+
7
+
8
+ def stratified_random_sample(
9
+ data: List[Dict[str, any]],
10
+ property_key: str,
11
+ samples_per_class: int = 1,
12
+ seed: Optional[int] = 42,
13
+ bypass: bool = False,
14
+ ) -> List[Dict[str, any]]:
15
+ """Stratifies and samples data from a list of dictionaries based on a
16
+ specified property key.
17
+
18
+ :param data: The data to sample from, a list of dictionaries.
19
+ :type data: List[Dict[str, any]]
20
+ :param property_key: The key in the dictionaries to stratify by.
21
+ :type property_key: str
22
+ :param samples_per_class: The number of samples to take from each class.
23
+ Defaults to 1.
24
+ :type samples_per_class: int
25
+ :param seed: The seed for the random number generator
26
+ for reproducibility. Defaults to 42.
27
+ :type seed: Optional[int], optional
28
+ :param bypass: If True, classes with fewer than
29
+ `samples_per_class` entries will be skipped without raising an error.
30
+ Defaults to False.
31
+ :type bypass: bool, optional
32
+
33
+ :return: A list of sampled dictionaries, where each entry corresponds to a sampled item.
34
+ :rtype: List[Dict[str, any]]
35
+
36
+ :raises ValueError: If a class has fewer than `samples_per_class` entries and `bypass` is False.
37
+ """
38
+
39
+ if seed is not None:
40
+ random.seed(seed)
41
+
42
+ stratified_data = {}
43
+ for item in data:
44
+ key = item.get(property_key)
45
+ if key is None:
46
+ continue # Exclude data items where the specified key is not present
47
+ if key in stratified_data:
48
+ stratified_data[key].append(item)
49
+ else:
50
+ stratified_data[key] = [item]
51
+
52
+ sampled_data = []
53
+ for key, items in stratified_data.items():
54
+ class_size = len(items)
55
+ if class_size >= samples_per_class:
56
+ sampled_data.extend(random.sample(items, samples_per_class))
57
+ elif bypass:
58
+ continue # Skip this group entirely if not enough data and bypass is True
59
+ else:
60
+ raise ValueError(
61
+ f"Not enough data to sample {samples_per_class} items for class '{key}', "
62
+ f"only {class_size} available."
63
+ )
64
+
65
+ return sampled_data
66
+
67
+
68
+ def calculate_processing_time(start_time_str: str, end_time_str: str) -> float:
69
+ """Calculates the processing time in seconds between two timestamps.
70
+
71
+ :param start_time_str: A string representing the start time in the format
72
+ 'YYYY-MM-DD HH:MM:SS,fff'.
73
+ :type start_time_str: str
74
+ :param end_time_str: A string representing the end time in the same format as
75
+ start_time_str.
76
+ :type end_time_str: str
77
+
78
+ :return: The duration between the start and end time in seconds.
79
+ :rtype: float
80
+
81
+ :raises ValueError: If the input strings do not match the expected format.
82
+ """
83
+ datetime_format = "%Y-%m-%d %H:%M:%S,%f"
84
+
85
+ start_time = datetime.strptime(start_time_str, datetime_format)
86
+ end_time = datetime.strptime(end_time_str, datetime_format)
87
+
88
+ duration = end_time - start_time
89
+
90
+ return duration.total_seconds()
91
+
92
+
93
+ def remove_explicit_hydrogen(
94
+ Graph: nx.Graph, excluded_indices: Iterable[int]
95
+ ) -> nx.Graph:
96
+ """Processes a molecular graph by calculating hydrogen count ('h_count')
97
+ for each node and removing hydrogen nodes that are not specified in the
98
+ excluded indices.
99
+
100
+ :param Graph: The input graph with nodes expected to have an 'element' attribute.
101
+ :type Graph: nx.Graph
102
+ :param excluded_indices: Indices of hydrogen nodes to be preserved and excluded from 'h_count' calculations.
103
+ :type excluded_indices: Iterable[int]
104
+
105
+ :return: The modified graph where each node has an 'h_count' attribute indicating the count
106
+ of hydrogen neighbors, and specific hydrogens have been removed unless listed in
107
+ excluded_indices.
108
+ :rtype: nx.Graph
109
+
110
+ .. rubric:: Notes
111
+
112
+ This function operates on a copy of the input graph and does not alter the original.
113
+ """
114
+ G = Graph.copy()
115
+
116
+ # Calculate h_count for each node
117
+ for node in list(G.nodes):
118
+ h_count = 0
119
+ for neighbor in G.neighbors(node):
120
+ if (
121
+ G.nodes[neighbor].get("element") == "H"
122
+ and neighbor not in excluded_indices
123
+ ):
124
+ h_count += 1
125
+ G.nodes[node]["hcount"] = h_count
126
+
127
+ # Remove hydrogen nodes not in excluded indices
128
+ nodes_to_remove = [
129
+ n
130
+ for n in G.nodes
131
+ if G.nodes[n].get("element") == "H" and n not in excluded_indices
132
+ ]
133
+ G.remove_nodes_from(nodes_to_remove)
134
+
135
+ return G
136
+
137
+
138
+ def fix_implicit_hydrogen(Graph: nx.Graph, indices: Iterable[int]) -> nx.Graph:
139
+ """Adjusts the 'h_count' attribute of specific nodes in a molecular graph,
140
+ decreasing it based on the presence of neighboring hydrogen atoms that are
141
+ also included in the specified indices. This function works on a copy of
142
+ the provided graph and returns the modified copy.
143
+
144
+ :param Graph: Graph whose nodes contain ``element`` and optionally
145
+ ``hcount`` attributes.
146
+ :type Graph: nx.Graph
147
+ :param indices: Nodes whose neighboring explicit hydrogens should reduce
148
+ their implicit hydrogen count.
149
+ :type indices: Iterable[int]
150
+ :return: Graph copy with adjusted ``hcount`` values.
151
+ :rtype: nx.Graph
152
+
153
+ .. rubric:: Notes
154
+
155
+ Ensure the 'hcount' exists and is appropriately structured before using this
156
+ function. It is assumed that 'hcount' is a mutable integer that can be directly
157
+ decremented.
158
+ """
159
+ G = Graph.copy() # Work on a copy of the graph to preserve the original
160
+ valid_indices = set(indices).intersection(
161
+ G.nodes
162
+ ) # Ensure node indices exist in the graph
163
+
164
+ for node in valid_indices:
165
+ if "hcount" in G.nodes[node]: # Ensure the node has an 'h_count' to modify
166
+ for neighbor in G.neighbors(node):
167
+ # Check if neighbor is hydrogen and also in indices
168
+ if G.nodes[neighbor].get("element") == "H" and neighbor in indices:
169
+ if G.nodes[node].get("element") != "H":
170
+ G.nodes[node]["hcount"] -= 1
171
+
172
+ return G
synkit/Vis/__init__.py ADDED
@@ -0,0 +1,91 @@
1
+ """Visualization APIs.
2
+
3
+ The preferred domain namespaces are:
4
+
5
+ * :mod:`synkit.Vis.molecule` for molecule and reaction graph panels.
6
+ * :mod:`synkit.Vis.its` for ITS visualizations.
7
+ * :mod:`synkit.Vis.mtg` for MTG timeline and step visualizations.
8
+ * :mod:`synkit.Vis.epd` for electron-pushing diagrams.
9
+ * :mod:`synkit.Vis.reaction` for RDKit reaction and rule images.
10
+ * :mod:`synkit.Vis.space` for chemical-space plots and embeddings.
11
+ * :mod:`synkit.Vis.crn` for chemical reaction network visualizations.
12
+
13
+ Flat imports from :mod:`synkit.Vis` remain supported for the public drawing
14
+ functions exported below.
15
+ """
16
+
17
+ from .graph_visualizer import GraphVisualizer
18
+ from .reaction import RXNVis, RuleVis
19
+ from .space import Embedding, adjust_legend_handles, scatter_plot
20
+ from .crn import CRNStyle, CRNVis, draw_crn
21
+ from .visual_model import (
22
+ VisualEdge,
23
+ VisualGraph,
24
+ VisualKind,
25
+ VisualNode,
26
+ detect_visual_kind,
27
+ iter_changed_edges,
28
+ iter_changed_nodes,
29
+ summarize_visual_graph,
30
+ to_visual_graph,
31
+ )
32
+ from .visual_drawer import draw_graph
33
+ from .molecule import draw_molecule_graph
34
+ from .molecule import (
35
+ ReactionHighlights,
36
+ draw_reaction_graph,
37
+ draw_reaction_graphs,
38
+ find_reaction_highlights,
39
+ )
40
+ from .its import draw_its_from_rsmi, draw_its_graph, draw_its_only
41
+ from .mtg import draw_mtg_graph, draw_mtg_steps
42
+ from .epd import (
43
+ MechanismVisualizer,
44
+ Transition,
45
+ transition_from_epd_step,
46
+ transitions_from_epd,
47
+ )
48
+ from . import crn, epd, its, molecule, mtg, reaction, space
49
+
50
+ __all__ = [
51
+ "GraphVisualizer",
52
+ "RuleVis",
53
+ "RXNVis",
54
+ "Embedding",
55
+ "CRNStyle",
56
+ "CRNVis",
57
+ "draw_crn",
58
+ "VisualEdge",
59
+ "VisualGraph",
60
+ "VisualKind",
61
+ "VisualNode",
62
+ "detect_visual_kind",
63
+ "iter_changed_edges",
64
+ "iter_changed_nodes",
65
+ "summarize_visual_graph",
66
+ "to_visual_graph",
67
+ "draw_graph",
68
+ "draw_molecule_graph",
69
+ "ReactionHighlights",
70
+ "draw_reaction_graph",
71
+ "draw_reaction_graphs",
72
+ "find_reaction_highlights",
73
+ "draw_its_from_rsmi",
74
+ "draw_its_graph",
75
+ "draw_its_only",
76
+ "draw_mtg_graph",
77
+ "draw_mtg_steps",
78
+ "MechanismVisualizer",
79
+ "Transition",
80
+ "transition_from_epd_step",
81
+ "transitions_from_epd",
82
+ "scatter_plot",
83
+ "adjust_legend_handles",
84
+ "molecule",
85
+ "its",
86
+ "mtg",
87
+ "epd",
88
+ "reaction",
89
+ "space",
90
+ "crn",
91
+ ]
@@ -0,0 +1,40 @@
1
+ """Chemical reaction network visualization namespace.
2
+
3
+ This namespace re-exports :mod:`synkit.CRN.Visualize`, which is the single CRN
4
+ visualizer in SynKit. It draws the species--reaction bipartite graph of a
5
+ :class:`~synkit.CRN.Structure.syncrn.SynCRN` (or any equivalent NetworkX
6
+ digraph) with layered layout, palettes and highlighting.
7
+
8
+ .. rubric:: Example
9
+
10
+ .. code-block:: python
11
+
12
+ from synkit.CRN import SynCRN
13
+ from synkit.Vis.crn import draw_crn
14
+
15
+ draw_crn(SynCRN.from_reaction_strings(["A>>B", "B>>C"]).to_digraph())
16
+
17
+ .. rubric:: Removed
18
+
19
+ ``CRNVisualizer`` has been removed. It plotted the ``dev_crn`` hypergraph
20
+ object, which no longer exists in the package, so every call raised
21
+ ``AttributeError``. Use :class:`~synkit.CRN.Visualize.vis.CRNVis` instead.
22
+ """
23
+
24
+ from synkit.CRN.Visualize import (
25
+ ColorPalette,
26
+ CRNStyle,
27
+ CRNVis,
28
+ draw_crn,
29
+ get_palette,
30
+ palette_names,
31
+ )
32
+
33
+ __all__ = [
34
+ "CRNStyle",
35
+ "CRNVis",
36
+ "ColorPalette",
37
+ "draw_crn",
38
+ "get_palette",
39
+ "palette_names",
40
+ ]
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ """Visualization submodule for mechanism trajectories.
4
+
5
+ Main entry points
6
+ -----------------
7
+ - :class:`MechanismVisualizer`
8
+ - :class:`Transition`
9
+ - :func:`transitions_from_epd`
10
+ """
11
+
12
+ from .models import Transition, transition_from_epd_step, transitions_from_epd
13
+ from .visualizer import MechanismVisualizer
14
+
15
+ __all__ = [
16
+ "MechanismVisualizer",
17
+ "Transition",
18
+ "transition_from_epd_step",
19
+ "transitions_from_epd",
20
+ ]