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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
sage/parallel/all.py
ADDED
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Decorate interface for parallel computation
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import types
|
|
7
|
+
|
|
8
|
+
from sage.rings.integer import Integer
|
|
9
|
+
|
|
10
|
+
from .reference import parallel_iter as p_iter_reference
|
|
11
|
+
from . import multiprocessing_sage
|
|
12
|
+
from sage.misc.instancedoc import instancedoc
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def normalize_input(a):
|
|
16
|
+
r"""
|
|
17
|
+
Convert ``a`` to a pair ``(args, kwds)`` using some rules:
|
|
18
|
+
|
|
19
|
+
- if already of that form, leave that way.
|
|
20
|
+
- if ``a`` is a tuple make ``(a,{})``
|
|
21
|
+
- if ``a`` is a dict make ``(tuple(),a)``
|
|
22
|
+
- otherwise make ``((a,),{})``
|
|
23
|
+
|
|
24
|
+
INPUT:
|
|
25
|
+
|
|
26
|
+
- ``a`` -- object
|
|
27
|
+
|
|
28
|
+
OUTPUT:
|
|
29
|
+
|
|
30
|
+
- ``args`` -- tuple
|
|
31
|
+
- ``kwds`` -- dictionary
|
|
32
|
+
|
|
33
|
+
EXAMPLES::
|
|
34
|
+
|
|
35
|
+
sage: sage.parallel.decorate.normalize_input( (2, {3:4}) )
|
|
36
|
+
((2, {3: 4}), {})
|
|
37
|
+
sage: sage.parallel.decorate.normalize_input( (2,3) )
|
|
38
|
+
((2, 3), {})
|
|
39
|
+
sage: sage.parallel.decorate.normalize_input( {3:4} )
|
|
40
|
+
((), {3: 4})
|
|
41
|
+
sage: sage.parallel.decorate.normalize_input( 5 )
|
|
42
|
+
((5,), {})
|
|
43
|
+
"""
|
|
44
|
+
if isinstance(a, tuple) and len(a) == 2 and isinstance(a[0], tuple) and isinstance(a[1], dict):
|
|
45
|
+
return a
|
|
46
|
+
elif isinstance(a, tuple):
|
|
47
|
+
return (a, {})
|
|
48
|
+
elif isinstance(a, dict):
|
|
49
|
+
return (tuple(), a)
|
|
50
|
+
else:
|
|
51
|
+
return ((a,), {})
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class Parallel:
|
|
55
|
+
r"""
|
|
56
|
+
Create a ``parallel``-decorated function.
|
|
57
|
+
This is the object created by :func:`parallel`.
|
|
58
|
+
"""
|
|
59
|
+
def __init__(self, p_iter='fork', ncpus=None, **kwds):
|
|
60
|
+
"""
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: P = sage.parallel.decorate.Parallel(); P
|
|
64
|
+
<sage.parallel.decorate.Parallel object at 0x...>
|
|
65
|
+
"""
|
|
66
|
+
# The default p_iter is currently the 'fork' implementation.
|
|
67
|
+
# This has changed.
|
|
68
|
+
|
|
69
|
+
self.p_iter = None
|
|
70
|
+
|
|
71
|
+
if isinstance(p_iter, (int, Integer)):
|
|
72
|
+
p_iter, ncpus = 'fork', p_iter
|
|
73
|
+
|
|
74
|
+
if ncpus is None:
|
|
75
|
+
from .ncpus import ncpus as compute_ncpus
|
|
76
|
+
ncpus = compute_ncpus()
|
|
77
|
+
|
|
78
|
+
if p_iter == 'fork':
|
|
79
|
+
from .use_fork import p_iter_fork
|
|
80
|
+
self.p_iter = p_iter_fork(ncpus, **kwds)
|
|
81
|
+
elif p_iter == 'multiprocessing':
|
|
82
|
+
self.p_iter = multiprocessing_sage.pyprocessing(ncpus)
|
|
83
|
+
elif p_iter == 'reference':
|
|
84
|
+
self.p_iter = p_iter_reference
|
|
85
|
+
elif isinstance(p_iter, str):
|
|
86
|
+
raise ValueError("unknown iterator '%s'" % p_iter)
|
|
87
|
+
else:
|
|
88
|
+
if self.p_iter is None:
|
|
89
|
+
self.p_iter = p_iter
|
|
90
|
+
|
|
91
|
+
def __call__(self, f):
|
|
92
|
+
r"""
|
|
93
|
+
Create a callable object that wraps ``f`` and that when called
|
|
94
|
+
with a list of inputs returns an iterator over pairs ``(x,
|
|
95
|
+
f(x))`` in possibly random order. Here ``x`` is replaced by
|
|
96
|
+
its normalized form ``(args, kwds)`` using
|
|
97
|
+
:func:`normalize_inputs`.
|
|
98
|
+
|
|
99
|
+
INPUT:
|
|
100
|
+
|
|
101
|
+
- ``f`` -- Python callable object or function
|
|
102
|
+
|
|
103
|
+
OUTPUT: decorated version of ``f``
|
|
104
|
+
|
|
105
|
+
EXAMPLES::
|
|
106
|
+
|
|
107
|
+
sage: from sage.parallel.decorate import Parallel
|
|
108
|
+
sage: p = Parallel()
|
|
109
|
+
sage: f = x^2 - 1 # needs sage.symbolic
|
|
110
|
+
sage: p(f) # needs sage.symbolic
|
|
111
|
+
<sage.parallel.decorate.ParallelFunction object at ...>
|
|
112
|
+
|
|
113
|
+
sage: P = sage.parallel.decorate.Parallel()
|
|
114
|
+
sage: def g(n, m): return n+m
|
|
115
|
+
sage: h = P(g) # indirect doctest
|
|
116
|
+
sage: list(h([(2,3)]))
|
|
117
|
+
[(((2, 3), {}), 5)]
|
|
118
|
+
"""
|
|
119
|
+
return ParallelFunction(self, f)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@instancedoc
|
|
123
|
+
class ParallelFunction:
|
|
124
|
+
"""
|
|
125
|
+
Class which parallelizes a function or class method.
|
|
126
|
+
This is typically accessed indirectly through
|
|
127
|
+
:meth:`Parallel.__call__`.
|
|
128
|
+
"""
|
|
129
|
+
def __init__(self, parallel, func):
|
|
130
|
+
"""
|
|
131
|
+
.. NOTE::
|
|
132
|
+
|
|
133
|
+
This is typically accessed indirectly through
|
|
134
|
+
:meth:`Parallel.__call__`.
|
|
135
|
+
|
|
136
|
+
INPUT:
|
|
137
|
+
|
|
138
|
+
- ``parallel`` -- a :class:`Parallel` object which controls
|
|
139
|
+
how the parallel execution will be done
|
|
140
|
+
|
|
141
|
+
- ``func`` -- Python callable object or function
|
|
142
|
+
"""
|
|
143
|
+
self.parallel = parallel
|
|
144
|
+
self.func = func
|
|
145
|
+
|
|
146
|
+
def __call__(self, *args, **kwds):
|
|
147
|
+
"""
|
|
148
|
+
EXAMPLES::
|
|
149
|
+
|
|
150
|
+
sage: from sage.parallel.decorate import Parallel
|
|
151
|
+
sage: p = Parallel()
|
|
152
|
+
sage: def f(x):
|
|
153
|
+
....: return x*x
|
|
154
|
+
sage: pf = p(f); pf
|
|
155
|
+
<sage.parallel.decorate.ParallelFunction object at ...>
|
|
156
|
+
sage: pf(2)
|
|
157
|
+
4
|
|
158
|
+
sage: sorted(pf([2,3]))
|
|
159
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
160
|
+
"""
|
|
161
|
+
if len(args) > 0 and isinstance(args[0], (list, types.GeneratorType)):
|
|
162
|
+
return self.parallel.p_iter(self.func, (normalize_input(a)
|
|
163
|
+
for a in args[0]))
|
|
164
|
+
return self.func(*args, **kwds)
|
|
165
|
+
|
|
166
|
+
def __get__(self, instance, owner):
|
|
167
|
+
"""
|
|
168
|
+
Implement part of the descriptor protocol for
|
|
169
|
+
:class:`ParallelFunction` objects.
|
|
170
|
+
|
|
171
|
+
.. NOTE::
|
|
172
|
+
|
|
173
|
+
This is the key to fixing :issue:`11461`.
|
|
174
|
+
|
|
175
|
+
EXAMPLES:
|
|
176
|
+
|
|
177
|
+
We verify that the decorated functions work correctly on
|
|
178
|
+
methods, classmethods, and staticmethods, for both the
|
|
179
|
+
parallel and non-parallel versions::
|
|
180
|
+
|
|
181
|
+
sage: class Foo():
|
|
182
|
+
....: @parallel(2)
|
|
183
|
+
....: def square(self, n):
|
|
184
|
+
....: return n*n
|
|
185
|
+
....: @parallel(2)
|
|
186
|
+
....: @classmethod
|
|
187
|
+
....: def square_classmethod(cls, n):
|
|
188
|
+
....: return n*n
|
|
189
|
+
....: @parallel(2)
|
|
190
|
+
....: @staticmethod
|
|
191
|
+
....: def square_staticmethod(n):
|
|
192
|
+
....: return n*n
|
|
193
|
+
sage: a = Foo()
|
|
194
|
+
sage: a.square(3)
|
|
195
|
+
9
|
|
196
|
+
sage: sorted(a.square([2,3]))
|
|
197
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
198
|
+
sage: a.square_classmethod(3)
|
|
199
|
+
9
|
|
200
|
+
sage: sorted(a.square_classmethod([2,3]))
|
|
201
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
202
|
+
sage: Foo.square_classmethod(3)
|
|
203
|
+
9
|
|
204
|
+
sage: sorted(Foo.square_classmethod([2,3]))
|
|
205
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
206
|
+
sage: a.square_staticmethod(3)
|
|
207
|
+
9
|
|
208
|
+
sage: sorted(a.square_staticmethod([2,3]))
|
|
209
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
210
|
+
sage: Foo.square_staticmethod(3)
|
|
211
|
+
9
|
|
212
|
+
sage: sorted(Foo.square_staticmethod([2,3]))
|
|
213
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
214
|
+
"""
|
|
215
|
+
try:
|
|
216
|
+
# If this ParallelFunction object is accessed as an
|
|
217
|
+
# attribute of a class or instance, the underlying function
|
|
218
|
+
# should be "accessed" in the same way.
|
|
219
|
+
new_func = self.func.__get__(instance, owner)
|
|
220
|
+
except AttributeError:
|
|
221
|
+
# This will happen if a non-function attribute is
|
|
222
|
+
# decorated. For example, an expression that's an
|
|
223
|
+
# attribute of a class.
|
|
224
|
+
new_func = self.func
|
|
225
|
+
return ParallelFunction(self.parallel, new_func)
|
|
226
|
+
|
|
227
|
+
def _sage_argspec_(self):
|
|
228
|
+
"""
|
|
229
|
+
Return the argument specification for this object, which is
|
|
230
|
+
just the argument specification for the underlying function.
|
|
231
|
+
See :mod:`sage.misc.sageinspect` for more information on
|
|
232
|
+
this convention.
|
|
233
|
+
|
|
234
|
+
EXAMPLES::
|
|
235
|
+
|
|
236
|
+
sage: from sage.parallel.decorate import Parallel
|
|
237
|
+
sage: p = Parallel(2)
|
|
238
|
+
sage: def f(x, y):
|
|
239
|
+
....: return x + y
|
|
240
|
+
sage: from sage.misc.sageinspect import sage_getargspec
|
|
241
|
+
sage: sage_getargspec(p(f))
|
|
242
|
+
FullArgSpec(args=['x', 'y'], varargs=None, varkw=None, defaults=None,
|
|
243
|
+
kwonlyargs=[], kwonlydefaults=None, annotations={})
|
|
244
|
+
"""
|
|
245
|
+
from sage.misc.sageinspect import sage_getargspec
|
|
246
|
+
return sage_getargspec(self.func)
|
|
247
|
+
|
|
248
|
+
def _sage_src_(self):
|
|
249
|
+
"""
|
|
250
|
+
Return the source code for this object, which is just the
|
|
251
|
+
source code for the underlying function. See
|
|
252
|
+
:mod:`sage.misc.sageinspect` for more information on this
|
|
253
|
+
convention.
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: from sage.parallel.decorate import Parallel
|
|
258
|
+
sage: p = Parallel(2)
|
|
259
|
+
sage: def f(x, y):
|
|
260
|
+
....: return x + y
|
|
261
|
+
sage: from sage.misc.sageinspect import sage_getsource
|
|
262
|
+
sage: 'return x + y' in sage_getsource(p(f))
|
|
263
|
+
True
|
|
264
|
+
"""
|
|
265
|
+
from sage.misc.sageinspect import sage_getsource
|
|
266
|
+
return sage_getsource(self.func)
|
|
267
|
+
|
|
268
|
+
def _instancedoc_(self):
|
|
269
|
+
r"""
|
|
270
|
+
Return the docstring for this object, which is just the
|
|
271
|
+
docstring for the underlying function. See
|
|
272
|
+
:mod:`sage.misc.sageinspect` for more information on this
|
|
273
|
+
convention.
|
|
274
|
+
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: from sage.parallel.decorate import Parallel
|
|
278
|
+
sage: p = Parallel(2)
|
|
279
|
+
sage: def f(x, y):
|
|
280
|
+
....: '''Test docstring'''
|
|
281
|
+
....: return x + y
|
|
282
|
+
sage: from sage.misc.sageinspect import sage_getdoc
|
|
283
|
+
sage: sage_getdoc(p(f))
|
|
284
|
+
'Test docstring\n'
|
|
285
|
+
"""
|
|
286
|
+
return self.func.__doc__
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def parallel(p_iter='fork', ncpus=None, **kwds):
|
|
290
|
+
r"""
|
|
291
|
+
This is a decorator that gives a function a parallel interface,
|
|
292
|
+
allowing it to be called with a list of inputs, whose values will
|
|
293
|
+
be computed in parallel.
|
|
294
|
+
|
|
295
|
+
.. warning::
|
|
296
|
+
|
|
297
|
+
The parallel subprocesses will not have access to data
|
|
298
|
+
created in pexpect interfaces. This behavior with respect to
|
|
299
|
+
pexpect interfaces is very important to keep in mind when
|
|
300
|
+
setting up certain computations. It's the one big limitation
|
|
301
|
+
of this decorator.
|
|
302
|
+
|
|
303
|
+
INPUT:
|
|
304
|
+
|
|
305
|
+
- ``p_iter`` -- parallel iterator function or string:
|
|
306
|
+
- ``'fork'`` -- (default) use a new forked subprocess for each input
|
|
307
|
+
- ``'multiprocessing'`` -- use multiprocessing library
|
|
308
|
+
- ``'reference'`` -- use a fake serial reference implementation
|
|
309
|
+
- ``ncpus`` -- integer; maximal number of subprocesses to use at the same time
|
|
310
|
+
- ``timeout`` -- number of seconds until each subprocess is killed (only supported
|
|
311
|
+
by ``'fork'``; zero means not at all)
|
|
312
|
+
- ``reseed_rng``: reseed the rng (random number generator) in each subprocess
|
|
313
|
+
|
|
314
|
+
.. warning::
|
|
315
|
+
|
|
316
|
+
If you use anything but ``'fork'`` above, then a whole new
|
|
317
|
+
subprocess is spawned, so none of your local state (variables,
|
|
318
|
+
certain functions, etc.) is available.
|
|
319
|
+
|
|
320
|
+
EXAMPLES:
|
|
321
|
+
|
|
322
|
+
We create a simple decoration for a simple function. The number
|
|
323
|
+
of cpus (or cores, or hardware threads) is automatically detected::
|
|
324
|
+
|
|
325
|
+
sage: @parallel
|
|
326
|
+
....: def f(n): return n*n
|
|
327
|
+
sage: f(10)
|
|
328
|
+
100
|
|
329
|
+
sage: sorted(list(f([1,2,3])))
|
|
330
|
+
[(((1,), {}), 1), (((2,), {}), 4), (((3,), {}), 9)]
|
|
331
|
+
|
|
332
|
+
We use exactly two cpus::
|
|
333
|
+
|
|
334
|
+
sage: @parallel(2)
|
|
335
|
+
....: def f(n): return n*n
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
We create a decorator that uses three subprocesses, and times out
|
|
339
|
+
individual processes after 10 seconds::
|
|
340
|
+
|
|
341
|
+
sage: @parallel(ncpus=3, timeout=10)
|
|
342
|
+
....: def fac(n): return factor(2^n-1)
|
|
343
|
+
sage: for X, Y in sorted(list(fac([101,119,151,197,209]))): print((X,Y)) # needs sage.libs.pari
|
|
344
|
+
(((101,), {}), 7432339208719 * 341117531003194129)
|
|
345
|
+
(((119,), {}), 127 * 239 * 20231 * 131071 * 62983048367 * 131105292137)
|
|
346
|
+
(((151,), {}), 18121 * 55871 * 165799 * 2332951 * 7289088383388253664437433)
|
|
347
|
+
(((197,), {}), 7487 * 26828803997912886929710867041891989490486893845712448833)
|
|
348
|
+
(((209,), {}), 23 * 89 * 524287 * 94803416684681 * 1512348937147247 * 5346950541323960232319657)
|
|
349
|
+
|
|
350
|
+
sage: @parallel('multiprocessing')
|
|
351
|
+
....: def f(N): return N^2
|
|
352
|
+
sage: v = list(f([1,2,4])); v.sort(); v
|
|
353
|
+
[(((1,), {}), 1), (((2,), {}), 4), (((4,), {}), 16)]
|
|
354
|
+
sage: @parallel('reference')
|
|
355
|
+
....: def f(N): return N^2
|
|
356
|
+
sage: v = list(f([1,2,4])); v.sort(); v
|
|
357
|
+
[(((1,), {}), 1), (((2,), {}), 4), (((4,), {}), 16)]
|
|
358
|
+
|
|
359
|
+
For functions that take multiple arguments, enclose the arguments in tuples
|
|
360
|
+
when calling the parallel function::
|
|
361
|
+
|
|
362
|
+
sage: @parallel
|
|
363
|
+
....: def f(a, b): return a*b
|
|
364
|
+
sage: for X, Y in sorted(list(f([(2,3),(3,5),(5,7)]))): print((X, Y))
|
|
365
|
+
(((2, 3), {}), 6)
|
|
366
|
+
(((3, 5), {}), 15)
|
|
367
|
+
(((5, 7), {}), 35)
|
|
368
|
+
|
|
369
|
+
For functions that take a single tuple as an argument, enclose it in an
|
|
370
|
+
additional tuple at call time, to distinguish it as the first argument,
|
|
371
|
+
as opposed to a tuple of arguments::
|
|
372
|
+
|
|
373
|
+
sage: @parallel
|
|
374
|
+
....: def firstEntry(aTuple): return aTuple[0]
|
|
375
|
+
sage: for X, Y in sorted(list(firstEntry([((1,2,3,4),),((5,6,7,8),)]))): print((X, Y))
|
|
376
|
+
((((1, 2, 3, 4),), {}), 1)
|
|
377
|
+
((((5, 6, 7, 8),), {}), 5)
|
|
378
|
+
|
|
379
|
+
The parallel decorator also works with methods, classmethods, and
|
|
380
|
+
staticmethods. Be sure to apply the parallel decorator after ("above")
|
|
381
|
+
either the ``classmethod`` or ``staticmethod`` decorators::
|
|
382
|
+
|
|
383
|
+
sage: class Foo():
|
|
384
|
+
....: @parallel(2)
|
|
385
|
+
....: def square(self, n):
|
|
386
|
+
....: return n*n
|
|
387
|
+
....: @parallel(2)
|
|
388
|
+
....: @classmethod
|
|
389
|
+
....: def square_classmethod(cls, n):
|
|
390
|
+
....: return n*n
|
|
391
|
+
sage: a = Foo()
|
|
392
|
+
sage: a.square(3)
|
|
393
|
+
9
|
|
394
|
+
sage: sorted(a.square([2,3]))
|
|
395
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
396
|
+
sage: Foo.square_classmethod(3)
|
|
397
|
+
9
|
|
398
|
+
sage: sorted(Foo.square_classmethod([2,3]))
|
|
399
|
+
[(((2,), {}), 4), (((3,), {}), 9)]
|
|
400
|
+
sage: Foo.square_classmethod(3)
|
|
401
|
+
9
|
|
402
|
+
|
|
403
|
+
By default, all subprocesses use the same random seed and therefore the same deterministic randomness.
|
|
404
|
+
For functions that should be randomized, we can reseed the random seed in each subprocess::
|
|
405
|
+
|
|
406
|
+
sage: @parallel(reseed_rng=True)
|
|
407
|
+
....: def unif(n): return ZZ.random_element(x=0, y=n)
|
|
408
|
+
sage: set_random_seed(42)
|
|
409
|
+
sage: sorted(unif([1000]*3)) # random
|
|
410
|
+
[(((1000,), {}), 444), (((1000,), {}), 597), (((1000,), {}), 640)]
|
|
411
|
+
|
|
412
|
+
.. warning::
|
|
413
|
+
|
|
414
|
+
Currently, parallel methods do not work with the
|
|
415
|
+
multiprocessing implementation.
|
|
416
|
+
"""
|
|
417
|
+
if isinstance(p_iter, types.FunctionType):
|
|
418
|
+
return Parallel()(p_iter)
|
|
419
|
+
return Parallel(p_iter, ncpus, **kwds)
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
###################################################################
|
|
423
|
+
# The @fork decorator -- evaluate a function with no side effects
|
|
424
|
+
# in memory, so the only side effects (if any) are on disk.
|
|
425
|
+
#
|
|
426
|
+
# We have both a function and a class below, so that the decorator
|
|
427
|
+
# can be used with or without options:
|
|
428
|
+
#
|
|
429
|
+
# @fork
|
|
430
|
+
# def f(...): ...
|
|
431
|
+
# and
|
|
432
|
+
# @fork(...options...):
|
|
433
|
+
# def f(...): ...
|
|
434
|
+
###################################################################
|
|
435
|
+
|
|
436
|
+
class Fork:
|
|
437
|
+
"""
|
|
438
|
+
A ``fork`` decorator class.
|
|
439
|
+
"""
|
|
440
|
+
def __init__(self, timeout=0, verbose=False):
|
|
441
|
+
"""
|
|
442
|
+
INPUT:
|
|
443
|
+
|
|
444
|
+
- ``timeout`` -- (default: 0) kill the subprocess after it has run this
|
|
445
|
+
many seconds (wall time), or if ``timeout`` is zero, do not kill it.
|
|
446
|
+
- ``verbose`` -- boolean (default: ``False``); whether to print anything about
|
|
447
|
+
what the decorator does (e.g., killing the subprocess)
|
|
448
|
+
|
|
449
|
+
EXAMPLES::
|
|
450
|
+
|
|
451
|
+
sage: sage.parallel.decorate.Fork()
|
|
452
|
+
<sage.parallel.decorate.Fork object at 0x...>
|
|
453
|
+
sage: sage.parallel.decorate.Fork(timeout=3)
|
|
454
|
+
<sage.parallel.decorate.Fork object at 0x...>
|
|
455
|
+
"""
|
|
456
|
+
self.timeout = timeout
|
|
457
|
+
self.verbose = verbose
|
|
458
|
+
|
|
459
|
+
def __call__(self, f):
|
|
460
|
+
"""
|
|
461
|
+
INPUT:
|
|
462
|
+
|
|
463
|
+
- ``f`` -- a function
|
|
464
|
+
|
|
465
|
+
OUTPUT: a decorated function
|
|
466
|
+
|
|
467
|
+
EXAMPLES::
|
|
468
|
+
|
|
469
|
+
sage: F = sage.parallel.decorate.Fork(timeout=3)
|
|
470
|
+
sage: def g(n, m): return n+m
|
|
471
|
+
sage: h = F(g) # indirect doctest
|
|
472
|
+
sage: h(2,3)
|
|
473
|
+
5
|
|
474
|
+
"""
|
|
475
|
+
P = Parallel(p_iter='fork', ncpus=1, timeout=self.timeout,
|
|
476
|
+
verbose=self.verbose)
|
|
477
|
+
g = P(f)
|
|
478
|
+
|
|
479
|
+
def h(*args, **kwds):
|
|
480
|
+
return list(g([(args, kwds)]))[0][1]
|
|
481
|
+
return h
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
def fork(f=None, timeout=0, verbose=False):
|
|
485
|
+
"""
|
|
486
|
+
Decorate a function so that when called it runs in a forked subprocess.
|
|
487
|
+
|
|
488
|
+
This means that it will not have any in-memory side effects on the
|
|
489
|
+
parent Sage process. The pexpect interfaces are all reset.
|
|
490
|
+
|
|
491
|
+
INPUT:
|
|
492
|
+
|
|
493
|
+
- ``f`` -- a function
|
|
494
|
+
- ``timeout`` -- (default: 0) if positive, kill the subprocess after
|
|
495
|
+
this many seconds (wall time)
|
|
496
|
+
- ``verbose`` -- boolean (default: ``False``); whether to print anything
|
|
497
|
+
about what the decorator does (e.g., killing the subprocess)
|
|
498
|
+
|
|
499
|
+
.. warning::
|
|
500
|
+
|
|
501
|
+
The forked subprocess will not have access to data created
|
|
502
|
+
in pexpect interfaces. This behavior with respect to pexpect
|
|
503
|
+
interfaces is very important to keep in mind when setting up
|
|
504
|
+
certain computations. It's the one big limitation of this
|
|
505
|
+
decorator.
|
|
506
|
+
|
|
507
|
+
EXAMPLES:
|
|
508
|
+
|
|
509
|
+
We create a function and run it with the ``fork`` decorator. Note
|
|
510
|
+
that it does not have a side effect. Despite trying to change
|
|
511
|
+
the global variable ``a`` below in ``g``, the variable ``a`` does not
|
|
512
|
+
get changed::
|
|
513
|
+
|
|
514
|
+
sage: a = 5
|
|
515
|
+
sage: @fork
|
|
516
|
+
....: def g(n, m):
|
|
517
|
+
....: global a
|
|
518
|
+
....: a = 10
|
|
519
|
+
....: return factorial(n).ndigits() + m
|
|
520
|
+
sage: g(5, m=5)
|
|
521
|
+
8
|
|
522
|
+
sage: a
|
|
523
|
+
5
|
|
524
|
+
|
|
525
|
+
We use ``fork`` to make sure that the function terminates after 100 ms,
|
|
526
|
+
no matter what::
|
|
527
|
+
|
|
528
|
+
sage: @fork(timeout=0.1, verbose=True)
|
|
529
|
+
....: def g(n, m): return factorial(n).ndigits() + m
|
|
530
|
+
sage: g(10^7, m=5)
|
|
531
|
+
Killing subprocess ... with input ((10000000,), {'m': 5}) which took too long
|
|
532
|
+
'NO DATA (timed out)'
|
|
533
|
+
|
|
534
|
+
We illustrate that the state of the pexpect interface is not altered by
|
|
535
|
+
forked functions (they get their own new pexpect interfaces!)::
|
|
536
|
+
|
|
537
|
+
sage: # needs sage.libs.pari
|
|
538
|
+
sage: gp.eval('a = 5')
|
|
539
|
+
'5'
|
|
540
|
+
sage: @fork()
|
|
541
|
+
....: def g():
|
|
542
|
+
....: gp.eval('a = 10')
|
|
543
|
+
....: return gp.eval('a')
|
|
544
|
+
sage: g()
|
|
545
|
+
'10'
|
|
546
|
+
sage: gp.eval('a')
|
|
547
|
+
'5'
|
|
548
|
+
|
|
549
|
+
We illustrate that the forked function has its own pexpect
|
|
550
|
+
interface::
|
|
551
|
+
|
|
552
|
+
sage: gp.eval('a = 15') # needs sage.libs.pari
|
|
553
|
+
'15'
|
|
554
|
+
sage: @fork()
|
|
555
|
+
....: def g(): return gp.eval('a')
|
|
556
|
+
sage: g() # needs sage.libs.pari
|
|
557
|
+
'a'
|
|
558
|
+
|
|
559
|
+
We illustrate that segfaulting subprocesses are no trouble at all::
|
|
560
|
+
|
|
561
|
+
sage: cython('def f(): print(<char*>0)') # needs sage.misc.cython
|
|
562
|
+
sage: @fork
|
|
563
|
+
....: def g():
|
|
564
|
+
....: os.environ["CYSIGNALS_CRASH_NDEBUG"]="yes" # skip enhanced backtrace (it is slow)
|
|
565
|
+
....: f()
|
|
566
|
+
sage: print("this works"); g() # needs sage.misc.cython
|
|
567
|
+
this works...
|
|
568
|
+
<BLANKLINE>
|
|
569
|
+
------------------------------------------------------------------------
|
|
570
|
+
Unhandled SIG...
|
|
571
|
+
------------------------------------------------------------------------
|
|
572
|
+
'NO DATA'
|
|
573
|
+
"""
|
|
574
|
+
F = Fork(timeout=timeout, verbose=verbose)
|
|
575
|
+
return F(f) if f else F
|