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,625 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Disjoint union of enumerated sets
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Florent Hivert (2009-07/09): initial implementation.
|
|
8
|
+
- Florent Hivert (2010-03): classcall related stuff.
|
|
9
|
+
- Florent Hivert (2010-12): fixed facade element construction.
|
|
10
|
+
"""
|
|
11
|
+
# ***************************************************************************
|
|
12
|
+
# Copyright (C) 2009 Florent Hivert <Florent.Hivert@univ-rouen.fr>
|
|
13
|
+
#
|
|
14
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
15
|
+
# https://www.gnu.org/licenses/
|
|
16
|
+
# ***************************************************************************
|
|
17
|
+
|
|
18
|
+
from sage.structure.element import Element
|
|
19
|
+
from sage.structure.parent import Parent
|
|
20
|
+
from sage.structure.element_wrapper import ElementWrapper
|
|
21
|
+
from sage.sets.family import Family
|
|
22
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
23
|
+
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
|
|
24
|
+
from sage.rings.infinity import Infinity
|
|
25
|
+
from sage.misc.cachefunc import cached_method
|
|
26
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
27
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class DisjointUnionEnumeratedSets(UniqueRepresentation, Parent):
|
|
31
|
+
"""
|
|
32
|
+
A class for disjoint unions of enumerated sets.
|
|
33
|
+
|
|
34
|
+
INPUT:
|
|
35
|
+
|
|
36
|
+
- ``family`` -- list (or iterable or family) of enumerated sets
|
|
37
|
+
- ``keepkey`` -- boolean
|
|
38
|
+
- ``facade`` -- boolean
|
|
39
|
+
|
|
40
|
+
This models the enumerated set obtained by concatenating together
|
|
41
|
+
the specified ordered sets. The latter are supposed to be pairwise
|
|
42
|
+
disjoint; otherwise, a multiset is created.
|
|
43
|
+
|
|
44
|
+
The argument ``family`` can be a list, a tuple, a dictionary, or a
|
|
45
|
+
family. If it is not a family it is first converted into a family
|
|
46
|
+
(see :func:`sage.sets.family.Family`).
|
|
47
|
+
|
|
48
|
+
Experimental options:
|
|
49
|
+
|
|
50
|
+
By default, there is no way to tell from which set of the union an
|
|
51
|
+
element is generated. The option ``keepkey=True`` keeps track of
|
|
52
|
+
those by returning pairs ``(key, el)`` where ``key`` is the index
|
|
53
|
+
of the set to which ``el`` belongs. When this option is specified,
|
|
54
|
+
the enumerated sets need not be disjoint anymore.
|
|
55
|
+
|
|
56
|
+
With the option ``facade=False`` the elements are wrapped in an
|
|
57
|
+
object whose parent is the disjoint union itself. The wrapped
|
|
58
|
+
object can then be recovered using the ``value`` attribute.
|
|
59
|
+
|
|
60
|
+
The two options can be combined.
|
|
61
|
+
|
|
62
|
+
The names of those options is imperfect, and subject to change in
|
|
63
|
+
future versions. Feedback welcome.
|
|
64
|
+
|
|
65
|
+
EXAMPLES:
|
|
66
|
+
|
|
67
|
+
The input can be a list or a tuple of FiniteEnumeratedSets::
|
|
68
|
+
|
|
69
|
+
sage: U1 = DisjointUnionEnumeratedSets((
|
|
70
|
+
....: FiniteEnumeratedSet([1,2,3]),
|
|
71
|
+
....: FiniteEnumeratedSet([4,5,6])))
|
|
72
|
+
sage: U1
|
|
73
|
+
Disjoint union of Family ({1, 2, 3}, {4, 5, 6})
|
|
74
|
+
sage: U1.list()
|
|
75
|
+
[1, 2, 3, 4, 5, 6]
|
|
76
|
+
sage: U1.cardinality()
|
|
77
|
+
6
|
|
78
|
+
|
|
79
|
+
The input can also be a dictionary::
|
|
80
|
+
|
|
81
|
+
sage: U2 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
82
|
+
....: 2: FiniteEnumeratedSet([4,5,6])})
|
|
83
|
+
sage: U2
|
|
84
|
+
Disjoint union of Finite family {1: {1, 2, 3}, 2: {4, 5, 6}}
|
|
85
|
+
sage: U2.list()
|
|
86
|
+
[1, 2, 3, 4, 5, 6]
|
|
87
|
+
sage: U2.cardinality()
|
|
88
|
+
6
|
|
89
|
+
|
|
90
|
+
However in that case the enumeration order is not specified.
|
|
91
|
+
|
|
92
|
+
In general the input can be any family::
|
|
93
|
+
|
|
94
|
+
sage: # needs sage.combinat
|
|
95
|
+
sage: U3 = DisjointUnionEnumeratedSets(
|
|
96
|
+
....: Family([2,3,4], Permutations, lazy=True))
|
|
97
|
+
sage: U3
|
|
98
|
+
Disjoint union of Lazy family
|
|
99
|
+
(<class 'sage.combinat.permutation.Permutations'>(i))_{i in [2, 3, 4]}
|
|
100
|
+
sage: U3.cardinality()
|
|
101
|
+
32
|
|
102
|
+
sage: it = iter(U3)
|
|
103
|
+
sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
|
|
104
|
+
[[1, 2], [2, 1], [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]
|
|
105
|
+
sage: U3.unrank(18)
|
|
106
|
+
[2, 4, 1, 3]
|
|
107
|
+
|
|
108
|
+
This allows for infinite unions::
|
|
109
|
+
|
|
110
|
+
sage: # needs sage.combinat
|
|
111
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
112
|
+
....: Family(NonNegativeIntegers(), Permutations))
|
|
113
|
+
sage: U4
|
|
114
|
+
Disjoint union of Lazy family
|
|
115
|
+
(<class 'sage.combinat.permutation.Permutations'>(i))_{i in Non negative integers}
|
|
116
|
+
sage: U4.cardinality()
|
|
117
|
+
+Infinity
|
|
118
|
+
sage: it = iter(U4)
|
|
119
|
+
sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
|
|
120
|
+
[[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
|
|
121
|
+
sage: U4.unrank(18)
|
|
122
|
+
[2, 3, 1, 4]
|
|
123
|
+
|
|
124
|
+
.. WARNING::
|
|
125
|
+
|
|
126
|
+
Beware that some of the operations assume in that case that infinitely
|
|
127
|
+
many of the enumerated sets are non empty.
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
.. RUBRIC:: Experimental options
|
|
131
|
+
|
|
132
|
+
We demonstrate the ``keepkey`` option::
|
|
133
|
+
|
|
134
|
+
sage: # needs sage.combinat
|
|
135
|
+
sage: Ukeep = DisjointUnionEnumeratedSets(
|
|
136
|
+
....: Family(list(range(4)), Permutations), keepkey=True)
|
|
137
|
+
sage: it = iter(Ukeep)
|
|
138
|
+
sage: [next(it) for i in range(6)]
|
|
139
|
+
[(0, []), (1, [1]), (2, [1, 2]), (2, [2, 1]), (3, [1, 2, 3]), (3, [1, 3, 2])]
|
|
140
|
+
sage: type(next(it)[1])
|
|
141
|
+
<class 'sage.combinat.permutation.StandardPermutations_n_with_category.element_class'>
|
|
142
|
+
|
|
143
|
+
We now demonstrate the ``facade`` option::
|
|
144
|
+
|
|
145
|
+
sage: # needs sage.combinat
|
|
146
|
+
sage: UNoFacade = DisjointUnionEnumeratedSets(
|
|
147
|
+
....: Family(list(range(4)), Permutations), facade=False)
|
|
148
|
+
sage: it = iter(UNoFacade)
|
|
149
|
+
sage: [next(it) for i in range(6)]
|
|
150
|
+
[[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
|
|
151
|
+
sage: el = next(it); el
|
|
152
|
+
[2, 1, 3]
|
|
153
|
+
sage: type(el)
|
|
154
|
+
<... 'sage.structure.element_wrapper.ElementWrapper'>
|
|
155
|
+
sage: el.parent() == UNoFacade
|
|
156
|
+
True
|
|
157
|
+
sage: elv = el.value; elv
|
|
158
|
+
[2, 1, 3]
|
|
159
|
+
sage: type(elv)
|
|
160
|
+
<class 'sage.combinat.permutation.StandardPermutations_n_with_category.element_class'>
|
|
161
|
+
|
|
162
|
+
The elements ``el`` of the disjoint union are simple wrapped elements.
|
|
163
|
+
So to access the methods, you need to do ``el.value``::
|
|
164
|
+
|
|
165
|
+
sage: el[0] # needs sage.combinat
|
|
166
|
+
Traceback (most recent call last):
|
|
167
|
+
...
|
|
168
|
+
TypeError: 'sage.structure.element_wrapper.ElementWrapper' object is not subscriptable
|
|
169
|
+
|
|
170
|
+
sage: el.value[0] # needs sage.combinat
|
|
171
|
+
2
|
|
172
|
+
|
|
173
|
+
Possible extensions: the current enumeration order is not suitable
|
|
174
|
+
for unions of infinite enumerated sets (except possibly for the
|
|
175
|
+
last one). One could add options to specify alternative enumeration
|
|
176
|
+
orders (anti-diagonal, round robin, ...) to handle this case.
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
.. RUBRIC:: Inheriting from ``DisjointUnionEnumeratedSets``
|
|
180
|
+
|
|
181
|
+
There are two different use cases for inheriting from
|
|
182
|
+
:class:`DisjointUnionEnumeratedSets`: writing a parent which
|
|
183
|
+
happens to be a disjoint union of some known parents, or writing
|
|
184
|
+
generic disjoint unions for some particular classes of
|
|
185
|
+
:class:`sage.categories.enumerated_sets.EnumeratedSets`.
|
|
186
|
+
|
|
187
|
+
- In the first use case, the input of the ``__init__`` method is
|
|
188
|
+
most likely different from that of
|
|
189
|
+
:class:`DisjointUnionEnumeratedSets`. Then, one simply
|
|
190
|
+
writes the ``__init__`` method as usual::
|
|
191
|
+
|
|
192
|
+
sage: class MyUnion(DisjointUnionEnumeratedSets):
|
|
193
|
+
....: def __init__(self):
|
|
194
|
+
....: DisjointUnionEnumeratedSets.__init__(self,
|
|
195
|
+
....: Family([1,2], Permutations))
|
|
196
|
+
sage: pp = MyUnion()
|
|
197
|
+
sage: pp.list()
|
|
198
|
+
[[1], [1, 2], [2, 1]]
|
|
199
|
+
|
|
200
|
+
In case the :meth:`__init__` method takes optional arguments,
|
|
201
|
+
or does some normalization on them, a specific method
|
|
202
|
+
``__classcall_private__`` is required (see the
|
|
203
|
+
documentation of :class:`UniqueRepresentation`).
|
|
204
|
+
|
|
205
|
+
- In the second use case, the input of the ``__init__`` method
|
|
206
|
+
is the same as that of :class:`DisjointUnionEnumeratedSets`;
|
|
207
|
+
one therefore wants to inherit the :meth:`__classcall_private__`
|
|
208
|
+
method as well, which can be achieved as follows::
|
|
209
|
+
|
|
210
|
+
sage: class UnionOfSpecialSets(DisjointUnionEnumeratedSets):
|
|
211
|
+
....: __classcall_private__ = staticmethod(DisjointUnionEnumeratedSets.__classcall_private__)
|
|
212
|
+
sage: psp = UnionOfSpecialSets(Family([1,2], Permutations))
|
|
213
|
+
sage: psp.list()
|
|
214
|
+
[[1], [1, 2], [2, 1]]
|
|
215
|
+
|
|
216
|
+
TESTS::
|
|
217
|
+
|
|
218
|
+
sage: TestSuite(U1).run()
|
|
219
|
+
sage: TestSuite(U2).run()
|
|
220
|
+
sage: TestSuite(U3).run() # needs sage.combinat
|
|
221
|
+
sage: TestSuite(U4).run() # needs sage.combinat
|
|
222
|
+
doctest:...: UserWarning: Disjoint union of Lazy family
|
|
223
|
+
(<class 'sage.combinat.permutation.Permutations'>(i))_{i in Non negative integers}
|
|
224
|
+
is an infinite union
|
|
225
|
+
The default implementation of __contains__ can loop forever. Please overload it.
|
|
226
|
+
sage: TestSuite(UNoFacade).run() # needs sage.combinat
|
|
227
|
+
|
|
228
|
+
We skip ``_test_an_element`` because the coercion framework does not
|
|
229
|
+
currently allow a tuple to be returned for facade parents::
|
|
230
|
+
|
|
231
|
+
sage: TestSuite(Ukeep).run(skip='_test_an_element') # needs sage.combinat
|
|
232
|
+
|
|
233
|
+
The following three lines are required for the pickling tests,
|
|
234
|
+
because the classes ``MyUnion`` and ``UnionOfSpecialSets`` have
|
|
235
|
+
been defined interactively::
|
|
236
|
+
|
|
237
|
+
sage: import __main__
|
|
238
|
+
sage: __main__.MyUnion = MyUnion
|
|
239
|
+
sage: __main__.UnionOfSpecialSets = UnionOfSpecialSets
|
|
240
|
+
|
|
241
|
+
sage: TestSuite(pp).run()
|
|
242
|
+
sage: TestSuite(psp).run()
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
@staticmethod
|
|
246
|
+
def __classcall_private__(cls, fam, facade=True,
|
|
247
|
+
keepkey=False, category=None):
|
|
248
|
+
"""
|
|
249
|
+
Normalization of arguments; see :class:`UniqueRepresentation`.
|
|
250
|
+
|
|
251
|
+
TESTS:
|
|
252
|
+
|
|
253
|
+
We check that disjoint unions have unique representation::
|
|
254
|
+
|
|
255
|
+
sage: U1 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
256
|
+
....: 2: FiniteEnumeratedSet([4,5,6])})
|
|
257
|
+
sage: U2 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
258
|
+
....: 2: FiniteEnumeratedSet([4,5,6])})
|
|
259
|
+
sage: U1 == U2
|
|
260
|
+
True
|
|
261
|
+
sage: U1 is U2 # indirect doctest
|
|
262
|
+
True
|
|
263
|
+
sage: U3 = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
264
|
+
....: 2: FiniteEnumeratedSet([4,5])})
|
|
265
|
+
sage: U1 == U3
|
|
266
|
+
False
|
|
267
|
+
"""
|
|
268
|
+
# facade = options.pop('facade', True);
|
|
269
|
+
# keepkey = options.pop('keepkey', False);
|
|
270
|
+
assert isinstance(facade, bool)
|
|
271
|
+
assert isinstance(keepkey, bool)
|
|
272
|
+
return super().__classcall__(
|
|
273
|
+
cls, Family(fam),
|
|
274
|
+
facade=facade, keepkey=keepkey, category=category)
|
|
275
|
+
|
|
276
|
+
def __init__(self, family, facade=True, keepkey=False, category=None):
|
|
277
|
+
"""
|
|
278
|
+
TESTS::
|
|
279
|
+
|
|
280
|
+
sage: U = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
281
|
+
....: 2: FiniteEnumeratedSet([4,5,6])})
|
|
282
|
+
sage: TestSuite(U).run()
|
|
283
|
+
|
|
284
|
+
sage: X = DisjointUnionEnumeratedSets({i: Partitions(i) for i in range(5)}) # needs sage.combinat sage.libs.flint
|
|
285
|
+
sage: TestSuite(X).run() # needs sage.combinat sage.libs.flint
|
|
286
|
+
"""
|
|
287
|
+
self._family = family
|
|
288
|
+
self._facade = facade
|
|
289
|
+
if facade:
|
|
290
|
+
# Note that family is not copied when it is a finite enumerated
|
|
291
|
+
# set, thus, any subclass must ensure that it does not mutate this
|
|
292
|
+
# input.
|
|
293
|
+
if family in FiniteEnumeratedSets():
|
|
294
|
+
self._facade_for = family
|
|
295
|
+
else:
|
|
296
|
+
# This allows the test suite to pass its tests by essentially
|
|
297
|
+
# stating that this is a facade for any parent. Technically
|
|
298
|
+
# this is wrong, but in practice, it will not have much
|
|
299
|
+
# of an effect.
|
|
300
|
+
self._facade_for = True
|
|
301
|
+
self._keepkey = keepkey
|
|
302
|
+
if self._is_category_initialized():
|
|
303
|
+
return
|
|
304
|
+
if category is None:
|
|
305
|
+
# try to guess if the result is infinite or not.
|
|
306
|
+
if self._family in InfiniteEnumeratedSets():
|
|
307
|
+
category = InfiniteEnumeratedSets()
|
|
308
|
+
elif self._family.last() in InfiniteEnumeratedSets():
|
|
309
|
+
category = InfiniteEnumeratedSets()
|
|
310
|
+
else:
|
|
311
|
+
category = FiniteEnumeratedSets()
|
|
312
|
+
Parent.__init__(self, facade=facade, category=category)
|
|
313
|
+
|
|
314
|
+
def _repr_(self):
|
|
315
|
+
"""
|
|
316
|
+
TESTS::
|
|
317
|
+
|
|
318
|
+
sage: U = DisjointUnionEnumeratedSets({1: FiniteEnumeratedSet([1,2,3]),
|
|
319
|
+
....: 2: FiniteEnumeratedSet([4,5,6])})
|
|
320
|
+
sage: U
|
|
321
|
+
Disjoint union of Finite family {1: {1, 2, 3}, 2: {4, 5, 6}}
|
|
322
|
+
"""
|
|
323
|
+
return "Disjoint union of %s" % self._family
|
|
324
|
+
|
|
325
|
+
def _is_a(self, x):
|
|
326
|
+
"""
|
|
327
|
+
Check if a Sage object ``x`` belongs to ``self``.
|
|
328
|
+
|
|
329
|
+
This methods is a helper for :meth:`__contains__` and the
|
|
330
|
+
constructor :meth:`_element_constructor_`.
|
|
331
|
+
|
|
332
|
+
EXAMPLES::
|
|
333
|
+
|
|
334
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
335
|
+
....: Family(NonNegativeIntegers(), Compositions))
|
|
336
|
+
sage: U4._is_a(Composition([3,2,1,1]))
|
|
337
|
+
doctest:...: UserWarning: Disjoint union of Lazy family
|
|
338
|
+
(<class 'sage.combinat.composition.Compositions'>(i))_{i in Non negative integers}
|
|
339
|
+
is an infinite union
|
|
340
|
+
The default implementation of __contains__ can loop forever. Please overload it.
|
|
341
|
+
True
|
|
342
|
+
"""
|
|
343
|
+
if self._keepkey:
|
|
344
|
+
return (isinstance(x, tuple) and
|
|
345
|
+
x[0] in self._family.keys() and
|
|
346
|
+
x[1] in self._family[x[0]])
|
|
347
|
+
else:
|
|
348
|
+
from warnings import warn
|
|
349
|
+
if self._family.cardinality() == Infinity:
|
|
350
|
+
warn("%s is an infinite union\nThe default implementation of __contains__ can loop forever. Please overload it." % (self))
|
|
351
|
+
return any(x in a for a in self._family)
|
|
352
|
+
|
|
353
|
+
def __contains__(self, x):
|
|
354
|
+
"""
|
|
355
|
+
Check containment.
|
|
356
|
+
|
|
357
|
+
.. WARNING::
|
|
358
|
+
|
|
359
|
+
If ``self`` is an infinite union and if the answer is
|
|
360
|
+
logically False, this will loop forever and never answer
|
|
361
|
+
``False``. Therefore, a warning is issued.
|
|
362
|
+
|
|
363
|
+
EXAMPLES::
|
|
364
|
+
|
|
365
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
366
|
+
....: Family(NonNegativeIntegers(), Partitions))
|
|
367
|
+
sage: Partition([]) in U4
|
|
368
|
+
doctest:...: UserWarning: Disjoint union of Lazy family
|
|
369
|
+
(<class 'sage.combinat.partition.Partitions'>(i))_{i in Non negative integers}
|
|
370
|
+
is an infinite union
|
|
371
|
+
The default implementation of __contains__ can loop forever. Please overload it.
|
|
372
|
+
True
|
|
373
|
+
|
|
374
|
+
Note: one has to use a different family from the previous one in this
|
|
375
|
+
file otherwise the warning is not re-issued::
|
|
376
|
+
|
|
377
|
+
sage: Partition([3,2,1,1]) in U4
|
|
378
|
+
True
|
|
379
|
+
|
|
380
|
+
The following call will loop forever::
|
|
381
|
+
|
|
382
|
+
sage: 2 in U4 # not tested, loop forever
|
|
383
|
+
"""
|
|
384
|
+
if self._facade:
|
|
385
|
+
return self._is_a(x)
|
|
386
|
+
else:
|
|
387
|
+
if isinstance(x, self.element_class):
|
|
388
|
+
return True
|
|
389
|
+
else:
|
|
390
|
+
return self._is_a(x)
|
|
391
|
+
|
|
392
|
+
def __iter__(self):
|
|
393
|
+
"""
|
|
394
|
+
TESTS::
|
|
395
|
+
|
|
396
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
397
|
+
....: Family(NonNegativeIntegers(), Permutations))
|
|
398
|
+
sage: it = iter(U4)
|
|
399
|
+
sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
|
|
400
|
+
[[], [1], [1, 2], [2, 1], [1, 2, 3], [1, 3, 2]]
|
|
401
|
+
|
|
402
|
+
sage: # needs sage.combinat
|
|
403
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
404
|
+
....: Family(NonNegativeIntegers(), Permutations),
|
|
405
|
+
....: keepkey=True, facade=False)
|
|
406
|
+
sage: it = iter(U4)
|
|
407
|
+
sage: [next(it), next(it), next(it), next(it), next(it), next(it)]
|
|
408
|
+
[(0, []), (1, [1]), (2, [1, 2]), (2, [2, 1]), (3, [1, 2, 3]), (3, [1, 3, 2])]
|
|
409
|
+
sage: el = next(it); el.parent() == U4
|
|
410
|
+
True
|
|
411
|
+
sage: el.value == (3, Permutation([2,1,3]))
|
|
412
|
+
True
|
|
413
|
+
"""
|
|
414
|
+
for k in self._family.keys():
|
|
415
|
+
for el in self._family[k]:
|
|
416
|
+
if self._keepkey:
|
|
417
|
+
el = (k, el)
|
|
418
|
+
if self._facade:
|
|
419
|
+
yield el
|
|
420
|
+
else:
|
|
421
|
+
yield self.element_class(self, el) # Bypass correctness tests
|
|
422
|
+
|
|
423
|
+
def an_element(self):
|
|
424
|
+
"""
|
|
425
|
+
Return an element of this disjoint union, as per
|
|
426
|
+
:meth:`Sets.ParentMethods.an_element`.
|
|
427
|
+
|
|
428
|
+
EXAMPLES::
|
|
429
|
+
|
|
430
|
+
sage: U4 = DisjointUnionEnumeratedSets(
|
|
431
|
+
....: Family([3, 5, 7], Permutations))
|
|
432
|
+
sage: U4.an_element()
|
|
433
|
+
[1, 2, 3]
|
|
434
|
+
"""
|
|
435
|
+
return self._an_element_from_iterator()
|
|
436
|
+
|
|
437
|
+
@cached_method
|
|
438
|
+
def cardinality(self):
|
|
439
|
+
"""
|
|
440
|
+
Return the cardinality of this disjoint union.
|
|
441
|
+
|
|
442
|
+
EXAMPLES:
|
|
443
|
+
|
|
444
|
+
For finite disjoint unions, the cardinality is computed by
|
|
445
|
+
summing the cardinalities of the enumerated sets::
|
|
446
|
+
|
|
447
|
+
sage: U = DisjointUnionEnumeratedSets(Family([0,1,2,3], Permutations))
|
|
448
|
+
sage: U.cardinality()
|
|
449
|
+
10
|
|
450
|
+
|
|
451
|
+
For infinite disjoint unions, this makes the assumption that
|
|
452
|
+
the result is infinite::
|
|
453
|
+
|
|
454
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
455
|
+
....: Family(NonNegativeIntegers(), Permutations))
|
|
456
|
+
sage: U.cardinality()
|
|
457
|
+
+Infinity
|
|
458
|
+
|
|
459
|
+
.. WARNING::
|
|
460
|
+
|
|
461
|
+
As pointed out in the main documentation, it is
|
|
462
|
+
possible to construct examples where this is incorrect::
|
|
463
|
+
|
|
464
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
465
|
+
....: Family(NonNegativeIntegers(), lambda x: []))
|
|
466
|
+
sage: U.cardinality() # Should be 0!
|
|
467
|
+
+Infinity
|
|
468
|
+
"""
|
|
469
|
+
if self._family.cardinality() == Infinity:
|
|
470
|
+
return Infinity
|
|
471
|
+
return sum(set.cardinality() for set in self._family)
|
|
472
|
+
|
|
473
|
+
@lazy_attribute
|
|
474
|
+
def _element_constructor_(self):
|
|
475
|
+
"""
|
|
476
|
+
TESTS::
|
|
477
|
+
|
|
478
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
479
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
480
|
+
....: Family([1,2,3], Partitions), facade=False)
|
|
481
|
+
sage: U._element_constructor_
|
|
482
|
+
<bound method DisjointUnionEnumeratedSets._element_constructor_default
|
|
483
|
+
of Disjoint union of Finite family {...}>
|
|
484
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
485
|
+
....: Family([1,2,3], Partitions), facade=True)
|
|
486
|
+
sage: U._element_constructor_
|
|
487
|
+
<bound method DisjointUnionEnumeratedSets._element_constructor_facade
|
|
488
|
+
of Disjoint union of Finite family {...}>
|
|
489
|
+
"""
|
|
490
|
+
if not self._facade:
|
|
491
|
+
return self._element_constructor_default
|
|
492
|
+
else:
|
|
493
|
+
return self._element_constructor_facade
|
|
494
|
+
|
|
495
|
+
def _element_constructor_default(self, el):
|
|
496
|
+
r"""
|
|
497
|
+
TESTS::
|
|
498
|
+
|
|
499
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
500
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
501
|
+
....: Family([1,2,3], Partitions), facade=False)
|
|
502
|
+
sage: U([1]) # indirect doctest
|
|
503
|
+
[1]
|
|
504
|
+
sage: U([2,1]) # indirect doctest
|
|
505
|
+
[2, 1]
|
|
506
|
+
sage: U([1,3,2]) # indirect doctest
|
|
507
|
+
Traceback (most recent call last):
|
|
508
|
+
...
|
|
509
|
+
ValueError: value [1, 3, 2] does not belong to Disjoint union of
|
|
510
|
+
Finite family {1: Partitions of the integer 1,
|
|
511
|
+
2: Partitions of the integer 2,
|
|
512
|
+
3: Partitions of the integer 3}
|
|
513
|
+
|
|
514
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
515
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
516
|
+
....: Family([1,2,3], Partitions), keepkey=True, facade=False)
|
|
517
|
+
sage: U((1, [1])) # indirect doctest
|
|
518
|
+
(1, [1])
|
|
519
|
+
sage: U((3,[2,1])) # indirect doctest
|
|
520
|
+
(3, [2, 1])
|
|
521
|
+
sage: U((4,[2,1])) # indirect doctest
|
|
522
|
+
Traceback (most recent call last):
|
|
523
|
+
...
|
|
524
|
+
ValueError: value (4, [2, 1]) does not belong to Disjoint union of
|
|
525
|
+
Finite family {1: Partitions of the integer 1,
|
|
526
|
+
2: Partitions of the integer 2,
|
|
527
|
+
3: Partitions of the integer 3}
|
|
528
|
+
"""
|
|
529
|
+
if isinstance(el, self.element_class):
|
|
530
|
+
el = el.value
|
|
531
|
+
if self._is_a(el):
|
|
532
|
+
return self.element_class(self, el)
|
|
533
|
+
else:
|
|
534
|
+
raise ValueError("value %s does not belong to %s" % (el, self))
|
|
535
|
+
|
|
536
|
+
def _element_constructor_facade(self, el):
|
|
537
|
+
"""
|
|
538
|
+
TESTS::
|
|
539
|
+
|
|
540
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
541
|
+
sage: X = DisjointUnionEnumeratedSets({i: Partitions(i)
|
|
542
|
+
....: for i in range(5)})
|
|
543
|
+
sage: X([1]).parent()
|
|
544
|
+
Partitions of the integer 1
|
|
545
|
+
sage: X([2,1,1]).parent() # indirect doctest
|
|
546
|
+
Partitions of the integer 4
|
|
547
|
+
sage: X([6])
|
|
548
|
+
Traceback (most recent call last):
|
|
549
|
+
...
|
|
550
|
+
ValueError: cannot coerce `[6]` in any parent in `Finite family {...}`
|
|
551
|
+
|
|
552
|
+
We need to call the element constructor directly when ``keepkey=True``
|
|
553
|
+
because this returns a `tuple`, where the coercion framework requires
|
|
554
|
+
an :class:`Element` be returned.
|
|
555
|
+
|
|
556
|
+
sage: X = DisjointUnionEnumeratedSets({i: Partitions(i) # needs sage.combinat sage.libs.flint
|
|
557
|
+
....: for i in range(5)},
|
|
558
|
+
....: keepkey=True)
|
|
559
|
+
sage: p = X._element_constructor_((0, [])) # indirect doctest # needs sage.combinat sage.libs.flint
|
|
560
|
+
sage: p[1].parent() # needs sage.combinat sage.libs.flint
|
|
561
|
+
Partitions of the integer 0
|
|
562
|
+
|
|
563
|
+
Test that facade parents can create and properly access elements
|
|
564
|
+
that are tuples (fixed by :issue:`22382`)::
|
|
565
|
+
|
|
566
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
567
|
+
sage: f = lambda mu: cartesian_product([mu.standard_tableaux(),
|
|
568
|
+
....: mu.standard_tableaux()])
|
|
569
|
+
sage: tabs = DisjointUnionEnumeratedSets(Family(Partitions(4), f))
|
|
570
|
+
sage: s = StandardTableau([[1,3],[2,4]])
|
|
571
|
+
sage: (s,s) in tabs
|
|
572
|
+
True
|
|
573
|
+
sage: ss = tabs( (s,s) )
|
|
574
|
+
sage: ss[0]
|
|
575
|
+
[[1, 3], [2, 4]]
|
|
576
|
+
|
|
577
|
+
We do not coerce when one of the elements is already in the set::
|
|
578
|
+
|
|
579
|
+
sage: X = DisjointUnionEnumeratedSets([QQ, ZZ])
|
|
580
|
+
sage: x = X(2)
|
|
581
|
+
sage: x.parent() is ZZ
|
|
582
|
+
True
|
|
583
|
+
"""
|
|
584
|
+
if self._keepkey:
|
|
585
|
+
P = self._family[el[0]]
|
|
586
|
+
if isinstance(el[1], Element) and el[1].parent() == P:
|
|
587
|
+
return el
|
|
588
|
+
try:
|
|
589
|
+
return (el[0], P(el[1]))
|
|
590
|
+
except Exception:
|
|
591
|
+
raise ValueError("cannot coerce `%s` in the parent `%s`" % (el[1], P))
|
|
592
|
+
|
|
593
|
+
# Check first to see if the parent of el is in the family
|
|
594
|
+
if (isinstance(el, Element) and self._facade_for is not True
|
|
595
|
+
and el.parent() in self._facade_for):
|
|
596
|
+
return el
|
|
597
|
+
|
|
598
|
+
for P in self._family:
|
|
599
|
+
try:
|
|
600
|
+
return P(el)
|
|
601
|
+
except Exception:
|
|
602
|
+
pass
|
|
603
|
+
raise ValueError("cannot coerce `%s` in any parent in `%s`" % (el, self._family))
|
|
604
|
+
|
|
605
|
+
@lazy_attribute
|
|
606
|
+
def Element(self):
|
|
607
|
+
"""
|
|
608
|
+
TESTS::
|
|
609
|
+
|
|
610
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
611
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
612
|
+
....: Family([1,2,3], Partitions), facade=False)
|
|
613
|
+
sage: U.Element
|
|
614
|
+
<... 'sage.structure.element_wrapper.ElementWrapper'>
|
|
615
|
+
sage: U = DisjointUnionEnumeratedSets(
|
|
616
|
+
....: Family([1,2,3], Partitions), facade=True)
|
|
617
|
+
sage: U.Element
|
|
618
|
+
Traceback (most recent call last):
|
|
619
|
+
...
|
|
620
|
+
AttributeError: 'DisjointUnionEnumeratedSets_with_category' object
|
|
621
|
+
has no attribute 'Element'...
|
|
622
|
+
"""
|
|
623
|
+
if not self._facade:
|
|
624
|
+
return ElementWrapper
|
|
625
|
+
return NotImplemented
|
|
Binary file
|
sage/sets/family.pxd
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
from sage.structure.parent cimport Parent
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
cdef class AbstractFamily(Parent):
|
|
6
|
+
cdef public __custom_name
|
|
7
|
+
cdef dict __dict__ # enables Python attributes as needed for EnumeratedSets()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
cdef class FiniteFamily(AbstractFamily):
|
|
11
|
+
cdef public dict _dictionary
|
|
12
|
+
cdef public object _keys
|