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,97 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any, List, Set, Optional
5
+
6
+ import numpy as np
7
+ from .siphon_search import SiphonSearchLimit, DEFAULT_MAX_NODES
8
+ from .semiflows import find_p_semiflows, stoichiometric_matrix
9
+ from .structure import find_siphons
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class PersistenceCheckResult:
14
+ """Structured result of the siphon-based persistence sufficient test."""
15
+
16
+ persistence_ok: Optional[bool]
17
+ siphons: List[Set[str]]
18
+ semiflow_supports: List[Set[str]]
19
+ uncovered_siphons: List[Set[str]]
20
+ complete: bool = True
21
+ termination_reason: str = "complete"
22
+
23
+
24
+ def siphon_persistence_condition(
25
+ crn: Any,
26
+ *,
27
+ rtol: float = 1e-12,
28
+ max_siphon_size: int | None = None,
29
+ ) -> Optional[bool]:
30
+ """
31
+ Check the Angeli–De Leenheer–Sontag siphon/P-semiflow sufficient condition.
32
+
33
+ The condition holds when every minimal siphon contains the support of some
34
+ P-semiflow.
35
+ """
36
+ return siphon_persistence_details(
37
+ crn,
38
+ rtol=rtol,
39
+ max_siphon_size=max_siphon_size,
40
+ ).persistence_ok
41
+
42
+
43
+ def siphon_persistence_details(
44
+ crn: Any,
45
+ *,
46
+ rtol: float = 1e-12,
47
+ max_siphon_size: int | None = None,
48
+ support_tol: float = 1e-8,
49
+ max_nodes: int = DEFAULT_MAX_NODES,
50
+ p_semiflows: Any = None,
51
+ _complete_siphons: Any = None,
52
+ ) -> PersistenceCheckResult:
53
+ """
54
+ Return detailed information for the siphon-based persistence test.
55
+ """
56
+ try:
57
+ # Enumerate all sizes: a size filter is not a proof of complete coverage.
58
+ siphons = (
59
+ find_siphons(crn, names="id", max_nodes=max_nodes, strict_limit=True)
60
+ if _complete_siphons is None
61
+ else [set(s) for s in _complete_siphons]
62
+ )
63
+ except SiphonSearchLimit:
64
+ return PersistenceCheckResult(None, [], [], [], False, "node_limit")
65
+ if max_siphon_size is not None and any(len(s) > max_siphon_size for s in siphons):
66
+ return PersistenceCheckResult(None, siphons, [], [], False, "size_limit")
67
+ if not siphons:
68
+ return PersistenceCheckResult(True, [], [], [])
69
+
70
+ species_order, _, _ = stoichiometric_matrix(crn)
71
+ # Minimal P-semiflows: non-negative and inclusion-minimal, so their
72
+ # supports are exactly what the Angeli-De Leenheer-Sontag condition needs.
73
+ # A real kernel basis would not do: its vectors can be mixed-sign and its
74
+ # supports depend on the arbitrary choice of basis.
75
+ y = (
76
+ find_p_semiflows(crn, rtol=rtol)
77
+ if p_semiflows is None
78
+ else np.asarray(p_semiflows)
79
+ )
80
+ if y.size == 0:
81
+ return PersistenceCheckResult(False, siphons, [], list(siphons))
82
+
83
+ supports: List[Set[str]] = []
84
+ for j in range(y.shape[1]):
85
+ supp = {
86
+ species_order[i] for i, val in enumerate(y[:, j]) if abs(val) > support_tol
87
+ }
88
+ if supp:
89
+ supports.append(supp)
90
+
91
+ uncovered = [set(s) for s in siphons if not any(t.issubset(s) for t in supports)]
92
+ return PersistenceCheckResult(
93
+ persistence_ok=(len(uncovered) == 0),
94
+ siphons=[set(s) for s in siphons],
95
+ semiflow_supports=supports,
96
+ uncovered_siphons=uncovered,
97
+ )
@@ -0,0 +1,483 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Dict, List, Tuple
4
+
5
+ import numpy as np
6
+
7
+ from .net import PetriNet
8
+ from .minimal_semiflows import minimal_semiflows
9
+ from synkit.CRN.Props.helper import _as_graph, _species_and_rule_order
10
+ from synkit.CRN.Props.stoich import (
11
+ left_nullspace,
12
+ right_nullspace,
13
+ stoichiometric_matrix as props_stoichiometric_matrix,
14
+ )
15
+
16
+ __all__ = [
17
+ "stoichiometric_matrix",
18
+ "find_p_semiflows",
19
+ "find_t_semiflows",
20
+ "left_kernel_basis",
21
+ "right_kernel_basis",
22
+ "semiflow_supports",
23
+ ]
24
+
25
+
26
+ def _nullspace(a: np.ndarray, *, rtol: float = 1e-12) -> np.ndarray:
27
+ """Compute a numerical basis for the right null space of a matrix using SVD.
28
+
29
+ The returned matrix has shape ``(n_cols, k)``, where each column is a basis
30
+ vector spanning ``ker(a)``. This helper is used only for native
31
+ :class:`PetriNet` inputs, because the generic SynCRN-like path delegates to
32
+ :mod:`synkit.CRN.Props.stoich`.
33
+
34
+ :param a:
35
+ Input matrix.
36
+ :type a: np.ndarray
37
+ :param rtol:
38
+ Relative tolerance used to determine the numerical rank.
39
+ :type rtol: float
40
+ :return:
41
+ Matrix whose columns form a basis of the right null space of ``a``.
42
+ :rtype: np.ndarray
43
+ :raises ValueError:
44
+ If ``a`` is not two-dimensional.
45
+
46
+ .. rubric:: Example
47
+
48
+ .. code-block:: python
49
+
50
+ import numpy as np
51
+ from synkit.CRN.Petrinet.semiflows import _nullspace
52
+
53
+ a = np.array([[1.0, -1.0], [2.0, -2.0]])
54
+ ns = _nullspace(a)
55
+ print(ns.shape)
56
+ """
57
+ from ..Props.stoich import _null_space
58
+
59
+ return _null_space(np.asarray(a, dtype=float), rtol=rtol)
60
+
61
+
62
+ def _stoich_from_petri(net: PetriNet) -> Tuple[List[str], List[str], np.ndarray]:
63
+ """Build a stoichiometric matrix directly from a :class:`PetriNet`.
64
+
65
+ Rows follow :attr:`PetriNet.place_order` and columns follow
66
+ :attr:`PetriNet.transition_order`. Each column corresponds to one
67
+ transition, with reactant coefficients subtracted and product coefficients
68
+ added.
69
+
70
+ :param net:
71
+ Petri net object.
72
+ :type net: PetriNet
73
+ :return:
74
+ Tuple ``(species_order, reaction_order, S)``, where ``S`` is the net
75
+ stoichiometric matrix.
76
+ :rtype: Tuple[List[str], List[str], np.ndarray]
77
+
78
+ .. rubric:: Example
79
+
80
+ .. code-block:: python
81
+
82
+ from synkit.CRN.Petrinet.net import PetriNet
83
+ from synkit.CRN.Petrinet.semiflows import _stoich_from_petri
84
+
85
+ net = PetriNet()
86
+ net.add_transition("r1", pre={"A": 1}, post={"B": 1})
87
+
88
+ species_order, reaction_order, S = _stoich_from_petri(net)
89
+ print(species_order)
90
+ print(reaction_order)
91
+ print(S)
92
+ """
93
+ species_order = list(net.place_order)
94
+ reaction_order = list(net.transition_order)
95
+
96
+ sidx = {sid: i for i, sid in enumerate(species_order)}
97
+ ridx = {rid: j for j, rid in enumerate(reaction_order)}
98
+ s = np.zeros((len(species_order), len(reaction_order)), dtype=float)
99
+
100
+ for rid in reaction_order:
101
+ t = net.transitions[rid]
102
+ j = ridx[rid]
103
+ for sid, coeff in t.pre.items():
104
+ s[sidx[sid], j] -= float(coeff)
105
+ for sid, coeff in t.post.items():
106
+ s[sidx[sid], j] += float(coeff)
107
+
108
+ return species_order, reaction_order, s
109
+
110
+
111
+ def stoichiometric_matrix(crn: Any) -> Tuple[List[str], List[str], np.ndarray]:
112
+ """Return row order, column order, and stoichiometric matrix for a network.
113
+
114
+ This is a thin wrapper around :mod:`synkit.CRN.Props.stoich` for
115
+ SynCRN-like graph inputs, augmented with explicit row and column orders so
116
+ semiflow supports can be interpreted. For native :class:`PetriNet` inputs,
117
+ the matrix is assembled directly from the transition multisets.
118
+
119
+ Supported inputs include:
120
+
121
+ - a :class:`PetriNet`
122
+ - a SynCRN-like object accepted by :func:`synkit.CRN.Props.helper._as_graph`
123
+ - a NetworkX bipartite graph in SynCRN species-rule format
124
+
125
+ :param crn:
126
+ Petri net, SynCRN-like object, or supported bipartite graph.
127
+ :type crn: Any
128
+ :return:
129
+ Tuple ``(species_order, reaction_order, S)``, where ``species_order``
130
+ defines the row labels of ``S`` and ``reaction_order`` defines the
131
+ column labels.
132
+ :rtype: Tuple[List[str], List[str], np.ndarray]
133
+
134
+ .. rubric:: Example
135
+
136
+ .. code-block:: python
137
+
138
+ from synkit.CRN.Structure import SynCRN
139
+ from synkit.CRN.Petrinet.semiflows import stoichiometric_matrix
140
+
141
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
142
+ species_order, reaction_order, S = stoichiometric_matrix(syn)
143
+
144
+ print(species_order)
145
+ print(reaction_order)
146
+ print(S.shape)
147
+ """
148
+ if isinstance(crn, PetriNet):
149
+ return _stoich_from_petri(crn)
150
+
151
+ G = _as_graph(crn)
152
+ species_order, reaction_order, _, _ = _species_and_rule_order(G)
153
+ S = props_stoichiometric_matrix(crn)
154
+ # Matrix rows follow source graph order, but Petri-net supports use canonical
155
+ # ids. Preserve row order while normalizing the names into one coordinate system.
156
+ return (
157
+ [str(G.nodes[x].get("syncrn_id", x)) for x in species_order],
158
+ [str(G.nodes[x].get("syncrn_id", x)) for x in reaction_order],
159
+ S,
160
+ )
161
+
162
+
163
+ def left_kernel_basis(crn: Any, *, rtol: float = 1e-12) -> np.ndarray:
164
+ """Compute a real basis of the left kernel ``ker(S^T)``.
165
+
166
+ The returned matrix has shape ``(n_species, k)``, where each column is one
167
+ basis vector.
168
+
169
+ .. warning::
170
+ These basis vectors are **not** P-semiflows. They may be negative or
171
+ mixed-sign, and because any rotation of the kernel is an equally valid
172
+ basis, their supports are not meaningful. Use
173
+ :func:`find_p_semiflows` for conservation-law analysis.
174
+
175
+ :param crn:
176
+ Petri net, SynCRN-like object, or supported bipartite graph.
177
+ :type crn: Any
178
+ :param rtol:
179
+ Relative tolerance used for null-space detection.
180
+ :type rtol: float
181
+ :return:
182
+ Matrix whose columns form a basis of ``ker(S^T)``.
183
+ :rtype: np.ndarray
184
+
185
+ .. rubric:: Example
186
+
187
+ .. code-block:: python
188
+
189
+ from synkit.CRN.Structure import SynCRN
190
+ from synkit.CRN.Petrinet.semiflows import left_kernel_basis
191
+
192
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
193
+ print(left_kernel_basis(syn).shape)
194
+ """
195
+ if isinstance(crn, PetriNet):
196
+ _, _, s = stoichiometric_matrix(crn)
197
+ return _nullspace(s.T, rtol=rtol)
198
+
199
+ return left_nullspace(crn, rtol=rtol)
200
+
201
+
202
+ def right_kernel_basis(crn: Any, *, rtol: float = 1e-12) -> np.ndarray:
203
+ """Compute a real basis of the right kernel ``ker(S)``.
204
+
205
+ The returned matrix has shape ``(n_reactions, k)``, where each column is
206
+ one basis vector.
207
+
208
+ .. warning::
209
+ These basis vectors are **not** T-semiflows; see
210
+ :func:`left_kernel_basis`. Use :func:`find_t_semiflows` for flux-mode
211
+ analysis.
212
+
213
+ :param crn:
214
+ Petri net, SynCRN-like object, or supported bipartite graph.
215
+ :type crn: Any
216
+ :param rtol:
217
+ Relative tolerance used for null-space detection.
218
+ :type rtol: float
219
+ :return:
220
+ Matrix whose columns form a basis of ``ker(S)``.
221
+ :rtype: np.ndarray
222
+
223
+ .. rubric:: Example
224
+
225
+ .. code-block:: python
226
+
227
+ from synkit.CRN.Structure import SynCRN
228
+ from synkit.CRN.Petrinet.semiflows import right_kernel_basis
229
+
230
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
231
+ print(right_kernel_basis(syn).shape)
232
+ """
233
+ if isinstance(crn, PetriNet):
234
+ _, _, s = stoichiometric_matrix(crn)
235
+ return _nullspace(s, rtol=rtol)
236
+
237
+ return right_nullspace(crn, rtol=rtol)
238
+
239
+
240
+ def _semiflow_matrix(crn: Any, *, kind: str, **backend_options) -> np.ndarray:
241
+ """Build the minimal-semiflow matrix for a CRN-like input.
242
+
243
+ :param crn:
244
+ Petri net, SynCRN-like object, or supported bipartite graph.
245
+ :type crn: Any
246
+ :param kind:
247
+ Either ``"p"`` or ``"t"``.
248
+ :type kind: str
249
+ :return:
250
+ Non-negative integer matrix whose columns are minimal semiflows.
251
+ :rtype: np.ndarray
252
+ """
253
+ _, _, s = stoichiometric_matrix(crn)
254
+ flows = minimal_semiflows(s, kind=kind, **backend_options)
255
+
256
+ width = s.shape[0] if kind == "p" else s.shape[1]
257
+ if not flows:
258
+ return np.zeros((width, 0), dtype=float)
259
+ dtype = object if any(abs(v) > 2**53 for row in flows for v in row) else float
260
+ return np.asarray(flows, dtype=dtype).T
261
+
262
+
263
+ def find_p_semiflows(crn: Any, *, rtol: float = 1e-12, **backend_options) -> np.ndarray:
264
+ """Compute minimal P-semiflows, also called place invariants.
265
+
266
+ A P-semiflow is a vector ``y >= 0`` with ``y^T S = 0``; its support is a
267
+ set of species whose weighted total is conserved by every reaction. The
268
+ returned matrix has shape ``(n_species, k)``, where each column is one
269
+ minimal semiflow with primitive non-negative integer entries.
270
+
271
+ Computation is exact and uses the Farkas / Colom-Silva elimination scheme
272
+ (see :mod:`synkit.CRN.Petrinet.minimal_semiflows`), so results do not
273
+ depend on a floating-point tolerance.
274
+
275
+ :param crn:
276
+ Petri net, SynCRN-like object, or supported bipartite graph.
277
+ :type crn: Any
278
+ :param rtol:
279
+ Accepted for backward compatibility and ignored; the computation is
280
+ exact.
281
+ :type rtol: float
282
+ :return:
283
+ Matrix whose columns are the minimal P-semiflows.
284
+ :rtype: np.ndarray
285
+
286
+ .. rubric:: Example
287
+
288
+ .. code-block:: python
289
+
290
+ from synkit.CRN.Structure import SynCRN
291
+ from synkit.CRN.Petrinet.semiflows import find_p_semiflows
292
+
293
+ syn = SynCRN.from_reaction_strings(["A>>B", "C>>D"])
294
+ print(find_p_semiflows(syn))
295
+ # [[1. 0.]
296
+ # [1. 0.]
297
+ # [0. 1.]
298
+ # [0. 1.]]
299
+ """
300
+ return _semiflow_matrix(crn, kind="p", **backend_options)
301
+
302
+
303
+ def find_t_semiflows(crn: Any, *, rtol: float = 1e-12, **backend_options) -> np.ndarray:
304
+ """Compute minimal T-semiflows, also called transition invariants.
305
+
306
+ A T-semiflow is a vector ``x >= 0`` with ``S x = 0``; its support is a set
307
+ of reactions that, fired with the given multiplicities, returns the network
308
+ to its starting marking. The returned matrix has shape
309
+ ``(n_reactions, k)``, where each column is one minimal semiflow with
310
+ primitive non-negative integer entries.
311
+
312
+ Computation is exact; see :func:`find_p_semiflows`.
313
+
314
+ :param crn:
315
+ Petri net, SynCRN-like object, or supported bipartite graph.
316
+ :type crn: Any
317
+ :param rtol:
318
+ Accepted for backward compatibility and ignored; the computation is
319
+ exact.
320
+ :type rtol: float
321
+ :return:
322
+ Matrix whose columns are the minimal T-semiflows.
323
+ :rtype: np.ndarray
324
+
325
+ .. rubric:: Example
326
+
327
+ .. code-block:: python
328
+
329
+ from synkit.CRN.Structure import SynCRN
330
+ from synkit.CRN.Petrinet.semiflows import find_t_semiflows
331
+
332
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
333
+ print(find_t_semiflows(syn))
334
+ # [[1.]
335
+ # [1.]]
336
+ """
337
+ return _semiflow_matrix(crn, kind="t", **backend_options)
338
+
339
+
340
+ def _select_semiflow_basis(
341
+ crn: Any,
342
+ *,
343
+ kind: str,
344
+ rtol: float,
345
+ ) -> Tuple[List[str], np.ndarray]:
346
+ """Select the minimal semiflows together with their label order.
347
+
348
+ For P-semiflows, the returned order corresponds to species / places. For
349
+ T-semiflows, the returned order corresponds to reactions / transitions.
350
+
351
+ :param crn:
352
+ Petri net, SynCRN-like object, or supported bipartite graph.
353
+ :type crn: Any
354
+ :param kind:
355
+ Either ``"p"`` for P-semiflows or ``"t"`` for T-semiflows.
356
+ :type kind: str
357
+ :param rtol:
358
+ Accepted for backward compatibility and ignored; the computation is
359
+ exact.
360
+ :type rtol: float
361
+ :return:
362
+ Tuple ``(order, basis)``, where ``order`` labels the rows of ``basis``.
363
+ :rtype: Tuple[List[str], np.ndarray]
364
+ :raises ValueError:
365
+ If ``kind`` is not ``"p"`` or ``"t"``.
366
+
367
+ .. rubric:: Example
368
+
369
+ .. code-block:: python
370
+
371
+ from synkit.CRN.Structure import SynCRN
372
+ from synkit.CRN.Petrinet.semiflows import _select_semiflow_basis
373
+
374
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
375
+ order, basis = _select_semiflow_basis(syn, kind="p", rtol=1e-12)
376
+ print(order)
377
+ print(basis.shape)
378
+ """
379
+ if kind not in {"p", "t"}:
380
+ raise ValueError("kind must be 'p' or 't'")
381
+
382
+ species_order, reaction_order, _ = stoichiometric_matrix(crn)
383
+ order = species_order if kind == "p" else reaction_order
384
+ return order, _semiflow_matrix(crn, kind=kind)
385
+
386
+
387
+ def _basis_column_support(
388
+ vec: np.ndarray,
389
+ order: List[str],
390
+ *,
391
+ support_tol: float,
392
+ ) -> Dict[str, float]:
393
+ """Convert one basis vector into a sparsified support dictionary.
394
+
395
+ Entries whose absolute value is less than or equal to ``support_tol`` are
396
+ discarded. Remaining entries are returned as a mapping from row label to
397
+ floating coefficient.
398
+
399
+ :param vec:
400
+ Basis vector.
401
+ :type vec: np.ndarray
402
+ :param order:
403
+ Labels corresponding to entries of ``vec``.
404
+ :type order: List[str]
405
+ :param support_tol:
406
+ Threshold below which coefficients are treated as zero.
407
+ :type support_tol: float
408
+ :return:
409
+ Sparse support mapping for one basis column.
410
+ :rtype: Dict[str, float]
411
+
412
+ .. rubric:: Example
413
+
414
+ .. code-block:: python
415
+
416
+ import numpy as np
417
+ from synkit.CRN.Petrinet.semiflows import _basis_column_support
418
+
419
+ vec = np.array([1.0, 0.0, -2.0])
420
+ order = ["A", "B", "C"]
421
+ supp = _basis_column_support(vec, order, support_tol=1e-8)
422
+ print(supp)
423
+ """
424
+ return {
425
+ order[i]: float(vec[i]) for i in range(len(order)) if abs(vec[i]) > support_tol
426
+ }
427
+
428
+
429
+ def semiflow_supports(
430
+ crn: Any,
431
+ *,
432
+ kind: str = "p",
433
+ rtol: float = 1e-12,
434
+ support_tol: float = 1e-8,
435
+ ) -> List[Dict[str, float]]:
436
+ """Return sparsified P-semiflow or T-semiflow supports.
437
+
438
+ The result is a list of sparse dictionaries, one per basis column. For
439
+ P-semiflows, keys are species or place identifiers. For T-semiflows, keys
440
+ are reaction or transition identifiers.
441
+
442
+ :param crn:
443
+ Petri net, SynCRN-like object, or supported bipartite graph.
444
+ :type crn: Any
445
+ :param kind:
446
+ Either ``"p"`` for P-semiflows or ``"t"`` for T-semiflows.
447
+ :type kind: str
448
+ :param rtol:
449
+ Relative tolerance used for null-space detection.
450
+ :type rtol: float
451
+ :param support_tol:
452
+ Threshold below which basis coefficients are treated as zero when
453
+ constructing sparse supports.
454
+ :type support_tol: float
455
+ :return:
456
+ List of sparse support dictionaries.
457
+ :rtype: List[Dict[str, float]]
458
+ :raises ValueError:
459
+ If ``kind`` is not ``"p"`` or ``"t"``.
460
+
461
+ .. rubric:: Example
462
+
463
+ .. code-block:: python
464
+
465
+ from synkit.CRN.Structure import SynCRN
466
+ from synkit.CRN.Petrinet.semiflows import semiflow_supports
467
+
468
+ syn = SynCRN.from_reaction_strings(["A>>B", "B>>A"])
469
+
470
+ p_supports = semiflow_supports(syn, kind="p")
471
+ t_supports = semiflow_supports(syn, kind="t")
472
+
473
+ print(p_supports)
474
+ print(t_supports)
475
+ """
476
+ order, basis = _select_semiflow_basis(crn, kind=kind, rtol=rtol)
477
+
478
+ out: List[Dict[str, float]] = []
479
+ for j in range(basis.shape[1]):
480
+ supp = _basis_column_support(basis[:, j], order, support_tol=support_tol)
481
+ if supp:
482
+ out.append(supp)
483
+ return out