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,264 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Random testing
4
+
5
+ Some Sage modules do random testing in their doctests; that is, they
6
+ construct test cases using a random number generator. To get the
7
+ broadest possible test coverage, we want everybody who runs the
8
+ doctests to use a different random seed; but we also want to be able
9
+ to reproduce the problems when debugging. This module provides a
10
+ decorator to help write random testers that meet these goals.
11
+ """
12
+
13
+ from functools import wraps
14
+
15
+
16
+ def random_testing(fn):
17
+ r"""
18
+ This decorator helps create random testers. These can be run as
19
+ part of the standard Sage test suite; everybody who runs the test
20
+ will use a different random number seed, so many different random
21
+ tests will eventually be run.
22
+
23
+ INPUT:
24
+
25
+ - ``fn`` -- the function that we are wrapping for random testing
26
+
27
+ The resulting function will take two additional arguments, *seed*
28
+ (default: ``None``) and *print_seed* (default: ``False``). The
29
+ result will set the random number seed to the given seed value (or
30
+ to a truly random value, if *seed* is not specified), then call
31
+ the original function. If *print_seed* is true, then the seed will
32
+ be printed before calling the original function. If the original
33
+ function raises an exception, then the random seed that was used
34
+ will be displayed, along with a message entreating the user to
35
+ submit a bug report. All other arguments will be passed through
36
+ to the original function.
37
+
38
+ Here is a set of recommendations for using this wrapper.
39
+
40
+ The function to be tested should take arguments specifying the
41
+ difficulty of the test (size of the test cases, number of
42
+ iterations, etc.), as well as an argument *verbose* (defaulting to
43
+ false). With *verbose* true, it should print the values being
44
+ tested. Suppose ``test_foo()`` takes an argument for number of
45
+ iterations. Then the doctests could be::
46
+
47
+ test_foo(2, verbose=True, seed=0)
48
+ test_foo(10)
49
+ test_foo(100) # long time
50
+
51
+ The first doctest, with the specified seed and ``verbose=True``, simply
52
+ verifies that the tests really are reproducible (that ``test_foo``
53
+ is correctly using the :mod:`randstate` framework). The next two tests
54
+ use truly random seeds, and will print out the seed used if the test
55
+ fails (raises an exception).
56
+
57
+ If you want a very long-running test using this setup, you should do
58
+ something like::
59
+
60
+ for _ in range(10^10): test_foo(100)
61
+
62
+ instead of::
63
+
64
+ test_foo(10^12)
65
+
66
+ If the test fails after several hours, the latter snippet would
67
+ make you rerun the test for several hours while reproducing and
68
+ debugging the problem. With the former snippet, you only need to
69
+ rerun ``test_foo(100)`` with a known-failing random seed.
70
+
71
+ See :func:`sage.misc.random_testing.test_add_commutes` for a
72
+ simple example using this decorator, and :mod:`sage.rings.tests`
73
+ for realistic uses.
74
+
75
+ Setting *print_seed* to true is useless in doctests, because the
76
+ random seed printed will never match the expected doctest result
77
+ (and using ``# random`` means the doctest framework will never
78
+ report an error even if one happens). However, it is useful if
79
+ you have a random test that sometimes segfaults. The normal
80
+ print-the-random-seed-on-exceptions won't work then, so you can
81
+ run::
82
+
83
+ while True: test_foo(print_seed=True)
84
+
85
+ and look at the last seed that was printed before it crashed.
86
+
87
+
88
+ TESTS::
89
+
90
+ sage: from sage.misc.random_testing import random_testing
91
+ sage: def foo(verbose=False):
92
+ ....: 'oh look, a docstring'
93
+ ....: n = ZZ.random_element(2^50)
94
+ ....: if verbose:
95
+ ....: print("Random value: %s" % n)
96
+ ....: assert(n == 49681376900427)
97
+ sage: foo = random_testing(foo)
98
+ sage: foo(seed=0, verbose=True)
99
+ Random value: 49681376900427
100
+ sage: foo(seed=15, verbose=True)
101
+ Random value: 1049538412064764
102
+ Random testing has revealed a problem in foo
103
+ Please report this bug! You may be the first
104
+ person in the world to have seen this problem.
105
+ Please include this random seed in your bug report:
106
+ Random seed: 15
107
+ AssertionError()
108
+ sage: foo() # random
109
+ Random testing has revealed a problem in foo
110
+ Please report this bug! You may be the first
111
+ person in the world to have seen this problem.
112
+ Please include this random seed in your bug report:
113
+ Random seed: 272500700755151445506092479579811710040
114
+ AssertionError()
115
+ sage: foo.__doc__
116
+ 'oh look, a docstring'
117
+ sage: foo.__name__
118
+ 'foo'
119
+ sage: def bar(): pass
120
+ sage: bar = random_testing(bar)
121
+ sage: bar(print_seed=True) # random
122
+ Random seed: 262841091890156346923539765543814146051
123
+ """
124
+ from sage.misc.randstate import seed, initial_seed
125
+ from sys import stdout
126
+
127
+ @wraps(fn)
128
+ def wrapped_fun(*args, **kwargs):
129
+ arg_seed = None
130
+ if 'seed' in kwargs:
131
+ arg_seed = kwargs['seed']
132
+ del kwargs['seed']
133
+ with seed(arg_seed):
134
+ used_seed = initial_seed()
135
+ if 'print_seed' in kwargs:
136
+ if kwargs['print_seed']:
137
+ print("Random seed: {}".format(used_seed))
138
+ del kwargs['print_seed']
139
+ # I don't know if this line is necessary, but it can't
140
+ # hurt; and it would be a real pity to lose the
141
+ # information you need to reproduce a segfault because
142
+ # it was missing...
143
+ stdout.flush()
144
+ try:
145
+ fn(*args, **kwargs)
146
+ except Exception as e:
147
+ # We treat any sort of Exception as a doctest
148
+ # failure. (We have to eat the exception, because if
149
+ # doctesting sees an exception, it doesn't display
150
+ # whatever was printed before the exception happened
151
+ # -- so the text we print here would be lost.) Note
152
+ # that KeyboardInterrupt is not an Exception, so
153
+ # pressing Control-C doesn't print this message.
154
+ print("Random testing has revealed a problem in " + fn.__name__)
155
+ print("Please report this bug! You may be the first")
156
+ print("person in the world to have seen this problem.")
157
+ print("Please include this random seed in your bug report:")
158
+ print("Random seed: {}".format(used_seed))
159
+ print(repr(e))
160
+ return wrapped_fun
161
+
162
+
163
+ @random_testing
164
+ def test_add_commutes(trials, verbose=False):
165
+ r"""
166
+ This is a simple demonstration of the :func:`random_testing` decorator and
167
+ its recommended usage.
168
+
169
+ We test that addition is commutative over rationals.
170
+
171
+ EXAMPLES::
172
+
173
+ sage: from sage.misc.random_testing import test_add_commutes
174
+ sage: test_add_commutes(2, verbose=True, seed=0)
175
+ a == -4, b == 0 ...
176
+ Passes!
177
+ a == -1/2, b == -1/95 ...
178
+ Passes!
179
+ sage: test_add_commutes(10)
180
+ sage: test_add_commutes(1000) # long time
181
+ """
182
+ from sage.rings.rational_field import QQ
183
+ for _ in range(trials):
184
+ a = QQ.random_element()
185
+ b = QQ.random_element()
186
+ if verbose:
187
+ print("a == {}, b == {} ...".format(a, b))
188
+ assert a + b == b + a
189
+ if verbose:
190
+ print("Passes!")
191
+
192
+
193
+ @random_testing
194
+ def test_add_is_mul(trials, verbose=False):
195
+ r"""
196
+ This example demonstrates a failing :func:`random_testing` test,
197
+ and shows how to reproduce the error.
198
+
199
+ DO NOT USE THIS AS AN EXAMPLE OF HOW TO USE
200
+ :func:`random_testing`! Instead, look at
201
+ :func:`sage.misc.random_testing.test_add_commutes`.
202
+
203
+ We test that ``a+b == a*b``, for *a*, *b* rational. This is of
204
+ course false, so the test will almost always fail.
205
+
206
+ EXAMPLES::
207
+
208
+ sage: from sage.misc.random_testing import test_add_is_mul
209
+
210
+ We start by testing that we get reproducible results when setting
211
+ *seed* to 0.
212
+
213
+ ::
214
+
215
+ sage: test_add_is_mul(2, verbose=True, seed=0)
216
+ a == -4, b == 0 ...
217
+ Random testing has revealed a problem in test_add_is_mul
218
+ Please report this bug! You may be the first
219
+ person in the world to have seen this problem.
220
+ Please include this random seed in your bug report:
221
+ Random seed: 0
222
+ AssertionError()
223
+
224
+ Normally in a ``@random_testing`` doctest, we would leave off the
225
+ ``verbose=True`` and the ``# random``. We put it in here so that we can
226
+ verify that we are seeing the exact same error when we reproduce
227
+ the error below.
228
+
229
+ ::
230
+
231
+ sage: test_add_is_mul(10, verbose=True) # random
232
+ a == -2/7, b == 1 ...
233
+ Random testing has revealed a problem in test_add_is_mul
234
+ Please report this bug! You may be the first
235
+ person in the world to have seen this problem.
236
+ Please include this random seed in your bug report:
237
+ Random seed: 216390410596009428782506007128692114173
238
+ AssertionError()
239
+
240
+ OK, now assume that some user has reported a
241
+ :func:`test_add_is_mul` failure. We can specify the same
242
+ *random_seed* that was found in the bug report, and we will get the
243
+ exact same failure so that we can debug the "problem".
244
+
245
+ ::
246
+
247
+ sage: test_add_is_mul(10, verbose=True, seed=216390410596009428782506007128692114173)
248
+ a == -2/7, b == 1 ...
249
+ Random testing has revealed a problem in test_add_is_mul
250
+ Please report this bug! You may be the first
251
+ person in the world to have seen this problem.
252
+ Please include this random seed in your bug report:
253
+ Random seed: 216390410596009428782506007128692114173
254
+ AssertionError()
255
+ """
256
+ from sage.rings.rational_field import QQ
257
+ for _ in range(trials):
258
+ a = QQ.random_element()
259
+ b = QQ.random_element()
260
+ if verbose:
261
+ print("a == {}, b == {} ...".format(a, b))
262
+ assert a + b == a * b
263
+ if verbose:
264
+ print("Passes!")
@@ -0,0 +1,377 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ ReST index of functions
4
+
5
+ This module contains a function that generates a ReST index table of functions
6
+ for use in doc-strings.
7
+
8
+ {INDEX_OF_FUNCTIONS}
9
+ """
10
+
11
+ import inspect
12
+
13
+ from sage.misc.sageinspect import _extract_embedded_position
14
+ from sage.misc.sageinspect import is_function_or_cython_function as _isfunction
15
+
16
+
17
+ def gen_rest_table_index(obj, names=None, sort=True, only_local_functions=True, root=None):
18
+ r"""
19
+ Return a ReST table describing a list of functions.
20
+
21
+ The list of functions can either be given explicitly, or implicitly as the
22
+ functions/methods of a module or class.
23
+
24
+ In the case of a class, only non-inherited methods are listed.
25
+
26
+ INPUT:
27
+
28
+ - ``obj`` -- list of functions, a module or a class. If given a list of
29
+ functions, the generated table will consist of these. If given a module
30
+ or a class, all functions/methods it defines will be listed, except
31
+ deprecated or those starting with an underscore. In the case of a class,
32
+ note that inherited methods are not displayed.
33
+
34
+ - ``names`` -- dictionary associating a name to a function. Takes
35
+ precedence over the automatically computed name for the functions. Only
36
+ used when ``list_of_entries`` is a list.
37
+
38
+ - ``sort`` -- boolean (default: ``True``); whether to sort the list of
39
+ methods lexicographically
40
+
41
+ - ``only_local_functions`` -- boolean (default: ``True``); if
42
+ ``list_of_entries`` is a module, ``only_local_functions = True`` means
43
+ that imported functions will be filtered out. This can be useful to
44
+ disable for making indexes of e.g. catalog modules such as
45
+ :mod:`sage.coding.codes_catalog`.
46
+
47
+ - ``root`` -- module or class (default: ``None``); the module, or class,
48
+ whose elements are to be listed. This is needed to recover the class when
49
+ this method is called from :meth:`gen_thematic_rest_table_index` (see
50
+ :issue:`36178`).
51
+
52
+ .. WARNING::
53
+
54
+ The ReST tables returned by this function use '@' as a delimiter for
55
+ cells. This can cause trouble if the first sentence in the documentation
56
+ of a function contains the '@' character.
57
+
58
+ EXAMPLES::
59
+
60
+ sage: from sage.misc.rest_index_of_methods import gen_rest_table_index
61
+ sage: print(gen_rest_table_index([graphs.PetersenGraph])) # needs sage.graphs
62
+ .. csv-table::
63
+ :class: contentstable
64
+ :widths: 30, 70
65
+ :delim: @
66
+ <BLANKLINE>
67
+ :func:`~sage.graphs.generators.smallgraphs.PetersenGraph` @ Return the Petersen Graph.
68
+
69
+ The table of a module::
70
+
71
+ sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods))
72
+ .. csv-table::
73
+ :class: contentstable
74
+ :widths: 30, 70
75
+ :delim: @
76
+ <BLANKLINE>
77
+ :func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
78
+ :func:`~sage.misc.rest_index_of_methods.gen_rest_table_index` @ Return a ReST table describing a list of functions.
79
+ :func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
80
+ :func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
81
+ <BLANKLINE>
82
+ <BLANKLINE>
83
+
84
+ The table of a class::
85
+
86
+ sage: print(gen_rest_table_index(Graph)) # needs sage.graphs
87
+ .. csv-table::
88
+ :class: contentstable
89
+ :widths: 30, 70
90
+ :delim: @
91
+ ...
92
+ :meth:`~sage.graphs.graph.Graph.sparse6_string` @ Return the sparse6 representation of the graph as an ASCII string.
93
+ ...
94
+
95
+ TESTS:
96
+
97
+ When the first sentence of the docstring spans over several lines::
98
+
99
+ sage: def a():
100
+ ....: r'''
101
+ ....: Here is a very very very long sentence
102
+ ....: that spans on several lines.
103
+ ....:
104
+ ....: EXAMP...
105
+ ....: '''
106
+ ....: print("hey")
107
+ sage: 'Here is a very very very long sentence that spans on several lines' in gen_rest_table_index([a])
108
+ True
109
+
110
+ The inherited methods do not show up::
111
+
112
+ sage: # needs sage.graphs
113
+ sage: gen_rest_table_index(sage.combinat.posets.lattices.FiniteLatticePoset).count('\n') < 75
114
+ True
115
+ sage: from sage.graphs.generic_graph import GenericGraph
116
+ sage: A = gen_rest_table_index(Graph).count('\n')
117
+ sage: B = gen_rest_table_index(GenericGraph).count('\n')
118
+ sage: A < B
119
+ True
120
+
121
+ When ``only_local_functions`` is ``False``, we do not include
122
+ ``gen_rest_table_index`` itself::
123
+
124
+ sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods, only_local_functions=True))
125
+ .. csv-table::
126
+ :class: contentstable
127
+ :widths: 30, 70
128
+ :delim: @
129
+ <BLANKLINE>
130
+ :func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
131
+ :func:`~sage.misc.rest_index_of_methods.gen_rest_table_index` @ Return a ReST table describing a list of functions.
132
+ :func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
133
+ :func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
134
+ <BLANKLINE>
135
+ <BLANKLINE>
136
+ sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods, only_local_functions=False))
137
+ .. csv-table::
138
+ :class: contentstable
139
+ :widths: 30, 70
140
+ :delim: @
141
+ <BLANKLINE>
142
+ :func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
143
+ :func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
144
+ :func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
145
+ <BLANKLINE>
146
+ <BLANKLINE>
147
+
148
+ A function that is imported into a class under a different name is listed
149
+ under its 'new' name::
150
+
151
+ sage: 'cliques_maximum' in gen_rest_table_index(Graph) # needs cliquer sage.graphs
152
+ True
153
+ sage: 'all_max_cliques`' in gen_rest_table_index(Graph) # needs cliquer sage.graphs
154
+ False
155
+
156
+ Check that :issue:`36178` is fixed::
157
+
158
+ sage: print(gen_rest_table_index(Graph)) # needs cliquer sage.graphs
159
+ ...
160
+ :meth:`~sage.graphs.graph.Graph.independent_set` @ Return a maximum independent set.
161
+ ...
162
+ """
163
+ if names is None:
164
+ names = {}
165
+
166
+ # If input is a class/module, we list all its non-private and methods/functions
167
+ if inspect.isclass(obj) or inspect.ismodule(obj):
168
+ list_of_entries, names = list_of_subfunctions(
169
+ obj, only_local_functions=only_local_functions)
170
+ else:
171
+ list_of_entries = obj
172
+
173
+ fname = lambda x: names.get(x, getattr(x, "__name__", ""))
174
+
175
+ assert isinstance(list_of_entries, list)
176
+
177
+ s = [".. csv-table::",
178
+ " :class: contentstable",
179
+ " :widths: 30, 70",
180
+ " :delim: @\n"]
181
+
182
+ if sort:
183
+ list_of_entries.sort(key=fname)
184
+
185
+ obj_or_root_is_class = False
186
+ if inspect.isclass(root):
187
+ obj_or_root_is_class = True
188
+ class_name = root.__name__
189
+ module_name = root.__module__
190
+ elif inspect.isclass(obj):
191
+ obj_or_root_is_class = True
192
+ class_name = obj.__name__
193
+ module_name = obj.__module__
194
+
195
+ for e in list_of_entries:
196
+ if inspect.ismethod(e):
197
+ link = ":meth:`~{module}.{cls}.{func}`".format(
198
+ module=e.im_class.__module__, cls=e.im_class.__name__,
199
+ func=fname(e))
200
+ elif _isfunction(e) and obj_or_root_is_class:
201
+ link = ":meth:`~{module}.{cls}.{func}`".format(
202
+ module=module_name, cls=class_name, func=fname(e))
203
+ elif _isfunction(e):
204
+ link = ":func:`~{module}.{func}`".format(
205
+ module=e.__module__, func=fname(e))
206
+ else:
207
+ continue
208
+
209
+ # Extract lines injected by cython
210
+ doc = e.__doc__
211
+ doc_tmp = _extract_embedded_position(doc)
212
+ if doc_tmp:
213
+ doc = doc_tmp[0]
214
+
215
+ # Descriptions of the method/function
216
+ if doc:
217
+ desc = doc.split('\n\n')[0] # first paragraph
218
+ desc = " ".join(x.strip() for x in desc.splitlines()) # concatenate lines
219
+ desc = desc.strip() # remove leading spaces
220
+ else:
221
+ desc = "NO DOCSTRING"
222
+
223
+ s.append(" {} @ {}".format(link, desc.lstrip()))
224
+
225
+ return '\n'.join(s) + '\n'
226
+
227
+
228
+ def list_of_subfunctions(root, only_local_functions=True):
229
+ r"""
230
+ Return the functions (resp. methods) of a given module (resp. class) with their names.
231
+
232
+ INPUT:
233
+
234
+ - ``root`` -- the module, or class, whose elements are to be listed
235
+
236
+ - ``only_local_functions`` -- boolean (default: ``True``); if ``root`` is a
237
+ module, ``only_local_functions = True`` means that imported functions will
238
+ be filtered out. This can be useful to disable for making indexes of
239
+ e.g. catalog modules such as :mod:`sage.coding.codes_catalog`.
240
+
241
+ OUTPUT:
242
+
243
+ A pair ``(list,dict)`` where ``list`` is a list of function/methods and
244
+ ``dict`` associates to every function/method the name under which it appears
245
+ in ``root``.
246
+
247
+ EXAMPLES::
248
+
249
+ sage: from sage.misc.rest_index_of_methods import list_of_subfunctions
250
+ sage: l = list_of_subfunctions(Graph)[0] # needs sage.graphs
251
+ sage: Graph.bipartite_color in l # needs sage.graphs
252
+ True
253
+
254
+ TESTS:
255
+
256
+ A ``staticmethod`` is not callable. We must handle them correctly, however::
257
+
258
+ sage: class A: # needs sage.graphs
259
+ ....: x = staticmethod(Graph.order)
260
+ sage: list_of_subfunctions(A) # needs sage.graphs
261
+ ([<function GenericGraph.order at 0x...>],
262
+ {<function GenericGraph.order at 0x...>: 'x'})
263
+ """
264
+ if inspect.ismodule(root):
265
+ ismodule = True
266
+ elif inspect.isclass(root):
267
+ ismodule = False
268
+ superclasses = inspect.getmro(root)[1:]
269
+ else:
270
+ raise ValueError("'root' must be a module or a class.")
271
+
272
+ def local_filter(f, name):
273
+ if only_local_functions:
274
+ if ismodule:
275
+ return inspect.getmodule(root) == inspect.getmodule(f)
276
+ else:
277
+ return not any(hasattr(s, name) for s in superclasses)
278
+ else:
279
+ return inspect.isclass(root) or f is not gen_rest_table_index
280
+
281
+ def can_import(f):
282
+ # poke it to provoke a lazy import to resolve
283
+ try:
284
+ hasattr(f, 'xyz')
285
+ except ImportError:
286
+ return False
287
+ return True
288
+
289
+ functions = {getattr(root, name): name for name, f in root.__dict__.items() if
290
+ (not name.startswith('_') and # private functions
291
+ can_import(f) and # unresolved lazy imports
292
+ not hasattr(f, 'issue_number') and # deprecated functions
293
+ not inspect.isclass(f) and # classes
294
+ callable(getattr(f, '__func__', f)) and # e.g. GenericGraph.graphics_array_defaults
295
+ local_filter(f, name)) # possibly filter imported functions
296
+ }
297
+
298
+ return list(functions.keys()), functions
299
+
300
+
301
+ def gen_thematic_rest_table_index(root, additional_categories=None, only_local_functions=True):
302
+ r"""
303
+ Return a ReST string of thematically sorted functions (or methods) of a
304
+ module (or class).
305
+
306
+ INPUT:
307
+
308
+ - ``root`` -- the module, or class, whose elements are to be listed
309
+
310
+ - ``additional_categories`` -- dictionary (default: ``None``); a dictionary
311
+ associating a category (given as a string) to a function's name. Can be
312
+ used when the decorator :func:`doc_index` does not work on a function.
313
+
314
+ - ``only_local_functions`` -- boolean (default: ``True``); if ``root`` is a
315
+ module, ``only_local_functions = True`` means that imported functions will
316
+ be filtered out. This can be useful to disable for making indexes of
317
+ e.g. catalog modules such as :mod:`sage.coding.codes_catalog`.
318
+
319
+ EXAMPLES::
320
+
321
+ sage: from sage.misc.rest_index_of_methods import gen_thematic_rest_table_index, list_of_subfunctions
322
+ sage: l = list_of_subfunctions(Graph)[0] # needs sage.graphs
323
+ sage: Graph.bipartite_color in l # needs sage.graphs
324
+ True
325
+ """
326
+ from collections import defaultdict
327
+ if additional_categories is None:
328
+ additional_categories = {}
329
+
330
+ functions, names = list_of_subfunctions(root,
331
+ only_local_functions=only_local_functions)
332
+ theme_to_function = defaultdict(list)
333
+ for f in functions:
334
+ if hasattr(f, 'doc_index'):
335
+ doc_ind = f.doc_index
336
+ else:
337
+ try:
338
+ doc_ind = additional_categories.get(f.__name__,
339
+ "Unsorted")
340
+ except AttributeError:
341
+ doc_ind = "Unsorted"
342
+ theme_to_function[doc_ind].append(f)
343
+ s = ["**" + theme + "**\n\n" + gen_rest_table_index(list_of_functions, names=names, root=root)
344
+ for theme, list_of_functions in sorted(theme_to_function.items())]
345
+ return "\n\n".join(s)
346
+
347
+
348
+ def doc_index(name):
349
+ r"""
350
+ Attribute an index name to a function.
351
+
352
+ This decorator can be applied to a function/method in order to specify in
353
+ which index it must appear, in the index generated by
354
+ :func:`gen_thematic_rest_table_index`.
355
+
356
+ INPUT:
357
+
358
+ - ``name`` -- string, which will become the title of the index in which
359
+ this function/method will appear
360
+
361
+ EXAMPLES::
362
+
363
+ sage: from sage.misc.rest_index_of_methods import doc_index
364
+ sage: @doc_index("Wouhouuuuu")
365
+ ....: def a():
366
+ ....: print("Hey")
367
+ sage: a.doc_index
368
+ 'Wouhouuuuu'
369
+ """
370
+ def hey(f):
371
+ setattr(f, "doc_index", name)
372
+ return f
373
+ return hey
374
+
375
+
376
+ __doc__ = __doc__.format(INDEX_OF_FUNCTIONS=gen_rest_table_index([gen_rest_table_index,
377
+ gen_thematic_rest_table_index]))
sage/misc/search.pxd ADDED
@@ -0,0 +1,2 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ cpdef search(object v, object x)