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,405 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Abstract SAT Solver
|
|
4
|
+
|
|
5
|
+
All SAT solvers must inherit from this class.
|
|
6
|
+
|
|
7
|
+
.. NOTE::
|
|
8
|
+
|
|
9
|
+
Our SAT solver interfaces are 1-based, i.e., literals start at
|
|
10
|
+
1. This is consistent with the popular DIMACS format for SAT
|
|
11
|
+
solving but not with Python's 0-based convention. However, this
|
|
12
|
+
also allows to construct clauses using simple integers.
|
|
13
|
+
|
|
14
|
+
AUTHORS:
|
|
15
|
+
|
|
16
|
+
- Martin Albrecht (2012): first version
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
cdef class SatSolver:
|
|
20
|
+
def __cinit__(self, *args, **kwds):
|
|
21
|
+
"""
|
|
22
|
+
Construct a new SATSolver.
|
|
23
|
+
|
|
24
|
+
EXAMPLES::
|
|
25
|
+
|
|
26
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
27
|
+
sage: solver = SatSolver()
|
|
28
|
+
"""
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
def var(self, decision=None):
|
|
32
|
+
"""
|
|
33
|
+
Return a *new* variable.
|
|
34
|
+
|
|
35
|
+
INPUT:
|
|
36
|
+
|
|
37
|
+
- ``decision`` -- is this variable a decision variable?
|
|
38
|
+
|
|
39
|
+
EXAMPLES::
|
|
40
|
+
|
|
41
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
42
|
+
sage: solver = SatSolver()
|
|
43
|
+
sage: solver.var()
|
|
44
|
+
Traceback (most recent call last):
|
|
45
|
+
...
|
|
46
|
+
NotImplementedError
|
|
47
|
+
"""
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
|
|
50
|
+
def nvars(self):
|
|
51
|
+
"""
|
|
52
|
+
Return the number of variables.
|
|
53
|
+
|
|
54
|
+
EXAMPLES::
|
|
55
|
+
|
|
56
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
57
|
+
sage: solver = SatSolver()
|
|
58
|
+
sage: solver.nvars()
|
|
59
|
+
Traceback (most recent call last):
|
|
60
|
+
...
|
|
61
|
+
NotImplementedError
|
|
62
|
+
"""
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
|
65
|
+
def add_clause(self, lits):
|
|
66
|
+
"""
|
|
67
|
+
Add a new clause to set of clauses.
|
|
68
|
+
|
|
69
|
+
INPUT:
|
|
70
|
+
|
|
71
|
+
- ``lits`` -- tuple of nonzero integers
|
|
72
|
+
|
|
73
|
+
.. NOTE::
|
|
74
|
+
|
|
75
|
+
If any element ``e`` in ``lits`` has ``abs(e)`` greater
|
|
76
|
+
than the number of variables generated so far, then new
|
|
77
|
+
variables are created automatically.
|
|
78
|
+
|
|
79
|
+
EXAMPLES::
|
|
80
|
+
|
|
81
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
82
|
+
sage: solver = SatSolver()
|
|
83
|
+
sage: solver.add_clause( (1, -2 , 3) )
|
|
84
|
+
Traceback (most recent call last):
|
|
85
|
+
...
|
|
86
|
+
NotImplementedError
|
|
87
|
+
"""
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
def read(self, filename):
|
|
91
|
+
r"""
|
|
92
|
+
Reads DIMAC files.
|
|
93
|
+
|
|
94
|
+
Reads in DIMAC formatted lines (lazily) from a file or file object and
|
|
95
|
+
adds the corresponding clauses into this solver instance. Note that the
|
|
96
|
+
DIMACS format is not well specified, see
|
|
97
|
+
http://people.sc.fsu.edu/~jburkardt/data/cnf/cnf.html,
|
|
98
|
+
https://web.archive.org/web/20090305015900/http://www.satcompetition.org/2009/format-benchmarks2009.html, and
|
|
99
|
+
http://elis.dvo.ru/~lab_11/glpk-doc/cnfsat.pdf.
|
|
100
|
+
|
|
101
|
+
The differences were summarized in the discussion on the issue
|
|
102
|
+
:issue:`16924`. This method assumes the following DIMACS format:
|
|
103
|
+
|
|
104
|
+
- Any line starting with "c" is a comment
|
|
105
|
+
- Any line starting with "p" is a header
|
|
106
|
+
- Any variable 1-n can be used
|
|
107
|
+
- Every line containing a clause must end with a "0"
|
|
108
|
+
|
|
109
|
+
The format is extended to allow lines starting with "x" defining ``xor``
|
|
110
|
+
clauses, with the notation introduced in cryptominisat, see
|
|
111
|
+
https://www.msoos.org/xor-clauses/
|
|
112
|
+
|
|
113
|
+
INPUT:
|
|
114
|
+
|
|
115
|
+
- ``filename`` -- the name of a file as a string or a file object
|
|
116
|
+
|
|
117
|
+
EXAMPLES::
|
|
118
|
+
|
|
119
|
+
sage: from io import StringIO
|
|
120
|
+
sage: file_object = StringIO("c A sample .cnf file.\np cnf 3 2\n1 -3 0\n2 3 -1 0 ")
|
|
121
|
+
sage: from sage.sat.solvers.dimacs import DIMACS
|
|
122
|
+
sage: solver = DIMACS()
|
|
123
|
+
sage: solver.read(file_object)
|
|
124
|
+
sage: solver.clauses()
|
|
125
|
+
[((1, -3), False, None), ((2, 3, -1), False, None)]
|
|
126
|
+
|
|
127
|
+
With xor clauses::
|
|
128
|
+
|
|
129
|
+
sage: from io import StringIO
|
|
130
|
+
sage: file_object = StringIO("c A sample .cnf file with xor clauses.\np cnf 3 3\n1 2 0\n3 0\nx1 2 3 0")
|
|
131
|
+
sage: from sage.sat.solvers.cryptominisat import CryptoMiniSat # optional - pycryptosat
|
|
132
|
+
sage: solver = CryptoMiniSat() # optional - pycryptosat
|
|
133
|
+
sage: solver.read(file_object) # optional - pycryptosat
|
|
134
|
+
sage: solver.clauses() # optional - pycryptosat
|
|
135
|
+
[((1, 2), False, None), ((3,), False, None), ((1, 2, 3), True, True)]
|
|
136
|
+
sage: solver() # optional - pycryptosat
|
|
137
|
+
(None, True, True, True)
|
|
138
|
+
|
|
139
|
+
TESTS::
|
|
140
|
+
|
|
141
|
+
sage: from io import StringIO
|
|
142
|
+
sage: file_object = StringIO("c A sample .cnf file with xor clauses.\np cnf 3 3\n1 2 0\n3 0\nx1 2 3 0")
|
|
143
|
+
sage: from sage.sat.solvers.sat_lp import SatLP # needs sage.numerical.mip
|
|
144
|
+
sage: solver = SatLP() # needs sage.numerical.mip
|
|
145
|
+
sage: solver.read(file_object) # needs sage.numerical.mip
|
|
146
|
+
Traceback (most recent call last):
|
|
147
|
+
...
|
|
148
|
+
NotImplementedError: the solver "an ILP-based SAT Solver" does not support xor clauses
|
|
149
|
+
"""
|
|
150
|
+
if isinstance(filename, str):
|
|
151
|
+
file_object = open(filename, "r")
|
|
152
|
+
else:
|
|
153
|
+
file_object = filename
|
|
154
|
+
for line in file_object:
|
|
155
|
+
if line.startswith("c"):
|
|
156
|
+
continue # comment
|
|
157
|
+
if line.startswith("p"):
|
|
158
|
+
continue # header
|
|
159
|
+
if line.startswith("x"):
|
|
160
|
+
line = line[1:].split(" ")
|
|
161
|
+
clause = [int(e) for e in line if e]
|
|
162
|
+
clause = clause[:-1] # strip trailing zero
|
|
163
|
+
try:
|
|
164
|
+
self.add_xor_clause(clause)
|
|
165
|
+
except AttributeError:
|
|
166
|
+
file_object.close()
|
|
167
|
+
raise NotImplementedError('the solver "{}" does not support xor clauses'.format(self))
|
|
168
|
+
else:
|
|
169
|
+
line = line.split(" ")
|
|
170
|
+
clause = [int(e) for e in line if e]
|
|
171
|
+
clause = clause[:-1] # strip trailing zero
|
|
172
|
+
self.add_clause(clause)
|
|
173
|
+
|
|
174
|
+
def __call__(self, assumptions=None):
|
|
175
|
+
"""
|
|
176
|
+
Solve this instance.
|
|
177
|
+
|
|
178
|
+
INPUT:
|
|
179
|
+
|
|
180
|
+
- ``assumptions`` -- assumed variable assignments (default: ``None``)
|
|
181
|
+
|
|
182
|
+
OUTPUT:
|
|
183
|
+
|
|
184
|
+
- If this instance is SAT: A tuple of length ``nvars()+1``
|
|
185
|
+
where the ``i``-th entry holds an assignment for the
|
|
186
|
+
``i``-th variables (the ``0``-th entry is always ``None``).
|
|
187
|
+
|
|
188
|
+
- If this instance is UNSAT: ``False``
|
|
189
|
+
|
|
190
|
+
- If the solver was interrupted before deciding satisfiability
|
|
191
|
+
``None``.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
196
|
+
sage: solver = SatSolver()
|
|
197
|
+
sage: solver()
|
|
198
|
+
Traceback (most recent call last):
|
|
199
|
+
...
|
|
200
|
+
NotImplementedError
|
|
201
|
+
"""
|
|
202
|
+
raise NotImplementedError
|
|
203
|
+
|
|
204
|
+
def conflict_clause(self):
|
|
205
|
+
"""
|
|
206
|
+
Return conflict clause if this instance is UNSAT and the last
|
|
207
|
+
call used assumptions.
|
|
208
|
+
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
212
|
+
sage: solver = SatSolver()
|
|
213
|
+
sage: solver.conflict_clause()
|
|
214
|
+
Traceback (most recent call last):
|
|
215
|
+
...
|
|
216
|
+
NotImplementedError
|
|
217
|
+
"""
|
|
218
|
+
raise NotImplementedError
|
|
219
|
+
|
|
220
|
+
def learnt_clauses(self, unitary_only=False):
|
|
221
|
+
"""
|
|
222
|
+
Return learnt clauses.
|
|
223
|
+
|
|
224
|
+
INPUT:
|
|
225
|
+
|
|
226
|
+
- ``unitary_only`` -- return only unitary learnt clauses (default: ``False``)
|
|
227
|
+
|
|
228
|
+
EXAMPLES::
|
|
229
|
+
|
|
230
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
231
|
+
sage: solver = SatSolver()
|
|
232
|
+
sage: solver.learnt_clauses()
|
|
233
|
+
Traceback (most recent call last):
|
|
234
|
+
...
|
|
235
|
+
NotImplementedError
|
|
236
|
+
|
|
237
|
+
sage: solver.learnt_clauses(unitary_only=True)
|
|
238
|
+
Traceback (most recent call last):
|
|
239
|
+
...
|
|
240
|
+
NotImplementedError
|
|
241
|
+
"""
|
|
242
|
+
raise NotImplementedError
|
|
243
|
+
|
|
244
|
+
def __repr__(self):
|
|
245
|
+
"""
|
|
246
|
+
TESTS::
|
|
247
|
+
|
|
248
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
249
|
+
sage: solver = SatSolver()
|
|
250
|
+
sage: solver
|
|
251
|
+
a generic SAT solver (don't use me, inherit from me)
|
|
252
|
+
"""
|
|
253
|
+
return "a generic SAT solver (don't use me, inherit from me)"
|
|
254
|
+
|
|
255
|
+
def clauses(self, filename=None):
|
|
256
|
+
"""
|
|
257
|
+
Return original clauses.
|
|
258
|
+
|
|
259
|
+
INPUT:
|
|
260
|
+
|
|
261
|
+
- ``filename'' -- if not ``None`` clauses are written to ``filename`` in
|
|
262
|
+
DIMACS format (default: ``None``)
|
|
263
|
+
|
|
264
|
+
OUTPUT:
|
|
265
|
+
|
|
266
|
+
If ``filename`` is ``None`` then a list of ``lits, is_xor, rhs``
|
|
267
|
+
tuples is returned, where ``lits`` is a tuple of literals,
|
|
268
|
+
``is_xor`` is always ``False`` and ``rhs`` is always ``None``.
|
|
269
|
+
|
|
270
|
+
If ``filename`` points to a writable file, then the list of original
|
|
271
|
+
clauses is written to that file in DIMACS format.
|
|
272
|
+
|
|
273
|
+
EXAMPLES::
|
|
274
|
+
|
|
275
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
276
|
+
sage: solver = SatSolver()
|
|
277
|
+
sage: solver.clauses()
|
|
278
|
+
Traceback (most recent call last):
|
|
279
|
+
...
|
|
280
|
+
NotImplementedError
|
|
281
|
+
"""
|
|
282
|
+
raise NotImplementedError
|
|
283
|
+
|
|
284
|
+
def __getattr__(self, name):
|
|
285
|
+
"""
|
|
286
|
+
EXAMPLES::
|
|
287
|
+
|
|
288
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
289
|
+
sage: solver = SatSolver()
|
|
290
|
+
sage: solver.gens() # __getattr__ points this to clauses
|
|
291
|
+
Traceback (most recent call last):
|
|
292
|
+
...
|
|
293
|
+
NotImplementedError
|
|
294
|
+
"""
|
|
295
|
+
if name == "gens":
|
|
296
|
+
return self.clauses
|
|
297
|
+
raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
|
|
298
|
+
|
|
299
|
+
def __dir__(self):
|
|
300
|
+
"""
|
|
301
|
+
Custom dir for tab-completion.
|
|
302
|
+
|
|
303
|
+
EXAMPLES::
|
|
304
|
+
|
|
305
|
+
sage: from sage.sat.solvers.satsolver import SatSolver
|
|
306
|
+
sage: solver = SatSolver()
|
|
307
|
+
sage: 'gens' in solver.__dir__()
|
|
308
|
+
True
|
|
309
|
+
"""
|
|
310
|
+
return ['add_clause', 'clauses', 'conflict_clause', 'gens',
|
|
311
|
+
'learnt_clauses', 'nvars', 'read', 'var']
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def SAT(solver=None, *args, **kwds):
|
|
315
|
+
r"""
|
|
316
|
+
Return a :class:`SatSolver` instance.
|
|
317
|
+
|
|
318
|
+
Through this class, one can define and solve
|
|
319
|
+
:wikipedia:`SAT problems <Boolean_satisfiability_problem>`.
|
|
320
|
+
|
|
321
|
+
INPUT:
|
|
322
|
+
|
|
323
|
+
- ``solver`` -- string; select a solver. Admissible values are:
|
|
324
|
+
|
|
325
|
+
- ``'cryptominisat'`` -- note that the pycryptosat package must be
|
|
326
|
+
installed
|
|
327
|
+
|
|
328
|
+
- ``'picosat'`` -- note that the pycosat package must be installed
|
|
329
|
+
|
|
330
|
+
- ``'glucose'`` -- note that the glucose package must be installed
|
|
331
|
+
|
|
332
|
+
- ``'glucose-syrup'`` -- note that the glucose package must be installed
|
|
333
|
+
|
|
334
|
+
- ``'LP'`` -- use :class:`~sage.sat.solvers.sat_lp.SatLP` to solve the
|
|
335
|
+
SAT instance
|
|
336
|
+
|
|
337
|
+
- ``None`` -- default; use CryptoMiniSat if available, else PicoSAT if
|
|
338
|
+
available, and a LP solver otherwise
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: SAT(solver='LP') # needs sage.numerical.mip
|
|
343
|
+
an ILP-based SAT Solver
|
|
344
|
+
|
|
345
|
+
TESTS::
|
|
346
|
+
|
|
347
|
+
sage: SAT(solver='Wouhouuuuuu')
|
|
348
|
+
Traceback (most recent call last):
|
|
349
|
+
...
|
|
350
|
+
ValueError: Solver 'Wouhouuuuuu' is not available
|
|
351
|
+
|
|
352
|
+
Forcing CryptoMiniSat::
|
|
353
|
+
|
|
354
|
+
sage: SAT(solver='cryptominisat') # optional - pycryptosat
|
|
355
|
+
CryptoMiniSat solver: 0 variables, 0 clauses.
|
|
356
|
+
|
|
357
|
+
Forcing PicoSat::
|
|
358
|
+
|
|
359
|
+
sage: SAT(solver='picosat') # optional - pycosat
|
|
360
|
+
PicoSAT solver: 0 variables, 0 clauses.
|
|
361
|
+
|
|
362
|
+
Forcing Glucose::
|
|
363
|
+
|
|
364
|
+
sage: SAT(solver='glucose')
|
|
365
|
+
DIMACS Solver: 'glucose -verb=0 -model {input}'
|
|
366
|
+
|
|
367
|
+
Forcing Glucose Syrup::
|
|
368
|
+
|
|
369
|
+
sage: SAT(solver='glucose-syrup')
|
|
370
|
+
DIMACS Solver: 'glucose-syrup -model -verb=0 {input}'
|
|
371
|
+
|
|
372
|
+
Forcing Kissat::
|
|
373
|
+
|
|
374
|
+
sage: SAT(solver='kissat')
|
|
375
|
+
DIMACS Solver: 'kissat -q {input}'
|
|
376
|
+
"""
|
|
377
|
+
if solver is None:
|
|
378
|
+
from importlib.util import find_spec
|
|
379
|
+
if find_spec('pycryptosat') is not None:
|
|
380
|
+
solver = "cryptominisat"
|
|
381
|
+
elif find_spec('pycosat') is not None:
|
|
382
|
+
solver = "picosat"
|
|
383
|
+
else:
|
|
384
|
+
solver = "LP"
|
|
385
|
+
|
|
386
|
+
if solver == 'cryptominisat':
|
|
387
|
+
from sage.sat.solvers.cryptominisat import CryptoMiniSat
|
|
388
|
+
return CryptoMiniSat(*args, **kwds)
|
|
389
|
+
elif solver == 'picosat':
|
|
390
|
+
from sage.sat.solvers.picosat import PicoSAT
|
|
391
|
+
return PicoSAT(*args, **kwds)
|
|
392
|
+
elif solver == "LP":
|
|
393
|
+
from sage.sat.solvers.sat_lp import SatLP
|
|
394
|
+
return SatLP()
|
|
395
|
+
elif solver == 'glucose':
|
|
396
|
+
from sage.sat.solvers.dimacs import Glucose
|
|
397
|
+
return Glucose(*args, **kwds)
|
|
398
|
+
elif solver == 'glucose-syrup':
|
|
399
|
+
from sage.sat.solvers.dimacs import GlucoseSyrup
|
|
400
|
+
return GlucoseSyrup(*args, **kwds)
|
|
401
|
+
elif solver == 'kissat':
|
|
402
|
+
from sage.sat.solvers.dimacs import Kissat
|
|
403
|
+
return Kissat(*args, **kwds)
|
|
404
|
+
else:
|
|
405
|
+
raise ValueError("Solver '{}' is not available".format(solver))
|