passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.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_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +35 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
from sage.structure.sage_object cimport SageObject
|
|
3
|
+
|
|
4
|
+
cdef class RiggedPartition(SageObject):
|
|
5
|
+
cdef public list _list
|
|
6
|
+
cdef public list vacancy_numbers
|
|
7
|
+
cdef public list rigging
|
|
8
|
+
cdef long _hash
|
|
9
|
+
|
|
10
|
+
cpdef get_num_cells_to_column(self, int end_column, t=*)
|
|
11
|
+
cpdef insert_cell(self, int max_width)
|
|
12
|
+
cpdef remove_cell(self, row, int num_cells=*)
|
|
13
|
+
|
|
14
|
+
cdef class RiggedPartitionTypeB(RiggedPartition):
|
|
15
|
+
pass
|
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Rigged partitions
|
|
5
|
+
|
|
6
|
+
Class and methods of the rigged partition which are used by the rigged
|
|
7
|
+
configuration class. This is an internal class used by the rigged
|
|
8
|
+
configurations and KR tableaux during the bijection, and is not to be used by
|
|
9
|
+
the end-user.
|
|
10
|
+
|
|
11
|
+
We hold the partitions as a 1-dim array of positive integers where each
|
|
12
|
+
value corresponds to the length of the row. This is the shape of the
|
|
13
|
+
partition which can be accessed by the regular index.
|
|
14
|
+
|
|
15
|
+
The data for the vacancy number is also stored in a 1-dim array which each
|
|
16
|
+
entry corresponds to the row of the tableau, and similarly for the
|
|
17
|
+
partition values.
|
|
18
|
+
|
|
19
|
+
.. TODO::
|
|
20
|
+
|
|
21
|
+
Convert this to using multiplicities `m_i` (perhaps with a dictionary?)?
|
|
22
|
+
|
|
23
|
+
AUTHORS:
|
|
24
|
+
|
|
25
|
+
- Travis Scrimshaw (2010-09-26): initial version
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# ***************************************************************************
|
|
29
|
+
# Copyright (C) 2010-2012 Travis Scrimshaw <tscrim@ucdavis.edu>
|
|
30
|
+
#
|
|
31
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
32
|
+
#
|
|
33
|
+
# This code is distributed in the hope that it will be useful,
|
|
34
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
35
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
36
|
+
# General Public License for more details.
|
|
37
|
+
#
|
|
38
|
+
# The full text of the GPL is available at:
|
|
39
|
+
#
|
|
40
|
+
# https://www.gnu.org/licenses/
|
|
41
|
+
# ***************************************************************************
|
|
42
|
+
|
|
43
|
+
from sage.misc.latex import latex
|
|
44
|
+
from sage.structure.richcmp cimport richcmp
|
|
45
|
+
|
|
46
|
+
cdef class RiggedPartition(SageObject):
|
|
47
|
+
r"""
|
|
48
|
+
The RiggedPartition class which is the data structure of a rigged (i.e.
|
|
49
|
+
marked or decorated) Young diagram of a partition.
|
|
50
|
+
|
|
51
|
+
Note that this class as a stand-alone object does not make sense since the
|
|
52
|
+
vacancy numbers are calculated using the entire rigged configuration. For
|
|
53
|
+
more, see :class:`RiggedConfigurations`.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
58
|
+
sage: RP = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]
|
|
59
|
+
sage: RP
|
|
60
|
+
0[ ][ ]0
|
|
61
|
+
-1[ ]-1
|
|
62
|
+
<BLANKLINE>
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
def __init__(self, shape=None, rigging_list=None, vacancy_nums=None):
|
|
66
|
+
r"""
|
|
67
|
+
Initialize by the rigged partition.
|
|
68
|
+
|
|
69
|
+
Note that this only performs checks to see that the sizes match up.
|
|
70
|
+
|
|
71
|
+
INPUT:
|
|
72
|
+
|
|
73
|
+
- ``shape`` -- (default: ``None``) the shape
|
|
74
|
+
- ``rigging_list`` -- (default: ``None``) the riggings
|
|
75
|
+
- ``vacancy_nums`` -- (default: ``None``) the vacancy numbers
|
|
76
|
+
|
|
77
|
+
TESTS::
|
|
78
|
+
|
|
79
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
80
|
+
sage: RiggedPartition()
|
|
81
|
+
(/)
|
|
82
|
+
<BLANKLINE>
|
|
83
|
+
sage: RP = RiggedPartition([2,1], [0,0], [1, 0])
|
|
84
|
+
sage: RP
|
|
85
|
+
1[ ][ ]0
|
|
86
|
+
0[ ]0
|
|
87
|
+
<BLANKLINE>
|
|
88
|
+
sage: TestSuite(RP).run()
|
|
89
|
+
"""
|
|
90
|
+
self._hash = 0
|
|
91
|
+
|
|
92
|
+
if shape is None:
|
|
93
|
+
self._list = []
|
|
94
|
+
self.vacancy_numbers = []
|
|
95
|
+
self.rigging = []
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
self._list = list(shape)
|
|
99
|
+
|
|
100
|
+
if vacancy_nums is not None:
|
|
101
|
+
if len(shape) != len(vacancy_nums):
|
|
102
|
+
raise ValueError("mismatch between shape and vacancy numbers")
|
|
103
|
+
|
|
104
|
+
self.vacancy_numbers = list(vacancy_nums)
|
|
105
|
+
else:
|
|
106
|
+
self.vacancy_numbers = [None] * len(shape)
|
|
107
|
+
|
|
108
|
+
if rigging_list is not None:
|
|
109
|
+
|
|
110
|
+
if len(shape) != len(rigging_list):
|
|
111
|
+
raise ValueError("mismatch between shape and rigging list")
|
|
112
|
+
|
|
113
|
+
self.rigging = list(rigging_list)
|
|
114
|
+
else:
|
|
115
|
+
self.rigging = [None] * len(shape)
|
|
116
|
+
|
|
117
|
+
def _repr_(self):
|
|
118
|
+
"""
|
|
119
|
+
Return a string representation of ``self``.
|
|
120
|
+
|
|
121
|
+
EXAMPLES::
|
|
122
|
+
|
|
123
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
124
|
+
sage: elt = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]
|
|
125
|
+
sage: elt
|
|
126
|
+
0[ ][ ]0
|
|
127
|
+
-1[ ]-1
|
|
128
|
+
<BLANKLINE>
|
|
129
|
+
sage: Partitions.options.convention="french"
|
|
130
|
+
sage: elt
|
|
131
|
+
-1[ ]-1
|
|
132
|
+
0[ ][ ]0
|
|
133
|
+
<BLANKLINE>
|
|
134
|
+
sage: Partitions.options._reset()
|
|
135
|
+
"""
|
|
136
|
+
# If it is empty, return saying so
|
|
137
|
+
if not self._list:
|
|
138
|
+
return "(/)\n"
|
|
139
|
+
|
|
140
|
+
from sage.combinat.partition import Partitions
|
|
141
|
+
if Partitions.options.convention == "French":
|
|
142
|
+
itr = reversed(list(enumerate(self._list)))
|
|
143
|
+
else:
|
|
144
|
+
itr = enumerate(self._list)
|
|
145
|
+
ret_str = ""
|
|
146
|
+
vac_num_width = max(len(str(vac_num)) for vac_num in self.vacancy_numbers)
|
|
147
|
+
for i, val in itr:
|
|
148
|
+
ret_str += ("{:>" + str(vac_num_width) + "}").format(str(self.vacancy_numbers[i]))
|
|
149
|
+
ret_str += "[ ]"*val
|
|
150
|
+
ret_str += str(self.rigging[i])
|
|
151
|
+
ret_str += "\n"
|
|
152
|
+
return ret_str
|
|
153
|
+
|
|
154
|
+
def _latex_(self):
|
|
155
|
+
r"""
|
|
156
|
+
Return LaTeX representation of ``self``.
|
|
157
|
+
|
|
158
|
+
EXAMPLES::
|
|
159
|
+
|
|
160
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
161
|
+
sage: latex(RC(partition_list=[[2],[2,2],[2,1],[2]])[2])
|
|
162
|
+
{
|
|
163
|
+
\begin{array}[t]{r|c|c|l}
|
|
164
|
+
\cline{2-3} 0 &\phantom{|}&\phantom{|}& 0 \\
|
|
165
|
+
\cline{2-3} -1 &\phantom{|}& \multicolumn{2 }{l}{ -1 } \\
|
|
166
|
+
\cline{2-2}
|
|
167
|
+
\end{array}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
TESTS:
|
|
171
|
+
|
|
172
|
+
Check that this prints using the French convention::
|
|
173
|
+
|
|
174
|
+
sage: RC = RiggedConfigurations(['D',5,1], [[2,1], [1,2]])
|
|
175
|
+
sage: RiggedConfigurations.options.convention='French'
|
|
176
|
+
sage: latex(RC(partition_list=[[3],[3,1],[1,1],[1],[1]])[1])
|
|
177
|
+
{
|
|
178
|
+
\begin{array}[t]{r|c|c|c|l}
|
|
179
|
+
\cline{2-2} 0 &\phantom{|}& \multicolumn{3 }{l}{ 0 } \\
|
|
180
|
+
\cline{2-4} -2 &\phantom{|}&\phantom{|}&\phantom{|}& -2 \\
|
|
181
|
+
\cline{2-4}
|
|
182
|
+
\end{array}
|
|
183
|
+
}
|
|
184
|
+
sage: RiggedConfigurations.options._reset()
|
|
185
|
+
"""
|
|
186
|
+
num_rows = len(self._list)
|
|
187
|
+
if num_rows == 0:
|
|
188
|
+
return "{\\emptyset}"
|
|
189
|
+
|
|
190
|
+
num_cols = self._list[0]
|
|
191
|
+
ret_string = "{\n\\begin{array}[t]{r|" + "c|"*num_cols + "l}\n"
|
|
192
|
+
|
|
193
|
+
from sage.combinat.rigged_configurations.rigged_configurations import RiggedConfigurations
|
|
194
|
+
if RiggedConfigurations.options.convention == 'English':
|
|
195
|
+
ret_string += "\\cline{2-%s} " % (1+num_cols) + latex(self.vacancy_numbers[0])
|
|
196
|
+
for i, row_len in enumerate(self._list):
|
|
197
|
+
|
|
198
|
+
ret_string += " &" + "\\phantom{|}&"*row_len
|
|
199
|
+
|
|
200
|
+
if num_cols == row_len:
|
|
201
|
+
ret_string += " " + latex(self.rigging[i])
|
|
202
|
+
else:
|
|
203
|
+
ret_string += " \\multicolumn{" + repr(num_cols - row_len + 1)
|
|
204
|
+
ret_string += "}{l}{" + latex(self.rigging[i]) + "}"
|
|
205
|
+
|
|
206
|
+
ret_string += " \\\\\n"
|
|
207
|
+
|
|
208
|
+
ret_string += "\\cline{2-" + repr(1 + row_len) + "} "
|
|
209
|
+
if i != num_rows - 1 and row_len != self._list[i + 1]:
|
|
210
|
+
ret_string += latex(self.vacancy_numbers[i + 1])
|
|
211
|
+
ret_string += "\n\\end{array}\n}"
|
|
212
|
+
else:
|
|
213
|
+
for i, row_len in enumerate(reversed(self._list)):
|
|
214
|
+
ret_string += "\\cline{2-%s} " % (1 + row_len) + latex(self.vacancy_numbers[-i-1])
|
|
215
|
+
ret_string += " &" + "\\phantom{|}&"*row_len
|
|
216
|
+
|
|
217
|
+
if num_cols == row_len:
|
|
218
|
+
ret_string += " " + latex(self.rigging[-i-1])
|
|
219
|
+
else:
|
|
220
|
+
ret_string += " \\multicolumn{" + repr(num_cols - row_len + 1)
|
|
221
|
+
ret_string += "}{l}{" + latex(self.rigging[-i-1]) + "}"
|
|
222
|
+
|
|
223
|
+
ret_string += " \\\\\n"
|
|
224
|
+
ret_string += "\\cline{2-%s}\n\\end{array}\n}" % (1 + num_cols)
|
|
225
|
+
|
|
226
|
+
return ret_string
|
|
227
|
+
|
|
228
|
+
def _clone(self):
|
|
229
|
+
r"""
|
|
230
|
+
Makes a (deep) copy of this rigged partition.
|
|
231
|
+
|
|
232
|
+
TESTS::
|
|
233
|
+
|
|
234
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
235
|
+
sage: RP = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]; RP
|
|
236
|
+
0[ ][ ]0
|
|
237
|
+
-1[ ]-1
|
|
238
|
+
<BLANKLINE>
|
|
239
|
+
sage: RP2 = RP._clone(); RP2
|
|
240
|
+
0[ ][ ]0
|
|
241
|
+
-1[ ]-1
|
|
242
|
+
<BLANKLINE>
|
|
243
|
+
sage: RP == RP2
|
|
244
|
+
True
|
|
245
|
+
sage: RP is RP2
|
|
246
|
+
False
|
|
247
|
+
"""
|
|
248
|
+
# TODO: Perhaps we can be better by not copying data as much and do it
|
|
249
|
+
# more on-demand
|
|
250
|
+
cdef RiggedPartition res
|
|
251
|
+
cdef type t = type(self)
|
|
252
|
+
res = t.__new__(t)
|
|
253
|
+
res._list = self._list[:]
|
|
254
|
+
res.rigging = self.rigging[:]
|
|
255
|
+
res.vacancy_numbers = self.vacancy_numbers[:]
|
|
256
|
+
res._hash = self._hash
|
|
257
|
+
return res
|
|
258
|
+
|
|
259
|
+
def __richcmp__(self, other, int op):
|
|
260
|
+
r"""
|
|
261
|
+
Return true if ``self`` equals ``rhs``.
|
|
262
|
+
|
|
263
|
+
TESTS::
|
|
264
|
+
|
|
265
|
+
sage: RC = RiggedConfigurations(['A',2,1], [[1,1],[1,1],[1,1]])
|
|
266
|
+
sage: x = RC(partition_list=[[1], []], rigging_list=[[0], []])
|
|
267
|
+
sage: y = RC(partition_list=[[1], []], rigging_list=[[1], []])
|
|
268
|
+
sage: x == y
|
|
269
|
+
False
|
|
270
|
+
"""
|
|
271
|
+
if not (isinstance(self, RiggedPartition) and isinstance(other, RiggedPartition)):
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
cdef left = <RiggedPartition> self
|
|
275
|
+
cdef right = <RiggedPartition> other
|
|
276
|
+
return richcmp((left._list, left.rigging), (right._list, right.rigging), op)
|
|
277
|
+
|
|
278
|
+
# TODO: Cythonize CombinatorialObject?
|
|
279
|
+
|
|
280
|
+
def __hash__(self):
|
|
281
|
+
"""
|
|
282
|
+
TESTS::
|
|
283
|
+
|
|
284
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
285
|
+
sage: nu = RiggedPartition()
|
|
286
|
+
sage: h = hash(nu)
|
|
287
|
+
sage: _ = nu.insert_cell(2)
|
|
288
|
+
sage: h == hash(nu)
|
|
289
|
+
False
|
|
290
|
+
"""
|
|
291
|
+
if self._hash == 0:
|
|
292
|
+
self._hash = hash(tuple(self._list))
|
|
293
|
+
return self._hash
|
|
294
|
+
|
|
295
|
+
def __bool__(self):
|
|
296
|
+
"""
|
|
297
|
+
TESTS::
|
|
298
|
+
|
|
299
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
300
|
+
sage: nu = RiggedPartition()
|
|
301
|
+
sage: bool(nu)
|
|
302
|
+
False
|
|
303
|
+
sage: nu = RiggedPartition([1])
|
|
304
|
+
sage: bool(nu)
|
|
305
|
+
True
|
|
306
|
+
"""
|
|
307
|
+
return bool(self._list)
|
|
308
|
+
|
|
309
|
+
def __len__(self):
|
|
310
|
+
"""
|
|
311
|
+
TESTS::
|
|
312
|
+
|
|
313
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
314
|
+
sage: nu = RiggedPartition()
|
|
315
|
+
sage: len(nu)
|
|
316
|
+
0
|
|
317
|
+
sage: nu = RiggedPartition([3,2,2,1])
|
|
318
|
+
sage: len(nu)
|
|
319
|
+
4
|
|
320
|
+
"""
|
|
321
|
+
return len(self._list)
|
|
322
|
+
|
|
323
|
+
def __getitem__(self, key):
|
|
324
|
+
"""
|
|
325
|
+
TESTS::
|
|
326
|
+
|
|
327
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
328
|
+
sage: nu = RiggedPartition([3,2,1])
|
|
329
|
+
sage: nu[2]
|
|
330
|
+
1
|
|
331
|
+
"""
|
|
332
|
+
return self._list[key]
|
|
333
|
+
|
|
334
|
+
def __iter__(self):
|
|
335
|
+
"""
|
|
336
|
+
TESTS::
|
|
337
|
+
|
|
338
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
339
|
+
sage: nu = RiggedPartition([3,2,1])
|
|
340
|
+
sage: list(nu)
|
|
341
|
+
[3, 2, 1]
|
|
342
|
+
"""
|
|
343
|
+
return iter(self._list)
|
|
344
|
+
|
|
345
|
+
def __reduce__(self):
|
|
346
|
+
"""
|
|
347
|
+
TESTS::
|
|
348
|
+
|
|
349
|
+
sage: from sage.combinat.rigged_configurations.rigged_partition import RiggedPartition
|
|
350
|
+
sage: nu = RiggedPartition([3,2,1])
|
|
351
|
+
sage: loads(dumps(nu)) == nu
|
|
352
|
+
True
|
|
353
|
+
"""
|
|
354
|
+
return type(self), (self._list, self.rigging, self.vacancy_numbers)
|
|
355
|
+
|
|
356
|
+
# Should we move these functions to the CP -> RC bijections?
|
|
357
|
+
|
|
358
|
+
cpdef get_num_cells_to_column(self, int end_column, t=1):
|
|
359
|
+
r"""
|
|
360
|
+
Get the number of cells in all columns before the ``end_column``.
|
|
361
|
+
|
|
362
|
+
INPUT:
|
|
363
|
+
|
|
364
|
+
- ``end_column`` -- the index of the column to end at
|
|
365
|
+
|
|
366
|
+
- ``t`` -- the scaling factor
|
|
367
|
+
|
|
368
|
+
OUTPUT: the number of cells
|
|
369
|
+
|
|
370
|
+
EXAMPLES::
|
|
371
|
+
|
|
372
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
373
|
+
sage: RP = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]
|
|
374
|
+
sage: RP.get_num_cells_to_column(1)
|
|
375
|
+
2
|
|
376
|
+
sage: RP.get_num_cells_to_column(2)
|
|
377
|
+
3
|
|
378
|
+
sage: RP.get_num_cells_to_column(3)
|
|
379
|
+
3
|
|
380
|
+
sage: RP.get_num_cells_to_column(3, 2)
|
|
381
|
+
5
|
|
382
|
+
"""
|
|
383
|
+
cdef Py_ssize_t sum_cells = 0
|
|
384
|
+
# Sum up from the reverse (the smallest row sizes)
|
|
385
|
+
cdef Py_ssize_t i = len(self._list) - 1
|
|
386
|
+
while i >= 0 and self._list[i]*t < end_column:
|
|
387
|
+
sum_cells += self._list[i]*t
|
|
388
|
+
i -= 1
|
|
389
|
+
|
|
390
|
+
# Add the remaining cells
|
|
391
|
+
if i > -1:
|
|
392
|
+
sum_cells += end_column * (i + 1)
|
|
393
|
+
|
|
394
|
+
return sum_cells
|
|
395
|
+
|
|
396
|
+
cpdef insert_cell(self, int max_width):
|
|
397
|
+
r"""
|
|
398
|
+
Insert a cell given at a singular value as long as its less than the
|
|
399
|
+
specified width.
|
|
400
|
+
|
|
401
|
+
Note that :meth:`insert_cell` does not update riggings or vacancy
|
|
402
|
+
numbers, but it does prepare the space for them. Returns the width of
|
|
403
|
+
the row we inserted at.
|
|
404
|
+
|
|
405
|
+
INPUT:
|
|
406
|
+
|
|
407
|
+
- ``max_width`` -- the maximum width (i.e. row length) that we can
|
|
408
|
+
insert the cell at
|
|
409
|
+
|
|
410
|
+
OUTPUT: the width of the row we inserted at
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
415
|
+
sage: RP = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]
|
|
416
|
+
sage: RP.insert_cell(2)
|
|
417
|
+
2
|
|
418
|
+
sage: RP
|
|
419
|
+
0[ ][ ][ ]None
|
|
420
|
+
-1[ ]-1
|
|
421
|
+
<BLANKLINE>
|
|
422
|
+
"""
|
|
423
|
+
cdef Py_ssize_t max_pos = -1
|
|
424
|
+
cdef Py_ssize_t i
|
|
425
|
+
self._hash = 0 # Reset the cached hash value
|
|
426
|
+
if max_width > 0:
|
|
427
|
+
for i, vac_num in enumerate(self.vacancy_numbers):
|
|
428
|
+
if self._list[i] <= max_width and vac_num == self.rigging[i]:
|
|
429
|
+
max_pos = i
|
|
430
|
+
break
|
|
431
|
+
|
|
432
|
+
if max_pos == -1: # No singular values, then add a new row
|
|
433
|
+
self._list.append(1)
|
|
434
|
+
self.vacancy_numbers.append(None)
|
|
435
|
+
# Go through our partition until we find a length of greater than 1
|
|
436
|
+
i = len(self._list) - 1
|
|
437
|
+
while i >= 0 and self._list[i] == 1:
|
|
438
|
+
i -= 1
|
|
439
|
+
self.rigging.insert(i + 1, None)
|
|
440
|
+
return 0
|
|
441
|
+
|
|
442
|
+
self._list[max_pos] += 1
|
|
443
|
+
self.rigging[max_pos] = None # State that we've changed this row
|
|
444
|
+
return self._list[max_pos] - 1
|
|
445
|
+
|
|
446
|
+
cpdef remove_cell(self, row, int num_cells=1):
|
|
447
|
+
r"""
|
|
448
|
+
Removes a cell at the specified ``row``.
|
|
449
|
+
|
|
450
|
+
Note that :meth:`remove_cell` does not set/update the vacancy numbers
|
|
451
|
+
or the riggings, but guarantees that the location has been allocated
|
|
452
|
+
in the returned index.
|
|
453
|
+
|
|
454
|
+
INPUT:
|
|
455
|
+
|
|
456
|
+
- ``row`` -- the row to remove the cell from
|
|
457
|
+
|
|
458
|
+
- ``num_cells`` -- (default: 1) the number of cells to remove
|
|
459
|
+
|
|
460
|
+
OUTPUT:
|
|
461
|
+
|
|
462
|
+
- The location of the newly constructed row or ``None`` if unable to
|
|
463
|
+
remove row or if deleted a row.
|
|
464
|
+
|
|
465
|
+
EXAMPLES::
|
|
466
|
+
|
|
467
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 2]])
|
|
468
|
+
sage: RP = RC(partition_list=[[2],[2,2],[2,1],[2]])[2]
|
|
469
|
+
sage: RP.remove_cell(0)
|
|
470
|
+
0
|
|
471
|
+
sage: RP
|
|
472
|
+
None[ ]None
|
|
473
|
+
-1[ ]-1
|
|
474
|
+
<BLANKLINE>
|
|
475
|
+
"""
|
|
476
|
+
self._hash = 0 # Reset the cached hash value
|
|
477
|
+
if row is None:
|
|
478
|
+
return None
|
|
479
|
+
|
|
480
|
+
cdef Py_ssize_t r = row
|
|
481
|
+
if self._list[r] <= num_cells:
|
|
482
|
+
self._list.pop(r)
|
|
483
|
+
self.vacancy_numbers.pop(r)
|
|
484
|
+
self.rigging.pop(r)
|
|
485
|
+
return None
|
|
486
|
+
|
|
487
|
+
# Find the beginning of the next block we want
|
|
488
|
+
cdef Py_ssize_t block_len = self._list[r] - num_cells # The length of the desired block
|
|
489
|
+
if row + 1 == len(self._list):
|
|
490
|
+
# If we are at the end, just do a simple remove
|
|
491
|
+
self._list[r] = block_len
|
|
492
|
+
self.vacancy_numbers[r] = None
|
|
493
|
+
self.rigging[r] = None
|
|
494
|
+
return r
|
|
495
|
+
|
|
496
|
+
cdef Py_ssize_t i
|
|
497
|
+
for i in range(r + 1, len(self._list)):
|
|
498
|
+
if self._list[i] <= block_len:
|
|
499
|
+
if i == r + 1:
|
|
500
|
+
# If the next row is a block change, just reduce by num_cells
|
|
501
|
+
self._list[r] = block_len
|
|
502
|
+
self.vacancy_numbers[r] = None
|
|
503
|
+
self.rigging[r] = None
|
|
504
|
+
return row
|
|
505
|
+
|
|
506
|
+
# Otherwise we need to "move" the row
|
|
507
|
+
self._list.insert(i, block_len)
|
|
508
|
+
# These should be updated (so there should be no need to carry them over)
|
|
509
|
+
self.vacancy_numbers.insert(i, None)
|
|
510
|
+
self.rigging.insert(i, None)
|
|
511
|
+
|
|
512
|
+
self._list.pop(r)
|
|
513
|
+
self.vacancy_numbers.pop(r)
|
|
514
|
+
self.rigging.pop(r)
|
|
515
|
+
return i - 1
|
|
516
|
+
|
|
517
|
+
# We need to "move" the row to the end of the partition
|
|
518
|
+
self._list.pop(r)
|
|
519
|
+
self.vacancy_numbers.pop(r)
|
|
520
|
+
self.rigging.pop(r)
|
|
521
|
+
|
|
522
|
+
self._list.append(block_len)
|
|
523
|
+
# Placeholders as above
|
|
524
|
+
self.vacancy_numbers.append(None)
|
|
525
|
+
self.rigging.append(None)
|
|
526
|
+
return len(self._list) - 1
|
|
527
|
+
|
|
528
|
+
cdef class RiggedPartitionTypeB(RiggedPartition):
|
|
529
|
+
r"""
|
|
530
|
+
Rigged partitions for type `B_n^{(1)}` which has special printing rules
|
|
531
|
+
which comes from the fact that the `n`-th partition can have columns of
|
|
532
|
+
width `\frac{1}{2}`.
|
|
533
|
+
"""
|
|
534
|
+
def __init__(self, arg0, arg1=None, arg2=None):
|
|
535
|
+
"""
|
|
536
|
+
Initialize ``self``.
|
|
537
|
+
|
|
538
|
+
EXAMPLES::
|
|
539
|
+
|
|
540
|
+
sage: RP = sage.combinat.rigged_configurations.rigged_partition.RiggedPartition([2,1], [0,0], [1, 0])
|
|
541
|
+
sage: B = sage.combinat.rigged_configurations.rigged_partition.RiggedPartitionTypeB(RP); B
|
|
542
|
+
1[][]0
|
|
543
|
+
0[]0
|
|
544
|
+
<BLANKLINE>
|
|
545
|
+
sage: TestSuite(B).run()
|
|
546
|
+
"""
|
|
547
|
+
if arg1 is not None:
|
|
548
|
+
RiggedPartition.__init__(self, arg0, arg1, arg2)
|
|
549
|
+
return
|
|
550
|
+
|
|
551
|
+
RiggedPartition.__init__(self,
|
|
552
|
+
arg0._list,
|
|
553
|
+
arg0.rigging,
|
|
554
|
+
arg0.vacancy_numbers)
|
|
555
|
+
|
|
556
|
+
def _repr_(self):
|
|
557
|
+
"""
|
|
558
|
+
Return a string representation of ``self``.
|
|
559
|
+
|
|
560
|
+
INPUT:
|
|
561
|
+
|
|
562
|
+
- ``half_width_boxes`` -- (default: ``True``) display the partition
|
|
563
|
+
using half width boxes
|
|
564
|
+
|
|
565
|
+
EXAMPLES::
|
|
566
|
+
|
|
567
|
+
sage: RC = RiggedConfigurations(['B', 2, 1], [[2, 2]])
|
|
568
|
+
sage: elt = RC(partition_list=[[2],[2,1]])[1]
|
|
569
|
+
sage: elt
|
|
570
|
+
-2[][]-2
|
|
571
|
+
-2[]-2
|
|
572
|
+
<BLANKLINE>
|
|
573
|
+
sage: RiggedConfigurations.options.half_width_boxes_type_B=False
|
|
574
|
+
sage: elt
|
|
575
|
+
-2[ ][ ]-2
|
|
576
|
+
-2[ ]-2
|
|
577
|
+
<BLANKLINE>
|
|
578
|
+
sage: RiggedConfigurations.options._reset()
|
|
579
|
+
"""
|
|
580
|
+
# If it is empty, return saying so
|
|
581
|
+
if not self._list:
|
|
582
|
+
return "(/)\n"
|
|
583
|
+
|
|
584
|
+
from sage.combinat.partition import Partitions
|
|
585
|
+
if Partitions.options.convention == "french":
|
|
586
|
+
itr = reversed(list(enumerate(self._list)))
|
|
587
|
+
else:
|
|
588
|
+
itr = enumerate(self._list)
|
|
589
|
+
ret_str = ""
|
|
590
|
+
|
|
591
|
+
from sage.combinat.rigged_configurations.rigged_configurations import RiggedConfigurations
|
|
592
|
+
if RiggedConfigurations.options.half_width_boxes_type_B:
|
|
593
|
+
box_str = "[]"
|
|
594
|
+
else:
|
|
595
|
+
box_str = "[ ]"
|
|
596
|
+
|
|
597
|
+
vac_num_width = max(len(str(vac_num)) for vac_num in self.vacancy_numbers)
|
|
598
|
+
for i, val in itr:
|
|
599
|
+
ret_str += ("{:>" + str(vac_num_width) + "}").format(self.vacancy_numbers[i])
|
|
600
|
+
ret_str += box_str*val
|
|
601
|
+
ret_str += str(self.rigging[i])
|
|
602
|
+
ret_str += "\n"
|
|
603
|
+
return ret_str
|
|
604
|
+
|
|
605
|
+
def _latex_(self):
|
|
606
|
+
r"""
|
|
607
|
+
Return a LaTeX representation of ``self``.
|
|
608
|
+
|
|
609
|
+
INPUT:
|
|
610
|
+
|
|
611
|
+
- ``half_width_boxes`` -- boolean (default: ``True``); display the partition
|
|
612
|
+
using half width boxes
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: RC = RiggedConfigurations(['B', 2, 1], [[1, 1]])
|
|
617
|
+
sage: RP = RC(partition_list=[[],[2]])[1]
|
|
618
|
+
sage: latex(RP)
|
|
619
|
+
{
|
|
620
|
+
\begin{array}[t]{r|c|c|l}
|
|
621
|
+
\cline{2-3} -4 &\phantom{a}&\phantom{a}& -4 \\
|
|
622
|
+
\cline{2-3}
|
|
623
|
+
\end{array}
|
|
624
|
+
}
|
|
625
|
+
sage: RiggedConfigurations.options.half_width_boxes_type_B=False
|
|
626
|
+
sage: latex(RP)
|
|
627
|
+
{
|
|
628
|
+
\begin{array}[t]{r|c|c|l}
|
|
629
|
+
\cline{2-3} -4 &\phantom{X|}&\phantom{X|}& -4 \\
|
|
630
|
+
\cline{2-3}
|
|
631
|
+
\end{array}
|
|
632
|
+
}
|
|
633
|
+
sage: RiggedConfigurations.options._reset()
|
|
634
|
+
"""
|
|
635
|
+
num_rows = len(self._list)
|
|
636
|
+
if num_rows == 0:
|
|
637
|
+
return "{\\emptyset}"
|
|
638
|
+
|
|
639
|
+
from sage.combinat.rigged_configurations.rigged_configurations import RiggedConfigurations
|
|
640
|
+
if RiggedConfigurations.options.half_width_boxes_type_B:
|
|
641
|
+
box_str = "\\phantom{a}&"
|
|
642
|
+
else:
|
|
643
|
+
box_str = "\\phantom{X|}&"
|
|
644
|
+
|
|
645
|
+
num_cols = self._list[0]
|
|
646
|
+
ret_string = "{\n\\begin{array}[t]{r|" + "c|"*num_cols + "l}\n"
|
|
647
|
+
|
|
648
|
+
if RiggedConfigurations.options.convention == 'English':
|
|
649
|
+
ret_string += "\\cline{2-%s} " % (1+num_cols) + latex(self.vacancy_numbers[0])
|
|
650
|
+
for i, row_len in enumerate(self._list):
|
|
651
|
+
ret_string += " &" + box_str*row_len
|
|
652
|
+
|
|
653
|
+
if num_cols == row_len:
|
|
654
|
+
ret_string += " " + latex(self.rigging[i])
|
|
655
|
+
else:
|
|
656
|
+
ret_string += " \\multicolumn{" + repr(num_cols - row_len + 1)
|
|
657
|
+
ret_string += "}{l}{" + latex(self.rigging[i]) + "}"
|
|
658
|
+
|
|
659
|
+
ret_string += " \\\\\n"
|
|
660
|
+
|
|
661
|
+
ret_string += "\\cline{2-" + repr(1 + row_len) + "} "
|
|
662
|
+
if i != num_rows - 1 and row_len != self._list[i + 1]:
|
|
663
|
+
ret_string += latex(self.vacancy_numbers[i + 1])
|
|
664
|
+
ret_string += "\n\\end{array}\n}"
|
|
665
|
+
else:
|
|
666
|
+
for i, row_len in enumerate(reversed(self._list)):
|
|
667
|
+
ret_string += "\\cline{2-%s} " % (1 + row_len)
|
|
668
|
+
ret_string += latex(self.vacancy_numbers[-i-1])
|
|
669
|
+
ret_string += " &" + box_str*row_len
|
|
670
|
+
|
|
671
|
+
if num_cols == row_len:
|
|
672
|
+
ret_string += " " + latex(self.rigging[-i-1])
|
|
673
|
+
else:
|
|
674
|
+
ret_string += " \\multicolumn{" + repr(num_cols - row_len + 1)
|
|
675
|
+
ret_string += "}{l}{" + latex(self.rigging[-i-1]) + "}"
|
|
676
|
+
|
|
677
|
+
ret_string += " \\\\\n"
|
|
678
|
+
ret_string += "\\cline{2-%s}\n\\end{array}\n}" % (1 + num_cols)
|
|
679
|
+
|
|
680
|
+
return ret_string
|