passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.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/DELVEWHEEL +2 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +401 -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-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
- passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +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 +44 -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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Rigged configurations
|
|
4
|
+
|
|
5
|
+
.. TODO:: Proofread / point to the main classes rather than the modules?
|
|
6
|
+
|
|
7
|
+
- :ref:`sage.combinat.rigged_configurations.rc_crystal`
|
|
8
|
+
- :ref:`sage.combinat.rigged_configurations.rc_infinity`
|
|
9
|
+
|
|
10
|
+
- :ref:`sage.combinat.rigged_configurations.rigged_configurations`
|
|
11
|
+
- :ref:`sage.combinat.rigged_configurations.rigged_configuration_element`
|
|
12
|
+
|
|
13
|
+
- :ref:`sage.combinat.rigged_configurations.tensor_product_kr_tableaux`
|
|
14
|
+
- :ref:`sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element`
|
|
15
|
+
- :ref:`sage.combinat.rigged_configurations.kr_tableaux`
|
|
16
|
+
|
|
17
|
+
- :ref:`sage.combinat.rigged_configurations.kleber_tree`
|
|
18
|
+
|
|
19
|
+
- :ref:`sage.combinat.rigged_configurations.rigged_partition`
|
|
20
|
+
|
|
21
|
+
Bijections
|
|
22
|
+
----------
|
|
23
|
+
|
|
24
|
+
- :ref:`sage.combinat.rigged_configurations.bijection`
|
|
25
|
+
- :ref:`sage.combinat.rigged_configurations.bij_abstract_class`
|
|
26
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_A`
|
|
27
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_B`
|
|
28
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_C`
|
|
29
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_D`
|
|
30
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_A2_odd`
|
|
31
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_A2_even`
|
|
32
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_A2_dual`
|
|
33
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_D_twisted`
|
|
34
|
+
- :ref:`sage.combinat.rigged_configurations.bij_type_D_tri`
|
|
35
|
+
- :ref:`sage.combinat.rigged_configurations.bij_infinity`
|
|
36
|
+
"""
|
|
37
|
+
# install the docstring of this module to the containing package
|
|
38
|
+
from sage.misc.namespace_package import install_doc
|
|
39
|
+
install_doc(__package__, __doc__)
|
|
40
|
+
|
|
41
|
+
from sage.misc.lazy_import import lazy_import
|
|
42
|
+
|
|
43
|
+
lazy_import('sage.combinat.rigged_configurations.rigged_configurations',
|
|
44
|
+
'RiggedConfigurations')
|
|
45
|
+
del lazy_import
|
|
46
|
+
del install_doc
|
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Abstract classes for the rigged configuration bijections
|
|
5
|
+
|
|
6
|
+
This file contains two sets of classes, one for the bijection from KR tableaux to
|
|
7
|
+
rigged configurations and the other for the reverse bijection. We do this for
|
|
8
|
+
two reasons, one is because we can store a state in the bijection locally, so
|
|
9
|
+
we do not have to constantly pass it around between functions. The other is because
|
|
10
|
+
it makes the code easier to read in the \*_element.py files.
|
|
11
|
+
|
|
12
|
+
These classes are not meant to be used by the user and are only supposed to be
|
|
13
|
+
used internally to perform the bijections between
|
|
14
|
+
:class:`~sage.combinat.rigged_configurations.tensor_product_kr_tableaux.TensorProductOfKirillovReshetikhinTableaux`
|
|
15
|
+
and :class:`RiggedConfigurations`.
|
|
16
|
+
|
|
17
|
+
AUTHORS:
|
|
18
|
+
|
|
19
|
+
- Travis Scrimshaw (2011-04-15): Initial version
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# ****************************************************************************
|
|
23
|
+
# Copyright (C) 2011, 2012 Travis Scrimshaw <tscrim@ucdavis.edu>
|
|
24
|
+
#
|
|
25
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
26
|
+
#
|
|
27
|
+
# This code is distributed in the hope that it will be useful,
|
|
28
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
29
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
30
|
+
# General Public License for more details.
|
|
31
|
+
#
|
|
32
|
+
# The full text of the GPL is available at:
|
|
33
|
+
#
|
|
34
|
+
# https://www.gnu.org/licenses/
|
|
35
|
+
# ****************************************************************************
|
|
36
|
+
|
|
37
|
+
from copy import deepcopy
|
|
38
|
+
from sage.misc.abstract_method import abstract_method
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class KRTToRCBijectionAbstract:
|
|
42
|
+
"""
|
|
43
|
+
Root abstract class for the bijection from KR tableaux to rigged configurations.
|
|
44
|
+
|
|
45
|
+
This class holds the state of the bijection and generates the next state.
|
|
46
|
+
This class should never be created directly.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, tp_krt):
|
|
50
|
+
"""
|
|
51
|
+
Initialize the bijection by obtaining the important information from
|
|
52
|
+
the KR tableaux.
|
|
53
|
+
|
|
54
|
+
INPUT:
|
|
55
|
+
|
|
56
|
+
- ``parent`` -- the parent of tensor product of KR tableaux
|
|
57
|
+
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
61
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
62
|
+
sage: bijection = KRTToRCBijectionTypeA(KRT(pathlist=[[3,1]]))
|
|
63
|
+
sage: TestSuite(bijection).run()
|
|
64
|
+
"""
|
|
65
|
+
self.tp_krt = tp_krt
|
|
66
|
+
self.n = tp_krt.parent().cartan_type().classical().rank()
|
|
67
|
+
self.ret_rig_con = tp_krt.parent().rigged_configurations()(partition_list=[[]] * self.n)
|
|
68
|
+
# We allow this to be mutable to make the bijection easier to program.
|
|
69
|
+
# Upon completing the bijection, this will be set to immutable.
|
|
70
|
+
# Do not call this, the object could be in a mutable state and ultimately
|
|
71
|
+
# be placed in an unstable state.
|
|
72
|
+
# The user will (and should) never know about this temporary mutable state.
|
|
73
|
+
self.ret_rig_con._set_mutable()
|
|
74
|
+
self.cur_dims = []
|
|
75
|
+
self.cur_path = []
|
|
76
|
+
# self.L = {}
|
|
77
|
+
|
|
78
|
+
def __eq__(self, rhs):
|
|
79
|
+
r"""
|
|
80
|
+
Check equality.
|
|
81
|
+
|
|
82
|
+
This is only here for pickling check. This is a temporary placeholder
|
|
83
|
+
class, and as such, should never be compared.
|
|
84
|
+
|
|
85
|
+
TESTS::
|
|
86
|
+
|
|
87
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
88
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
89
|
+
sage: bijection = KRTToRCBijectionTypeA(KRT(pathlist=[[5,3]]))
|
|
90
|
+
sage: bijection2 = KRTToRCBijectionTypeA(KRT(pathlist=[[5,3]]))
|
|
91
|
+
sage: bijection == bijection2
|
|
92
|
+
True
|
|
93
|
+
"""
|
|
94
|
+
return isinstance(rhs, KRTToRCBijectionAbstract)
|
|
95
|
+
|
|
96
|
+
def run(self, verbose=False):
|
|
97
|
+
"""
|
|
98
|
+
Run the bijection from a tensor product of KR tableaux to a rigged
|
|
99
|
+
configuration.
|
|
100
|
+
|
|
101
|
+
INPUT:
|
|
102
|
+
|
|
103
|
+
- ``tp_krt`` -- a tensor product of KR tableaux
|
|
104
|
+
|
|
105
|
+
- ``verbose`` -- (default: ``False``) display each step in the
|
|
106
|
+
bijection
|
|
107
|
+
|
|
108
|
+
EXAMPLES::
|
|
109
|
+
|
|
110
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2, 1]])
|
|
111
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
112
|
+
sage: KRTToRCBijectionTypeA(KRT(pathlist=[[5,2]])).run()
|
|
113
|
+
<BLANKLINE>
|
|
114
|
+
-1[ ]-1
|
|
115
|
+
<BLANKLINE>
|
|
116
|
+
1[ ]1
|
|
117
|
+
<BLANKLINE>
|
|
118
|
+
0[ ]0
|
|
119
|
+
<BLANKLINE>
|
|
120
|
+
-1[ ]-1
|
|
121
|
+
<BLANKLINE>
|
|
122
|
+
"""
|
|
123
|
+
if verbose:
|
|
124
|
+
from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \
|
|
125
|
+
import TensorProductOfKirillovReshetikhinTableauxElement
|
|
126
|
+
|
|
127
|
+
for cur_crystal in reversed(self.tp_krt):
|
|
128
|
+
target = cur_crystal.parent()._r
|
|
129
|
+
# Iterate through the columns
|
|
130
|
+
for col_number, cur_column in enumerate(reversed(cur_crystal.to_array(False))):
|
|
131
|
+
self.cur_path.insert(0, []) # Prepend an empty list
|
|
132
|
+
|
|
133
|
+
self.cur_dims.insert(0, [0, 1])
|
|
134
|
+
|
|
135
|
+
for letter in reversed(cur_column):
|
|
136
|
+
self.cur_dims[0][0] = self._next_index(self.cur_dims[0][0], target)
|
|
137
|
+
val = letter.value # Convert from a CrystalOfLetter to an Integer
|
|
138
|
+
|
|
139
|
+
if verbose:
|
|
140
|
+
print("====================")
|
|
141
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
142
|
+
print("--------------------")
|
|
143
|
+
print(repr(self.ret_rig_con))
|
|
144
|
+
print("--------------------\n")
|
|
145
|
+
|
|
146
|
+
# Build the next state
|
|
147
|
+
self.cur_path[0].insert(0, [letter]) # Prepend the value
|
|
148
|
+
self.next_state(val)
|
|
149
|
+
|
|
150
|
+
# If we've split off a column, we need to merge the current column
|
|
151
|
+
# to the current crystal tableau
|
|
152
|
+
if col_number > 0:
|
|
153
|
+
if verbose:
|
|
154
|
+
print("====================")
|
|
155
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
156
|
+
print("--------------------")
|
|
157
|
+
print(repr(self.ret_rig_con))
|
|
158
|
+
print("--------------------\n")
|
|
159
|
+
print("Applying column merge")
|
|
160
|
+
|
|
161
|
+
for i, letter_singleton in enumerate(self.cur_path[0]):
|
|
162
|
+
self.cur_path[1][i].insert(0, letter_singleton[0])
|
|
163
|
+
self.cur_dims[1][1] += 1
|
|
164
|
+
self.cur_path.pop(0)
|
|
165
|
+
self.cur_dims.pop(0)
|
|
166
|
+
|
|
167
|
+
# And perform the inverse column splitting map on the RC
|
|
168
|
+
for a in range(self.n):
|
|
169
|
+
self._update_vacancy_nums(a)
|
|
170
|
+
|
|
171
|
+
self.ret_rig_con.set_immutable() # Return it to immutable
|
|
172
|
+
return self.ret_rig_con
|
|
173
|
+
|
|
174
|
+
@abstract_method
|
|
175
|
+
def next_state(self, val):
|
|
176
|
+
r"""
|
|
177
|
+
Build the next state in the bijection.
|
|
178
|
+
|
|
179
|
+
INPUT:
|
|
180
|
+
|
|
181
|
+
- ``val`` -- the value we are adding
|
|
182
|
+
|
|
183
|
+
TESTS::
|
|
184
|
+
|
|
185
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
186
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
187
|
+
sage: bijection = KRTToRCBijectionTypeA(KRT(pathlist=[[5,3]]))
|
|
188
|
+
sage: bijection.cur_path.insert(0, [])
|
|
189
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
190
|
+
sage: bijection.cur_path[0].insert(0, [3])
|
|
191
|
+
sage: bijection.next_state(3)
|
|
192
|
+
sage: bijection.ret_rig_con
|
|
193
|
+
<BLANKLINE>
|
|
194
|
+
-1[ ]-1
|
|
195
|
+
<BLANKLINE>
|
|
196
|
+
-1[ ]-1
|
|
197
|
+
<BLANKLINE>
|
|
198
|
+
(/)
|
|
199
|
+
<BLANKLINE>
|
|
200
|
+
(/)
|
|
201
|
+
<BLANKLINE>
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
def _update_vacancy_nums(self, a):
|
|
205
|
+
r"""
|
|
206
|
+
Update the vacancy numbers of a rigged partition.
|
|
207
|
+
|
|
208
|
+
Helper function to (batch) update the vacancy numbers of the rigged
|
|
209
|
+
partition at position `a` in the rigged configuration stored by this
|
|
210
|
+
bijection.
|
|
211
|
+
|
|
212
|
+
INPUT:
|
|
213
|
+
|
|
214
|
+
- ``a`` -- the index of the partition to update
|
|
215
|
+
|
|
216
|
+
TESTS::
|
|
217
|
+
|
|
218
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
219
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import KRTToRCBijectionAbstract
|
|
220
|
+
sage: bijection = KRTToRCBijectionAbstract(KRT(pathlist=[[3,2]]))
|
|
221
|
+
sage: bijection._update_vacancy_nums(2)
|
|
222
|
+
"""
|
|
223
|
+
# Check to make sure we have a valid index (currently removed)
|
|
224
|
+
# If the current tableau is empty, there is nothing to do
|
|
225
|
+
if not self.ret_rig_con[a]: # Check to see if we have vacancy numbers
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
# Setup the first block
|
|
229
|
+
block_len = self.ret_rig_con[a][0]
|
|
230
|
+
nu = self.ret_rig_con.nu()
|
|
231
|
+
vac_num = self.ret_rig_con.parent()._calc_vacancy_number(nu, a, nu[a][0],
|
|
232
|
+
dims=self.cur_dims)
|
|
233
|
+
|
|
234
|
+
for i, row_len in enumerate(self.ret_rig_con[a]):
|
|
235
|
+
# If we've gone to a different sized block, then update the
|
|
236
|
+
# values which change when moving to a new block size
|
|
237
|
+
if block_len != row_len:
|
|
238
|
+
vac_num = self.ret_rig_con.parent()._calc_vacancy_number(nu, a, row_len,
|
|
239
|
+
dims=self.cur_dims)
|
|
240
|
+
block_len = row_len
|
|
241
|
+
self.ret_rig_con[a].vacancy_numbers[i] = vac_num
|
|
242
|
+
|
|
243
|
+
def _update_partition_values(self, a):
|
|
244
|
+
r"""
|
|
245
|
+
Update the partition values of a rigged partition.
|
|
246
|
+
|
|
247
|
+
Helper function to update the partition values of a given rigged
|
|
248
|
+
partition row. This will go through all of our partition values and set
|
|
249
|
+
them to our vacancy number if the corresponding row has been changed
|
|
250
|
+
(indicated by being set to ``None``).
|
|
251
|
+
|
|
252
|
+
INPUT:
|
|
253
|
+
|
|
254
|
+
- ``a`` -- the index of the partition to update
|
|
255
|
+
|
|
256
|
+
TESTS::
|
|
257
|
+
|
|
258
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
259
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import KRTToRCBijectionAbstract
|
|
260
|
+
sage: bijection = KRTToRCBijectionAbstract(KRT(pathlist=[[5,2]]))
|
|
261
|
+
sage: bijection._update_partition_values(2)
|
|
262
|
+
"""
|
|
263
|
+
rigged_partition = self.ret_rig_con[a]
|
|
264
|
+
for index, value in enumerate(rigged_partition.rigging):
|
|
265
|
+
if value is None:
|
|
266
|
+
rigged_partition.rigging[index] = rigged_partition.vacancy_numbers[index]
|
|
267
|
+
if index > 0 and rigged_partition[index - 1] == rigged_partition[index] \
|
|
268
|
+
and rigged_partition.rigging[index - 1] < rigged_partition.rigging[index]:
|
|
269
|
+
# If we need to reorder
|
|
270
|
+
pos = 0
|
|
271
|
+
width = rigged_partition[index]
|
|
272
|
+
val = rigged_partition.rigging[index]
|
|
273
|
+
for i in reversed(range(index - 1)):
|
|
274
|
+
if rigged_partition[i] > width or rigged_partition.rigging[i] >= val:
|
|
275
|
+
pos = i + 1
|
|
276
|
+
break
|
|
277
|
+
|
|
278
|
+
rigged_partition.rigging.pop(index)
|
|
279
|
+
rigged_partition.rigging.insert(pos, val)
|
|
280
|
+
|
|
281
|
+
def _next_index(self, r, target):
|
|
282
|
+
"""
|
|
283
|
+
Return the next index after ``r`` when performing a step
|
|
284
|
+
in the bijection going towards ``target``.
|
|
285
|
+
|
|
286
|
+
TESTS::
|
|
287
|
+
|
|
288
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 1], [[2,1]])
|
|
289
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import KRTToRCBijectionAbstract
|
|
290
|
+
sage: bijection = KRTToRCBijectionAbstract(KRT(pathlist=[[5,2]]))
|
|
291
|
+
sage: bijection._next_index(1, 2)
|
|
292
|
+
2
|
|
293
|
+
"""
|
|
294
|
+
return r + 1
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
class RCToKRTBijectionAbstract:
|
|
298
|
+
"""
|
|
299
|
+
Root abstract class for the bijection from rigged configurations to
|
|
300
|
+
tensor product of Kirillov-Reshetikhin tableaux.
|
|
301
|
+
|
|
302
|
+
This class holds the state of the bijection and generates the next state.
|
|
303
|
+
This class should never be created directly.
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
def __init__(self, RC_element):
|
|
307
|
+
"""
|
|
308
|
+
Initialize the bijection helper.
|
|
309
|
+
|
|
310
|
+
INPUT:
|
|
311
|
+
|
|
312
|
+
- ``RC_element`` -- the rigged configuration
|
|
313
|
+
|
|
314
|
+
EXAMPLES::
|
|
315
|
+
|
|
316
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
317
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import RCToKRTBijectionAbstract
|
|
318
|
+
sage: bijection = RCToKRTBijectionAbstract(RC(partition_list=[[1],[1],[1],[1]]))
|
|
319
|
+
sage: TestSuite(bijection).run()
|
|
320
|
+
"""
|
|
321
|
+
# Make a mutable clone of the rigged configuration for the bijection
|
|
322
|
+
# This will be deleted when the bijection is completed
|
|
323
|
+
self.rigged_con = RC_element.__copy__()
|
|
324
|
+
self.n = RC_element.parent().cartan_type().classical().rank()
|
|
325
|
+
self.KRT = RC_element.parent().tensor_product_of_kirillov_reshetikhin_tableaux()
|
|
326
|
+
|
|
327
|
+
# Make a (deep) copy of the dimensions for the bijection
|
|
328
|
+
self.cur_dims = [list(x[:]) for x in self.rigged_con.parent().dims]
|
|
329
|
+
|
|
330
|
+
# Note that this implementation of the bijection is destructive to cur_partitions,
|
|
331
|
+
# therefore we will make a (deep) copy of the partitions.
|
|
332
|
+
# TODO: Convert from cur_partitions to rigged_con
|
|
333
|
+
self.cur_partitions = deepcopy(list(self.rigged_con)[:])
|
|
334
|
+
|
|
335
|
+
# This is a dummy edge to start the process
|
|
336
|
+
cp = RC_element.__copy__()
|
|
337
|
+
cp.set_immutable()
|
|
338
|
+
self._graph = [[[], (cp, 0)]]
|
|
339
|
+
|
|
340
|
+
def __eq__(self, rhs):
|
|
341
|
+
r"""
|
|
342
|
+
Check equality.
|
|
343
|
+
|
|
344
|
+
This is only here for pickling check. This is a temporary placeholder
|
|
345
|
+
class, and as such, should never be compared.
|
|
346
|
+
|
|
347
|
+
TESTS::
|
|
348
|
+
|
|
349
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
350
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import RCToKRTBijectionTypeA
|
|
351
|
+
sage: bijection = RCToKRTBijectionTypeA(RC(partition_list=[[1],[1],[1],[1]]))
|
|
352
|
+
sage: bijection2 = RCToKRTBijectionTypeA(RC(partition_list=[[1],[1],[1],[1]]))
|
|
353
|
+
sage: bijection == bijection2
|
|
354
|
+
True
|
|
355
|
+
"""
|
|
356
|
+
return isinstance(rhs, RCToKRTBijectionAbstract)
|
|
357
|
+
|
|
358
|
+
def run(self, verbose=False, build_graph=False):
|
|
359
|
+
"""
|
|
360
|
+
Run the bijection from rigged configurations to tensor product of KR
|
|
361
|
+
tableaux.
|
|
362
|
+
|
|
363
|
+
INPUT:
|
|
364
|
+
|
|
365
|
+
- ``verbose`` -- boolean (default: ``False``); display each step in the
|
|
366
|
+
bijection
|
|
367
|
+
- ``build_graph`` -- boolean (default: ``False``); build the graph of each
|
|
368
|
+
step of the bijection
|
|
369
|
+
|
|
370
|
+
EXAMPLES::
|
|
371
|
+
|
|
372
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
373
|
+
sage: x = RC(partition_list=[[1],[1],[1],[1]])
|
|
374
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import RCToKRTBijectionTypeA
|
|
375
|
+
sage: RCToKRTBijectionTypeA(x).run()
|
|
376
|
+
[[2], [5]]
|
|
377
|
+
sage: bij = RCToKRTBijectionTypeA(x)
|
|
378
|
+
sage: bij.run(build_graph=True)
|
|
379
|
+
[[2], [5]]
|
|
380
|
+
sage: bij._graph
|
|
381
|
+
Digraph on 3 vertices
|
|
382
|
+
"""
|
|
383
|
+
from sage.combinat.crystals.letters import CrystalOfLetters
|
|
384
|
+
letters = CrystalOfLetters(self.rigged_con.parent()._cartan_type.classical())
|
|
385
|
+
|
|
386
|
+
# This is technically bad, but because the first thing we do is append
|
|
387
|
+
# an empty list to ret_crystal_path, we correct this. We do it this
|
|
388
|
+
# way so that we do not have to remove an empty list after the
|
|
389
|
+
# bijection has been performed.
|
|
390
|
+
ret_crystal_path = []
|
|
391
|
+
|
|
392
|
+
for dim in self.rigged_con.parent().dims:
|
|
393
|
+
ret_crystal_path.append([])
|
|
394
|
+
|
|
395
|
+
# Iterate over each column
|
|
396
|
+
for dummy_var in range(dim[1]):
|
|
397
|
+
# Split off a new column if necessary
|
|
398
|
+
if self.cur_dims[0][1] > 1:
|
|
399
|
+
if verbose:
|
|
400
|
+
print("====================")
|
|
401
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
402
|
+
print("--------------------")
|
|
403
|
+
print(ret_crystal_path)
|
|
404
|
+
print("--------------------\n")
|
|
405
|
+
print("Applying column split")
|
|
406
|
+
|
|
407
|
+
self.cur_dims[0][1] -= 1
|
|
408
|
+
self.cur_dims.insert(0, [dim[0], 1])
|
|
409
|
+
|
|
410
|
+
# Perform the corresponding splitting map on rigged configurations
|
|
411
|
+
# All it does is update the vacancy numbers on the RC side
|
|
412
|
+
for a in range(self.n):
|
|
413
|
+
self._update_vacancy_numbers(a)
|
|
414
|
+
|
|
415
|
+
if build_graph:
|
|
416
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
417
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), 'ls'])
|
|
418
|
+
|
|
419
|
+
while self.cur_dims[0][0]: # > 0:
|
|
420
|
+
if verbose:
|
|
421
|
+
print("====================")
|
|
422
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
423
|
+
print("--------------------")
|
|
424
|
+
print(ret_crystal_path)
|
|
425
|
+
print("--------------------\n")
|
|
426
|
+
|
|
427
|
+
ht = self.cur_dims[0][0]
|
|
428
|
+
self.cur_dims[0][0] = self._next_index(ht)
|
|
429
|
+
b = self.next_state(ht)
|
|
430
|
+
|
|
431
|
+
# Make sure we have a crystal letter
|
|
432
|
+
ret_crystal_path[-1].append(letters(b)) # Append the rank
|
|
433
|
+
|
|
434
|
+
if build_graph:
|
|
435
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
436
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
|
|
437
|
+
|
|
438
|
+
self.cur_dims.pop(0) # Pop off the leading column
|
|
439
|
+
|
|
440
|
+
if build_graph:
|
|
441
|
+
self._graph.pop(0) # Remove the dummy at the start
|
|
442
|
+
from sage.graphs.digraph import DiGraph
|
|
443
|
+
from sage.graphs.dot2tex_utils import have_dot2tex
|
|
444
|
+
self._graph = DiGraph(self._graph, format='list_of_edges')
|
|
445
|
+
if have_dot2tex():
|
|
446
|
+
self._graph.set_latex_options(format='dot2tex', edge_labels=True)
|
|
447
|
+
return self.KRT(pathlist=ret_crystal_path)
|
|
448
|
+
|
|
449
|
+
@abstract_method
|
|
450
|
+
def next_state(self, height):
|
|
451
|
+
"""
|
|
452
|
+
Build the next state in the bijection.
|
|
453
|
+
|
|
454
|
+
TESTS::
|
|
455
|
+
|
|
456
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
457
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A import RCToKRTBijectionTypeA
|
|
458
|
+
sage: bijection = RCToKRTBijectionTypeA(RC(partition_list=[[1],[1],[1],[1]]))
|
|
459
|
+
sage: bijection.next_state(1)
|
|
460
|
+
5
|
|
461
|
+
sage: bijection.cur_partitions
|
|
462
|
+
[(/)
|
|
463
|
+
, (/)
|
|
464
|
+
, (/)
|
|
465
|
+
, (/)
|
|
466
|
+
]
|
|
467
|
+
"""
|
|
468
|
+
|
|
469
|
+
def _update_vacancy_numbers(self, a):
|
|
470
|
+
r"""
|
|
471
|
+
Update the vacancy numbers during the bijection.
|
|
472
|
+
|
|
473
|
+
INPUT:
|
|
474
|
+
|
|
475
|
+
- ``a`` -- the index of the partition to update
|
|
476
|
+
|
|
477
|
+
TESTS::
|
|
478
|
+
|
|
479
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
480
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import RCToKRTBijectionAbstract
|
|
481
|
+
sage: bijection = RCToKRTBijectionAbstract(RC(partition_list=[[1],[1],[1],[1]]))
|
|
482
|
+
sage: bijection._update_vacancy_numbers(2)
|
|
483
|
+
"""
|
|
484
|
+
|
|
485
|
+
# Nothing to do if there the rigged partition is empty
|
|
486
|
+
if not self.cur_partitions[a]:
|
|
487
|
+
return
|
|
488
|
+
|
|
489
|
+
partition = self.cur_partitions[a]
|
|
490
|
+
|
|
491
|
+
# Setup the first block
|
|
492
|
+
block_len = partition[0]
|
|
493
|
+
vac_num = self.rigged_con.parent()._calc_vacancy_number(self.cur_partitions,
|
|
494
|
+
a, partition[0],
|
|
495
|
+
dims=self.cur_dims)
|
|
496
|
+
|
|
497
|
+
for i, row_len in enumerate(self.cur_partitions[a]):
|
|
498
|
+
# If we've gone to a different sized block, then update the
|
|
499
|
+
# values which change when moving to a new block size
|
|
500
|
+
if block_len != row_len:
|
|
501
|
+
vac_num = self.rigged_con.parent()._calc_vacancy_number(self.cur_partitions,
|
|
502
|
+
a, row_len,
|
|
503
|
+
dims=self.cur_dims)
|
|
504
|
+
block_len = row_len
|
|
505
|
+
|
|
506
|
+
partition.vacancy_numbers[i] = vac_num
|
|
507
|
+
|
|
508
|
+
def _find_singular_string(self, partition, last_size):
|
|
509
|
+
r"""
|
|
510
|
+
Return the index of the singular string or ``None`` if not found.
|
|
511
|
+
|
|
512
|
+
Helper method to find a singular string at least as long as
|
|
513
|
+
``last_size``.
|
|
514
|
+
|
|
515
|
+
INPUT:
|
|
516
|
+
|
|
517
|
+
- ``partition`` -- the partition to look in
|
|
518
|
+
|
|
519
|
+
- ``last_size`` -- the last size found
|
|
520
|
+
|
|
521
|
+
TESTS::
|
|
522
|
+
|
|
523
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
524
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import RCToKRTBijectionAbstract
|
|
525
|
+
sage: bijection = RCToKRTBijectionAbstract(RC(partition_list=[[1],[1],[1],[1]]))
|
|
526
|
+
sage: bijection._find_singular_string(bijection.cur_partitions[2], 2)
|
|
527
|
+
sage: bijection._find_singular_string(bijection.cur_partitions[2], 0)
|
|
528
|
+
0
|
|
529
|
+
"""
|
|
530
|
+
for i in reversed(range(len(partition))):
|
|
531
|
+
if (partition[i] >= last_size
|
|
532
|
+
and partition.vacancy_numbers[i] == partition.rigging[i]):
|
|
533
|
+
return i
|
|
534
|
+
|
|
535
|
+
def _next_index(self, r):
|
|
536
|
+
"""
|
|
537
|
+
Return the next index after ``r`` when performing a step
|
|
538
|
+
in the bijection.
|
|
539
|
+
|
|
540
|
+
TESTS::
|
|
541
|
+
|
|
542
|
+
sage: RC = RiggedConfigurations(['A', 4, 1], [[2, 1]])
|
|
543
|
+
sage: from sage.combinat.rigged_configurations.bij_abstract_class import RCToKRTBijectionAbstract
|
|
544
|
+
sage: bijection = RCToKRTBijectionAbstract(RC(partition_list=[[1],[1],[1],[1]]))
|
|
545
|
+
sage: bijection._next_index(2)
|
|
546
|
+
1
|
|
547
|
+
"""
|
|
548
|
+
return r - 1
|