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,750 @@
1
+ /*****************************************************************************
2
+ * *
3
+ * Auxiliary source file for version 2.9 of nauty. *
4
+ * *
5
+ * Subject to the conditions and dislaimers in the file COPYRIGHT. *
6
+ * *
7
+ * CHANGE HISTORY *
8
+ * 10-Nov-87 : final changes for version 1.2 *
9
+ * 5-Dec-87 : renamed to version 1.3 (no changes to this file) *
10
+ * 28-Sep-88 : renamed to version 1.4 (no changes to this file) *
11
+ * 23-Mar-89 : changes for version 1.5 : *
12
+ * - added procedure refine1() *
13
+ * - changed type of ptn from int* to nvector* in fmptn() *
14
+ * - declared level in breakout() *
15
+ * - changed char[] to char* in a few places *
16
+ * - minor rearrangement in bestcell() *
17
+ * 31-Mar-89 : - added procedure doref() *
18
+ * 5-Apr-89 : - changed MAKEEMPTY uses to EMPTYSET *
19
+ * 12-Apr-89 : - changed writeperm() and fmperm() to not use MARKing *
20
+ * 5-May-89 : - redefined MASH to gain about 8% efficiency *
21
+ * 18-Oct-90 : changes for version 1.6 : *
22
+ * - improved line breaking in writeperm() *
23
+ * 10-Nov-90 : - added dummy routine nautil_null() *
24
+ * 27-Aug-92 : changes for version 1.7 : *
25
+ * - made linelength <= 0 mean no line breaks *
26
+ * 5-Jun-93 : renamed to version 1.7+ (no changes to this file) *
27
+ * 18-Aug-93 : renamed to version 1.8 (no changes to this file) *
28
+ * 17-Sep-93 : renamed to version 1.9 (no changes to this file) *
29
+ * 29-Jun-95 : changes for version 1.10 : *
30
+ * - replaced loop in nextelement() to save reference past *
31
+ * end of array (thanks to Kevin Maylsiak) *
32
+ * 11-Jul-96 : changes for version 2.0 : *
33
+ * - added alloc_error() *
34
+ * - added dynamic allocation *
35
+ * 21-Oct-98 : use 077777 in place of INFINITY for CLEANUP() *
36
+ * 9-Jan-00 : added nautil_check() *
37
+ * 12-Feb-00 : did a little formating of the code *
38
+ * 28-May-00 : added nautil_freedyn() *
39
+ * 16-Aug-00 : added OLDNAUTY behaviour *
40
+ * 16-Nov-00 : moved graph-specific things to naugraph.c *
41
+ * use function prototypes, remove UPROC, nvector *
42
+ * 22-Apr-01 : added code for compilation into Magma *
43
+ * removed nautil_null() *
44
+ * removed EXTDEFS and included labelorg *
45
+ * 21-Nov-01 : use NAUTYREQUIRED in nautil_check() *
46
+ * 26-Jun-02 : revised permset() to avoid fetch past the end of *
47
+ * the array (thanks to Jan Kieffer) *
48
+ * 17-Nov-03 : changed INFINITY to NAUTY_INFINITY *
49
+ * 14-Sep-04 : extended prototypes to recursive functions *
50
+ * 23-Nov-06 : replave targetcell() by maketargetcell() *
51
+ * 10-Dec-06 : remove BIGNAUTY *
52
+ * 10-Dec-10 : remove shortish and permutation types *
53
+ * 11-May-10 : use sorttemplates.c *
54
+ * 27-Mar-11 : add writegroupsize() *
55
+ * 15-Jan-12 : add TLS_ATTR attributes *
56
+ * 16-Sep-12 : small change to objoin(), more efficient for sparse case *
57
+ * 22-Sep-12 : change documentation of orbjoin() *
58
+ * 18-Jan-12 : changes for version 2.6 : *
59
+ * - declare nauty_kill_request *
60
+ * 8-May-20 : add const declarations to prototypes *
61
+ * 22-Jan-25 : moved the noreturn attribute on alloc_error() *
62
+ * *
63
+ *****************************************************************************/
64
+
65
+ #define ONE_WORD_SETS
66
+ #include "nauty.h"
67
+ #ifdef NAUTY_IN_MAGMA
68
+ #include "io.e"
69
+ #endif
70
+
71
+ /* macros for hash-codes: */
72
+ /* Don't use NAUTY_INFINITY here as that would make the canonical
73
+ * labelling depend on whether BIGNAUTY is in operation */
74
+ #define MASH(l,i) ((((l) ^ 065435) + (i)) & 077777)
75
+ /* : expression whose long value depends only on long l and int/long i.
76
+ Anything goes, preferably non-commutative. */
77
+
78
+ #define CLEANUP(l) ((int)((l) % 077777))
79
+ /* : expression whose value depends on long l and is less than 077777
80
+ when converted to int then short. Anything goes. */
81
+
82
+ #if MAXM==1
83
+ #define M 1
84
+ #else
85
+ #define M m
86
+ #endif
87
+
88
+ #if !MAXN
89
+ DYNALLSTAT(int,workperm,workperm_sz);
90
+ #else
91
+ static TLS_ATTR int workperm[MAXN];
92
+ #endif
93
+
94
+ int labelorg = 0; /* no TLS_ATTR on purpose */
95
+ volatile int nauty_kill_request = 0; /* no TLS_ATTR on purpose */
96
+
97
+ /* aproto: header new_nauty_protos.h */
98
+
99
+ /*****************************************************************************
100
+ * *
101
+ * nextelement(set1,m,pos) = the position of the first element in set set1 *
102
+ * which occupies a position greater than pos. If no such element exists, *
103
+ * the value is -1. pos can have any value less than n, including negative *
104
+ * values. *
105
+ * *
106
+ * GLOBALS ACCESSED: none *
107
+ * *
108
+ *****************************************************************************/
109
+
110
+ int
111
+ nextelement(const set *set1, int m, int pos)
112
+ {
113
+ setword setwd;
114
+ int w;
115
+
116
+ if (m == 1)
117
+ {
118
+ if (pos < 0) setwd = set1[0];
119
+ else setwd = set1[0] & BITMASK(pos);
120
+
121
+ if (setwd == 0) return -1;
122
+ else return FIRSTBITNZ(setwd);
123
+ }
124
+
125
+ if (pos < 0)
126
+ {
127
+ w = 0;
128
+ setwd = set1[0];
129
+ }
130
+ else
131
+ {
132
+ w = SETWD(pos);
133
+ setwd = set1[w] & BITMASK(SETBT(pos));
134
+ }
135
+
136
+ for (;;)
137
+ {
138
+ if (setwd != 0) return TIMESWORDSIZE(w) + FIRSTBITNZ(setwd);
139
+ if (++w == m) return -1;
140
+ setwd = set1[w];
141
+ }
142
+ }
143
+
144
+ /*****************************************************************************
145
+ * *
146
+ * permset(set1,set2,m,perm) defines set2 to be the set *
147
+ * {perm[i] | i in set1}. *
148
+ * *
149
+ * GLOBALS ACCESSED: bit<r>,leftbit<r> *
150
+ * *
151
+ *****************************************************************************/
152
+
153
+ void
154
+ permset(const set *set1, set *set2, int m, int *perm)
155
+ {
156
+ setword setw;
157
+ int pos,b;
158
+ int w;
159
+
160
+ if (m == 1)
161
+ {
162
+ *set2 = 0;
163
+ setw = set1[0];
164
+ while (setw != 0)
165
+ {
166
+ TAKEBIT(b,setw);
167
+ *set2 |= bit[perm[b]];
168
+ }
169
+ }
170
+ else
171
+ {
172
+ EMPTYSET0(set2,m);
173
+ for (w = 0; w < m; ++w)
174
+ {
175
+ setw = set1[w];
176
+ while (setw != 0)
177
+ {
178
+ TAKEBIT(b,setw);
179
+ pos = perm[TIMESWORDSIZE(w)+b];
180
+ ADDELEMENT0(set2,pos);
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ /*****************************************************************************
187
+ * *
188
+ * putstring(f,s) writes the nul-terminated string s to file f. *
189
+ * *
190
+ *****************************************************************************/
191
+
192
+ void
193
+ putstring(FILE *f, const char *s)
194
+ {
195
+ while (*s != '\0')
196
+ {
197
+ PUTC(*s,f);
198
+ ++s;
199
+ }
200
+ }
201
+
202
+ /*****************************************************************************
203
+ * *
204
+ * itos(i,s) converts the int i to a nul-terminated decimal character *
205
+ * string s. The value returned is the number of characters excluding *
206
+ * the nul. *
207
+ * *
208
+ * GLOBALS ACCESSED: NONE *
209
+ * *
210
+ *****************************************************************************/
211
+
212
+ int
213
+ itos(int i, char *s)
214
+ {
215
+ int digit,j,k;
216
+ char c;
217
+ int ans;
218
+
219
+ if (i < 0)
220
+ {
221
+ k = 0;
222
+ i = -i;
223
+ j = 1;
224
+ s[0] = '-';
225
+ }
226
+ else
227
+ {
228
+ k = -1;
229
+ j = 0;
230
+ }
231
+
232
+ do
233
+ {
234
+ digit = i % 10;
235
+ i = i / 10;
236
+ s[++k] = (char)(digit + '0');
237
+ }
238
+ while (i);
239
+
240
+ s[k+1] = '\0';
241
+ ans = k + 1;
242
+
243
+ for (; j < k; ++j, --k)
244
+ {
245
+ c = s[j];
246
+ s[j] = s[k];
247
+ s[k] = c;
248
+ }
249
+
250
+ return ans;
251
+ }
252
+
253
+ /*****************************************************************************
254
+ * *
255
+ * orbits represents a partition of {0,1,...,n-1}, by orbits[i] = the *
256
+ * smallest element in the same cell as i. map[] is any array with values *
257
+ * in {0,1,...,n-1}. orbjoin(orbits,map,n) joins the cells of orbits[] *
258
+ * together to the minimum extent such that for each i, i and map[i] are in *
259
+ * the same cell. The function value returned is the new number of cells. *
260
+ * *
261
+ * GLOBALS ACCESSED: NONE *
262
+ * *
263
+ *****************************************************************************/
264
+
265
+ int
266
+ orbjoin(int *orbits, const int *map, int n)
267
+ {
268
+ int i,j1,j2;
269
+
270
+ for (i = 0; i < n; ++i)
271
+ if (map[i] != i)
272
+ {
273
+ j1 = orbits[i];
274
+ while (orbits[j1] != j1) j1 = orbits[j1];
275
+ j2 = orbits[map[i]];
276
+ while (orbits[j2] != j2) j2 = orbits[j2];
277
+
278
+ if (j1 < j2) orbits[j2] = j1;
279
+ else if (j1 > j2) orbits[j1] = j2;
280
+ }
281
+
282
+ j1 = 0;
283
+ for (i = 0; i < n; ++i)
284
+ if ((orbits[i] = orbits[orbits[i]]) == i) ++j1;
285
+
286
+ return j1;
287
+ }
288
+
289
+ /*****************************************************************************
290
+ * *
291
+ * writeperm(f,perm,cartesian,linelength,n) writes the permutation perm to *
292
+ * the file f. The cartesian representation (i.e. perm itself) is used if *
293
+ * cartesian != FALSE; otherwise the cyclic representation is used. No *
294
+ * more than linelength characters (not counting '\n') are written on each *
295
+ * line, unless linelength is ridiculously small. linelength<=0 causes no *
296
+ * line breaks at all to be made. The global int labelorg is added to each *
297
+ * vertex number. *
298
+ * *
299
+ * GLOBALS ACCESSED: itos(),putstring() *
300
+ * *
301
+ *****************************************************************************/
302
+
303
+ void
304
+ writeperm(FILE *f, const int *perm, boolean cartesian, int linelength, int n)
305
+ {
306
+ int i,k,l,curlen,intlen;
307
+ char s[30];
308
+
309
+ #if !MAXN
310
+ DYNALLOC1(int,workperm,workperm_sz,n,"writeperm");
311
+ #endif
312
+
313
+ /* CONDNL(x) writes end-of-line and 3 spaces if x characters
314
+ won't fit on the current line. */
315
+ #define CONDNL(x) if (linelength>0 && curlen+(x)>linelength)\
316
+ {putstring(f,"\n ");curlen=3;}
317
+
318
+ curlen = 0;
319
+ if (cartesian)
320
+ {
321
+ for (i = 0; i < n; ++i)
322
+ {
323
+ intlen = itos(perm[i]+labelorg,s);
324
+ CONDNL(intlen+1);
325
+ PUTC(' ',f);
326
+ putstring(f,s);
327
+ curlen += intlen + 1;
328
+ }
329
+ PUTC('\n',f);
330
+ }
331
+ else
332
+ {
333
+ for (i = n; --i >= 0;) workperm[i] = 0;
334
+
335
+ for (i = 0; i < n; ++i)
336
+ {
337
+ if (workperm[i] == 0 && perm[i] != i)
338
+ {
339
+ l = i;
340
+ intlen = itos(l+labelorg,s);
341
+ if (curlen > 3) CONDNL(2*intlen+4);
342
+ PUTC('(',f);
343
+ do
344
+ {
345
+ putstring(f,s);
346
+ curlen += intlen + 1;
347
+ k = l;
348
+ l = perm[l];
349
+ workperm[k] = 1;
350
+ if (l != i)
351
+ {
352
+ intlen = itos(l+labelorg,s);
353
+ CONDNL(intlen+2);
354
+ PUTC(' ',f);
355
+ }
356
+ }
357
+ while (l != i);
358
+ PUTC(')',f);
359
+ ++curlen;
360
+ }
361
+ }
362
+
363
+ if (curlen == 0) putstring(f,"(1)\n");
364
+ else PUTC('\n',f);
365
+ }
366
+ }
367
+
368
+ /*****************************************************************************
369
+ * *
370
+ * fmperm(perm,fix,mcr,m,n) uses perm to construct fix and mcr. fix *
371
+ * contains those points are fixed by perm, while mcr contains the set of *
372
+ * those points which are least in their orbits. *
373
+ * *
374
+ * GLOBALS ACCESSED: bit<r> *
375
+ * *
376
+ *****************************************************************************/
377
+
378
+ void
379
+ fmperm(const int *perm, set *fix, set *mcr, int m, int n)
380
+ {
381
+ int i,k,l;
382
+
383
+ #if !MAXN
384
+ DYNALLOC1(int,workperm,workperm_sz,n,"writeperm");
385
+ #endif
386
+
387
+ EMPTYSET(fix,m);
388
+ EMPTYSET(mcr,m);
389
+
390
+ for (i = n; --i >= 0;) workperm[i] = 0;
391
+
392
+ for (i = 0; i < n; ++i)
393
+ if (perm[i] == i)
394
+ {
395
+ ADDELEMENT(fix,i);
396
+ ADDELEMENT(mcr,i);
397
+ }
398
+ else if (workperm[i] == 0)
399
+ {
400
+ l = i;
401
+ do
402
+ {
403
+ k = l;
404
+ l = perm[l];
405
+ workperm[k] = 1;
406
+ }
407
+ while (l != i);
408
+
409
+ ADDELEMENT(mcr,i);
410
+ }
411
+ }
412
+
413
+ /*****************************************************************************
414
+ * *
415
+ * fmptn(lab,ptn,level,fix,mcr,m,n) uses the partition at the specified *
416
+ * level in the partition nest (lab,ptn) to make sets fix and mcr. fix *
417
+ * represents the points in trivial cells of the partition, while mcr *
418
+ * represents those points which are least in their cells. *
419
+ * *
420
+ * GLOBALS ACCESSED: bit<r> *
421
+ * *
422
+ *****************************************************************************/
423
+
424
+ void
425
+ fmptn(const int *lab, const int *ptn, int level, set *fix, set *mcr, int m, int n)
426
+ {
427
+ int i,lmin;
428
+
429
+ EMPTYSET(fix,m);
430
+ EMPTYSET(mcr,m);
431
+
432
+ for (i = 0; i < n; ++i)
433
+ if (ptn[i] <= level)
434
+ {
435
+ ADDELEMENT(fix,lab[i]);
436
+ ADDELEMENT(mcr,lab[i]);
437
+ }
438
+ else
439
+ {
440
+ lmin = lab[i];
441
+ do
442
+ if (lab[++i] < lmin) lmin = lab[i];
443
+ while (ptn[i] > level);
444
+ ADDELEMENT(mcr,lmin);
445
+ }
446
+ }
447
+
448
+ #define SORT_TYPE1 int
449
+ #define SORT_TYPE2 int
450
+ #define SORT_OF_SORT 2
451
+ #define SORT_NAME sortparallel
452
+ #include "sorttemplates.c"
453
+
454
+ /*****************************************************************************
455
+ * *
456
+ * doref(g,lab,ptn,level,numcells,qinvar,invar,active,code,refproc, *
457
+ * invarproc,mininvarlev,maxinvarlev,invararg,digraph,m,n) *
458
+ * is used to perform a refinement on the partition at the given level in *
459
+ * (lab,ptn). The number of cells is *numcells both for input and output. *
460
+ * The input active is the active set for input to the refinement procedure *
461
+ * (*refproc)(), which must have the argument list of refine(). *
462
+ * active may be arbitrarily changed. invar is used for working storage. *
463
+ * First, (*refproc)() is called. Then, if invarproc!=NULL and *
464
+ * |mininvarlev| <= level <= |maxinvarlev|, the routine (*invarproc)() is *
465
+ * used to compute a vertex-invariant which may refine the partition *
466
+ * further. If it does, (*refproc)() is called again, using an active set *
467
+ * containing all but the first fragment of each old cell. Unless g is a *
468
+ * digraph, this guarantees that the final partition is equitable. The *
469
+ * arguments invararg and digraph are passed to (*invarproc)() *
470
+ * uninterpretted. The output argument code is a composite of the codes *
471
+ * from all the calls to (*refproc)(). The output argument qinvar is set *
472
+ * to 0 if (*invarproc)() is not applied, 1 if it is applied but fails to *
473
+ * refine the partition, and 2 if it succeeds. *
474
+ * See the file nautinv.c for a further discussion of vertex-invariants. *
475
+ * Note that the dreadnaut I command generates a call to this procedure *
476
+ * with level = mininvarlevel = maxinvarlevel = 0. *
477
+ * *
478
+ *****************************************************************************/
479
+
480
+ void
481
+ doref(graph *g, int *lab, int *ptn, int level, int *numcells,
482
+ int *qinvar, int *invar, set *active, int *code,
483
+ void (*refproc)(graph*,int*,int*,int,int*,int*,set*,int*,int,int),
484
+ void (*invarproc)(graph*,int*,int*,int,int,int,int*,
485
+ int,boolean,int,int),
486
+ int mininvarlev, int maxinvarlev, int invararg,
487
+ boolean digraph, int m, int n)
488
+ {
489
+ int pw;
490
+ int i,cell1,cell2,nc,tvpos,minlev,maxlev;
491
+ long longcode;
492
+ boolean same;
493
+
494
+ #if !MAXN
495
+ DYNALLOC1(int,workperm,workperm_sz,n,"doref");
496
+ #endif
497
+
498
+ if ((tvpos = nextelement(active,M,-1)) < 0) tvpos = 0;
499
+
500
+ (*refproc)(g,lab,ptn,level,numcells,invar,active,code,M,n);
501
+
502
+ minlev = (mininvarlev < 0 ? -mininvarlev : mininvarlev);
503
+ maxlev = (maxinvarlev < 0 ? -maxinvarlev : maxinvarlev);
504
+ if (invarproc != NULL && *numcells < n
505
+ && level >= minlev && level <= maxlev)
506
+ {
507
+ (*invarproc)(g,lab,ptn,level,*numcells,tvpos,invar,invararg,
508
+ digraph,M,n);
509
+ EMPTYSET(active,m);
510
+ for (i = n; --i >= 0;) workperm[i] = invar[lab[i]];
511
+ nc = *numcells;
512
+ for (cell1 = 0; cell1 < n; cell1 = cell2 + 1)
513
+ {
514
+ pw = workperm[cell1];
515
+ same = TRUE;
516
+ for (cell2 = cell1; ptn[cell2] > level; ++cell2)
517
+ if (workperm[cell2+1] != pw) same = FALSE;
518
+
519
+ if (same) continue;
520
+
521
+ sortparallel(workperm+cell1, lab+cell1, cell2-cell1+1);
522
+
523
+ for (i = cell1 + 1; i <= cell2; ++i)
524
+ if (workperm[i] != workperm[i-1])
525
+ {
526
+ ptn[i-1] = level;
527
+ ++*numcells;
528
+ ADDELEMENT(active,i);
529
+ }
530
+ }
531
+
532
+ if (*numcells > nc)
533
+ {
534
+ *qinvar = 2;
535
+ longcode = *code;
536
+ (*refproc)(g,lab,ptn,level,numcells,invar,active,code,M,n);
537
+ longcode = MASH(longcode,*code);
538
+ *code = CLEANUP(longcode);
539
+ }
540
+ else
541
+ *qinvar = 1;
542
+ }
543
+ else
544
+ *qinvar = 0;
545
+ }
546
+
547
+ /*****************************************************************************
548
+ * *
549
+ * maketargetcell(g,lab,ptn,level,tcell,tcellsize,&cellpos, *
550
+ * tc_level,digraph,hint,targetcell,m,n) *
551
+ * calls targetcell() to determine the target cell at the specified level *
552
+ * in the partition nest (lab,ptn). It must be a nontrivial cell (if not, *
553
+ * the first cell. The intention of hint is that, if hint >= 0 and there *
554
+ * is a suitable non-trivial cell starting at position hint in lab, *
555
+ * that cell is chosen. *
556
+ * tc_level and digraph are input options. *
557
+ * When a cell is chosen, tcell is set to its contents, *tcellsize to its *
558
+ * size, and cellpos to its starting position in lab. *
559
+ * *
560
+ * GLOBALS ACCESSED: bit<r> *
561
+ * *
562
+ *****************************************************************************/
563
+
564
+ void
565
+ maketargetcell(graph *g, int *lab, int *ptn, int level,
566
+ set *tcell, int *tcellsize, int *cellpos, int tc_level,
567
+ boolean digraph, int hint,
568
+ int (*targetcell)(graph*,int*,int*,int,int,boolean,int,int,int),
569
+ int m, int n)
570
+ {
571
+ int i,j,k;
572
+
573
+ i = (*targetcell)(g,lab,ptn,level,tc_level,digraph,hint,m,n);
574
+ for (j = i + 1; ptn[j] > level; ++j) {}
575
+
576
+ *tcellsize = j - i + 1;
577
+
578
+ EMPTYSET(tcell,m);
579
+ for (k = i; k <= j; ++k) ADDELEMENT(tcell,lab[k]);
580
+
581
+ *cellpos = i;
582
+ }
583
+
584
+ /*****************************************************************************
585
+ * *
586
+ * shortprune(set1,set2,m) ANDs the contents of set set2 into set set1. *
587
+ * *
588
+ * GLOBALS ACCESSED: NONE *
589
+ * *
590
+ *****************************************************************************/
591
+
592
+ void
593
+ shortprune(set *set1, const set *set2, int m)
594
+ {
595
+ int i;
596
+
597
+ for (i = 0; i < M; ++i) INTERSECT(set1[i],set2[i]);
598
+ }
599
+
600
+ /*****************************************************************************
601
+ * *
602
+ * breakout(lab,ptn,level,tc,tv,active,m) operates on the partition at *
603
+ * the specified level in the partition nest (lab,ptn). It finds the *
604
+ * element tv, which is in the cell C starting at index tc in lab (it had *
605
+ * better be) and splits C in the two cells {tv} and C\{tv}, in that order. *
606
+ * It also sets the set active to contain just the element tc. *
607
+ * *
608
+ * GLOBALS ACCESSED: bit<r> *
609
+ * *
610
+ *****************************************************************************/
611
+
612
+ void
613
+ breakout(int *lab, int *ptn, int level, int tc, int tv,
614
+ set *active, int m)
615
+ {
616
+ int i,prev,next;
617
+
618
+ EMPTYSET(active,m);
619
+ ADDELEMENT(active,tc);
620
+
621
+ i = tc;
622
+ prev = tv;
623
+
624
+ do
625
+ {
626
+ next = lab[i];
627
+ lab[i++] = prev;
628
+ prev = next;
629
+ }
630
+ while (prev != tv);
631
+
632
+ ptn[tc] = level;
633
+ }
634
+
635
+ /*****************************************************************************
636
+ * *
637
+ * longprune(tcell,fix,bottom,top,m) removes zero or elements of the set *
638
+ * tcell. It is assumed that addresses bottom through top-1 contain *
639
+ * contiguous pairs of sets (f1,m1),(f2,m2), ... . tcell is intersected *
640
+ * with each mi such that fi is a subset of fix. *
641
+ * *
642
+ * GLOBALS ACCESSED: NONE *
643
+ * *
644
+ *****************************************************************************/
645
+
646
+ void
647
+ longprune(set *tcell, set *fix, set *bottom, set *top, int m)
648
+ {
649
+ int i;
650
+
651
+ while (bottom < top)
652
+ {
653
+ for (i = 0; i < M; ++i)
654
+ if (NOTSUBSET(fix[i],bottom[i])) break;
655
+ bottom += M;
656
+
657
+ if (i == M)
658
+ for (i = 0; i < M; ++i) INTERSECT(tcell[i],bottom[i]);
659
+ bottom += M;
660
+ }
661
+ }
662
+
663
+ /*****************************************************************************
664
+ * *
665
+ * writegroupsize(f,gpsize1,gpsize2) writes a real number gpsize1*10^gpsize2 *
666
+ * It is assumed that gpsize1 >= 1 and that gpsize1 equals an integer in the *
667
+ * case that gpsize2==0. These assumptions are true for group sizes *
668
+ * computed by nauty. *
669
+ * *
670
+ *****************************************************************************/
671
+
672
+ void
673
+ writegroupsize(FILE *f, double gpsize1, int gpsize2)
674
+ {
675
+ if (gpsize2 == 0)
676
+ fprintf(f,"%.0f",gpsize1+0.1);
677
+ else
678
+ {
679
+ while (gpsize1 >= 10.0)
680
+ {
681
+ gpsize1 /= 10.0;
682
+ ++gpsize2;
683
+ }
684
+ fprintf(f,"%14.12fe%d",gpsize1,gpsize2);
685
+ }
686
+ }
687
+
688
+ /*****************************************************************************
689
+ * *
690
+ * nautil_check() checks that this file is compiled compatibly with the *
691
+ * given parameters. If not, call exit(1). *
692
+ * *
693
+ *****************************************************************************/
694
+
695
+ void
696
+ nautil_check(int wordsize, int m, int n, int version)
697
+ {
698
+ if (wordsize != WORDSIZE)
699
+ {
700
+ fprintf(ERRFILE,"Error: WORDSIZE mismatch in nautil.c\n");
701
+ exit(1);
702
+ }
703
+
704
+ #if MAXN
705
+ if (m > MAXM)
706
+ {
707
+ fprintf(ERRFILE,"Error: MAXM inadequate in nautil.c\n");
708
+ exit(1);
709
+ }
710
+
711
+ if (n > MAXN)
712
+ {
713
+ fprintf(ERRFILE,"Error: MAXN inadequate in nautil.c\n");
714
+ exit(1);
715
+ }
716
+ #endif
717
+
718
+ if (version < NAUTYREQUIRED)
719
+ {
720
+ fprintf(ERRFILE,"Error: nautil.c version mismatch\n");
721
+ exit(1);
722
+ }
723
+ }
724
+
725
+ /*****************************************************************************
726
+ * *
727
+ * alloc_error() writes a message and exits. Used by DYNALLOC? macros. *
728
+ * *
729
+ *****************************************************************************/
730
+
731
+ NORET_ATTR void
732
+ alloc_error(const char *s)
733
+ {
734
+ fprintf(ERRFILE,"Dynamic allocation failed: %s\n",s);
735
+ exit(2);
736
+ }
737
+
738
+ /*****************************************************************************
739
+ * *
740
+ * nautil_freedyn() - free the dynamic memory in this module *
741
+ * *
742
+ *****************************************************************************/
743
+
744
+ void
745
+ nautil_freedyn(void)
746
+ {
747
+ #if !MAXN
748
+ DYNFREE(workperm,workperm_sz);
749
+ #endif
750
+ }