passagemath-categories 10.6.44__cp310-cp310-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. passagemath_categories/__init__.py +3 -0
  2. passagemath_categories-10.6.44.dist-info/DELVEWHEEL +2 -0
  3. passagemath_categories-10.6.44.dist-info/METADATA +157 -0
  4. passagemath_categories-10.6.44.dist-info/RECORD +719 -0
  5. passagemath_categories-10.6.44.dist-info/WHEEL +5 -0
  6. passagemath_categories-10.6.44.dist-info/top_level.txt +3 -0
  7. passagemath_categories.libs/libgmp-10-98b8b97e0a62cfb2d4dd4b0f18b70bdd.dll +0 -0
  8. passagemath_categories.libs/msvcp140-9cb625fcbc2fbbd6fca1aee8b24b0ebe.dll +0 -0
  9. sage/all__sagemath_categories.py +37 -0
  10. sage/arith/all.py +38 -0
  11. sage/arith/constants.pxd +27 -0
  12. sage/arith/functions.cp310-win_arm64.pyd +0 -0
  13. sage/arith/functions.pxd +4 -0
  14. sage/arith/functions.pyx +221 -0
  15. sage/arith/misc.py +6552 -0
  16. sage/arith/multi_modular.cp310-win_arm64.pyd +0 -0
  17. sage/arith/multi_modular.pxd +39 -0
  18. sage/arith/multi_modular.pyx +994 -0
  19. sage/arith/rational_reconstruction.cp310-win_arm64.pyd +0 -0
  20. sage/arith/rational_reconstruction.pxd +4 -0
  21. sage/arith/rational_reconstruction.pyx +115 -0
  22. sage/arith/srange.cp310-win_arm64.pyd +0 -0
  23. sage/arith/srange.pyx +571 -0
  24. sage/calculus/all__sagemath_categories.py +2 -0
  25. sage/calculus/functional.py +481 -0
  26. sage/calculus/functions.py +151 -0
  27. sage/categories/additive_groups.py +73 -0
  28. sage/categories/additive_magmas.py +1044 -0
  29. sage/categories/additive_monoids.py +114 -0
  30. sage/categories/additive_semigroups.py +184 -0
  31. sage/categories/affine_weyl_groups.py +238 -0
  32. sage/categories/algebra_ideals.py +95 -0
  33. sage/categories/algebra_modules.py +96 -0
  34. sage/categories/algebras.py +349 -0
  35. sage/categories/algebras_with_basis.py +377 -0
  36. sage/categories/all.py +160 -0
  37. sage/categories/aperiodic_semigroups.py +29 -0
  38. sage/categories/associative_algebras.py +47 -0
  39. sage/categories/bialgebras.py +101 -0
  40. sage/categories/bialgebras_with_basis.py +414 -0
  41. sage/categories/bimodules.py +206 -0
  42. sage/categories/chain_complexes.py +268 -0
  43. sage/categories/classical_crystals.py +480 -0
  44. sage/categories/coalgebras.py +405 -0
  45. sage/categories/coalgebras_with_basis.py +232 -0
  46. sage/categories/coercion_methods.cp310-win_arm64.pyd +0 -0
  47. sage/categories/coercion_methods.pyx +52 -0
  48. sage/categories/commutative_additive_groups.py +104 -0
  49. sage/categories/commutative_additive_monoids.py +45 -0
  50. sage/categories/commutative_additive_semigroups.py +48 -0
  51. sage/categories/commutative_algebra_ideals.py +87 -0
  52. sage/categories/commutative_algebras.py +94 -0
  53. sage/categories/commutative_ring_ideals.py +58 -0
  54. sage/categories/commutative_rings.py +736 -0
  55. sage/categories/complete_discrete_valuation.py +293 -0
  56. sage/categories/complex_reflection_groups.py +145 -0
  57. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  58. sage/categories/coxeter_group_algebras.py +186 -0
  59. sage/categories/coxeter_groups.py +3402 -0
  60. sage/categories/crystals.py +2628 -0
  61. sage/categories/cw_complexes.py +216 -0
  62. sage/categories/dedekind_domains.py +137 -0
  63. sage/categories/discrete_valuation.py +325 -0
  64. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  65. sage/categories/division_rings.py +114 -0
  66. sage/categories/domains.py +95 -0
  67. sage/categories/drinfeld_modules.py +789 -0
  68. sage/categories/dual.py +42 -0
  69. sage/categories/enumerated_sets.py +1146 -0
  70. sage/categories/euclidean_domains.py +271 -0
  71. sage/categories/examples/algebras_with_basis.py +102 -0
  72. sage/categories/examples/all.py +1 -0
  73. sage/categories/examples/commutative_additive_monoids.py +130 -0
  74. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  75. sage/categories/examples/coxeter_groups.py +8 -0
  76. sage/categories/examples/crystals.py +236 -0
  77. sage/categories/examples/cw_complexes.py +163 -0
  78. sage/categories/examples/facade_sets.py +187 -0
  79. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  80. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  81. sage/categories/examples/finite_coxeter_groups.py +252 -0
  82. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  83. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  84. sage/categories/examples/finite_enumerated_sets.py +208 -0
  85. sage/categories/examples/finite_monoids.py +150 -0
  86. sage/categories/examples/finite_semigroups.py +190 -0
  87. sage/categories/examples/finite_weyl_groups.py +191 -0
  88. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  89. sage/categories/examples/graded_modules_with_basis.py +168 -0
  90. sage/categories/examples/graphs.py +122 -0
  91. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  92. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  93. sage/categories/examples/lie_algebras.py +352 -0
  94. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  95. sage/categories/examples/magmas.py +162 -0
  96. sage/categories/examples/manifolds.py +94 -0
  97. sage/categories/examples/monoids.py +144 -0
  98. sage/categories/examples/posets.py +178 -0
  99. sage/categories/examples/semigroups.py +580 -0
  100. sage/categories/examples/semigroups_cython.cp310-win_arm64.pyd +0 -0
  101. sage/categories/examples/semigroups_cython.pyx +221 -0
  102. sage/categories/examples/semirings.py +249 -0
  103. sage/categories/examples/sets_cat.py +706 -0
  104. sage/categories/examples/sets_with_grading.py +101 -0
  105. sage/categories/examples/with_realizations.py +542 -0
  106. sage/categories/fields.py +991 -0
  107. sage/categories/filtered_algebras.py +63 -0
  108. sage/categories/filtered_algebras_with_basis.py +548 -0
  109. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  110. sage/categories/filtered_modules.py +210 -0
  111. sage/categories/filtered_modules_with_basis.py +1209 -0
  112. sage/categories/finite_complex_reflection_groups.py +1506 -0
  113. sage/categories/finite_coxeter_groups.py +1138 -0
  114. sage/categories/finite_crystals.py +103 -0
  115. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  116. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  118. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  119. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  120. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  121. sage/categories/finite_dimensional_modules_with_basis.py +1566 -0
  122. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  123. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  124. sage/categories/finite_enumerated_sets.py +769 -0
  125. sage/categories/finite_fields.py +252 -0
  126. sage/categories/finite_groups.py +256 -0
  127. sage/categories/finite_lattice_posets.py +242 -0
  128. sage/categories/finite_monoids.py +316 -0
  129. sage/categories/finite_permutation_groups.py +339 -0
  130. sage/categories/finite_posets.py +1994 -0
  131. sage/categories/finite_semigroups.py +136 -0
  132. sage/categories/finite_sets.py +93 -0
  133. sage/categories/finite_weyl_groups.py +39 -0
  134. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  135. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  136. sage/categories/finitely_generated_magmas.py +57 -0
  137. sage/categories/finitely_generated_semigroups.py +214 -0
  138. sage/categories/function_fields.py +76 -0
  139. sage/categories/g_sets.py +77 -0
  140. sage/categories/gcd_domains.py +65 -0
  141. sage/categories/generalized_coxeter_groups.py +94 -0
  142. sage/categories/graded_algebras.py +85 -0
  143. sage/categories/graded_algebras_with_basis.py +258 -0
  144. sage/categories/graded_bialgebras.py +32 -0
  145. sage/categories/graded_bialgebras_with_basis.py +32 -0
  146. sage/categories/graded_coalgebras.py +65 -0
  147. sage/categories/graded_coalgebras_with_basis.py +51 -0
  148. sage/categories/graded_hopf_algebras.py +41 -0
  149. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  150. sage/categories/graded_lie_algebras.py +91 -0
  151. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  152. sage/categories/graded_lie_conformal_algebras.py +74 -0
  153. sage/categories/graded_modules.py +133 -0
  154. sage/categories/graded_modules_with_basis.py +329 -0
  155. sage/categories/graphs.py +138 -0
  156. sage/categories/group_algebras.py +430 -0
  157. sage/categories/groupoid.py +94 -0
  158. sage/categories/groups.py +667 -0
  159. sage/categories/h_trivial_semigroups.py +64 -0
  160. sage/categories/hecke_modules.py +185 -0
  161. sage/categories/highest_weight_crystals.py +980 -0
  162. sage/categories/hopf_algebras.py +219 -0
  163. sage/categories/hopf_algebras_with_basis.py +309 -0
  164. sage/categories/infinite_enumerated_sets.py +115 -0
  165. sage/categories/integral_domains.py +203 -0
  166. sage/categories/j_trivial_semigroups.py +29 -0
  167. sage/categories/kac_moody_algebras.py +82 -0
  168. sage/categories/kahler_algebras.py +203 -0
  169. sage/categories/l_trivial_semigroups.py +63 -0
  170. sage/categories/lambda_bracket_algebras.py +280 -0
  171. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  172. sage/categories/lattice_posets.py +89 -0
  173. sage/categories/left_modules.py +49 -0
  174. sage/categories/lie_algebras.py +1070 -0
  175. sage/categories/lie_algebras_with_basis.py +261 -0
  176. sage/categories/lie_conformal_algebras.py +350 -0
  177. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  178. sage/categories/lie_groups.py +73 -0
  179. sage/categories/loop_crystals.py +1290 -0
  180. sage/categories/magmas.py +1189 -0
  181. sage/categories/magmas_and_additive_magmas.py +149 -0
  182. sage/categories/magmatic_algebras.py +365 -0
  183. sage/categories/manifolds.py +352 -0
  184. sage/categories/matrix_algebras.py +40 -0
  185. sage/categories/metric_spaces.py +387 -0
  186. sage/categories/modular_abelian_varieties.py +78 -0
  187. sage/categories/modules.py +989 -0
  188. sage/categories/modules_with_basis.py +2985 -0
  189. sage/categories/monoid_algebras.py +38 -0
  190. sage/categories/monoids.py +739 -0
  191. sage/categories/noetherian_rings.py +87 -0
  192. sage/categories/number_fields.py +242 -0
  193. sage/categories/ore_modules.py +189 -0
  194. sage/categories/partially_ordered_monoids.py +49 -0
  195. sage/categories/permutation_groups.py +63 -0
  196. sage/categories/pointed_sets.py +42 -0
  197. sage/categories/polyhedra.py +74 -0
  198. sage/categories/poor_man_map.py +270 -0
  199. sage/categories/posets.py +722 -0
  200. sage/categories/principal_ideal_domains.py +270 -0
  201. sage/categories/quantum_group_representations.py +543 -0
  202. sage/categories/quotient_fields.py +728 -0
  203. sage/categories/r_trivial_semigroups.py +45 -0
  204. sage/categories/regular_crystals.py +898 -0
  205. sage/categories/regular_supercrystals.py +170 -0
  206. sage/categories/right_modules.py +49 -0
  207. sage/categories/ring_ideals.py +74 -0
  208. sage/categories/rings.py +1904 -0
  209. sage/categories/rngs.py +175 -0
  210. sage/categories/schemes.py +393 -0
  211. sage/categories/semigroups.py +1060 -0
  212. sage/categories/semirings.py +71 -0
  213. sage/categories/semisimple_algebras.py +114 -0
  214. sage/categories/sets_with_grading.py +235 -0
  215. sage/categories/shephard_groups.py +43 -0
  216. sage/categories/signed_tensor.py +120 -0
  217. sage/categories/simplicial_complexes.py +134 -0
  218. sage/categories/simplicial_sets.py +1206 -0
  219. sage/categories/super_algebras.py +149 -0
  220. sage/categories/super_algebras_with_basis.py +144 -0
  221. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  222. sage/categories/super_lie_conformal_algebras.py +193 -0
  223. sage/categories/super_modules.py +229 -0
  224. sage/categories/super_modules_with_basis.py +193 -0
  225. sage/categories/supercommutative_algebras.py +99 -0
  226. sage/categories/supercrystals.py +406 -0
  227. sage/categories/tensor.py +110 -0
  228. sage/categories/topological_spaces.py +170 -0
  229. sage/categories/triangular_kac_moody_algebras.py +439 -0
  230. sage/categories/tutorial.py +58 -0
  231. sage/categories/unique_factorization_domains.py +318 -0
  232. sage/categories/unital_algebras.py +426 -0
  233. sage/categories/vector_bundles.py +159 -0
  234. sage/categories/vector_spaces.py +357 -0
  235. sage/categories/weyl_groups.py +853 -0
  236. sage/combinat/all__sagemath_categories.py +34 -0
  237. sage/combinat/backtrack.py +180 -0
  238. sage/combinat/combinat.py +2269 -0
  239. sage/combinat/combinat_cython.cp310-win_arm64.pyd +0 -0
  240. sage/combinat/combinat_cython.pxd +6 -0
  241. sage/combinat/combinat_cython.pyx +390 -0
  242. sage/combinat/combination.py +796 -0
  243. sage/combinat/combinatorial_map.py +416 -0
  244. sage/combinat/composition.py +2192 -0
  245. sage/combinat/dlx.py +510 -0
  246. sage/combinat/integer_lists/__init__.py +7 -0
  247. sage/combinat/integer_lists/base.cp310-win_arm64.pyd +0 -0
  248. sage/combinat/integer_lists/base.pxd +16 -0
  249. sage/combinat/integer_lists/base.pyx +713 -0
  250. sage/combinat/integer_lists/invlex.cp310-win_arm64.pyd +0 -0
  251. sage/combinat/integer_lists/invlex.pxd +4 -0
  252. sage/combinat/integer_lists/invlex.pyx +1650 -0
  253. sage/combinat/integer_lists/lists.py +328 -0
  254. sage/combinat/integer_lists/nn.py +48 -0
  255. sage/combinat/integer_vector.py +1818 -0
  256. sage/combinat/integer_vector_weighted.py +413 -0
  257. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  258. sage/combinat/matrices/dancing_links.cp310-win_arm64.pyd +0 -0
  259. sage/combinat/matrices/dancing_links.pyx +1159 -0
  260. sage/combinat/matrices/dancing_links_c.h +380 -0
  261. sage/combinat/matrices/dlxcpp.py +136 -0
  262. sage/combinat/partition.py +10070 -0
  263. sage/combinat/partitions.cp310-win_arm64.pyd +0 -0
  264. sage/combinat/partitions.pyx +743 -0
  265. sage/combinat/permutation.py +10168 -0
  266. sage/combinat/permutation_cython.cp310-win_arm64.pyd +0 -0
  267. sage/combinat/permutation_cython.pxd +11 -0
  268. sage/combinat/permutation_cython.pyx +407 -0
  269. sage/combinat/q_analogues.py +1090 -0
  270. sage/combinat/ranker.py +268 -0
  271. sage/combinat/subset.py +1561 -0
  272. sage/combinat/subsets_hereditary.py +202 -0
  273. sage/combinat/subsets_pairwise.py +184 -0
  274. sage/combinat/tools.py +63 -0
  275. sage/combinat/tuple.py +348 -0
  276. sage/data_structures/all.py +2 -0
  277. sage/data_structures/all__sagemath_categories.py +2 -0
  278. sage/data_structures/binary_matrix.pxd +138 -0
  279. sage/data_structures/binary_search.cp310-win_arm64.pyd +0 -0
  280. sage/data_structures/binary_search.pxd +3 -0
  281. sage/data_structures/binary_search.pyx +66 -0
  282. sage/data_structures/bitset.cp310-win_arm64.pyd +0 -0
  283. sage/data_structures/bitset.pxd +40 -0
  284. sage/data_structures/bitset.pyx +2385 -0
  285. sage/data_structures/bitset_base.cp310-win_arm64.pyd +0 -0
  286. sage/data_structures/bitset_base.pxd +926 -0
  287. sage/data_structures/bitset_base.pyx +117 -0
  288. sage/data_structures/bitset_intrinsics.h +487 -0
  289. sage/data_structures/blas_dict.cp310-win_arm64.pyd +0 -0
  290. sage/data_structures/blas_dict.pxd +12 -0
  291. sage/data_structures/blas_dict.pyx +469 -0
  292. sage/data_structures/list_of_pairs.cp310-win_arm64.pyd +0 -0
  293. sage/data_structures/list_of_pairs.pxd +16 -0
  294. sage/data_structures/list_of_pairs.pyx +122 -0
  295. sage/data_structures/mutable_poset.py +3312 -0
  296. sage/data_structures/pairing_heap.cp310-win_arm64.pyd +0 -0
  297. sage/data_structures/pairing_heap.h +346 -0
  298. sage/data_structures/pairing_heap.pxd +88 -0
  299. sage/data_structures/pairing_heap.pyx +1464 -0
  300. sage/data_structures/sparse_bitset.pxd +62 -0
  301. sage/data_structures/stream.py +5070 -0
  302. sage/databases/all__sagemath_categories.py +7 -0
  303. sage/databases/sql_db.py +2236 -0
  304. sage/ext/all__sagemath_categories.py +3 -0
  305. sage/ext/fast_callable.cp310-win_arm64.pyd +0 -0
  306. sage/ext/fast_callable.pxd +4 -0
  307. sage/ext/fast_callable.pyx +2746 -0
  308. sage/ext/fast_eval.cp310-win_arm64.pyd +0 -0
  309. sage/ext/fast_eval.pxd +1 -0
  310. sage/ext/fast_eval.pyx +102 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +320 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cp310-win_arm64.pyd +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cp310-win_arm64.pyd +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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 +77 -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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +15 -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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +67 -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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cp310-win_arm64.pyd +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2088 -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.cp310-win_arm64.pyd +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.cp310-win_arm64.pyd +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cp310-win_arm64.pyd +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,5 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ cdef class ContainChildren():
3
+ cdef int parentpid
4
+ cdef int exitcode, exceptcode
5
+ cdef bint silent
@@ -0,0 +1,320 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Utilities for subprocess management
4
+ """
5
+
6
+ # ***************************************************************************
7
+ # Copyright (C) 2015 Jeroen Demeyer <jdemeyer@cage.ugent.be>
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 2 of the License, or
12
+ # (at your option) any later version.
13
+ # https://www.gnu.org/licenses/
14
+ # ***************************************************************************
15
+
16
+ import errno
17
+ import signal
18
+ import sys
19
+
20
+ from contextlib import contextmanager
21
+
22
+ IF UNAME_SYSNAME == "Linux" or UNAME_SYSNAME == "Darwin":
23
+
24
+ from posix.unistd cimport getpid, _exit
25
+
26
+ from cysignals.pselect import PSelecter
27
+ from cysignals.pysignals import changesignal
28
+
29
+ ELSE:
30
+
31
+ def getpid():
32
+ return 0
33
+
34
+ def _exit():
35
+ sys.exit(0)
36
+
37
+ @contextmanager
38
+ def PSelecter(*args):
39
+ yield
40
+
41
+ @contextmanager
42
+ def changesignal(*args):
43
+ yield
44
+
45
+
46
+ cdef class ContainChildren():
47
+ """
48
+ Context manager which will ensure that all forked child processes
49
+ will be forced to exit if they try to exit the context.
50
+
51
+ This can be used as a guard against race conditions, where a child
52
+ process wants to ``fork`` and ``exec`` but it gets interrupted after
53
+ the ``fork`` but before the ``exec``. In such situations, the child
54
+ would raise ``KeyboardInterrupt`` and execute code which is really
55
+ meant for the parent process.
56
+
57
+ INPUT:
58
+
59
+ - ``exitcode`` -- integer (default: 0); exit code to use when a
60
+ child process tries to exit the with block normally (not due to
61
+ an exception)
62
+
63
+ - ``exceptcode`` -- integer (default: 1); exit code to use when a
64
+ child process tries to exit the with block due to an exception
65
+
66
+ - ``silent`` -- boolean (default: ``False``); if ``False``, print
67
+ exceptions raised by the child process
68
+
69
+ EXAMPLES::
70
+
71
+ sage: from sage.interfaces.process import ContainChildren
72
+ sage: pid = os.getpid()
73
+ sage: with ContainChildren():
74
+ ....: child = os.fork()
75
+ sage: assert pid == os.getpid() # We are the parent process
76
+
77
+ By default, exceptions raised by the child process are printed::
78
+
79
+ sage: with ContainChildren():
80
+ ....: child = os.fork()
81
+ ....: if child == 0:
82
+ ....: raise RuntimeError("Exception raised by child")
83
+ ....: _ = os.waitpid(child, 0r)
84
+ Exception raised by child process with pid=...:
85
+ Traceback (most recent call last):
86
+ ...
87
+ RuntimeError: Exception raised by child
88
+
89
+ The same example with ``silent=True`` does not show the exception::
90
+
91
+ sage: with ContainChildren(silent=True):
92
+ ....: child = os.fork()
93
+ ....: if child == 0:
94
+ ....: raise RuntimeError("Exception raised by child")
95
+ ....: _ = os.waitpid(child, 0r)
96
+ """
97
+ def __init__(self, exitcode=0, exceptcode=1, silent=False):
98
+ """
99
+ TESTS:
100
+
101
+ Check that the exit codes work properly::
102
+
103
+ sage: from sage.interfaces.process import ContainChildren
104
+ sage: with ContainChildren(exitcode=11):
105
+ ....: child = os.fork()
106
+ sage: pid, st = os.waitpid(child, 0r)
107
+ sage: os.WEXITSTATUS(st)
108
+ 11
109
+ sage: with ContainChildren(exceptcode=12, silent=True):
110
+ ....: child = os.fork()
111
+ ....: if child == 0:
112
+ ....: raise RuntimeError("Exception raised by child")
113
+ sage: pid, st = os.waitpid(child, 0r)
114
+ sage: os.WEXITSTATUS(st)
115
+ 12
116
+ """
117
+ self.exitcode = exitcode
118
+ self.exceptcode = exceptcode
119
+ self.silent = silent
120
+
121
+ def __enter__(self):
122
+ """
123
+ Store the current PID and flush the standard output and error
124
+ streams.
125
+
126
+ TESTS:
127
+
128
+ The flushing solves the following double-output problem::
129
+
130
+ sage: try:
131
+ ....: _ = sys.stdout.write("X ")
132
+ ....: if os.fork() == 0:
133
+ ....: _ = sys.stdout.write("Y ")
134
+ ....: sys.stdout.flush()
135
+ ....: os._exit(0)
136
+ ....: sleep(float(0.5)) # Give the child process time
137
+ ....: print("Z")
138
+ ....: finally:
139
+ ....: pass
140
+ X Y X Z
141
+
142
+ With ``ContainChildren()``, no additional flushes are needed::
143
+
144
+ sage: from sage.interfaces.process import ContainChildren
145
+ sage: try:
146
+ ....: _ = sys.stdout.write("X ")
147
+ ....: with ContainChildren():
148
+ ....: _ = sys.stdout.write("Y ")
149
+ ....: sleep(float(0.5)) # Give the child process time
150
+ ....: print("Z")
151
+ ....: finally:
152
+ ....: pass
153
+ X Y Z
154
+ """
155
+ self.parentpid = getpid()
156
+ # Since we're probably forking, it's a good idea to flush
157
+ # output streams now.
158
+ sys.stdout.flush()
159
+ sys.stderr.flush()
160
+
161
+ def __exit__(self, *exc):
162
+ """
163
+ TESTS:
164
+
165
+ Check that exceptions raised by the parent work normally::
166
+
167
+ sage: from sage.interfaces.process import ContainChildren
168
+ sage: with ContainChildren():
169
+ ....: assert os.fork() == 0
170
+ Traceback (most recent call last):
171
+ ...
172
+ AssertionError
173
+ """
174
+ cdef int pid = getpid()
175
+ if pid == self.parentpid:
176
+ # We are the parent process
177
+ return
178
+
179
+ # We are a child process!
180
+ cdef int exitcode = self.exitcode
181
+ try:
182
+ if exc[0] is not None: # Exception was raised
183
+ exitcode = self.exceptcode
184
+ if not self.silent:
185
+ sys.stderr.write("Exception raised by child process with pid=%s:\n" % pid)
186
+ import traceback
187
+ traceback.print_exception(*exc)
188
+ sys.stdout.flush()
189
+ sys.stderr.flush()
190
+ finally:
191
+ # This ensures that we can never exit this function alive.
192
+ _exit(exitcode)
193
+
194
+
195
+ @contextmanager
196
+ def terminate(sp, interval=1, signals=None):
197
+ r"""
198
+ Context manager that terminates or kills the given `subprocess.Popen`
199
+ when it is no longer needed, in case the process does not end on its
200
+ own.
201
+
202
+ Before sending signals, the standard I/O pipes are closed, which
203
+ might cause the application to quit by itself.
204
+
205
+ INPUT:
206
+
207
+ - ``sp`` -- a `subprocess.Popen` instance
208
+ - ``interval`` -- float (default: 1); interval in seconds between
209
+ termination attempts
210
+ - ``signals`` -- (list, default [signal.SIGTERM, signal.SIGKILL]) the
211
+ signals to send the process in order to terminate it
212
+
213
+ EXAMPLES:
214
+
215
+ A still-running process will be terminated upon exiting the terminate
216
+ context::
217
+
218
+ sage: import signal, sys
219
+ sage: from subprocess import Popen, PIPE
220
+ sage: from sage.interfaces.process import terminate
221
+ sage: cmd = [sys.executable, '-c', 'import sys; print("y")\n'
222
+ ....: 'sys.stdout.flush()\n'
223
+ ....: 'while True: pass']
224
+ sage: sp = Popen(cmd, stdout=PIPE, encoding='ascii')
225
+ sage: try:
226
+ ....: with terminate(sp, interval=0.2):
227
+ ....: print(sp.stdout.readline())
228
+ ....: except NotImplementedError:
229
+ ....: sp = None
230
+ y
231
+ <BLANKLINE>
232
+ sage: sp.wait() == -signal.SIGTERM
233
+ True
234
+
235
+ If for any reason the process can't be terminated normally, a ``kill()``
236
+ is attempted::
237
+
238
+ sage: cmd[2] = 'from signal import signal, SIGTERM, SIG_IGN\n' \
239
+ ....: 'import sys\n' \
240
+ ....: 'signal(SIGTERM, SIG_IGN)\n' \
241
+ ....: 'print("y"); sys.stdout.flush()\n' \
242
+ ....: 'while True: pass'
243
+ sage: sp = Popen(cmd, stdout=PIPE, encoding='ascii')
244
+ sage: try:
245
+ ....: with terminate(sp, interval=0.2):
246
+ ....: print(sp.stdout.readline())
247
+ ....: except NotImplementedError:
248
+ ....: sp = None
249
+ y
250
+ <BLANKLINE>
251
+ sage: sp.wait() == -signal.SIGKILL
252
+ True
253
+
254
+ If the process dies by itself, we don't need to wait too long::
255
+
256
+ sage: cmd = [sys.executable, '-c', 'from time import sleep; sleep(0.5)']
257
+ sage: t0 = walltime()
258
+ sage: sp = Popen(cmd)
259
+ sage: with terminate(sp, interval=5.0):
260
+ ....: pass
261
+ sage: t = walltime() - t0
262
+ sage: t <= 4.0 or t
263
+ True
264
+
265
+ If the process is already dead, nothing happens::
266
+
267
+ sage: t0 = walltime()
268
+ sage: with terminate(sp, interval=5.0):
269
+ ....: raise Exception("just testing")
270
+ sage: t = walltime() - t0
271
+ sage: t <= 4.0 or t
272
+ True
273
+ """
274
+ try:
275
+ yield sp
276
+ finally:
277
+ if signals is None:
278
+ signals = []
279
+ try:
280
+ from signal import SIGTERM
281
+ except ImportError:
282
+ pass
283
+ else:
284
+ signals.append(SIGTERM)
285
+ try:
286
+ from signal import SIGKILL
287
+ except ImportError:
288
+ pass
289
+ else:
290
+ signals.append(SIGKILL)
291
+ try:
292
+ from signal import SIGCHLD
293
+ except ImportError:
294
+ raise NotImplementedError
295
+ # This "with" block ensures that SIGCHLD will certainly
296
+ # interrupt the sel.sleep() call without race conditions.
297
+ with PSelecter([SIGCHLD]) as sel, \
298
+ changesignal(SIGCHLD, lambda *args: None):
299
+ if sp.poll() is not None:
300
+ return
301
+
302
+ for stream in [sp.stdin, sp.stdout, sp.stderr]:
303
+ try:
304
+ stream.close()
305
+ except Exception:
306
+ pass
307
+
308
+ for sig in signals:
309
+ sel.sleep(interval)
310
+ if sp.poll() is not None:
311
+ return
312
+ try:
313
+ # Try to force the process to end
314
+ sp.send_signal(sig)
315
+ except OSError as exc:
316
+ if exc.errno == errno.ESRCH:
317
+ # No such process => process is dead
318
+ return
319
+ else:
320
+ raise
@@ -0,0 +1,167 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ """
3
+ Quitting interfaces
4
+ """
5
+
6
+ ################################################################################
7
+ # Copyright (C) 2010 William Stein <wstein@gmail.com>
8
+ #
9
+ # Distributed under the terms of (any version of) the GNU
10
+ # General Public License (GPL). The full text of the GPL is available at:
11
+ #
12
+ # https://www.gnu.org/licenses/
13
+ ################################################################################
14
+
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import subprocess
19
+ import sys
20
+ from typing import TYPE_CHECKING
21
+
22
+ from sage.env import DOT_SAGE, HOSTNAME
23
+ from sage.misc.cachefunc import cached_function
24
+
25
+ if TYPE_CHECKING:
26
+ from weakref import ReferenceType
27
+
28
+ from sage.interfaces.expect import Expect
29
+
30
+
31
+ @cached_function
32
+ def sage_spawned_process_file() -> str:
33
+ """
34
+ EXAMPLES::
35
+
36
+ sage: from sage.interfaces.quit import sage_spawned_process_file
37
+ sage: len(sage_spawned_process_file()) > 1
38
+ True
39
+ """
40
+ from sage.misc.temporary_file import tmp_dir
41
+ return os.path.join(tmp_dir(), "spawned_processes")
42
+
43
+
44
+ def register_spawned_process(pid: int, cmd: str = "") -> None:
45
+ """
46
+ Write a line to the ``spawned_processes`` file with the given
47
+ ``pid`` and ``cmd``.
48
+ """
49
+ if cmd != "":
50
+ cmd = cmd.strip().split()[0]
51
+ # This is safe, since only this process writes to this file.
52
+ try:
53
+ with open(sage_spawned_process_file(), "a") as file:
54
+ file.write("%s %s\n" % (pid, cmd))
55
+ except OSError:
56
+ pass
57
+
58
+
59
+ expect_objects: list[ReferenceType[Expect]] = []
60
+
61
+
62
+ def expect_quitall(verbose: bool = False) -> None:
63
+ """
64
+ EXAMPLES::
65
+
66
+ sage: sage.interfaces.quit.expect_quitall()
67
+ sage: gp.eval('a=10') # needs sage.libs.pari
68
+ '10'
69
+ sage: gp('a') # needs sage.libs.pari
70
+ 10
71
+ sage: sage.interfaces.quit.expect_quitall()
72
+ sage: gp('a') # needs sage.libs.pari
73
+ a
74
+ sage: sage.interfaces.quit.expect_quitall(verbose=True) # needs sage.libs.pari
75
+ Exiting PARI/GP interpreter with PID ... running .../gp --fast --emacs --quiet --stacksize 10000000
76
+ """
77
+ for reference in expect_objects:
78
+ process = reference()
79
+ if process is not None:
80
+ try:
81
+ process.quit(verbose=verbose)
82
+ except RuntimeError:
83
+ pass
84
+ kill_spawned_jobs()
85
+
86
+
87
+ def kill_spawned_jobs(verbose: bool = False):
88
+ """
89
+ INPUT:
90
+
91
+ - ``verbose`` -- boolean (default: ``False``); if ``True``, display a
92
+ message each time a process is sent a kill signal
93
+
94
+ EXAMPLES::
95
+
96
+ sage: gp.eval('a=10') # needs sage.libs.pari
97
+ '10'
98
+ sage: sage.interfaces.quit.kill_spawned_jobs(verbose=False)
99
+ sage: sage.interfaces.quit.expect_quitall()
100
+ sage: gp.eval('a=10') # needs sage.libs.pari
101
+ '10'
102
+ sage: sage.interfaces.quit.kill_spawned_jobs(verbose=True) # needs sage.libs.pari
103
+ Killing spawned job ...
104
+
105
+ After doing the above, we do the following to avoid confusion in other doctests::
106
+
107
+ sage: sage.interfaces.quit.expect_quitall()
108
+ """
109
+ fname = sage_spawned_process_file()
110
+ if not os.path.exists(fname):
111
+ return
112
+
113
+ with open(fname) as file:
114
+ for line in file:
115
+ i = line.find(" ")
116
+ pid = line[:i].strip()
117
+ try:
118
+ if verbose:
119
+ print("Killing spawned job %s" % pid)
120
+ if sys.platform == "win32":
121
+ # From https://stackoverflow.com/a/47756757/873661
122
+ subprocess.call(["taskkill", "/F", "/T", "/PID", pid])
123
+ else:
124
+ os.killpg(int(pid), 9)
125
+ except OSError:
126
+ pass
127
+
128
+
129
+ def is_running(pid: int) -> bool:
130
+ """
131
+ Return ``True`` if and only if there is a process with id pid running.
132
+ """
133
+ try:
134
+ os.kill(int(pid), 0)
135
+ return True
136
+ except (OSError, ValueError):
137
+ return False
138
+
139
+
140
+ def invalidate_all() -> None:
141
+ """
142
+ Invalidate all of the expect interfaces.
143
+
144
+ This is used, e.g., by the fork-based ``@parallel`` decorator.
145
+
146
+ EXAMPLES::
147
+
148
+ sage: # needs sage.libs.pari sage.symbolic
149
+ sage: a = maxima(2); b = gp(3)
150
+ sage: a, b
151
+ (2, 3)
152
+ sage: sage.interfaces.quit.invalidate_all()
153
+ sage: a
154
+ (invalid Maxima object -- The maxima session in which this object was defined is no longer running.)
155
+ sage: b
156
+ (invalid PARI/GP interpreter object -- The pari session in which this object was defined is no longer running.)
157
+
158
+ However the maxima and gp sessions should still work out, though with their state reset::
159
+
160
+ sage: a = maxima(2); b = gp(3) # needs sage.libs.pari sage.symbolic
161
+ sage: a, b # needs sage.libs.pari sage.symbolic
162
+ (2, 3)
163
+ """
164
+ for reference in expect_objects:
165
+ process = reference()
166
+ if process:
167
+ process.detach()