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
sage/misc/table.py ADDED
@@ -0,0 +1,853 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Tables
4
+
5
+ Display a rectangular array as a table, either in plain text, LaTeX,
6
+ or html. See the documentation for :class:`table` for details and
7
+ examples.
8
+
9
+ AUTHORS:
10
+
11
+ - John H. Palmieri (2012-11)
12
+ """
13
+
14
+ from io import StringIO
15
+
16
+ from sage.structure.sage_object import SageObject
17
+ from sage.misc.cachefunc import cached_method
18
+
19
+
20
+ class table(SageObject):
21
+ r"""
22
+ Display a rectangular array as a table, either in plain text, LaTeX,
23
+ or html.
24
+
25
+ INPUT:
26
+
27
+ - ``rows`` -- (default: ``None``) list of lists (or list of tuples,
28
+ etc.), containing the data to be displayed
29
+ - ``columns`` -- (default: ``None``) list of lists (etc.), containing
30
+ the data to be displayed, but stored as columns. Set either ``rows``
31
+ or ``columns``, but not both.
32
+ - ``header_row`` -- (default: ``False``) if ``True``, first row is
33
+ highlighted
34
+ - ``header_column`` -- (default: ``False``) if ``True``, first column is
35
+ highlighted
36
+ - ``frame`` -- (default: ``False``) if ``True``, put a box around each
37
+ cell
38
+ - ``align`` -- (default: ``'left'``) the alignment of each entry: either
39
+ ``'left'``, ``'center'``, or ``'right'``
40
+
41
+ EXAMPLES::
42
+
43
+ sage: rows = [['a', 'b', 'c'], [100,2,3], [4,5,60]]
44
+ sage: table(rows)
45
+ a b c
46
+ 100 2 3
47
+ 4 5 60
48
+ sage: latex(table(rows))
49
+ \begin{tabular}{lll}
50
+ a & b & c \\
51
+ $100$ & $2$ & $3$ \\
52
+ $4$ & $5$ & $60$ \\
53
+ \end{tabular}
54
+
55
+ If ``header_row`` is ``True``, then the first row is highlighted. If
56
+ ``header_column`` is ``True``, then the first column is
57
+ highlighted. If ``frame`` is ``True``, then print a box around every
58
+ "cell". ::
59
+
60
+ sage: table(rows, header_row=True)
61
+ a b c
62
+ ├─────┼───┼────┤
63
+ 100 2 3
64
+ 4 5 60
65
+ sage: latex(table(rows, header_row=True))
66
+ \begin{tabular}{lll}
67
+ a & b & c \\ \hline
68
+ $100$ & $2$ & $3$ \\
69
+ $4$ & $5$ & $60$ \\
70
+ \end{tabular}
71
+ sage: table(rows=rows, frame=True)
72
+ ┌─────┬───┬────┐
73
+ │ a │ b │ c │
74
+ ├─────┼───┼────┤
75
+ │ 100 │ 2 │ 3 │
76
+ ├─────┼───┼────┤
77
+ │ 4 │ 5 │ 60 │
78
+ └─────┴───┴────┘
79
+ sage: latex(table(rows=rows, frame=True))
80
+ \begin{tabular}{|l|l|l|} \hline
81
+ a & b & c \\ \hline
82
+ $100$ & $2$ & $3$ \\ \hline
83
+ $4$ & $5$ & $60$ \\ \hline
84
+ \end{tabular}
85
+ sage: table(rows, header_column=True, frame=True)
86
+ ┌─────╥───┬────┐
87
+ │ a ║ b │ c │
88
+ ├─────╫───┼────┤
89
+ │ 100 ║ 2 │ 3 │
90
+ ├─────╫───┼────┤
91
+ │ 4 ║ 5 │ 60 │
92
+ └─────╨───┴────┘
93
+ sage: latex(table(rows, header_row=True, frame=True))
94
+ \begin{tabular}{|l|l|l|} \hline
95
+ a & b & c \\ \hline \hline
96
+ $100$ & $2$ & $3$ \\ \hline
97
+ $4$ & $5$ & $60$ \\ \hline
98
+ \end{tabular}
99
+ sage: table(rows, header_column=True)
100
+ a │ b c
101
+ 100 │ 2 3
102
+ 4 │ 5 60
103
+
104
+ The argument ``header_row`` can, instead of being ``True`` or
105
+ ``False``, be the contents of the header row, so that ``rows``
106
+ consists of the data, while ``header_row`` is the header
107
+ information. The same goes for ``header_column``. Passing lists
108
+ for both arguments simultaneously is not supported. ::
109
+
110
+ sage: table([(x,n(sin(x), digits=2)) for x in [0..3]], # needs sage.symbolic
111
+ ....: header_row=["$x$", r"$\sin(x)$"], frame=True)
112
+ ┌─────┬───────────┐
113
+ │ $x$ │ $\sin(x)$ │
114
+ ╞═════╪═══════════╡
115
+ │ 0 │ 0.00 │
116
+ ├─────┼───────────┤
117
+ │ 1 │ 0.84 │
118
+ ├─────┼───────────┤
119
+ │ 2 │ 0.91 │
120
+ ├─────┼───────────┤
121
+ │ 3 │ 0.14 │
122
+ └─────┴───────────┘
123
+
124
+ You can create the transpose of this table in several ways, for
125
+ example, "by hand," that is, changing the data defining the table::
126
+
127
+ sage: table(rows=[[x for x in [0..3]], # needs sage.symbolic
128
+ ....: [n(sin(x), digits=2) for x in [0..3]]],
129
+ ....: header_column=['$x$', r'$\sin(x)$'], frame=True)
130
+ ┌───────────╥──────┬──────┬──────┬──────┐
131
+ │ $x$ ║ 0 │ 1 │ 2 │ 3 │
132
+ ├───────────╫──────┼──────┼──────┼──────┤
133
+ │ $\sin(x)$ ║ 0.00 │ 0.84 │ 0.91 │ 0.14 │
134
+ └───────────╨──────┴──────┴──────┴──────┘
135
+
136
+ or by passing the original data as the ``columns`` of the table
137
+ and using ``header_column`` instead of ``header_row``::
138
+
139
+ sage: table(columns=[(x, n(sin(x), digits=2)) for x in [0..3]], # needs sage.symbolic
140
+ ....: header_column=['$x$', r'$\sin(x)$'], frame=True)
141
+ ┌───────────╥──────┬──────┬──────┬──────┐
142
+ │ $x$ ║ 0 │ 1 │ 2 │ 3 │
143
+ ├───────────╫──────┼──────┼──────┼──────┤
144
+ │ $\sin(x)$ ║ 0.00 │ 0.84 │ 0.91 │ 0.14 │
145
+ └───────────╨──────┴──────┴──────┴──────┘
146
+
147
+ or by taking the :meth:`transpose` of the original table::
148
+
149
+ sage: table(rows=[(x, n(sin(x), digits=2)) for x in [0..3]], # needs sage.symbolic
150
+ ....: header_row=['$x$', r'$\sin(x)$'], frame=True).transpose()
151
+ ┌───────────╥──────┬──────┬──────┬──────┐
152
+ │ $x$ ║ 0 │ 1 │ 2 │ 3 │
153
+ ├───────────╫──────┼──────┼──────┼──────┤
154
+ │ $\sin(x)$ ║ 0.00 │ 0.84 │ 0.91 │ 0.14 │
155
+ └───────────╨──────┴──────┴──────┴──────┘
156
+
157
+ In either plain text or LaTeX, entries in tables can be aligned to the
158
+ left (default), center, or right::
159
+
160
+ sage: table(rows, align='left')
161
+ a b c
162
+ 100 2 3
163
+ 4 5 60
164
+ sage: table(rows, align='center')
165
+ a b c
166
+ 100 2 3
167
+ 4 5 60
168
+ sage: table(rows, align='right', frame=True)
169
+ ┌─────┬───┬────┐
170
+ │ a │ b │ c │
171
+ ├─────┼───┼────┤
172
+ │ 100 │ 2 │ 3 │
173
+ ├─────┼───┼────┤
174
+ │ 4 │ 5 │ 60 │
175
+ └─────┴───┴────┘
176
+
177
+ To generate HTML you should use ``html(table(...))``::
178
+
179
+ sage: # needs sage.symbolic
180
+ sage: data = [["$x$", r"$\sin(x)$"]] + [(x, n(sin(x), digits=2))
181
+ ....: for x in [0..3]]
182
+ sage: output = html(table(data, header_row=True, frame=True))
183
+ sage: type(output)
184
+ <class 'sage.misc.html.HtmlFragment'>
185
+ sage: print(output)
186
+ <div class="notruncate">
187
+ <table border="1" class="table_form">
188
+ <tbody>
189
+ <tr>
190
+ <th style="text-align:left">\(x\)</th>
191
+ <th style="text-align:left">\(\sin(x)\)</th>
192
+ </tr>
193
+ <tr class ="row-a">
194
+ <td style="text-align:left">\(0\)</td>
195
+ <td style="text-align:left">\(0.00\)</td>
196
+ </tr>
197
+ <tr class ="row-b">
198
+ <td style="text-align:left">\(1\)</td>
199
+ <td style="text-align:left">\(0.84\)</td>
200
+ </tr>
201
+ <tr class ="row-a">
202
+ <td style="text-align:left">\(2\)</td>
203
+ <td style="text-align:left">\(0.91\)</td>
204
+ </tr>
205
+ <tr class ="row-b">
206
+ <td style="text-align:left">\(3\)</td>
207
+ <td style="text-align:left">\(0.14\)</td>
208
+ </tr>
209
+ </tbody>
210
+ </table>
211
+ </div>
212
+
213
+ It is an error to specify both ``rows`` and ``columns``::
214
+
215
+ sage: table(rows=[[1,2,3], [4,5,6]], columns=[[0,0,0], [0,0,1024]])
216
+ Traceback (most recent call last):
217
+ ...
218
+ ValueError: do not set both 'rows' and 'columns' when defining a table
219
+
220
+ sage: table(columns=[[0,0,0], [0,0,1024]])
221
+ 0 0
222
+ 0 0
223
+ 0 1024
224
+
225
+ Note that if ``rows`` is just a list or tuple, not nested, then
226
+ it is treated as a single row::
227
+
228
+ sage: table([1,2,3])
229
+ 1 2 3
230
+
231
+ Also, if you pass a non-rectangular array, the longer rows or
232
+ columns get truncated::
233
+
234
+ sage: table([[1,2,3,7,12], [4,5]])
235
+ 1 2
236
+ 4 5
237
+ sage: table(columns=[[1,2,3], [4,5,6,7]])
238
+ 1 4
239
+ 2 5
240
+ 3 6
241
+
242
+ TESTS::
243
+
244
+ sage: TestSuite(table([["$x$", r"$\sin(x)$"]] + # needs sage.symbolic
245
+ ....: [(x, n(sin(x), digits=2)) for x in [0..3]],
246
+ ....: header_row=True, frame=True)).run()
247
+
248
+ .. automethod:: _rich_repr_
249
+ """
250
+ def __init__(self, rows=None, columns=None, header_row=False,
251
+ header_column=False, frame=False, align='left'):
252
+ r"""
253
+ EXAMPLES::
254
+
255
+ sage: table([1,2,3], frame=True)
256
+ ┌───┬───┬───┐
257
+ │ 1 │ 2 │ 3 │
258
+ └───┴───┴───┘
259
+ """
260
+ # If both rows and columns are set, raise an error.
261
+ if rows and columns:
262
+ raise ValueError("do not set both 'rows' and 'columns' when defining a table")
263
+ # If columns is set, use its transpose for rows.
264
+ if columns:
265
+ rows = list(zip(*columns))
266
+ # Set the rest of the options.
267
+ self._options = {}
268
+ if header_row is True:
269
+ self._options['header_row'] = True
270
+ elif header_row:
271
+ self._options['header_row'] = True
272
+ rows = [header_row] + rows
273
+ else:
274
+ self._options['header_row'] = False
275
+ if header_column is True:
276
+ self._options['header_column'] = True
277
+ elif header_column:
278
+ self._options['header_column'] = True
279
+ rows = [(a,) + tuple(x) for (a, x) in zip(header_column, rows)]
280
+ else:
281
+ self._options['header_column'] = False
282
+
283
+ self._options['frame'] = frame
284
+ self._options['align'] = align
285
+ # Store rows as a tuple.
286
+ if not isinstance(rows[0], (list, tuple)):
287
+ rows = (rows,)
288
+ self._rows = tuple(rows)
289
+
290
+ def __eq__(self, other):
291
+ r"""
292
+ Two tables are equal if and only if their data rowss and
293
+ their options are the same.
294
+
295
+ EXAMPLES::
296
+
297
+ sage: # needs sage.modules sage.plot sage.symbolic
298
+ sage: rows = [['a', 'b', 'c'], [1,plot(sin(x)),3], [4,5,identity_matrix(2)]]
299
+ sage: T = table(rows, header_row=True)
300
+ sage: T2 = table(rows, header_row=True)
301
+ sage: T is T2
302
+ False
303
+ sage: T == T2
304
+ True
305
+ sage: T2.options(frame=True)
306
+ sage: T == T2
307
+ False
308
+ """
309
+ return (self._rows == other._rows and self.options() == other.options())
310
+
311
+ def options(self, **kwds):
312
+ r"""
313
+ With no arguments, return the dictionary of options for this
314
+ table. With arguments, modify options.
315
+
316
+ INPUT:
317
+
318
+ - ``header_row`` -- if ``True``, first row is highlighted
319
+ - ``header_column`` -- if ``True``, first column is highlighted
320
+ - ``frame`` -- if ``True``, put a box around each cell
321
+ - ``align`` -- the alignment of each entry: either ``'left'``,
322
+ ``'center'``, or ``'right'``
323
+
324
+ EXAMPLES::
325
+
326
+ sage: T = table([['a', 'b', 'c'], [1,2,3]])
327
+ sage: T.options()['align'], T.options()['frame']
328
+ ('left', False)
329
+ sage: T.options(align='right', frame=True)
330
+ sage: T.options()['align'], T.options()['frame']
331
+ ('right', True)
332
+
333
+ Note that when first initializing a table, ``header_row`` or
334
+ ``header_column`` can be a list. In this case, during the
335
+ initialization process, the header is merged with the rest of
336
+ the data, so changing the header option later using
337
+ ``table.options(...)`` doesn't affect the contents of the
338
+ table, just whether the row or column is highlighted. When
339
+ using this :meth:`options` method, no merging of data occurs,
340
+ so here ``header_row`` and ``header_column`` should just be
341
+ ``True`` or ``False``, not a list. ::
342
+
343
+ sage: T = table([[1,2,3], [4,5,6]], header_row=['a', 'b', 'c'], frame=True)
344
+ sage: T
345
+ ┌───┬───┬───┐
346
+ │ a │ b │ c │
347
+ ╞═══╪═══╪═══╡
348
+ │ 1 │ 2 │ 3 │
349
+ ├───┼───┼───┤
350
+ │ 4 │ 5 │ 6 │
351
+ └───┴───┴───┘
352
+ sage: T.options(header_row=False)
353
+ sage: T
354
+ ┌───┬───┬───┐
355
+ │ a │ b │ c │
356
+ ├───┼───┼───┤
357
+ │ 1 │ 2 │ 3 │
358
+ ├───┼───┼───┤
359
+ │ 4 │ 5 │ 6 │
360
+ └───┴───┴───┘
361
+
362
+ If you do specify a list for ``header_row``, an error is raised::
363
+
364
+ sage: T.options(header_row=['x', 'y', 'z'])
365
+ Traceback (most recent call last):
366
+ ...
367
+ TypeError: header_row should be either True or False.
368
+ """
369
+ if kwds:
370
+ for option in ['align', 'frame']:
371
+ if option in kwds:
372
+ self._options[option] = kwds[option]
373
+ for option in ['header_row', 'header_column']:
374
+ if option in kwds:
375
+ if not kwds[option]:
376
+ self._options[option] = kwds[option]
377
+ elif kwds[option] is True:
378
+ self._options[option] = kwds[option]
379
+ else:
380
+ raise TypeError("%s should be either True or False." % option)
381
+ else:
382
+ return self._options
383
+
384
+ def transpose(self):
385
+ r"""
386
+ Return a table which is the transpose of this one:
387
+ rows and columns have been interchanged. Several of the
388
+ properties of the original table are preserved: whether a
389
+ frame is present and any alignment setting. On the other hand,
390
+ header rows are converted to header columns, and vice versa.
391
+
392
+ EXAMPLES::
393
+
394
+ sage: T = table([[1,2,3], [4,5,6]])
395
+ sage: T.transpose()
396
+ 1 4
397
+ 2 5
398
+ 3 6
399
+ sage: T = table([[1,2,3], [4,5,6]], header_row=['x', 'y', 'z'], frame=True)
400
+ sage: T.transpose()
401
+ ┌───╥───┬───┐
402
+ │ x ║ 1 │ 4 │
403
+ ├───╫───┼───┤
404
+ │ y ║ 2 │ 5 │
405
+ ├───╫───┼───┤
406
+ │ z ║ 3 │ 6 │
407
+ └───╨───┴───┘
408
+ """
409
+ return table(list(zip(*self._rows)),
410
+ header_row=self._options['header_column'],
411
+ header_column=self._options['header_row'],
412
+ frame=self._options['frame'],
413
+ align=self._options['align'])
414
+
415
+ @cached_method
416
+ def _widths(self):
417
+ r"""
418
+ The maximum widths for (the string representation of) each
419
+ column. Used by the :meth:`_repr_` method.
420
+
421
+ EXAMPLES::
422
+
423
+ sage: table([['a', 'bb', 'ccccc'], [10, -12, 0], [1, 2, 3]])._widths()
424
+ (2, 3, 5)
425
+ """
426
+ nc = len(self._rows[0])
427
+
428
+ widths = [0] * nc
429
+ for row in self._rows:
430
+ w = []
431
+ for (idx, x) in zip(range(nc), row):
432
+ w.append(max(widths[idx], len(str(x))))
433
+ widths = w
434
+ return tuple(widths)
435
+
436
+ def _repr_(self) -> str:
437
+ r"""
438
+ String representation of a table.
439
+
440
+ The class docstring has many examples; here is one more.
441
+
442
+ EXAMPLES::
443
+
444
+ sage: table([['a', 'bb', 'ccccc'], [10, -12, 0], [1, 2, 3]], align='right') # indirect doctest
445
+ a bb ccccc
446
+ 10 -12 0
447
+ 1 2 3
448
+ """
449
+ rows = self._rows
450
+ nc = len(rows[0])
451
+ if len(rows) == 0 or nc == 0:
452
+ return ""
453
+
454
+ top_line = "┌" + "┬".join("─" * (x + 2) for x in self._widths()) + "┐\n"
455
+ frame_line = "├" + "┼".join("─" * (x + 2) for x in self._widths()) + "┤\n"
456
+ bottom_line = "└" + "┴".join("─" * (x + 2) for x in self._widths()) + "┘\n"
457
+
458
+ if self._options['header_column'] and self._options['frame']:
459
+ top_line = top_line.replace('┬', '╥', 1)
460
+ frame_line = frame_line.replace('┼', '╫', 1)
461
+ bottom_line = bottom_line.replace('┴', '╨', 1)
462
+
463
+ if self._options['frame']:
464
+ s = top_line
465
+ else:
466
+ s = ""
467
+
468
+ if self._options['header_row']:
469
+ s += self._str_table_row(rows[0], header_row=True)
470
+ rows = rows[1:]
471
+
472
+ for row in rows[:-1]:
473
+ s += self._str_table_row(row, header_row=False)
474
+ if rows:
475
+ s += self._str_table_row(rows[-1], header_row=False, last_row=True)
476
+ return s.strip("\n")
477
+
478
+ def _rich_repr_(self, display_manager, **kwds):
479
+ """
480
+ Rich Output Magic Method.
481
+
482
+ See :mod:`sage.repl.rich_output` for details.
483
+
484
+ EXAMPLES::
485
+
486
+ sage: from sage.repl.rich_output import get_display_manager
487
+ sage: dm = get_display_manager()
488
+ sage: t = table([1, 2, 3])
489
+ sage: t._rich_repr_(dm) # the doctest backend does not support html
490
+ """
491
+ OutputHtml = display_manager.types.OutputHtml
492
+ if OutputHtml in display_manager.supported_output():
493
+ return OutputHtml(self._html_())
494
+
495
+ def _str_table_row(self, row, header_row=False, last_row=False):
496
+ r"""
497
+ String representation of a row of a table. Used by the
498
+ :meth:`_repr_` method.
499
+
500
+ EXAMPLES::
501
+
502
+ sage: T = table([['a', 'bb', 'ccccc'], [10, -12, 0], [1, 2, 3]], align='right')
503
+ sage: T._str_table_row([1,2,3])
504
+ ' 1 2 3\n'
505
+ sage: T._str_table_row([1,2,3], True)
506
+ ' 1 2 3\n├────┼─────┼───────┤\n'
507
+ sage: T.options(header_column=True)
508
+ sage: T._str_table_row([1,2,3], True)
509
+ ' 1 │ 2 3\n├────┼─────┼───────┤\n'
510
+ sage: T.options(frame=True)
511
+ sage: T._str_table_row([1,2,3], False)
512
+ '│ 1 ║ 2 │ 3 │\n├────╫─────┼───────┤\n'
513
+
514
+ Check that :issue:`14601` has been fixed::
515
+
516
+ sage: table([['111111', '222222', '333333']])._str_table_row([False,True,None], False)
517
+ ' False True None\n'
518
+ """
519
+ frame = self._options['frame']
520
+ widths = self._widths()
521
+
522
+ top_line = "┌" + "┬".join("─" * (x + 2) for x in self._widths()) + "┐\n"
523
+ frame_line = "├" + "┼".join("─" * (x + 2) for x in self._widths()) + "┤\n"
524
+ bottom_line = "└" + "┴".join("─" * (x + 2) for x in self._widths()) + "┘\n"
525
+
526
+ align = self._options['align']
527
+ if align == 'right':
528
+ align_char = '>'
529
+ elif align == 'center':
530
+ align_char = '^'
531
+ else:
532
+ align_char = '<'
533
+
534
+ if frame:
535
+ s = "│ "
536
+ else:
537
+ s = " "
538
+
539
+ if self._options['header_column']:
540
+ if frame:
541
+ top_line = top_line.replace('┬', '╥', 1)
542
+ frame_line = frame_line.replace('┼', '╫', 1)
543
+ bottom_line = bottom_line.replace('┴', '╨', 1)
544
+
545
+ s += ("{!s:" + align_char + str(widths[0]) + "}").format(row[0])
546
+ if frame:
547
+ s += " ║ "
548
+ else:
549
+ s += " │ "
550
+ row = row[1:]
551
+ widths = widths[1:]
552
+
553
+ for entry, width in zip(row, widths):
554
+ s += ("{!s:" + align_char + str(width) + "}").format(entry)
555
+ if frame:
556
+ s += " │ "
557
+ else:
558
+ s += " "
559
+ s = s.rstrip(' ')
560
+ s += "\n"
561
+ if frame and header_row:
562
+ double_line = frame_line.replace('─', '═').replace('├', '╞')
563
+ double_line = double_line.replace('┤', '╡').replace('┼', '╪')
564
+ s += double_line
565
+ elif frame or header_row:
566
+ s += bottom_line if last_row else frame_line
567
+ return s
568
+
569
+ def _latex_(self):
570
+ r"""
571
+ LaTeX representation of a table.
572
+
573
+ If an entry is a Sage object, it is replaced by its LaTeX
574
+ representation, delimited by dollar signs (i.e., ``x`` is
575
+ replaced by ``$latex(x)$``). If an entry is a string, the
576
+ dollar signs are not automatically added, so tables can
577
+ include both plain text and mathematics.
578
+
579
+ OUTPUT: string
580
+
581
+ EXAMPLES::
582
+
583
+ sage: from sage.misc.table import table
584
+ sage: a = [[r'$\sin(x)$', '$x$', 'text'], # needs sage.modules
585
+ ....: [1, 34342, 3], [identity_matrix(2), 5, 6]]
586
+ sage: latex(table(a)) # indirect doctest # needs sage.modules
587
+ \begin{tabular}{lll}
588
+ $\sin(x)$ & $x$ & text \\
589
+ $1$ & $34342$ & $3$ \\
590
+ $\left(\begin{array}{rr}
591
+ 1 & 0 \\
592
+ 0 & 1
593
+ \end{array}\right)$ & $5$ & $6$ \\
594
+ \end{tabular}
595
+ sage: latex(table(a, frame=True, align='center')) # needs sage.modules
596
+ \begin{tabular}{|c|c|c|} \hline
597
+ $\sin(x)$ & $x$ & text \\ \hline
598
+ $1$ & $34342$ & $3$ \\ \hline
599
+ $\left(\begin{array}{rr}
600
+ 1 & 0 \\
601
+ 0 & 1
602
+ \end{array}\right)$ & $5$ & $6$ \\ \hline
603
+ \end{tabular}
604
+ """
605
+ from .latex import latex, LatexExpr
606
+
607
+ rows = self._rows
608
+ nc = len(rows[0])
609
+ if len(rows) == 0 or nc == 0:
610
+ return ""
611
+
612
+ align_char = self._options['align'][0] # 'l', 'c', 'r'
613
+ if self._options['frame']:
614
+ frame_char = '|'
615
+ frame_str = ' \\hline'
616
+ else:
617
+ frame_char = ''
618
+ frame_str = ''
619
+ if self._options['header_column']:
620
+ head_col_char = '|'
621
+ else:
622
+ head_col_char = ''
623
+ if self._options['header_row']:
624
+ head_row_str = ' \\hline'
625
+ else:
626
+ head_row_str = ''
627
+
628
+ # table header
629
+ s = "\\begin{tabular}{"
630
+ s += frame_char + align_char + frame_char + head_col_char
631
+ s += frame_char.join([align_char] * (nc - 1))
632
+ s += frame_char + "}" + frame_str + "\n"
633
+ # first row
634
+ s += " & ".join(LatexExpr(x) if isinstance(x, (str, LatexExpr))
635
+ else '$' + latex(x).strip() + '$' for x in rows[0])
636
+ s += " \\\\" + frame_str + head_row_str + "\n"
637
+ # other rows
638
+ for row in rows[1:]:
639
+ s += " & ".join(LatexExpr(x) if isinstance(x, (str, LatexExpr))
640
+ else '$' + latex(x).strip() + '$' for x in row)
641
+ s += " \\\\" + frame_str + "\n"
642
+ s += "\\end{tabular}"
643
+ return s
644
+
645
+ def _html_(self):
646
+ r"""
647
+ HTML representation of a table.
648
+
649
+ Strings of html will be parsed for math inside dollar and
650
+ double-dollar signs. 2D graphics will be displayed in the
651
+ cells. Expressions will be latexed.
652
+
653
+ The ``align`` option for tables is ignored in HTML
654
+ output. Specifying ``header_column=True`` may not have any
655
+ visible effect in the Sage notebook, depending on the version
656
+ of the notebook.
657
+
658
+ OUTPUT: :class:`~sage.misc.html.HtmlFragment`
659
+
660
+ EXAMPLES::
661
+
662
+ sage: T = table([[r'$\sin(x)$', '$x$', 'text'], # needs sage.modules
663
+ ....: [1, 34342, 3], [identity_matrix(2), 5, 6]])
664
+ sage: T._html_() # needs sage.modules
665
+ '<div.../div>'
666
+ sage: print(T._html_()) # needs sage.modules
667
+ <div class="notruncate">
668
+ <table class="table_form">
669
+ <tbody>
670
+ <tr class ="row-a">
671
+ <td style="text-align:left">\(\sin(x)\)</td>
672
+ <td style="text-align:left">\(x\)</td>
673
+ <td style="text-align:left">text</td>
674
+ </tr>
675
+ <tr class ="row-b">
676
+ <td style="text-align:left">\(1\)</td>
677
+ <td style="text-align:left">\(34342\)</td>
678
+ <td style="text-align:left">\(3\)</td>
679
+ </tr>
680
+ <tr class ="row-a">
681
+ <td style="text-align:left">\(\left(\begin{array}{rr}
682
+ 1 & 0 \\
683
+ 0 & 1
684
+ \end{array}\right)\)</td>
685
+ <td style="text-align:left">\(5\)</td>
686
+ <td style="text-align:left">\(6\)</td>
687
+ </tr>
688
+ </tbody>
689
+ </table>
690
+ </div>
691
+
692
+ Note that calling ``html(table(...))`` has the same effect as
693
+ calling ``table(...)._html_()``::
694
+
695
+ sage: T = table([["$x$", r"$\sin(x)$"]] # needs sage.symbolic
696
+ ....: + [(x,n(sin(x), digits=2)) for x in [0..3]],
697
+ ....: header_row=True, frame=True)
698
+ sage: T # needs sage.symbolic
699
+ ┌─────┬───────────┐
700
+ │ $x$ │ $\sin(x)$ │
701
+ ╞═════╪═══════════╡
702
+ │ 0 │ 0.00 │
703
+ ├─────┼───────────┤
704
+ │ 1 │ 0.84 │
705
+ ├─────┼───────────┤
706
+ │ 2 │ 0.91 │
707
+ ├─────┼───────────┤
708
+ │ 3 │ 0.14 │
709
+ └─────┴───────────┘
710
+ sage: print(html(T)) # needs sage.symbolic
711
+ <div class="notruncate">
712
+ <table border="1" class="table_form">
713
+ <tbody>
714
+ <tr>
715
+ <th style="text-align:left">\(x\)</th>
716
+ <th style="text-align:left">\(\sin(x)\)</th>
717
+ </tr>
718
+ <tr class ="row-a">
719
+ <td style="text-align:left">\(0\)</td>
720
+ <td style="text-align:left">\(0.00\)</td>
721
+ </tr>
722
+ <tr class ="row-b">
723
+ <td style="text-align:left">\(1\)</td>
724
+ <td style="text-align:left">\(0.84\)</td>
725
+ </tr>
726
+ <tr class ="row-a">
727
+ <td style="text-align:left">\(2\)</td>
728
+ <td style="text-align:left">\(0.91\)</td>
729
+ </tr>
730
+ <tr class ="row-b">
731
+ <td style="text-align:left">\(3\)</td>
732
+ <td style="text-align:left">\(0.14\)</td>
733
+ </tr>
734
+ </tbody>
735
+ </table>
736
+ </div>
737
+ """
738
+ from itertools import cycle
739
+ rows = self._rows
740
+ header_row = self._options['header_row']
741
+ if self._options['frame']:
742
+ frame = 'border="1"'
743
+ else:
744
+ frame = ''
745
+ s = StringIO()
746
+ if rows:
747
+ s.writelines([
748
+ # If the table has < 100 rows, don't truncate the output in the notebook
749
+ '<div class="notruncate">\n' if len(rows) <= 100 else '<div class="truncate">',
750
+ '<table {} class="table_form">\n'.format(frame),
751
+ '<tbody>\n',
752
+ ])
753
+ # First row:
754
+ if header_row:
755
+ s.write('<tr>\n')
756
+ self._html_table_row(s, rows[0], header=header_row)
757
+ s.write('</tr>\n')
758
+ rows = rows[1:]
759
+
760
+ # Other rows:
761
+ for row_class, row in zip(cycle(["row-a", "row-b"]), rows):
762
+ s.write('<tr class ="{}">\n'.format(row_class))
763
+ self._html_table_row(s, row, header=False)
764
+ s.write('</tr>\n')
765
+ s.write('</tbody>\n</table>\n</div>')
766
+ return s.getvalue()
767
+
768
+ def _html_table_row(self, file, row, header=False):
769
+ r"""
770
+ Write table row.
771
+
772
+ Helper method used by the :meth:`_html_` method.
773
+
774
+ INPUT:
775
+
776
+ - ``file`` -- file-like object; the table row data will be
777
+ written to it
778
+
779
+ - ``row`` -- list with the same number of entries as each row
780
+ of the table
781
+
782
+ - ``header`` -- boolean (default: ``False``); if ``True``, treat this
783
+ as a header row, using ``<th>`` instead of ``<td>``
784
+
785
+ OUTPUT: this method returns nothing; all output is written to ``file``
786
+
787
+ Strings are written verbatim unless they seem to be LaTeX
788
+ code, in which case they are enclosed in a ``script`` tag
789
+ appropriate for MathJax. Sage objects are printed using their
790
+ LaTeX representations.
791
+
792
+ EXAMPLES::
793
+
794
+ sage: T = table([['a', 'bb', 'ccccc'], [10, -12, 0], [1, 2, 3]])
795
+ sage: from io import StringIO
796
+ sage: s = StringIO()
797
+ sage: T._html_table_row(s, ['a', 2, '$x$'])
798
+ sage: print(s.getvalue())
799
+ <td style="text-align:left">a</td>
800
+ <td style="text-align:left">\(2\)</td>
801
+ <td style="text-align:left">\(x\)</td>
802
+ """
803
+ from .latex import latex
804
+ from .html import math_parse
805
+ import types
806
+
807
+ try:
808
+ from sage.plot.all import Graphics
809
+ except ImportError:
810
+ Graphics = ()
811
+
812
+ if isinstance(row, types.GeneratorType):
813
+ row = list(row)
814
+ elif not isinstance(row, (list, tuple)):
815
+ row = [row]
816
+
817
+ align_char = self._options['align'][0] # 'l', 'c', 'r'
818
+
819
+ if align_char == 'l':
820
+ style = 'text-align:left'
821
+ elif align_char == 'c':
822
+ style = 'text-align:center'
823
+ elif align_char == 'r':
824
+ style = 'text-align:right'
825
+ else:
826
+ style = ''
827
+
828
+ style_attr = f' style="{style}"' if style else ''
829
+
830
+ column_tag = f'<th{style_attr}>%s</th>\n' if header else f'<td{style_attr}>%s</td>\n'
831
+
832
+ if self._options['header_column']:
833
+ first_column_tag = '<th class="ch"{style_attr}>%s</th>\n' if header else '<td class="ch"{style_attr}>%s</td>\n'
834
+ else:
835
+ first_column_tag = column_tag
836
+
837
+ # first entry of row
838
+ entry = row[0]
839
+ if isinstance(entry, Graphics):
840
+ file.write(first_column_tag % entry.show(linkmode=True))
841
+ elif isinstance(entry, str):
842
+ file.write(first_column_tag % math_parse(entry))
843
+ else:
844
+ file.write(first_column_tag % (r'\(%s\)' % latex(entry)))
845
+
846
+ # other entries
847
+ for column in range(1, len(row)):
848
+ if isinstance(row[column], Graphics):
849
+ file.write(column_tag % row[column].show(linkmode=True))
850
+ elif isinstance(row[column], str):
851
+ file.write(column_tag % math_parse(row[column]))
852
+ else:
853
+ file.write(column_tag % (r'\(%s\)' % latex(row[column])))