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,255 @@
1
+ """
2
+ synkit.Chem.Mapper
3
+ ==================
4
+
5
+ Atom-to-atom mapping offers several explicit workflows:
6
+
7
+ * Platform wheels include the shared C++ PABS–SLAP core. Custom builds use
8
+ ``_native.build.build_mapper_native``. The
9
+ ``map_reaction_implicit`` interface scores heavy-atom classes
10
+ with minimum implicit-H Lewis completion, without expanding hydrogen.
11
+ Optional OR-Tools builds add checked integer LP bounds; floating solver
12
+ status and heuristic proposals never establish optimality on their own.
13
+ * ``Mapper(method='propagate').map(...)`` provides one interface and result
14
+ type for eight named methods. ``Mapper.methods()`` lists their names.
15
+ * ``map_reaction(...)`` defaults to full-space Python exact propagation search.
16
+ ``backend='cpp'`` selects the optional compiled minimum and cost-range search.
17
+ Reaction SMILES use Lewis CD (bonds plus nonbonding-electron changes) and
18
+ explicit hydrogens by default. ``objective='bond'`` selects bond-only CD.
19
+ Omitting CD enumerates all minimum-distance classes; native search also
20
+ supports numeric ``CD_mode='at_most'`` for classes at distance <= CD.
21
+ * ``AAMapper().map_smiles(...)`` defaults to the approximate WL/SLAP mapper.
22
+ * ``AAMapper().map_smiles(..., enumerate_exact=True)`` runs SLAP followed by
23
+ exact refinement of a reduced uncertainty kernel.
24
+ * ``AAMapper().map_smiles(..., certify='exact')`` requests optional kernel MILP
25
+ certification of the SLAP results.
26
+ * ``AAMapper().enumerate_smiles(...)`` or ``map_smiles(..., CD=...)`` runs the
27
+ established full-distance search; SLAP may provide a seed for a minimum query.
28
+
29
+ PABS means Propagation and Assignment-Bounded Search. It is the package's
30
+ descriptive name for the exact interface used by ``map_reaction`` and
31
+ ``enumerate_pabs_mappings``. Its Python solver combines one-to-one domain
32
+ propagation with LAP bounds; its C++ backend uses a separate traversal.
33
+ LAP means linear assignment problem. SLAP uses sequential LAP decisions for
34
+ heuristic matching. A kernel is the reduced subproblem extracted from SLAP
35
+ results for optional refinement; optimality within it is scoped to its fixed
36
+ assignments and candidate domains. The PABS routes search without extracting
37
+ this uncertainty kernel or invoking its MILP solver.
38
+
39
+ Research basis
40
+ --------------
41
+ The approximate SLAP mapper develops the mapping idea from:
42
+ Shin-ichi Koda and Shinji Saito, "General and scalable atom-to-atom mapping
43
+ via Weisfeiler-Lehman-like approximate graph matching", ChemRxiv (2025).
44
+ DOI: 10.26434/chemrxiv-2025-hthwn
45
+
46
+ Quick start
47
+ -----------
48
+ >>> from synkit.Chem.Mapper import Mapper
49
+ >>> result = Mapper(method="propagate").map("CO>>CO")
50
+ >>> result.complete, result.minimum_cost
51
+ (True, 0.0)
52
+
53
+ Several inequivalent symmetry classes can share a minimum. Inspect
54
+ ``result.mapped_reactions`` and ``result.complete`` separately.
55
+ ``Mapper("native")`` uses the bundled wheel library; an explicit
56
+ ``library_path`` selects a custom build. The older
57
+ ``solvers.exact.native.build.build_native`` ABI3-only builder remains supported.
58
+
59
+ Package layout
60
+ --------------
61
+ :mod:`synkit.Chem.Mapper.graph`
62
+ Labeled-graph data structure, WL/2-WL refinement, automorphisms,
63
+ block-cut-tree decomposition.
64
+ :mod:`synkit.Chem.Mapper.solvers.slap`
65
+ Sequential-LAP engine (:class:`GraphMatcher`) and LAP utilities
66
+ (chemical distance, Gilmore-Lawler lower bound).
67
+ :mod:`synkit.Chem.Mapper.solvers.exact`
68
+ Distinct exact methods live in ``distance_search/``, ``kernel_solvers/``,
69
+ ``pabs/``, and ``native/``. Shared LAP proofs live in ``assignment/`` and
70
+ feasible-incumbent heuristics in ``seeds/``. ``enumerate_pabs_mappings``
71
+ selects Python or C++ through one interface. The legacy ABI3 source and
72
+ builder are adjacent in ``solvers/exact/native/``.
73
+ :mod:`synkit.Chem.Mapper.solvers.native`
74
+ Thin bindings, explicit immutable builds and chemistry preparation for the
75
+ shared C++ core in ``solvers/native/cpp/``. Production builds omit internal oracle exports;
76
+ a separate ``test_hooks=True`` build enables mathematical tests.
77
+ :mod:`synkit.Chem.Mapper.reaction_search`
78
+ Unmapped reaction SMILES, exact symmetry class representatives,
79
+ explicit or compressed hydrogen, and optional missing-atom padding.
80
+ :mod:`synkit.Chem.Mapper.chem`
81
+ RDKit SMILES I/O and ITS-based deduplication / electron-balance checks.
82
+ :mod:`synkit.Chem.Mapper.io`
83
+ Index-mapping-string helpers.
84
+ :mod:`synkit.Chem.Mapper.validation`
85
+ AAM validation, identifiability, and bond/annotation/cohort evaluation.
86
+ :mod:`synkit.Chem.Mapper.reporting`
87
+ Reference-blinded shell analysis, ITS spectra, structural alternatives,
88
+ and native two-sided orbit reports.
89
+ :mod:`synkit.Chem.Mapper.adapters`
90
+ Prediction seeds, validated class correspondences, and executable rules.
91
+
92
+ Historical flat module imports remain aliases to the same implementation
93
+ objects. See ``README.rst`` beside this module for method scopes and examples.
94
+
95
+ Public API
96
+ ----------
97
+ """
98
+
99
+ from ._compat import (
100
+ MAPPER_MODULE_ALIASES as _MAPPER_MODULE_ALIASES,
101
+ )
102
+ from ._compat import (
103
+ register_module_aliases as _register_module_aliases,
104
+ install_solver_aliases as _install_solver_aliases,
105
+ )
106
+
107
+ from .adapters.template import (
108
+ ClassCorrespondence,
109
+ ProductRecoveryScore,
110
+ SourceReplayResult,
111
+ class_correspondence_from_export,
112
+ correspondence_from_export,
113
+ executable_rule_from_correspondence,
114
+ mapped_reaction_from_correspondence,
115
+ prospective_products,
116
+ replay_executable_rule_on_source,
117
+ score_product_recovery,
118
+ )
119
+ from .chem.aam import AAMapper
120
+ from .chem.blind import BlindedReactionProblem, blinded_mapped_reaction_problem
121
+ from .solvers.exact.core import (
122
+ ITSComponentReduction,
123
+ reduce_to_reference_its_components,
124
+ )
125
+ from .solvers.exact.distance_search.search import (
126
+ CertificateVerificationError,
127
+ DistanceEnumerationCertificate,
128
+ DistanceEnumerationResult,
129
+ ExactEnumerationLimitError,
130
+ enumerate_distance_mappings,
131
+ verify_distance_enumeration_certificate,
132
+ )
133
+ from .solvers.exact.edit_support import (
134
+ BinaryEditBudget,
135
+ BinaryEditSupportResult,
136
+ binary_edit_budget,
137
+ enumerate_binary_edit_support_mappings,
138
+ )
139
+ from .solvers.exact.hybrid import (
140
+ HybridBackend,
141
+ HybridBackendDecision,
142
+ enumerate_hybrid_distance_mappings,
143
+ )
144
+ from .solvers.exact.hydrogen import (
145
+ HydrogenEnumerationResult,
146
+ HydrogenTransferPlan,
147
+ enumerate_lgp_hydrogen_transfers,
148
+ enumerate_minimal_hydrogen_transfers,
149
+ )
150
+ from .solvers.exact.pabs.propagation import PropagationConfig, enumerate_synister_cp_mappings
151
+ from .solvers.exact.search import enumerate_pabs_mappings
152
+ from .graph.labeled_graph import LabeledGraph
153
+ from .mapper import Mapper, MappingResult
154
+ from .reaction_search import ReactionMapping, ReactionMappingResult, map_reaction
155
+ from .reporting.alternatives import (
156
+ AlternativeTarget,
157
+ ExactITSAlternative,
158
+ ExactITSAlternativeResult,
159
+ MappedReactionITSAlternativeResult,
160
+ SeedMode,
161
+ enumerate_exact_its_alternatives,
162
+ enumerate_mapped_reaction_its_alternatives,
163
+ )
164
+ from .reporting.analysis import (
165
+ GlobalShellAnalysisResult,
166
+ GlobalShellConfig,
167
+ ReactionCenterSpectrum,
168
+ analyze_reference_blinded_global_shell,
169
+ )
170
+ from .reporting.spectrum import (
171
+ ExactStructureSpectrum,
172
+ ExactStructureSpectrumAccumulator,
173
+ exact_its_and_template_codes,
174
+ )
175
+ from .solvers.slap.sequential import GraphMatcher
176
+ from .solvers.native.implicit import map_reaction_implicit
177
+ from .validation.aam_validator import AAMValidator
178
+ from .solvers import exact, native as _native, slap
179
+
180
+ RESEARCH_BASIS_TITLE = (
181
+ "General and scalable atom-to-atom mapping via "
182
+ "Weisfeiler-Lehman-like approximate graph matching"
183
+ )
184
+ RESEARCH_BASIS_DOI = "10.26434/chemrxiv-2025-hthwn"
185
+ RESEARCH_BASIS_URL = f"https://doi.org/{RESEARCH_BASIS_DOI}"
186
+ RESEARCH_BASIS_AUTHORS = "Shin-ichi Koda and Shinji Saito"
187
+
188
+ __all__ = [
189
+ "RESEARCH_BASIS_AUTHORS",
190
+ "RESEARCH_BASIS_DOI",
191
+ "RESEARCH_BASIS_TITLE",
192
+ "RESEARCH_BASIS_URL",
193
+ "AAMValidator",
194
+ "AAMapper",
195
+ "AlternativeTarget",
196
+ "BinaryEditBudget",
197
+ "BinaryEditSupportResult",
198
+ "BlindedReactionProblem",
199
+ "CertificateVerificationError",
200
+ "ClassCorrespondence",
201
+ "DistanceEnumerationCertificate",
202
+ "DistanceEnumerationResult",
203
+ "ExactEnumerationLimitError",
204
+ "ExactITSAlternative",
205
+ "ExactITSAlternativeResult",
206
+ "ExactStructureSpectrum",
207
+ "ExactStructureSpectrumAccumulator",
208
+ "GlobalShellAnalysisResult",
209
+ "GlobalShellConfig",
210
+ "GraphMatcher",
211
+ "HybridBackend",
212
+ "HybridBackendDecision",
213
+ "HydrogenEnumerationResult",
214
+ "HydrogenTransferPlan",
215
+ "ITSComponentReduction",
216
+ "LabeledGraph",
217
+ "MappedReactionITSAlternativeResult",
218
+ "Mapper",
219
+ "MappingResult",
220
+ "ProductRecoveryScore",
221
+ "PropagationConfig",
222
+ "ReactionCenterSpectrum",
223
+ "ReactionMapping",
224
+ "ReactionMappingResult",
225
+ "SeedMode",
226
+ "SourceReplayResult",
227
+ "analyze_reference_blinded_global_shell",
228
+ "binary_edit_budget",
229
+ "blinded_mapped_reaction_problem",
230
+ "class_correspondence_from_export",
231
+ "correspondence_from_export",
232
+ "enumerate_binary_edit_support_mappings",
233
+ "enumerate_distance_mappings",
234
+ "enumerate_exact_its_alternatives",
235
+ "enumerate_hybrid_distance_mappings",
236
+ "enumerate_lgp_hydrogen_transfers",
237
+ "enumerate_mapped_reaction_its_alternatives",
238
+ "enumerate_minimal_hydrogen_transfers",
239
+ "enumerate_pabs_mappings",
240
+ "enumerate_synister_cp_mappings",
241
+ "exact_its_and_template_codes",
242
+ "executable_rule_from_correspondence",
243
+ "map_reaction",
244
+ "map_reaction_implicit",
245
+ "mapped_reaction_from_correspondence",
246
+ "prospective_products",
247
+ "reduce_to_reference_its_components",
248
+ "replay_executable_rule_on_source",
249
+ "score_product_recovery",
250
+ "verify_distance_enumeration_certificate",
251
+ ]
252
+
253
+ # Preserve flat imports while keeping implementation files in focused packages.
254
+ _install_solver_aliases()
255
+ _register_module_aliases(__name__, _MAPPER_MODULE_ALIASES)
@@ -0,0 +1,130 @@
1
+ """Historical module names for the reorganized mapper implementation.
2
+
3
+ Aliases share module objects, so monkeypatching and classes retain their
4
+ identity across old and new imports. Internal code uses canonical paths.
5
+ """
6
+
7
+ from importlib import import_module
8
+ from importlib.abc import Loader, MetaPathFinder
9
+ from importlib.util import find_spec, spec_from_loader
10
+ import sys
11
+
12
+
13
+ MAPPER_MODULE_ALIASES = {
14
+ "analysis": "reporting.analysis",
15
+ "native_analysis": "reporting.native_analysis",
16
+ "spectrum": "reporting.spectrum",
17
+ "alternatives": "reporting.alternatives",
18
+ "prediction_adapter": "adapters.prediction",
19
+ "template_adapter": "adapters.template",
20
+ "aam_validator": "validation.aam_validator",
21
+ "identifiability": "validation.identifiability",
22
+ "evaluation": "validation.bonds",
23
+ "annotation_evaluation": "validation.annotations",
24
+ "orbit_evaluation": "validation.orbits",
25
+ "cohort_evaluation": "validation.cohorts",
26
+ "numerical_scope": "validation.numerical_scope",
27
+ }
28
+
29
+ EXACT_MODULE_ALIASES = {
30
+ "distance": "distance_search.search",
31
+ "distance_bounds": "distance_search.bounds",
32
+ "distance_inputs": "distance_search.inputs",
33
+ "distance_records": "distance_search.records",
34
+ "distance_verify": "distance_search.verify",
35
+ "assignment_certificate": "assignment.assignment_certificate",
36
+ "assignment_domains": "assignment.assignment_domains",
37
+ "assignment_verification": "assignment.assignment_verification",
38
+ "incremental_assignment": "assignment.incremental_assignment",
39
+ "kernel": "kernel_solvers.kernel",
40
+ "branching": "kernel_solvers.branching",
41
+ "exhaustive": "distance_search.exhaustive",
42
+ "milp": "kernel_solvers.milp",
43
+ "enumerate": "kernel_solvers.enumerate",
44
+ "enumeration_result": "kernel_solvers.enumeration_result",
45
+ "propagation": "pabs.propagation",
46
+ "propagation_search": "pabs.propagation_search",
47
+ "propagation_bounds": "pabs.propagation_bounds",
48
+ "propagation_limits": "pabs.propagation_limits",
49
+ "propagation_symmetry": "pabs.propagation_symmetry",
50
+ "multi_shell": "pabs.multi_shell",
51
+ "suffix_spectrum": "pabs.suffix_spectrum",
52
+ "factor_spectrum": "pabs.factor_spectrum",
53
+ "separator_spectrum": "pabs.separator_spectrum",
54
+ "separator_bound": "pabs.separator_bound",
55
+ "cost_lattice": "pabs.cost_lattice",
56
+ "residual_typed_bonds": "pabs.residual_typed_bonds",
57
+ "reward_frontier": "pabs.reward_frontier",
58
+ "sparse_reward_bound": "pabs.sparse_reward_bound",
59
+ "seed": "seeds.seed",
60
+ "seed_fragments": "seeds.seed_fragments",
61
+ "seed_relaxation": "seeds.seed_relaxation",
62
+ "native_candidates": "native.candidates",
63
+ "native_canonical": "native.canonical",
64
+ "native_frontier": "native.frontier",
65
+ "native_its": "native.its",
66
+ "native_parallel": "native.parallel",
67
+ "native_search": "native.search",
68
+ "orbit_aggregation": "native.orbit_aggregation",
69
+ "disk_frontier": "native.disk_frontier",
70
+ }
71
+
72
+
73
+ _SOLVER_PREFIXES = {
74
+ f"{namespace}.{old}": f"synkit.Chem.Mapper.solvers.{new}"
75
+ for namespace in ("synkit.Chem.Mapper", "synkit.Chem.Reaction.Mapper")
76
+ for old, new in (("exact", "exact"), ("slap", "slap"), ("_native", "native"))
77
+ }
78
+
79
+
80
+ class _SolverAliasLoader(Loader):
81
+ """Resolve a historical solver module without creating a second implementation."""
82
+
83
+ def __init__(self, canonical_name):
84
+ self.canonical_name = canonical_name
85
+
86
+ def create_module(self, spec):
87
+ return None
88
+
89
+ def exec_module(self, module):
90
+ sys.modules[module.__spec__.name] = import_module(self.canonical_name)
91
+
92
+ def get_code(self, fullname):
93
+ # runpy requests code without importing the alias. Call the canonical
94
+ # builder's main directly so its relative imports keep their new base.
95
+ if self.canonical_name.endswith((".build", ".native_build", ".reaction_build")):
96
+ source = f"from importlib import import_module\nimport_module({self.canonical_name!r}).main()\n"
97
+ else:
98
+ source = f"import runpy\nrunpy.run_module({self.canonical_name!r}, run_name='__main__')\n"
99
+ return compile(source, f"<compatibility {fullname}>", "exec")
100
+
101
+
102
+ class _SolverAliasFinder(MetaPathFinder):
103
+ def find_spec(self, fullname, path=None, target=None):
104
+ for old, canonical in _SOLVER_PREFIXES.items():
105
+ if fullname == old or fullname.startswith(old + "."):
106
+ name = canonical + fullname[len(old):]
107
+ original = find_spec(name)
108
+ if original is None:
109
+ return None
110
+ return spec_from_loader(
111
+ fullname, _SolverAliasLoader(name),
112
+ origin=original.origin,
113
+ is_package=original.submodule_search_locations is not None,
114
+ )
115
+ return None
116
+
117
+
118
+ def install_solver_aliases():
119
+ """Keep old solver imports and build commands working after the source move."""
120
+ if not any(isinstance(finder, _SolverAliasFinder) for finder in sys.meta_path):
121
+ sys.meta_path.insert(0, _SolverAliasFinder())
122
+
123
+
124
+ def register_module_aliases(package_name, aliases):
125
+ """Bind historical children to canonical modules on an existing package."""
126
+ package = sys.modules[package_name]
127
+ for old_name, canonical_name in aliases.items():
128
+ module = import_module(f".{canonical_name}", package_name)
129
+ sys.modules[f"{package_name}.{old_name}"] = module
130
+ setattr(package, old_name, module)
@@ -0,0 +1 @@
1
+ """Prediction seeds and conversion of mapping classes into executable rules."""
@@ -0,0 +1,126 @@
1
+ """Reference-free prediction inputs and strict coordinate alignment.
2
+
3
+ The connectivity contract matches :mod:`identifiability`. Alignment uses only
4
+ each endpoint graph; neither a deposited mapping nor an optimal candidate set
5
+ is accepted by this interface. Alternative endpoint isomorphisms differ by
6
+ endpoint automorphisms, so quotient bond scores are independent of that choice.
7
+ """
8
+
9
+ from collections import defaultdict
10
+ from dataclasses import dataclass
11
+
12
+ import networkx as nx
13
+ from rdkit import Chem
14
+
15
+ from ..validation.bonds import _graph
16
+ from ..validation.identifiability import extract_label, parse_reaction
17
+ from ..solvers.slap.sequential import GraphMatcher
18
+
19
+
20
+ def unmapped_input(reaction: str) -> str:
21
+ """Remove all map labels before serialization; retain every component.
22
+
23
+ Coordinates for the prediction study are those of the returned string.
24
+ Stereo is intentionally removed for the connectivity-only task, after the
25
+ strict parser rejects unsupported inventories, isotopes and radicals.
26
+ """
27
+ parse_reaction(reaction)
28
+ sides = []
29
+ for side in reaction.split(">>"):
30
+ params = Chem.SmilesParserParams()
31
+ params.removeHs = False
32
+ mol = Chem.MolFromSmiles(side, params)
33
+ for atom in mol.GetAtoms():
34
+ atom.SetAtomMapNum(0)
35
+ mol = Chem.RemoveHs(mol)
36
+ sides.append(Chem.MolToSmiles(mol, canonical=False, isomericSmiles=False))
37
+ result = ">>".join(sides)
38
+ parse_reaction(result)
39
+ return result
40
+
41
+
42
+ def _map_ids(side):
43
+ params = Chem.SmilesParserParams()
44
+ params.removeHs = False
45
+ mol = Chem.MolFromSmiles(side, params)
46
+ if mol is None:
47
+ raise ValueError("Invalid predicted SMILES")
48
+ # RemoveHs retains heavy-atom relative order. H mapping is outside scope.
49
+ ids = tuple(a.GetAtomMapNum() for a in mol.GetAtoms() if a.GetAtomicNum() > 1)
50
+ if not ids or any(i <= 0 for i in ids) or len(set(ids)) != len(ids):
51
+ raise ValueError("Every predicted heavy atom needs one unique positive map ID")
52
+ return ids
53
+
54
+
55
+ def _align(source, target):
56
+ matcher = nx.algorithms.isomorphism.GraphMatcher(
57
+ _graph(source), _graph(target),
58
+ node_match=nx.algorithms.isomorphism.categorical_node_match("color", None),
59
+ edge_match=nx.algorithms.isomorphism.categorical_edge_match("order", None),
60
+ )
61
+ match = next(matcher.isomorphisms_iter(), None)
62
+ if match is None:
63
+ raise ValueError("Prediction changed an attributed endpoint graph")
64
+ return tuple(match[i] for i in range(len(source.atomic_numbers)))
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class AlignedPrediction:
69
+ mapping: tuple[int, ...]
70
+ reactant_to_output: tuple[int, ...]
71
+ product_to_output: tuple[int, ...]
72
+
73
+
74
+ def align_mapped_prediction(unmapped_reaction: str, mapped_output: str) -> AlignedPrediction:
75
+ """Validate an untouched mapped output and return alignment witnesses."""
76
+ r, p = parse_reaction(unmapped_reaction)
77
+ rr, pp = parse_reaction(mapped_output)
78
+ rid, pid = map(_map_ids, mapped_output.split(">>"))
79
+ if set(rid) != set(pid):
80
+ raise ValueError("Predicted map-ID inventories differ between endpoints")
81
+ ra, pa = _align(r, rr), _align(p, pp)
82
+ product_by_id = {pid[out]: original for original, out in enumerate(pa)}
83
+ mapping = tuple(product_by_id[rid[out]] for out in ra)
84
+ extract_label(r, p, mapping) # complete element-compatible permutation
85
+ return AlignedPrediction(mapping, ra, pa)
86
+
87
+
88
+ def predict_slap(unmapped_reaction: str):
89
+ """SLAP heavy-atom symmetry splitting with deterministic residual ties.
90
+
91
+ Requests splitting for every heavy atom, uses the first returned partition,
92
+ then pairs sorted indices
93
+ within each common final label. This is a declared single-map baseline,
94
+ not an exact optimizer, a ground-truth repair, or a claim that all unresolved
95
+ label blocks contain automorphism-equivalent atoms.
96
+ """
97
+ r, p = parse_reaction(unmapped_reaction)
98
+ matcher = GraphMatcher(binary=False, max_lap_fingerprints=1000,
99
+ cache_label_blocks=True, deterministic_labels=True)
100
+ matcher.get_maps([r.graph(), p.graph()], break_sym_targets=list(range(len(r.atomic_numbers))))
101
+ if not matcher.results:
102
+ raise ValueError("SLAP returned no partition")
103
+ result = matcher.results[0]
104
+ lr, lp = result["lgp"]
105
+ left, right = defaultdict(list), defaultdict(list)
106
+ for i, label in enumerate(lr.labels):
107
+ left[label].append(i)
108
+ for i, label in enumerate(lp.labels):
109
+ right[label].append(i)
110
+ if set(left) != set(right) or any(len(left[k]) != len(right[k]) for k in left):
111
+ raise ValueError("SLAP partition multiplicities disagree")
112
+ mapping = [-1] * len(r.atomic_numbers)
113
+ for label in sorted(left):
114
+ for i, j in zip(left[label], right[label]):
115
+ mapping[i] = j
116
+ extract_label(r, p, mapping)
117
+ return {
118
+ "method": "slap-heavy-split-v1",
119
+ "mapping": mapping,
120
+ "raw_reactant_labels": list(lr.labels),
121
+ "raw_product_labels": list(lp.labels),
122
+ "returned_partition_count": len(matcher.results),
123
+ "reported_partition_cost": int(result["val"]),
124
+ "heavy_atom_splitting": True,
125
+ "tie_policy": "first-returned-partition_then_increasing-index-within-label",
126
+ }