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,264 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Random testing
|
|
4
|
+
|
|
5
|
+
Some Sage modules do random testing in their doctests; that is, they
|
|
6
|
+
construct test cases using a random number generator. To get the
|
|
7
|
+
broadest possible test coverage, we want everybody who runs the
|
|
8
|
+
doctests to use a different random seed; but we also want to be able
|
|
9
|
+
to reproduce the problems when debugging. This module provides a
|
|
10
|
+
decorator to help write random testers that meet these goals.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from functools import wraps
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def random_testing(fn):
|
|
17
|
+
r"""
|
|
18
|
+
This decorator helps create random testers. These can be run as
|
|
19
|
+
part of the standard Sage test suite; everybody who runs the test
|
|
20
|
+
will use a different random number seed, so many different random
|
|
21
|
+
tests will eventually be run.
|
|
22
|
+
|
|
23
|
+
INPUT:
|
|
24
|
+
|
|
25
|
+
- ``fn`` -- the function that we are wrapping for random testing
|
|
26
|
+
|
|
27
|
+
The resulting function will take two additional arguments, *seed*
|
|
28
|
+
(default: ``None``) and *print_seed* (default: ``False``). The
|
|
29
|
+
result will set the random number seed to the given seed value (or
|
|
30
|
+
to a truly random value, if *seed* is not specified), then call
|
|
31
|
+
the original function. If *print_seed* is true, then the seed will
|
|
32
|
+
be printed before calling the original function. If the original
|
|
33
|
+
function raises an exception, then the random seed that was used
|
|
34
|
+
will be displayed, along with a message entreating the user to
|
|
35
|
+
submit a bug report. All other arguments will be passed through
|
|
36
|
+
to the original function.
|
|
37
|
+
|
|
38
|
+
Here is a set of recommendations for using this wrapper.
|
|
39
|
+
|
|
40
|
+
The function to be tested should take arguments specifying the
|
|
41
|
+
difficulty of the test (size of the test cases, number of
|
|
42
|
+
iterations, etc.), as well as an argument *verbose* (defaulting to
|
|
43
|
+
false). With *verbose* true, it should print the values being
|
|
44
|
+
tested. Suppose ``test_foo()`` takes an argument for number of
|
|
45
|
+
iterations. Then the doctests could be::
|
|
46
|
+
|
|
47
|
+
test_foo(2, verbose=True, seed=0)
|
|
48
|
+
test_foo(10)
|
|
49
|
+
test_foo(100) # long time
|
|
50
|
+
|
|
51
|
+
The first doctest, with the specified seed and ``verbose=True``, simply
|
|
52
|
+
verifies that the tests really are reproducible (that ``test_foo``
|
|
53
|
+
is correctly using the :mod:`randstate` framework). The next two tests
|
|
54
|
+
use truly random seeds, and will print out the seed used if the test
|
|
55
|
+
fails (raises an exception).
|
|
56
|
+
|
|
57
|
+
If you want a very long-running test using this setup, you should do
|
|
58
|
+
something like::
|
|
59
|
+
|
|
60
|
+
for _ in range(10^10): test_foo(100)
|
|
61
|
+
|
|
62
|
+
instead of::
|
|
63
|
+
|
|
64
|
+
test_foo(10^12)
|
|
65
|
+
|
|
66
|
+
If the test fails after several hours, the latter snippet would
|
|
67
|
+
make you rerun the test for several hours while reproducing and
|
|
68
|
+
debugging the problem. With the former snippet, you only need to
|
|
69
|
+
rerun ``test_foo(100)`` with a known-failing random seed.
|
|
70
|
+
|
|
71
|
+
See :func:`sage.misc.random_testing.test_add_commutes` for a
|
|
72
|
+
simple example using this decorator, and :mod:`sage.rings.tests`
|
|
73
|
+
for realistic uses.
|
|
74
|
+
|
|
75
|
+
Setting *print_seed* to true is useless in doctests, because the
|
|
76
|
+
random seed printed will never match the expected doctest result
|
|
77
|
+
(and using ``# random`` means the doctest framework will never
|
|
78
|
+
report an error even if one happens). However, it is useful if
|
|
79
|
+
you have a random test that sometimes segfaults. The normal
|
|
80
|
+
print-the-random-seed-on-exceptions won't work then, so you can
|
|
81
|
+
run::
|
|
82
|
+
|
|
83
|
+
while True: test_foo(print_seed=True)
|
|
84
|
+
|
|
85
|
+
and look at the last seed that was printed before it crashed.
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
TESTS::
|
|
89
|
+
|
|
90
|
+
sage: from sage.misc.random_testing import random_testing
|
|
91
|
+
sage: def foo(verbose=False):
|
|
92
|
+
....: 'oh look, a docstring'
|
|
93
|
+
....: n = ZZ.random_element(2^50)
|
|
94
|
+
....: if verbose:
|
|
95
|
+
....: print("Random value: %s" % n)
|
|
96
|
+
....: assert(n == 49681376900427)
|
|
97
|
+
sage: foo = random_testing(foo)
|
|
98
|
+
sage: foo(seed=0, verbose=True)
|
|
99
|
+
Random value: 49681376900427
|
|
100
|
+
sage: foo(seed=15, verbose=True)
|
|
101
|
+
Random value: 1049538412064764
|
|
102
|
+
Random testing has revealed a problem in foo
|
|
103
|
+
Please report this bug! You may be the first
|
|
104
|
+
person in the world to have seen this problem.
|
|
105
|
+
Please include this random seed in your bug report:
|
|
106
|
+
Random seed: 15
|
|
107
|
+
AssertionError()
|
|
108
|
+
sage: foo() # random
|
|
109
|
+
Random testing has revealed a problem in foo
|
|
110
|
+
Please report this bug! You may be the first
|
|
111
|
+
person in the world to have seen this problem.
|
|
112
|
+
Please include this random seed in your bug report:
|
|
113
|
+
Random seed: 272500700755151445506092479579811710040
|
|
114
|
+
AssertionError()
|
|
115
|
+
sage: foo.__doc__
|
|
116
|
+
'oh look, a docstring'
|
|
117
|
+
sage: foo.__name__
|
|
118
|
+
'foo'
|
|
119
|
+
sage: def bar(): pass
|
|
120
|
+
sage: bar = random_testing(bar)
|
|
121
|
+
sage: bar(print_seed=True) # random
|
|
122
|
+
Random seed: 262841091890156346923539765543814146051
|
|
123
|
+
"""
|
|
124
|
+
from sage.misc.randstate import seed, initial_seed
|
|
125
|
+
from sys import stdout
|
|
126
|
+
|
|
127
|
+
@wraps(fn)
|
|
128
|
+
def wrapped_fun(*args, **kwargs):
|
|
129
|
+
arg_seed = None
|
|
130
|
+
if 'seed' in kwargs:
|
|
131
|
+
arg_seed = kwargs['seed']
|
|
132
|
+
del kwargs['seed']
|
|
133
|
+
with seed(arg_seed):
|
|
134
|
+
used_seed = initial_seed()
|
|
135
|
+
if 'print_seed' in kwargs:
|
|
136
|
+
if kwargs['print_seed']:
|
|
137
|
+
print("Random seed: {}".format(used_seed))
|
|
138
|
+
del kwargs['print_seed']
|
|
139
|
+
# I don't know if this line is necessary, but it can't
|
|
140
|
+
# hurt; and it would be a real pity to lose the
|
|
141
|
+
# information you need to reproduce a segfault because
|
|
142
|
+
# it was missing...
|
|
143
|
+
stdout.flush()
|
|
144
|
+
try:
|
|
145
|
+
fn(*args, **kwargs)
|
|
146
|
+
except Exception as e:
|
|
147
|
+
# We treat any sort of Exception as a doctest
|
|
148
|
+
# failure. (We have to eat the exception, because if
|
|
149
|
+
# doctesting sees an exception, it doesn't display
|
|
150
|
+
# whatever was printed before the exception happened
|
|
151
|
+
# -- so the text we print here would be lost.) Note
|
|
152
|
+
# that KeyboardInterrupt is not an Exception, so
|
|
153
|
+
# pressing Control-C doesn't print this message.
|
|
154
|
+
print("Random testing has revealed a problem in " + fn.__name__)
|
|
155
|
+
print("Please report this bug! You may be the first")
|
|
156
|
+
print("person in the world to have seen this problem.")
|
|
157
|
+
print("Please include this random seed in your bug report:")
|
|
158
|
+
print("Random seed: {}".format(used_seed))
|
|
159
|
+
print(repr(e))
|
|
160
|
+
return wrapped_fun
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@random_testing
|
|
164
|
+
def test_add_commutes(trials, verbose=False):
|
|
165
|
+
r"""
|
|
166
|
+
This is a simple demonstration of the :func:`random_testing` decorator and
|
|
167
|
+
its recommended usage.
|
|
168
|
+
|
|
169
|
+
We test that addition is commutative over rationals.
|
|
170
|
+
|
|
171
|
+
EXAMPLES::
|
|
172
|
+
|
|
173
|
+
sage: from sage.misc.random_testing import test_add_commutes
|
|
174
|
+
sage: test_add_commutes(2, verbose=True, seed=0)
|
|
175
|
+
a == -4, b == 0 ...
|
|
176
|
+
Passes!
|
|
177
|
+
a == -1/2, b == -1/95 ...
|
|
178
|
+
Passes!
|
|
179
|
+
sage: test_add_commutes(10)
|
|
180
|
+
sage: test_add_commutes(1000) # long time
|
|
181
|
+
"""
|
|
182
|
+
from sage.rings.rational_field import QQ
|
|
183
|
+
for _ in range(trials):
|
|
184
|
+
a = QQ.random_element()
|
|
185
|
+
b = QQ.random_element()
|
|
186
|
+
if verbose:
|
|
187
|
+
print("a == {}, b == {} ...".format(a, b))
|
|
188
|
+
assert a + b == b + a
|
|
189
|
+
if verbose:
|
|
190
|
+
print("Passes!")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@random_testing
|
|
194
|
+
def test_add_is_mul(trials, verbose=False):
|
|
195
|
+
r"""
|
|
196
|
+
This example demonstrates a failing :func:`random_testing` test,
|
|
197
|
+
and shows how to reproduce the error.
|
|
198
|
+
|
|
199
|
+
DO NOT USE THIS AS AN EXAMPLE OF HOW TO USE
|
|
200
|
+
:func:`random_testing`! Instead, look at
|
|
201
|
+
:func:`sage.misc.random_testing.test_add_commutes`.
|
|
202
|
+
|
|
203
|
+
We test that ``a+b == a*b``, for *a*, *b* rational. This is of
|
|
204
|
+
course false, so the test will almost always fail.
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: from sage.misc.random_testing import test_add_is_mul
|
|
209
|
+
|
|
210
|
+
We start by testing that we get reproducible results when setting
|
|
211
|
+
*seed* to 0.
|
|
212
|
+
|
|
213
|
+
::
|
|
214
|
+
|
|
215
|
+
sage: test_add_is_mul(2, verbose=True, seed=0)
|
|
216
|
+
a == -4, b == 0 ...
|
|
217
|
+
Random testing has revealed a problem in test_add_is_mul
|
|
218
|
+
Please report this bug! You may be the first
|
|
219
|
+
person in the world to have seen this problem.
|
|
220
|
+
Please include this random seed in your bug report:
|
|
221
|
+
Random seed: 0
|
|
222
|
+
AssertionError()
|
|
223
|
+
|
|
224
|
+
Normally in a ``@random_testing`` doctest, we would leave off the
|
|
225
|
+
``verbose=True`` and the ``# random``. We put it in here so that we can
|
|
226
|
+
verify that we are seeing the exact same error when we reproduce
|
|
227
|
+
the error below.
|
|
228
|
+
|
|
229
|
+
::
|
|
230
|
+
|
|
231
|
+
sage: test_add_is_mul(10, verbose=True) # random
|
|
232
|
+
a == -2/7, b == 1 ...
|
|
233
|
+
Random testing has revealed a problem in test_add_is_mul
|
|
234
|
+
Please report this bug! You may be the first
|
|
235
|
+
person in the world to have seen this problem.
|
|
236
|
+
Please include this random seed in your bug report:
|
|
237
|
+
Random seed: 216390410596009428782506007128692114173
|
|
238
|
+
AssertionError()
|
|
239
|
+
|
|
240
|
+
OK, now assume that some user has reported a
|
|
241
|
+
:func:`test_add_is_mul` failure. We can specify the same
|
|
242
|
+
*random_seed* that was found in the bug report, and we will get the
|
|
243
|
+
exact same failure so that we can debug the "problem".
|
|
244
|
+
|
|
245
|
+
::
|
|
246
|
+
|
|
247
|
+
sage: test_add_is_mul(10, verbose=True, seed=216390410596009428782506007128692114173)
|
|
248
|
+
a == -2/7, b == 1 ...
|
|
249
|
+
Random testing has revealed a problem in test_add_is_mul
|
|
250
|
+
Please report this bug! You may be the first
|
|
251
|
+
person in the world to have seen this problem.
|
|
252
|
+
Please include this random seed in your bug report:
|
|
253
|
+
Random seed: 216390410596009428782506007128692114173
|
|
254
|
+
AssertionError()
|
|
255
|
+
"""
|
|
256
|
+
from sage.rings.rational_field import QQ
|
|
257
|
+
for _ in range(trials):
|
|
258
|
+
a = QQ.random_element()
|
|
259
|
+
b = QQ.random_element()
|
|
260
|
+
if verbose:
|
|
261
|
+
print("a == {}, b == {} ...".format(a, b))
|
|
262
|
+
assert a + b == a * b
|
|
263
|
+
if verbose:
|
|
264
|
+
print("Passes!")
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
ReST index of functions
|
|
4
|
+
|
|
5
|
+
This module contains a function that generates a ReST index table of functions
|
|
6
|
+
for use in doc-strings.
|
|
7
|
+
|
|
8
|
+
{INDEX_OF_FUNCTIONS}
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import inspect
|
|
12
|
+
|
|
13
|
+
from sage.misc.sageinspect import _extract_embedded_position
|
|
14
|
+
from sage.misc.sageinspect import is_function_or_cython_function as _isfunction
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def gen_rest_table_index(obj, names=None, sort=True, only_local_functions=True, root=None):
|
|
18
|
+
r"""
|
|
19
|
+
Return a ReST table describing a list of functions.
|
|
20
|
+
|
|
21
|
+
The list of functions can either be given explicitly, or implicitly as the
|
|
22
|
+
functions/methods of a module or class.
|
|
23
|
+
|
|
24
|
+
In the case of a class, only non-inherited methods are listed.
|
|
25
|
+
|
|
26
|
+
INPUT:
|
|
27
|
+
|
|
28
|
+
- ``obj`` -- list of functions, a module or a class. If given a list of
|
|
29
|
+
functions, the generated table will consist of these. If given a module
|
|
30
|
+
or a class, all functions/methods it defines will be listed, except
|
|
31
|
+
deprecated or those starting with an underscore. In the case of a class,
|
|
32
|
+
note that inherited methods are not displayed.
|
|
33
|
+
|
|
34
|
+
- ``names`` -- dictionary associating a name to a function. Takes
|
|
35
|
+
precedence over the automatically computed name for the functions. Only
|
|
36
|
+
used when ``list_of_entries`` is a list.
|
|
37
|
+
|
|
38
|
+
- ``sort`` -- boolean (default: ``True``); whether to sort the list of
|
|
39
|
+
methods lexicographically
|
|
40
|
+
|
|
41
|
+
- ``only_local_functions`` -- boolean (default: ``True``); if
|
|
42
|
+
``list_of_entries`` is a module, ``only_local_functions = True`` means
|
|
43
|
+
that imported functions will be filtered out. This can be useful to
|
|
44
|
+
disable for making indexes of e.g. catalog modules such as
|
|
45
|
+
:mod:`sage.coding.codes_catalog`.
|
|
46
|
+
|
|
47
|
+
- ``root`` -- module or class (default: ``None``); the module, or class,
|
|
48
|
+
whose elements are to be listed. This is needed to recover the class when
|
|
49
|
+
this method is called from :meth:`gen_thematic_rest_table_index` (see
|
|
50
|
+
:issue:`36178`).
|
|
51
|
+
|
|
52
|
+
.. WARNING::
|
|
53
|
+
|
|
54
|
+
The ReST tables returned by this function use '@' as a delimiter for
|
|
55
|
+
cells. This can cause trouble if the first sentence in the documentation
|
|
56
|
+
of a function contains the '@' character.
|
|
57
|
+
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: from sage.misc.rest_index_of_methods import gen_rest_table_index
|
|
61
|
+
sage: print(gen_rest_table_index([graphs.PetersenGraph])) # needs sage.graphs
|
|
62
|
+
.. csv-table::
|
|
63
|
+
:class: contentstable
|
|
64
|
+
:widths: 30, 70
|
|
65
|
+
:delim: @
|
|
66
|
+
<BLANKLINE>
|
|
67
|
+
:func:`~sage.graphs.generators.smallgraphs.PetersenGraph` @ Return the Petersen Graph.
|
|
68
|
+
|
|
69
|
+
The table of a module::
|
|
70
|
+
|
|
71
|
+
sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods))
|
|
72
|
+
.. csv-table::
|
|
73
|
+
:class: contentstable
|
|
74
|
+
:widths: 30, 70
|
|
75
|
+
:delim: @
|
|
76
|
+
<BLANKLINE>
|
|
77
|
+
:func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
|
|
78
|
+
:func:`~sage.misc.rest_index_of_methods.gen_rest_table_index` @ Return a ReST table describing a list of functions.
|
|
79
|
+
:func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
|
|
80
|
+
:func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
|
|
81
|
+
<BLANKLINE>
|
|
82
|
+
<BLANKLINE>
|
|
83
|
+
|
|
84
|
+
The table of a class::
|
|
85
|
+
|
|
86
|
+
sage: print(gen_rest_table_index(Graph)) # needs sage.graphs
|
|
87
|
+
.. csv-table::
|
|
88
|
+
:class: contentstable
|
|
89
|
+
:widths: 30, 70
|
|
90
|
+
:delim: @
|
|
91
|
+
...
|
|
92
|
+
:meth:`~sage.graphs.graph.Graph.sparse6_string` @ Return the sparse6 representation of the graph as an ASCII string.
|
|
93
|
+
...
|
|
94
|
+
|
|
95
|
+
TESTS:
|
|
96
|
+
|
|
97
|
+
When the first sentence of the docstring spans over several lines::
|
|
98
|
+
|
|
99
|
+
sage: def a():
|
|
100
|
+
....: r'''
|
|
101
|
+
....: Here is a very very very long sentence
|
|
102
|
+
....: that spans on several lines.
|
|
103
|
+
....:
|
|
104
|
+
....: EXAMP...
|
|
105
|
+
....: '''
|
|
106
|
+
....: print("hey")
|
|
107
|
+
sage: 'Here is a very very very long sentence that spans on several lines' in gen_rest_table_index([a])
|
|
108
|
+
True
|
|
109
|
+
|
|
110
|
+
The inherited methods do not show up::
|
|
111
|
+
|
|
112
|
+
sage: # needs sage.graphs
|
|
113
|
+
sage: gen_rest_table_index(sage.combinat.posets.lattices.FiniteLatticePoset).count('\n') < 75
|
|
114
|
+
True
|
|
115
|
+
sage: from sage.graphs.generic_graph import GenericGraph
|
|
116
|
+
sage: A = gen_rest_table_index(Graph).count('\n')
|
|
117
|
+
sage: B = gen_rest_table_index(GenericGraph).count('\n')
|
|
118
|
+
sage: A < B
|
|
119
|
+
True
|
|
120
|
+
|
|
121
|
+
When ``only_local_functions`` is ``False``, we do not include
|
|
122
|
+
``gen_rest_table_index`` itself::
|
|
123
|
+
|
|
124
|
+
sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods, only_local_functions=True))
|
|
125
|
+
.. csv-table::
|
|
126
|
+
:class: contentstable
|
|
127
|
+
:widths: 30, 70
|
|
128
|
+
:delim: @
|
|
129
|
+
<BLANKLINE>
|
|
130
|
+
:func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
|
|
131
|
+
:func:`~sage.misc.rest_index_of_methods.gen_rest_table_index` @ Return a ReST table describing a list of functions.
|
|
132
|
+
:func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
|
|
133
|
+
:func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
|
|
134
|
+
<BLANKLINE>
|
|
135
|
+
<BLANKLINE>
|
|
136
|
+
sage: print(gen_rest_table_index(sage.misc.rest_index_of_methods, only_local_functions=False))
|
|
137
|
+
.. csv-table::
|
|
138
|
+
:class: contentstable
|
|
139
|
+
:widths: 30, 70
|
|
140
|
+
:delim: @
|
|
141
|
+
<BLANKLINE>
|
|
142
|
+
:func:`~sage.misc.rest_index_of_methods.doc_index` @ Attribute an index name to a function.
|
|
143
|
+
:func:`~sage.misc.rest_index_of_methods.gen_thematic_rest_table_index` @ Return a ReST string of thematically sorted functions (or methods) of a module (or class).
|
|
144
|
+
:func:`~sage.misc.rest_index_of_methods.list_of_subfunctions` @ Return the functions (resp. methods) of a given module (resp. class) with their names.
|
|
145
|
+
<BLANKLINE>
|
|
146
|
+
<BLANKLINE>
|
|
147
|
+
|
|
148
|
+
A function that is imported into a class under a different name is listed
|
|
149
|
+
under its 'new' name::
|
|
150
|
+
|
|
151
|
+
sage: 'cliques_maximum' in gen_rest_table_index(Graph) # needs cliquer sage.graphs
|
|
152
|
+
True
|
|
153
|
+
sage: 'all_max_cliques`' in gen_rest_table_index(Graph) # needs cliquer sage.graphs
|
|
154
|
+
False
|
|
155
|
+
|
|
156
|
+
Check that :issue:`36178` is fixed::
|
|
157
|
+
|
|
158
|
+
sage: print(gen_rest_table_index(Graph)) # needs cliquer sage.graphs
|
|
159
|
+
...
|
|
160
|
+
:meth:`~sage.graphs.graph.Graph.independent_set` @ Return a maximum independent set.
|
|
161
|
+
...
|
|
162
|
+
"""
|
|
163
|
+
if names is None:
|
|
164
|
+
names = {}
|
|
165
|
+
|
|
166
|
+
# If input is a class/module, we list all its non-private and methods/functions
|
|
167
|
+
if inspect.isclass(obj) or inspect.ismodule(obj):
|
|
168
|
+
list_of_entries, names = list_of_subfunctions(
|
|
169
|
+
obj, only_local_functions=only_local_functions)
|
|
170
|
+
else:
|
|
171
|
+
list_of_entries = obj
|
|
172
|
+
|
|
173
|
+
fname = lambda x: names.get(x, getattr(x, "__name__", ""))
|
|
174
|
+
|
|
175
|
+
assert isinstance(list_of_entries, list)
|
|
176
|
+
|
|
177
|
+
s = [".. csv-table::",
|
|
178
|
+
" :class: contentstable",
|
|
179
|
+
" :widths: 30, 70",
|
|
180
|
+
" :delim: @\n"]
|
|
181
|
+
|
|
182
|
+
if sort:
|
|
183
|
+
list_of_entries.sort(key=fname)
|
|
184
|
+
|
|
185
|
+
obj_or_root_is_class = False
|
|
186
|
+
if inspect.isclass(root):
|
|
187
|
+
obj_or_root_is_class = True
|
|
188
|
+
class_name = root.__name__
|
|
189
|
+
module_name = root.__module__
|
|
190
|
+
elif inspect.isclass(obj):
|
|
191
|
+
obj_or_root_is_class = True
|
|
192
|
+
class_name = obj.__name__
|
|
193
|
+
module_name = obj.__module__
|
|
194
|
+
|
|
195
|
+
for e in list_of_entries:
|
|
196
|
+
if inspect.ismethod(e):
|
|
197
|
+
link = ":meth:`~{module}.{cls}.{func}`".format(
|
|
198
|
+
module=e.im_class.__module__, cls=e.im_class.__name__,
|
|
199
|
+
func=fname(e))
|
|
200
|
+
elif _isfunction(e) and obj_or_root_is_class:
|
|
201
|
+
link = ":meth:`~{module}.{cls}.{func}`".format(
|
|
202
|
+
module=module_name, cls=class_name, func=fname(e))
|
|
203
|
+
elif _isfunction(e):
|
|
204
|
+
link = ":func:`~{module}.{func}`".format(
|
|
205
|
+
module=e.__module__, func=fname(e))
|
|
206
|
+
else:
|
|
207
|
+
continue
|
|
208
|
+
|
|
209
|
+
# Extract lines injected by cython
|
|
210
|
+
doc = e.__doc__
|
|
211
|
+
doc_tmp = _extract_embedded_position(doc)
|
|
212
|
+
if doc_tmp:
|
|
213
|
+
doc = doc_tmp[0]
|
|
214
|
+
|
|
215
|
+
# Descriptions of the method/function
|
|
216
|
+
if doc:
|
|
217
|
+
desc = doc.split('\n\n')[0] # first paragraph
|
|
218
|
+
desc = " ".join(x.strip() for x in desc.splitlines()) # concatenate lines
|
|
219
|
+
desc = desc.strip() # remove leading spaces
|
|
220
|
+
else:
|
|
221
|
+
desc = "NO DOCSTRING"
|
|
222
|
+
|
|
223
|
+
s.append(" {} @ {}".format(link, desc.lstrip()))
|
|
224
|
+
|
|
225
|
+
return '\n'.join(s) + '\n'
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def list_of_subfunctions(root, only_local_functions=True):
|
|
229
|
+
r"""
|
|
230
|
+
Return the functions (resp. methods) of a given module (resp. class) with their names.
|
|
231
|
+
|
|
232
|
+
INPUT:
|
|
233
|
+
|
|
234
|
+
- ``root`` -- the module, or class, whose elements are to be listed
|
|
235
|
+
|
|
236
|
+
- ``only_local_functions`` -- boolean (default: ``True``); if ``root`` is a
|
|
237
|
+
module, ``only_local_functions = True`` means that imported functions will
|
|
238
|
+
be filtered out. This can be useful to disable for making indexes of
|
|
239
|
+
e.g. catalog modules such as :mod:`sage.coding.codes_catalog`.
|
|
240
|
+
|
|
241
|
+
OUTPUT:
|
|
242
|
+
|
|
243
|
+
A pair ``(list,dict)`` where ``list`` is a list of function/methods and
|
|
244
|
+
``dict`` associates to every function/method the name under which it appears
|
|
245
|
+
in ``root``.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: from sage.misc.rest_index_of_methods import list_of_subfunctions
|
|
250
|
+
sage: l = list_of_subfunctions(Graph)[0] # needs sage.graphs
|
|
251
|
+
sage: Graph.bipartite_color in l # needs sage.graphs
|
|
252
|
+
True
|
|
253
|
+
|
|
254
|
+
TESTS:
|
|
255
|
+
|
|
256
|
+
A ``staticmethod`` is not callable. We must handle them correctly, however::
|
|
257
|
+
|
|
258
|
+
sage: class A: # needs sage.graphs
|
|
259
|
+
....: x = staticmethod(Graph.order)
|
|
260
|
+
sage: list_of_subfunctions(A) # needs sage.graphs
|
|
261
|
+
([<function GenericGraph.order at 0x...>],
|
|
262
|
+
{<function GenericGraph.order at 0x...>: 'x'})
|
|
263
|
+
"""
|
|
264
|
+
if inspect.ismodule(root):
|
|
265
|
+
ismodule = True
|
|
266
|
+
elif inspect.isclass(root):
|
|
267
|
+
ismodule = False
|
|
268
|
+
superclasses = inspect.getmro(root)[1:]
|
|
269
|
+
else:
|
|
270
|
+
raise ValueError("'root' must be a module or a class.")
|
|
271
|
+
|
|
272
|
+
def local_filter(f, name):
|
|
273
|
+
if only_local_functions:
|
|
274
|
+
if ismodule:
|
|
275
|
+
return inspect.getmodule(root) == inspect.getmodule(f)
|
|
276
|
+
else:
|
|
277
|
+
return not any(hasattr(s, name) for s in superclasses)
|
|
278
|
+
else:
|
|
279
|
+
return inspect.isclass(root) or f is not gen_rest_table_index
|
|
280
|
+
|
|
281
|
+
def can_import(f):
|
|
282
|
+
# poke it to provoke a lazy import to resolve
|
|
283
|
+
try:
|
|
284
|
+
hasattr(f, 'xyz')
|
|
285
|
+
except ImportError:
|
|
286
|
+
return False
|
|
287
|
+
return True
|
|
288
|
+
|
|
289
|
+
functions = {getattr(root, name): name for name, f in root.__dict__.items() if
|
|
290
|
+
(not name.startswith('_') and # private functions
|
|
291
|
+
can_import(f) and # unresolved lazy imports
|
|
292
|
+
not hasattr(f, 'issue_number') and # deprecated functions
|
|
293
|
+
not inspect.isclass(f) and # classes
|
|
294
|
+
callable(getattr(f, '__func__', f)) and # e.g. GenericGraph.graphics_array_defaults
|
|
295
|
+
local_filter(f, name)) # possibly filter imported functions
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return list(functions.keys()), functions
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def gen_thematic_rest_table_index(root, additional_categories=None, only_local_functions=True):
|
|
302
|
+
r"""
|
|
303
|
+
Return a ReST string of thematically sorted functions (or methods) of a
|
|
304
|
+
module (or class).
|
|
305
|
+
|
|
306
|
+
INPUT:
|
|
307
|
+
|
|
308
|
+
- ``root`` -- the module, or class, whose elements are to be listed
|
|
309
|
+
|
|
310
|
+
- ``additional_categories`` -- dictionary (default: ``None``); a dictionary
|
|
311
|
+
associating a category (given as a string) to a function's name. Can be
|
|
312
|
+
used when the decorator :func:`doc_index` does not work on a function.
|
|
313
|
+
|
|
314
|
+
- ``only_local_functions`` -- boolean (default: ``True``); if ``root`` is a
|
|
315
|
+
module, ``only_local_functions = True`` means that imported functions will
|
|
316
|
+
be filtered out. This can be useful to disable for making indexes of
|
|
317
|
+
e.g. catalog modules such as :mod:`sage.coding.codes_catalog`.
|
|
318
|
+
|
|
319
|
+
EXAMPLES::
|
|
320
|
+
|
|
321
|
+
sage: from sage.misc.rest_index_of_methods import gen_thematic_rest_table_index, list_of_subfunctions
|
|
322
|
+
sage: l = list_of_subfunctions(Graph)[0] # needs sage.graphs
|
|
323
|
+
sage: Graph.bipartite_color in l # needs sage.graphs
|
|
324
|
+
True
|
|
325
|
+
"""
|
|
326
|
+
from collections import defaultdict
|
|
327
|
+
if additional_categories is None:
|
|
328
|
+
additional_categories = {}
|
|
329
|
+
|
|
330
|
+
functions, names = list_of_subfunctions(root,
|
|
331
|
+
only_local_functions=only_local_functions)
|
|
332
|
+
theme_to_function = defaultdict(list)
|
|
333
|
+
for f in functions:
|
|
334
|
+
if hasattr(f, 'doc_index'):
|
|
335
|
+
doc_ind = f.doc_index
|
|
336
|
+
else:
|
|
337
|
+
try:
|
|
338
|
+
doc_ind = additional_categories.get(f.__name__,
|
|
339
|
+
"Unsorted")
|
|
340
|
+
except AttributeError:
|
|
341
|
+
doc_ind = "Unsorted"
|
|
342
|
+
theme_to_function[doc_ind].append(f)
|
|
343
|
+
s = ["**" + theme + "**\n\n" + gen_rest_table_index(list_of_functions, names=names, root=root)
|
|
344
|
+
for theme, list_of_functions in sorted(theme_to_function.items())]
|
|
345
|
+
return "\n\n".join(s)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def doc_index(name):
|
|
349
|
+
r"""
|
|
350
|
+
Attribute an index name to a function.
|
|
351
|
+
|
|
352
|
+
This decorator can be applied to a function/method in order to specify in
|
|
353
|
+
which index it must appear, in the index generated by
|
|
354
|
+
:func:`gen_thematic_rest_table_index`.
|
|
355
|
+
|
|
356
|
+
INPUT:
|
|
357
|
+
|
|
358
|
+
- ``name`` -- string, which will become the title of the index in which
|
|
359
|
+
this function/method will appear
|
|
360
|
+
|
|
361
|
+
EXAMPLES::
|
|
362
|
+
|
|
363
|
+
sage: from sage.misc.rest_index_of_methods import doc_index
|
|
364
|
+
sage: @doc_index("Wouhouuuuu")
|
|
365
|
+
....: def a():
|
|
366
|
+
....: print("Hey")
|
|
367
|
+
sage: a.doc_index
|
|
368
|
+
'Wouhouuuuu'
|
|
369
|
+
"""
|
|
370
|
+
def hey(f):
|
|
371
|
+
setattr(f, "doc_index", name)
|
|
372
|
+
return f
|
|
373
|
+
return hey
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
__doc__ = __doc__.format(INDEX_OF_FUNCTIONS=gen_rest_table_index([gen_rest_table_index,
|
|
377
|
+
gen_thematic_rest_table_index]))
|
|
Binary file
|
sage/misc/search.pxd
ADDED