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,1021 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Enumerated set from iterator
|
|
4
|
+
|
|
5
|
+
EXAMPLES:
|
|
6
|
+
|
|
7
|
+
We build a set from the iterator :obj:`graphs` that returns a canonical
|
|
8
|
+
representative for each isomorphism class of graphs::
|
|
9
|
+
|
|
10
|
+
sage: # needs nauty sage.graphs
|
|
11
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
12
|
+
sage: E = EnumeratedSetFromIterator(
|
|
13
|
+
....: graphs,
|
|
14
|
+
....: name='Graphs',
|
|
15
|
+
....: category=InfiniteEnumeratedSets(),
|
|
16
|
+
....: cache=True)
|
|
17
|
+
sage: E
|
|
18
|
+
Graphs
|
|
19
|
+
sage: E.unrank(0)
|
|
20
|
+
Graph on 0 vertices
|
|
21
|
+
sage: E.unrank(4)
|
|
22
|
+
Graph on 3 vertices
|
|
23
|
+
sage: E.cardinality()
|
|
24
|
+
+Infinity
|
|
25
|
+
sage: E.category()
|
|
26
|
+
Category of facade infinite enumerated sets
|
|
27
|
+
|
|
28
|
+
The module also provides decorator for functions and methods::
|
|
29
|
+
|
|
30
|
+
sage: from sage.sets.set_from_iterator import set_from_function
|
|
31
|
+
sage: @set_from_function
|
|
32
|
+
....: def f(n): return xsrange(n)
|
|
33
|
+
sage: f(3)
|
|
34
|
+
{0, 1, 2}
|
|
35
|
+
sage: f(5)
|
|
36
|
+
{0, 1, 2, 3, 4}
|
|
37
|
+
sage: f(100)
|
|
38
|
+
{0, 1, 2, 3, 4, ...}
|
|
39
|
+
|
|
40
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
41
|
+
sage: class A:
|
|
42
|
+
....: @set_from_method
|
|
43
|
+
....: def f(self, n):
|
|
44
|
+
....: return xsrange(n)
|
|
45
|
+
sage: a = A()
|
|
46
|
+
sage: a.f(3)
|
|
47
|
+
{0, 1, 2}
|
|
48
|
+
sage: f(100)
|
|
49
|
+
{0, 1, 2, 3, 4, ...}
|
|
50
|
+
"""
|
|
51
|
+
# ****************************************************************************
|
|
52
|
+
# Copyright (C) 2012 Vincent Delecroix <vincent.delecroix@gmail.com>
|
|
53
|
+
#
|
|
54
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
55
|
+
#
|
|
56
|
+
# This code is distributed in the hope that it will be useful,
|
|
57
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
58
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
59
|
+
# General Public License for more details.
|
|
60
|
+
#
|
|
61
|
+
# The full text of the GPL is available at:
|
|
62
|
+
#
|
|
63
|
+
# https://www.gnu.org/licenses/
|
|
64
|
+
# *****************************************************************************
|
|
65
|
+
|
|
66
|
+
from sage.structure.parent import Parent
|
|
67
|
+
from sage.categories.enumerated_sets import EnumeratedSets
|
|
68
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
69
|
+
from sage.misc.function_mangling import ArgumentFixer
|
|
70
|
+
from sage.misc.lazy_list import lazy_list
|
|
71
|
+
from sage.misc.instancedoc import instancedoc
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class EnumeratedSetFromIterator(Parent):
|
|
75
|
+
"""
|
|
76
|
+
A class for enumerated set built from an iterator.
|
|
77
|
+
|
|
78
|
+
INPUT:
|
|
79
|
+
|
|
80
|
+
- ``f`` -- a function that returns an iterable from which the set is built from
|
|
81
|
+
|
|
82
|
+
- ``args`` -- tuple; arguments to be sent to the function `f`
|
|
83
|
+
|
|
84
|
+
- ``kwds`` -- dictionary; keywords to be sent to the function `f`
|
|
85
|
+
|
|
86
|
+
- ``name`` -- an optional name for the set
|
|
87
|
+
|
|
88
|
+
- ``category`` -- (default: ``None``) an optional category for that
|
|
89
|
+
enumerated set. If you know that your iterator will stop after a finite
|
|
90
|
+
number of steps you should set it as :class:`FiniteEnumeratedSets`, conversely if
|
|
91
|
+
you know that your iterator will run over and over you should set it as
|
|
92
|
+
:class:`InfiniteEnumeratedSets`.
|
|
93
|
+
|
|
94
|
+
- ``cache`` -- boolean (default: ``False``); whether or not use a cache
|
|
95
|
+
mechanism for the iterator. If ``True``, then the function `f` is called
|
|
96
|
+
only once.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
101
|
+
sage: E = EnumeratedSetFromIterator(graphs, args=(7,)); E # needs nauty sage.graphs
|
|
102
|
+
{Graph on 7 vertices, Graph on 7 vertices, Graph on 7 vertices,
|
|
103
|
+
Graph on 7 vertices, Graph on 7 vertices, ...}
|
|
104
|
+
sage: E.category() # needs nauty sage.graphs
|
|
105
|
+
Category of facade enumerated sets
|
|
106
|
+
|
|
107
|
+
The same example with a cache and a custom name::
|
|
108
|
+
|
|
109
|
+
sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True, # needs nauty sage.graphs
|
|
110
|
+
....: name="Graphs with 8 vertices",
|
|
111
|
+
....: category=FiniteEnumeratedSets()); E
|
|
112
|
+
Graphs with 8 vertices
|
|
113
|
+
sage: E.unrank(3) # needs nauty sage.graphs
|
|
114
|
+
Graph on 8 vertices
|
|
115
|
+
sage: E.category() # needs nauty sage.graphs
|
|
116
|
+
Category of facade finite enumerated sets
|
|
117
|
+
|
|
118
|
+
TESTS:
|
|
119
|
+
|
|
120
|
+
The cache is compatible with multiple call to ``__iter__``::
|
|
121
|
+
|
|
122
|
+
sage: from itertools import count
|
|
123
|
+
sage: E = EnumeratedSetFromIterator(count, args=(0,), category=InfiniteEnumeratedSets(), cache=True)
|
|
124
|
+
sage: e1 = iter(E)
|
|
125
|
+
sage: e2 = iter(E)
|
|
126
|
+
sage: next(e1), next(e1)
|
|
127
|
+
(0, 1)
|
|
128
|
+
sage: next(e2), next(e2), next(e2)
|
|
129
|
+
(0, 1, 2)
|
|
130
|
+
sage: next(e1), next(e1)
|
|
131
|
+
(2, 3)
|
|
132
|
+
sage: next(e2)
|
|
133
|
+
3
|
|
134
|
+
|
|
135
|
+
The following warning is due to ``E`` being a facade parent. For more,
|
|
136
|
+
see the discussion on :issue:`16239`::
|
|
137
|
+
|
|
138
|
+
sage: TestSuite(E).run()
|
|
139
|
+
doctest:...: UserWarning: Testing equality of infinite sets which will not end in case of equality
|
|
140
|
+
|
|
141
|
+
sage: E = EnumeratedSetFromIterator(xsrange, args=(10,), category=FiniteEnumeratedSets(), cache=True)
|
|
142
|
+
sage: TestSuite(E).run()
|
|
143
|
+
|
|
144
|
+
.. NOTE::
|
|
145
|
+
|
|
146
|
+
In order to make the ``TestSuite`` works, the elements of the set
|
|
147
|
+
should have parents.
|
|
148
|
+
"""
|
|
149
|
+
def __init__(self, f, args=None, kwds=None, name=None, category=None, cache=False):
|
|
150
|
+
"""
|
|
151
|
+
TESTS::
|
|
152
|
+
|
|
153
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
154
|
+
sage: S = EnumeratedSetFromIterator(xsrange, (1, 200, -1), category=FiniteEnumeratedSets())
|
|
155
|
+
sage: TestSuite(S).run()
|
|
156
|
+
"""
|
|
157
|
+
if category is not None:
|
|
158
|
+
Parent.__init__(self, facade=True, category=category)
|
|
159
|
+
else:
|
|
160
|
+
Parent.__init__(self, facade=True, category=EnumeratedSets())
|
|
161
|
+
|
|
162
|
+
if name is not None:
|
|
163
|
+
self.rename(name)
|
|
164
|
+
|
|
165
|
+
self._func = f
|
|
166
|
+
|
|
167
|
+
if args is not None:
|
|
168
|
+
self._args = args
|
|
169
|
+
if kwds is not None:
|
|
170
|
+
self._kwds = kwds
|
|
171
|
+
|
|
172
|
+
if cache:
|
|
173
|
+
self._cache = lazy_list(iter(self._func(
|
|
174
|
+
*getattr(self, '_args', ()),
|
|
175
|
+
**getattr(self, '_kwds', {}))))
|
|
176
|
+
|
|
177
|
+
def __hash__(self):
|
|
178
|
+
r"""
|
|
179
|
+
A simple hash using the first elements of the set.
|
|
180
|
+
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
184
|
+
sage: E = EnumeratedSetFromIterator(xsrange, (1, 200))
|
|
185
|
+
sage: hash(E) == hash(tuple(range(1, 14)))
|
|
186
|
+
True
|
|
187
|
+
"""
|
|
188
|
+
try:
|
|
189
|
+
return hash(self._cache[:13])
|
|
190
|
+
except AttributeError:
|
|
191
|
+
from itertools import islice
|
|
192
|
+
return hash(tuple(islice(self, 13)))
|
|
193
|
+
|
|
194
|
+
def __reduce__(self):
|
|
195
|
+
r"""
|
|
196
|
+
Support for pickle.
|
|
197
|
+
|
|
198
|
+
TESTS::
|
|
199
|
+
|
|
200
|
+
sage: # needs nauty sage.graphs
|
|
201
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
202
|
+
sage: from sage.graphs.graph_generators import graphs
|
|
203
|
+
sage: E = EnumeratedSetFromIterator(graphs,
|
|
204
|
+
....: args=(3,),
|
|
205
|
+
....: category=FiniteEnumeratedSets(),
|
|
206
|
+
....: name="Graphs on 3 vertices")
|
|
207
|
+
sage: E
|
|
208
|
+
Graphs on 3 vertices
|
|
209
|
+
sage: F = loads(dumps(E)); F
|
|
210
|
+
Graphs on 3 vertices
|
|
211
|
+
sage: E == F
|
|
212
|
+
True
|
|
213
|
+
"""
|
|
214
|
+
return (EnumeratedSetFromIterator,
|
|
215
|
+
(self._func, # func
|
|
216
|
+
getattr(self, '_args', None), # args
|
|
217
|
+
getattr(self, '_kwds', None), # kwds
|
|
218
|
+
self.get_custom_name(), # name
|
|
219
|
+
self.category(), # category
|
|
220
|
+
hasattr(self, '_cache')) # cache
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
def _repr_(self):
|
|
224
|
+
r"""
|
|
225
|
+
Return a string representation of ``self``.
|
|
226
|
+
|
|
227
|
+
TESTS::
|
|
228
|
+
|
|
229
|
+
sage: # needs sage.combinat
|
|
230
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
231
|
+
sage: E = EnumeratedSetFromIterator(Partitions(7, min_part=2).__iter__)
|
|
232
|
+
sage: repr(E) # indirect doctest
|
|
233
|
+
'{[7], [5, 2], [4, 3], [3, 2, 2]}'
|
|
234
|
+
sage: E = EnumeratedSetFromIterator(Partitions(9, min_part=2).__iter__)
|
|
235
|
+
sage: repr(E) # indirect doctest
|
|
236
|
+
'{[9], [7, 2], [6, 3], [5, 4], [5, 2, 2], ...}'
|
|
237
|
+
sage: E = EnumeratedSetFromIterator(Partitions(9, min_part=2).__iter__,
|
|
238
|
+
....: name="Some partitions")
|
|
239
|
+
sage: repr(E) # indirect doctest
|
|
240
|
+
'Some partitions'
|
|
241
|
+
"""
|
|
242
|
+
l = []
|
|
243
|
+
i = iter(self)
|
|
244
|
+
for _ in range(6):
|
|
245
|
+
try:
|
|
246
|
+
l.append(next(i))
|
|
247
|
+
except StopIteration:
|
|
248
|
+
break
|
|
249
|
+
if len(l) < 6:
|
|
250
|
+
return '{' + ', '.join(repr(x) for x in l) + '}'
|
|
251
|
+
l.pop(-1)
|
|
252
|
+
return '{' + ', '.join(repr(x) for x in l) + ', ...}'
|
|
253
|
+
|
|
254
|
+
def __contains__(self, x):
|
|
255
|
+
r"""
|
|
256
|
+
Test whether ``x`` is in ``self``.
|
|
257
|
+
|
|
258
|
+
If the set is infinite, only the answer ``True`` should be expected in
|
|
259
|
+
finite time.
|
|
260
|
+
|
|
261
|
+
EXAMPLES::
|
|
262
|
+
|
|
263
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
264
|
+
sage: P = Partitions(12, min_part=2, max_part=5)
|
|
265
|
+
sage: E = EnumeratedSetFromIterator(P.__iter__)
|
|
266
|
+
sage: P([5,5,2]) in E
|
|
267
|
+
True
|
|
268
|
+
"""
|
|
269
|
+
return any(x == y for y in self)
|
|
270
|
+
|
|
271
|
+
is_parent_of = __contains__
|
|
272
|
+
|
|
273
|
+
# TODO: what should we do for comparisons of infinite sets
|
|
274
|
+
def __eq__(self, other):
|
|
275
|
+
r"""
|
|
276
|
+
Equality test.
|
|
277
|
+
|
|
278
|
+
The function returns ``True`` if and only if other is an enumerated
|
|
279
|
+
set and has the same element as ``self``.
|
|
280
|
+
|
|
281
|
+
TESTS::
|
|
282
|
+
|
|
283
|
+
sage: # needs nauty sage.graphs
|
|
284
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
285
|
+
sage: E4 = EnumeratedSetFromIterator(graphs, args=(4,),
|
|
286
|
+
....: category=FiniteEnumeratedSets())
|
|
287
|
+
sage: F4 = EnumeratedSetFromIterator(graphs, args=(4,),
|
|
288
|
+
....: category=FiniteEnumeratedSets())
|
|
289
|
+
sage: E5 = EnumeratedSetFromIterator(graphs, args=(5,),
|
|
290
|
+
....: category=FiniteEnumeratedSets())
|
|
291
|
+
sage: E4 == E4
|
|
292
|
+
True
|
|
293
|
+
sage: E4 == F4
|
|
294
|
+
True
|
|
295
|
+
sage: E4 == E5
|
|
296
|
+
False
|
|
297
|
+
sage: E5 == E4
|
|
298
|
+
False
|
|
299
|
+
sage: E5 == E5
|
|
300
|
+
True
|
|
301
|
+
"""
|
|
302
|
+
if isinstance(other, EnumeratedSetFromIterator):
|
|
303
|
+
# trick to allow equality between infinite sets
|
|
304
|
+
# this assume that the function does not return randomized data!
|
|
305
|
+
if (self._func == other._func and
|
|
306
|
+
getattr(self, '_args', None) == getattr(other, '_args', None) and
|
|
307
|
+
getattr(self, '_kwds', None) == getattr(other, '_kwds', None)):
|
|
308
|
+
return True
|
|
309
|
+
|
|
310
|
+
if other in EnumeratedSets():
|
|
311
|
+
# TODO: think about what should be done at that point
|
|
312
|
+
if self not in FiniteEnumeratedSets() and other not in FiniteEnumeratedSets():
|
|
313
|
+
import warnings
|
|
314
|
+
warnings.warn("Testing equality of infinite sets which will not end in case of equality")
|
|
315
|
+
|
|
316
|
+
i1 = iter(self)
|
|
317
|
+
i2 = iter(other)
|
|
318
|
+
while True:
|
|
319
|
+
try:
|
|
320
|
+
x = next(i1)
|
|
321
|
+
except StopIteration:
|
|
322
|
+
try:
|
|
323
|
+
next(i2)
|
|
324
|
+
return False
|
|
325
|
+
except StopIteration:
|
|
326
|
+
return True
|
|
327
|
+
try:
|
|
328
|
+
y = next(i2)
|
|
329
|
+
except StopIteration:
|
|
330
|
+
return False
|
|
331
|
+
if x != y:
|
|
332
|
+
return False
|
|
333
|
+
|
|
334
|
+
def __ne__(self, other):
|
|
335
|
+
r"""
|
|
336
|
+
Difference test.
|
|
337
|
+
|
|
338
|
+
The function calls the ``__eq__`` test.
|
|
339
|
+
|
|
340
|
+
TESTS::
|
|
341
|
+
|
|
342
|
+
sage: # needs nauty sage.graphs
|
|
343
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
344
|
+
sage: E4 = EnumeratedSetFromIterator(graphs, args=(4,),
|
|
345
|
+
....: category=FiniteEnumeratedSets())
|
|
346
|
+
sage: F4 = EnumeratedSetFromIterator(graphs, args=(4,),
|
|
347
|
+
....: category=FiniteEnumeratedSets())
|
|
348
|
+
sage: E5 = EnumeratedSetFromIterator(graphs, args=(5,),
|
|
349
|
+
....: category=FiniteEnumeratedSets())
|
|
350
|
+
sage: E4 != E4
|
|
351
|
+
False
|
|
352
|
+
sage: E4 != F4
|
|
353
|
+
False
|
|
354
|
+
sage: E4 != E5
|
|
355
|
+
True
|
|
356
|
+
sage: E5 != E4
|
|
357
|
+
True
|
|
358
|
+
sage: E5 != E5
|
|
359
|
+
False
|
|
360
|
+
"""
|
|
361
|
+
return not self == other
|
|
362
|
+
|
|
363
|
+
def __iter__(self):
|
|
364
|
+
r"""
|
|
365
|
+
Return an iterator over the element of ``self``.
|
|
366
|
+
|
|
367
|
+
EXAMPLES::
|
|
368
|
+
|
|
369
|
+
sage: # needs nauty sage.graphs
|
|
370
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
371
|
+
sage: E = EnumeratedSetFromIterator(graphs, args=(8,))
|
|
372
|
+
sage: g1 = next(iter(E)); g1
|
|
373
|
+
Graph on 8 vertices
|
|
374
|
+
sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True)
|
|
375
|
+
sage: g2 = next(iter(E)); g2
|
|
376
|
+
Graph on 8 vertices
|
|
377
|
+
sage: g1 == g2
|
|
378
|
+
True
|
|
379
|
+
"""
|
|
380
|
+
if hasattr(self, '_cache'):
|
|
381
|
+
return iter(self._cache)
|
|
382
|
+
return iter(self._func(*getattr(self, '_args', ()), **getattr(self, '_kwds', {})))
|
|
383
|
+
|
|
384
|
+
def unrank(self, i):
|
|
385
|
+
r"""
|
|
386
|
+
Return the element at position ``i``.
|
|
387
|
+
|
|
388
|
+
EXAMPLES::
|
|
389
|
+
|
|
390
|
+
sage: # needs nauty sage.graphs
|
|
391
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
392
|
+
sage: E = EnumeratedSetFromIterator(graphs, args=(8,), cache=True)
|
|
393
|
+
sage: F = EnumeratedSetFromIterator(graphs, args=(8,), cache=False)
|
|
394
|
+
sage: E.unrank(2)
|
|
395
|
+
Graph on 8 vertices
|
|
396
|
+
sage: E.unrank(2) == F.unrank(2)
|
|
397
|
+
True
|
|
398
|
+
"""
|
|
399
|
+
if hasattr(self, '_cache'):
|
|
400
|
+
return self._cache[i]
|
|
401
|
+
return super().unrank(i)
|
|
402
|
+
|
|
403
|
+
def _element_constructor_(self, el):
|
|
404
|
+
"""
|
|
405
|
+
Construct an element from ``el``.
|
|
406
|
+
|
|
407
|
+
TESTS::
|
|
408
|
+
|
|
409
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
410
|
+
sage: S = EnumeratedSetFromIterator(range, args=(1,4))
|
|
411
|
+
|
|
412
|
+
sage: S(1)
|
|
413
|
+
doctest:...: UserWarning: Testing equality of infinite sets
|
|
414
|
+
which will not end in case of equality
|
|
415
|
+
1
|
|
416
|
+
sage: S(0) # indirect doctest
|
|
417
|
+
Traceback (most recent call last):
|
|
418
|
+
...
|
|
419
|
+
ValueError: 0 not in {1, 2, 3}
|
|
420
|
+
"""
|
|
421
|
+
if el in self:
|
|
422
|
+
return el
|
|
423
|
+
raise ValueError("%s not in %s" % (el, self))
|
|
424
|
+
|
|
425
|
+
def clear_cache(self):
|
|
426
|
+
r"""
|
|
427
|
+
Clear the cache.
|
|
428
|
+
|
|
429
|
+
EXAMPLES::
|
|
430
|
+
|
|
431
|
+
sage: from itertools import count
|
|
432
|
+
sage: from sage.sets.set_from_iterator import EnumeratedSetFromIterator
|
|
433
|
+
sage: E = EnumeratedSetFromIterator(count, args=(1,), cache=True)
|
|
434
|
+
sage: e1 = E._cache; e1
|
|
435
|
+
lazy list [1, 2, 3, ...]
|
|
436
|
+
sage: E.clear_cache()
|
|
437
|
+
sage: E._cache
|
|
438
|
+
lazy list [1, 2, 3, ...]
|
|
439
|
+
sage: e1 is E._cache
|
|
440
|
+
False
|
|
441
|
+
"""
|
|
442
|
+
if hasattr(self, '_cache'):
|
|
443
|
+
self._cache = lazy_list(iter(self._func(
|
|
444
|
+
*getattr(self, '_args', ()),
|
|
445
|
+
**getattr(self, '_kwds', {}))))
|
|
446
|
+
|
|
447
|
+
#
|
|
448
|
+
# Decorators
|
|
449
|
+
#
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
# TODO: move it in sage.misc ?
|
|
453
|
+
@instancedoc
|
|
454
|
+
class Decorator:
|
|
455
|
+
r"""
|
|
456
|
+
Abstract class that manage documentation and sources of the wrapped object.
|
|
457
|
+
|
|
458
|
+
The method needs to be stored in the attribute ``self.f``
|
|
459
|
+
"""
|
|
460
|
+
def _instancedoc_(self):
|
|
461
|
+
"""
|
|
462
|
+
Provide documentation for the wrapped function.
|
|
463
|
+
|
|
464
|
+
TESTS::
|
|
465
|
+
|
|
466
|
+
sage: from sage.misc.sageinspect import sage_getdoc
|
|
467
|
+
sage: from sage.sets.set_from_iterator import Decorator
|
|
468
|
+
sage: d = Decorator()
|
|
469
|
+
sage: d.f = Integer.is_prime
|
|
470
|
+
sage: print(sage_getdoc(d)) # indirect doctest
|
|
471
|
+
Test whether "self" is prime.
|
|
472
|
+
...
|
|
473
|
+
Calls the PARI ...isprime...
|
|
474
|
+
"""
|
|
475
|
+
# Duplicates sage.misc.cachefunc.CachedFunction._instancedoc_
|
|
476
|
+
from sage.misc.sageinspect import sage_getsourcelines, sage_getfile_relative, _extract_embedded_position
|
|
477
|
+
f = self.f
|
|
478
|
+
doc = f.__doc__ or ''
|
|
479
|
+
if _extract_embedded_position(doc) is None:
|
|
480
|
+
try:
|
|
481
|
+
sourcelines = sage_getsourcelines(f)
|
|
482
|
+
filename = sage_getfile_relative(f)
|
|
483
|
+
file_info = "File: %s (starting at line %d)\n" % (filename, sourcelines[1])
|
|
484
|
+
doc = file_info + doc
|
|
485
|
+
except OSError:
|
|
486
|
+
pass
|
|
487
|
+
return doc
|
|
488
|
+
|
|
489
|
+
def _sage_src_(self):
|
|
490
|
+
r"""
|
|
491
|
+
Return the source code for the wrapped function.
|
|
492
|
+
|
|
493
|
+
TESTS::
|
|
494
|
+
|
|
495
|
+
sage: from sage.misc.sageinspect import sage_getsource
|
|
496
|
+
sage: from sage.sets.set_from_iterator import Decorator
|
|
497
|
+
sage: d = Decorator()
|
|
498
|
+
sage: d.f = Rational.is_square
|
|
499
|
+
sage: print(sage_getsource(d.f)) # indirect doctest
|
|
500
|
+
def is_square(self):
|
|
501
|
+
...
|
|
502
|
+
return mpq_sgn(self.value) >= 0 and mpz_perfect_square_p(mpq_numref(self.value)) and mpz_perfect_square_p(mpq_denref(self.value))
|
|
503
|
+
"""
|
|
504
|
+
from sage.misc.sageinspect import sage_getsource
|
|
505
|
+
return sage_getsource(self.f)
|
|
506
|
+
|
|
507
|
+
def _sage_src_lines_(self):
|
|
508
|
+
r"""
|
|
509
|
+
Return the list of source lines and the first line number
|
|
510
|
+
of the wrapped function.
|
|
511
|
+
|
|
512
|
+
TESTS::
|
|
513
|
+
|
|
514
|
+
sage: # needs sage.groups
|
|
515
|
+
sage: from sage.misc.sageinspect import sage_getsourcelines
|
|
516
|
+
sage: from sage.sets.set_from_iterator import Decorator
|
|
517
|
+
sage: d = Decorator()
|
|
518
|
+
sage: d.f = MathieuGroup.order
|
|
519
|
+
sage: S = sage_getsourcelines(d) # indirect doctest
|
|
520
|
+
sage: S[0][2]
|
|
521
|
+
' Return the number of elements of this group.\n'
|
|
522
|
+
sage: S[0][25]
|
|
523
|
+
' if not gens:\n'
|
|
524
|
+
"""
|
|
525
|
+
from sage.misc.sageinspect import sage_getsourcelines
|
|
526
|
+
return sage_getsourcelines(self.f)
|
|
527
|
+
|
|
528
|
+
def _sage_argspec_(self):
|
|
529
|
+
"""
|
|
530
|
+
Return the argument specification of the wrapped function or method.
|
|
531
|
+
|
|
532
|
+
TESTS::
|
|
533
|
+
|
|
534
|
+
sage: # needs sage.modules
|
|
535
|
+
sage: from sage.misc.sageinspect import sage_getargspec
|
|
536
|
+
sage: from sage.sets.set_from_iterator import Decorator
|
|
537
|
+
sage: d = Decorator()
|
|
538
|
+
sage: d.f = find_local_minimum
|
|
539
|
+
sage: sage_getargspec(d) # indirect doctest
|
|
540
|
+
FullArgSpec(args=['f', 'a', 'b', 'tol', 'maxfun'],
|
|
541
|
+
varargs=None, varkw=None, defaults=(1.48e-08, 500),
|
|
542
|
+
kwonlyargs=[], kwonlydefaults=None, annotations={})
|
|
543
|
+
"""
|
|
544
|
+
from sage.misc.sageinspect import sage_getargspec
|
|
545
|
+
return sage_getargspec(self.f)
|
|
546
|
+
|
|
547
|
+
def __call__(self, *args, **kwds):
|
|
548
|
+
r"""
|
|
549
|
+
Call function.
|
|
550
|
+
|
|
551
|
+
Needs to be implemented in derived subclass.
|
|
552
|
+
|
|
553
|
+
TESTS::
|
|
554
|
+
|
|
555
|
+
sage: from sage.sets.set_from_iterator import Decorator
|
|
556
|
+
sage: d = Decorator()
|
|
557
|
+
sage: d()
|
|
558
|
+
Traceback (most recent call last):
|
|
559
|
+
...
|
|
560
|
+
NotImplementedError
|
|
561
|
+
"""
|
|
562
|
+
raise NotImplementedError
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
@instancedoc
|
|
566
|
+
class EnumeratedSetFromIterator_function_decorator(Decorator):
|
|
567
|
+
r"""
|
|
568
|
+
Decorator for :class:`EnumeratedSetFromIterator`.
|
|
569
|
+
|
|
570
|
+
Name could be string or a function ``(args, kwds) -> string``.
|
|
571
|
+
|
|
572
|
+
.. WARNING::
|
|
573
|
+
|
|
574
|
+
If you are going to use this with the decorator :func:`cached_function`,
|
|
575
|
+
you must place the ``@cached_function`` first. See the example below.
|
|
576
|
+
|
|
577
|
+
EXAMPLES::
|
|
578
|
+
|
|
579
|
+
sage: from sage.sets.set_from_iterator import set_from_function
|
|
580
|
+
sage: @set_from_function
|
|
581
|
+
....: def f(n):
|
|
582
|
+
....: for i in range(n):
|
|
583
|
+
....: yield i**2 + i + 1
|
|
584
|
+
sage: f(3)
|
|
585
|
+
{1, 3, 7}
|
|
586
|
+
sage: f(100)
|
|
587
|
+
{1, 3, 7, 13, 21, ...}
|
|
588
|
+
|
|
589
|
+
To avoid ambiguity, it is always better to use it with a call which
|
|
590
|
+
provides optional global initialization for the call to
|
|
591
|
+
:class:`EnumeratedSetFromIterator`::
|
|
592
|
+
|
|
593
|
+
sage: @set_from_function(category=InfiniteEnumeratedSets())
|
|
594
|
+
....: def Fibonacci():
|
|
595
|
+
....: a = 1; b = 2
|
|
596
|
+
....: while True:
|
|
597
|
+
....: yield a
|
|
598
|
+
....: a, b = b, a + b
|
|
599
|
+
sage: F = Fibonacci(); F
|
|
600
|
+
{1, 2, 3, 5, 8, ...}
|
|
601
|
+
sage: F.cardinality()
|
|
602
|
+
+Infinity
|
|
603
|
+
|
|
604
|
+
A simple example with many options::
|
|
605
|
+
|
|
606
|
+
sage: @set_from_function(name="From %(m)d to %(n)d",
|
|
607
|
+
....: category=FiniteEnumeratedSets())
|
|
608
|
+
....: def f(m, n): return xsrange(m, n + 1)
|
|
609
|
+
sage: E = f(3,10); E
|
|
610
|
+
From 3 to 10
|
|
611
|
+
sage: E.list()
|
|
612
|
+
[3, 4, 5, 6, 7, 8, 9, 10]
|
|
613
|
+
sage: E = f(1,100); E
|
|
614
|
+
From 1 to 100
|
|
615
|
+
sage: E.cardinality()
|
|
616
|
+
100
|
|
617
|
+
sage: f(n=100, m=1) == E
|
|
618
|
+
True
|
|
619
|
+
|
|
620
|
+
An example which mixes together :func:`set_from_function` and
|
|
621
|
+
:func:`cached_method`::
|
|
622
|
+
|
|
623
|
+
sage: @cached_function
|
|
624
|
+
....: @set_from_function(name="Graphs on %(n)d vertices",
|
|
625
|
+
....: category=FiniteEnumeratedSets(), cache=True)
|
|
626
|
+
....: def Graphs(n): return graphs(n)
|
|
627
|
+
sage: Graphs(10) # needs nauty sage.graphs
|
|
628
|
+
Graphs on 10 vertices
|
|
629
|
+
sage: Graphs(10).unrank(0) # needs nauty sage.graphs
|
|
630
|
+
Graph on 10 vertices
|
|
631
|
+
sage: Graphs(10) is Graphs(10) # needs nauty sage.graphs
|
|
632
|
+
True
|
|
633
|
+
|
|
634
|
+
The ``@cached_function`` must go first::
|
|
635
|
+
|
|
636
|
+
sage: @set_from_function(name="Graphs on %(n)d vertices",
|
|
637
|
+
....: category=FiniteEnumeratedSets(), cache=True)
|
|
638
|
+
....: @cached_function
|
|
639
|
+
....: def Graphs(n): return graphs(n)
|
|
640
|
+
sage: Graphs(10) # needs nauty sage.graphs
|
|
641
|
+
Graphs on 10 vertices
|
|
642
|
+
sage: Graphs(10).unrank(0) # needs nauty sage.graphs
|
|
643
|
+
Graph on 10 vertices
|
|
644
|
+
sage: Graphs(10) is Graphs(10) # needs nauty sage.graphs
|
|
645
|
+
False
|
|
646
|
+
"""
|
|
647
|
+
def __init__(self, f=None, name=None, **options):
|
|
648
|
+
r"""
|
|
649
|
+
Initialize ``self``.
|
|
650
|
+
|
|
651
|
+
TESTS::
|
|
652
|
+
|
|
653
|
+
sage: from sage.sets.set_from_iterator import set_from_function
|
|
654
|
+
sage: F = set_from_function(category=FiniteEnumeratedSets())(xsrange)
|
|
655
|
+
sage: TestSuite(F(100)).run()
|
|
656
|
+
sage: TestSuite(F(1,5,2)).run()
|
|
657
|
+
sage: TestSuite(F(0)).run()
|
|
658
|
+
"""
|
|
659
|
+
if f is not None:
|
|
660
|
+
self.f = f
|
|
661
|
+
if hasattr(f, "__name__"):
|
|
662
|
+
self.__name__ = f.__name__
|
|
663
|
+
else:
|
|
664
|
+
self.__name__ = f.__name__
|
|
665
|
+
self.__module__ = f.__module__
|
|
666
|
+
self.af = ArgumentFixer(f)
|
|
667
|
+
if name is not None:
|
|
668
|
+
self.name = name
|
|
669
|
+
self.options = options
|
|
670
|
+
|
|
671
|
+
def __call__(self, *args, **kwds):
|
|
672
|
+
r"""
|
|
673
|
+
Build a new :class:`EnumeratedSet` by calling ``self.f`` with
|
|
674
|
+
appropriate argument. If ``f`` is ``None``, then returns a new instance
|
|
675
|
+
of :class:`EnumeratedSetFromIterator`.
|
|
676
|
+
|
|
677
|
+
EXAMPLES::
|
|
678
|
+
|
|
679
|
+
sage: from sage.sets.set_from_iterator import set_from_function
|
|
680
|
+
sage: F = set_from_function(category=FiniteEnumeratedSets())(xsrange)
|
|
681
|
+
sage: F(3)
|
|
682
|
+
{0, 1, 2}
|
|
683
|
+
sage: F(end=7,start=3)
|
|
684
|
+
{3, 4, 5, 6}
|
|
685
|
+
sage: F(10).cardinality()
|
|
686
|
+
10
|
|
687
|
+
"""
|
|
688
|
+
if hasattr(self, 'f'): # yet initialized
|
|
689
|
+
if hasattr(self, 'name'):
|
|
690
|
+
if isinstance(self.name, str):
|
|
691
|
+
if args or kwds:
|
|
692
|
+
_, kk = self.af.fix_to_named(*args, **kwds)
|
|
693
|
+
name = self.name % dict(kk)
|
|
694
|
+
else:
|
|
695
|
+
name = self.name
|
|
696
|
+
else:
|
|
697
|
+
name = self.name(*args, **kwds)
|
|
698
|
+
return EnumeratedSetFromIterator(self.f, args, kwds, name=name, **self.options)
|
|
699
|
+
return EnumeratedSetFromIterator(self.f, args, kwds, **self.options)
|
|
700
|
+
|
|
701
|
+
else: # potential global options
|
|
702
|
+
if args == ():
|
|
703
|
+
f, = kwds.values()
|
|
704
|
+
else:
|
|
705
|
+
assert len(args) == 1
|
|
706
|
+
f = args[0]
|
|
707
|
+
return EnumeratedSetFromIterator_function_decorator(
|
|
708
|
+
f,
|
|
709
|
+
name=getattr(self, 'name', None),
|
|
710
|
+
**self.options)
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
set_from_function = EnumeratedSetFromIterator_function_decorator
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
@instancedoc
|
|
717
|
+
class EnumeratedSetFromIterator_method_caller(Decorator):
|
|
718
|
+
r"""
|
|
719
|
+
Caller for decorated method in class.
|
|
720
|
+
|
|
721
|
+
INPUT:
|
|
722
|
+
|
|
723
|
+
- ``inst`` -- an instance of a class
|
|
724
|
+
|
|
725
|
+
- ``f`` -- a method of a class of ``inst`` (and not of the instance itself)
|
|
726
|
+
|
|
727
|
+
- ``name`` -- (optional) either a string (which may contains substitution
|
|
728
|
+
rules from argument or a function ``args, kwds -> string``
|
|
729
|
+
|
|
730
|
+
- ``options`` -- any option accepted by :class:`EnumeratedSetFromIterator`
|
|
731
|
+
"""
|
|
732
|
+
def __init__(self, inst, f, name=None, **options):
|
|
733
|
+
r"""
|
|
734
|
+
Initialize ``self``.
|
|
735
|
+
|
|
736
|
+
TESTS::
|
|
737
|
+
|
|
738
|
+
sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
|
|
739
|
+
sage: d = DummyExampleForPicklingTest()
|
|
740
|
+
sage: d.f()
|
|
741
|
+
{10, 11, 12, 13, 14, ...}
|
|
742
|
+
|
|
743
|
+
It is possible to pickle/unpickle the class and the instance::
|
|
744
|
+
|
|
745
|
+
sage: loads(dumps(DummyExampleForPicklingTest))().f()
|
|
746
|
+
{10, 11, 12, 13, 14, ...}
|
|
747
|
+
sage: loads(dumps(d)).f()
|
|
748
|
+
{10, 11, 12, 13, 14, ...}
|
|
749
|
+
|
|
750
|
+
But not the enumerated set::
|
|
751
|
+
|
|
752
|
+
sage: from _pickle import PicklingError
|
|
753
|
+
sage: try:
|
|
754
|
+
....: loads(dumps(d.f()))
|
|
755
|
+
....: except PicklingError as e:
|
|
756
|
+
....: print("PicklingError caught")
|
|
757
|
+
PicklingError caught
|
|
758
|
+
"""
|
|
759
|
+
self.inst = inst
|
|
760
|
+
self.f = f
|
|
761
|
+
self.af = ArgumentFixer(self.f)
|
|
762
|
+
if hasattr(f, "__name__"):
|
|
763
|
+
self.__name__ = f.__name__
|
|
764
|
+
else:
|
|
765
|
+
self.__name__ = f.__name__
|
|
766
|
+
self.__module__ = f.__module__
|
|
767
|
+
|
|
768
|
+
self.name = name
|
|
769
|
+
self.options = options
|
|
770
|
+
|
|
771
|
+
def __call__(self, *args, **kwds):
|
|
772
|
+
r"""
|
|
773
|
+
Return an instance of :class:`EnumeratedSetFromIterator` with
|
|
774
|
+
proper argument.
|
|
775
|
+
|
|
776
|
+
TESTS::
|
|
777
|
+
|
|
778
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
779
|
+
sage: class A:
|
|
780
|
+
....: @set_from_method(name = lambda self,n: str(self)*n)
|
|
781
|
+
....: def f(self, n):
|
|
782
|
+
....: return xsrange(n)
|
|
783
|
+
....: def __repr__(self):
|
|
784
|
+
....: return "A"
|
|
785
|
+
sage: a = A()
|
|
786
|
+
sage: a.f(3) # indirect doctest
|
|
787
|
+
AAA
|
|
788
|
+
sage: A.f(a,3) # indirect doctest
|
|
789
|
+
AAA
|
|
790
|
+
sage: [x for x in a.f(6)] # indirect doctest
|
|
791
|
+
[0, 1, 2, 3, 4, 5]
|
|
792
|
+
"""
|
|
793
|
+
if self.inst is not None:
|
|
794
|
+
args = (self.inst,) + args
|
|
795
|
+
if self.name:
|
|
796
|
+
if isinstance(self.name, str):
|
|
797
|
+
aa, kk = self.af.fix_to_named(*args, **kwds)
|
|
798
|
+
name = self.name % dict(kk)
|
|
799
|
+
else:
|
|
800
|
+
name = self.name(*args, **kwds)
|
|
801
|
+
return EnumeratedSetFromIterator(self.f, args, kwds, name, **self.options)
|
|
802
|
+
return EnumeratedSetFromIterator(self.f, args, kwds, **self.options)
|
|
803
|
+
|
|
804
|
+
def __get__(self, inst, cls):
|
|
805
|
+
r"""
|
|
806
|
+
Get a :class:`EnumeratedSetFromIterator_method_caller` bound to a
|
|
807
|
+
specific instance of the class of the cached method.
|
|
808
|
+
|
|
809
|
+
.. NOTE::
|
|
810
|
+
|
|
811
|
+
:class:`EnumeratedSetFromIterator_method_caller` has a separate
|
|
812
|
+
``__get__`` because of the special behavior of category framework
|
|
813
|
+
for element classes which are not of extension type (see
|
|
814
|
+
:meth:`sage.structure.element.Element.__get__`).
|
|
815
|
+
|
|
816
|
+
TESTS::
|
|
817
|
+
|
|
818
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
819
|
+
sage: class A:
|
|
820
|
+
....: stop = 10000
|
|
821
|
+
....: @set_from_method
|
|
822
|
+
....: def f(self, start):
|
|
823
|
+
....: return xsrange(start, self.stop)
|
|
824
|
+
sage: a = A()
|
|
825
|
+
sage: A.f(a,4)
|
|
826
|
+
{4, 5, 6, 7, 8, ...}
|
|
827
|
+
|
|
828
|
+
sage: class B:
|
|
829
|
+
....: stop = 10000
|
|
830
|
+
....: @set_from_method(category=FiniteEnumeratedSets())
|
|
831
|
+
....: def f(self, start):
|
|
832
|
+
....: return xsrange(start, self.stop)
|
|
833
|
+
sage: b = B()
|
|
834
|
+
sage: B.f(b,2)
|
|
835
|
+
{2, 3, 4, 5, 6, ...}
|
|
836
|
+
"""
|
|
837
|
+
return EnumeratedSetFromIterator_method_caller(
|
|
838
|
+
inst, self.f,
|
|
839
|
+
self.name,
|
|
840
|
+
**self.options)
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
class EnumeratedSetFromIterator_method_decorator:
|
|
844
|
+
r"""
|
|
845
|
+
Decorator for enumerated set built from a method.
|
|
846
|
+
|
|
847
|
+
INPUT:
|
|
848
|
+
|
|
849
|
+
- ``f`` -- (optional) function from which are built the enumerated sets at
|
|
850
|
+
each call
|
|
851
|
+
|
|
852
|
+
- ``name`` -- (optional) string (which may contains substitution rules from
|
|
853
|
+
argument) or a function ``(args,kwds) -> string``
|
|
854
|
+
|
|
855
|
+
- any option accepted by :class:`EnumeratedSetFromIterator`.
|
|
856
|
+
|
|
857
|
+
EXAMPLES::
|
|
858
|
+
|
|
859
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
860
|
+
sage: class A():
|
|
861
|
+
....: def n(self): return 12
|
|
862
|
+
....: @set_from_method
|
|
863
|
+
....: def f(self): return xsrange(self.n())
|
|
864
|
+
sage: a = A()
|
|
865
|
+
sage: print(a.f.__class__)
|
|
866
|
+
<class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
|
|
867
|
+
sage: a.f()
|
|
868
|
+
{0, 1, 2, 3, 4, ...}
|
|
869
|
+
sage: A.f(a)
|
|
870
|
+
{0, 1, 2, 3, 4, ...}
|
|
871
|
+
|
|
872
|
+
A more complicated example with a parametrized name::
|
|
873
|
+
|
|
874
|
+
sage: class B():
|
|
875
|
+
....: @set_from_method(name="Graphs(%(n)d)",
|
|
876
|
+
....: category=FiniteEnumeratedSets())
|
|
877
|
+
....: def graphs(self, n): return graphs(n)
|
|
878
|
+
sage: b = B()
|
|
879
|
+
sage: G3 = b.graphs(3); G3
|
|
880
|
+
Graphs(3)
|
|
881
|
+
sage: G3.cardinality() # needs nauty sage.graphs
|
|
882
|
+
4
|
|
883
|
+
sage: G3.category()
|
|
884
|
+
Category of facade finite enumerated sets
|
|
885
|
+
sage: B.graphs(b, 3)
|
|
886
|
+
Graphs(3)
|
|
887
|
+
|
|
888
|
+
And a last example with a name parametrized by a function::
|
|
889
|
+
|
|
890
|
+
sage: class D():
|
|
891
|
+
....: def __init__(self, name): self.name = str(name)
|
|
892
|
+
....: def __str__(self): return self.name
|
|
893
|
+
....: @set_from_method(name=lambda self, n: str(self) * n,
|
|
894
|
+
....: category=FiniteEnumeratedSets())
|
|
895
|
+
....: def subset(self, n):
|
|
896
|
+
....: return xsrange(n)
|
|
897
|
+
sage: d = D('a')
|
|
898
|
+
sage: E = d.subset(3); E
|
|
899
|
+
aaa
|
|
900
|
+
sage: E.list()
|
|
901
|
+
[0, 1, 2]
|
|
902
|
+
sage: F = d.subset(n=10); F
|
|
903
|
+
aaaaaaaaaa
|
|
904
|
+
sage: F.list()
|
|
905
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
906
|
+
|
|
907
|
+
.. TODO::
|
|
908
|
+
|
|
909
|
+
It is not yet possible to use ``set_from_method`` in conjunction with
|
|
910
|
+
``cached_method``.
|
|
911
|
+
"""
|
|
912
|
+
def __init__(self, f=None, **options):
|
|
913
|
+
r"""
|
|
914
|
+
Initialize ``self``.
|
|
915
|
+
|
|
916
|
+
TESTS:
|
|
917
|
+
|
|
918
|
+
We test if pickling works correctly on the Permutation class (in
|
|
919
|
+
:mod:`sage.combinat.permutation`) because its method ``bruhat_succ``
|
|
920
|
+
and ``bruhat_pred`` are decorated with ``set_from_method``::
|
|
921
|
+
|
|
922
|
+
sage: from sage.combinat.permutation import Permutation
|
|
923
|
+
sage: loads(dumps(Permutation))
|
|
924
|
+
<class 'sage.combinat.permutation.Permutation'>
|
|
925
|
+
sage: p = Permutation([3,2,1])
|
|
926
|
+
sage: loads(dumps(p)) == p
|
|
927
|
+
True
|
|
928
|
+
"""
|
|
929
|
+
if f is not None:
|
|
930
|
+
self.f = f
|
|
931
|
+
if hasattr(f, "__name__"):
|
|
932
|
+
self.__name__ = f.__name__
|
|
933
|
+
self.__module__ = f.__module__
|
|
934
|
+
else:
|
|
935
|
+
if hasattr(f, '__module__'):
|
|
936
|
+
self.__module__ = f.__module__
|
|
937
|
+
elif hasattr(f, '__func__'):
|
|
938
|
+
self.__module__ = f.__func__.__module__
|
|
939
|
+
|
|
940
|
+
if hasattr(f, '__name__'):
|
|
941
|
+
self.__name__ = f.__name__
|
|
942
|
+
elif hasattr(f, '__func__'):
|
|
943
|
+
self.__name__ = f.__func__.__name__
|
|
944
|
+
|
|
945
|
+
self.options = options
|
|
946
|
+
|
|
947
|
+
def __call__(self, f):
|
|
948
|
+
r"""
|
|
949
|
+
Trick if :class:`EnumeratedSetFromIterator_method` was created with
|
|
950
|
+
some options and is called with a function as argument.
|
|
951
|
+
|
|
952
|
+
TESTS::
|
|
953
|
+
|
|
954
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
955
|
+
sage: class A: # indirect doctest
|
|
956
|
+
....: @set_from_method()
|
|
957
|
+
....: def f(self):
|
|
958
|
+
....: return xsrange(3)
|
|
959
|
+
sage: a = A()
|
|
960
|
+
sage: a.f()
|
|
961
|
+
{0, 1, 2}
|
|
962
|
+
"""
|
|
963
|
+
return EnumeratedSetFromIterator_method_decorator(f, **self.options)
|
|
964
|
+
|
|
965
|
+
def __get__(self, inst, cls):
|
|
966
|
+
r"""
|
|
967
|
+
TESTS::
|
|
968
|
+
|
|
969
|
+
sage: from sage.sets.set_from_iterator import set_from_method
|
|
970
|
+
sage: class A():
|
|
971
|
+
....: def n(self): return 12
|
|
972
|
+
....: @set_from_method
|
|
973
|
+
....: def f(self): return xsrange(self.n())
|
|
974
|
+
sage: a = A()
|
|
975
|
+
sage: print(A.f.__class__)
|
|
976
|
+
<class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
|
|
977
|
+
sage: print(a.f.__class__)
|
|
978
|
+
<class 'sage.sets.set_from_iterator.EnumeratedSetFromIterator_method_caller'>
|
|
979
|
+
"""
|
|
980
|
+
# You would hardly ever see an instance of this class alive.
|
|
981
|
+
return EnumeratedSetFromIterator_method_caller(inst, self.f, **self.options)
|
|
982
|
+
|
|
983
|
+
|
|
984
|
+
set_from_method = EnumeratedSetFromIterator_method_decorator
|
|
985
|
+
|
|
986
|
+
|
|
987
|
+
class DummyExampleForPicklingTest:
|
|
988
|
+
r"""
|
|
989
|
+
Class example to test pickling with the decorator :class:`set_from_method`.
|
|
990
|
+
|
|
991
|
+
.. WARNING::
|
|
992
|
+
|
|
993
|
+
This class is intended to be used in doctest only.
|
|
994
|
+
|
|
995
|
+
EXAMPLES::
|
|
996
|
+
|
|
997
|
+
sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
|
|
998
|
+
sage: DummyExampleForPicklingTest().f()
|
|
999
|
+
{10, 11, 12, 13, 14, ...}
|
|
1000
|
+
"""
|
|
1001
|
+
start = 10
|
|
1002
|
+
stop = 100
|
|
1003
|
+
|
|
1004
|
+
@set_from_method
|
|
1005
|
+
def f(self):
|
|
1006
|
+
r"""
|
|
1007
|
+
Return the set between ``self.start`` and ``self.stop``.
|
|
1008
|
+
|
|
1009
|
+
EXAMPLES::
|
|
1010
|
+
|
|
1011
|
+
sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest
|
|
1012
|
+
sage: d = DummyExampleForPicklingTest()
|
|
1013
|
+
sage: d.f()
|
|
1014
|
+
{10, 11, 12, 13, 14, ...}
|
|
1015
|
+
sage: d.start = 4
|
|
1016
|
+
sage: d.stop = 200
|
|
1017
|
+
sage: d.f()
|
|
1018
|
+
{4, 5, 6, 7, 8, ...}
|
|
1019
|
+
"""
|
|
1020
|
+
from sage.arith.srange import xsrange
|
|
1021
|
+
return xsrange(self.start, self.stop)
|