passagemath-categories 10.6.30__cp313-cp313-macosx_13_0_arm64.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 (717) hide show
  1. passagemath_categories-10.6.30.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.30.dist-info/RECORD +717 -0
  3. passagemath_categories-10.6.30.dist-info/WHEEL +6 -0
  4. passagemath_categories-10.6.30.dist-info/top_level.txt +2 -0
  5. passagemath_categories.dylibs/libgmp.10.dylib +0 -0
  6. sage/all__sagemath_categories.py +28 -0
  7. sage/arith/all.py +38 -0
  8. sage/arith/constants.pxd +27 -0
  9. sage/arith/functions.cpython-313-darwin.so +0 -0
  10. sage/arith/functions.pxd +4 -0
  11. sage/arith/functions.pyx +221 -0
  12. sage/arith/misc.py +6552 -0
  13. sage/arith/multi_modular.cpython-313-darwin.so +0 -0
  14. sage/arith/multi_modular.pxd +39 -0
  15. sage/arith/multi_modular.pyx +994 -0
  16. sage/arith/rational_reconstruction.cpython-313-darwin.so +0 -0
  17. sage/arith/rational_reconstruction.pxd +4 -0
  18. sage/arith/rational_reconstruction.pyx +115 -0
  19. sage/arith/srange.cpython-313-darwin.so +0 -0
  20. sage/arith/srange.pyx +571 -0
  21. sage/calculus/all__sagemath_categories.py +2 -0
  22. sage/calculus/functional.py +481 -0
  23. sage/calculus/functions.py +151 -0
  24. sage/categories/additive_groups.py +73 -0
  25. sage/categories/additive_magmas.py +1044 -0
  26. sage/categories/additive_monoids.py +114 -0
  27. sage/categories/additive_semigroups.py +184 -0
  28. sage/categories/affine_weyl_groups.py +238 -0
  29. sage/categories/algebra_ideals.py +95 -0
  30. sage/categories/algebra_modules.py +96 -0
  31. sage/categories/algebras.py +349 -0
  32. sage/categories/algebras_with_basis.py +377 -0
  33. sage/categories/all.py +160 -0
  34. sage/categories/aperiodic_semigroups.py +29 -0
  35. sage/categories/associative_algebras.py +47 -0
  36. sage/categories/bialgebras.py +101 -0
  37. sage/categories/bialgebras_with_basis.py +414 -0
  38. sage/categories/bimodules.py +206 -0
  39. sage/categories/chain_complexes.py +268 -0
  40. sage/categories/classical_crystals.py +480 -0
  41. sage/categories/coalgebras.py +405 -0
  42. sage/categories/coalgebras_with_basis.py +232 -0
  43. sage/categories/coercion_methods.cpython-313-darwin.so +0 -0
  44. sage/categories/coercion_methods.pyx +52 -0
  45. sage/categories/commutative_additive_groups.py +104 -0
  46. sage/categories/commutative_additive_monoids.py +45 -0
  47. sage/categories/commutative_additive_semigroups.py +48 -0
  48. sage/categories/commutative_algebra_ideals.py +87 -0
  49. sage/categories/commutative_algebras.py +94 -0
  50. sage/categories/commutative_ring_ideals.py +58 -0
  51. sage/categories/commutative_rings.py +736 -0
  52. sage/categories/complete_discrete_valuation.py +293 -0
  53. sage/categories/complex_reflection_groups.py +145 -0
  54. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  55. sage/categories/coxeter_group_algebras.py +186 -0
  56. sage/categories/coxeter_groups.py +3402 -0
  57. sage/categories/crystals.py +2628 -0
  58. sage/categories/cw_complexes.py +216 -0
  59. sage/categories/dedekind_domains.py +137 -0
  60. sage/categories/discrete_valuation.py +325 -0
  61. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  62. sage/categories/division_rings.py +114 -0
  63. sage/categories/domains.py +95 -0
  64. sage/categories/drinfeld_modules.py +789 -0
  65. sage/categories/dual.py +42 -0
  66. sage/categories/enumerated_sets.py +1146 -0
  67. sage/categories/euclidean_domains.py +271 -0
  68. sage/categories/examples/algebras_with_basis.py +102 -0
  69. sage/categories/examples/all.py +1 -0
  70. sage/categories/examples/commutative_additive_monoids.py +130 -0
  71. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  72. sage/categories/examples/coxeter_groups.py +8 -0
  73. sage/categories/examples/crystals.py +236 -0
  74. sage/categories/examples/cw_complexes.py +163 -0
  75. sage/categories/examples/facade_sets.py +187 -0
  76. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  77. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  78. sage/categories/examples/finite_coxeter_groups.py +252 -0
  79. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  80. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  81. sage/categories/examples/finite_enumerated_sets.py +208 -0
  82. sage/categories/examples/finite_monoids.py +150 -0
  83. sage/categories/examples/finite_semigroups.py +190 -0
  84. sage/categories/examples/finite_weyl_groups.py +191 -0
  85. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  86. sage/categories/examples/graded_modules_with_basis.py +168 -0
  87. sage/categories/examples/graphs.py +122 -0
  88. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  89. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  90. sage/categories/examples/lie_algebras.py +352 -0
  91. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  92. sage/categories/examples/magmas.py +162 -0
  93. sage/categories/examples/manifolds.py +94 -0
  94. sage/categories/examples/monoids.py +144 -0
  95. sage/categories/examples/posets.py +178 -0
  96. sage/categories/examples/semigroups.py +580 -0
  97. sage/categories/examples/semigroups_cython.cpython-313-darwin.so +0 -0
  98. sage/categories/examples/semigroups_cython.pyx +221 -0
  99. sage/categories/examples/semirings.py +249 -0
  100. sage/categories/examples/sets_cat.py +706 -0
  101. sage/categories/examples/sets_with_grading.py +101 -0
  102. sage/categories/examples/with_realizations.py +542 -0
  103. sage/categories/fields.py +991 -0
  104. sage/categories/filtered_algebras.py +63 -0
  105. sage/categories/filtered_algebras_with_basis.py +548 -0
  106. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  107. sage/categories/filtered_modules.py +210 -0
  108. sage/categories/filtered_modules_with_basis.py +1209 -0
  109. sage/categories/finite_complex_reflection_groups.py +1506 -0
  110. sage/categories/finite_coxeter_groups.py +1138 -0
  111. sage/categories/finite_crystals.py +103 -0
  112. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  113. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  114. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  115. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  116. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  117. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  118. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  119. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  120. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  121. sage/categories/finite_enumerated_sets.py +769 -0
  122. sage/categories/finite_fields.py +252 -0
  123. sage/categories/finite_groups.py +256 -0
  124. sage/categories/finite_lattice_posets.py +242 -0
  125. sage/categories/finite_monoids.py +316 -0
  126. sage/categories/finite_permutation_groups.py +339 -0
  127. sage/categories/finite_posets.py +1994 -0
  128. sage/categories/finite_semigroups.py +136 -0
  129. sage/categories/finite_sets.py +93 -0
  130. sage/categories/finite_weyl_groups.py +39 -0
  131. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  132. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  133. sage/categories/finitely_generated_magmas.py +57 -0
  134. sage/categories/finitely_generated_semigroups.py +214 -0
  135. sage/categories/function_fields.py +76 -0
  136. sage/categories/g_sets.py +77 -0
  137. sage/categories/gcd_domains.py +65 -0
  138. sage/categories/generalized_coxeter_groups.py +94 -0
  139. sage/categories/graded_algebras.py +85 -0
  140. sage/categories/graded_algebras_with_basis.py +258 -0
  141. sage/categories/graded_bialgebras.py +32 -0
  142. sage/categories/graded_bialgebras_with_basis.py +32 -0
  143. sage/categories/graded_coalgebras.py +65 -0
  144. sage/categories/graded_coalgebras_with_basis.py +51 -0
  145. sage/categories/graded_hopf_algebras.py +41 -0
  146. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  147. sage/categories/graded_lie_algebras.py +91 -0
  148. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  149. sage/categories/graded_lie_conformal_algebras.py +74 -0
  150. sage/categories/graded_modules.py +133 -0
  151. sage/categories/graded_modules_with_basis.py +329 -0
  152. sage/categories/graphs.py +138 -0
  153. sage/categories/group_algebras.py +430 -0
  154. sage/categories/groupoid.py +94 -0
  155. sage/categories/groups.py +667 -0
  156. sage/categories/h_trivial_semigroups.py +64 -0
  157. sage/categories/hecke_modules.py +185 -0
  158. sage/categories/highest_weight_crystals.py +980 -0
  159. sage/categories/hopf_algebras.py +219 -0
  160. sage/categories/hopf_algebras_with_basis.py +309 -0
  161. sage/categories/infinite_enumerated_sets.py +115 -0
  162. sage/categories/integral_domains.py +203 -0
  163. sage/categories/j_trivial_semigroups.py +29 -0
  164. sage/categories/kac_moody_algebras.py +82 -0
  165. sage/categories/kahler_algebras.py +203 -0
  166. sage/categories/l_trivial_semigroups.py +63 -0
  167. sage/categories/lambda_bracket_algebras.py +280 -0
  168. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  169. sage/categories/lattice_posets.py +89 -0
  170. sage/categories/left_modules.py +49 -0
  171. sage/categories/lie_algebras.py +1070 -0
  172. sage/categories/lie_algebras_with_basis.py +261 -0
  173. sage/categories/lie_conformal_algebras.py +350 -0
  174. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  175. sage/categories/lie_groups.py +73 -0
  176. sage/categories/loop_crystals.py +1290 -0
  177. sage/categories/magmas.py +1189 -0
  178. sage/categories/magmas_and_additive_magmas.py +149 -0
  179. sage/categories/magmatic_algebras.py +365 -0
  180. sage/categories/manifolds.py +352 -0
  181. sage/categories/matrix_algebras.py +40 -0
  182. sage/categories/metric_spaces.py +387 -0
  183. sage/categories/modular_abelian_varieties.py +78 -0
  184. sage/categories/modules.py +989 -0
  185. sage/categories/modules_with_basis.py +2794 -0
  186. sage/categories/monoid_algebras.py +38 -0
  187. sage/categories/monoids.py +739 -0
  188. sage/categories/noetherian_rings.py +87 -0
  189. sage/categories/number_fields.py +242 -0
  190. sage/categories/ore_modules.py +189 -0
  191. sage/categories/partially_ordered_monoids.py +49 -0
  192. sage/categories/permutation_groups.py +63 -0
  193. sage/categories/pointed_sets.py +42 -0
  194. sage/categories/polyhedra.py +74 -0
  195. sage/categories/poor_man_map.py +270 -0
  196. sage/categories/posets.py +722 -0
  197. sage/categories/principal_ideal_domains.py +270 -0
  198. sage/categories/quantum_group_representations.py +543 -0
  199. sage/categories/quotient_fields.py +728 -0
  200. sage/categories/r_trivial_semigroups.py +45 -0
  201. sage/categories/regular_crystals.py +898 -0
  202. sage/categories/regular_supercrystals.py +170 -0
  203. sage/categories/right_modules.py +49 -0
  204. sage/categories/ring_ideals.py +74 -0
  205. sage/categories/rings.py +1904 -0
  206. sage/categories/rngs.py +175 -0
  207. sage/categories/schemes.py +393 -0
  208. sage/categories/semigroups.py +1060 -0
  209. sage/categories/semirings.py +71 -0
  210. sage/categories/semisimple_algebras.py +114 -0
  211. sage/categories/sets_with_grading.py +235 -0
  212. sage/categories/shephard_groups.py +43 -0
  213. sage/categories/signed_tensor.py +120 -0
  214. sage/categories/simplicial_complexes.py +134 -0
  215. sage/categories/simplicial_sets.py +1206 -0
  216. sage/categories/super_algebras.py +149 -0
  217. sage/categories/super_algebras_with_basis.py +144 -0
  218. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  219. sage/categories/super_lie_conformal_algebras.py +193 -0
  220. sage/categories/super_modules.py +229 -0
  221. sage/categories/super_modules_with_basis.py +193 -0
  222. sage/categories/supercommutative_algebras.py +99 -0
  223. sage/categories/supercrystals.py +406 -0
  224. sage/categories/tensor.py +110 -0
  225. sage/categories/topological_spaces.py +170 -0
  226. sage/categories/triangular_kac_moody_algebras.py +439 -0
  227. sage/categories/tutorial.py +58 -0
  228. sage/categories/unique_factorization_domains.py +318 -0
  229. sage/categories/unital_algebras.py +426 -0
  230. sage/categories/vector_bundles.py +159 -0
  231. sage/categories/vector_spaces.py +357 -0
  232. sage/categories/weyl_groups.py +853 -0
  233. sage/combinat/all__sagemath_categories.py +34 -0
  234. sage/combinat/backtrack.py +180 -0
  235. sage/combinat/combinat.py +2269 -0
  236. sage/combinat/combinat_cython.cpython-313-darwin.so +0 -0
  237. sage/combinat/combinat_cython.pxd +6 -0
  238. sage/combinat/combinat_cython.pyx +390 -0
  239. sage/combinat/combination.py +796 -0
  240. sage/combinat/combinatorial_map.py +416 -0
  241. sage/combinat/composition.py +2192 -0
  242. sage/combinat/dlx.py +510 -0
  243. sage/combinat/integer_lists/__init__.py +7 -0
  244. sage/combinat/integer_lists/base.cpython-313-darwin.so +0 -0
  245. sage/combinat/integer_lists/base.pxd +16 -0
  246. sage/combinat/integer_lists/base.pyx +713 -0
  247. sage/combinat/integer_lists/invlex.cpython-313-darwin.so +0 -0
  248. sage/combinat/integer_lists/invlex.pxd +4 -0
  249. sage/combinat/integer_lists/invlex.pyx +1650 -0
  250. sage/combinat/integer_lists/lists.py +328 -0
  251. sage/combinat/integer_lists/nn.py +48 -0
  252. sage/combinat/integer_vector.py +1818 -0
  253. sage/combinat/integer_vector_weighted.py +413 -0
  254. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  255. sage/combinat/matrices/dancing_links.cpython-313-darwin.so +0 -0
  256. sage/combinat/matrices/dancing_links.pyx +1159 -0
  257. sage/combinat/matrices/dancing_links_c.h +380 -0
  258. sage/combinat/matrices/dlxcpp.py +136 -0
  259. sage/combinat/partition.py +10070 -0
  260. sage/combinat/partitions.cpython-313-darwin.so +0 -0
  261. sage/combinat/partitions.pyx +743 -0
  262. sage/combinat/permutation.py +10168 -0
  263. sage/combinat/permutation_cython.cpython-313-darwin.so +0 -0
  264. sage/combinat/permutation_cython.pxd +11 -0
  265. sage/combinat/permutation_cython.pyx +407 -0
  266. sage/combinat/q_analogues.py +1090 -0
  267. sage/combinat/ranker.py +268 -0
  268. sage/combinat/subset.py +1561 -0
  269. sage/combinat/subsets_hereditary.py +202 -0
  270. sage/combinat/subsets_pairwise.py +184 -0
  271. sage/combinat/tools.py +63 -0
  272. sage/combinat/tuple.py +348 -0
  273. sage/data_structures/all.py +2 -0
  274. sage/data_structures/all__sagemath_categories.py +2 -0
  275. sage/data_structures/binary_matrix.pxd +138 -0
  276. sage/data_structures/binary_search.cpython-313-darwin.so +0 -0
  277. sage/data_structures/binary_search.pxd +3 -0
  278. sage/data_structures/binary_search.pyx +66 -0
  279. sage/data_structures/bitset.cpython-313-darwin.so +0 -0
  280. sage/data_structures/bitset.pxd +40 -0
  281. sage/data_structures/bitset.pyx +2385 -0
  282. sage/data_structures/bitset_base.cpython-313-darwin.so +0 -0
  283. sage/data_structures/bitset_base.pxd +926 -0
  284. sage/data_structures/bitset_base.pyx +117 -0
  285. sage/data_structures/bitset_intrinsics.h +487 -0
  286. sage/data_structures/blas_dict.cpython-313-darwin.so +0 -0
  287. sage/data_structures/blas_dict.pxd +12 -0
  288. sage/data_structures/blas_dict.pyx +469 -0
  289. sage/data_structures/list_of_pairs.cpython-313-darwin.so +0 -0
  290. sage/data_structures/list_of_pairs.pxd +16 -0
  291. sage/data_structures/list_of_pairs.pyx +122 -0
  292. sage/data_structures/mutable_poset.py +3312 -0
  293. sage/data_structures/pairing_heap.cpython-313-darwin.so +0 -0
  294. sage/data_structures/pairing_heap.h +346 -0
  295. sage/data_structures/pairing_heap.pxd +88 -0
  296. sage/data_structures/pairing_heap.pyx +1464 -0
  297. sage/data_structures/sparse_bitset.pxd +62 -0
  298. sage/data_structures/stream.py +5070 -0
  299. sage/databases/all__sagemath_categories.py +7 -0
  300. sage/databases/sql_db.py +2236 -0
  301. sage/ext/all__sagemath_categories.py +3 -0
  302. sage/ext/fast_callable.cpython-313-darwin.so +0 -0
  303. sage/ext/fast_callable.pxd +4 -0
  304. sage/ext/fast_callable.pyx +2746 -0
  305. sage/ext/fast_eval.cpython-313-darwin.so +0 -0
  306. sage/ext/fast_eval.pxd +1 -0
  307. sage/ext/fast_eval.pyx +102 -0
  308. sage/ext/interpreters/__init__.py +1 -0
  309. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  310. sage/ext/interpreters/wrapper_el.cpython-313-darwin.so +0 -0
  311. sage/ext/interpreters/wrapper_el.pxd +18 -0
  312. sage/ext/interpreters/wrapper_el.pyx +148 -0
  313. sage/ext/interpreters/wrapper_py.cpython-313-darwin.so +0 -0
  314. sage/ext/interpreters/wrapper_py.pxd +17 -0
  315. sage/ext/interpreters/wrapper_py.pyx +133 -0
  316. sage/functions/airy.py +937 -0
  317. sage/functions/all.py +97 -0
  318. sage/functions/bessel.py +2102 -0
  319. sage/functions/error.py +784 -0
  320. sage/functions/exp_integral.py +1529 -0
  321. sage/functions/gamma.py +1087 -0
  322. sage/functions/generalized.py +672 -0
  323. sage/functions/hyperbolic.py +747 -0
  324. sage/functions/hypergeometric.py +1156 -0
  325. sage/functions/jacobi.py +1705 -0
  326. sage/functions/log.py +1402 -0
  327. sage/functions/min_max.py +338 -0
  328. sage/functions/orthogonal_polys.py +3106 -0
  329. sage/functions/other.py +2303 -0
  330. sage/functions/piecewise.py +1505 -0
  331. sage/functions/prime_pi.cpython-313-darwin.so +0 -0
  332. sage/functions/prime_pi.pyx +262 -0
  333. sage/functions/special.py +1212 -0
  334. sage/functions/spike_function.py +278 -0
  335. sage/functions/transcendental.py +690 -0
  336. sage/functions/trig.py +1062 -0
  337. sage/functions/wigner.py +726 -0
  338. sage/geometry/abc.cpython-313-darwin.so +0 -0
  339. sage/geometry/abc.pyx +82 -0
  340. sage/geometry/all__sagemath_categories.py +1 -0
  341. sage/groups/all__sagemath_categories.py +11 -0
  342. sage/groups/generic.py +1733 -0
  343. sage/groups/groups_catalog.py +113 -0
  344. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  345. sage/groups/perm_gps/partn_ref/all.py +1 -0
  346. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-313-darwin.so +0 -0
  348. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  350. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-313-darwin.so +0 -0
  351. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  353. sage/groups/perm_gps/partn_ref/data_structures.cpython-313-darwin.so +0 -0
  354. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  356. sage/groups/perm_gps/partn_ref/double_coset.cpython-313-darwin.so +0 -0
  357. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  359. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-313-darwin.so +0 -0
  360. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  362. sage/groups/perm_gps/partn_ref/refinement_python.cpython-313-darwin.so +0 -0
  363. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  365. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-313-darwin.so +0 -0
  366. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  368. sage/interfaces/abc.py +140 -0
  369. sage/interfaces/all.py +58 -0
  370. sage/interfaces/all__sagemath_categories.py +1 -0
  371. sage/interfaces/expect.py +1643 -0
  372. sage/interfaces/interface.py +1682 -0
  373. sage/interfaces/process.cpython-313-darwin.so +0 -0
  374. sage/interfaces/process.pxd +5 -0
  375. sage/interfaces/process.pyx +288 -0
  376. sage/interfaces/quit.py +167 -0
  377. sage/interfaces/sage0.py +604 -0
  378. sage/interfaces/sagespawn.cpython-313-darwin.so +0 -0
  379. sage/interfaces/sagespawn.pyx +308 -0
  380. sage/interfaces/tab_completion.py +101 -0
  381. sage/misc/all__sagemath_categories.py +78 -0
  382. sage/misc/allocator.cpython-313-darwin.so +0 -0
  383. sage/misc/allocator.pxd +6 -0
  384. sage/misc/allocator.pyx +47 -0
  385. sage/misc/binary_tree.cpython-313-darwin.so +0 -0
  386. sage/misc/binary_tree.pxd +29 -0
  387. sage/misc/binary_tree.pyx +537 -0
  388. sage/misc/callable_dict.cpython-313-darwin.so +0 -0
  389. sage/misc/callable_dict.pyx +89 -0
  390. sage/misc/citation.cpython-313-darwin.so +0 -0
  391. sage/misc/citation.pyx +159 -0
  392. sage/misc/converting_dict.py +293 -0
  393. sage/misc/defaults.py +129 -0
  394. sage/misc/derivative.cpython-313-darwin.so +0 -0
  395. sage/misc/derivative.pyx +223 -0
  396. sage/misc/functional.py +2005 -0
  397. sage/misc/html.py +589 -0
  398. sage/misc/latex.py +2673 -0
  399. sage/misc/latex_macros.py +236 -0
  400. sage/misc/latex_standalone.py +1833 -0
  401. sage/misc/map_threaded.py +38 -0
  402. sage/misc/mathml.py +76 -0
  403. sage/misc/method_decorator.py +88 -0
  404. sage/misc/mrange.py +755 -0
  405. sage/misc/multireplace.py +41 -0
  406. sage/misc/object_multiplexer.py +92 -0
  407. sage/misc/parser.cpython-313-darwin.so +0 -0
  408. sage/misc/parser.pyx +1107 -0
  409. sage/misc/random_testing.py +264 -0
  410. sage/misc/rest_index_of_methods.py +377 -0
  411. sage/misc/search.cpython-313-darwin.so +0 -0
  412. sage/misc/search.pxd +2 -0
  413. sage/misc/search.pyx +68 -0
  414. sage/misc/stopgap.cpython-313-darwin.so +0 -0
  415. sage/misc/stopgap.pyx +95 -0
  416. sage/misc/table.py +853 -0
  417. sage/monoids/all__sagemath_categories.py +1 -0
  418. sage/monoids/indexed_free_monoid.py +1071 -0
  419. sage/monoids/monoid.py +82 -0
  420. sage/numerical/all__sagemath_categories.py +1 -0
  421. sage/numerical/backends/all__sagemath_categories.py +1 -0
  422. sage/numerical/backends/generic_backend.cpython-313-darwin.so +0 -0
  423. sage/numerical/backends/generic_backend.pxd +61 -0
  424. sage/numerical/backends/generic_backend.pyx +1893 -0
  425. sage/numerical/backends/generic_sdp_backend.cpython-313-darwin.so +0 -0
  426. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  427. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  428. sage/parallel/all.py +6 -0
  429. sage/parallel/decorate.py +575 -0
  430. sage/parallel/map_reduce.py +1997 -0
  431. sage/parallel/multiprocessing_sage.py +76 -0
  432. sage/parallel/ncpus.py +35 -0
  433. sage/parallel/parallelism.py +364 -0
  434. sage/parallel/reference.py +47 -0
  435. sage/parallel/use_fork.py +333 -0
  436. sage/rings/abc.cpython-313-darwin.so +0 -0
  437. sage/rings/abc.pxd +31 -0
  438. sage/rings/abc.pyx +526 -0
  439. sage/rings/algebraic_closure_finite_field.py +1154 -0
  440. sage/rings/all__sagemath_categories.py +91 -0
  441. sage/rings/big_oh.py +227 -0
  442. sage/rings/continued_fraction.py +2754 -0
  443. sage/rings/continued_fraction_gosper.py +220 -0
  444. sage/rings/factorint.cpython-313-darwin.so +0 -0
  445. sage/rings/factorint.pyx +295 -0
  446. sage/rings/fast_arith.cpython-313-darwin.so +0 -0
  447. sage/rings/fast_arith.pxd +21 -0
  448. sage/rings/fast_arith.pyx +535 -0
  449. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  450. sage/rings/finite_rings/conway_polynomials.py +542 -0
  451. sage/rings/finite_rings/element_base.cpython-313-darwin.so +0 -0
  452. sage/rings/finite_rings/element_base.pxd +12 -0
  453. sage/rings/finite_rings/element_base.pyx +1176 -0
  454. sage/rings/finite_rings/finite_field_base.cpython-313-darwin.so +0 -0
  455. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  456. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  457. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  458. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  459. sage/rings/finite_rings/galois_group.py +154 -0
  460. sage/rings/finite_rings/hom_finite_field.cpython-313-darwin.so +0 -0
  461. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  462. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  463. sage/rings/finite_rings/hom_prime_finite_field.cpython-313-darwin.so +0 -0
  464. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  466. sage/rings/finite_rings/homset.py +357 -0
  467. sage/rings/finite_rings/integer_mod.cpython-313-darwin.so +0 -0
  468. sage/rings/finite_rings/integer_mod.pxd +56 -0
  469. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  470. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  471. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  472. sage/rings/finite_rings/residue_field.cpython-313-darwin.so +0 -0
  473. sage/rings/finite_rings/residue_field.pxd +30 -0
  474. sage/rings/finite_rings/residue_field.pyx +1811 -0
  475. sage/rings/finite_rings/stdint.pxd +19 -0
  476. sage/rings/fraction_field.py +1452 -0
  477. sage/rings/fraction_field_element.cpython-313-darwin.so +0 -0
  478. sage/rings/fraction_field_element.pyx +1357 -0
  479. sage/rings/function_field/all.py +7 -0
  480. sage/rings/function_field/all__sagemath_categories.py +2 -0
  481. sage/rings/function_field/constructor.py +218 -0
  482. sage/rings/function_field/element.cpython-313-darwin.so +0 -0
  483. sage/rings/function_field/element.pxd +11 -0
  484. sage/rings/function_field/element.pyx +1008 -0
  485. sage/rings/function_field/element_rational.cpython-313-darwin.so +0 -0
  486. sage/rings/function_field/element_rational.pyx +513 -0
  487. sage/rings/function_field/extensions.py +230 -0
  488. sage/rings/function_field/function_field.py +1468 -0
  489. sage/rings/function_field/function_field_rational.py +1005 -0
  490. sage/rings/function_field/ideal.py +1155 -0
  491. sage/rings/function_field/ideal_rational.py +629 -0
  492. sage/rings/function_field/jacobian_base.py +826 -0
  493. sage/rings/function_field/jacobian_hess.py +1053 -0
  494. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  495. sage/rings/function_field/maps.py +1039 -0
  496. sage/rings/function_field/order.py +281 -0
  497. sage/rings/function_field/order_basis.py +586 -0
  498. sage/rings/function_field/order_rational.py +576 -0
  499. sage/rings/function_field/place.py +426 -0
  500. sage/rings/function_field/place_rational.py +181 -0
  501. sage/rings/generic.py +320 -0
  502. sage/rings/homset.py +332 -0
  503. sage/rings/ideal.py +1885 -0
  504. sage/rings/ideal_monoid.py +215 -0
  505. sage/rings/infinity.py +1890 -0
  506. sage/rings/integer.cpython-313-darwin.so +0 -0
  507. sage/rings/integer.pxd +45 -0
  508. sage/rings/integer.pyx +7871 -0
  509. sage/rings/integer_ring.cpython-313-darwin.so +0 -0
  510. sage/rings/integer_ring.pxd +8 -0
  511. sage/rings/integer_ring.pyx +1693 -0
  512. sage/rings/laurent_series_ring.py +931 -0
  513. sage/rings/laurent_series_ring_element.cpython-313-darwin.so +0 -0
  514. sage/rings/laurent_series_ring_element.pxd +11 -0
  515. sage/rings/laurent_series_ring_element.pyx +1927 -0
  516. sage/rings/lazy_series.py +7815 -0
  517. sage/rings/lazy_series_ring.py +4356 -0
  518. sage/rings/localization.py +1043 -0
  519. sage/rings/morphism.cpython-313-darwin.so +0 -0
  520. sage/rings/morphism.pxd +39 -0
  521. sage/rings/morphism.pyx +3299 -0
  522. sage/rings/multi_power_series_ring.py +1145 -0
  523. sage/rings/multi_power_series_ring_element.py +2184 -0
  524. sage/rings/noncommutative_ideals.cpython-313-darwin.so +0 -0
  525. sage/rings/noncommutative_ideals.pyx +423 -0
  526. sage/rings/number_field/all__sagemath_categories.py +1 -0
  527. sage/rings/number_field/number_field_base.cpython-313-darwin.so +0 -0
  528. sage/rings/number_field/number_field_base.pxd +8 -0
  529. sage/rings/number_field/number_field_base.pyx +507 -0
  530. sage/rings/number_field/number_field_element_base.cpython-313-darwin.so +0 -0
  531. sage/rings/number_field/number_field_element_base.pxd +6 -0
  532. sage/rings/number_field/number_field_element_base.pyx +36 -0
  533. sage/rings/number_field/number_field_ideal.py +3550 -0
  534. sage/rings/padics/all__sagemath_categories.py +4 -0
  535. sage/rings/padics/local_generic.py +1670 -0
  536. sage/rings/padics/local_generic_element.cpython-313-darwin.so +0 -0
  537. sage/rings/padics/local_generic_element.pxd +5 -0
  538. sage/rings/padics/local_generic_element.pyx +1017 -0
  539. sage/rings/padics/misc.py +256 -0
  540. sage/rings/padics/padic_generic.py +1911 -0
  541. sage/rings/padics/pow_computer.cpython-313-darwin.so +0 -0
  542. sage/rings/padics/pow_computer.pxd +38 -0
  543. sage/rings/padics/pow_computer.pyx +671 -0
  544. sage/rings/padics/precision_error.py +24 -0
  545. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  546. sage/rings/polynomial/commutative_polynomial.cpython-313-darwin.so +0 -0
  547. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  548. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  549. sage/rings/polynomial/cyclotomic.cpython-313-darwin.so +0 -0
  550. sage/rings/polynomial/cyclotomic.pyx +404 -0
  551. sage/rings/polynomial/flatten.py +711 -0
  552. sage/rings/polynomial/ideal.py +102 -0
  553. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  554. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  555. sage/rings/polynomial/laurent_polynomial.cpython-313-darwin.so +0 -0
  556. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  557. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  558. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  559. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  560. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  561. sage/rings/polynomial/multi_polynomial.cpython-313-darwin.so +0 -0
  562. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  563. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  564. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  565. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  566. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  567. sage/rings/polynomial/multi_polynomial_ring_base.cpython-313-darwin.so +0 -0
  568. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  570. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  571. sage/rings/polynomial/polydict.cpython-313-darwin.so +0 -0
  572. sage/rings/polynomial/polydict.pxd +45 -0
  573. sage/rings/polynomial/polydict.pyx +2701 -0
  574. sage/rings/polynomial/polynomial_compiled.cpython-313-darwin.so +0 -0
  575. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  576. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  577. sage/rings/polynomial/polynomial_element.cpython-313-darwin.so +0 -0
  578. sage/rings/polynomial/polynomial_element.pxd +64 -0
  579. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  580. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  581. sage/rings/polynomial/polynomial_fateman.py +97 -0
  582. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  583. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  584. sage/rings/polynomial/polynomial_ring.py +3784 -0
  585. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  586. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-313-darwin.so +0 -0
  587. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  589. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  590. sage/rings/polynomial/symmetric_ideal.py +989 -0
  591. sage/rings/polynomial/symmetric_reduction.cpython-313-darwin.so +0 -0
  592. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  593. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  594. sage/rings/polynomial/term_order.py +2279 -0
  595. sage/rings/polynomial/toy_buchberger.py +449 -0
  596. sage/rings/polynomial/toy_d_basis.py +387 -0
  597. sage/rings/polynomial/toy_variety.py +362 -0
  598. sage/rings/power_series_mpoly.cpython-313-darwin.so +0 -0
  599. sage/rings/power_series_mpoly.pxd +9 -0
  600. sage/rings/power_series_mpoly.pyx +161 -0
  601. sage/rings/power_series_poly.cpython-313-darwin.so +0 -0
  602. sage/rings/power_series_poly.pxd +10 -0
  603. sage/rings/power_series_poly.pyx +1317 -0
  604. sage/rings/power_series_ring.py +1441 -0
  605. sage/rings/power_series_ring_element.cpython-313-darwin.so +0 -0
  606. sage/rings/power_series_ring_element.pxd +12 -0
  607. sage/rings/power_series_ring_element.pyx +3028 -0
  608. sage/rings/puiseux_series_ring.py +487 -0
  609. sage/rings/puiseux_series_ring_element.cpython-313-darwin.so +0 -0
  610. sage/rings/puiseux_series_ring_element.pxd +7 -0
  611. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  612. sage/rings/qqbar_decorators.py +167 -0
  613. sage/rings/quotient_ring.py +1598 -0
  614. sage/rings/quotient_ring_element.py +979 -0
  615. sage/rings/rational.cpython-313-darwin.so +0 -0
  616. sage/rings/rational.pxd +20 -0
  617. sage/rings/rational.pyx +4284 -0
  618. sage/rings/rational_field.py +1730 -0
  619. sage/rings/real_double.cpython-313-darwin.so +0 -0
  620. sage/rings/real_double.pxd +16 -0
  621. sage/rings/real_double.pyx +2215 -0
  622. sage/rings/real_lazy.cpython-313-darwin.so +0 -0
  623. sage/rings/real_lazy.pxd +30 -0
  624. sage/rings/real_lazy.pyx +1773 -0
  625. sage/rings/ring.cpython-313-darwin.so +0 -0
  626. sage/rings/ring.pxd +30 -0
  627. sage/rings/ring.pyx +850 -0
  628. sage/rings/semirings/all.py +3 -0
  629. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  630. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  631. sage/rings/semirings/tropical_polynomial.py +997 -0
  632. sage/rings/semirings/tropical_semiring.cpython-313-darwin.so +0 -0
  633. sage/rings/semirings/tropical_semiring.pyx +676 -0
  634. sage/rings/semirings/tropical_variety.py +1701 -0
  635. sage/rings/sum_of_squares.cpython-313-darwin.so +0 -0
  636. sage/rings/sum_of_squares.pxd +3 -0
  637. sage/rings/sum_of_squares.pyx +336 -0
  638. sage/rings/tests.py +504 -0
  639. sage/schemes/affine/affine_homset.py +508 -0
  640. sage/schemes/affine/affine_morphism.py +1574 -0
  641. sage/schemes/affine/affine_point.py +460 -0
  642. sage/schemes/affine/affine_rational_point.py +308 -0
  643. sage/schemes/affine/affine_space.py +1264 -0
  644. sage/schemes/affine/affine_subscheme.py +592 -0
  645. sage/schemes/affine/all.py +25 -0
  646. sage/schemes/all__sagemath_categories.py +5 -0
  647. sage/schemes/generic/algebraic_scheme.py +2092 -0
  648. sage/schemes/generic/all.py +5 -0
  649. sage/schemes/generic/ambient_space.py +400 -0
  650. sage/schemes/generic/divisor.py +465 -0
  651. sage/schemes/generic/divisor_group.py +313 -0
  652. sage/schemes/generic/glue.py +84 -0
  653. sage/schemes/generic/homset.py +820 -0
  654. sage/schemes/generic/hypersurface.py +234 -0
  655. sage/schemes/generic/morphism.py +2107 -0
  656. sage/schemes/generic/point.py +237 -0
  657. sage/schemes/generic/scheme.py +1190 -0
  658. sage/schemes/generic/spec.py +199 -0
  659. sage/schemes/product_projective/all.py +6 -0
  660. sage/schemes/product_projective/homset.py +236 -0
  661. sage/schemes/product_projective/morphism.py +517 -0
  662. sage/schemes/product_projective/point.py +568 -0
  663. sage/schemes/product_projective/rational_point.py +550 -0
  664. sage/schemes/product_projective/space.py +1301 -0
  665. sage/schemes/product_projective/subscheme.py +466 -0
  666. sage/schemes/projective/all.py +24 -0
  667. sage/schemes/projective/proj_bdd_height.py +453 -0
  668. sage/schemes/projective/projective_homset.py +718 -0
  669. sage/schemes/projective/projective_morphism.py +2792 -0
  670. sage/schemes/projective/projective_point.py +1484 -0
  671. sage/schemes/projective/projective_rational_point.py +569 -0
  672. sage/schemes/projective/projective_space.py +2571 -0
  673. sage/schemes/projective/projective_subscheme.py +1574 -0
  674. sage/sets/all.py +17 -0
  675. sage/sets/cartesian_product.py +376 -0
  676. sage/sets/condition_set.py +525 -0
  677. sage/sets/disjoint_set.cpython-313-darwin.so +0 -0
  678. sage/sets/disjoint_set.pxd +36 -0
  679. sage/sets/disjoint_set.pyx +998 -0
  680. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  681. sage/sets/family.cpython-313-darwin.so +0 -0
  682. sage/sets/family.pxd +12 -0
  683. sage/sets/family.pyx +1556 -0
  684. sage/sets/finite_enumerated_set.py +406 -0
  685. sage/sets/finite_set_map_cy.cpython-313-darwin.so +0 -0
  686. sage/sets/finite_set_map_cy.pxd +34 -0
  687. sage/sets/finite_set_map_cy.pyx +708 -0
  688. sage/sets/finite_set_maps.py +591 -0
  689. sage/sets/image_set.py +448 -0
  690. sage/sets/integer_range.py +829 -0
  691. sage/sets/non_negative_integers.py +241 -0
  692. sage/sets/positive_integers.py +93 -0
  693. sage/sets/primes.py +188 -0
  694. sage/sets/real_set.py +2760 -0
  695. sage/sets/recursively_enumerated_set.cpython-313-darwin.so +0 -0
  696. sage/sets/recursively_enumerated_set.pxd +31 -0
  697. sage/sets/recursively_enumerated_set.pyx +2082 -0
  698. sage/sets/set.py +2083 -0
  699. sage/sets/set_from_iterator.py +1020 -0
  700. sage/sets/totally_ordered_finite_set.py +329 -0
  701. sage/symbolic/all__sagemath_categories.py +1 -0
  702. sage/symbolic/function.cpython-313-darwin.so +0 -0
  703. sage/symbolic/function.pxd +29 -0
  704. sage/symbolic/function.pyx +1488 -0
  705. sage/symbolic/symbols.py +56 -0
  706. sage/tests/all__sagemath_categories.py +1 -0
  707. sage/tests/cython.cpython-313-darwin.so +0 -0
  708. sage/tests/cython.pyx +37 -0
  709. sage/tests/stl_vector.cpython-313-darwin.so +0 -0
  710. sage/tests/stl_vector.pyx +171 -0
  711. sage/typeset/all.py +6 -0
  712. sage/typeset/ascii_art.py +295 -0
  713. sage/typeset/character_art.py +789 -0
  714. sage/typeset/character_art_factory.py +572 -0
  715. sage/typeset/symbols.py +334 -0
  716. sage/typeset/unicode_art.py +183 -0
  717. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,1020 @@
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: loads(dumps(d.f()))
753
+ Traceback (most recent call last):
754
+ ...
755
+ _pickle.PicklingError: Can't pickle <function DummyExampleForPicklingTest.f at ...>:
756
+ it's not the same object as sage.sets.set_from_iterator.DummyExampleForPicklingTest.f
757
+ """
758
+ self.inst = inst
759
+ self.f = f
760
+ self.af = ArgumentFixer(self.f)
761
+ if hasattr(f, "__name__"):
762
+ self.__name__ = f.__name__
763
+ else:
764
+ self.__name__ = f.__name__
765
+ self.__module__ = f.__module__
766
+
767
+ self.name = name
768
+ self.options = options
769
+
770
+ def __call__(self, *args, **kwds):
771
+ r"""
772
+ Return an instance of :class:`EnumeratedSetFromIterator` with
773
+ proper argument.
774
+
775
+ TESTS::
776
+
777
+ sage: from sage.sets.set_from_iterator import set_from_method
778
+ sage: class A:
779
+ ....: @set_from_method(name = lambda self,n: str(self)*n)
780
+ ....: def f(self, n):
781
+ ....: return xsrange(n)
782
+ ....: def __repr__(self):
783
+ ....: return "A"
784
+ sage: a = A()
785
+ sage: a.f(3) # indirect doctest
786
+ AAA
787
+ sage: A.f(a,3) # indirect doctest
788
+ AAA
789
+ sage: [x for x in a.f(6)] # indirect doctest
790
+ [0, 1, 2, 3, 4, 5]
791
+ """
792
+ if self.inst is not None:
793
+ args = (self.inst,) + args
794
+ if self.name:
795
+ if isinstance(self.name, str):
796
+ aa, kk = self.af.fix_to_named(*args, **kwds)
797
+ name = self.name % dict(kk)
798
+ else:
799
+ name = self.name(*args, **kwds)
800
+ return EnumeratedSetFromIterator(self.f, args, kwds, name, **self.options)
801
+ return EnumeratedSetFromIterator(self.f, args, kwds, **self.options)
802
+
803
+ def __get__(self, inst, cls):
804
+ r"""
805
+ Get a :class:`EnumeratedSetFromIterator_method_caller` bound to a
806
+ specific instance of the class of the cached method.
807
+
808
+ .. NOTE::
809
+
810
+ :class:`EnumeratedSetFromIterator_method_caller` has a separate
811
+ ``__get__`` because of the special behavior of category framework
812
+ for element classes which are not of extension type (see
813
+ :meth:`sage.structure.element.Element.__get__`).
814
+
815
+ TESTS::
816
+
817
+ sage: from sage.sets.set_from_iterator import set_from_method
818
+ sage: class A:
819
+ ....: stop = 10000
820
+ ....: @set_from_method
821
+ ....: def f(self, start):
822
+ ....: return xsrange(start, self.stop)
823
+ sage: a = A()
824
+ sage: A.f(a,4)
825
+ {4, 5, 6, 7, 8, ...}
826
+
827
+ sage: class B:
828
+ ....: stop = 10000
829
+ ....: @set_from_method(category=FiniteEnumeratedSets())
830
+ ....: def f(self, start):
831
+ ....: return xsrange(start, self.stop)
832
+ sage: b = B()
833
+ sage: B.f(b,2)
834
+ {2, 3, 4, 5, 6, ...}
835
+ """
836
+ return EnumeratedSetFromIterator_method_caller(
837
+ inst, self.f,
838
+ self.name,
839
+ **self.options)
840
+
841
+
842
+ class EnumeratedSetFromIterator_method_decorator:
843
+ r"""
844
+ Decorator for enumerated set built from a method.
845
+
846
+ INPUT:
847
+
848
+ - ``f`` -- (optional) function from which are built the enumerated sets at
849
+ each call
850
+
851
+ - ``name`` -- (optional) string (which may contains substitution rules from
852
+ argument) or a function ``(args,kwds) -> string``
853
+
854
+ - any option accepted by :class:`EnumeratedSetFromIterator`.
855
+
856
+ EXAMPLES::
857
+
858
+ sage: from sage.sets.set_from_iterator import set_from_method
859
+ sage: class A():
860
+ ....: def n(self): return 12
861
+ ....: @set_from_method
862
+ ....: def f(self): return xsrange(self.n())
863
+ sage: a = A()
864
+ sage: print(a.f.__class__)
865
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
866
+ sage: a.f()
867
+ {0, 1, 2, 3, 4, ...}
868
+ sage: A.f(a)
869
+ {0, 1, 2, 3, 4, ...}
870
+
871
+ A more complicated example with a parametrized name::
872
+
873
+ sage: class B():
874
+ ....: @set_from_method(name="Graphs(%(n)d)",
875
+ ....: category=FiniteEnumeratedSets())
876
+ ....: def graphs(self, n): return graphs(n)
877
+ sage: b = B()
878
+ sage: G3 = b.graphs(3); G3
879
+ Graphs(3)
880
+ sage: G3.cardinality() # needs nauty sage.graphs
881
+ 4
882
+ sage: G3.category()
883
+ Category of facade finite enumerated sets
884
+ sage: B.graphs(b, 3)
885
+ Graphs(3)
886
+
887
+ And a last example with a name parametrized by a function::
888
+
889
+ sage: class D():
890
+ ....: def __init__(self, name): self.name = str(name)
891
+ ....: def __str__(self): return self.name
892
+ ....: @set_from_method(name=lambda self, n: str(self) * n,
893
+ ....: category=FiniteEnumeratedSets())
894
+ ....: def subset(self, n):
895
+ ....: return xsrange(n)
896
+ sage: d = D('a')
897
+ sage: E = d.subset(3); E
898
+ aaa
899
+ sage: E.list()
900
+ [0, 1, 2]
901
+ sage: F = d.subset(n=10); F
902
+ aaaaaaaaaa
903
+ sage: F.list()
904
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
905
+
906
+ .. TODO::
907
+
908
+ It is not yet possible to use ``set_from_method`` in conjunction with
909
+ ``cached_method``.
910
+ """
911
+ def __init__(self, f=None, **options):
912
+ r"""
913
+ Initialize ``self``.
914
+
915
+ TESTS:
916
+
917
+ We test if pickling works correctly on the Permutation class (in
918
+ :mod:`sage.combinat.permutation`) because its method ``bruhat_succ``
919
+ and ``bruhat_pred`` are decorated with ``set_from_method``::
920
+
921
+ sage: from sage.combinat.permutation import Permutation
922
+ sage: loads(dumps(Permutation))
923
+ <class 'sage.combinat.permutation.Permutation'>
924
+ sage: p = Permutation([3,2,1])
925
+ sage: loads(dumps(p)) == p
926
+ True
927
+ """
928
+ if f is not None:
929
+ self.f = f
930
+ if hasattr(f, "__name__"):
931
+ self.__name__ = f.__name__
932
+ self.__module__ = f.__module__
933
+ else:
934
+ if hasattr(f, '__module__'):
935
+ self.__module__ = f.__module__
936
+ elif hasattr(f, '__func__'):
937
+ self.__module__ = f.__func__.__module__
938
+
939
+ if hasattr(f, '__name__'):
940
+ self.__name__ = f.__name__
941
+ elif hasattr(f, '__func__'):
942
+ self.__name__ = f.__func__.__name__
943
+
944
+ self.options = options
945
+
946
+ def __call__(self, f):
947
+ r"""
948
+ Trick if :class:`EnumeratedSetFromIterator_method` was created with
949
+ some options and is called with a function as argument.
950
+
951
+ TESTS::
952
+
953
+ sage: from sage.sets.set_from_iterator import set_from_method
954
+ sage: class A: # indirect doctest
955
+ ....: @set_from_method()
956
+ ....: def f(self):
957
+ ....: return xsrange(3)
958
+ sage: a = A()
959
+ sage: a.f()
960
+ {0, 1, 2}
961
+ """
962
+ return EnumeratedSetFromIterator_method_decorator(f, **self.options)
963
+
964
+ def __get__(self, inst, cls):
965
+ r"""
966
+ TESTS::
967
+
968
+ sage: from sage.sets.set_from_iterator import set_from_method
969
+ sage: class A():
970
+ ....: def n(self): return 12
971
+ ....: @set_from_method
972
+ ....: def f(self): return xsrange(self.n())
973
+ sage: a = A()
974
+ sage: print(A.f.__class__)
975
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
976
+ sage: print(a.f.__class__)
977
+ <class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
978
+ """
979
+ # You would hardly ever see an instance of this class alive.
980
+ return EnumeratedSetFromIterator_method_caller(inst, self.f, **self.options)
981
+
982
+
983
+ set_from_method = EnumeratedSetFromIterator_method_decorator
984
+
985
+
986
+ class DummyExampleForPicklingTest:
987
+ r"""
988
+ Class example to test pickling with the decorator :class:`set_from_method`.
989
+
990
+ .. WARNING::
991
+
992
+ This class is intended to be used in doctest only.
993
+
994
+ EXAMPLES::
995
+
996
+ sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
997
+ sage: DummyExampleForPicklingTest().f()
998
+ {10, 11, 12, 13, 14, ...}
999
+ """
1000
+ start = 10
1001
+ stop = 100
1002
+
1003
+ @set_from_method
1004
+ def f(self):
1005
+ r"""
1006
+ Return the set between ``self.start`` and ``self.stop``.
1007
+
1008
+ EXAMPLES::
1009
+
1010
+ sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
1011
+ sage: d = DummyExampleForPicklingTest()
1012
+ sage: d.f()
1013
+ {10, 11, 12, 13, 14, ...}
1014
+ sage: d.start = 4
1015
+ sage: d.stop = 200
1016
+ sage: d.f()
1017
+ {4, 5, 6, 7, 8, ...}
1018
+ """
1019
+ from sage.arith.srange import xsrange
1020
+ return xsrange(self.start, self.stop)