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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Parallel Iterator built using Python's multiprocessing module
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
################################################################################
|
|
7
|
+
# Copyright (C) 2008 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 multiprocessing import Pool
|
|
16
|
+
from functools import partial
|
|
17
|
+
from sage.misc.fpickle import pickle_function, call_pickled_function
|
|
18
|
+
from . import ncpus
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def pyprocessing(processes=0):
|
|
22
|
+
"""
|
|
23
|
+
Return a parallel iterator using a given number of processes
|
|
24
|
+
implemented using pyprocessing.
|
|
25
|
+
|
|
26
|
+
INPUT:
|
|
27
|
+
|
|
28
|
+
- ``processes`` -- integer (default: 0); if 0, set to the number
|
|
29
|
+
of processors on the computer
|
|
30
|
+
|
|
31
|
+
OUTPUT: a (partially evaluated) function
|
|
32
|
+
|
|
33
|
+
EXAMPLES::
|
|
34
|
+
|
|
35
|
+
sage: from sage.parallel.multiprocessing_sage import pyprocessing
|
|
36
|
+
sage: p_iter = pyprocessing(4)
|
|
37
|
+
sage: P = parallel(p_iter=p_iter)
|
|
38
|
+
sage: def f(x): return x+x
|
|
39
|
+
sage: v = list(P(f)(list(range(10)))); v.sort(); v
|
|
40
|
+
[(((0,), {}), 0), (((1,), {}), 2), (((2,), {}), 4), (((3,), {}), 6), (((4,), {}), 8), (((5,), {}), 10), (((6,), {}), 12), (((7,), {}), 14), (((8,), {}), 16), (((9,), {}), 18)]
|
|
41
|
+
"""
|
|
42
|
+
if processes == 0:
|
|
43
|
+
processes = ncpus.ncpus()
|
|
44
|
+
return partial(parallel_iter, processes)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def parallel_iter(processes, f, inputs):
|
|
48
|
+
"""
|
|
49
|
+
Return a parallel iterator.
|
|
50
|
+
|
|
51
|
+
INPUT:
|
|
52
|
+
|
|
53
|
+
- ``processes`` -- integer
|
|
54
|
+
- ``f`` -- function
|
|
55
|
+
- ``inputs`` -- an iterable of pairs (args, kwds)
|
|
56
|
+
|
|
57
|
+
OUTPUT: iterator over values of ``f`` at ``args, kwds`` in some random order
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: def f(x): return x+x
|
|
62
|
+
sage: import sage.parallel.multiprocessing_sage
|
|
63
|
+
sage: v = list(sage.parallel.multiprocessing_sage.parallel_iter(2, f, [((2,), {}), ((3,),{})]))
|
|
64
|
+
sage: v.sort(); v
|
|
65
|
+
[(((2,), {}), 4), (((3,), {}), 6)]
|
|
66
|
+
"""
|
|
67
|
+
if processes == 0:
|
|
68
|
+
processes = ncpus.ncpus()
|
|
69
|
+
p = Pool(processes)
|
|
70
|
+
fp = pickle_function(f)
|
|
71
|
+
|
|
72
|
+
result = p.imap_unordered(call_pickled_function,
|
|
73
|
+
[(fp, t) for t in inputs])
|
|
74
|
+
yield from result
|
|
75
|
+
p.close()
|
|
76
|
+
p.join()
|
sage/parallel/ncpus.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
CPU Detection
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def ncpus():
|
|
10
|
+
"""
|
|
11
|
+
Return the number of available CPUs in the system.
|
|
12
|
+
|
|
13
|
+
ALGORITHM: :func:`os.sched_getaffinity` or :func:`os.cpu_count`
|
|
14
|
+
|
|
15
|
+
EXAMPLES::
|
|
16
|
+
|
|
17
|
+
sage: sage.parallel.ncpus.ncpus() # random output -- depends on machine
|
|
18
|
+
2
|
|
19
|
+
"""
|
|
20
|
+
# Support Sage environment variable SAGE_NUM_THREADS
|
|
21
|
+
# NOTE: while doctesting, this is forced to be 2 by the
|
|
22
|
+
# sage-runtests script
|
|
23
|
+
try:
|
|
24
|
+
n = os.environ["SAGE_NUM_THREADS"]
|
|
25
|
+
except KeyError:
|
|
26
|
+
pass
|
|
27
|
+
else:
|
|
28
|
+
return int(n)
|
|
29
|
+
|
|
30
|
+
n = None
|
|
31
|
+
|
|
32
|
+
if hasattr(os, 'sched_getaffinity'):
|
|
33
|
+
n = len(os.sched_getaffinity(0))
|
|
34
|
+
|
|
35
|
+
return n or os.cpu_count() or 1
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Parallelization control
|
|
4
|
+
|
|
5
|
+
This module defines the singleton class :class:`Parallelism` to govern the
|
|
6
|
+
parallelization of computations in some specific topics. It allows the user to
|
|
7
|
+
set the number of processes to be used for parallelization.
|
|
8
|
+
|
|
9
|
+
Some examples of use are provided in the documentation of
|
|
10
|
+
:meth:`sage.tensor.modules.comp.Components.contract`.
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- Marco Mancini, Eric Gourgoulhon, Michal Bejger (2015): initial version
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# *****************************************************************************
|
|
18
|
+
# Copyright (C) 2015 Marco Mancini <marco.mancini@obspm.fr>
|
|
19
|
+
#
|
|
20
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
21
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
22
|
+
# the License, or (at your option) any later version.
|
|
23
|
+
# https://www.gnu.org/licenses/
|
|
24
|
+
# *****************************************************************************
|
|
25
|
+
|
|
26
|
+
from sage.structure.sage_object import SageObject
|
|
27
|
+
from sage.misc.fast_methods import Singleton
|
|
28
|
+
from sage.parallel.ncpus import ncpus
|
|
29
|
+
from sage.rings.integer import Integer
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Parallelism(Singleton, SageObject):
|
|
33
|
+
r"""
|
|
34
|
+
Singleton class for managing the number of processes used in parallel
|
|
35
|
+
computations involved in various fields.
|
|
36
|
+
|
|
37
|
+
EXAMPLES:
|
|
38
|
+
|
|
39
|
+
The number of processes is initialized to 1 (no parallelization) for
|
|
40
|
+
each field::
|
|
41
|
+
|
|
42
|
+
sage: Parallelism()
|
|
43
|
+
Number of processes for parallelization:
|
|
44
|
+
- linbox computations: 1
|
|
45
|
+
- tensor computations: 1
|
|
46
|
+
|
|
47
|
+
Using 4 processes to parallelize tensor computations::
|
|
48
|
+
|
|
49
|
+
sage: Parallelism().set('tensor', nproc=4)
|
|
50
|
+
sage: Parallelism()
|
|
51
|
+
Number of processes for parallelization:
|
|
52
|
+
- linbox computations: 1
|
|
53
|
+
- tensor computations: 4
|
|
54
|
+
sage: Parallelism().get('tensor')
|
|
55
|
+
4
|
|
56
|
+
|
|
57
|
+
Using 6 processes to parallelize all types of computations::
|
|
58
|
+
|
|
59
|
+
sage: Parallelism().set(nproc=6)
|
|
60
|
+
sage: Parallelism()
|
|
61
|
+
Number of processes for parallelization:
|
|
62
|
+
- linbox computations: 6
|
|
63
|
+
- tensor computations: 6
|
|
64
|
+
|
|
65
|
+
Using all the cores available on the computer to parallelize tensor
|
|
66
|
+
computations::
|
|
67
|
+
|
|
68
|
+
sage: Parallelism().set('tensor')
|
|
69
|
+
sage: Parallelism() # random (depends on the computer)
|
|
70
|
+
Number of processes for parallelization:
|
|
71
|
+
- linbox computations: 1
|
|
72
|
+
- tensor computations: 8
|
|
73
|
+
|
|
74
|
+
Using all the cores available on the computer to parallelize all types
|
|
75
|
+
of computations::
|
|
76
|
+
|
|
77
|
+
sage: Parallelism().set()
|
|
78
|
+
sage: Parallelism() # random (depends on the computer)
|
|
79
|
+
Number of processes for parallelization:
|
|
80
|
+
- linbox computations: 8
|
|
81
|
+
- tensor computations: 8
|
|
82
|
+
|
|
83
|
+
Switching off all parallelizations::
|
|
84
|
+
|
|
85
|
+
sage: Parallelism().set(nproc=1)
|
|
86
|
+
"""
|
|
87
|
+
def __init__(self):
|
|
88
|
+
r"""
|
|
89
|
+
Construct the single instance of class Parallelism (singleton model).
|
|
90
|
+
|
|
91
|
+
TESTS::
|
|
92
|
+
|
|
93
|
+
sage: par = Parallelism()
|
|
94
|
+
sage: par
|
|
95
|
+
Number of processes for parallelization:
|
|
96
|
+
- linbox computations: 1
|
|
97
|
+
- tensor computations: 1
|
|
98
|
+
|
|
99
|
+
Test of the singleton character::
|
|
100
|
+
|
|
101
|
+
sage: Parallelism() is par
|
|
102
|
+
True
|
|
103
|
+
|
|
104
|
+
The test suite is passed::
|
|
105
|
+
|
|
106
|
+
sage: TestSuite(par).run()
|
|
107
|
+
"""
|
|
108
|
+
self._default = ncpus()
|
|
109
|
+
# default number of proc. used in parallelizations
|
|
110
|
+
|
|
111
|
+
self._nproc = {'tensor': 1, 'linbox': 1}
|
|
112
|
+
# dict. of number of processes to be used
|
|
113
|
+
# (keys: computational field)
|
|
114
|
+
|
|
115
|
+
def _repr_(self):
|
|
116
|
+
r"""
|
|
117
|
+
String representation of the object.
|
|
118
|
+
|
|
119
|
+
TESTS::
|
|
120
|
+
|
|
121
|
+
sage: Parallelism()._repr_()
|
|
122
|
+
'Number of processes for parallelization:\n - linbox computations: 1\n - tensor computations: 1'
|
|
123
|
+
"""
|
|
124
|
+
resu = "Number of processes for parallelization:\n"
|
|
125
|
+
for field in sorted(self._nproc):
|
|
126
|
+
resu += " - {} computations: {}\n".format(field, self._nproc[field])
|
|
127
|
+
return resu[:-1]
|
|
128
|
+
|
|
129
|
+
def reset(self):
|
|
130
|
+
r"""
|
|
131
|
+
Put the singleton object ``Parallelism()`` in the same state as
|
|
132
|
+
immediately after its creation.
|
|
133
|
+
|
|
134
|
+
EXAMPLES:
|
|
135
|
+
|
|
136
|
+
State of ``Parallelism()`` just after its creation::
|
|
137
|
+
|
|
138
|
+
sage: Parallelism()
|
|
139
|
+
Number of processes for parallelization:
|
|
140
|
+
- linbox computations: 1
|
|
141
|
+
- tensor computations: 1
|
|
142
|
+
sage: Parallelism().get_default() # random (depends on the computer)
|
|
143
|
+
8
|
|
144
|
+
|
|
145
|
+
Changing some values::
|
|
146
|
+
|
|
147
|
+
sage: Parallelism().set_default(6)
|
|
148
|
+
sage: Parallelism().set()
|
|
149
|
+
sage: Parallelism()
|
|
150
|
+
Number of processes for parallelization:
|
|
151
|
+
- linbox computations: 6
|
|
152
|
+
- tensor computations: 6
|
|
153
|
+
sage: Parallelism().get_default()
|
|
154
|
+
6
|
|
155
|
+
|
|
156
|
+
Back to the initial state::
|
|
157
|
+
|
|
158
|
+
sage: Parallelism().reset()
|
|
159
|
+
sage: Parallelism()
|
|
160
|
+
Number of processes for parallelization:
|
|
161
|
+
- linbox computations: 1
|
|
162
|
+
- tensor computations: 1
|
|
163
|
+
sage: Parallelism().get_default() # random (depends on the computer)
|
|
164
|
+
8
|
|
165
|
+
"""
|
|
166
|
+
self._default = ncpus()
|
|
167
|
+
for field in self._nproc:
|
|
168
|
+
self._nproc[field] = 1
|
|
169
|
+
|
|
170
|
+
def set(self, field=None, nproc=None):
|
|
171
|
+
r"""
|
|
172
|
+
Set the number of processes to be launched for parallel computations
|
|
173
|
+
regarding some specific field.
|
|
174
|
+
|
|
175
|
+
INPUT:
|
|
176
|
+
|
|
177
|
+
- ``field`` -- (default: ``None``) string specifying the computational
|
|
178
|
+
field for which the number of parallel processes is to be set; if
|
|
179
|
+
``None``, all fields are considered
|
|
180
|
+
- ``nproc`` -- (default: ``None``) number of processes to be used for
|
|
181
|
+
parallelization; if ``None``, the number of processes will be set to
|
|
182
|
+
the default value, which, unless redefined by :meth:`set_default`,
|
|
183
|
+
is the total number of cores found on the computer.
|
|
184
|
+
|
|
185
|
+
EXAMPLES:
|
|
186
|
+
|
|
187
|
+
The default is a single processor (no parallelization)::
|
|
188
|
+
|
|
189
|
+
sage: Parallelism()
|
|
190
|
+
Number of processes for parallelization:
|
|
191
|
+
- linbox computations: 1
|
|
192
|
+
- tensor computations: 1
|
|
193
|
+
|
|
194
|
+
Asking for parallelization on 4 cores in tensor algebra::
|
|
195
|
+
|
|
196
|
+
sage: Parallelism().set('tensor', nproc=4)
|
|
197
|
+
sage: Parallelism()
|
|
198
|
+
Number of processes for parallelization:
|
|
199
|
+
- linbox computations: 1
|
|
200
|
+
- tensor computations: 4
|
|
201
|
+
|
|
202
|
+
Using all the cores available on the computer::
|
|
203
|
+
|
|
204
|
+
sage: Parallelism().set('tensor')
|
|
205
|
+
sage: Parallelism() # random (depends on the computer)
|
|
206
|
+
Number of processes for parallelization:
|
|
207
|
+
- linbox computations: 1
|
|
208
|
+
- tensor computations: 8
|
|
209
|
+
|
|
210
|
+
Using 6 cores in all parallelizations::
|
|
211
|
+
|
|
212
|
+
sage: Parallelism().set(nproc=6)
|
|
213
|
+
sage: Parallelism()
|
|
214
|
+
Number of processes for parallelization:
|
|
215
|
+
- linbox computations: 6
|
|
216
|
+
- tensor computations: 6
|
|
217
|
+
|
|
218
|
+
Using all the cores available on the computer in all parallelizations::
|
|
219
|
+
|
|
220
|
+
sage: Parallelism().set()
|
|
221
|
+
sage: Parallelism() # random (depends on the computer)
|
|
222
|
+
Number of processes for parallelization:
|
|
223
|
+
- linbox computations: 8
|
|
224
|
+
- tensor computations: 8
|
|
225
|
+
|
|
226
|
+
Switching off the parallelization::
|
|
227
|
+
|
|
228
|
+
sage: Parallelism().set(nproc=1)
|
|
229
|
+
sage: Parallelism()
|
|
230
|
+
Number of processes for parallelization:
|
|
231
|
+
- linbox computations: 1
|
|
232
|
+
- tensor computations: 1
|
|
233
|
+
"""
|
|
234
|
+
if field is None:
|
|
235
|
+
for fi in self._nproc:
|
|
236
|
+
self.set(field=fi, nproc=nproc)
|
|
237
|
+
else:
|
|
238
|
+
if field not in self._nproc:
|
|
239
|
+
raise KeyError("entry for field {} is not ".format(field) +
|
|
240
|
+
"implemented in Parallelism")
|
|
241
|
+
if nproc is None:
|
|
242
|
+
self._nproc[field] = self._default
|
|
243
|
+
else:
|
|
244
|
+
if not isinstance(nproc, (int, Integer)):
|
|
245
|
+
raise TypeError("nproc must be integer")
|
|
246
|
+
self._nproc[field] = nproc
|
|
247
|
+
|
|
248
|
+
def get(self, field):
|
|
249
|
+
r"""
|
|
250
|
+
Return the number of processes which will be used in parallel
|
|
251
|
+
computations regarding some specific field.
|
|
252
|
+
|
|
253
|
+
INPUT:
|
|
254
|
+
|
|
255
|
+
- ``field`` -- string specifying the part of Sage involved in
|
|
256
|
+
parallel computations
|
|
257
|
+
|
|
258
|
+
OUTPUT:
|
|
259
|
+
|
|
260
|
+
- number of processes used in parallelization of computations
|
|
261
|
+
pertaining to ``field``
|
|
262
|
+
|
|
263
|
+
EXAMPLES:
|
|
264
|
+
|
|
265
|
+
The default is a single process (no parallelization)::
|
|
266
|
+
|
|
267
|
+
sage: Parallelism().reset()
|
|
268
|
+
sage: Parallelism().get('tensor')
|
|
269
|
+
1
|
|
270
|
+
|
|
271
|
+
Asking for parallelization on 4 cores::
|
|
272
|
+
|
|
273
|
+
sage: Parallelism().set('tensor', nproc=4)
|
|
274
|
+
sage: Parallelism().get('tensor')
|
|
275
|
+
4
|
|
276
|
+
"""
|
|
277
|
+
if field not in self._nproc:
|
|
278
|
+
raise KeyError("entry for field {} is not ".format(field) +
|
|
279
|
+
"implemented in Parallelism()")
|
|
280
|
+
return self._nproc[field]
|
|
281
|
+
|
|
282
|
+
def get_all(self):
|
|
283
|
+
r"""
|
|
284
|
+
Return the number of processes which will be used in parallel
|
|
285
|
+
computations in all fields
|
|
286
|
+
|
|
287
|
+
OUTPUT:
|
|
288
|
+
|
|
289
|
+
- dictionary of the number of processes, with the computational fields
|
|
290
|
+
as keys
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: Parallelism().reset()
|
|
295
|
+
sage: Parallelism().get_all()
|
|
296
|
+
{'linbox': 1, 'tensor': 1}
|
|
297
|
+
|
|
298
|
+
Asking for parallelization on 4 cores::
|
|
299
|
+
|
|
300
|
+
sage: Parallelism().set(nproc=4)
|
|
301
|
+
sage: Parallelism().get_all()
|
|
302
|
+
{'linbox': 4, 'tensor': 4}
|
|
303
|
+
"""
|
|
304
|
+
return self._nproc
|
|
305
|
+
|
|
306
|
+
def set_default(self, nproc=None):
|
|
307
|
+
r"""
|
|
308
|
+
Set the default number of processes to be launched in parallel
|
|
309
|
+
computations.
|
|
310
|
+
|
|
311
|
+
INPUT:
|
|
312
|
+
|
|
313
|
+
- ``nproc`` -- (default: ``None``) default number of processes;
|
|
314
|
+
if ``None``, the number of processes will be set to the total number
|
|
315
|
+
of cores found on the computer.
|
|
316
|
+
|
|
317
|
+
EXAMPLES:
|
|
318
|
+
|
|
319
|
+
A priori the default number of process for parallelization is the
|
|
320
|
+
total number of cores found on the computer::
|
|
321
|
+
|
|
322
|
+
sage: Parallelism().get_default() # random (depends on the computer)
|
|
323
|
+
8
|
|
324
|
+
|
|
325
|
+
Changing it thanks to ``set_default``::
|
|
326
|
+
|
|
327
|
+
sage: Parallelism().set_default(nproc=4)
|
|
328
|
+
sage: Parallelism().get_default()
|
|
329
|
+
4
|
|
330
|
+
|
|
331
|
+
Setting it back to the total number of cores available on the computer::
|
|
332
|
+
|
|
333
|
+
sage: Parallelism().set_default()
|
|
334
|
+
sage: Parallelism().get_default() # random (depends on the computer)
|
|
335
|
+
8
|
|
336
|
+
"""
|
|
337
|
+
if nproc is None:
|
|
338
|
+
self._default = ncpus()
|
|
339
|
+
else:
|
|
340
|
+
if not isinstance(nproc, (int, Integer)):
|
|
341
|
+
raise TypeError("nproc must be integer")
|
|
342
|
+
self._default = nproc
|
|
343
|
+
|
|
344
|
+
def get_default(self):
|
|
345
|
+
r"""
|
|
346
|
+
Return the default number of processes to be launched in parallel
|
|
347
|
+
computations.
|
|
348
|
+
|
|
349
|
+
EXAMPLES:
|
|
350
|
+
|
|
351
|
+
A priori, the default number of process for parallelization is the
|
|
352
|
+
total number of cores found on the computer::
|
|
353
|
+
|
|
354
|
+
sage: Parallelism().reset()
|
|
355
|
+
sage: Parallelism().get_default() # random (depends on the computer)
|
|
356
|
+
8
|
|
357
|
+
|
|
358
|
+
It can be changed via :meth:`set_default`::
|
|
359
|
+
|
|
360
|
+
sage: Parallelism().set_default(nproc=4)
|
|
361
|
+
sage: Parallelism().get_default()
|
|
362
|
+
4
|
|
363
|
+
"""
|
|
364
|
+
return self._default
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Reference Parallel Primitives
|
|
4
|
+
|
|
5
|
+
These are reference implementations of basic parallel
|
|
6
|
+
primitives. These are not actually parallel, but work the same way.
|
|
7
|
+
They are good for testing.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from sage.misc.prandom import shuffle
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def parallel_iter(f, inputs):
|
|
14
|
+
"""
|
|
15
|
+
Reference parallel iterator implementation.
|
|
16
|
+
|
|
17
|
+
INPUT:
|
|
18
|
+
|
|
19
|
+
- ``f`` -- a Python function that can be pickled using
|
|
20
|
+
the ``pickle_function`` command
|
|
21
|
+
|
|
22
|
+
- ``inputs`` -- list of pickleable pairs (args, kwds), where
|
|
23
|
+
args is a tuple and kwds is a dictionary
|
|
24
|
+
|
|
25
|
+
OUTPUT: iterator over 2-tuples ``(inputs[i], f(inputs[i]))``, where the
|
|
26
|
+
order may be completely random
|
|
27
|
+
|
|
28
|
+
EXAMPLES::
|
|
29
|
+
|
|
30
|
+
sage: def f(N, M=10): return N*M
|
|
31
|
+
sage: inputs = [((2,3),{}), (tuple(), {'M':5,'N':3}), ((2,),{})]
|
|
32
|
+
sage: set_random_seed(0)
|
|
33
|
+
sage: for a, val in sage.parallel.reference.parallel_iter(f, inputs):
|
|
34
|
+
....: print((a, val))
|
|
35
|
+
(((2,), {}), 20)
|
|
36
|
+
(((), {'M': 5, 'N': 3}), 15)
|
|
37
|
+
(((2, 3), {}), 6)
|
|
38
|
+
sage: for a, val in sage.parallel.reference.parallel_iter(f, inputs):
|
|
39
|
+
....: print((a, val))
|
|
40
|
+
(((), {'M': 5, 'N': 3}), 15)
|
|
41
|
+
(((2,), {}), 20)
|
|
42
|
+
(((2, 3), {}), 6)
|
|
43
|
+
"""
|
|
44
|
+
v = list(inputs)
|
|
45
|
+
shuffle(v)
|
|
46
|
+
for args, kwds in v:
|
|
47
|
+
yield ((args, kwds), f(*args, **kwds))
|