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,789 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Base Class for Character-Based Art
4
+
5
+ This is the common base class for
6
+ :class:`sage.typeset.ascii_art.AsciiArt` and
7
+ :class:`sage.typeset.unicode_art.UnicodeArt`. They implement simple
8
+ graphics by placing characters on a rectangular grid, in other words,
9
+ using monospace fonts. The difference is that one is restricted to
10
+ 7-bit ascii, the other uses all unicode code points.
11
+ """
12
+
13
+ # ******************************************************************************
14
+ # Copyright (C) 2013 Jean-Baptiste Priez <jbp@kerios.fr>,
15
+ #
16
+ # Distributed under the terms of the GNU General Public License (GPL)
17
+ #
18
+ # This code is distributed in the hope that it will be useful,
19
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ # General Public License for more details.
22
+ #
23
+ # The full text of the GPL is available at:
24
+ #
25
+ # https://www.gnu.org/licenses/
26
+ # ******************************************************************************
27
+ import sys
28
+ from sage.structure.sage_object import SageObject
29
+
30
+
31
+ ################################################################################
32
+ # Global variable use to compute the maximal length allows for ascii art
33
+ # object.
34
+ MAX_WIDTH = None
35
+ ################################################################################
36
+
37
+
38
+ class CharacterArt(SageObject):
39
+
40
+ def __init__(self, lines=[], breakpoints=[], baseline=None):
41
+ r"""
42
+ Abstract base class for character art.
43
+
44
+ INPUT:
45
+
46
+ - ``lines`` -- the list of lines of the representation of the
47
+ character art object
48
+
49
+ - ``breakpoints`` -- the list of points where the representation can be
50
+ split
51
+
52
+ - ``baseline`` -- the reference line (from the bottom)
53
+
54
+ Instead of just integers, ``breakpoints`` may also contain tuples
55
+ consisting of an offset and the breakpoints of a nested substring at
56
+ that offset. This is used to prioritize the breakpoints, as line breaks
57
+ inside the substring will be avoided if possible.
58
+
59
+ EXAMPLES::
60
+
61
+ sage: i = var('i') # needs sage.symbolic
62
+ sage: ascii_art(sum(pi^i/factorial(i)*x^i, i, 0, oo)) # needs sage.symbolic
63
+ pi*x
64
+ e
65
+
66
+ TESTS::
67
+
68
+ sage: from sage.typeset.ascii_art import AsciiArt
69
+ sage: aao = AsciiArt()
70
+ sage: aao
71
+ <BLANKLINE>
72
+ sage: aa = AsciiArt([" * ", " * * ", "*****"]); aa
73
+ *
74
+ * *
75
+ *****
76
+
77
+ If there are nested breakpoints, line breaks are avoided inside the
78
+ nested elements (:issue:`29204`)::
79
+
80
+ sage: s = ascii_art([[1..5], [1..17], [1..25]])
81
+ sage: s._breakpoints
82
+ [(2, [4, 7, 10, 13]), 20, (21, [4, 7,..., 56]), 83, (84, [4, 7,..., 88])]
83
+ sage: str(s)
84
+ '[ [ 1, 2, 3, 4, 5 ],\n\n
85
+ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ],\n\n
86
+ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n\n
87
+ 22, 23, 24, 25 ] ]'
88
+ """
89
+ self._matrix = lines
90
+ self._breakpoints = breakpoints
91
+ self._baseline = baseline if baseline is not None else 0
92
+
93
+ self._h = len(lines)
94
+ self._l = 0 if not lines else max([len(line) for line in lines])
95
+
96
+ @classmethod
97
+ def empty(cls):
98
+ """
99
+ Return the empty character art object.
100
+
101
+ EXAMPLES::
102
+
103
+ sage: from sage.typeset.ascii_art import AsciiArt
104
+ sage: AsciiArt.empty()
105
+ """
106
+ empty_string = cls._string_type()
107
+ return cls([empty_string])
108
+
109
+ def __getitem__(self, key):
110
+ r"""
111
+ Return the line `key` of the ASCII art object.
112
+
113
+ TESTS::
114
+
115
+ sage: from sage.typeset.ascii_art import AsciiArt
116
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
117
+ sage: p5[1]
118
+ ' * * '
119
+ """
120
+ return self._matrix[key]
121
+
122
+ def __iter__(self):
123
+ r"""
124
+ Iterator on all lines of the ASCII art object.
125
+
126
+ TESTS::
127
+
128
+ sage: from sage.typeset.ascii_art import AsciiArt
129
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
130
+ sage: for line in p5:
131
+ ....: print(line)
132
+ *
133
+ * *
134
+ *****
135
+ """
136
+ yield from self._matrix
137
+
138
+ def _repr_(self):
139
+ r"""
140
+ TESTS::
141
+
142
+ sage: from sage.typeset.ascii_art import AsciiArt
143
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
144
+ sage: repr(p5)
145
+ ' * \n * * \n*****'
146
+ """
147
+ # Compute the max length of a draw
148
+ global MAX_WIDTH
149
+ if MAX_WIDTH is not None:
150
+ hsize = MAX_WIDTH
151
+ else:
152
+ hsize = self._terminal_width()
153
+ # if the draw is larger than the max length, try to split it
154
+ if hsize <= self._l and self._breakpoints:
155
+ return self._split_repr_(hsize)
156
+ return '\n'.join(self._matrix)
157
+
158
+ def __format__(self, fmt):
159
+ r"""
160
+ Format ``self``.
161
+
162
+ EXAMPLES::
163
+
164
+ sage: M = matrix([[1,2],[3,4]]) # needs sage.modules
165
+ sage: format(ascii_art(M)) # needs sage.modules
166
+ '[1 2]\n[3 4]'
167
+ sage: format(unicode_art(M)) # needs sage.modules
168
+ '\u239b1 2\u239e\n\u239d3 4\u23a0'
169
+ """
170
+ return format(self._string_type(self), fmt)
171
+
172
+ def get_baseline(self):
173
+ r"""
174
+ Return the line where the baseline is, for example::
175
+
176
+ 5 4
177
+ 14*x + 5*x
178
+
179
+ the baseline has at line `0` and ::
180
+
181
+ { o }
182
+ { \ : 4 }
183
+ { o }
184
+
185
+ has at line `1`.
186
+
187
+ TESTS::
188
+
189
+ sage: from sage.typeset.ascii_art import AsciiArt
190
+ sage: aa = AsciiArt([" * ", " * * ", " * * ", "*******"], baseline=1);aa
191
+ *
192
+ * *
193
+ * *
194
+ *******
195
+ sage: aa.get_baseline()
196
+ 1
197
+ sage: b = AsciiArt(["<-"])
198
+ sage: aa+b
199
+ *
200
+ * *
201
+ * * <-
202
+ *******
203
+ """
204
+ return self._baseline
205
+
206
+ def get_breakpoints(self):
207
+ r"""
208
+ Return an iterator of breakpoints where the object can be split.
209
+
210
+ This method is deprecated, as its output is an implementation detail.
211
+ The mere breakpoints of a character art element do not reflect the best
212
+ way to split it if nested structures are involved. For details, see
213
+ :issue:`29204`.
214
+
215
+ For example the expression::
216
+
217
+ 5 4
218
+ 14x + 5x
219
+
220
+ can be split on position 4 (on the ``+``).
221
+
222
+ EXAMPLES::
223
+
224
+ sage: from sage.typeset.ascii_art import AsciiArt
225
+ sage: p3 = AsciiArt([" * ", "***"])
226
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
227
+ sage: aa = ascii_art([p3, p5])
228
+ sage: aa.get_breakpoints()
229
+ doctest:...: DeprecationWarning: get_breakpoints() is deprecated
230
+ See https://github.com/sagemath/sage/issues/29204 for details.
231
+ [6]
232
+ """
233
+ from sage.misc.superseded import deprecation
234
+ deprecation(29204, "get_breakpoints() is deprecated")
235
+ return self._breakpoints
236
+
237
+ def _isatty(self):
238
+ """
239
+ Test whether ``stdout`` is a TTY.
240
+
241
+ If this test succeeds, you can assume that ``stdout`` is directly
242
+ connected to a terminal. Otherwise you should treat ``stdout`` as
243
+ being redirected to a file.
244
+
245
+ OUTPUT: boolean
246
+
247
+ EXAMPLES::
248
+
249
+ sage: from sage.typeset.ascii_art import empty_ascii_art
250
+ sage: empty_ascii_art._isatty()
251
+ False
252
+ """
253
+ from sage.doctest import DOCTEST_MODE
254
+ if DOCTEST_MODE:
255
+ return False
256
+ try:
257
+ return sys.stdout.isatty()
258
+ except Exception:
259
+ # for fake ttys that might lead to an error
260
+ return False
261
+
262
+ def _terminal_width(self):
263
+ """
264
+ Compute the width size of the terminal.
265
+
266
+ EXAMPLES::
267
+
268
+ sage: from sage.typeset.ascii_art import empty_ascii_art
269
+ sage: empty_ascii_art._terminal_width()
270
+ 80
271
+ """
272
+ if not self._isatty():
273
+ return 80
274
+ import fcntl
275
+ import termios
276
+ import struct
277
+ rc = fcntl.ioctl(0, termios.TIOCGWINSZ,
278
+ struct.pack('HHHH', sys.stdout.fileno(), 0, 0, 0))
279
+ h, w, hp, wp = struct.unpack('HHHH', rc)
280
+ return w
281
+
282
+ def _splitting_points(self, size, offset=0):
283
+ """
284
+ Iterate over the breakpoints at which the representation can be split
285
+ to obtain chunks of length at most ``size``.
286
+
287
+ The final element returned will be the length of this object.
288
+
289
+ INPUT:
290
+
291
+ - ``size`` -- the maximum width of each chunk
292
+
293
+ - ``offset`` -- (default: ``0``) the first chunk has width at most
294
+ ``size - offset``
295
+
296
+ TESTS::
297
+
298
+ sage: list(ascii_art(*(['a'] * 90))._splitting_points(20, offset=5))
299
+ [15, 35, 55, 75, 90]
300
+ """
301
+ # We implement a custom iterator instead of repeatedly using
302
+ # itertools.chain to prepend elements in order to avoid quadratic time
303
+ # complexity
304
+ class PrependIterator:
305
+ """
306
+ Iterator with support for prepending of elements.
307
+ """
308
+ def __init__(self, stack):
309
+ self._stack = [iter(elems) for elems in stack]
310
+
311
+ def prepend(self, elems):
312
+ self._stack.append(iter(elems))
313
+
314
+ def __iter__(self):
315
+ return self
316
+
317
+ def __next__(self):
318
+ while self._stack:
319
+ try:
320
+ return next(self._stack[-1])
321
+ except StopIteration:
322
+ self._stack.pop()
323
+ raise StopIteration
324
+
325
+ idx = -offset
326
+ breakpoints = PrependIterator([[self._l], self._breakpoints])
327
+ bp = None
328
+ for bp_next in breakpoints:
329
+ if not isinstance(bp_next, tuple):
330
+ if bp_next - idx > size and bp is not None:
331
+ yield bp
332
+ idx = bp
333
+ bp = bp_next
334
+ else:
335
+ sub_offset, sub_breakpoints = bp_next
336
+ try:
337
+ bp_next = next(breakpoints)
338
+ except StopIteration:
339
+ bp_next = None
340
+ if bp_next is None or isinstance(bp_next, tuple):
341
+ raise ValueError("nested structure must be followed by a "
342
+ "regular breakpoint")
343
+ if bp_next - idx > size:
344
+ # substructure is too wide for the current line, so force a
345
+ # line break
346
+ if bp is not None:
347
+ yield bp
348
+ idx = bp
349
+ breakpoints.prepend([bp_next])
350
+ breakpoints.prepend(_shifted_breakpoints(sub_breakpoints,
351
+ sub_offset))
352
+ # at this point, we do not know the next breakpoint yet,
353
+ # but have already yielded bp, so discard it
354
+ bp = None
355
+ else:
356
+ bp = bp_next
357
+ if bp is not None:
358
+ yield bp
359
+
360
+ def _split_repr_(self, size):
361
+ r"""
362
+ Split the representation into chunks of length at most ``size``.
363
+
364
+ TESTS::
365
+
366
+ sage: from sage.typeset.ascii_art import AsciiArt
367
+ sage: p3 = AsciiArt([" * ", "***"])
368
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
369
+ sage: aa = ascii_art([p3, p5])
370
+ sage: print(aa._split_repr_(10))
371
+ [
372
+ [ *
373
+ [ ***,
374
+ <BLANKLINE>
375
+ * ]
376
+ * * ]
377
+ ***** ]
378
+
379
+ ::
380
+
381
+ sage: ascii_art(['a' * k for k in (1..10)])._split_repr_(20)
382
+ '[ a, aa, aaa, aaaa,\n\n aaaaa, aaaaaa,\n\n aaaaaaa, aaaaaaaa,\n\n aaaaaaaaa,\n\n aaaaaaaaaa ]'
383
+
384
+ Check that wrapping happens exactly at the given size (:issue:`28527`)::
385
+
386
+ sage: len(ascii_art(*(['']*90), sep=',')._split_repr_(80).split('\n')[0])
387
+ 80
388
+ """
389
+ idx = 0
390
+ parts = []
391
+ for bp in self._splitting_points(size):
392
+ if bp - idx > size:
393
+ import warnings
394
+ warnings.warn("the console size is smaller than the pretty "
395
+ "representation of the object")
396
+ # Note that this is faster than calling self.split() repeatedly
397
+ parts.append('\n'.join(line[idx:bp] for line in self))
398
+ idx = bp
399
+ return '\n\n'.join(parts)
400
+
401
+ def split(self, pos):
402
+ r"""
403
+ Split the representation at the position ``pos``.
404
+
405
+ EXAMPLES::
406
+
407
+ sage: from sage.typeset.ascii_art import AsciiArt
408
+ sage: p3 = AsciiArt([" * ", "***"])
409
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
410
+ sage: aa = ascii_art([p3, p5])
411
+ sage: a,b= aa.split(6)
412
+ sage: a
413
+ [
414
+ [ *
415
+ [ ***,
416
+ sage: b
417
+ * ]
418
+ * * ]
419
+ ***** ]
420
+ """
421
+ left = []
422
+ right = []
423
+ for line in self:
424
+ left.append(line[:pos])
425
+ right.append(line[pos:])
426
+ l_bp = []
427
+ r_bp = []
428
+ for bp in self._breakpoints:
429
+ if bp < pos:
430
+ l_bp.append(bp)
431
+ elif bp > pos:
432
+ r_bp.append(bp - pos)
433
+ return self.__class__(left, l_bp), self.__class__(right, r_bp)
434
+
435
+ @staticmethod
436
+ def _compute_new_baseline(obj1, obj2):
437
+ r"""
438
+ TESTS::
439
+
440
+ sage: from sage.typeset.ascii_art import AsciiArt
441
+ sage: l5 = AsciiArt(lines = ['|' for _ in range(5)], baseline = 2); l5
442
+ |
443
+ |
444
+ |
445
+ |
446
+ |
447
+ sage: l3 = AsciiArt(lines = ['|' for _ in range(3)], baseline = 1); l3
448
+ |
449
+ |
450
+ |
451
+ sage: AsciiArt._compute_new_baseline(l5, l3)
452
+ 2
453
+ sage: l5 + l3
454
+ |
455
+ ||
456
+ ||
457
+ ||
458
+ |
459
+ sage: l5._baseline = 0
460
+ sage: AsciiArt._compute_new_baseline(l5, l3)
461
+ 1
462
+ sage: l5 + l3
463
+ |
464
+ |
465
+ |
466
+ ||
467
+ ||
468
+ |
469
+ sage: l5._baseline = 4
470
+ sage: AsciiArt._compute_new_baseline(l5, l3)
471
+ 4
472
+ sage: l5 + l3
473
+ |
474
+ ||
475
+ ||
476
+ |
477
+ |
478
+ |
479
+ sage: l3._baseline = 0
480
+ sage: AsciiArt._compute_new_baseline(l3, l5)
481
+ 4
482
+ sage: l3 + l5
483
+ |
484
+ |
485
+ ||
486
+ |
487
+ |
488
+ |
489
+ |
490
+ """
491
+ return max(obj1.get_baseline(), obj2.get_baseline())
492
+
493
+ @staticmethod
494
+ def _compute_new_h(obj1, obj2):
495
+ r"""
496
+ TESTS::
497
+
498
+ sage: from sage.typeset.ascii_art import AsciiArt
499
+ sage: l5 = AsciiArt(lines=['|' for _ in range(5)], baseline=2); l5
500
+ |
501
+ |
502
+ |
503
+ |
504
+ |
505
+ sage: l3 = AsciiArt(lines=['|' for _ in range(3)], baseline=1); l3
506
+ |
507
+ |
508
+ |
509
+ sage: AsciiArt._compute_new_h(l5, l3)
510
+ 5
511
+ sage: l5 + l3
512
+ |
513
+ ||
514
+ ||
515
+ ||
516
+ |
517
+ sage: l5._baseline = 0
518
+ sage: AsciiArt._compute_new_h(l5, l3)
519
+ 6
520
+ sage: l5 + l3
521
+ |
522
+ |
523
+ |
524
+ ||
525
+ ||
526
+ |
527
+ sage: l5._baseline = 4
528
+ sage: AsciiArt._compute_new_h(l5, l3)
529
+ 6
530
+ sage: l5 + l3
531
+ |
532
+ ||
533
+ ||
534
+ |
535
+ |
536
+ |
537
+ sage: l3._baseline = 0
538
+ sage: AsciiArt._compute_new_h(l3, l5)
539
+ 7
540
+ sage: l3 + l5
541
+ |
542
+ |
543
+ ||
544
+ |
545
+ |
546
+ |
547
+ |
548
+ """
549
+ return max(
550
+ obj1.get_baseline(),
551
+ obj2.get_baseline()
552
+ ) + max(
553
+ obj1._h - obj1.get_baseline(),
554
+ obj2._h - obj2.get_baseline()
555
+ )
556
+
557
+ def width(self):
558
+ r"""
559
+ Return the length (width) of the ASCII art object.
560
+
561
+ OUTPUT: integer; the number of characters in each line
562
+
563
+ TESTS::
564
+
565
+ sage: from sage.typeset.ascii_art import AsciiArt
566
+ sage: p3 = AsciiArt([" * ", "***"])
567
+ sage: len(p3), p3.width(), p3.height()
568
+ (3, 3, 2)
569
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
570
+ sage: len(p5), p5.width(), p5.height()
571
+ (5, 5, 3)
572
+ """
573
+ return self._l
574
+
575
+ __len__ = width
576
+
577
+ def height(self):
578
+ r"""
579
+ Return the height of the ASCII art object.
580
+
581
+ OUTPUT: integer; the number of lines
582
+
583
+ TESTS::
584
+
585
+ sage: from sage.typeset.ascii_art import AsciiArt
586
+ sage: p3 = AsciiArt([" * ", "***"])
587
+ sage: p3.height()
588
+ 2
589
+ sage: p5 = AsciiArt([" * ", " * * ", "*****"])
590
+ sage: p5.height()
591
+ 3
592
+ """
593
+ return self._h
594
+
595
+ def __add__(self, Nelt):
596
+ r"""
597
+ Concatenate two character art objects.
598
+
599
+ By default, when two objects are concatenated, the new one will be
600
+ splittable between both.
601
+
602
+ If the baseline is defined, the concatenation is computed such that the
603
+ new baseline coincides with the olders.
604
+
605
+ For example, let `T` be a tree with its baseline ascii art
606
+ representation in the middle::
607
+
608
+ o
609
+ \
610
+ o
611
+ / \
612
+ o o
613
+
614
+ and let `M` be a matrix with its baseline ascii art representation at
615
+ the middle two::
616
+
617
+ [1 2 3]
618
+ [4 5 6]
619
+ [7 8 9]
620
+
621
+ then the concatenation of both will give::
622
+
623
+ o
624
+ \ [1 2 3]
625
+ o [4 5 6]
626
+ / \ [7 8 9]
627
+ o o
628
+
629
+ Since :issue:`28527`, the baseline must always be a number.
630
+
631
+ TESTS::
632
+
633
+ sage: from sage.typeset.ascii_art import AsciiArt
634
+ sage: l5 = AsciiArt(lines=['|' for _ in range(5)], baseline=2); l5
635
+ |
636
+ |
637
+ |
638
+ |
639
+ |
640
+ sage: l3 = AsciiArt(lines=['|' for _ in range(3)], baseline=1); l3
641
+ |
642
+ |
643
+ |
644
+ sage: l3 + l5
645
+ |
646
+ ||
647
+ ||
648
+ ||
649
+ |
650
+ sage: l5 + l3
651
+ |
652
+ ||
653
+ ||
654
+ ||
655
+ |
656
+ sage: l5._baseline = 0
657
+ sage: l5 + l3
658
+ |
659
+ |
660
+ |
661
+ ||
662
+ ||
663
+ |
664
+ sage: l5._baseline = 4
665
+ sage: l5 + l3
666
+ |
667
+ ||
668
+ ||
669
+ |
670
+ |
671
+ |
672
+ sage: l3._baseline = 0
673
+ sage: l3 + l5
674
+ |
675
+ |
676
+ ||
677
+ |
678
+ |
679
+ |
680
+ |
681
+ """
682
+ new_matrix = []
683
+ new_h = self.__class__._compute_new_h(self, Nelt)
684
+ new_baseline = self.__class__._compute_new_baseline(self, Nelt)
685
+
686
+ if self._baseline is not None and Nelt._baseline is not None:
687
+ # left treatment
688
+ new_matrix.extend(line + " " * (self._l - len(line))
689
+ for line in self._matrix)
690
+
691
+ if new_h > self._h:
692
+ # | new_h > self._h
693
+ # | new_baseline > self._baseline
694
+ # ||<-- baseline number of white lines at the bottom
695
+ # | } :: Nelt._baseline - self._baseline
696
+ # | }
697
+ if new_baseline > self._baseline:
698
+ l_space = " " * self._l
699
+ new_matrix.extend(l_space
700
+ for k in range(new_baseline - self._baseline))
701
+ # | } new_h > self._h
702
+ # | } new_h - new_baseline > self._h - self._baseline
703
+ # ||<-- baseline number of white lines at the top
704
+ # || :: new_h - new_baseline - self._h + self._baseline
705
+ # ||
706
+ # |
707
+ # |
708
+ if new_h - new_baseline > self._h - self._baseline:
709
+ for _ in range((new_h - new_baseline) - (self._h - self._baseline)):
710
+ new_matrix.insert(0, " " * self._l)
711
+
712
+ # right treatment
713
+ i = 0
714
+ if new_h > Nelt._h:
715
+ # | } new_h > Nelt._h
716
+ # | } new_h - new_baseline > Nelt._h - self._baseline
717
+ # ||<-- baseline number of white lines at the top
718
+ # || :: new_h - new_baseline - Nelt._h + Nelt._baseline
719
+ # ||
720
+ # ||
721
+ # |
722
+ i = max(new_h - new_baseline - Nelt._h + Nelt._baseline, 0)
723
+ for j in range(Nelt._h):
724
+ new_matrix[i + j] += Nelt._matrix[j]
725
+ else:
726
+ new_matrix.extend(line + " " * (self._l - len(line))
727
+ for line in self._matrix)
728
+ for i, line_i in enumerate(Nelt._matrix):
729
+ if i == len(new_matrix):
730
+ new_matrix.append(" " * self._l + line_i)
731
+ else:
732
+ new_matrix[i] += line_i
733
+
734
+ # breakpoint
735
+ new_breakpoints = list(self._breakpoints)
736
+ if self._l and Nelt._l:
737
+ new_breakpoints.append(self._l)
738
+ new_breakpoints.extend(_shifted_breakpoints(Nelt._breakpoints,
739
+ self._l))
740
+ return self.__class__(
741
+ lines=new_matrix,
742
+ breakpoints=new_breakpoints,
743
+ baseline=new_baseline,
744
+ )
745
+
746
+ def __mul__(self, Nelt):
747
+ r"""
748
+ Stack two character art objects vertically.
749
+
750
+ TESTS::
751
+
752
+ sage: from sage.typeset.ascii_art import AsciiArt
753
+ sage: cub = AsciiArt(lines=['***' for _ in range(3)]); cub
754
+ ***
755
+ ***
756
+ ***
757
+ sage: pyr = AsciiArt(lines=[' ^ ', '/ \\', '---']); pyr
758
+ ^
759
+ / \
760
+ ---
761
+ sage: cub * pyr
762
+ ***
763
+ ***
764
+ ***
765
+ ^
766
+ / \
767
+ ---
768
+ """
769
+ new_repr = self.__class__(self._matrix + Nelt._matrix)
770
+ return new_repr
771
+
772
+
773
+ def _shifted_breakpoints(breakpoints, offset):
774
+ """
775
+ Return an iterator that shifts all breakpoints by an offset.
776
+
777
+ TESTS::
778
+
779
+ sage: b = ascii_art([[1, 2, 3], [4, 5, 6]])._breakpoints; b
780
+ [(2, [4, 7]), 14, (15, [4, 7])]
781
+ sage: from sage.typeset.character_art import _shifted_breakpoints
782
+ sage: list(_shifted_breakpoints(b, 10))
783
+ [(12, [4, 7]), 24, (25, [4, 7])]
784
+ """
785
+ for bp in breakpoints:
786
+ if isinstance(bp, tuple):
787
+ yield bp[0] + offset, bp[1]
788
+ else:
789
+ yield bp + offset