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,625 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Disjoint union of enumerated sets
4
+
5
+ AUTHORS:
6
+
7
+ - Florent Hivert (2009-07/09): initial implementation.
8
+ - Florent Hivert (2010-03): classcall related stuff.
9
+ - Florent Hivert (2010-12): fixed facade element construction.
10
+ """
11
+ # ***************************************************************************
12
+ # Copyright (C) 2009 Florent Hivert <Florent.Hivert@univ-rouen.fr>
13
+ #
14
+ # Distributed under the terms of the GNU General Public License (GPL)
15
+ # https://www.gnu.org/licenses/
16
+ # ***************************************************************************
17
+
18
+ from sage.structure.element import Element
19
+ from sage.structure.parent import Parent
20
+ from sage.structure.element_wrapper import ElementWrapper
21
+ from sage.sets.family import Family
22
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
23
+ from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
24
+ from sage.rings.infinity import Infinity
25
+ from sage.misc.cachefunc import cached_method
26
+ from sage.misc.lazy_attribute import lazy_attribute
27
+ from sage.structure.unique_representation import UniqueRepresentation
28
+
29
+
30
+ class DisjointUnionEnumeratedSets(UniqueRepresentation, Parent):
31
+ """
32
+ A class for disjoint unions of enumerated sets.
33
+
34
+ INPUT:
35
+
36
+ - ``family`` -- list (or iterable or family) of enumerated sets
37
+ - ``keepkey`` -- boolean
38
+ - ``facade`` -- boolean
39
+
40
+ This models the enumerated set obtained by concatenating together
41
+ the specified ordered sets. The latter are supposed to be pairwise
42
+ disjoint; otherwise, a multiset is created.
43
+
44
+ The argument ``family`` can be a list, a tuple, a dictionary, or a
45
+ family. If it is not a family it is first converted into a family
46
+ (see :func:`sage.sets.family.Family`).
47
+
48
+ Experimental options:
49
+
50
+ By default, there is no way to tell from which set of the union an
51
+ element is generated. The option ``keepkey=True`` keeps track of
52
+ those by returning pairs ``(key, el)`` where ``key`` is the index
53
+ of the set to which ``el`` belongs. When this option is specified,
54
+ the enumerated sets need not be disjoint anymore.
55
+
56
+ With the option ``facade=False`` the elements are wrapped in an
57
+ object whose parent is the disjoint union itself. The wrapped
58
+ object can then be recovered using the ``value`` attribute.
59
+
60
+ The two options can be combined.
61
+
62
+ The names of those options is imperfect, and subject to change in
63
+ future versions. Feedback welcome.
64
+
65
+ EXAMPLES:
66
+
67
+ The input can be a list or a tuple of FiniteEnumeratedSets::
68
+
69
+ sage: U1 = DisjointUnionEnumeratedSets((
70
+ ....: FiniteEnumeratedSet([1,2,3]),
71
+ ....: FiniteEnumeratedSet([4,5,6])))
72
+ sage: U1
73
+ Disjoint union of Family ({1, 2, 3}, {4, 5, 6})
74
+ sage: U1.list()
75
+ [1, 2, 3, 4, 5, 6]
76
+ sage: U1.cardinality()
77
+ 6
78
+
79
+ The input can also be a dictionary::
80
+
81
+ sage: U2 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
82
+ ....: 2: FiniteEnumeratedSet([4,5,6])})
83
+ sage: U2
84
+ Disjoint union of Finite family {1: {1, 2, 3}, 2: {4, 5, 6}}
85
+ sage: U2.list()
86
+ [1, 2, 3, 4, 5, 6]
87
+ sage: U2.cardinality()
88
+ 6
89
+
90
+ However in that case the enumeration order is not specified.
91
+
92
+ In general the input can be any family::
93
+
94
+ sage: # needs sage.combinat
95
+ sage: U3 = DisjointUnionEnumeratedSets(
96
+ ....: Family([2,3,4], Permutations, lazy=True))
97
+ sage: U3
98
+ Disjoint union of Lazy family
99
+ (<class 'sage.combinat.permutation.Permutations'>(i))_{i in [2, 3, 4]}
100
+ sage: U3.cardinality()
101
+ 32
102
+ sage: it = iter(U3)
103
+ sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
104
+ [[1, 2], [2, 1], [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]
105
+ sage: U3.unrank(18)
106
+ [2, 4, 1, 3]
107
+
108
+ This allows for infinite unions::
109
+
110
+ sage: # needs sage.combinat
111
+ sage: U4 = DisjointUnionEnumeratedSets(
112
+ ....: Family(NonNegativeIntegers(), Permutations))
113
+ sage: U4
114
+ Disjoint union of Lazy family
115
+ (<class 'sage.combinat.permutation.Permutations'>(i))_{i in Non negative integers}
116
+ sage: U4.cardinality()
117
+ +Infinity
118
+ sage: it = iter(U4)
119
+ sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
120
+ [[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
121
+ sage: U4.unrank(18)
122
+ [2, 3, 1, 4]
123
+
124
+ .. WARNING::
125
+
126
+ Beware that some of the operations assume in that case that infinitely
127
+ many of the enumerated sets are non empty.
128
+
129
+
130
+ .. RUBRIC:: Experimental options
131
+
132
+ We demonstrate the ``keepkey`` option::
133
+
134
+ sage: # needs sage.combinat
135
+ sage: Ukeep = DisjointUnionEnumeratedSets(
136
+ ....: Family(list(range(4)), Permutations), keepkey=True)
137
+ sage: it = iter(Ukeep)
138
+ sage: [next(it) for i in range(6)]
139
+ [(0, []), (1, [1]), (2, [1, 2]), (2, [2, 1]), (3, [1, 2, 3]), (3, [1, 3, 2])]
140
+ sage: type(next(it)[1])
141
+ <class 'sage.combinat.permutation.StandardPermutations_n_with_category.element_class'>
142
+
143
+ We now demonstrate the ``facade`` option::
144
+
145
+ sage: # needs sage.combinat
146
+ sage: UNoFacade = DisjointUnionEnumeratedSets(
147
+ ....: Family(list(range(4)), Permutations), facade=False)
148
+ sage: it = iter(UNoFacade)
149
+ sage: [next(it) for i in range(6)]
150
+ [[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
151
+ sage: el = next(it); el
152
+ [2, 1, 3]
153
+ sage: type(el)
154
+ <... 'sage.structure.element_wrapper.ElementWrapper'>
155
+ sage: el.parent() == UNoFacade
156
+ True
157
+ sage: elv = el.value; elv
158
+ [2, 1, 3]
159
+ sage: type(elv)
160
+ <class 'sage.combinat.permutation.StandardPermutations_n_with_category.element_class'>
161
+
162
+ The elements ``el`` of the disjoint union are simple wrapped elements.
163
+ So to access the methods, you need to do ``el.value``::
164
+
165
+ sage: el[0] # needs sage.combinat
166
+ Traceback (most recent call last):
167
+ ...
168
+ TypeError: 'sage.structure.element_wrapper.ElementWrapper' object is not subscriptable
169
+
170
+ sage: el.value[0] # needs sage.combinat
171
+ 2
172
+
173
+ Possible extensions: the current enumeration order is not suitable
174
+ for unions of infinite enumerated sets (except possibly for the
175
+ last one). One could add options to specify alternative enumeration
176
+ orders (anti-diagonal, round robin, ...) to handle this case.
177
+
178
+
179
+ .. RUBRIC:: Inheriting from ``DisjointUnionEnumeratedSets``
180
+
181
+ There are two different use cases for inheriting from
182
+ :class:`DisjointUnionEnumeratedSets`: writing a parent which
183
+ happens to be a disjoint union of some known parents, or writing
184
+ generic disjoint unions for some particular classes of
185
+ :class:`sage.categories.enumerated_sets.EnumeratedSets`.
186
+
187
+ - In the first use case, the input of the ``__init__`` method is
188
+ most likely different from that of
189
+ :class:`DisjointUnionEnumeratedSets`. Then, one simply
190
+ writes the ``__init__`` method as usual::
191
+
192
+ sage: class MyUnion(DisjointUnionEnumeratedSets):
193
+ ....: def __init__(self):
194
+ ....: DisjointUnionEnumeratedSets.__init__(self,
195
+ ....: Family([1,2], Permutations))
196
+ sage: pp = MyUnion()
197
+ sage: pp.list()
198
+ [[1], [1, 2], [2, 1]]
199
+
200
+ In case the :meth:`__init__` method takes optional arguments,
201
+ or does some normalization on them, a specific method
202
+ ``__classcall_private__`` is required (see the
203
+ documentation of :class:`UniqueRepresentation`).
204
+
205
+ - In the second use case, the input of the ``__init__`` method
206
+ is the same as that of :class:`DisjointUnionEnumeratedSets`;
207
+ one therefore wants to inherit the :meth:`__classcall_private__`
208
+ method as well, which can be achieved as follows::
209
+
210
+ sage: class UnionOfSpecialSets(DisjointUnionEnumeratedSets):
211
+ ....: __classcall_private__ = staticmethod(DisjointUnionEnumeratedSets.__classcall_private__)
212
+ sage: psp = UnionOfSpecialSets(Family([1,2], Permutations))
213
+ sage: psp.list()
214
+ [[1], [1, 2], [2, 1]]
215
+
216
+ TESTS::
217
+
218
+ sage: TestSuite(U1).run()
219
+ sage: TestSuite(U2).run()
220
+ sage: TestSuite(U3).run() # needs sage.combinat
221
+ sage: TestSuite(U4).run() # needs sage.combinat
222
+ doctest:...: UserWarning: Disjoint union of Lazy family
223
+ (<class 'sage.combinat.permutation.Permutations'>(i))_{i in Non negative integers}
224
+ is an infinite union
225
+ The default implementation of __contains__ can loop forever. Please overload it.
226
+ sage: TestSuite(UNoFacade).run() # needs sage.combinat
227
+
228
+ We skip ``_test_an_element`` because the coercion framework does not
229
+ currently allow a tuple to be returned for facade parents::
230
+
231
+ sage: TestSuite(Ukeep).run(skip='_test_an_element') # needs sage.combinat
232
+
233
+ The following three lines are required for the pickling tests,
234
+ because the classes ``MyUnion`` and ``UnionOfSpecialSets`` have
235
+ been defined interactively::
236
+
237
+ sage: import __main__
238
+ sage: __main__.MyUnion = MyUnion
239
+ sage: __main__.UnionOfSpecialSets = UnionOfSpecialSets
240
+
241
+ sage: TestSuite(pp).run()
242
+ sage: TestSuite(psp).run()
243
+ """
244
+
245
+ @staticmethod
246
+ def __classcall_private__(cls, fam, facade=True,
247
+ keepkey=False, category=None):
248
+ """
249
+ Normalization of arguments; see :class:`UniqueRepresentation`.
250
+
251
+ TESTS:
252
+
253
+ We check that disjoint unions have unique representation::
254
+
255
+ sage: U1 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
256
+ ....: 2: FiniteEnumeratedSet([4,5,6])})
257
+ sage: U2 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
258
+ ....: 2: FiniteEnumeratedSet([4,5,6])})
259
+ sage: U1 == U2
260
+ True
261
+ sage: U1 is U2 # indirect doctest
262
+ True
263
+ sage: U3 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
264
+ ....: 2: FiniteEnumeratedSet([4,5])})
265
+ sage: U1 == U3
266
+ False
267
+ """
268
+ # facade = options.pop('facade', True);
269
+ # keepkey = options.pop('keepkey', False);
270
+ assert isinstance(facade, bool)
271
+ assert isinstance(keepkey, bool)
272
+ return super().__classcall__(
273
+ cls, Family(fam),
274
+ facade=facade, keepkey=keepkey, category=category)
275
+
276
+ def __init__(self, family, facade=True, keepkey=False, category=None):
277
+ """
278
+ TESTS::
279
+
280
+ sage: U = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
281
+ ....: 2: FiniteEnumeratedSet([4,5,6])})
282
+ sage: TestSuite(U).run()
283
+
284
+ sage: X = DisjointUnionEnumeratedSets({i: Partitions(i) for i in range(5)}) # needs sage.combinat sage.libs.flint
285
+ sage: TestSuite(X).run() # needs sage.combinat sage.libs.flint
286
+ """
287
+ self._family = family
288
+ self._facade = facade
289
+ if facade:
290
+ # Note that family is not copied when it is a finite enumerated
291
+ # set, thus, any subclass must ensure that it does not mutate this
292
+ # input.
293
+ if family in FiniteEnumeratedSets():
294
+ self._facade_for = family
295
+ else:
296
+ # This allows the test suite to pass its tests by essentially
297
+ # stating that this is a facade for any parent. Technically
298
+ # this is wrong, but in practice, it will not have much
299
+ # of an effect.
300
+ self._facade_for = True
301
+ self._keepkey = keepkey
302
+ if self._is_category_initialized():
303
+ return
304
+ if category is None:
305
+ # try to guess if the result is infinite or not.
306
+ if self._family in InfiniteEnumeratedSets():
307
+ category = InfiniteEnumeratedSets()
308
+ elif self._family.last() in InfiniteEnumeratedSets():
309
+ category = InfiniteEnumeratedSets()
310
+ else:
311
+ category = FiniteEnumeratedSets()
312
+ Parent.__init__(self, facade=facade, category=category)
313
+
314
+ def _repr_(self):
315
+ """
316
+ TESTS::
317
+
318
+ sage: U = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
319
+ ....: 2: FiniteEnumeratedSet([4,5,6])})
320
+ sage: U
321
+ Disjoint union of Finite family {1: {1, 2, 3}, 2: {4, 5, 6}}
322
+ """
323
+ return "Disjoint union of %s" % self._family
324
+
325
+ def _is_a(self, x):
326
+ """
327
+ Check if a Sage object ``x`` belongs to ``self``.
328
+
329
+ This methods is a helper for :meth:`__contains__` and the
330
+ constructor :meth:`_element_constructor_`.
331
+
332
+ EXAMPLES::
333
+
334
+ sage: U4 = DisjointUnionEnumeratedSets(
335
+ ....: Family(NonNegativeIntegers(), Compositions))
336
+ sage: U4._is_a(Composition([3,2,1,1]))
337
+ doctest:...: UserWarning: Disjoint union of Lazy family
338
+ (<class 'sage.combinat.composition.Compositions'>(i))_{i in Non negative integers}
339
+ is an infinite union
340
+ The default implementation of __contains__ can loop forever. Please overload it.
341
+ True
342
+ """
343
+ if self._keepkey:
344
+ return (isinstance(x, tuple) and
345
+ x[0] in self._family.keys() and
346
+ x[1] in self._family[x[0]])
347
+ else:
348
+ from warnings import warn
349
+ if self._family.cardinality() == Infinity:
350
+ warn("%s is an infinite union\nThe default implementation of __contains__ can loop forever. Please overload it." % (self))
351
+ return any(x in a for a in self._family)
352
+
353
+ def __contains__(self, x):
354
+ """
355
+ Check containment.
356
+
357
+ .. WARNING::
358
+
359
+ If ``self`` is an infinite union and if the answer is
360
+ logically False, this will loop forever and never answer
361
+ ``False``. Therefore, a warning is issued.
362
+
363
+ EXAMPLES::
364
+
365
+ sage: U4 = DisjointUnionEnumeratedSets(
366
+ ....: Family(NonNegativeIntegers(), Partitions))
367
+ sage: Partition([]) in U4
368
+ doctest:...: UserWarning: Disjoint union of Lazy family
369
+ (<class 'sage.combinat.partition.Partitions'>(i))_{i in Non negative integers}
370
+ is an infinite union
371
+ The default implementation of __contains__ can loop forever. Please overload it.
372
+ True
373
+
374
+ Note: one has to use a different family from the previous one in this
375
+ file otherwise the warning is not re-issued::
376
+
377
+ sage: Partition([3,2,1,1]) in U4
378
+ True
379
+
380
+ The following call will loop forever::
381
+
382
+ sage: 2 in U4 # not tested, loop forever
383
+ """
384
+ if self._facade:
385
+ return self._is_a(x)
386
+ else:
387
+ if isinstance(x, self.element_class):
388
+ return True
389
+ else:
390
+ return self._is_a(x)
391
+
392
+ def __iter__(self):
393
+ """
394
+ TESTS::
395
+
396
+ sage: U4 = DisjointUnionEnumeratedSets(
397
+ ....: Family(NonNegativeIntegers(), Permutations))
398
+ sage: it = iter(U4)
399
+ sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
400
+ [[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
401
+
402
+ sage: # needs sage.combinat
403
+ sage: U4 = DisjointUnionEnumeratedSets(
404
+ ....: Family(NonNegativeIntegers(), Permutations),
405
+ ....: keepkey=True, facade=False)
406
+ sage: it = iter(U4)
407
+ sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
408
+ [(0, []), (1, [1]), (2, [1, 2]), (2, [2, 1]), (3, [1, 2, 3]), (3, [1, 3, 2])]
409
+ sage: el = next(it); el.parent() == U4
410
+ True
411
+ sage: el.value == (3, Permutation([2,1,3]))
412
+ True
413
+ """
414
+ for k in self._family.keys():
415
+ for el in self._family[k]:
416
+ if self._keepkey:
417
+ el = (k, el)
418
+ if self._facade:
419
+ yield el
420
+ else:
421
+ yield self.element_class(self, el) # Bypass correctness tests
422
+
423
+ def an_element(self):
424
+ """
425
+ Return an element of this disjoint union, as per
426
+ :meth:`Sets.ParentMethods.an_element`.
427
+
428
+ EXAMPLES::
429
+
430
+ sage: U4 = DisjointUnionEnumeratedSets(
431
+ ....: Family([3, 5, 7], Permutations))
432
+ sage: U4.an_element()
433
+ [1, 2, 3]
434
+ """
435
+ return self._an_element_from_iterator()
436
+
437
+ @cached_method
438
+ def cardinality(self):
439
+ """
440
+ Return the cardinality of this disjoint union.
441
+
442
+ EXAMPLES:
443
+
444
+ For finite disjoint unions, the cardinality is computed by
445
+ summing the cardinalities of the enumerated sets::
446
+
447
+ sage: U = DisjointUnionEnumeratedSets(Family([0,1,2,3], Permutations))
448
+ sage: U.cardinality()
449
+ 10
450
+
451
+ For infinite disjoint unions, this makes the assumption that
452
+ the result is infinite::
453
+
454
+ sage: U = DisjointUnionEnumeratedSets(
455
+ ....: Family(NonNegativeIntegers(), Permutations))
456
+ sage: U.cardinality()
457
+ +Infinity
458
+
459
+ .. WARNING::
460
+
461
+ As pointed out in the main documentation, it is
462
+ possible to construct examples where this is incorrect::
463
+
464
+ sage: U = DisjointUnionEnumeratedSets(
465
+ ....: Family(NonNegativeIntegers(), lambda x: []))
466
+ sage: U.cardinality() # Should be 0!
467
+ +Infinity
468
+ """
469
+ if self._family.cardinality() == Infinity:
470
+ return Infinity
471
+ return sum(set.cardinality() for set in self._family)
472
+
473
+ @lazy_attribute
474
+ def _element_constructor_(self):
475
+ """
476
+ TESTS::
477
+
478
+ sage: # needs sage.combinat sage.libs.flint
479
+ sage: U = DisjointUnionEnumeratedSets(
480
+ ....: Family([1,2,3], Partitions), facade=False)
481
+ sage: U._element_constructor_
482
+ <bound method DisjointUnionEnumeratedSets._element_constructor_default
483
+ of Disjoint union of Finite family {...}>
484
+ sage: U = DisjointUnionEnumeratedSets(
485
+ ....: Family([1,2,3], Partitions), facade=True)
486
+ sage: U._element_constructor_
487
+ <bound method DisjointUnionEnumeratedSets._element_constructor_facade
488
+ of Disjoint union of Finite family {...}>
489
+ """
490
+ if not self._facade:
491
+ return self._element_constructor_default
492
+ else:
493
+ return self._element_constructor_facade
494
+
495
+ def _element_constructor_default(self, el):
496
+ r"""
497
+ TESTS::
498
+
499
+ sage: # needs sage.combinat sage.libs.flint
500
+ sage: U = DisjointUnionEnumeratedSets(
501
+ ....: Family([1,2,3], Partitions), facade=False)
502
+ sage: U([1]) # indirect doctest
503
+ [1]
504
+ sage: U([2,1]) # indirect doctest
505
+ [2, 1]
506
+ sage: U([1,3,2]) # indirect doctest
507
+ Traceback (most recent call last):
508
+ ...
509
+ ValueError: value [1, 3, 2] does not belong to Disjoint union of
510
+ Finite family {1: Partitions of the integer 1,
511
+ 2: Partitions of the integer 2,
512
+ 3: Partitions of the integer 3}
513
+
514
+ sage: # needs sage.combinat sage.libs.flint
515
+ sage: U = DisjointUnionEnumeratedSets(
516
+ ....: Family([1,2,3], Partitions), keepkey=True, facade=False)
517
+ sage: U((1, [1])) # indirect doctest
518
+ (1, [1])
519
+ sage: U((3,[2,1])) # indirect doctest
520
+ (3, [2, 1])
521
+ sage: U((4,[2,1])) # indirect doctest
522
+ Traceback (most recent call last):
523
+ ...
524
+ ValueError: value (4, [2, 1]) does not belong to Disjoint union of
525
+ Finite family {1: Partitions of the integer 1,
526
+ 2: Partitions of the integer 2,
527
+ 3: Partitions of the integer 3}
528
+ """
529
+ if isinstance(el, self.element_class):
530
+ el = el.value
531
+ if self._is_a(el):
532
+ return self.element_class(self, el)
533
+ else:
534
+ raise ValueError("value %s does not belong to %s" % (el, self))
535
+
536
+ def _element_constructor_facade(self, el):
537
+ """
538
+ TESTS::
539
+
540
+ sage: # needs sage.combinat sage.libs.flint
541
+ sage: X = DisjointUnionEnumeratedSets({i: Partitions(i)
542
+ ....: for i in range(5)})
543
+ sage: X([1]).parent()
544
+ Partitions of the integer 1
545
+ sage: X([2,1,1]).parent() # indirect doctest
546
+ Partitions of the integer 4
547
+ sage: X([6])
548
+ Traceback (most recent call last):
549
+ ...
550
+ ValueError: cannot coerce `[6]` in any parent in `Finite family {...}`
551
+
552
+ We need to call the element constructor directly when ``keepkey=True``
553
+ because this returns a `tuple`, where the coercion framework requires
554
+ an :class:`Element` be returned.
555
+
556
+ sage: X = DisjointUnionEnumeratedSets({i: Partitions(i) # needs sage.combinat sage.libs.flint
557
+ ....: for i in range(5)},
558
+ ....: keepkey=True)
559
+ sage: p = X._element_constructor_((0, [])) # indirect doctest # needs sage.combinat sage.libs.flint
560
+ sage: p[1].parent() # needs sage.combinat sage.libs.flint
561
+ Partitions of the integer 0
562
+
563
+ Test that facade parents can create and properly access elements
564
+ that are tuples (fixed by :issue:`22382`)::
565
+
566
+ sage: # needs sage.combinat sage.libs.flint
567
+ sage: f = lambda mu: cartesian_product([mu.standard_tableaux(),
568
+ ....: mu.standard_tableaux()])
569
+ sage: tabs = DisjointUnionEnumeratedSets(Family(Partitions(4), f))
570
+ sage: s = StandardTableau([[1,3],[2,4]])
571
+ sage: (s,s) in tabs
572
+ True
573
+ sage: ss = tabs( (s,s) )
574
+ sage: ss[0]
575
+ [[1, 3], [2, 4]]
576
+
577
+ We do not coerce when one of the elements is already in the set::
578
+
579
+ sage: X = DisjointUnionEnumeratedSets([QQ, ZZ])
580
+ sage: x = X(2)
581
+ sage: x.parent() is ZZ
582
+ True
583
+ """
584
+ if self._keepkey:
585
+ P = self._family[el[0]]
586
+ if isinstance(el[1], Element) and el[1].parent() == P:
587
+ return el
588
+ try:
589
+ return (el[0], P(el[1]))
590
+ except Exception:
591
+ raise ValueError("cannot coerce `%s` in the parent `%s`" % (el[1], P))
592
+
593
+ # Check first to see if the parent of el is in the family
594
+ if (isinstance(el, Element) and self._facade_for is not True
595
+ and el.parent() in self._facade_for):
596
+ return el
597
+
598
+ for P in self._family:
599
+ try:
600
+ return P(el)
601
+ except Exception:
602
+ pass
603
+ raise ValueError("cannot coerce `%s` in any parent in `%s`" % (el, self._family))
604
+
605
+ @lazy_attribute
606
+ def Element(self):
607
+ """
608
+ TESTS::
609
+
610
+ sage: # needs sage.combinat sage.libs.flint
611
+ sage: U = DisjointUnionEnumeratedSets(
612
+ ....: Family([1,2,3], Partitions), facade=False)
613
+ sage: U.Element
614
+ <... 'sage.structure.element_wrapper.ElementWrapper'>
615
+ sage: U = DisjointUnionEnumeratedSets(
616
+ ....: Family([1,2,3], Partitions), facade=True)
617
+ sage: U.Element
618
+ Traceback (most recent call last):
619
+ ...
620
+ AttributeError: 'DisjointUnionEnumeratedSets_with_category' object
621
+ has no attribute 'Element'...
622
+ """
623
+ if not self._facade:
624
+ return ElementWrapper
625
+ return NotImplemented
sage/sets/family.pxd ADDED
@@ -0,0 +1,12 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ from sage.structure.parent cimport Parent
3
+
4
+
5
+ cdef class AbstractFamily(Parent):
6
+ cdef public __custom_name
7
+ cdef dict __dict__ # enables Python attributes as needed for EnumeratedSets()
8
+
9
+
10
+ cdef class FiniteFamily(AbstractFamily):
11
+ cdef public dict _dictionary
12
+ cdef public object _keys