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,1021 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Enumerated set from iterator
4
+
5
+ EXAMPLES:
6
+
7
+ We build a set from the iterator :obj:`graphs` that returns a canonical
8
+ representative for each isomorphism class of graphs::
9
+
10
+ sage: # needs nauty sage.graphs
11
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
12
+ sage: E = EnumeratedSetFromIterator(
13
+ ....: graphs,
14
+ ....: name='Graphs',
15
+ ....: category=InfiniteEnumeratedSets(),
16
+ ....: cache=True)
17
+ sage: E
18
+ Graphs
19
+ sage: E.unrank(0)
20
+ Graph on 0 vertices
21
+ sage: E.unrank(4)
22
+ Graph on 3 vertices
23
+ sage: E.cardinality()
24
+ +Infinity
25
+ sage: E.category()
26
+ Category of facade infinite enumerated sets
27
+
28
+ The module also provides decorator for functions and methods::
29
+
30
+ sage: from sage.sets.set_from_iterator import set_from_function
31
+ sage: @set_from_function
32
+ ....: def f(n): return xsrange(n)
33
+ sage: f(3)
34
+ {0, 1, 2}
35
+ sage: f(5)
36
+ {0, 1, 2, 3, 4}
37
+ sage: f(100)
38
+ {0, 1, 2, 3, 4, ...}
39
+
40
+ sage: from sage.sets.set_from_iterator import set_from_method
41
+ sage: class A:
42
+ ....: @set_from_method
43
+ ....: def f(self, n):
44
+ ....: return xsrange(n)
45
+ sage: a = A()
46
+ sage: a.f(3)
47
+ {0, 1, 2}
48
+ sage: f(100)
49
+ {0, 1, 2, 3, 4, ...}
50
+ """
51
+ # ****************************************************************************
52
+ # Copyright (C) 2012 Vincent Delecroix <vincent.delecroix@gmail.com>
53
+ #
54
+ # Distributed under the terms of the GNU General Public License (GPL)
55
+ #
56
+ # This code is distributed in the hope that it will be useful,
57
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
58
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
59
+ # General Public License for more details.
60
+ #
61
+ # The full text of the GPL is available at:
62
+ #
63
+ # https://www.gnu.org/licenses/
64
+ # *****************************************************************************
65
+
66
+ from sage.structure.parent import Parent
67
+ from sage.categories.enumerated_sets import EnumeratedSets
68
+ from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
69
+ from sage.misc.function_mangling import ArgumentFixer
70
+ from sage.misc.lazy_list import lazy_list
71
+ from sage.misc.instancedoc import instancedoc
72
+
73
+
74
+ class EnumeratedSetFromIterator(Parent):
75
+ """
76
+ A class for enumerated set built from an iterator.
77
+
78
+ INPUT:
79
+
80
+ - ``f`` -- a function that returns an iterable from which the set is built from
81
+
82
+ - ``args`` -- tuple; arguments to be sent to the function `f`
83
+
84
+ - ``kwds`` -- dictionary; keywords to be sent to the function `f`
85
+
86
+ - ``name`` -- an optional name for the set
87
+
88
+ - ``category`` -- (default: ``None``) an optional category for that
89
+ enumerated set. If you know that your iterator will stop after a finite
90
+ number of steps you should set it as :class:`FiniteEnumeratedSets`, conversely if
91
+ you know that your iterator will run over and over you should set it as
92
+ :class:`InfiniteEnumeratedSets`.
93
+
94
+ - ``cache`` -- boolean (default: ``False``); whether or not use a cache
95
+ mechanism for the iterator. If ``True``, then the function `f` is called
96
+ only once.
97
+
98
+ EXAMPLES::
99
+
100
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
101
+ sage: E = EnumeratedSetFromIterator(graphs, args=(7,)); E # needs nauty sage.graphs
102
+ {Graph on 7 vertices, Graph on 7 vertices, Graph on 7 vertices,
103
+ Graph on 7 vertices, Graph on 7 vertices, ...}
104
+ sage: E.category() # needs nauty sage.graphs
105
+ Category of facade enumerated sets
106
+
107
+ The same example with a cache and a custom name::
108
+
109
+ sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True, # needs nauty sage.graphs
110
+ ....: name="Graphs with 8 vertices",
111
+ ....: category=FiniteEnumeratedSets()); E
112
+ Graphs with 8 vertices
113
+ sage: E.unrank(3) # needs nauty sage.graphs
114
+ Graph on 8 vertices
115
+ sage: E.category() # needs nauty sage.graphs
116
+ Category of facade finite enumerated sets
117
+
118
+ TESTS:
119
+
120
+ The cache is compatible with multiple call to ``__iter__``::
121
+
122
+ sage: from itertools import count
123
+ sage: E = EnumeratedSetFromIterator(count, args=(0,), category=InfiniteEnumeratedSets(), cache=True)
124
+ sage: e1 = iter(E)
125
+ sage: e2 = iter(E)
126
+ sage: next(e1), next(e1)
127
+ (0, 1)
128
+ sage: next(e2), next(e2), next(e2)
129
+ (0, 1, 2)
130
+ sage: next(e1), next(e1)
131
+ (2, 3)
132
+ sage: next(e2)
133
+ 3
134
+
135
+ The following warning is due to ``E`` being a facade parent. For more,
136
+ see the discussion on :issue:`16239`::
137
+
138
+ sage: TestSuite(E).run()
139
+ doctest:...: UserWarning: Testing equality of infinite sets which will not end in case of equality
140
+
141
+ sage: E = EnumeratedSetFromIterator(xsrange, args=(10,), category=FiniteEnumeratedSets(), cache=True)
142
+ sage: TestSuite(E).run()
143
+
144
+ .. NOTE::
145
+
146
+ In order to make the ``TestSuite`` works, the elements of the set
147
+ should have parents.
148
+ """
149
+ def __init__(self, f, args=None, kwds=None, name=None, category=None, cache=False):
150
+ """
151
+ TESTS::
152
+
153
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
154
+ sage: S = EnumeratedSetFromIterator(xsrange, (1, 200, -1), category=FiniteEnumeratedSets())
155
+ sage: TestSuite(S).run()
156
+ """
157
+ if category is not None:
158
+ Parent.__init__(self, facade=True, category=category)
159
+ else:
160
+ Parent.__init__(self, facade=True, category=EnumeratedSets())
161
+
162
+ if name is not None:
163
+ self.rename(name)
164
+
165
+ self._func = f
166
+
167
+ if args is not None:
168
+ self._args = args
169
+ if kwds is not None:
170
+ self._kwds = kwds
171
+
172
+ if cache:
173
+ self._cache = lazy_list(iter(self._func(
174
+ *getattr(self, '_args', ()),
175
+ **getattr(self, '_kwds', {}))))
176
+
177
+ def __hash__(self):
178
+ r"""
179
+ A simple hash using the first elements of the set.
180
+
181
+ EXAMPLES::
182
+
183
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
184
+ sage: E = EnumeratedSetFromIterator(xsrange, (1, 200))
185
+ sage: hash(E) == hash(tuple(range(1, 14)))
186
+ True
187
+ """
188
+ try:
189
+ return hash(self._cache[:13])
190
+ except AttributeError:
191
+ from itertools import islice
192
+ return hash(tuple(islice(self, 13)))
193
+
194
+ def __reduce__(self):
195
+ r"""
196
+ Support for pickle.
197
+
198
+ TESTS::
199
+
200
+ sage: # needs nauty sage.graphs
201
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
202
+ sage: from sage.graphs.graph_generators import graphs
203
+ sage: E = EnumeratedSetFromIterator(graphs,
204
+ ....: args=(3,),
205
+ ....: category=FiniteEnumeratedSets(),
206
+ ....: name="Graphs on 3 vertices")
207
+ sage: E
208
+ Graphs on 3 vertices
209
+ sage: F = loads(dumps(E)); F
210
+ Graphs on 3 vertices
211
+ sage: E == F
212
+ True
213
+ """
214
+ return (EnumeratedSetFromIterator,
215
+ (self._func, # func
216
+ getattr(self, '_args', None), # args
217
+ getattr(self, '_kwds', None), # kwds
218
+ self.get_custom_name(), # name
219
+ self.category(), # category
220
+ hasattr(self, '_cache')) # cache
221
+ )
222
+
223
+ def _repr_(self):
224
+ r"""
225
+ Return a string representation of ``self``.
226
+
227
+ TESTS::
228
+
229
+ sage: # needs sage.combinat
230
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
231
+ sage: E = EnumeratedSetFromIterator(Partitions(7, min_part=2).__iter__)
232
+ sage: repr(E) # indirect doctest
233
+ '{[7], [5, 2], [4, 3], [3, 2, 2]}'
234
+ sage: E = EnumeratedSetFromIterator(Partitions(9, min_part=2).__iter__)
235
+ sage: repr(E) # indirect doctest
236
+ '{[9], [7, 2], [6, 3], [5, 4], [5, 2, 2], ...}'
237
+ sage: E = EnumeratedSetFromIterator(Partitions(9, min_part=2).__iter__,
238
+ ....: name="Some partitions")
239
+ sage: repr(E) # indirect doctest
240
+ 'Some partitions'
241
+ """
242
+ l = []
243
+ i = iter(self)
244
+ for _ in range(6):
245
+ try:
246
+ l.append(next(i))
247
+ except StopIteration:
248
+ break
249
+ if len(l) < 6:
250
+ return '{' + ', '.join(repr(x) for x in l) + '}'
251
+ l.pop(-1)
252
+ return '{' + ', '.join(repr(x) for x in l) + ', ...}'
253
+
254
+ def __contains__(self, x):
255
+ r"""
256
+ Test whether ``x`` is in ``self``.
257
+
258
+ If the set is infinite, only the answer ``True`` should be expected in
259
+ finite time.
260
+
261
+ EXAMPLES::
262
+
263
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
264
+ sage: P = Partitions(12, min_part=2, max_part=5)
265
+ sage: E = EnumeratedSetFromIterator(P.__iter__)
266
+ sage: P([5,5,2]) in E
267
+ True
268
+ """
269
+ return any(x == y for y in self)
270
+
271
+ is_parent_of = __contains__
272
+
273
+ # TODO: what should we do for comparisons of infinite sets
274
+ def __eq__(self, other):
275
+ r"""
276
+ Equality test.
277
+
278
+ The function returns ``True`` if and only if other is an enumerated
279
+ set and has the same element as ``self``.
280
+
281
+ TESTS::
282
+
283
+ sage: # needs nauty sage.graphs
284
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
285
+ sage: E4 = EnumeratedSetFromIterator(graphs, args=(4,),
286
+ ....: category=FiniteEnumeratedSets())
287
+ sage: F4 = EnumeratedSetFromIterator(graphs, args=(4,),
288
+ ....: category=FiniteEnumeratedSets())
289
+ sage: E5 = EnumeratedSetFromIterator(graphs, args=(5,),
290
+ ....: category=FiniteEnumeratedSets())
291
+ sage: E4 == E4
292
+ True
293
+ sage: E4 == F4
294
+ True
295
+ sage: E4 == E5
296
+ False
297
+ sage: E5 == E4
298
+ False
299
+ sage: E5 == E5
300
+ True
301
+ """
302
+ if isinstance(other, EnumeratedSetFromIterator):
303
+ # trick to allow equality between infinite sets
304
+ # this assume that the function does not return randomized data!
305
+ if (self._func == other._func and
306
+ getattr(self, '_args', None) == getattr(other, '_args', None) and
307
+ getattr(self, '_kwds', None) == getattr(other, '_kwds', None)):
308
+ return True
309
+
310
+ if other in EnumeratedSets():
311
+ # TODO: think about what should be done at that point
312
+ if self not in FiniteEnumeratedSets() and other not in FiniteEnumeratedSets():
313
+ import warnings
314
+ warnings.warn("Testing equality of infinite sets which will not end in case of equality")
315
+
316
+ i1 = iter(self)
317
+ i2 = iter(other)
318
+ while True:
319
+ try:
320
+ x = next(i1)
321
+ except StopIteration:
322
+ try:
323
+ next(i2)
324
+ return False
325
+ except StopIteration:
326
+ return True
327
+ try:
328
+ y = next(i2)
329
+ except StopIteration:
330
+ return False
331
+ if x != y:
332
+ return False
333
+
334
+ def __ne__(self, other):
335
+ r"""
336
+ Difference test.
337
+
338
+ The function calls the ``__eq__`` test.
339
+
340
+ TESTS::
341
+
342
+ sage: # needs nauty sage.graphs
343
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
344
+ sage: E4 = EnumeratedSetFromIterator(graphs, args=(4,),
345
+ ....: category=FiniteEnumeratedSets())
346
+ sage: F4 = EnumeratedSetFromIterator(graphs, args=(4,),
347
+ ....: category=FiniteEnumeratedSets())
348
+ sage: E5 = EnumeratedSetFromIterator(graphs, args=(5,),
349
+ ....: category=FiniteEnumeratedSets())
350
+ sage: E4 != E4
351
+ False
352
+ sage: E4 != F4
353
+ False
354
+ sage: E4 != E5
355
+ True
356
+ sage: E5 != E4
357
+ True
358
+ sage: E5 != E5
359
+ False
360
+ """
361
+ return not self == other
362
+
363
+ def __iter__(self):
364
+ r"""
365
+ Return an iterator over the element of ``self``.
366
+
367
+ EXAMPLES::
368
+
369
+ sage: # needs nauty sage.graphs
370
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
371
+ sage: E = EnumeratedSetFromIterator(graphs, args=(8,))
372
+ sage: g1 = next(iter(E)); g1
373
+ Graph on 8 vertices
374
+ sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True)
375
+ sage: g2 = next(iter(E)); g2
376
+ Graph on 8 vertices
377
+ sage: g1 == g2
378
+ True
379
+ """
380
+ if hasattr(self, '_cache'):
381
+ return iter(self._cache)
382
+ return iter(self._func(*getattr(self, '_args', ()), **getattr(self, '_kwds', {})))
383
+
384
+ def unrank(self, i):
385
+ r"""
386
+ Return the element at position ``i``.
387
+
388
+ EXAMPLES::
389
+
390
+ sage: # needs nauty sage.graphs
391
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
392
+ sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True)
393
+ sage: F = EnumeratedSetFromIterator(graphs, args=(8,), cache=False)
394
+ sage: E.unrank(2)
395
+ Graph on 8 vertices
396
+ sage: E.unrank(2) == F.unrank(2)
397
+ True
398
+ """
399
+ if hasattr(self, '_cache'):
400
+ return self._cache[i]
401
+ return super().unrank(i)
402
+
403
+ def _element_constructor_(self, el):
404
+ """
405
+ Construct an element from ``el``.
406
+
407
+ TESTS::
408
+
409
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
410
+ sage: S = EnumeratedSetFromIterator(range, args=(1,4))
411
+
412
+ sage: S(1)
413
+ doctest:...: UserWarning: Testing equality of infinite sets
414
+ which will not end in case of equality
415
+ 1
416
+ sage: S(0) # indirect doctest
417
+ Traceback (most recent call last):
418
+ ...
419
+ ValueError: 0 not in {1, 2, 3}
420
+ """
421
+ if el in self:
422
+ return el
423
+ raise ValueError("%s not in %s" % (el, self))
424
+
425
+ def clear_cache(self):
426
+ r"""
427
+ Clear the cache.
428
+
429
+ EXAMPLES::
430
+
431
+ sage: from itertools import count
432
+ sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
433
+ sage: E = EnumeratedSetFromIterator(count, args=(1,), cache=True)
434
+ sage: e1 = E._cache; e1
435
+ lazy list [1, 2, 3, ...]
436
+ sage: E.clear_cache()
437
+ sage: E._cache
438
+ lazy list [1, 2, 3, ...]
439
+ sage: e1 is E._cache
440
+ False
441
+ """
442
+ if hasattr(self, '_cache'):
443
+ self._cache = lazy_list(iter(self._func(
444
+ *getattr(self, '_args', ()),
445
+ **getattr(self, '_kwds', {}))))
446
+
447
+ #
448
+ # Decorators
449
+ #
450
+
451
+
452
+ # TODO: move it in sage.misc ?
453
+ @instancedoc
454
+ class Decorator:
455
+ r"""
456
+ Abstract class that manage documentation and sources of the wrapped object.
457
+
458
+ The method needs to be stored in the attribute ``self.f``
459
+ """
460
+ def _instancedoc_(self):
461
+ """
462
+ Provide documentation for the wrapped function.
463
+
464
+ TESTS::
465
+
466
+ sage: from sage.misc.sageinspect import sage_getdoc
467
+ sage: from sage.sets.set_from_iterator import Decorator
468
+ sage: d = Decorator()
469
+ sage: d.f = Integer.is_prime
470
+ sage: print(sage_getdoc(d)) # indirect doctest
471
+ Test whether "self" is prime.
472
+ ...
473
+ Calls the PARI ...isprime...
474
+ """
475
+ # Duplicates sage.misc.cachefunc.CachedFunction._instancedoc_
476
+ from sage.misc.sageinspect import sage_getsourcelines, sage_getfile_relative, _extract_embedded_position
477
+ f = self.f
478
+ doc = f.__doc__ or ''
479
+ if _extract_embedded_position(doc) is None:
480
+ try:
481
+ sourcelines = sage_getsourcelines(f)
482
+ filename = sage_getfile_relative(f)
483
+ file_info = "File: %s (starting at line %d)\n" % (filename, sourcelines[1])
484
+ doc = file_info + doc
485
+ except OSError:
486
+ pass
487
+ return doc
488
+
489
+ def _sage_src_(self):
490
+ r"""
491
+ Return the source code for the wrapped function.
492
+
493
+ TESTS::
494
+
495
+ sage: from sage.misc.sageinspect import sage_getsource
496
+ sage: from sage.sets.set_from_iterator import Decorator
497
+ sage: d = Decorator()
498
+ sage: d.f = Rational.is_square
499
+ sage: print(sage_getsource(d.f)) # indirect doctest
500
+ def is_square(self):
501
+ ...
502
+ return mpq_sgn(self.value) >= 0 and mpz_perfect_square_p(mpq_numref(self.value)) and mpz_perfect_square_p(mpq_denref(self.value))
503
+ """
504
+ from sage.misc.sageinspect import sage_getsource
505
+ return sage_getsource(self.f)
506
+
507
+ def _sage_src_lines_(self):
508
+ r"""
509
+ Return the list of source lines and the first line number
510
+ of the wrapped function.
511
+
512
+ TESTS::
513
+
514
+ sage: # needs sage.groups
515
+ sage: from sage.misc.sageinspect import sage_getsourcelines
516
+ sage: from sage.sets.set_from_iterator import Decorator
517
+ sage: d = Decorator()
518
+ sage: d.f = MathieuGroup.order
519
+ sage: S = sage_getsourcelines(d) # indirect doctest
520
+ sage: S[0][2]
521
+ ' Return the number of elements of this group.\n'
522
+ sage: S[0][25]
523
+ ' if not gens:\n'
524
+ """
525
+ from sage.misc.sageinspect import sage_getsourcelines
526
+ return sage_getsourcelines(self.f)
527
+
528
+ def _sage_argspec_(self):
529
+ """
530
+ Return the argument specification of the wrapped function or method.
531
+
532
+ TESTS::
533
+
534
+ sage: # needs sage.modules
535
+ sage: from sage.misc.sageinspect import sage_getargspec
536
+ sage: from sage.sets.set_from_iterator import Decorator
537
+ sage: d = Decorator()
538
+ sage: d.f = find_local_minimum
539
+ sage: sage_getargspec(d) # indirect doctest
540
+ FullArgSpec(args=['f', 'a', 'b', 'tol', 'maxfun'],
541
+ varargs=None, varkw=None, defaults=(1.48e-08, 500),
542
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
543
+ """
544
+ from sage.misc.sageinspect import sage_getargspec
545
+ return sage_getargspec(self.f)
546
+
547
+ def __call__(self, *args, **kwds):
548
+ r"""
549
+ Call function.
550
+
551
+ Needs to be implemented in derived subclass.
552
+
553
+ TESTS::
554
+
555
+ sage: from sage.sets.set_from_iterator import Decorator
556
+ sage: d = Decorator()
557
+ sage: d()
558
+ Traceback (most recent call last):
559
+ ...
560
+ NotImplementedError
561
+ """
562
+ raise NotImplementedError
563
+
564
+
565
+ @instancedoc
566
+ class EnumeratedSetFromIterator_function_decorator(Decorator):
567
+ r"""
568
+ Decorator for :class:`EnumeratedSetFromIterator`.
569
+
570
+ Name could be string or a function ``(args, kwds) -> string``.
571
+
572
+ .. WARNING::
573
+
574
+ If you are going to use this with the decorator :func:`cached_function`,
575
+ you must place the ``@cached_function`` first. See the example below.
576
+
577
+ EXAMPLES::
578
+
579
+ sage: from sage.sets.set_from_iterator import set_from_function
580
+ sage: @set_from_function
581
+ ....: def f(n):
582
+ ....: for i in range(n):
583
+ ....: yield i**2 + i + 1
584
+ sage: f(3)
585
+ {1, 3, 7}
586
+ sage: f(100)
587
+ {1, 3, 7, 13, 21, ...}
588
+
589
+ To avoid ambiguity, it is always better to use it with a call which
590
+ provides optional global initialization for the call to
591
+ :class:`EnumeratedSetFromIterator`::
592
+
593
+ sage: @set_from_function(category=InfiniteEnumeratedSets())
594
+ ....: def Fibonacci():
595
+ ....: a = 1; b = 2
596
+ ....: while True:
597
+ ....: yield a
598
+ ....: a, b = b, a + b
599
+ sage: F = Fibonacci(); F
600
+ {1, 2, 3, 5, 8, ...}
601
+ sage: F.cardinality()
602
+ +Infinity
603
+
604
+ A simple example with many options::
605
+
606
+ sage: @set_from_function(name="From %(m)d to %(n)d",
607
+ ....: category=FiniteEnumeratedSets())
608
+ ....: def f(m, n): return xsrange(m, n + 1)
609
+ sage: E = f(3,10); E
610
+ From 3 to 10
611
+ sage: E.list()
612
+ [3, 4, 5, 6, 7, 8, 9, 10]
613
+ sage: E = f(1,100); E
614
+ From 1 to 100
615
+ sage: E.cardinality()
616
+ 100
617
+ sage: f(n=100, m=1) == E
618
+ True
619
+
620
+ An example which mixes together :func:`set_from_function` and
621
+ :func:`cached_method`::
622
+
623
+ sage: @cached_function
624
+ ....: @set_from_function(name="Graphs on %(n)d vertices",
625
+ ....: category=FiniteEnumeratedSets(), cache=True)
626
+ ....: def Graphs(n): return graphs(n)
627
+ sage: Graphs(10) # needs nauty sage.graphs
628
+ Graphs on 10 vertices
629
+ sage: Graphs(10).unrank(0) # needs nauty sage.graphs
630
+ Graph on 10 vertices
631
+ sage: Graphs(10) is Graphs(10) # needs nauty sage.graphs
632
+ True
633
+
634
+ The ``@cached_function`` must go first::
635
+
636
+ sage: @set_from_function(name="Graphs on %(n)d vertices",
637
+ ....: category=FiniteEnumeratedSets(), cache=True)
638
+ ....: @cached_function
639
+ ....: def Graphs(n): return graphs(n)
640
+ sage: Graphs(10) # needs nauty sage.graphs
641
+ Graphs on 10 vertices
642
+ sage: Graphs(10).unrank(0) # needs nauty sage.graphs
643
+ Graph on 10 vertices
644
+ sage: Graphs(10) is Graphs(10) # needs nauty sage.graphs
645
+ False
646
+ """
647
+ def __init__(self, f=None, name=None, **options):
648
+ r"""
649
+ Initialize ``self``.
650
+
651
+ TESTS::
652
+
653
+ sage: from sage.sets.set_from_iterator import set_from_function
654
+ sage: F = set_from_function(category=FiniteEnumeratedSets())(xsrange)
655
+ sage: TestSuite(F(100)).run()
656
+ sage: TestSuite(F(1,5,2)).run()
657
+ sage: TestSuite(F(0)).run()
658
+ """
659
+ if f is not None:
660
+ self.f = f
661
+ if hasattr(f, "__name__"):
662
+ self.__name__ = f.__name__
663
+ else:
664
+ self.__name__ = f.__name__
665
+ self.__module__ = f.__module__
666
+ self.af = ArgumentFixer(f)
667
+ if name is not None:
668
+ self.name = name
669
+ self.options = options
670
+
671
+ def __call__(self, *args, **kwds):
672
+ r"""
673
+ Build a new :class:`EnumeratedSet` by calling ``self.f`` with
674
+ appropriate argument. If ``f`` is ``None``, then returns a new instance
675
+ of :class:`EnumeratedSetFromIterator`.
676
+
677
+ EXAMPLES::
678
+
679
+ sage: from sage.sets.set_from_iterator import set_from_function
680
+ sage: F = set_from_function(category=FiniteEnumeratedSets())(xsrange)
681
+ sage: F(3)
682
+ {0, 1, 2}
683
+ sage: F(end=7,start=3)
684
+ {3, 4, 5, 6}
685
+ sage: F(10).cardinality()
686
+ 10
687
+ """
688
+ if hasattr(self, 'f'): # yet initialized
689
+ if hasattr(self, 'name'):
690
+ if isinstance(self.name, str):
691
+ if args or kwds:
692
+ _, kk = self.af.fix_to_named(*args, **kwds)
693
+ name = self.name % dict(kk)
694
+ else:
695
+ name = self.name
696
+ else:
697
+ name = self.name(*args, **kwds)
698
+ return EnumeratedSetFromIterator(self.f, args, kwds, name=name, **self.options)
699
+ return EnumeratedSetFromIterator(self.f, args, kwds, **self.options)
700
+
701
+ else: # potential global options
702
+ if args == ():
703
+ f, = kwds.values()
704
+ else:
705
+ assert len(args) == 1
706
+ f = args[0]
707
+ return EnumeratedSetFromIterator_function_decorator(
708
+ f,
709
+ name=getattr(self, 'name', None),
710
+ **self.options)
711
+
712
+
713
+ set_from_function = EnumeratedSetFromIterator_function_decorator
714
+
715
+
716
+ @instancedoc
717
+ class EnumeratedSetFromIterator_method_caller(Decorator):
718
+ r"""
719
+ Caller for decorated method in class.
720
+
721
+ INPUT:
722
+
723
+ - ``inst`` -- an instance of a class
724
+
725
+ - ``f`` -- a method of a class of ``inst`` (and not of the instance itself)
726
+
727
+ - ``name`` -- (optional) either a string (which may contains substitution
728
+ rules from argument or a function ``args, kwds -> string``
729
+
730
+ - ``options`` -- any option accepted by :class:`EnumeratedSetFromIterator`
731
+ """
732
+ def __init__(self, inst, f, name=None, **options):
733
+ r"""
734
+ Initialize ``self``.
735
+
736
+ TESTS::
737
+
738
+ sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
739
+ sage: d = DummyExampleForPicklingTest()
740
+ sage: d.f()
741
+ {10, 11, 12, 13, 14, ...}
742
+
743
+ It is possible to pickle/unpickle the class and the instance::
744
+
745
+ sage: loads(dumps(DummyExampleForPicklingTest))().f()
746
+ {10, 11, 12, 13, 14, ...}
747
+ sage: loads(dumps(d)).f()
748
+ {10, 11, 12, 13, 14, ...}
749
+
750
+ But not the enumerated set::
751
+
752
+ sage: from _pickle import PicklingError
753
+ sage: try:
754
+ ....: loads(dumps(d.f()))
755
+ ....: except PicklingError as e:
756
+ ....: print("PicklingError caught")
757
+ PicklingError caught
758
+ """
759
+ self.inst = inst
760
+ self.f = f
761
+ self.af = ArgumentFixer(self.f)
762
+ if hasattr(f, "__name__"):
763
+ self.__name__ = f.__name__
764
+ else:
765
+ self.__name__ = f.__name__
766
+ self.__module__ = f.__module__
767
+
768
+ self.name = name
769
+ self.options = options
770
+
771
+ def __call__(self, *args, **kwds):
772
+ r"""
773
+ Return an instance of :class:`EnumeratedSetFromIterator` with
774
+ proper argument.
775
+
776
+ TESTS::
777
+
778
+ sage: from sage.sets.set_from_iterator import set_from_method
779
+ sage: class A:
780
+ ....: @set_from_method(name = lambda self,n: str(self)*n)
781
+ ....: def f(self, n):
782
+ ....: return xsrange(n)
783
+ ....: def __repr__(self):
784
+ ....: return "A"
785
+ sage: a = A()
786
+ sage: a.f(3) # indirect doctest
787
+ AAA
788
+ sage: A.f(a,3) # indirect doctest
789
+ AAA
790
+ sage: [x for x in a.f(6)] # indirect doctest
791
+ [0, 1, 2, 3, 4, 5]
792
+ """
793
+ if self.inst is not None:
794
+ args = (self.inst,) + args
795
+ if self.name:
796
+ if isinstance(self.name, str):
797
+ aa, kk = self.af.fix_to_named(*args, **kwds)
798
+ name = self.name % dict(kk)
799
+ else:
800
+ name = self.name(*args, **kwds)
801
+ return EnumeratedSetFromIterator(self.f, args, kwds, name, **self.options)
802
+ return EnumeratedSetFromIterator(self.f, args, kwds, **self.options)
803
+
804
+ def __get__(self, inst, cls):
805
+ r"""
806
+ Get a :class:`EnumeratedSetFromIterator_method_caller` bound to a
807
+ specific instance of the class of the cached method.
808
+
809
+ .. NOTE::
810
+
811
+ :class:`EnumeratedSetFromIterator_method_caller` has a separate
812
+ ``__get__`` because of the special behavior of category framework
813
+ for element classes which are not of extension type (see
814
+ :meth:`sage.structure.element.Element.__get__`).
815
+
816
+ TESTS::
817
+
818
+ sage: from sage.sets.set_from_iterator import set_from_method
819
+ sage: class A:
820
+ ....: stop = 10000
821
+ ....: @set_from_method
822
+ ....: def f(self, start):
823
+ ....: return xsrange(start, self.stop)
824
+ sage: a = A()
825
+ sage: A.f(a,4)
826
+ {4, 5, 6, 7, 8, ...}
827
+
828
+ sage: class B:
829
+ ....: stop = 10000
830
+ ....: @set_from_method(category=FiniteEnumeratedSets())
831
+ ....: def f(self, start):
832
+ ....: return xsrange(start, self.stop)
833
+ sage: b = B()
834
+ sage: B.f(b,2)
835
+ {2, 3, 4, 5, 6, ...}
836
+ """
837
+ return EnumeratedSetFromIterator_method_caller(
838
+ inst, self.f,
839
+ self.name,
840
+ **self.options)
841
+
842
+
843
+ class EnumeratedSetFromIterator_method_decorator:
844
+ r"""
845
+ Decorator for enumerated set built from a method.
846
+
847
+ INPUT:
848
+
849
+ - ``f`` -- (optional) function from which are built the enumerated sets at
850
+ each call
851
+
852
+ - ``name`` -- (optional) string (which may contains substitution rules from
853
+ argument) or a function ``(args,kwds) -> string``
854
+
855
+ - any option accepted by :class:`EnumeratedSetFromIterator`.
856
+
857
+ EXAMPLES::
858
+
859
+ sage: from sage.sets.set_from_iterator import set_from_method
860
+ sage: class A():
861
+ ....: def n(self): return 12
862
+ ....: @set_from_method
863
+ ....: def f(self): return xsrange(self.n())
864
+ sage: a = A()
865
+ sage: print(a.f.__class__)
866
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
867
+ sage: a.f()
868
+ {0, 1, 2, 3, 4, ...}
869
+ sage: A.f(a)
870
+ {0, 1, 2, 3, 4, ...}
871
+
872
+ A more complicated example with a parametrized name::
873
+
874
+ sage: class B():
875
+ ....: @set_from_method(name="Graphs(%(n)d)",
876
+ ....: category=FiniteEnumeratedSets())
877
+ ....: def graphs(self, n): return graphs(n)
878
+ sage: b = B()
879
+ sage: G3 = b.graphs(3); G3
880
+ Graphs(3)
881
+ sage: G3.cardinality() # needs nauty sage.graphs
882
+ 4
883
+ sage: G3.category()
884
+ Category of facade finite enumerated sets
885
+ sage: B.graphs(b, 3)
886
+ Graphs(3)
887
+
888
+ And a last example with a name parametrized by a function::
889
+
890
+ sage: class D():
891
+ ....: def __init__(self, name): self.name = str(name)
892
+ ....: def __str__(self): return self.name
893
+ ....: @set_from_method(name=lambda self, n: str(self) * n,
894
+ ....: category=FiniteEnumeratedSets())
895
+ ....: def subset(self, n):
896
+ ....: return xsrange(n)
897
+ sage: d = D('a')
898
+ sage: E = d.subset(3); E
899
+ aaa
900
+ sage: E.list()
901
+ [0, 1, 2]
902
+ sage: F = d.subset(n=10); F
903
+ aaaaaaaaaa
904
+ sage: F.list()
905
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
906
+
907
+ .. TODO::
908
+
909
+ It is not yet possible to use ``set_from_method`` in conjunction with
910
+ ``cached_method``.
911
+ """
912
+ def __init__(self, f=None, **options):
913
+ r"""
914
+ Initialize ``self``.
915
+
916
+ TESTS:
917
+
918
+ We test if pickling works correctly on the Permutation class (in
919
+ :mod:`sage.combinat.permutation`) because its method ``bruhat_succ``
920
+ and ``bruhat_pred`` are decorated with ``set_from_method``::
921
+
922
+ sage: from sage.combinat.permutation import Permutation
923
+ sage: loads(dumps(Permutation))
924
+ <class 'sage.combinat.permutation.Permutation'>
925
+ sage: p = Permutation([3,2,1])
926
+ sage: loads(dumps(p)) == p
927
+ True
928
+ """
929
+ if f is not None:
930
+ self.f = f
931
+ if hasattr(f, "__name__"):
932
+ self.__name__ = f.__name__
933
+ self.__module__ = f.__module__
934
+ else:
935
+ if hasattr(f, '__module__'):
936
+ self.__module__ = f.__module__
937
+ elif hasattr(f, '__func__'):
938
+ self.__module__ = f.__func__.__module__
939
+
940
+ if hasattr(f, '__name__'):
941
+ self.__name__ = f.__name__
942
+ elif hasattr(f, '__func__'):
943
+ self.__name__ = f.__func__.__name__
944
+
945
+ self.options = options
946
+
947
+ def __call__(self, f):
948
+ r"""
949
+ Trick if :class:`EnumeratedSetFromIterator_method` was created with
950
+ some options and is called with a function as argument.
951
+
952
+ TESTS::
953
+
954
+ sage: from sage.sets.set_from_iterator import set_from_method
955
+ sage: class A: # indirect doctest
956
+ ....: @set_from_method()
957
+ ....: def f(self):
958
+ ....: return xsrange(3)
959
+ sage: a = A()
960
+ sage: a.f()
961
+ {0, 1, 2}
962
+ """
963
+ return EnumeratedSetFromIterator_method_decorator(f, **self.options)
964
+
965
+ def __get__(self, inst, cls):
966
+ r"""
967
+ TESTS::
968
+
969
+ sage: from sage.sets.set_from_iterator import set_from_method
970
+ sage: class A():
971
+ ....: def n(self): return 12
972
+ ....: @set_from_method
973
+ ....: def f(self): return xsrange(self.n())
974
+ sage: a = A()
975
+ sage: print(A.f.__class__)
976
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
977
+ sage: print(a.f.__class__)
978
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
979
+ """
980
+ # You would hardly ever see an instance of this class alive.
981
+ return EnumeratedSetFromIterator_method_caller(inst, self.f, **self.options)
982
+
983
+
984
+ set_from_method = EnumeratedSetFromIterator_method_decorator
985
+
986
+
987
+ class DummyExampleForPicklingTest:
988
+ r"""
989
+ Class example to test pickling with the decorator :class:`set_from_method`.
990
+
991
+ .. WARNING::
992
+
993
+ This class is intended to be used in doctest only.
994
+
995
+ EXAMPLES::
996
+
997
+ sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
998
+ sage: DummyExampleForPicklingTest().f()
999
+ {10, 11, 12, 13, 14, ...}
1000
+ """
1001
+ start = 10
1002
+ stop = 100
1003
+
1004
+ @set_from_method
1005
+ def f(self):
1006
+ r"""
1007
+ Return the set between ``self.start`` and ``self.stop``.
1008
+
1009
+ EXAMPLES::
1010
+
1011
+ sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
1012
+ sage: d = DummyExampleForPicklingTest()
1013
+ sage: d.f()
1014
+ {10, 11, 12, 13, 14, ...}
1015
+ sage: d.start = 4
1016
+ sage: d.stop = 200
1017
+ sage: d.f()
1018
+ {4, 5, 6, 7, 8, ...}
1019
+ """
1020
+ from sage.arith.srange import xsrange
1021
+ return xsrange(self.start, self.stop)