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
|
@@ -0,0 +1,784 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Six vertex model
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from sage.structure.parent import Parent
|
|
7
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
8
|
+
from sage.structure.list_clone import ClonableArray
|
|
9
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
10
|
+
from sage.combinat.combinatorial_map import combinatorial_map
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SixVertexConfiguration(ClonableArray):
|
|
14
|
+
"""
|
|
15
|
+
A configuration in the six vertex model.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def check(self):
|
|
19
|
+
"""
|
|
20
|
+
Check if ``self`` is a valid 6 vertex configuration.
|
|
21
|
+
|
|
22
|
+
EXAMPLES::
|
|
23
|
+
|
|
24
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
25
|
+
sage: M[0].check()
|
|
26
|
+
"""
|
|
27
|
+
if self not in self.parent():
|
|
28
|
+
raise ValueError("invalid configuration")
|
|
29
|
+
|
|
30
|
+
def _repr_(self):
|
|
31
|
+
"""
|
|
32
|
+
Return a string representation of ``self``.
|
|
33
|
+
|
|
34
|
+
EXAMPLES::
|
|
35
|
+
|
|
36
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
37
|
+
sage: M[0]
|
|
38
|
+
^ ^ ^
|
|
39
|
+
| | |
|
|
40
|
+
--> # <- # <- # <--
|
|
41
|
+
| ^ ^
|
|
42
|
+
V | |
|
|
43
|
+
--> # -> # <- # <--
|
|
44
|
+
| | ^
|
|
45
|
+
V V |
|
|
46
|
+
--> # -> # -> # <--
|
|
47
|
+
| | |
|
|
48
|
+
V V V
|
|
49
|
+
"""
|
|
50
|
+
# List are in the order of URDL
|
|
51
|
+
ascii = [[r' V ', ' -', r' ^ ', '- '], # LR
|
|
52
|
+
[r' | ', ' <', r' ^ ', '- '], # LU
|
|
53
|
+
[r' V ', ' <', r' | ', '- '], # LD
|
|
54
|
+
[r' | ', ' <', r' | ', '> '], # UD
|
|
55
|
+
[r' | ', ' -', r' ^ ', '> '], # UR
|
|
56
|
+
[r' V ', ' -', r' | ', '> ']] # RD
|
|
57
|
+
ret = ' '
|
|
58
|
+
# Do the top line
|
|
59
|
+
for entry in self[0]:
|
|
60
|
+
if entry == 1 or entry == 3 or entry == 4:
|
|
61
|
+
ret += ' ^ '
|
|
62
|
+
else:
|
|
63
|
+
ret += ' | '
|
|
64
|
+
|
|
65
|
+
# Do the meat of the ascii art
|
|
66
|
+
for row in self:
|
|
67
|
+
ret += '\n '
|
|
68
|
+
# Do the top row
|
|
69
|
+
for entry in row:
|
|
70
|
+
ret += ascii[entry][0]
|
|
71
|
+
ret += '\n'
|
|
72
|
+
|
|
73
|
+
# Do the left-most entry
|
|
74
|
+
if row[0] == 0 or row[0] == 1 or row[0] == 2:
|
|
75
|
+
ret += '<-'
|
|
76
|
+
else:
|
|
77
|
+
ret += '--'
|
|
78
|
+
|
|
79
|
+
# Do the middle row
|
|
80
|
+
for entry in row:
|
|
81
|
+
ret += ascii[entry][3] + '#' + ascii[entry][1]
|
|
82
|
+
|
|
83
|
+
# Do the right-most entry
|
|
84
|
+
if row[-1] == 0 or row[-1] == 4 or row[-1] == 5:
|
|
85
|
+
ret += '->'
|
|
86
|
+
else:
|
|
87
|
+
ret += '--'
|
|
88
|
+
|
|
89
|
+
# Do the bottom row
|
|
90
|
+
ret += '\n '
|
|
91
|
+
for entry in row:
|
|
92
|
+
ret += ascii[entry][2]
|
|
93
|
+
|
|
94
|
+
# Do the bottom line
|
|
95
|
+
ret += '\n '
|
|
96
|
+
for entry in self[-1]:
|
|
97
|
+
if entry == 2 or entry == 3 or entry == 5:
|
|
98
|
+
ret += ' V '
|
|
99
|
+
else:
|
|
100
|
+
ret += ' | '
|
|
101
|
+
|
|
102
|
+
return ret
|
|
103
|
+
|
|
104
|
+
def to_signed_matrix(self):
|
|
105
|
+
"""
|
|
106
|
+
Return the signed matrix of ``self``.
|
|
107
|
+
|
|
108
|
+
The signed matrix corresponding to a six vertex configuration is
|
|
109
|
+
given by `0` if there is a cross flow, a `1` if the outward arrows
|
|
110
|
+
are vertical and `-1` if the outward arrows are horizontal.
|
|
111
|
+
|
|
112
|
+
EXAMPLES::
|
|
113
|
+
|
|
114
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
115
|
+
sage: [x.to_signed_matrix() for x in M] # needs sage.modules
|
|
116
|
+
[
|
|
117
|
+
[1 0 0] [1 0 0] [ 0 1 0] [0 1 0] [0 1 0] [0 0 1] [0 0 1]
|
|
118
|
+
[0 1 0] [0 0 1] [ 1 -1 1] [1 0 0] [0 0 1] [1 0 0] [0 1 0]
|
|
119
|
+
[0 0 1], [0 1 0], [ 0 1 0], [0 0 1], [1 0 0], [0 1 0], [1 0 0]
|
|
120
|
+
]
|
|
121
|
+
"""
|
|
122
|
+
from sage.matrix.constructor import matrix
|
|
123
|
+
# verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
|
|
124
|
+
|
|
125
|
+
def matrix_sign(x):
|
|
126
|
+
if x == 0:
|
|
127
|
+
return -1
|
|
128
|
+
if x == 3:
|
|
129
|
+
return 1
|
|
130
|
+
return 0
|
|
131
|
+
return matrix([[matrix_sign(r) for r in row] for row in self])
|
|
132
|
+
|
|
133
|
+
def plot(self, color='sign'):
|
|
134
|
+
"""
|
|
135
|
+
Return a plot of ``self``.
|
|
136
|
+
|
|
137
|
+
INPUT:
|
|
138
|
+
|
|
139
|
+
- ``color`` -- can be any of the following:
|
|
140
|
+
|
|
141
|
+
* ``4`` -- use 4 colors: black, red, blue, and green with each
|
|
142
|
+
corresponding to up, right, down, and left respectively
|
|
143
|
+
* ``2`` -- use 2 colors: red for horizontal, blue for vertical arrows
|
|
144
|
+
* ``'sign'`` -- use red for right and down arrows, blue for left
|
|
145
|
+
and up arrows
|
|
146
|
+
* a list of 4 colors for each direction
|
|
147
|
+
* a function which takes a direction and a boolean corresponding
|
|
148
|
+
to the sign
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
153
|
+
sage: print(M[0].plot().description()) # needs sage.plot
|
|
154
|
+
Arrow from (-1.0,0.0) to (0.0,0.0)
|
|
155
|
+
Arrow from (-1.0,1.0) to (0.0,1.0)
|
|
156
|
+
Arrow from (0.0,0.0) to (0.0,-1.0)
|
|
157
|
+
Arrow from (0.0,0.0) to (1.0,0.0)
|
|
158
|
+
Arrow from (0.0,1.0) to (0.0,0.0)
|
|
159
|
+
Arrow from (0.0,1.0) to (0.0,2.0)
|
|
160
|
+
Arrow from (1.0,0.0) to (1.0,-1.0)
|
|
161
|
+
Arrow from (1.0,0.0) to (1.0,1.0)
|
|
162
|
+
Arrow from (1.0,1.0) to (0.0,1.0)
|
|
163
|
+
Arrow from (1.0,1.0) to (1.0,2.0)
|
|
164
|
+
Arrow from (2.0,0.0) to (1.0,0.0)
|
|
165
|
+
Arrow from (2.0,1.0) to (1.0,1.0)
|
|
166
|
+
"""
|
|
167
|
+
from sage.plot.graphics import Graphics
|
|
168
|
+
from sage.plot.arrow import arrow
|
|
169
|
+
|
|
170
|
+
if color == 4:
|
|
171
|
+
color_list = ['black', 'red', 'blue', 'green']
|
|
172
|
+
cfunc = lambda d,pm: color_list[d]
|
|
173
|
+
elif color == 2:
|
|
174
|
+
cfunc = lambda d,pm: 'red' if d % 2 == 0 else 'blue'
|
|
175
|
+
elif color == 1 or color is None:
|
|
176
|
+
cfunc = lambda d,pm: 'black'
|
|
177
|
+
elif color == 'sign':
|
|
178
|
+
cfunc = lambda d,pm: 'red' if pm else 'blue' # RD are True
|
|
179
|
+
elif isinstance(color, (list, tuple)):
|
|
180
|
+
cfunc = lambda d,pm: color[d]
|
|
181
|
+
else:
|
|
182
|
+
cfunc = color
|
|
183
|
+
|
|
184
|
+
G = Graphics()
|
|
185
|
+
for j,row in enumerate(reversed(self)):
|
|
186
|
+
for i,entry in enumerate(row):
|
|
187
|
+
if entry == 0: # LR
|
|
188
|
+
G += arrow((i,j+1), (i,j), color=cfunc(2, True))
|
|
189
|
+
G += arrow((i,j), (i+1,j), color=cfunc(1, True))
|
|
190
|
+
if j == 0:
|
|
191
|
+
G += arrow((i,j-1), (i,j), color=cfunc(0, False))
|
|
192
|
+
if i == 0:
|
|
193
|
+
G += arrow((i,j), (i-1,j), color=cfunc(3, False))
|
|
194
|
+
elif entry == 1: # LU
|
|
195
|
+
G += arrow((i,j), (i,j+1), color=cfunc(0, False))
|
|
196
|
+
G += arrow((i+1,j), (i,j), color=cfunc(3, False))
|
|
197
|
+
if j == 0:
|
|
198
|
+
G += arrow((i,j-1), (i,j), color=cfunc(0, False))
|
|
199
|
+
if i == 0:
|
|
200
|
+
G += arrow((i,j), (i-1,j), color=cfunc(3, False))
|
|
201
|
+
elif entry == 2: # LD
|
|
202
|
+
G += arrow((i,j+1), (i,j), color=cfunc(2, True))
|
|
203
|
+
G += arrow((i+1,j), (i,j), color=cfunc(3, False))
|
|
204
|
+
if j == 0:
|
|
205
|
+
G += arrow((i,j), (i,j-1), color=cfunc(2, True))
|
|
206
|
+
if i == 0:
|
|
207
|
+
G += arrow((i,j), (i-1,j), color=cfunc(3, False))
|
|
208
|
+
elif entry == 3: # UD
|
|
209
|
+
G += arrow((i,j), (i,j+1), color=cfunc(0, False))
|
|
210
|
+
G += arrow((i+1,j), (i,j), color=cfunc(3, False))
|
|
211
|
+
if j == 0:
|
|
212
|
+
G += arrow((i,j), (i,j-1), color=cfunc(2, True))
|
|
213
|
+
if i == 0:
|
|
214
|
+
G += arrow((i-1,j), (i,j), color=cfunc(1, True))
|
|
215
|
+
elif entry == 4: # UR
|
|
216
|
+
G += arrow((i,j), (i,j+1), color=cfunc(0, False))
|
|
217
|
+
G += arrow((i,j), (i+1,j), color=cfunc(1, True))
|
|
218
|
+
if j == 0:
|
|
219
|
+
G += arrow((i,j-1), (i,j), color=cfunc(0, False))
|
|
220
|
+
if i == 0:
|
|
221
|
+
G += arrow((i-1,j), (i,j), color=cfunc(1, True))
|
|
222
|
+
elif entry == 5: # RD
|
|
223
|
+
G += arrow((i,j+1), (i,j), color=cfunc(2, True))
|
|
224
|
+
G += arrow((i,j), (i+1,j), color=cfunc(1, True))
|
|
225
|
+
if j == 0:
|
|
226
|
+
G += arrow((i,j), (i,j-1), color=cfunc(2, True))
|
|
227
|
+
if i == 0:
|
|
228
|
+
G += arrow((i-1,j), (i,j), color=cfunc(1, True))
|
|
229
|
+
G.axes(False)
|
|
230
|
+
return G
|
|
231
|
+
|
|
232
|
+
def energy(self, epsilon):
|
|
233
|
+
r"""
|
|
234
|
+
Return the energy of the configuration.
|
|
235
|
+
|
|
236
|
+
The energy of a configuration `\nu` is defined as
|
|
237
|
+
|
|
238
|
+
.. MATH::
|
|
239
|
+
|
|
240
|
+
E(\nu) = n_0 \epsilon_0 + n_1 \epsilon_1 + \cdots + n_5 \epsilon_5
|
|
241
|
+
|
|
242
|
+
where `n_i` is the number of vertices of type `i` and
|
|
243
|
+
`\epsilon_i` is the `i`-th energy constant.
|
|
244
|
+
|
|
245
|
+
.. NOTE::
|
|
246
|
+
|
|
247
|
+
We number our configurations as:
|
|
248
|
+
|
|
249
|
+
0. LR
|
|
250
|
+
1. LU
|
|
251
|
+
2. LD
|
|
252
|
+
3. UD
|
|
253
|
+
4. UR
|
|
254
|
+
5. RD
|
|
255
|
+
|
|
256
|
+
which differs from :wikipedia:`Ice-type_model`.
|
|
257
|
+
|
|
258
|
+
EXAMPLES::
|
|
259
|
+
|
|
260
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
261
|
+
sage: nu = M[2]; nu
|
|
262
|
+
^ ^ ^
|
|
263
|
+
| | |
|
|
264
|
+
--> # -> # <- # <--
|
|
265
|
+
^ | ^
|
|
266
|
+
| V |
|
|
267
|
+
--> # <- # -> # <--
|
|
268
|
+
| ^ |
|
|
269
|
+
V | V
|
|
270
|
+
--> # -> # <- # <--
|
|
271
|
+
| | |
|
|
272
|
+
V V V
|
|
273
|
+
sage: nu.energy([1,2,1,2,1,2])
|
|
274
|
+
15
|
|
275
|
+
|
|
276
|
+
A KDP energy::
|
|
277
|
+
|
|
278
|
+
sage: nu.energy([1,1,0,1,0,1])
|
|
279
|
+
7
|
|
280
|
+
|
|
281
|
+
A Rys `F` energy::
|
|
282
|
+
|
|
283
|
+
sage: nu.energy([0,1,1,0,1,1])
|
|
284
|
+
4
|
|
285
|
+
|
|
286
|
+
The zero field assumption::
|
|
287
|
+
|
|
288
|
+
sage: nu.energy([1,2,3,1,3,2])
|
|
289
|
+
15
|
|
290
|
+
"""
|
|
291
|
+
if len(epsilon) != 6:
|
|
292
|
+
raise ValueError("there must be 6 energy constants")
|
|
293
|
+
return sum(epsilon[entry] for row in self for entry in row)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class SixVertexModel(UniqueRepresentation, Parent):
|
|
297
|
+
"""
|
|
298
|
+
The six vertex model.
|
|
299
|
+
|
|
300
|
+
We model a configuration by indicating which configuration by the
|
|
301
|
+
following six configurations which are determined by the two outgoing
|
|
302
|
+
arrows in the Up, Right, Down, Left directions:
|
|
303
|
+
|
|
304
|
+
1. LR::
|
|
305
|
+
|
|
306
|
+
|
|
|
307
|
+
V
|
|
308
|
+
<-- # -->
|
|
309
|
+
^
|
|
310
|
+
|
|
|
311
|
+
|
|
312
|
+
2. LU::
|
|
313
|
+
|
|
314
|
+
^
|
|
315
|
+
|
|
|
316
|
+
<-- # <--
|
|
317
|
+
^
|
|
318
|
+
|
|
|
319
|
+
|
|
320
|
+
3. LD::
|
|
321
|
+
|
|
322
|
+
|
|
|
323
|
+
V
|
|
324
|
+
<-- # <--
|
|
325
|
+
|
|
|
326
|
+
V
|
|
327
|
+
|
|
328
|
+
4. UD::
|
|
329
|
+
|
|
330
|
+
^
|
|
331
|
+
|
|
|
332
|
+
--> # <--
|
|
333
|
+
|
|
|
334
|
+
V
|
|
335
|
+
|
|
336
|
+
5. UR::
|
|
337
|
+
|
|
338
|
+
^
|
|
339
|
+
|
|
|
340
|
+
--> # -->
|
|
341
|
+
^
|
|
342
|
+
|
|
|
343
|
+
6. RD::
|
|
344
|
+
|
|
345
|
+
|
|
|
346
|
+
V
|
|
347
|
+
--> # -->
|
|
348
|
+
|
|
|
349
|
+
V
|
|
350
|
+
|
|
351
|
+
INPUT:
|
|
352
|
+
|
|
353
|
+
- ``n`` -- the number of rows
|
|
354
|
+
- ``m`` -- (optional) the number of columns, if not specified, then
|
|
355
|
+
the number of columns is the number of rows
|
|
356
|
+
- ``boundary_conditions`` -- (optional) a quadruple of tuples whose
|
|
357
|
+
entries are either:
|
|
358
|
+
|
|
359
|
+
* ``True`` for an inward arrow,
|
|
360
|
+
* ``False`` for an outward arrow, or
|
|
361
|
+
* ``None`` for no boundary condition.
|
|
362
|
+
|
|
363
|
+
There are also the following predefined boundary conditions:
|
|
364
|
+
|
|
365
|
+
* ``'ice'`` -- the top and bottom boundary conditions are outward and the
|
|
366
|
+
left and right boundary conditions are inward; this gives the square
|
|
367
|
+
ice model. Also called domain wall boundary conditions.
|
|
368
|
+
* ``'domain wall'`` -- same as ``'ice'``.
|
|
369
|
+
* ``'alternating'`` -- the boundary conditions alternate between inward
|
|
370
|
+
and outward.
|
|
371
|
+
* ``'free'`` -- there are no boundary conditions.
|
|
372
|
+
|
|
373
|
+
EXAMPLES:
|
|
374
|
+
|
|
375
|
+
Here are the six types of vertices that can be created::
|
|
376
|
+
|
|
377
|
+
sage: M = SixVertexModel(1)
|
|
378
|
+
sage: list(M)
|
|
379
|
+
[
|
|
380
|
+
| ^ | ^ ^ |
|
|
381
|
+
V | V | | V
|
|
382
|
+
<-- # --> <-- # <-- <-- # <-- --> # <-- --> # --> --> # -->
|
|
383
|
+
^ ^ | | ^ |
|
|
384
|
+
| , | , V , V , | , V
|
|
385
|
+
]
|
|
386
|
+
|
|
387
|
+
When using the square ice model, it is known that the number of
|
|
388
|
+
configurations is equal to the number of alternating sign matrices::
|
|
389
|
+
|
|
390
|
+
sage: M = SixVertexModel(1, boundary_conditions='ice')
|
|
391
|
+
sage: len(M)
|
|
392
|
+
1
|
|
393
|
+
sage: M = SixVertexModel(4, boundary_conditions='ice')
|
|
394
|
+
sage: len(M)
|
|
395
|
+
42
|
|
396
|
+
sage: all(len(SixVertexModel(n, boundary_conditions='ice')) # needs sage.modules
|
|
397
|
+
....: == AlternatingSignMatrices(n).cardinality() for n in range(1, 7))
|
|
398
|
+
True
|
|
399
|
+
|
|
400
|
+
An example with a specified non-standard boundary condition and
|
|
401
|
+
non-rectangular shape::
|
|
402
|
+
|
|
403
|
+
sage: M = SixVertexModel(2, 1, [[None], [True,True], [None], [None,None]])
|
|
404
|
+
sage: list(M)
|
|
405
|
+
[
|
|
406
|
+
^ ^ | ^
|
|
407
|
+
| | V |
|
|
408
|
+
<-- # <-- <-- # <-- <-- # <-- --> # <--
|
|
409
|
+
^ ^ | |
|
|
410
|
+
| | V V
|
|
411
|
+
<-- # <-- --> # <-- <-- # <-- <-- # <--
|
|
412
|
+
^ | | |
|
|
413
|
+
| , V , V , V
|
|
414
|
+
]
|
|
415
|
+
|
|
416
|
+
REFERENCES:
|
|
417
|
+
|
|
418
|
+
- :wikipedia:`Vertex_model`
|
|
419
|
+
- :wikipedia:`Ice-type_model`
|
|
420
|
+
"""
|
|
421
|
+
@staticmethod
|
|
422
|
+
def __classcall_private__(cls, n, m=None, boundary_conditions=None):
|
|
423
|
+
"""
|
|
424
|
+
Normalize input to ensure a unique representation.
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: M1 = SixVertexModel(1, boundary_conditions=[[False],[True],[False],[True]])
|
|
429
|
+
sage: M2 = SixVertexModel(1, 1, ((False,),(True,),(False,),(True,)))
|
|
430
|
+
sage: M1 is M2
|
|
431
|
+
True
|
|
432
|
+
"""
|
|
433
|
+
if m is None:
|
|
434
|
+
m = n
|
|
435
|
+
if boundary_conditions is None or boundary_conditions == 'free':
|
|
436
|
+
boundary_conditions = ((None,)*m, (None,)*n)*2
|
|
437
|
+
elif boundary_conditions == 'alternating':
|
|
438
|
+
bdry = True
|
|
439
|
+
cond = []
|
|
440
|
+
for dummy in range(2):
|
|
441
|
+
val = []
|
|
442
|
+
for _ in range(m):
|
|
443
|
+
val.append(bdry)
|
|
444
|
+
bdry = not bdry
|
|
445
|
+
cond.append(tuple(val))
|
|
446
|
+
val = []
|
|
447
|
+
for k in range(n):
|
|
448
|
+
val.append(bdry)
|
|
449
|
+
bdry = not bdry
|
|
450
|
+
cond.append(tuple(val))
|
|
451
|
+
boundary_conditions = tuple(cond)
|
|
452
|
+
elif boundary_conditions == 'ice' or boundary_conditions == 'domain wall':
|
|
453
|
+
if m == n:
|
|
454
|
+
return SquareIceModel(n)
|
|
455
|
+
boundary_conditions = ((False,)*m, (True,)*n)*2
|
|
456
|
+
else:
|
|
457
|
+
boundary_conditions = tuple(tuple(x) for x in boundary_conditions)
|
|
458
|
+
return super().__classcall__(cls, n, m, boundary_conditions)
|
|
459
|
+
|
|
460
|
+
def __init__(self, n, m, boundary_conditions):
|
|
461
|
+
"""
|
|
462
|
+
Initialize ``self``.
|
|
463
|
+
|
|
464
|
+
EXAMPLES::
|
|
465
|
+
|
|
466
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
467
|
+
sage: TestSuite(M).run()
|
|
468
|
+
"""
|
|
469
|
+
self._nrows = n
|
|
470
|
+
self._ncols = m
|
|
471
|
+
self._bdry_cond = boundary_conditions # Ordered URDL
|
|
472
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
473
|
+
|
|
474
|
+
def _repr_(self):
|
|
475
|
+
"""
|
|
476
|
+
Return a string representation of ``self``.
|
|
477
|
+
|
|
478
|
+
EXAMPLES::
|
|
479
|
+
|
|
480
|
+
sage: SixVertexModel(2, boundary_conditions='ice')
|
|
481
|
+
The six vertex model on a 2 by 2 grid
|
|
482
|
+
"""
|
|
483
|
+
return "The six vertex model on a {} by {} grid".format(self._nrows, self._ncols)
|
|
484
|
+
|
|
485
|
+
def _repr_option(self, key):
|
|
486
|
+
"""
|
|
487
|
+
Metadata about the ``_repr_()`` output.
|
|
488
|
+
|
|
489
|
+
See :meth:`sage.structure.parent._repr_option` for details.
|
|
490
|
+
|
|
491
|
+
EXAMPLES::
|
|
492
|
+
|
|
493
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
494
|
+
sage: M._repr_option('element_ascii_art')
|
|
495
|
+
True
|
|
496
|
+
"""
|
|
497
|
+
if key == 'element_ascii_art':
|
|
498
|
+
return True
|
|
499
|
+
return Parent._repr_option(self, key)
|
|
500
|
+
|
|
501
|
+
def _element_constructor_(self, x):
|
|
502
|
+
"""
|
|
503
|
+
Construct an element of ``self``.
|
|
504
|
+
|
|
505
|
+
EXAMPLES::
|
|
506
|
+
|
|
507
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
508
|
+
sage: M([[3,1],[5,3]])
|
|
509
|
+
^ ^
|
|
510
|
+
| |
|
|
511
|
+
--> # <- # <--
|
|
512
|
+
| ^
|
|
513
|
+
V |
|
|
514
|
+
--> # -> # <--
|
|
515
|
+
| |
|
|
516
|
+
V V
|
|
517
|
+
"""
|
|
518
|
+
if isinstance(x, SixVertexConfiguration):
|
|
519
|
+
if x.parent() is not self:
|
|
520
|
+
return self.element_class(self, tuple(x))
|
|
521
|
+
return x
|
|
522
|
+
|
|
523
|
+
verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
|
|
524
|
+
elt = []
|
|
525
|
+
for row in x:
|
|
526
|
+
elt.append([])
|
|
527
|
+
for entry in row:
|
|
528
|
+
if entry in verts:
|
|
529
|
+
elt[-1].append(verts.index(entry))
|
|
530
|
+
elif entry in range(6):
|
|
531
|
+
elt[-1].append(entry)
|
|
532
|
+
else:
|
|
533
|
+
raise ValueError("invalid entry")
|
|
534
|
+
elt[-1] = tuple(elt[-1])
|
|
535
|
+
return self.element_class(self, tuple(elt))
|
|
536
|
+
|
|
537
|
+
Element = SixVertexConfiguration
|
|
538
|
+
|
|
539
|
+
def __iter__(self):
|
|
540
|
+
"""
|
|
541
|
+
Iterate through ``self``.
|
|
542
|
+
|
|
543
|
+
EXAMPLES::
|
|
544
|
+
|
|
545
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
546
|
+
sage: list(M)
|
|
547
|
+
[
|
|
548
|
+
^ ^ ^ ^
|
|
549
|
+
| | | |
|
|
550
|
+
--> # <- # <-- --> # -> # <--
|
|
551
|
+
| ^ ^ |
|
|
552
|
+
V | | V
|
|
553
|
+
--> # -> # <-- --> # <- # <--
|
|
554
|
+
| | | |
|
|
555
|
+
V V , V V
|
|
556
|
+
]
|
|
557
|
+
"""
|
|
558
|
+
# Boundary conditions ordered URDL
|
|
559
|
+
# The top row boundary condition of True is a downward arrow
|
|
560
|
+
# The left condition of True is a right arrow
|
|
561
|
+
# verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
|
|
562
|
+
next_top = [False, False, True, True, False, True]
|
|
563
|
+
next_left = [True, False, False, False, True, True]
|
|
564
|
+
check_top = [True, False, True, False, False, True]
|
|
565
|
+
check_left = [False, False, False, True, True, True]
|
|
566
|
+
|
|
567
|
+
bdry = [self._bdry_cond[0]]
|
|
568
|
+
lbd = list(self._bdry_cond[3]) + [None] # Dummy
|
|
569
|
+
left = [[lbd[0]]]
|
|
570
|
+
cur = [[-1]]
|
|
571
|
+
n = self._nrows
|
|
572
|
+
m = self._ncols
|
|
573
|
+
# [[3, 1], [5, 3]]
|
|
574
|
+
# [[4, 3], [3, 2]]
|
|
575
|
+
|
|
576
|
+
while cur:
|
|
577
|
+
# If we're at the last row
|
|
578
|
+
if len(cur) > n:
|
|
579
|
+
cur.pop()
|
|
580
|
+
left.pop()
|
|
581
|
+
# Check if all our bottom boundary conditions are satisfied
|
|
582
|
+
if all(x is not self._bdry_cond[2][i]
|
|
583
|
+
for i, x in enumerate(bdry[-1])):
|
|
584
|
+
yield self.element_class(self, tuple(tuple(x) for x in cur))
|
|
585
|
+
bdry.pop()
|
|
586
|
+
|
|
587
|
+
# Find the next row
|
|
588
|
+
row = cur[-1]
|
|
589
|
+
l = left[-1]
|
|
590
|
+
i = len(cur) - 1
|
|
591
|
+
while row:
|
|
592
|
+
row[-1] += 1
|
|
593
|
+
# Check to see if we have more vertices
|
|
594
|
+
if row[-1] > 5:
|
|
595
|
+
row.pop()
|
|
596
|
+
l.pop()
|
|
597
|
+
continue
|
|
598
|
+
# Check to see if we can add the vertex
|
|
599
|
+
if (check_left[row[-1]] is l[-1] or l[-1] is None) \
|
|
600
|
+
and (check_top[row[-1]] is bdry[-1][len(row)-1]
|
|
601
|
+
or bdry[-1][len(row)-1] is None):
|
|
602
|
+
if len(row) != m:
|
|
603
|
+
l.append(next_left[row[-1]])
|
|
604
|
+
row.append(-1)
|
|
605
|
+
# Check the right bdry condition since we are at the rightmost entry
|
|
606
|
+
elif next_left[row[-1]] is not self._bdry_cond[1][i]:
|
|
607
|
+
bdry.append([next_top[x] for x in row])
|
|
608
|
+
cur.append([-1])
|
|
609
|
+
left.append([lbd[i+1]])
|
|
610
|
+
break
|
|
611
|
+
|
|
612
|
+
# If we've killed this row, backup
|
|
613
|
+
if len(row) == 0:
|
|
614
|
+
cur.pop()
|
|
615
|
+
bdry.pop()
|
|
616
|
+
left.pop()
|
|
617
|
+
|
|
618
|
+
def boundary_conditions(self):
|
|
619
|
+
"""
|
|
620
|
+
Return the boundary conditions of ``self``.
|
|
621
|
+
|
|
622
|
+
EXAMPLES::
|
|
623
|
+
|
|
624
|
+
sage: M = SixVertexModel(2, boundary_conditions='ice')
|
|
625
|
+
sage: M.boundary_conditions()
|
|
626
|
+
((False, False), (True, True), (False, False), (True, True))
|
|
627
|
+
"""
|
|
628
|
+
return self._bdry_cond
|
|
629
|
+
|
|
630
|
+
def partition_function(self, beta, epsilon):
|
|
631
|
+
r"""
|
|
632
|
+
Return the partition function of ``self``.
|
|
633
|
+
|
|
634
|
+
The partition function of a 6 vertex model is defined by:
|
|
635
|
+
|
|
636
|
+
.. MATH::
|
|
637
|
+
|
|
638
|
+
Z = \sum_{\nu} e^{-\beta E(\nu)}
|
|
639
|
+
|
|
640
|
+
where we sum over all configurations and `E` is the energy function.
|
|
641
|
+
The constant `\beta` is known as the *inverse temperature* and is
|
|
642
|
+
equal to `1 / k_B T` where `k_B` is Boltzmann's constant and `T` is
|
|
643
|
+
the system's temperature.
|
|
644
|
+
|
|
645
|
+
INPUT:
|
|
646
|
+
|
|
647
|
+
- ``beta`` -- the inverse temperature constant `\beta`
|
|
648
|
+
- ``epsilon`` -- the energy constants, see
|
|
649
|
+
:meth:`~sage.combinat.six_vertex_model.SixVertexConfiguration.energy()`
|
|
650
|
+
|
|
651
|
+
EXAMPLES::
|
|
652
|
+
|
|
653
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
654
|
+
sage: M.partition_function(2, [1,2,1,2,1,2]) # needs sage.symbolic
|
|
655
|
+
e^(-24) + 2*e^(-28) + e^(-30) + 2*e^(-32) + e^(-36)
|
|
656
|
+
|
|
657
|
+
REFERENCES:
|
|
658
|
+
|
|
659
|
+
:wikipedia:`Partition_function_(statistical_mechanics)`
|
|
660
|
+
"""
|
|
661
|
+
from sage.functions.log import exp
|
|
662
|
+
return sum(exp(-beta * nu.energy(epsilon)) for nu in self)
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
class SquareIceModel(SixVertexModel):
|
|
666
|
+
r"""
|
|
667
|
+
The square ice model.
|
|
668
|
+
|
|
669
|
+
The square ice model is a 6 vertex model on an `n \times n` grid with
|
|
670
|
+
the boundary conditions that the top and bottom boundaries are pointing
|
|
671
|
+
outward and the left and right boundaries are pointing inward. These
|
|
672
|
+
boundary conditions are also called domain wall boundary conditions.
|
|
673
|
+
|
|
674
|
+
Configurations of the 6 vertex model with domain wall boundary conditions
|
|
675
|
+
are in bijection with alternating sign matrices.
|
|
676
|
+
"""
|
|
677
|
+
|
|
678
|
+
def __init__(self, n):
|
|
679
|
+
"""
|
|
680
|
+
Initialize ``self``.
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
685
|
+
sage: TestSuite(M).run()
|
|
686
|
+
"""
|
|
687
|
+
boundary_conditions = ((False,)*n, (True,)*n)*2
|
|
688
|
+
SixVertexModel.__init__(self, n, n, boundary_conditions)
|
|
689
|
+
|
|
690
|
+
def from_alternating_sign_matrix(self, asm):
|
|
691
|
+
"""
|
|
692
|
+
Return a configuration from the alternating sign matrix ``asm``.
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: M = SixVertexModel(3, boundary_conditions='ice')
|
|
697
|
+
sage: asm = AlternatingSignMatrix([[0,1,0],[1,-1,1],[0,1,0]]) # needs sage.modules
|
|
698
|
+
sage: M.from_alternating_sign_matrix(asm) # needs sage.modules
|
|
699
|
+
^ ^ ^
|
|
700
|
+
| | |
|
|
701
|
+
--> # -> # <- # <--
|
|
702
|
+
^ | ^
|
|
703
|
+
| V |
|
|
704
|
+
--> # <- # -> # <--
|
|
705
|
+
| ^ |
|
|
706
|
+
V | V
|
|
707
|
+
--> # -> # <- # <--
|
|
708
|
+
| | |
|
|
709
|
+
V V V
|
|
710
|
+
|
|
711
|
+
TESTS::
|
|
712
|
+
|
|
713
|
+
sage: M = SixVertexModel(5, boundary_conditions='ice')
|
|
714
|
+
sage: ASM = AlternatingSignMatrices(5) # needs sage.modules
|
|
715
|
+
sage: all(M.from_alternating_sign_matrix(x.to_alternating_sign_matrix()) == x # needs sage.modules
|
|
716
|
+
....: for x in M)
|
|
717
|
+
True
|
|
718
|
+
sage: all(M.from_alternating_sign_matrix(x).to_alternating_sign_matrix() == x # needs sage.modules
|
|
719
|
+
....: for x in ASM)
|
|
720
|
+
True
|
|
721
|
+
"""
|
|
722
|
+
if asm.parent().size() != self._nrows:
|
|
723
|
+
raise ValueError("mismatched size")
|
|
724
|
+
|
|
725
|
+
#verts = ['LR', 'LU', 'LD', 'UD', 'UR', 'RD']
|
|
726
|
+
ret = []
|
|
727
|
+
bdry = [False]*self._nrows # False = up
|
|
728
|
+
for row in asm.to_matrix():
|
|
729
|
+
cur = []
|
|
730
|
+
right = True # True = right
|
|
731
|
+
for j,entry in enumerate(row):
|
|
732
|
+
if entry == -1:
|
|
733
|
+
cur.append(0)
|
|
734
|
+
right = True
|
|
735
|
+
bdry[j] = False
|
|
736
|
+
elif entry == 1:
|
|
737
|
+
cur.append(3)
|
|
738
|
+
right = False
|
|
739
|
+
bdry[j] = True
|
|
740
|
+
else: # entry == 0
|
|
741
|
+
if bdry[j]:
|
|
742
|
+
if right:
|
|
743
|
+
cur.append(5)
|
|
744
|
+
else:
|
|
745
|
+
cur.append(2)
|
|
746
|
+
else:
|
|
747
|
+
if right:
|
|
748
|
+
cur.append(4)
|
|
749
|
+
else:
|
|
750
|
+
cur.append(1)
|
|
751
|
+
ret.append(tuple(cur))
|
|
752
|
+
return self.element_class(self, tuple(ret))
|
|
753
|
+
|
|
754
|
+
class Element(SixVertexConfiguration):
|
|
755
|
+
"""
|
|
756
|
+
An element in the square ice model.
|
|
757
|
+
"""
|
|
758
|
+
@combinatorial_map(name='to alternating sign matrix')
|
|
759
|
+
def to_alternating_sign_matrix(self):
|
|
760
|
+
"""
|
|
761
|
+
Return an alternating sign matrix of ``self``.
|
|
762
|
+
|
|
763
|
+
.. SEEALSO::
|
|
764
|
+
|
|
765
|
+
:meth:`~sage.combinat.six_vertex_model.SixVertexConfiguration.to_signed_matrix()`
|
|
766
|
+
|
|
767
|
+
EXAMPLES::
|
|
768
|
+
|
|
769
|
+
sage: M = SixVertexModel(4, boundary_conditions='ice')
|
|
770
|
+
sage: M[6].to_alternating_sign_matrix() # needs sage.modules
|
|
771
|
+
[1 0 0 0]
|
|
772
|
+
[0 0 0 1]
|
|
773
|
+
[0 0 1 0]
|
|
774
|
+
[0 1 0 0]
|
|
775
|
+
sage: M[7].to_alternating_sign_matrix() # needs sage.modules
|
|
776
|
+
[ 0 1 0 0]
|
|
777
|
+
[ 1 -1 1 0]
|
|
778
|
+
[ 0 1 -1 1]
|
|
779
|
+
[ 0 0 1 0]
|
|
780
|
+
"""
|
|
781
|
+
from sage.combinat.alternating_sign_matrix import AlternatingSignMatrix # AlternatingSignMatrices
|
|
782
|
+
# ASM = AlternatingSignMatrices(self.parent()._nrows)
|
|
783
|
+
# return ASM(self.to_signed_matrix())
|
|
784
|
+
return AlternatingSignMatrix(self.to_signed_matrix())
|