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,140 @@
1
+ #ifndef SYNKIT_MAPPER_SYMMETRY_CLASSIFICATION_H
2
+ #define SYNKIT_MAPPER_SYMMETRY_CLASSIFICATION_H
3
+
4
+ #include <stdint.h>
5
+ #include "synkit_mapper/slap.h"
6
+ #include "synkit_mapper/mapper.h"
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ /* Exact palette ranks are ordered by Python's _encode_color tokens. Node
13
+ * colors are ranks, edge colors rank+1 (zero is absent). Endpoint edge states
14
+ * are independent dense indices; edge_pair_colors pairs their full attributes,
15
+ * including optional E/Z. Thus no chemistry attribute is discarded natively.
16
+ * Palette entries are canonical ASCII JSON tokens, without surrounding list.
17
+ * Only complete canonical searches publish keys. Equality uses full SKC1 bytes,
18
+ * never their SHA256 identifiers. The identifiers preserve the legacy dense
19
+ * certificate SHA256 encoding. This additive interface has version 1.
20
+ */
21
+ typedef struct SynkitClassProblem {
22
+ int32_t n;
23
+ const int32_t *node_pair_colors; /* n*n */
24
+ const int32_t *edges_r; /* n*n endpoint state IDs */
25
+ const int32_t *edges_p;
26
+ int32_t edge_states_r;
27
+ int32_t edge_states_p;
28
+ const int32_t *edge_pair_colors;
29
+ int32_t palette_size;
30
+ const char *const *palette_json;
31
+ } SynkitClassProblem;
32
+
33
+ typedef struct SynkitClassStatistics {
34
+ int64_t candidates;
35
+ int64_t classes;
36
+ int64_t canonical_nodes;
37
+ int32_t complete;
38
+ /* 0 complete, 1 deadline, 2 canonical node cap, 3 class cap, 4 callback,
39
+ * 5 cancellation requested. */
40
+ int32_t reason;
41
+ double elapsed_seconds;
42
+ } SynkitClassStatistics;
43
+
44
+ typedef int (*SynkitClassCallback)(const int32_t *representative,
45
+ int64_t cost2, int64_t observed_count,
46
+ const unsigned char *packed_key,
47
+ int64_t packed_size,
48
+ const char *legacy_identifier,
49
+ void *userdata);
50
+
51
+ SYNKIT_MAPPER_API int synkit_mapper_classification_abi(void);
52
+ /* Additive capacity discovery; libraries without this export support256. */
53
+ SYNKIT_MAPPER_API int synkit_mapper_classification_max_vertices(void);
54
+ SYNKIT_MAPPER_API const char *synkit_mapper_classification_error(void);
55
+ /* mappings is count*n, costs2 is count. seconds=-1 means unlimited. A shared
56
+ * remaining deadline should be passed by the pipeline. All caps are -1 or
57
+ * positive; max_nodes applies across the entire batch. No exceptions cross
58
+ * callbacks. Return 0 for complete/interrupted, -1 for invalid input/error. */
59
+ SYNKIT_MAPPER_API int synkit_mapper_classify_batch(
60
+ const SynkitClassProblem *problem, int64_t count,
61
+ const int32_t *mappings, const int64_t *costs2,
62
+ double seconds, int64_t max_nodes, int64_t max_classes,
63
+ SynkitClassCallback callback, void *userdata,
64
+ SynkitClassStatistics *statistics);
65
+ SYNKIT_MAPPER_API int synkit_mapper_classify_batch_with_cancel(
66
+ const SynkitClassProblem *problem, int64_t count,
67
+ const int32_t *mappings, const int64_t *costs2,
68
+ double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
69
+ SynkitClassCallback callback, void *userdata,
70
+ SynkitClassStatistics *statistics);
71
+
72
+ /* Additive delivery mode: first discovery publishes a complete exact key
73
+ * immediately, then a final cumulative observed-count update when needed.
74
+ * Merge callbacks by the FULL packed key; updates are not new mappings or
75
+ * additional classes. Complete output has final counts. Interrupted output
76
+ * counts are nondecreasing lower bounds and incomplete flags stay explicit.
77
+ * The legacy batch entry points and their one-callback contract are unchanged.
78
+ * Publication and canonical work share the supplied deadline. */
79
+ SYNKIT_MAPPER_API int synkit_mapper_classify_batch_updates_with_cancel(
80
+ const SynkitClassProblem *problem, int64_t count,
81
+ const int32_t *mappings, const int64_t *costs2,
82
+ double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
83
+ SynkitClassCallback callback, void *userdata,
84
+ SynkitClassStatistics *statistics);
85
+
86
+ /* Additive explicit options; both flags must be 0 or 1. updates uses the
87
+ * cumulative-count contract above. packed_identifier=1 returns SHA256 of the
88
+ * exact SKC1 bytes as the presentation identifier; 0 preserves legacy IDs.
89
+ * Keys, canonicalization, deduplication, budgets and statistics are unchanged.
90
+ * No process-global mode is set; existing entry points always use legacy IDs. */
91
+ SYNKIT_MAPPER_API int synkit_mapper_classify_batch_ex(
92
+ const SynkitClassProblem *problem, int64_t count,
93
+ const int32_t *mappings, const int64_t *costs2,
94
+ double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
95
+ SynkitClassCallback callback, void *userdata,
96
+ SynkitClassStatistics *statistics, int32_t updates, int32_t packed_identifier);
97
+
98
+ /* Entire prepared search -> class pipeline. Intermediate mapping callbacks
99
+ * stay in C++; only class records cross the output callback. Search and class
100
+ * processing share the request deadline and core cancellation token. The
101
+ * supplied request must have classify=1; class cap applies to distinct keys.
102
+ * Classification node budget is separate and explicit. Search candidate cap
103
+ * retains its candidate units; exact class equality is never a hash test.
104
+ * Results distinguish search completion from classification completion. */
105
+ SYNKIT_MAPPER_API int synkit_mapper_solve_classified(
106
+ const SynkitMapperProblem *, const SynkitMapperRequest *,
107
+ const SynkitClassProblem *, int64_t max_canonical_nodes,
108
+ SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
109
+ /* Restricted-domain variant. The row-major n*n zero/one mask is passed intact
110
+ * to synkit_mapper_solve_domains; neither classification nor batching expands
111
+ * it. Minimum proof/completeness scope remains exactly the supplied domains. */
112
+ SYNKIT_MAPPER_API int synkit_mapper_solve_domains_classified(
113
+ const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
114
+ const SynkitClassProblem *, int64_t max_canonical_nodes,
115
+ SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
116
+
117
+ /* Search followed by incremental class delivery, with cumulative-count
118
+ * callbacks as documented above. Existing classified entry points remain
119
+ * batch interfaces. Raw search and classification still share one deadline. */
120
+ SYNKIT_MAPPER_API int synkit_mapper_solve_classified_updates(
121
+ const SynkitMapperProblem *, const SynkitMapperRequest *,
122
+ const SynkitClassProblem *, int64_t max_canonical_nodes,
123
+ SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
124
+ SYNKIT_MAPPER_API int synkit_mapper_solve_domains_classified_updates(
125
+ const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
126
+ const SynkitClassProblem *, int64_t max_canonical_nodes,
127
+ SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
128
+
129
+ /* Explicit options as above; allowed may be NULL for unrestricted search or
130
+ * the unchanged n*n zero/one kernel mask. ABI1 structs are not extended. */
131
+ SYNKIT_MAPPER_API int synkit_mapper_solve_classified_ex(
132
+ const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
133
+ const SynkitClassProblem *, int64_t max_canonical_nodes,
134
+ SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *,
135
+ int32_t updates, int32_t packed_identifier);
136
+
137
+ #ifdef __cplusplus
138
+ }
139
+ #endif
140
+ #endif
@@ -0,0 +1,33 @@
1
+ #ifndef SYNKIT_MAPPER_SYMMETRY_CPABS_H
2
+ #define SYNKIT_MAPPER_SYMMETRY_CPABS_H
3
+ #include "synkit_mapper/mapper.h"
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+ typedef struct SynkitCPABSProfile {
8
+ int64_t discovery_nodes;
9
+ int64_t subgroup_order;
10
+ int64_t canonical_calls;
11
+ int64_t augmentations;
12
+ int64_t canonical_rejections;
13
+ int64_t bound_rejections;
14
+ int32_t identity_fallback_r;
15
+ int32_t identity_fallback_p;
16
+ double discovery_seconds;
17
+ double canonical_seconds;
18
+ } SynkitCPABSProfile;
19
+ /* Read the current thread's most recent run. Profile is diagnostic, never a
20
+ * claim of complete endpoint symmetry discovery. Legacy fallback flags now
21
+ * indicate an incomplete quotient group; verified twin factors remain active. */
22
+ SYNKIT_MAPPER_API void synkit_mapper_cpabs_profile(SynkitCPABSProfile *);
23
+ typedef struct SynkitCPABSProfileV2 {
24
+ SynkitCPABSProfile base;
25
+ int64_t twin_blocks_r,twin_blocks_p,quotient_order_r,quotient_order_p;
26
+ int64_t bound_calls,seed_cost2;
27
+ double bound_seconds,seed_seconds;
28
+ } SynkitCPABSProfileV2;
29
+ SYNKIT_MAPPER_API void synkit_mapper_cpabs_profile_v2(SynkitCPABSProfileV2 *);
30
+ #ifdef __cplusplus
31
+ }
32
+ #endif
33
+ #endif
@@ -0,0 +1,302 @@
1
+ #include "synkit_mapper/core/runtime.h"
2
+ #include <limits>
3
+ #include <numeric>
4
+ #include <set>
5
+ #include <string>
6
+
7
+ namespace synkit_mapper {
8
+ namespace {
9
+ constexpr int64_t INF = std::numeric_limits<int64_t>::max() / 8;
10
+
11
+ // Integral Hungarian assignment. Forbidden domain entries have cost INF.
12
+ int64_t lap(const std::vector<std::vector<int64_t>> &cost,
13
+ const Budget &budget, std::vector<int> *assignment = nullptr) {
14
+ const int n = static_cast<int>(cost.size());
15
+ std::vector<int64_t> u(n + 1), v(n + 1);
16
+ std::vector<int> p(n + 1), way(n + 1);
17
+ for (int i = 1; i <= n; ++i) {
18
+ budget.check();
19
+ p[0] = i;
20
+ int j0 = 0;
21
+ std::vector<int64_t> slack(n + 1, INF);
22
+ std::vector<bool> used(n + 1, false);
23
+ do {
24
+ budget.check();
25
+ used[j0] = true;
26
+ int i0 = p[j0], j1 = 0;
27
+ int64_t delta = INF;
28
+ for (int j = 1; j <= n; ++j)
29
+ if (!used[j]) {
30
+ int64_t cur = cost[i0 - 1][j - 1] >= INF
31
+ ? INF
32
+ : cost[i0 - 1][j - 1] - u[i0] - v[j];
33
+ if (cur < slack[j]) {
34
+ slack[j] = cur;
35
+ way[j] = j0;
36
+ }
37
+ if (slack[j] < delta) {
38
+ delta = slack[j];
39
+ j1 = j;
40
+ }
41
+ }
42
+ if (delta >= INF)
43
+ return INF;
44
+ for (int j = 0; j <= n; ++j)
45
+ if (used[j]) {
46
+ u[p[j]] += delta;
47
+ v[j] -= delta;
48
+ } else if (slack[j] < INF)
49
+ slack[j] -= delta;
50
+ j0 = j1;
51
+ } while (p[j0] != 0);
52
+ do {
53
+ int j1 = way[j0];
54
+ p[j0] = p[j1];
55
+ j0 = j1;
56
+ } while (j0);
57
+ }
58
+ if (assignment) {
59
+ assignment->assign(n, -1);
60
+ for (int j = 1; j <= n; ++j)
61
+ (*assignment)[p[j] - 1] = j - 1;
62
+ }
63
+ return -v[0];
64
+ }
65
+
66
+ class AssignmentSearch {
67
+ const Problem &p;
68
+ const Request &r;
69
+ const uint8_t *allowed;
70
+ Callback callback;
71
+ void *userdata;
72
+ Statistics &s;
73
+ Budget budget;
74
+ std::vector<int> order;
75
+ std::vector<int32_t> mapping;
76
+ std::vector<bool> used;
77
+ int64_t best = INF;
78
+ int64_t threshold = 0;
79
+ bool optimize = false;
80
+
81
+ bool compatible(int i, int j) const {
82
+ return p.types_r[i] == p.types_p[j] &&
83
+ (!allowed || allowed[i * p.n + j]);
84
+ }
85
+ void poll() {
86
+ budget.check();
87
+ if (r.max_states >= 0 && s.nodes >= r.max_states)
88
+ throw Stop{SYNKIT_STOP_STATES};
89
+ ++s.nodes;
90
+ }
91
+ int64_t cross(int i, int j, int depth) const {
92
+ int64_t value = 0;
93
+ for (int k = 0; k < depth; ++k) {
94
+ const int a = order[k];
95
+ value += std::abs(p.a2[i * p.n + a] - p.b2[j * p.n + mapping[a]]);
96
+ }
97
+ return value;
98
+ }
99
+ // Every unresolved-to-committed pair is counted exactly once. Ignoring
100
+ // unresolved-to-unresolved pairs can only decrease the nonnegative cost.
101
+ int64_t bound(int depth, int64_t committed) {
102
+ int count = p.n - depth;
103
+ std::vector<int> products;
104
+ for (int j = 0; j < p.n; ++j)
105
+ if (!used[j])
106
+ products.push_back(j);
107
+ std::vector<std::vector<int64_t>> costs(
108
+ count, std::vector<int64_t>(count, INF));
109
+ for (int a = 0; a < count; ++a) {
110
+ budget.check();
111
+ const int i = order[depth + a];
112
+ for (int b = 0; b < count; ++b)
113
+ if (compatible(i, products[b]))
114
+ costs[a][b] = cross(i, products[b], depth);
115
+ }
116
+ int64_t rest = lap(costs, budget);
117
+ return rest >= INF ? INF : committed + rest;
118
+ }
119
+ void emit(int64_t cost) {
120
+ ++s.candidate_count;
121
+ s.labeled_count = s.candidate_count;
122
+ const auto start = Clock::now();
123
+ const int stop = callback ? callback(mapping.data(), cost, userdata) : 0;
124
+ s.callback_seconds += elapsed(start);
125
+ if (stop)
126
+ throw Stop{SYNKIT_STOP_CALLBACK};
127
+ budget.check();
128
+ if (r.max_candidates >= 0 && s.candidate_count >= r.max_candidates)
129
+ throw Stop{SYNKIT_STOP_CANDIDATES};
130
+ }
131
+ void visit(int depth, int64_t committed) {
132
+ poll();
133
+ const int64_t cutoff = optimize ? best : threshold;
134
+ if ((optimize && committed >= cutoff) || (!optimize && committed > cutoff))
135
+ return;
136
+ if (depth == p.n) {
137
+ ++s.leaves;
138
+ if (optimize) {
139
+ best = committed;
140
+ s.incumbent2 = best;
141
+ } else if (r.query != SYNKIT_EXACT_DISTANCE || committed == threshold)
142
+ emit(committed);
143
+ return;
144
+ }
145
+ int64_t lower = bound(depth, committed);
146
+ if ((optimize && lower >= cutoff) || (!optimize && lower > cutoff))
147
+ return;
148
+ const int i = order[depth];
149
+ std::vector<std::pair<int64_t, int>> choices;
150
+ for (int j = 0; j < p.n; ++j)
151
+ if (!used[j] && compatible(i, j))
152
+ choices.emplace_back(cross(i, j, depth), j);
153
+ std::sort(choices.begin(), choices.end());
154
+ for (auto [delta, j] : choices) {
155
+ mapping[i] = j;
156
+ used[j] = true;
157
+ visit(depth + 1, committed + delta);
158
+ used[j] = false;
159
+ mapping[i] = -1;
160
+ }
161
+ }
162
+
163
+ public:
164
+ AssignmentSearch(const Problem &problem, const Request &request,
165
+ const uint8_t *domains, Callback cb, void *data,
166
+ Statistics &statistics)
167
+ : p(problem), r(request), allowed(domains), callback(cb), userdata(data),
168
+ s(statistics), budget(r), order(p.n), mapping(p.n, -1),
169
+ used(p.n, false) {}
170
+ int run() {
171
+ if (r.classify || r.max_classes != -1 || r.max_frontier != -1 ||
172
+ r.memory_limit_bytes != -1 || r.symmetry)
173
+ return unsupported(s);
174
+ double phase = 0;
175
+ try {
176
+ budget.check();
177
+ std::iota(order.begin(), order.end(), 0);
178
+ std::vector<int> sizes(p.n), degrees(p.n);
179
+ for (int i = 0; i < p.n; ++i)
180
+ for (int j = 0; j < p.n; ++j) {
181
+ sizes[i] += compatible(i, j);
182
+ degrees[i] += p.a2[i * p.n + j] != 0;
183
+ }
184
+ std::stable_sort(order.begin(), order.end(), [&](int a, int b) {
185
+ return sizes[a] == sizes[b] ? degrees[a] > degrees[b]
186
+ : sizes[a] < sizes[b];
187
+ });
188
+ std::vector<std::vector<int64_t>> seed_cost(
189
+ p.n, std::vector<int64_t>(p.n, INF));
190
+ for (int i = 0; i < p.n; ++i) {
191
+ budget.check();
192
+ for (int j = 0; j < p.n; ++j)
193
+ if (compatible(i, j))
194
+ seed_cost[i][j] = 0;
195
+ }
196
+ std::vector<int> seed;
197
+ if (lap(seed_cost, budget, &seed) < INF) {
198
+ std::vector<int32_t> candidate(seed.begin(), seed.end());
199
+ best = mapping_cost2(p, candidate);
200
+ s.incumbent2 = best;
201
+ }
202
+ s.model_seconds = budget.seconds();
203
+ phase = budget.seconds();
204
+ if (r.query == SYNKIT_MINIMUM_CLASSES || r.query == SYNKIT_MINIMUM_PROOF) {
205
+ optimize = true;
206
+ if (best > 0 && best < INF)
207
+ visit(0, 0);
208
+ budget.check();
209
+ s.optimization_seconds = budget.seconds() - phase;
210
+ if (best < INF) {
211
+ s.minimum_proven = 1;
212
+ s.minimum2 = s.lower_bound2 = best;
213
+ }
214
+ if (r.query == SYNKIT_MINIMUM_PROOF || best == INF) {
215
+ s.search_complete = 1;
216
+ s.elapsed_seconds = budget.seconds();
217
+ return 0;
218
+ }
219
+ threshold = best;
220
+ } else
221
+ threshold = r.target2;
222
+ optimize = false;
223
+ phase = budget.seconds();
224
+ visit(0, 0);
225
+ budget.check();
226
+ s.enumeration_seconds = budget.seconds() - phase;
227
+ s.search_complete = 1;
228
+ if (s.labeled_count < 0)
229
+ s.labeled_count = 0;
230
+ } catch (const Stop &stop) {
231
+ if (optimize)
232
+ s.optimization_seconds = budget.seconds() - phase;
233
+ else
234
+ s.enumeration_seconds = budget.seconds() - phase;
235
+ stopped(s, stop.reason);
236
+ }
237
+ s.elapsed_seconds = budget.seconds();
238
+ return 0;
239
+ }
240
+ };
241
+ } // namespace
242
+
243
+ int solve_abb(const Problem &p, const Request &r, const uint8_t *domains,
244
+ Callback cb, void *data, Statistics &s) {
245
+ return AssignmentSearch(p, r, domains, cb, data, s).run();
246
+ }
247
+ } // namespace synkit_mapper
248
+
249
+ namespace {
250
+ thread_local std::string assignment_error;
251
+ }
252
+ extern "C" const char *synkit_mapper_assignment_error(void) {
253
+ return assignment_error.c_str();
254
+ }
255
+ extern "C" int synkit_mapper_kernel_domains(
256
+ int32_t n, int64_t count, const int32_t *mappings,
257
+ const int32_t *types_r, const int32_t *types_p, int32_t close_block_size,
258
+ uint8_t *allowed) {
259
+ assignment_error.clear();
260
+ try {
261
+ if (n < 1 || n > 1024 || count < 1 || count > 1000000 || !mappings ||
262
+ !types_r || !types_p || !allowed || close_block_size < 0)
263
+ throw std::invalid_argument("Invalid native uncertainty-kernel arguments");
264
+ std::fill(allowed, allowed + n * n, uint8_t{0});
265
+ for (int64_t k = 0; k < count; ++k) {
266
+ std::vector<bool> seen(n, false);
267
+ for (int i = 0; i < n; ++i) {
268
+ const int j = mappings[k * n + i];
269
+ if (j < 0 || j >= n || seen[j] || types_r[i] != types_p[j])
270
+ throw std::invalid_argument("Kernel candidate is not a compatible bijection");
271
+ seen[j] = true;
272
+ allowed[i * n + j] = 1;
273
+ }
274
+ }
275
+ std::map<int32_t, std::vector<int>> rows;
276
+ for (int i = 0; i < n; ++i) {
277
+ int size = 0;
278
+ for (int j = 0; j < n; ++j)
279
+ size += allowed[i * n + j];
280
+ if (size > 1)
281
+ rows[types_r[i]].push_back(i);
282
+ }
283
+ for (const auto &[type, block] : rows) {
284
+ (void)type;
285
+ if (static_cast<int>(block.size()) > close_block_size)
286
+ continue;
287
+ std::set<int> products;
288
+ for (int i : block)
289
+ for (int j = 0; j < n; ++j)
290
+ if (allowed[i * n + j])
291
+ products.insert(j);
292
+ if (products.size() == block.size())
293
+ for (int i : block)
294
+ for (int j : products)
295
+ allowed[i * n + j] = 1;
296
+ }
297
+ return 0;
298
+ } catch (const std::exception &e) {
299
+ assignment_error = e.what();
300
+ return -1;
301
+ }
302
+ }
@@ -0,0 +1,12 @@
1
+ cmake_minimum_required(VERSION 3.16)
2
+ project(synkit_astar_standalone LANGUAGES CXX)
3
+
4
+ add_executable(astar_graph astar_graph.cpp astar.cpp bound.cpp)
5
+ target_compile_features(astar_graph PRIVATE cxx_std_17)
6
+ target_include_directories(astar_graph PRIVATE ../../include)
7
+ set_target_properties(astar_graph PROPERTIES CXX_EXTENSIONS OFF)
8
+ if(MSVC)
9
+ target_compile_options(astar_graph PRIVATE /W4)
10
+ else()
11
+ target_compile_options(astar_graph PRIVATE -Wall -Wextra -Wpedantic)
12
+ endif()
@@ -0,0 +1,47 @@
1
+ # Weighted best-first atom assignment
2
+
3
+ The module searches compatible bijections with a priority queue ordered by an
4
+ admissible bound in integer doubled-CD units. “Weighted” describes the Lewis
5
+ edge costs. The heuristic multiplier is exactly one; this is not the
6
+ suboptimal, inflated-heuristic variant sometimes called weighted A*.
7
+
8
+ For a partial map `p:S -> T`, let `U,V` be its residual vertices. Its committed
9
+ cost `g` contains exactly the pairs wholly in `S`. For a compatible `i -> j`,
10
+ let `c(i,j)` sum the discrepancies from `i,j` to all committed pairs. For each
11
+ hard atom type, sort the residual incident edge weights at `i` and `j`,
12
+ including zero weights and excluding the vertex itself. Let `q(i,j)` be the
13
+ sum of absolute differences between these sorted lists over all types.
14
+
15
+ Any compatible completion pairs those lists by a permutation. Sorted pairing
16
+ minimizes one-dimensional absolute discrepancy, so `q(i,j)` is no larger
17
+ than that completion's residual incident discrepancy. Summing over a complete
18
+ residual assignment counts every residual-residual edge twice. Consequently
19
+
20
+ h = ceil(min_compatible_assignment sum(2*c(i,j) + q(i,j)) / 2)
21
+
22
+ is no greater than the integral residual cost. The bound `g+h` has no double
23
+ counting: committed pairs are in `g`, committed/residual pairs are in `c`,
24
+ and residual pairs are covered by the half incident bound. Nonbonding-electron
25
+ anchors, if present in the common encoding, are ordinary forced typed vertices;
26
+ the module adds no second unary electron term.
27
+
28
+ Each state stores the entire partial image vector. A deterministic fixed
29
+ source order gives every labeled bijection one path; there is no symmetry
30
+ pruning and no closed set keyed by a used-target set or hash. In particular,
31
+ this implementation enumerates labeled mappings and requires the shared
32
+ classification stage for all-class output.
33
+
34
+ The first complete state removed from the queue proves the minimum, because
35
+ every unexpanded completion is bounded below by a queued state's bound.
36
+ Continuing until the least queue bound exceeds that optimum enumerates every
37
+ minimum labeled mapping. Numeric exact and at-most queries retain their
38
+ original threshold even after finding a cheaper mapping. Exact queries filter
39
+ only full-state costs; their threshold is never an incumbent.
40
+
41
+ An empty exhausted frontier proves the selected shell/interval complete (and
42
+ can prove no compatible completion). Time, cancellation, candidate, state and
43
+ frontier-memory stops preserve incomplete enumeration; a minimum already
44
+ proved remains a separate fact. Frontier bytes describe allocated state and
45
+ queue storage accounted by this implementation, not whole-process RSS or an
46
+ enforced operating-system memory limit. Tests compare partial bounds against
47
+ independently scored exhaustive completions and complete tiny mapping sets.