passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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 (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,906 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.groups
3
+ r"""
4
+ Automorphism groups and canonical labels
5
+
6
+ This module implements a general algorithm for computing automorphism groups and
7
+ canonical labels of objects. The class of objects in question must be some kind
8
+ of structure for which an automorphism is a permutation in $S_n$ for some $n$,
9
+ which we call here the order of the object. It should be noted that the word
10
+ "canonical" in the term canonical label is used loosely. Given an object $X$,
11
+ the canonical label $C(X)$ is just an object for which $C(X) = C(Y)$ for any
12
+ $Y$ such that $X \cong Y$.
13
+
14
+ To understand the algorithm better, a few definitions will help. First one
15
+ should note that throughout this module, $S_n$ is defined as the set of
16
+ permutations of the set $[n] := \{0, 1, ..., n-1\}$. One speaks of
17
+ ordered partitions $\Pi = (C_1, ..., C_k)$ of $[n]$. The $C_i$ are disjoint
18
+ subsets of $[n]$ whose union is equal to $[n]$, and we call them cells. A
19
+ partition $\Pi_1$ is said to be finer than another partition $\Pi_2$ if every
20
+ cell of $\Pi_1$ is a subset of some cell of $\Pi_2$ (in this situation we also
21
+ say that $\Pi_2$ is coarser than $\Pi_1$). A partition stack
22
+ $\nu = (\Pi_0, ..., \Pi_k)$ is a sequence of partitions such that $\Pi_i$ is
23
+ finer than $\Pi_{i-1}$ for each $i$ such that $1 \leq i \leq k$. Sometimes these
24
+ are called nested partitions. The depth of $\nu$ is defined to be $k$ and the
25
+ degree of $\nu$ is defined to be $n$. Partition stacks are implemented as
26
+ \code{PartitionStack} (see automorphism_group_canonical_label.pxd for more
27
+ information). Finally, we say that a permutation respects the partition $\Pi$ if
28
+ its orbits form a partition which is finer than $\Pi$.
29
+
30
+ In order to take advantage of the algorithms in this module for a specific kind
31
+ of object, one must implement (in Cython) three functions which will be specific
32
+ to the kind of objects in question. Pointers to these functions are passed to
33
+ the main function of the module, which is \code{get_aut_gp_and_can_lab}. For
34
+ specific examples of implementations of these functions, see any of the files in
35
+ \code{sage.groups.perm_gps.partn_ref} beginning with "refinement." They are:
36
+
37
+ A. \code{refine_and_return_invariant}:
38
+
39
+ Signature:
40
+
41
+ \code{int refine_and_return_invariant(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len)}
42
+
43
+ This function should split up cells in the partition at the top of the
44
+ partition stack in such a way that any automorphism that respects the
45
+ partition also respects the resulting partition. The array
46
+ cells_to_refine_by is a list of the beginning positions of some cells which
47
+ have been changed since the last refinement, of length ctrb_len. It is not
48
+ necessary to use this in an implementation of this function, but it will
49
+ affect performance. One should consult \code{refinement_graphs} for more
50
+ details and ideas for particular implementations.
51
+
52
+ Output:
53
+
54
+ An integer $I$ invariant under the orbits of $S_n$. That is, if
55
+ $\gamma \in S_n$, then
56
+ $$ I(G, PS, cells_to_refine_by) = I( \gamma(G), \gamma(PS), \gamma(cells_to_refine_by) ) .$$
57
+
58
+
59
+ B. \code{compare_structures}:
60
+
61
+ Signature:
62
+
63
+ \code{int compare_structures(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree)}
64
+
65
+ This function must implement a total ordering on the set of objects of fixed
66
+ order. Return:
67
+ -1 if \code{gamma_1^{-1}(S1) < gamma_2^{-1}(S2)},
68
+ 0 if \code{gamma_1^{-1}(S1) == gamma_2^{-1}(S2)},
69
+ 1 if \code{gamma_1^{-1}(S1) > gamma_2^{-1}(S2)}.
70
+
71
+ The value ``degree`` indicates the degree of the permutations ``gamma1`` and
72
+ ``gamma_2``.
73
+
74
+ Important note:
75
+
76
+ The permutations are thought of as being input in inverse form, and this can
77
+ lead to subtle bugs. One is encouraged to consult existing implementations
78
+ to make sure the right thing is being done: this is so that you can avoid
79
+ *actually* needing to compute the inverse.
80
+
81
+ C. \code{all_children_are_equivalent}:
82
+
83
+ Signature:
84
+
85
+ \code{bint all_children_are_equivalent(PartitionStack *PS, void *S)}
86
+
87
+ This function must return False unless it is the case that each discrete
88
+ partition finer than the top of the partition stack is equivalent to the
89
+ others under some automorphism of S. The converse need not hold: if this is
90
+ indeed the case, it still may return False. This function is originally used
91
+ as a consequence of Lemma 2.25 in [1].
92
+
93
+ EXAMPLES::
94
+
95
+ sage: import sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label
96
+
97
+ REFERENCE:
98
+
99
+ - [1] McKay, Brendan D. Practical Graph Isomorphism. Congressus Numerantium,
100
+ Vol. 30 (1981), pp. 45-87.
101
+ """
102
+
103
+ # ****************************************************************************
104
+ # Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
105
+ #
106
+ # This program is free software: you can redistribute it and/or modify
107
+ # it under the terms of the GNU General Public License as published by
108
+ # the Free Software Foundation, either version 2 of the License, or
109
+ # (at your option) any later version.
110
+ # https://www.gnu.org/licenses/
111
+ # ****************************************************************************
112
+
113
+ from libc.string cimport memcmp, memcpy
114
+ from cysignals.memory cimport sig_malloc, sig_realloc, sig_free
115
+
116
+ from sage.groups.perm_gps.partn_ref.data_structures cimport *
117
+ from sage.data_structures.bitset_base cimport *
118
+
119
+ cdef inline int agcl_cmp(int a, int b) noexcept:
120
+ if a < b:
121
+ return -1
122
+ elif a == b:
123
+ return 0
124
+ else:
125
+ return 1
126
+
127
+ # Functions
128
+
129
+ cdef bint all_children_are_equivalent_trivial(PartitionStack *PS, void *S) noexcept:
130
+ return 0
131
+
132
+ cdef int refine_and_return_invariant_trivial(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept:
133
+ return 0
134
+
135
+ cdef int compare_structures_trivial(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
136
+ return 0
137
+
138
+
139
+ def test_get_aut_gp_and_can_lab_trivially(int n=6,
140
+ list partition=[[0,1,2],[3,4],[5]], canonical_label=True, base=False):
141
+ """
142
+ TESTS::
143
+
144
+ sage: tttt = sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label.test_get_aut_gp_and_can_lab_trivially
145
+ sage: tttt()
146
+ 12
147
+ sage: tttt(canonical_label=False, base=False)
148
+ 12
149
+ sage: tttt(canonical_label=False, base=True)
150
+ 12
151
+ sage: tttt(canonical_label=True, base=True)
152
+ 12
153
+ sage: tttt(n=0, partition=[])
154
+ 1
155
+ sage: tttt(n=0, partition=[], canonical_label=False, base=False)
156
+ 1
157
+ sage: tttt(n=0, partition=[], canonical_label=False, base=True)
158
+ 1
159
+ sage: tttt(n=0, partition=[], canonical_label=True, base=True)
160
+ 1
161
+ """
162
+ cdef aut_gp_and_can_lab *output
163
+ cdef Integer I = Integer(0)
164
+ cdef PartitionStack *part
165
+ part = PS_from_list(partition)
166
+ if part is NULL:
167
+ raise MemoryError
168
+ cdef object empty_list = []
169
+ output = get_aut_gp_and_can_lab(<void *> empty_list, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_structures_trivial, canonical_label, NULL, NULL, NULL)
170
+ SC_order(output.group, 0, I.value)
171
+ print(I)
172
+ PS_dealloc(part)
173
+ deallocate_agcl_output(output)
174
+
175
+
176
+ def test_intersect_parabolic_with_alternating(int n=9, list partition=[[0,1,2],[3,4],[5,6,7,8]]):
177
+ """
178
+ A test for nontrivial input group in computing automorphism groups.
179
+
180
+ TESTS::
181
+
182
+ sage: from sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label import test_intersect_parabolic_with_alternating as tipwa
183
+ sage: tipwa()
184
+ 144
185
+ sage: tipwa(5, [[0],[1],[2],[3,4]])
186
+ 1
187
+ sage: tipwa(5, [[0],[1],[2,3,4]])
188
+ 3
189
+ sage: tipwa(5, [[0,1],[2,3,4]])
190
+ 6
191
+ sage: tipwa(7, [[0,1,2,3,4,5,6]])
192
+ 2520
193
+ sage: factorial(7)/2
194
+ 2520
195
+ sage: tipwa(9, [[0,1,2,3],[4,5,6,7,8]])
196
+ 1440
197
+ """
198
+ cdef aut_gp_and_can_lab *output
199
+ cdef Integer I = Integer(0)
200
+ cdef PartitionStack *part
201
+ part = PS_from_list(partition)
202
+ if part is NULL:
203
+ raise MemoryError
204
+ cdef StabilizerChain *group = SC_alternating_group(part.degree)
205
+ if group is NULL:
206
+ PS_dealloc(part)
207
+ raise MemoryError
208
+ cdef object empty_list = []
209
+ output = get_aut_gp_and_can_lab(<void *> empty_list, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_structures_trivial, 0, group, NULL, NULL)
210
+ SC_order(output.group, 0, I.value)
211
+ print(I)
212
+ PS_dealloc(part)
213
+ SC_dealloc(group)
214
+ deallocate_agcl_output(output)
215
+
216
+
217
+ cdef int compare_perms(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
218
+ cdef list MS1 = <list> S1
219
+ cdef list MS2 = <list> S2
220
+ cdef int i, j
221
+ for i in range(degree):
222
+ j = agcl_cmp(MS1[gamma_1[i]], MS2[gamma_2[i]])
223
+ if j != 0:
224
+ return j
225
+ return 0
226
+
227
+
228
+ def coset_rep(list perm=[0,1,2,3,4,5], list gens=[[1,2,3,4,5,0]]):
229
+ """
230
+ Given a group G generated by the given generators, defines a map from the
231
+ Symmetric group to G so that any two elements from the same right coset go
232
+ to the same element. Tests nontrivial input group when computing canonical
233
+ labels.
234
+
235
+ TESTS::
236
+
237
+ sage: from sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label import coset_rep
238
+ sage: coset_rep()
239
+ [5, 0, 1, 2, 3, 4]
240
+ sage: gens = [[1,2,3,0]]
241
+ sage: reps = []
242
+ sage: for p in SymmetricGroup(4):
243
+ ....: p = [p(i)-1 for i in range(1,5)]
244
+ ....: r = coset_rep(p, gens)
245
+ ....: if r not in reps:
246
+ ....: reps.append(r)
247
+ sage: len(reps)
248
+ 6
249
+ sage: gens = [[1,0,2,3],[0,1,3,2]]
250
+ sage: reps = []
251
+ sage: for p in SymmetricGroup(4):
252
+ ....: p = [p(i)-1 for i in range(1,5)]
253
+ ....: r = coset_rep(p, gens)
254
+ ....: if r not in reps:
255
+ ....: reps.append(r)
256
+ sage: len(reps)
257
+ 6
258
+ sage: gens = [[1,2,0,3]]
259
+ sage: reps = []
260
+ sage: for p in SymmetricGroup(4):
261
+ ....: p = [p(i)-1 for i in range(1,5)]
262
+ ....: r = coset_rep(p, gens)
263
+ ....: if r not in reps:
264
+ ....: reps.append(r)
265
+ sage: len(reps)
266
+ 8
267
+ """
268
+ cdef int i, n = len(perm)
269
+ assert all(len(g) == n for g in gens)
270
+ cdef aut_gp_and_can_lab *output
271
+ cdef Integer I = Integer(0)
272
+ cdef PartitionStack *part
273
+ part = PS_new(n, 1)
274
+ cdef int *c_perm = <int *> sig_malloc(n * sizeof(int))
275
+ cdef StabilizerChain *group = SC_new(n, 1)
276
+ if part is NULL or c_perm is NULL or group is NULL:
277
+ sig_free(c_perm)
278
+ PS_dealloc(part)
279
+ SC_dealloc(group)
280
+ raise MemoryError
281
+ for g in gens:
282
+ for i from 0 <= i < n:
283
+ c_perm[i] = g[i]
284
+ SC_insert(group, 0, c_perm, 1)
285
+ output = get_aut_gp_and_can_lab(<void *> perm, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_perms, 1, group, NULL, NULL)
286
+ SC_order(output.group, 0, I.value)
287
+ assert I == 1
288
+ r_inv = list(range(n))
289
+ for i in range(n):
290
+ r_inv[output.relabeling[i]] = i
291
+ label = [perm[r_inv[i]] for i in range(n)]
292
+ PS_dealloc(part)
293
+ SC_dealloc(group)
294
+ deallocate_agcl_output(output)
295
+ sig_free(c_perm)
296
+ return label
297
+
298
+
299
+ cdef aut_gp_and_can_lab *allocate_agcl_output(int n) noexcept:
300
+ r"""
301
+ Allocate an instance of the aut_gp_and_can_lab struct of degree n. This can
302
+ be input to the get_aut_gp_and_can_lab function, and the output will be
303
+ stored to it.
304
+ """
305
+ cdef aut_gp_and_can_lab *output = <aut_gp_and_can_lab *> sig_malloc(sizeof(aut_gp_and_can_lab))
306
+ if output is NULL:
307
+ return NULL
308
+ output.group = SC_new(n)
309
+ output.relabeling = <int *> sig_malloc(n*sizeof(int))
310
+ output.generators = <int *> sig_malloc(2*n*n*sizeof(int))
311
+ output.size_of_generator_array = 2*n*n
312
+ if output.group is NULL or \
313
+ output.relabeling is NULL or \
314
+ output.generators is NULL:
315
+ deallocate_agcl_output(output)
316
+ return NULL
317
+ return output
318
+
319
+ cdef void deallocate_agcl_output(aut_gp_and_can_lab *output) noexcept:
320
+ r"""
321
+ Deallocate an aut_gp_and_can_lab struct.
322
+ """
323
+ if output is not NULL:
324
+ SC_dealloc(output.group)
325
+ sig_free(output.relabeling)
326
+ sig_free(output.generators)
327
+ sig_free(output)
328
+
329
+ cdef agcl_work_space *allocate_agcl_work_space(int n) noexcept:
330
+ r"""
331
+ Allocate work space for the get_aut_gp_and_can_lab function. It can be
332
+ input to the function in which case it must be deallocated after the
333
+ function is called.
334
+ """
335
+ cdef int *int_array
336
+
337
+ cdef agcl_work_space *work_space
338
+ work_space = <agcl_work_space *> sig_malloc(sizeof(agcl_work_space))
339
+ if work_space is NULL:
340
+ return NULL
341
+
342
+ work_space.degree = n
343
+ int_array = <int *> sig_malloc((n*n + # for perm_stack
344
+ n + # for label_indicators
345
+ 7*n # for int_array
346
+ )*sizeof(int))
347
+ work_space.group1 = SC_new(n)
348
+ work_space.group2 = SC_new(n)
349
+ work_space.label_ps = PS_new(n,0)
350
+ work_space.bitset_array = <bitset_t *> sig_malloc((n + 2*len_of_fp_and_mcr + 1)*sizeof(bitset_t))
351
+ work_space.orbits_of_subgroup = OP_new(n)
352
+ work_space.orbits_of_permutation = OP_new(n)
353
+ work_space.first_ps = PS_new(n,0)
354
+
355
+ if int_array is NULL or \
356
+ work_space.group1 is NULL or \
357
+ work_space.group2 is NULL or \
358
+ work_space.label_ps is NULL or \
359
+ work_space.bitset_array is NULL or \
360
+ work_space.orbits_of_subgroup is NULL or \
361
+ work_space.orbits_of_permutation is NULL or \
362
+ work_space.first_ps is NULL:
363
+ sig_free(work_space)
364
+ return NULL
365
+
366
+ work_space.perm_stack = int_array
367
+ work_space.label_indicators = int_array + n*n
368
+ work_space.int_array = int_array + n*n + n
369
+
370
+ cdef int i
371
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
372
+ work_space.bitset_array[i].bits = NULL
373
+ try:
374
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
375
+ bitset_init(work_space.bitset_array[i], n)
376
+ except MemoryError:
377
+ deallocate_agcl_work_space(work_space)
378
+ return NULL
379
+ return work_space
380
+
381
+ cdef void deallocate_agcl_work_space(agcl_work_space *work_space) noexcept:
382
+ r"""
383
+ Deallocate work space for the get_aut_gp_and_can_lab function.
384
+ """
385
+ if work_space is NULL:
386
+ return
387
+ cdef int i, n = work_space.degree
388
+ if work_space.bitset_array is not NULL:
389
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
390
+ bitset_free(work_space.bitset_array[i])
391
+ sig_free(work_space.perm_stack)
392
+ SC_dealloc(work_space.group1)
393
+ SC_dealloc(work_space.group2)
394
+ PS_dealloc(work_space.label_ps)
395
+ sig_free(work_space.bitset_array)
396
+ OP_dealloc(work_space.orbits_of_subgroup)
397
+ OP_dealloc(work_space.orbits_of_permutation)
398
+ PS_dealloc(work_space.first_ps)
399
+ sig_free(work_space)
400
+
401
+ cdef aut_gp_and_can_lab *get_aut_gp_and_can_lab(void *S,
402
+ PartitionStack *partition, int n,
403
+ bint (*all_children_are_equivalent)(PartitionStack *PS, void *S) noexcept,
404
+ int (*refine_and_return_invariant)(PartitionStack *PS, void *S,
405
+ int *cells_to_refine_by, int ctrb_len) noexcept,
406
+ int (*compare_structures)(int *gamma_1, int *gamma_2, void *S1, void *S2,
407
+ int degree) noexcept,
408
+ bint canonical_label, StabilizerChain *input_group,
409
+ agcl_work_space *work_space_prealloc, aut_gp_and_can_lab *output_prealloc) except NULL:
410
+ """
411
+ Traverse the search space for subgroup/canonical label calculation.
412
+
413
+ INPUT:
414
+
415
+ - ``S`` -- pointer to the structure
416
+ - ``partition`` -- PartitionStack representing a partition of the points
417
+ - ``len_partition`` -- length of the partition
418
+ - ``n`` -- the number of points (points are assumed to be 0,1,...,n-1)
419
+ - ``canonical_label`` -- whether to search for canonical label; if True, return
420
+ the permutation taking S to its canonical label
421
+ - ``all_children_are_equivalent`` -- pointer to a function
422
+ INPUT:
423
+ - ``PS`` -- pointer to a partition stack
424
+ - ``S`` -- pointer to the structure
425
+ OUTPUT:
426
+ bint; returns ``True`` if it can be determined that all refinements below
427
+ the current one will result in an equivalent discrete partition
428
+ - ``refine_and_return_invariant`` -- pointer to a function
429
+ INPUT:
430
+ - ``PS`` -- pointer to a partition stack
431
+ - ``S`` -- pointer to the structure
432
+ - ``alpha`` -- an array consisting of numbers, which indicate the starting
433
+ positions of the cells to refine against (will likely be modified)
434
+ OUTPUT:
435
+ integer; returns an invariant under application of arbitrary permutations
436
+ - ``compare_structures`` -- pointer to a function
437
+ INPUT:
438
+ - ``gamma_1``, ``gamma_2`` -- (list) permutations of the points of S1 and S2
439
+ - ``S1``, ``S2`` -- pointers to the structures
440
+ - ``degree`` -- degree of gamma_1 and 2
441
+ OUTPUT:
442
+ integer; 0 if gamma_1(S1) = gamma_2(S2), otherwise -1 or 1 (see docs for cmp),
443
+ such that the set of all structures is well-ordered
444
+
445
+ .. NOTE::
446
+
447
+ The partition ``partition1`` *must* satisfy the property that in each
448
+ cell, the smallest element occurs first!
449
+
450
+ OUTPUT: a pointer to a ``aut_gp_and_can_lab`` struct
451
+ """
452
+ cdef PartitionStack *current_ps
453
+ cdef PartitionStack *first_ps
454
+ cdef PartitionStack *label_ps
455
+ cdef int first_meets_current = -1
456
+ cdef int label_meets_current
457
+ cdef int current_kids_are_same = 1
458
+ cdef int first_kids_are_same
459
+
460
+ cdef int *current_indicators
461
+ cdef int *first_indicators
462
+ cdef int *label_indicators
463
+ cdef int first_and_current_indicator_same
464
+ cdef int label_and_current_indicator_same = -1
465
+ cdef int compared_current_and_label_indicators
466
+
467
+ cdef OrbitPartition *orbits_of_subgroup
468
+ cdef OrbitPartition *orbits_of_permutation
469
+ cdef OrbitPartition *orbits_of_supergroup
470
+ cdef int subgroup_primary_orbit_size = 0
471
+ cdef int minimal_in_primary_orbit
472
+
473
+ cdef bitset_t *fixed_points_of_generators # i.e. fp
474
+ cdef bitset_t *minimal_cell_reps_of_generators # i.e. mcr
475
+ cdef int index_in_fp_and_mcr = -1
476
+
477
+ cdef bitset_t *vertices_to_split
478
+ cdef bitset_t *vertices_have_been_reduced
479
+ cdef int *permutation
480
+ cdef int *label_perm
481
+ cdef int *id_perm
482
+ cdef int *cells_to_refine_by
483
+ cdef int *vertices_determining_current_stack
484
+ cdef int *perm_stack
485
+ cdef StabilizerChain *group = NULL
486
+ cdef StabilizerChain *old_group
487
+ cdef StabilizerChain *tmp_gp
488
+
489
+ cdef int i, j, k, ell, b
490
+ cdef bint discrete, automorphism, update_label
491
+ cdef bint backtrack, new_vertex, mem_err = 0
492
+
493
+ cdef aut_gp_and_can_lab *output
494
+ cdef agcl_work_space *work_space
495
+
496
+ if output_prealloc is not NULL:
497
+ output = output_prealloc
498
+ output.group.base_size = 0
499
+ else:
500
+ output = allocate_agcl_output(n)
501
+ if output is NULL:
502
+ raise MemoryError
503
+
504
+ output.num_gens = 0
505
+ if n == 0:
506
+ return output
507
+
508
+ if work_space_prealloc is not NULL:
509
+ work_space = work_space_prealloc
510
+ else:
511
+ work_space = allocate_agcl_work_space(n)
512
+ if work_space is NULL:
513
+ if output_prealloc is NULL:
514
+ deallocate_agcl_output(output)
515
+ raise MemoryError
516
+
517
+ # Allocate:
518
+ if input_group is not NULL:
519
+ perm_stack = work_space.perm_stack
520
+ group = work_space.group1
521
+ old_group = work_space.group2
522
+ orbits_of_supergroup = input_group.OP_scratch
523
+ SC_copy_nomalloc(group, input_group, n)
524
+ SC_identify(perm_stack, n)
525
+ if canonical_label:
526
+ label_indicators = work_space.label_indicators
527
+ label_ps = work_space.label_ps
528
+ first_ps = work_space.first_ps
529
+ orbits_of_subgroup = work_space.orbits_of_subgroup
530
+ orbits_of_permutation = work_space.orbits_of_permutation
531
+
532
+ current_indicators = work_space.int_array
533
+ first_indicators = work_space.int_array + n
534
+ permutation = work_space.int_array + 2 * n
535
+ id_perm = work_space.int_array + 3 * n
536
+ cells_to_refine_by = work_space.int_array + 4 * n
537
+ vertices_determining_current_stack = work_space.int_array + 5 * n
538
+ label_perm = work_space.int_array + 6 * n
539
+
540
+ fixed_points_of_generators = work_space.bitset_array
541
+ minimal_cell_reps_of_generators = work_space.bitset_array + len_of_fp_and_mcr
542
+ vertices_to_split = work_space.bitset_array + 2*len_of_fp_and_mcr
543
+ vertices_have_been_reduced = work_space.bitset_array + 2*len_of_fp_and_mcr + n
544
+
545
+ if work_space_prealloc is not NULL:
546
+ OP_clear(orbits_of_subgroup)
547
+
548
+ bitset_zero(vertices_have_been_reduced[0])
549
+ current_ps = partition
550
+ current_ps.depth = 0
551
+
552
+ # default values of "infinity"
553
+ for i from 0 <= i < n:
554
+ first_indicators[i] = -1
555
+ if canonical_label:
556
+ for i from 0 <= i < n:
557
+ label_indicators[i] = -1
558
+
559
+ # set up the identity permutation
560
+ for i from 0 <= i < n:
561
+ id_perm[i] = i
562
+
563
+ # Our first refinement needs to check every cell of the partition,
564
+ # so cells_to_refine_by needs to be a list of pointers to each cell.
565
+ j = 1
566
+ cells_to_refine_by[0] = 0
567
+ for i from 0 < i < n:
568
+ if current_ps.levels[i-1] == 0:
569
+ cells_to_refine_by[j] = i
570
+ j += 1
571
+ # Ignore the invariant this time, since we are
572
+ # creating the root of the search tree.
573
+ if input_group is NULL:
574
+ refine_and_return_invariant(current_ps, S, cells_to_refine_by, j)
575
+ else:
576
+ refine_also_by_orbits(current_ps, S, refine_and_return_invariant,
577
+ cells_to_refine_by, j, group, perm_stack)
578
+ PS_move_all_mins_to_front(current_ps)
579
+
580
+ # Refine down to a discrete partition
581
+ while not PS_is_discrete(current_ps):
582
+ i = current_ps.depth
583
+ if not all_children_are_equivalent(current_ps, S):
584
+ current_kids_are_same = i + 1
585
+ vertices_determining_current_stack[i] = PS_first_smallest(current_ps, vertices_to_split[i])
586
+ bitset_unset(vertices_have_been_reduced[0], i)
587
+ if input_group is not NULL:
588
+ OP_clear(orbits_of_supergroup)
589
+ for j from i <= j < group.base_size:
590
+ for ell from 0 <= ell < group.num_gens[j]:
591
+ OP_merge_list_perm(orbits_of_supergroup, group.generators[j] + n*ell)
592
+ b = orbits_of_supergroup.mcr[OP_find(orbits_of_supergroup, perm_stack[i*n + vertices_determining_current_stack[i]])]
593
+ tmp_gp = group
594
+ group = old_group
595
+ old_group = tmp_gp
596
+ if SC_insert_base_point_nomalloc(group, old_group, i, b):
597
+ mem_err = 1
598
+ break
599
+ current_indicators[i] = split_point_and_refine_by_orbits(current_ps,
600
+ vertices_determining_current_stack[i], S, refine_and_return_invariant,
601
+ cells_to_refine_by, group, perm_stack)
602
+ else:
603
+ current_indicators[i] = split_point_and_refine(current_ps, vertices_determining_current_stack[i], S, refine_and_return_invariant, cells_to_refine_by)
604
+ PS_move_all_mins_to_front(current_ps)
605
+ first_indicators[i] = current_indicators[i]
606
+ if canonical_label:
607
+ label_indicators[i] = current_indicators[i]
608
+ SC_add_base_point(output.group, vertices_determining_current_stack[i])
609
+
610
+ if not mem_err:
611
+ first_meets_current = current_ps.depth
612
+ first_kids_are_same = current_ps.depth
613
+ first_and_current_indicator_same = current_ps.depth
614
+ PS_copy_from_to(current_ps, first_ps)
615
+ if canonical_label:
616
+ label_meets_current = current_ps.depth
617
+ label_and_current_indicator_same = current_ps.depth
618
+ compared_current_and_label_indicators = 0
619
+ PS_copy_from_to(current_ps, label_ps)
620
+ if input_group is not NULL:
621
+ if compute_relabeling(group, old_group, label_ps.entries, label_perm):
622
+ mem_err = 1
623
+ current_ps.depth -= 1
624
+
625
+ # Main loop:
626
+ while current_ps.depth != -1:
627
+
628
+ if mem_err:
629
+ if output_prealloc is NULL:
630
+ deallocate_agcl_output(output)
631
+ if work_space_prealloc is NULL:
632
+ deallocate_agcl_work_space(work_space_prealloc)
633
+ raise MemoryError
634
+
635
+ # If necessary, update label_meets_current
636
+ if canonical_label and label_meets_current > current_ps.depth:
637
+ label_meets_current = current_ps.depth
638
+
639
+ # I. Search for a new vertex to split, and update subgroup information
640
+ new_vertex = 0
641
+ if current_ps.depth > first_meets_current:
642
+ # If we are not at a node of the first stack, reduce size of
643
+ # vertices_to_split by using the symmetries we already know.
644
+ if not bitset_check(vertices_have_been_reduced[0], current_ps.depth):
645
+ for i from 0 <= i <= index_in_fp_and_mcr:
646
+ j = 0
647
+ while j < current_ps.depth and bitset_check(fixed_points_of_generators[i], vertices_determining_current_stack[j]):
648
+ j += 1
649
+ # If each vertex split so far is fixed by generator i,
650
+ # then remove elements of vertices_to_split which are
651
+ # not minimal in their orbits under generator i.
652
+ if j == current_ps.depth:
653
+ for k from 0 <= k < n:
654
+ if bitset_check(vertices_to_split[current_ps.depth], k) and not bitset_check(minimal_cell_reps_of_generators[i], k):
655
+ bitset_flip(vertices_to_split[current_ps.depth], k)
656
+ bitset_flip(vertices_have_been_reduced[0], current_ps.depth)
657
+ # Look for a new point to split.
658
+ i = vertices_determining_current_stack[current_ps.depth] + 1
659
+ i = bitset_next(vertices_to_split[current_ps.depth], i)
660
+ if i != -1:
661
+ # There is a new point.
662
+ vertices_determining_current_stack[current_ps.depth] = i
663
+ new_vertex = 1
664
+ else:
665
+ # No new point: backtrack.
666
+ current_ps.depth -= 1
667
+ else:
668
+ # If we are at a node of the first stack, the above reduction
669
+ # will not help. Also, we must update information about
670
+ # primary orbits here.
671
+ if current_ps.depth < first_meets_current:
672
+ # If we are done searching under this part of the first
673
+ # stack, then first_meets_current is one higher, and we
674
+ # are looking at a new primary orbit (corresponding to a
675
+ # larger subgroup in the stabilizer chain).
676
+ first_meets_current = current_ps.depth
677
+ minimal_in_primary_orbit = output.group.base_orbits[current_ps.depth][0]
678
+ while True:
679
+ i = vertices_determining_current_stack[current_ps.depth]
680
+ # This was the last point to be split here.
681
+ # If it has been added to the primary orbit, update size info.
682
+ if output.group.parents[current_ps.depth][i] != -1:
683
+ subgroup_primary_orbit_size += 1
684
+ # Look for a new point to split.
685
+ i += 1
686
+ i = bitset_next(vertices_to_split[current_ps.depth], i)
687
+ if i != -1:
688
+ # There is a new point.
689
+ vertices_determining_current_stack[current_ps.depth] = i
690
+ if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, i)] == i:
691
+ new_vertex = 1
692
+ break
693
+ else:
694
+ # No new point: backtrack.
695
+ # Note that now, we are backtracking up the first stack.
696
+ vertices_determining_current_stack[current_ps.depth] = -1
697
+ # If every choice of point to split gave something in the
698
+ # (same!) primary orbit, then all children of the first
699
+ # stack at this point are equivalent.
700
+ j = 0
701
+ for i from 0 <= i < n:
702
+ if bitset_check(vertices_to_split[current_ps.depth], i):
703
+ j += 1
704
+ if j == subgroup_primary_orbit_size and first_kids_are_same == current_ps.depth+1:
705
+ first_kids_are_same = current_ps.depth
706
+ subgroup_primary_orbit_size = 0
707
+ current_ps.depth -= 1
708
+ break
709
+ if not new_vertex:
710
+ continue
711
+
712
+ if current_kids_are_same > current_ps.depth + 1:
713
+ current_kids_are_same = current_ps.depth + 1
714
+ if first_and_current_indicator_same > current_ps.depth:
715
+ first_and_current_indicator_same = current_ps.depth
716
+ if canonical_label and label_and_current_indicator_same >= current_ps.depth:
717
+ label_and_current_indicator_same = current_ps.depth
718
+ compared_current_and_label_indicators = 0
719
+
720
+ # II. Refine down to a discrete partition, or until
721
+ # we leave the part of the tree we are interested in
722
+ discrete = 0
723
+ backtrack = 0
724
+ while True:
725
+ i = current_ps.depth
726
+ if input_group is not NULL:
727
+ current_indicators[i] = split_point_and_refine_by_orbits(current_ps,
728
+ vertices_determining_current_stack[i], S,
729
+ refine_and_return_invariant, cells_to_refine_by,
730
+ group, perm_stack)
731
+ else:
732
+ current_indicators[i] = split_point_and_refine(current_ps,
733
+ vertices_determining_current_stack[i], S,
734
+ refine_and_return_invariant, cells_to_refine_by)
735
+ PS_move_all_mins_to_front(current_ps)
736
+ if first_and_current_indicator_same == i and \
737
+ current_indicators[i] == first_indicators[i] and \
738
+ stacks_are_equivalent(first_ps, current_ps):
739
+ first_and_current_indicator_same += 1
740
+ if canonical_label:
741
+ if compared_current_and_label_indicators == 0:
742
+ if label_indicators[i] == -1:
743
+ compared_current_and_label_indicators = -1
744
+ else:
745
+ compared_current_and_label_indicators = agcl_cmp(current_indicators[i], label_indicators[i])
746
+ if label_and_current_indicator_same == i and compared_current_and_label_indicators == 0:
747
+ label_and_current_indicator_same += 1
748
+ if compared_current_and_label_indicators > 0:
749
+ label_indicators[i] = current_indicators[i]
750
+ if first_and_current_indicator_same < current_ps.depth and (not canonical_label or compared_current_and_label_indicators < 0):
751
+ backtrack = 1
752
+ break
753
+ if PS_is_discrete(current_ps):
754
+ discrete = 1
755
+ break
756
+ vertices_determining_current_stack[current_ps.depth] = PS_first_smallest(current_ps, vertices_to_split[current_ps.depth])
757
+ if input_group is not NULL:
758
+ i = current_ps.depth
759
+ k = vertices_determining_current_stack[i]
760
+ if group.parents[i][perm_stack[n*i + k]] == -1:
761
+ # if we get here then canonical_label must be true
762
+ # and we have to make a change of base
763
+ OP_clear(orbits_of_supergroup)
764
+ for j from i <= j < group.base_size:
765
+ for ell from 0 <= ell < group.num_gens[j]:
766
+ OP_merge_list_perm(orbits_of_supergroup, group.generators[j] + n*ell)
767
+ b = orbits_of_supergroup.mcr[OP_find(orbits_of_supergroup, perm_stack[i*n + k])]
768
+ tmp_gp = group
769
+ group = old_group
770
+ old_group = tmp_gp
771
+ if SC_insert_base_point_nomalloc(group, old_group, i, b):
772
+ mem_err = 1
773
+ break
774
+ bitset_unset(vertices_have_been_reduced[0], current_ps.depth)
775
+ if not all_children_are_equivalent(current_ps, S):
776
+ current_kids_are_same = current_ps.depth + 1
777
+
778
+ # III. Check for automorphisms and labels
779
+ automorphism = 0
780
+ if discrete:
781
+ if current_ps.depth == first_and_current_indicator_same:
782
+ PS_get_perm_from(current_ps, first_ps, permutation)
783
+ if compare_structures(permutation, id_perm, S, S, n) == 0:
784
+ if input_group is NULL or SC_contains(group, 0, permutation, 0):
785
+ # TODO: might be slight optimization for containment using perm_stack
786
+ automorphism = 1
787
+ if not automorphism:
788
+ if (not canonical_label) or (compared_current_and_label_indicators < 0):
789
+ backtrack = 1
790
+ else:
791
+ # if we get here, discrete must be true
792
+ update_label = 0
793
+ if (compared_current_and_label_indicators > 0) or (current_ps.depth < label_ps.depth):
794
+ if input_group is not NULL:
795
+ if compute_relabeling(group, old_group, current_ps.entries, permutation):
796
+ mem_err = 1
797
+ break
798
+ update_label = 1
799
+ else:
800
+ if input_group is NULL:
801
+ i = compare_structures(current_ps.entries, label_ps.entries, S, S, n)
802
+ else:
803
+ if compute_relabeling(group, old_group, current_ps.entries, permutation):
804
+ mem_err = 1
805
+ break
806
+ i = compare_structures(permutation, label_perm, S, S, n)
807
+ if i > 0:
808
+ update_label = 1
809
+ elif i < 0:
810
+ backtrack = 1
811
+ else:
812
+ if input_group is NULL:
813
+ PS_get_perm_from(current_ps, label_ps, permutation)
814
+ automorphism = 1
815
+ elif memcmp(permutation, label_perm, n*sizeof(int)):
816
+ SC_invert_perm(group.perm_scratch, permutation, n)
817
+ SC_mult_perms(permutation, group.perm_scratch, label_perm, n)
818
+ automorphism = 1
819
+ else:
820
+ backtrack = 1
821
+ if update_label:
822
+ PS_copy_from_to(current_ps, label_ps)
823
+ if input_group is not NULL:
824
+ memcpy(label_perm, permutation, n*sizeof(int))
825
+ compared_current_and_label_indicators = 0
826
+ label_meets_current = current_ps.depth
827
+ label_and_current_indicator_same = current_ps.depth
828
+ label_indicators[current_ps.depth] = -1
829
+ backtrack = 1
830
+ if automorphism:
831
+ if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
832
+ index_in_fp_and_mcr += 1
833
+ bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
834
+ bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
835
+ OP_clear(orbits_of_permutation)
836
+ for i from 0 <= i < n:
837
+ OP_join(orbits_of_permutation, i, permutation[i])
838
+ bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
839
+ for i from 0 <= i < n:
840
+ if permutation[i] == i:
841
+ bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
842
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
843
+ else:
844
+ bitset_unset(fixed_points_of_generators[index_in_fp_and_mcr], i)
845
+ if orbits_of_permutation.parent[i] == i:
846
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], orbits_of_permutation.mcr[i])
847
+ if OP_merge_list_perm(orbits_of_subgroup, permutation): # if permutation made orbits coarser
848
+ # add permutation as a generator of the automorphism group
849
+ if n*output.num_gens == output.size_of_generator_array:
850
+ # must double its size
851
+ output.size_of_generator_array *= 2
852
+ output.generators = <int *> sig_realloc( output.generators, output.size_of_generator_array * sizeof(int) )
853
+ if output.generators is NULL:
854
+ mem_err = True
855
+ continue # main loop
856
+ j = n*output.num_gens
857
+ for i from 0 <= i < n:
858
+ output.generators[j + i] = permutation[i]
859
+ output.num_gens += 1
860
+ if SC_update_tree(output.group, first_meets_current, permutation, 1):
861
+ mem_err = 1
862
+ continue # main loop
863
+ if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, minimal_in_primary_orbit)] != minimal_in_primary_orbit:
864
+ current_ps.depth = first_meets_current
865
+ continue # main loop
866
+ if canonical_label:
867
+ current_ps.depth = label_meets_current
868
+ else:
869
+ current_ps.depth = first_meets_current
870
+ if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
871
+ bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
872
+ continue # main loop
873
+ if backtrack:
874
+ i = current_ps.depth
875
+ current_ps.depth = min(max(first_kids_are_same - 1, label_and_current_indicator_same), current_kids_are_same - 1)
876
+ if i == current_kids_are_same:
877
+ continue # main loop
878
+ if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
879
+ index_in_fp_and_mcr += 1
880
+ bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
881
+ bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
882
+ j = current_ps.depth
883
+ current_ps.depth = i # just for mcr and fixed functions...
884
+ for i from 0 <= i < n:
885
+ if PS_is_mcr(current_ps, i):
886
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
887
+ if PS_is_fixed(current_ps, i):
888
+ bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
889
+ current_ps.depth = j
890
+ if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
891
+ bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
892
+
893
+ # End of main loop.
894
+
895
+ if canonical_label:
896
+ if input_group is NULL:
897
+ for i from 0 <= i < n:
898
+ output.relabeling[label_ps.entries[i]] = i
899
+ else:
900
+ for i from 0 <= i < n:
901
+ output.relabeling[label_perm[i]] = i
902
+
903
+ if work_space_prealloc is NULL:
904
+ deallocate_agcl_work_space(work_space)
905
+
906
+ return output