passagemath-modules 10.6.31rc3__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.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,890 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: optional - scipy
|
|
3
|
+
r"""
|
|
4
|
+
Helper functions for plotting the geometric representation of matroids
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
AUTHORS:
|
|
8
|
+
|
|
9
|
+
- Jayant Apte (2014-06-06): initial version
|
|
10
|
+
|
|
11
|
+
.. NOTE::
|
|
12
|
+
|
|
13
|
+
This file provides functions that are called by ``show()`` and ``plot()``
|
|
14
|
+
methods of abstract matroids class. The basic idea is to first decide
|
|
15
|
+
the placement of points in $\mathbb{R}^2$ and then draw lines in geometric
|
|
16
|
+
representation through these points. Point placement procedures such as
|
|
17
|
+
``addtripts``, ``addnontripts`` together produce ``(x,y)`` tuples
|
|
18
|
+
corresponding to ground set of the matroid in a dictionary.
|
|
19
|
+
These methods provide simple but rigid point placement algorithm.
|
|
20
|
+
Alternatively, one can build the point placement dictionary manually or
|
|
21
|
+
via an optimization that gives aesthetically pleasing point placement (in
|
|
22
|
+
some sense. This is not yet implemented). One can then use
|
|
23
|
+
``createline`` function to produce sequence of ``100`` points on a smooth
|
|
24
|
+
curve containing the points in the specified line which in turn uses
|
|
25
|
+
:func:`scipy:scipy.interpolate.splprep` and
|
|
26
|
+
:func:`scipy:scipy.interpolate.splev`. Then one
|
|
27
|
+
can use sage's graphics primitives ``line``, ``point``, ``text`` and
|
|
28
|
+
``points`` to produce graphics object containing points (ground set
|
|
29
|
+
elements) and lines (for a rank 3 matroid, these are flats of rank 2 of
|
|
30
|
+
size greater than equal to 3) of the geometric representation of the
|
|
31
|
+
matroid. Loops and parallel elements are added as per conventions in
|
|
32
|
+
[Oxl2011]_ using function ``addlp``. The priority order for point placement
|
|
33
|
+
methods used inside plot() and show() is as follows:
|
|
34
|
+
|
|
35
|
+
1. User Specified points dictionary and lineorders
|
|
36
|
+
2. cached point placement dictionary and line orders (a list of ordered
|
|
37
|
+
lists) in M._cached_info (a dictionary)
|
|
38
|
+
3. Internal point placement and orders deciding heuristics
|
|
39
|
+
If a custom point placement and/or line orders is desired, then user
|
|
40
|
+
can simply specify the custom points dictionary as::
|
|
41
|
+
|
|
42
|
+
M.cached info = {'plot_positions':<dictionary_of _points>,
|
|
43
|
+
'plot_lineorders':<list of lists>}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
REFERENCES
|
|
47
|
+
==========
|
|
48
|
+
|
|
49
|
+
- [Oxl2011]_ James Oxley, "Matroid Theory, Second Edition". Oxford University
|
|
50
|
+
Press, 2011.
|
|
51
|
+
|
|
52
|
+
EXAMPLES::
|
|
53
|
+
|
|
54
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
55
|
+
sage: M1 = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0,1,0,1],
|
|
56
|
+
....: [0, 1, 0, 1, 0, 1, 1,0,0,1,0],
|
|
57
|
+
....: [0, 0, 1, 1, 1, 0, 1,0,0,0,0]])
|
|
58
|
+
sage: pos_dict = {0: (0, 0), 1: (2, 0), 2: (1, 2), 3: (1.5, 1.0),
|
|
59
|
+
....: 4: (0.5, 1.0), 5: (1.0, 0.0), 6: (1.0, 0.666666666666667),
|
|
60
|
+
....: 7: (3,3), 8: (4,0), 9: (-1,1), 10: (-2,-2)}
|
|
61
|
+
sage: M1._cached_info = {'plot_positions': pos_dict, 'plot_lineorders': None}
|
|
62
|
+
sage: matroids_plot_helpers.geomrep(M1, sp=True) # needs sage.plot sage.rings.finite_rings
|
|
63
|
+
Graphics object consisting of 22 graphics primitives
|
|
64
|
+
"""
|
|
65
|
+
# *****************************************************************************
|
|
66
|
+
# Copyright (C) 2013 Jayant Apte <jayant91089@gmail.com>
|
|
67
|
+
#
|
|
68
|
+
# This program is free software: you can redistribute it and/or modify
|
|
69
|
+
# it under the terms of the GNU General Public License as published by
|
|
70
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
71
|
+
# (at your option) any later version.
|
|
72
|
+
# https://www.gnu.org/licenses/
|
|
73
|
+
# *****************************************************************************
|
|
74
|
+
|
|
75
|
+
from sage.matroids.advanced import newlabel
|
|
76
|
+
from sage.misc.lazy_import import lazy_import
|
|
77
|
+
from sage.sets.set import Set
|
|
78
|
+
|
|
79
|
+
lazy_import("sage.plot.all", ["Graphics", "line", "text",
|
|
80
|
+
"polygon2d", "point", "points"])
|
|
81
|
+
lazy_import("sage.plot.colors", "Color")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def it(M, B1, nB1, lps) -> tuple[dict, list, list, list]:
|
|
85
|
+
r"""
|
|
86
|
+
Return points on and off the triangle and lines to be drawn for a rank 3
|
|
87
|
+
matroid.
|
|
88
|
+
|
|
89
|
+
INPUT:
|
|
90
|
+
|
|
91
|
+
- ``M`` -- matroid
|
|
92
|
+
- ``B1`` -- list of groundset elements of ``M`` that corresponds to a
|
|
93
|
+
basis of matroid ``M``
|
|
94
|
+
- ``nB1`` -- list of elements in the ground set of M that corresponds to
|
|
95
|
+
``M.simplify.groundset() \ B1``
|
|
96
|
+
- ``lps`` -- list of elements in the ground set of matroid M that are loops
|
|
97
|
+
|
|
98
|
+
OUTPUT: a tuple containing 4 elements in this order:
|
|
99
|
+
|
|
100
|
+
1. A dictionary containing 2-tuple (x,y) coordinates with
|
|
101
|
+
``M.simplify.groundset()`` elements that can be placed on the sides of
|
|
102
|
+
the triangle as keys.
|
|
103
|
+
2. A list of 3 lists of elements of ``M.simplify.groundset()`` that can
|
|
104
|
+
be placed on the 3 sides of the triangle.
|
|
105
|
+
3. A list of elements of ``M.simplify.groundset()`` that cane be placed
|
|
106
|
+
inside the triangle in the geometric representation.
|
|
107
|
+
4. A list of lists of elements of ``M.simplify.groundset()`` that
|
|
108
|
+
correspond to lines in the geometric representation other than the sides
|
|
109
|
+
of the triangle.
|
|
110
|
+
|
|
111
|
+
EXAMPLES::
|
|
112
|
+
|
|
113
|
+
sage: from sage.matroids import matroids_plot_helpers as mph
|
|
114
|
+
sage: M = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0],
|
|
115
|
+
....: [0, 1, 0, 1, 0, 1, 1,0],[0, 0, 1, 1, 1, 0, 1,0]])
|
|
116
|
+
sage: N = M.simplify()
|
|
117
|
+
sage: B1 = list(N.basis())
|
|
118
|
+
sage: nB1 = list(set(M.simplify().groundset())-set(B1))
|
|
119
|
+
sage: pts,trilines,nontripts,curvedlines = mph.it(M,
|
|
120
|
+
....: B1,nB1,M.loops())
|
|
121
|
+
sage: pts
|
|
122
|
+
{1: (1.0, 0.0), 2: (1.5, 1.0), 3: (0.5, 1.0),
|
|
123
|
+
4: (0, 0), 5: (1, 2), 6: (2, 0)}
|
|
124
|
+
sage: trilines
|
|
125
|
+
[[3, 4, 5], [2, 5, 6], [1, 4, 6]]
|
|
126
|
+
sage: nontripts
|
|
127
|
+
[0]
|
|
128
|
+
sage: curvedlines
|
|
129
|
+
[[0, 1, 5], [0, 2, 4], [0, 3, 6], [1, 2, 3], [1, 4, 6], [2, 5, 6],
|
|
130
|
+
[3, 4, 5]]
|
|
131
|
+
|
|
132
|
+
.. NOTE::
|
|
133
|
+
|
|
134
|
+
This method does NOT do any checks.
|
|
135
|
+
"""
|
|
136
|
+
tripts = [(0, 0), (1, 2), (2, 0)]
|
|
137
|
+
pts = {}
|
|
138
|
+
j = 0
|
|
139
|
+
for i in B1:
|
|
140
|
+
pts[i] = tripts[j]
|
|
141
|
+
j = j + 1
|
|
142
|
+
pairs = [[0, 1], [1, 2], [0, 2]]
|
|
143
|
+
L1 = []
|
|
144
|
+
L2 = []
|
|
145
|
+
L3 = []
|
|
146
|
+
for i in nB1:
|
|
147
|
+
if M.is_dependent([i, B1[pairs[0][0]], B1[pairs[0][1]]]):
|
|
148
|
+
# Add to L1
|
|
149
|
+
L1.append(i)
|
|
150
|
+
elif M.is_dependent([i, B1[pairs[1][0]], B1[pairs[1][1]]]):
|
|
151
|
+
# Add to L2
|
|
152
|
+
L2.append(i)
|
|
153
|
+
elif M.is_dependent([i, B1[pairs[2][0]], B1[pairs[2][1]]]):
|
|
154
|
+
# Add to L3
|
|
155
|
+
L3.append(i)
|
|
156
|
+
L = [L1, L2, L3] # megalist
|
|
157
|
+
lines = [] # the list of lines
|
|
158
|
+
for i in range(1, len(L)+1):
|
|
159
|
+
lines.append([B1[pairs[i-1][0]]])
|
|
160
|
+
lines[i-1].extend(L[i-1])
|
|
161
|
+
lines[i-1].extend([B1[pairs[i-1][1]]])
|
|
162
|
+
# place triangle and L1,L2,L3
|
|
163
|
+
for i in L: # loop over megalist
|
|
164
|
+
interval = 1/float(len(i)+1)
|
|
165
|
+
pt1 = list(tripts[pairs[L.index(i)][0]])
|
|
166
|
+
pt2 = list(tripts[pairs[L.index(i)][1]])
|
|
167
|
+
for j in range(1, len(i)+1):
|
|
168
|
+
# loop over L1,L2,L3
|
|
169
|
+
cc = interval*j
|
|
170
|
+
pts[i[j-1]] = (cc*pt1[0]+(1-cc)*pt2[0], cc*pt1[1]+(1-cc)*pt2[1])
|
|
171
|
+
trilines = [set(x) for x in lines if len(x) >= 3]
|
|
172
|
+
set_lps = set(lps)
|
|
173
|
+
curvedlines = [list(sx.difference(set_lps))
|
|
174
|
+
for x in M.flats(2) if (sx := set(x)) not in trilines
|
|
175
|
+
and len(list(x)) >= 3]
|
|
176
|
+
nontripts = [i for i in nB1 if i not in pts]
|
|
177
|
+
trilines = [list(s) for s in trilines]
|
|
178
|
+
return pts, trilines, nontripts, curvedlines
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def trigrid(tripts) -> list[list]:
|
|
182
|
+
"""
|
|
183
|
+
Return a grid of 4 points inside given 3 points as a list.
|
|
184
|
+
|
|
185
|
+
INPUT:
|
|
186
|
+
|
|
187
|
+
- ``tripts`` -- list of 3 lists of the form [x,y] where x and y are the
|
|
188
|
+
Cartesian coordinates of a point
|
|
189
|
+
|
|
190
|
+
OUTPUT: list of lists containing 4 points in following order:
|
|
191
|
+
|
|
192
|
+
- 1. Barycenter of 3 input points.
|
|
193
|
+
- 2,3,4. Barycenters of 1. with 3 different 2-subsets of input points
|
|
194
|
+
respectively.
|
|
195
|
+
|
|
196
|
+
EXAMPLES::
|
|
197
|
+
|
|
198
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
199
|
+
sage: points = matroids_plot_helpers.trigrid([[2,1],[4,5],[5,2]])
|
|
200
|
+
sage: points
|
|
201
|
+
[[3.6666666666666665, 2.6666666666666665],
|
|
202
|
+
[3.222222222222222, 2.888888888888889],
|
|
203
|
+
[4.222222222222222, 3.222222222222222],
|
|
204
|
+
[3.5555555555555554, 1.8888888888888886]]
|
|
205
|
+
|
|
206
|
+
.. NOTE::
|
|
207
|
+
|
|
208
|
+
This method does NOT do any checks.
|
|
209
|
+
"""
|
|
210
|
+
pairs = [[0, 1], [1, 2], [0, 2]]
|
|
211
|
+
cpt = [float(tripts[0][0] + tripts[1][0] + tripts[2][0]) / 3,
|
|
212
|
+
float(tripts[0][1] + tripts[1][1] + tripts[2][1]) / 3]
|
|
213
|
+
grid = [cpt]
|
|
214
|
+
for p, q in pairs:
|
|
215
|
+
pt = [float(tripts[p][0] + tripts[q][0] + cpt[0]) / 3,
|
|
216
|
+
float(tripts[p][1] + tripts[q][1] + cpt[1]) / 3]
|
|
217
|
+
grid.append(pt)
|
|
218
|
+
return grid
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def addnontripts(tripts_labels, nontripts_labels, ptsdict) -> dict:
|
|
222
|
+
"""
|
|
223
|
+
Return modified ``ptsdict`` with additional keys and values corresponding
|
|
224
|
+
to ``nontripts``.
|
|
225
|
+
|
|
226
|
+
INPUT:
|
|
227
|
+
|
|
228
|
+
- ``tripts`` -- list of 3 ground set elements that are to be placed on
|
|
229
|
+
vertices of the triangle
|
|
230
|
+
- ``ptsdict`` -- dictionary (at least) containing ground set elements in
|
|
231
|
+
``tripts`` as keys and their (x,y) position as values
|
|
232
|
+
- ``nontripts`` -- list of ground set elements whose corresponding points
|
|
233
|
+
are to be placed inside the triangle
|
|
234
|
+
|
|
235
|
+
OUTPUT:
|
|
236
|
+
|
|
237
|
+
A dictionary containing ground set elements in ``tripts`` as keys and
|
|
238
|
+
their (x,y) position as values along with all keys and respective values
|
|
239
|
+
in ``ptsdict``.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
244
|
+
sage: from sage.matroids.advanced import setprint
|
|
245
|
+
sage: ptsdict={'a':(0,0),'b':(1,2),'c':(2,0)}
|
|
246
|
+
sage: ptsdict_1=matroids_plot_helpers.addnontripts(['a','b','c'],
|
|
247
|
+
....: ['d','e','f'],ptsdict)
|
|
248
|
+
sage: setprint(ptsdict_1)
|
|
249
|
+
{'a': [0, 0], 'b': [1, 2], 'c': [0, 2], 'd': [0.6666666666666666, 1.0],
|
|
250
|
+
'e': [0.6666666666666666, 0.8888888888888888],
|
|
251
|
+
'f': [0.8888888888888888, 1.3333333333333333]}
|
|
252
|
+
sage: ptsdict_2=matroids_plot_helpers.addnontripts(['a','b','c'],
|
|
253
|
+
....: ['d','e','f','g','h'],ptsdict)
|
|
254
|
+
sage: setprint(ptsdict_2)
|
|
255
|
+
{'a': [0, 0], 'b': [1, 2], 'c': [0, 2], 'd': [0.6666666666666666, 1.0],
|
|
256
|
+
'e': [0.6666666666666666, 0.8888888888888888],
|
|
257
|
+
'f': [0.8888888888888888, 1.3333333333333333],
|
|
258
|
+
'g': [0.2222222222222222, 1.0],
|
|
259
|
+
'h': [0.5185185185185185, 0.5555555555555555]}
|
|
260
|
+
|
|
261
|
+
.. NOTE::
|
|
262
|
+
|
|
263
|
+
This method does NOT do any checks.
|
|
264
|
+
"""
|
|
265
|
+
tripts = [list(ptsdict[p]) for p in tripts_labels]
|
|
266
|
+
pairs = [[0, 1], [1, 2], [0, 2]]
|
|
267
|
+
q = [tripts]
|
|
268
|
+
num = len(nontripts_labels)
|
|
269
|
+
gridpts = [[float((tripts[0][0] + tripts[1][0] + tripts[2][0]) / 3),
|
|
270
|
+
float(tripts[0][1] + tripts[1][1] + tripts[2][1]) / 3]]
|
|
271
|
+
n = 0
|
|
272
|
+
while n < num + 1:
|
|
273
|
+
g = trigrid(q[0])
|
|
274
|
+
q.extend([[g[0], q[0][pairs[0][0]], q[0][pairs[0][1]]],
|
|
275
|
+
[g[0], q[0][pairs[1][0]], q[0][pairs[1][1]]],
|
|
276
|
+
[g[0], q[0][pairs[2][0]], q[0][pairs[2][1]]]])
|
|
277
|
+
q.remove(q[0])
|
|
278
|
+
gridpts.extend(g[1:])
|
|
279
|
+
if n == 0:
|
|
280
|
+
n = n + 4
|
|
281
|
+
else:
|
|
282
|
+
n = n + 3
|
|
283
|
+
for j, p in enumerate(nontripts_labels):
|
|
284
|
+
ptsdict[p] = tuple(gridpts[j])
|
|
285
|
+
return ptsdict
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def createline(ptsdict, ll, lineorders2=None) -> tuple[list, list, list, list]:
|
|
289
|
+
"""
|
|
290
|
+
Return ordered lists of coordinates of points to be traversed to draw a
|
|
291
|
+
2D line.
|
|
292
|
+
|
|
293
|
+
INPUT:
|
|
294
|
+
|
|
295
|
+
- ``ptsdict`` -- dictionary containing keys and their (x,y) position as
|
|
296
|
+
values
|
|
297
|
+
- ``ll`` -- list of keys in ``ptsdict`` through which a line is to be
|
|
298
|
+
drawn
|
|
299
|
+
- ``lineorders2`` -- (optional) list of ordered lists of keys in
|
|
300
|
+
``ptsdict`` such that if ll is setwise same as any of these then points
|
|
301
|
+
corresponding to values of the keys will be traversed in that order thus
|
|
302
|
+
overriding internal order deciding heuristic
|
|
303
|
+
|
|
304
|
+
OUTPUT: a tuple containing 4 elements in this order:
|
|
305
|
+
|
|
306
|
+
1. Ordered list of x-coordinates of values of keys in ``ll`` specified in
|
|
307
|
+
ptsdict.
|
|
308
|
+
2. Ordered list of y-coordinates of values of keys in ``ll`` specified
|
|
309
|
+
in ptsdict.
|
|
310
|
+
3. Ordered list of interpolated x-coordinates of points through which a
|
|
311
|
+
line can be drawn.
|
|
312
|
+
4. Ordered list of interpolated y-coordinates of points through which a
|
|
313
|
+
line can be drawn.
|
|
314
|
+
|
|
315
|
+
EXAMPLES::
|
|
316
|
+
|
|
317
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
318
|
+
sage: ptsdict = {'a':(1,3),'b':(2,1),'c':(4,5),'d':(5,2)}
|
|
319
|
+
sage: x,y,x_i,y_i = matroids_plot_helpers.createline(ptsdict,
|
|
320
|
+
....: ['a','b','c','d'])
|
|
321
|
+
sage: [len(x), len(y), len(x_i), len(y_i)]
|
|
322
|
+
[4, 4, 100, 100]
|
|
323
|
+
sage: G = line(zip(x_i, y_i), color='black', thickness=3, zorder=1) # needs sage.plot
|
|
324
|
+
sage: G += points(zip(x, y), color='black', size=300, zorder=2) # needs sage.plot
|
|
325
|
+
sage: G.show() # needs sage.plot
|
|
326
|
+
sage: x,y,x_i,y_i = matroids_plot_helpers.createline(ptsdict,
|
|
327
|
+
....: ['a','b','c','d'],lineorders2=[['b','a','c','d'],
|
|
328
|
+
....: ['p','q','r','s']])
|
|
329
|
+
sage: [len(x), len(y), len(x_i), len(y_i)]
|
|
330
|
+
[4, 4, 100, 100]
|
|
331
|
+
sage: G = line(zip(x_i, y_i), color='black', thickness=3, zorder=1) # needs sage.plot
|
|
332
|
+
sage: G += points(zip(x, y), color='black', size=300, zorder=2) # needs sage.plot
|
|
333
|
+
sage: G.show() # needs sage.plot
|
|
334
|
+
|
|
335
|
+
.. NOTE::
|
|
336
|
+
|
|
337
|
+
This method does NOT do any checks.
|
|
338
|
+
"""
|
|
339
|
+
import scipy
|
|
340
|
+
import scipy.interpolate
|
|
341
|
+
import numpy as np
|
|
342
|
+
|
|
343
|
+
x, lo = line_hasorder(ll, lineorders2)
|
|
344
|
+
flip = False
|
|
345
|
+
if not x:
|
|
346
|
+
# convert dictionary to list of lists
|
|
347
|
+
linepts = [list(ptsdict[i]) for i in ll]
|
|
348
|
+
xpts = [xx[0] for xx in linepts]
|
|
349
|
+
ypts = [yy[1] for yy in linepts]
|
|
350
|
+
xdim = (float(max(xpts))-float(min(xpts)))
|
|
351
|
+
ydim = (float(max(ypts))-float(min(ypts)))
|
|
352
|
+
if xdim > ydim:
|
|
353
|
+
sortedind = sorted(range(len(xpts)), key=lambda k: float(xpts[k]))
|
|
354
|
+
else:
|
|
355
|
+
sortedind = sorted(range(len(ypts)), key=lambda k: float(ypts[k]))
|
|
356
|
+
flip = True
|
|
357
|
+
sortedlinepts = [linepts[i] for i in sortedind]
|
|
358
|
+
sortedx = [k[0] for k in sortedlinepts]
|
|
359
|
+
sortedy = [k[1] for k in sortedlinepts]
|
|
360
|
+
else:
|
|
361
|
+
linepts = [list(ptsdict[i]) for i in lo]
|
|
362
|
+
sortedx = [k[0] for k in linepts]
|
|
363
|
+
sortedy = [k[1] for k in linepts]
|
|
364
|
+
|
|
365
|
+
if flip:
|
|
366
|
+
tck, u = scipy.interpolate.splprep([sortedy, sortedx], s=0.0, k=2)
|
|
367
|
+
y_i, x_i = scipy.interpolate.splev(np.linspace(0, 1, 100), tck)
|
|
368
|
+
else:
|
|
369
|
+
tck, u = scipy.interpolate.splprep([sortedx, sortedy], s=0.0, k=2)
|
|
370
|
+
x_i, y_i = scipy.interpolate.splev(np.linspace(0, 1, 100), tck)
|
|
371
|
+
return sortedx, sortedy, x_i, y_i
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def slp(M1, pos_dict=None, B=None) -> tuple:
|
|
375
|
+
"""
|
|
376
|
+
Return simple matroid, loops and parallel elements of given matroid.
|
|
377
|
+
|
|
378
|
+
INPUT:
|
|
379
|
+
|
|
380
|
+
- ``M1`` -- matroid
|
|
381
|
+
- ``pos_dict`` -- (optional) dictionary containing non loopy elements of
|
|
382
|
+
``M`` as keys and their (x,y) positions as keys. While simplifying the
|
|
383
|
+
matroid, all except one element in a parallel class that is also
|
|
384
|
+
specified in ``pos_dict`` will be retained.
|
|
385
|
+
- ``B`` -- (optional) a basis of M1 that has been chosen for placement on
|
|
386
|
+
vertices of triangle
|
|
387
|
+
|
|
388
|
+
OUTPUT: a tuple containing 3 elements in this order:
|
|
389
|
+
|
|
390
|
+
1. Simple matroid corresponding to ``M1``.
|
|
391
|
+
2. Loops of matroid ``M1``.
|
|
392
|
+
3. Elements that are in `M1.groundset()` but not in ground set of 1 or
|
|
393
|
+
in 2
|
|
394
|
+
|
|
395
|
+
EXAMPLES::
|
|
396
|
+
|
|
397
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
398
|
+
sage: from sage.matroids.advanced import setprint
|
|
399
|
+
sage: M1 = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0,1,0,1],
|
|
400
|
+
....: [0, 1, 0, 1, 0, 1, 1,0,0,1,0],
|
|
401
|
+
....: [0, 0, 1, 1, 1, 0, 1,0,0,0,0]])
|
|
402
|
+
sage: M, L, P = matroids_plot_helpers.slp(M1) # needs sage.rings.finite_rings
|
|
403
|
+
sage: M.is_simple() # needs sage.rings.finite_rings
|
|
404
|
+
True
|
|
405
|
+
sage: setprint([L,P]) # needs sage.rings.finite_rings
|
|
406
|
+
[{10, 8, 9}, {7}]
|
|
407
|
+
sage: M1 = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0,1,0,1],
|
|
408
|
+
....: [0, 1, 0, 1, 0, 1, 1,0,0,1,0],
|
|
409
|
+
....: [0, 0, 1, 1, 1, 0, 1,0,0,0,0]])
|
|
410
|
+
sage: posdict = {8: (0, 0), 1: (2, 0), 2: (1, 2), 3: (1.5, 1.0),
|
|
411
|
+
....: 4: (0.5, 1.0), 5: (1.0, 0.0), 6: (1.0, 0.6666666666666666)}
|
|
412
|
+
sage: M, L, P = matroids_plot_helpers.slp(M1, pos_dict=posdict) # needs sage.rings.finite_rings
|
|
413
|
+
sage: M.is_simple() # needs sage.rings.finite_rings
|
|
414
|
+
True
|
|
415
|
+
sage: setprint([L,P]) # needs sage.rings.finite_rings
|
|
416
|
+
[{0, 10, 9}, {7}]
|
|
417
|
+
|
|
418
|
+
.. NOTE::
|
|
419
|
+
|
|
420
|
+
This method does NOT do any checks.
|
|
421
|
+
"""
|
|
422
|
+
L = set(M1.loops())
|
|
423
|
+
nP = L | set(M1.simplify().groundset())
|
|
424
|
+
P = set(M1.groundset()) - nP
|
|
425
|
+
if P:
|
|
426
|
+
if pos_dict is not None:
|
|
427
|
+
pcls = list({frozenset(set(M1.closure([p])) - L)
|
|
428
|
+
for p in list(P)})
|
|
429
|
+
newP = []
|
|
430
|
+
for pcl in pcls:
|
|
431
|
+
pcl_in_dict = [p for p in list(pcl) if p in pos_dict.keys()]
|
|
432
|
+
newP.extend(list(pcl - set([pcl_in_dict[0]])))
|
|
433
|
+
return [M1.delete(L | set(newP)), L, set(newP)]
|
|
434
|
+
elif B is not None:
|
|
435
|
+
pcls = list({frozenset(set(M1.closure([p])) - L)
|
|
436
|
+
for p in list(P)})
|
|
437
|
+
newP = []
|
|
438
|
+
for pcl in pcls:
|
|
439
|
+
pcl_list = list(pcl)
|
|
440
|
+
pcl_in_basis = [p for p in pcl_list if p in B]
|
|
441
|
+
if pcl_in_basis:
|
|
442
|
+
newP.extend(list(pcl - set([pcl_in_basis[0]])))
|
|
443
|
+
else:
|
|
444
|
+
newP.extend(list(pcl - set([pcl_list[0]])))
|
|
445
|
+
return [M1.delete(L | set(newP)), L, set(newP)]
|
|
446
|
+
else:
|
|
447
|
+
return [M1.delete(L | P), L, P]
|
|
448
|
+
else:
|
|
449
|
+
return [M1.delete(L | P), L, P]
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def addlp(M, M1, L, P, ptsdict, G=None, limits=None) -> tuple:
|
|
453
|
+
"""
|
|
454
|
+
Return a graphics object containing loops (in inset) and parallel elements
|
|
455
|
+
of matroid.
|
|
456
|
+
|
|
457
|
+
INPUT:
|
|
458
|
+
|
|
459
|
+
- ``M`` -- matroid
|
|
460
|
+
- ``M1`` -- a simple matroid corresponding to ``M``
|
|
461
|
+
- ``L`` -- list of elements in ``M.groundset()`` that are loops of matroid
|
|
462
|
+
``M``
|
|
463
|
+
- ``P`` -- list of elements in ``M.groundset()`` not in
|
|
464
|
+
``M.simplify.groundset()`` or ``L``
|
|
465
|
+
- ``ptsdict`` -- dictionary containing elements in ``M.groundset()`` not
|
|
466
|
+
necessarily containing elements of ``L``
|
|
467
|
+
- ``G`` -- (optional) a sage graphics object to which loops and parallel
|
|
468
|
+
elements of matroid `M` added
|
|
469
|
+
- ``limits`` -- (optional) current axes limits [xmin,xmax,ymin,ymax]
|
|
470
|
+
|
|
471
|
+
OUTPUT: a 2-tuple containing:
|
|
472
|
+
|
|
473
|
+
1. A sage graphics object containing loops and parallel elements of
|
|
474
|
+
matroid ``M``
|
|
475
|
+
2. axes limits array
|
|
476
|
+
|
|
477
|
+
EXAMPLES::
|
|
478
|
+
|
|
479
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
480
|
+
sage: M = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0,1],
|
|
481
|
+
....: [0, 1, 0, 1, 0, 1, 1,0,0],
|
|
482
|
+
....: [0, 0, 1, 1, 1, 0, 1,0,0]])
|
|
483
|
+
sage: M1, L, P = matroids_plot_helpers.slp(M) # needs sage.rings.finite_rings
|
|
484
|
+
sage: G, lims = matroids_plot_helpers.addlp(M,M1,L,P,{0:(0,0)}) # needs sage.plot sage.rings.finite_rings
|
|
485
|
+
sage: G.show(axes=False) # needs sage.plot sage.rings.finite_rings
|
|
486
|
+
|
|
487
|
+
.. NOTE::
|
|
488
|
+
|
|
489
|
+
This method does NOT do any checks.
|
|
490
|
+
"""
|
|
491
|
+
if G is None:
|
|
492
|
+
G = Graphics()
|
|
493
|
+
# deal with loops
|
|
494
|
+
if L:
|
|
495
|
+
loops = L
|
|
496
|
+
looptext = ", ".join(str(l) for l in loops)
|
|
497
|
+
if limits is None:
|
|
498
|
+
rectx = -1
|
|
499
|
+
recty = -1
|
|
500
|
+
else:
|
|
501
|
+
rectx = limits[0]
|
|
502
|
+
recty = limits[2]-1
|
|
503
|
+
rectw = 0.5 + 0.4*len(loops) + 0.5 # controlled based on len(loops)
|
|
504
|
+
recth = 0.6
|
|
505
|
+
G += polygon2d([[rectx, recty], [rectx, recty+recth],
|
|
506
|
+
[rectx+rectw, recty+recth], [rectx+rectw, recty]],
|
|
507
|
+
color='black', fill=False, thickness=4)
|
|
508
|
+
G += text(looptext, (rectx+0.5, recty+0.3), color='black',
|
|
509
|
+
fontsize=13)
|
|
510
|
+
G += point((rectx+0.2, recty+0.3), color=Color('#BDBDBD'), size=300,
|
|
511
|
+
zorder=2)
|
|
512
|
+
G += text('Loop(s)', (rectx+0.5+0.4*len(loops)+0.1, recty+0.3),
|
|
513
|
+
fontsize=13, color='black')
|
|
514
|
+
limits = tracklims(limits, [rectx, rectx+rectw], [recty, recty+recth])
|
|
515
|
+
# deal with parallel elements
|
|
516
|
+
if P:
|
|
517
|
+
# create list of lists where inner lists are parallel classes
|
|
518
|
+
pcls = []
|
|
519
|
+
gnd = sorted(M1.groundset())
|
|
520
|
+
for g in gnd:
|
|
521
|
+
pcl = [g]
|
|
522
|
+
for p in P:
|
|
523
|
+
if M.rank([g, p]) == 1:
|
|
524
|
+
pcl.extend([p])
|
|
525
|
+
pcls.append(pcl)
|
|
526
|
+
ext_gnd = list(M.groundset())
|
|
527
|
+
for pcl in pcls:
|
|
528
|
+
if len(pcl) > 1:
|
|
529
|
+
basept = list(ptsdict[pcl[0]])
|
|
530
|
+
if len(pcl) <= 2:
|
|
531
|
+
# add side by side
|
|
532
|
+
ptsdict[pcl[1]] = (basept[0], basept[1]-0.13)
|
|
533
|
+
G += points(zip([basept[0]], [basept[1]-0.13]),
|
|
534
|
+
color=Color('#BDBDBD'), size=300, zorder=2)
|
|
535
|
+
G += text(pcl[0], (float(basept[0]),
|
|
536
|
+
float(basept[1])), color='black',
|
|
537
|
+
fontsize=13)
|
|
538
|
+
G += text(pcl[1], (float(basept[0]),
|
|
539
|
+
float(basept[1])-0.13), color='black',
|
|
540
|
+
fontsize=13)
|
|
541
|
+
limits = tracklims(limits, [basept[0]], [basept[1]-0.13])
|
|
542
|
+
else:
|
|
543
|
+
# add in a bracket
|
|
544
|
+
pce = sorted([str(kk) for kk in pcl])
|
|
545
|
+
l = newlabel(set(ext_gnd))
|
|
546
|
+
ext_gnd.append(l)
|
|
547
|
+
G += text(l+'={ '+", ".join(pce)+' }', (float(basept[0]),
|
|
548
|
+
float(basept[1]-0.2)-0.034), color='black',
|
|
549
|
+
fontsize=13)
|
|
550
|
+
G += text(l, (float(basept[0]),
|
|
551
|
+
float(basept[1])), color='black',
|
|
552
|
+
fontsize=13)
|
|
553
|
+
limits = tracklims(limits, [basept[0]],
|
|
554
|
+
[(basept[1]-0.2)-0.034])
|
|
555
|
+
return G, limits
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def line_hasorder(l, lodrs=None) -> tuple[bool, list]:
|
|
559
|
+
"""
|
|
560
|
+
Determine if an order is specified for a line.
|
|
561
|
+
|
|
562
|
+
INPUT:
|
|
563
|
+
|
|
564
|
+
- ``l`` -- a line specified as a list of ground set elements
|
|
565
|
+
- ``lordrs`` -- (optional) list of lists each specifying an order on
|
|
566
|
+
a subset of ground set elements that may or may not correspond to a
|
|
567
|
+
line in geometric representation
|
|
568
|
+
|
|
569
|
+
OUTPUT: a tuple containing 2 elements in this order:
|
|
570
|
+
|
|
571
|
+
1. A boolean indicating whether there is any list in ``lordrs`` that is
|
|
572
|
+
setwise equal to ``l``.
|
|
573
|
+
2. A list specifying an order on ``set(l)`` if 1. is True, otherwise
|
|
574
|
+
an empty list.
|
|
575
|
+
|
|
576
|
+
EXAMPLES::
|
|
577
|
+
|
|
578
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
579
|
+
sage: matroids_plot_helpers.line_hasorder(['a','b','c','d'],
|
|
580
|
+
....: [['a','c','d','b'],['p','q','r']])
|
|
581
|
+
(True, ['a', 'c', 'd', 'b'])
|
|
582
|
+
sage: matroids_plot_helpers.line_hasorder(['a','b','c','d'],
|
|
583
|
+
....: [['p','q','r'],['l','m','n','o']])
|
|
584
|
+
(False, [])
|
|
585
|
+
|
|
586
|
+
.. NOTE::
|
|
587
|
+
|
|
588
|
+
This method does NOT do any checks.
|
|
589
|
+
"""
|
|
590
|
+
if lodrs is not None:
|
|
591
|
+
set_l = Set(l)
|
|
592
|
+
if lodrs:
|
|
593
|
+
for i in lodrs:
|
|
594
|
+
if Set(i) == set_l:
|
|
595
|
+
return True, i
|
|
596
|
+
return False, []
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
def lineorders_union(lineorders1, lineorders2) -> list:
|
|
600
|
+
"""
|
|
601
|
+
Return a list of ordered lists of ground set elements that corresponds to
|
|
602
|
+
union of two sets of ordered lists of ground set elements in a sense.
|
|
603
|
+
|
|
604
|
+
INPUT:
|
|
605
|
+
|
|
606
|
+
- ``lineorders1`` -- list of ordered lists specifying orders on subsets
|
|
607
|
+
of ground set
|
|
608
|
+
- ``lineorders2`` -- list of ordered lists specifying orders subsets of
|
|
609
|
+
ground set
|
|
610
|
+
|
|
611
|
+
OUTPUT:
|
|
612
|
+
|
|
613
|
+
A list of ordered lists of ground set elements that are (setwise) in only
|
|
614
|
+
one of ``lineorders1`` or ``lineorders2`` along with the ones in
|
|
615
|
+
lineorder2 that are setwise equal to any list in lineorders1.
|
|
616
|
+
|
|
617
|
+
EXAMPLES::
|
|
618
|
+
|
|
619
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
620
|
+
sage: matroids_plot_helpers.lineorders_union([['a','b','c'],
|
|
621
|
+
....: ['p','q','r'],['i','j','k','l']],[['r','p','q']])
|
|
622
|
+
[['a', 'b', 'c'], ['p', 'q', 'r'], ['i', 'j', 'k', 'l']]
|
|
623
|
+
"""
|
|
624
|
+
if lineorders1 is not None and lineorders2 is not None:
|
|
625
|
+
lineorders = lineorders1
|
|
626
|
+
for order in lineorders2:
|
|
627
|
+
x, lo = line_hasorder(order, lineorders1)
|
|
628
|
+
if not x:
|
|
629
|
+
lineorders.append(order)
|
|
630
|
+
lineorders.remove(lo)
|
|
631
|
+
return lineorders
|
|
632
|
+
elif lineorders1 is None and lineorders2 is not None:
|
|
633
|
+
return lineorders2
|
|
634
|
+
elif lineorders1 is not None:
|
|
635
|
+
return lineorders1
|
|
636
|
+
else:
|
|
637
|
+
return None
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
def posdict_is_sane(M1, pos_dict) -> bool:
|
|
641
|
+
"""
|
|
642
|
+
Return a boolean establishing sanity of ``posdict`` wrt matroid ``M``.
|
|
643
|
+
|
|
644
|
+
INPUT:
|
|
645
|
+
|
|
646
|
+
- ``M1`` -- matroid
|
|
647
|
+
- ``posdict`` -- dictionary mapping ground set elements to (x,y)
|
|
648
|
+
positions
|
|
649
|
+
|
|
650
|
+
OUTPUT:
|
|
651
|
+
|
|
652
|
+
A boolean that is ``True`` if posdict indeed has all the required elements
|
|
653
|
+
to plot the geometric elements, otherwise ``False``.
|
|
654
|
+
|
|
655
|
+
EXAMPLES::
|
|
656
|
+
|
|
657
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
658
|
+
sage: M1 = Matroid(ring=GF(2), matrix=[[1, 0, 0, 0, 1, 1, 1,0,1,0,1],
|
|
659
|
+
....: [0, 1, 0, 1, 0, 1, 1,0,0,1,0],
|
|
660
|
+
....: [0, 0, 1, 1, 1, 0, 1,0,0,0,0]])
|
|
661
|
+
sage: pos_dict = {0: (0, 0), 1: (2, 0), 2: (1, 2), 3: (1.5, 1.0),
|
|
662
|
+
....: 4: (0.5, 1.0), 5: (1.0, 0.0), 6: (1.0, 0.6666666666666666)}
|
|
663
|
+
sage: matroids_plot_helpers.posdict_is_sane(M1,pos_dict) # needs sage.rings.finite_rings
|
|
664
|
+
True
|
|
665
|
+
sage: pos_dict = {1: (2, 0), 2: (1, 2), 3: (1.5, 1.0),
|
|
666
|
+
....: 4: (0.5, 1.0), 5: (1.0, 0.0), 6: (1.0, 0.6666666666666666)}
|
|
667
|
+
sage: matroids_plot_helpers.posdict_is_sane(M1,pos_dict) # needs sage.rings.finite_rings
|
|
668
|
+
False
|
|
669
|
+
|
|
670
|
+
.. NOTE::
|
|
671
|
+
|
|
672
|
+
This method does NOT do any checks. ``M1`` is assumed to be a
|
|
673
|
+
matroid and ``posdict`` is assumed to be a dictionary.
|
|
674
|
+
"""
|
|
675
|
+
L = set(M1.loops())
|
|
676
|
+
nP = L | set(M1.simplify().groundset())
|
|
677
|
+
P = set(M1.groundset()) - nP
|
|
678
|
+
pcls = list({frozenset(set(M1.closure([p])) - L) for p in list(P)})
|
|
679
|
+
for pcl in pcls:
|
|
680
|
+
if not any(x in pos_dict for x in pcl):
|
|
681
|
+
return False
|
|
682
|
+
allP = []
|
|
683
|
+
for pcl in pcls:
|
|
684
|
+
allP.extend(pcl)
|
|
685
|
+
return all(x in pos_dict
|
|
686
|
+
for x in list(set(M1.groundset()) - (L | set(allP))))
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
def tracklims(lims, x_i=[], y_i=[]) -> list:
|
|
690
|
+
"""
|
|
691
|
+
Return modified limits list.
|
|
692
|
+
|
|
693
|
+
INPUT:
|
|
694
|
+
|
|
695
|
+
- ``lims`` -- list with 4 elements ``[xmin,xmax,ymin,ymax]``
|
|
696
|
+
- ``x_i`` -- new x values to track
|
|
697
|
+
- ``y_i`` -- new y values to track
|
|
698
|
+
|
|
699
|
+
OUTPUT: list with 4 elements ``[xmin,xmax,ymin,ymax]``
|
|
700
|
+
|
|
701
|
+
EXAMPLES::
|
|
702
|
+
|
|
703
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
704
|
+
sage: matroids_plot_helpers.tracklims([0,5,-1,7],[1,2,3,6,-1],
|
|
705
|
+
....: [-1,2,3,6])
|
|
706
|
+
[-1, 6, -1, 7]
|
|
707
|
+
|
|
708
|
+
.. NOTE::
|
|
709
|
+
|
|
710
|
+
This method does NOT do any checks.
|
|
711
|
+
"""
|
|
712
|
+
if lims is not None and lims[0] is not None and lims[1] is not None and \
|
|
713
|
+
lims[2] is not None and lims[3] is not None:
|
|
714
|
+
lims = [min(*x_i, lims[0]), max(*x_i, lims[1]),
|
|
715
|
+
min(*y_i, lims[2]), max(*y_i, lims[3])]
|
|
716
|
+
else:
|
|
717
|
+
lims = [min(x_i), max(x_i), min(y_i), max(y_i)]
|
|
718
|
+
return lims
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def geomrep(M1, B1=None, lineorders1=None, pd=None, sp=False):
|
|
722
|
+
"""
|
|
723
|
+
Return a sage graphics object containing geometric representation of
|
|
724
|
+
matroid M1.
|
|
725
|
+
|
|
726
|
+
INPUT:
|
|
727
|
+
|
|
728
|
+
- ``M1`` -- matroid
|
|
729
|
+
- ``B1`` -- (optional) list of elements in ``M1.groundset()`` that
|
|
730
|
+
correspond to a basis of ``M1`` and will be placed as vertices of the
|
|
731
|
+
triangle in the geometric representation of ``M1``
|
|
732
|
+
- ``lineorders1`` -- (optional) list of ordered lists of elements of
|
|
733
|
+
``M1.groundset()`` such that if a line in geometric representation is
|
|
734
|
+
setwise same as any of these then points contained will be traversed in
|
|
735
|
+
that order thus overriding internal order deciding heuristic
|
|
736
|
+
- ``pd`` -- (optional) dictionary mapping ground set elements to their
|
|
737
|
+
(x,y) positions
|
|
738
|
+
- ``sp`` -- (optional) if ``True``, a positioning dictionary and line orders
|
|
739
|
+
will be placed in ``M._cached_info``
|
|
740
|
+
|
|
741
|
+
OUTPUT:
|
|
742
|
+
|
|
743
|
+
A sage graphics object of type <class 'sage.plot.graphics.Graphics'> that
|
|
744
|
+
corresponds to the geometric representation of the matroid.
|
|
745
|
+
|
|
746
|
+
EXAMPLES::
|
|
747
|
+
|
|
748
|
+
sage: from sage.matroids import matroids_plot_helpers
|
|
749
|
+
sage: M = matroids.catalog.P7()
|
|
750
|
+
sage: G = matroids_plot_helpers.geomrep(M) # needs sage.plot
|
|
751
|
+
sage: G.show(xmin=-2, xmax=3, ymin=-2, ymax=3) # needs sage.plot
|
|
752
|
+
sage: M = matroids.catalog.P7()
|
|
753
|
+
sage: G = matroids_plot_helpers.geomrep(M, lineorders1=[['f','e','d']]) # needs sage.plot
|
|
754
|
+
sage: G.show(xmin=-2, xmax=3, ymin=-2, ymax=3) # needs sage.plot
|
|
755
|
+
|
|
756
|
+
.. NOTE::
|
|
757
|
+
|
|
758
|
+
This method does NOT do any checks.
|
|
759
|
+
"""
|
|
760
|
+
G = Graphics()
|
|
761
|
+
# create lists of loops and parallel elements and simplify given matroid
|
|
762
|
+
M, L, P = slp(M1, pos_dict=pd, B=B1)
|
|
763
|
+
if B1 is None:
|
|
764
|
+
B1 = list(M.basis())
|
|
765
|
+
M._cached_info = M1._cached_info
|
|
766
|
+
|
|
767
|
+
if M.rank() == 0:
|
|
768
|
+
limits = None
|
|
769
|
+
loops = L
|
|
770
|
+
looptext = ", ".join(str(l) for l in loops)
|
|
771
|
+
rectx = -1
|
|
772
|
+
recty = -1
|
|
773
|
+
rectw = 0.5 + 0.4 * len(loops) + 0.5 # controlled based on len(loops)
|
|
774
|
+
recth = 0.6
|
|
775
|
+
G += polygon2d([[rectx, recty], [rectx, recty+recth],
|
|
776
|
+
[rectx+rectw, recty+recth], [rectx+rectw, recty]],
|
|
777
|
+
color='black', fill=False, thickness=4)
|
|
778
|
+
G += text(looptext, (rectx+0.5, recty+0.3), color='black',
|
|
779
|
+
fontsize=13)
|
|
780
|
+
G += point((rectx+0.2, recty+0.3), color=Color('#BDBDBD'), size=300,
|
|
781
|
+
zorder=2)
|
|
782
|
+
G += text('Loop(s)', (rectx+0.5+0.4*len(loops)+0.1, recty+0.3),
|
|
783
|
+
fontsize=13, color='black')
|
|
784
|
+
limits = tracklims(limits, [rectx, rectx+rectw], [recty, recty+recth])
|
|
785
|
+
G.axes(False)
|
|
786
|
+
G.axes_range(xmin=limits[0]-0.5, xmax=limits[1]+0.5,
|
|
787
|
+
ymin=limits[2]-0.5, ymax=limits[3]+0.5)
|
|
788
|
+
return G
|
|
789
|
+
elif M.rank() == 1:
|
|
790
|
+
if M._cached_info is not None and \
|
|
791
|
+
'plot_positions' in M._cached_info.keys() and \
|
|
792
|
+
M._cached_info['plot_positions'] is not None:
|
|
793
|
+
pts = M._cached_info['plot_positions']
|
|
794
|
+
else:
|
|
795
|
+
pts = {}
|
|
796
|
+
gnd = sorted(M.groundset())
|
|
797
|
+
pts[gnd[0]] = (1, float(2)/3)
|
|
798
|
+
G += point((1, float(2)/3), size=300, color=Color('#BDBDBD'), zorder=2)
|
|
799
|
+
pt = [1, float(2)/3]
|
|
800
|
+
if not P:
|
|
801
|
+
G += text(gnd[0], (float(pt[0]), float(pt[1])), color='black',
|
|
802
|
+
fontsize=13)
|
|
803
|
+
pts2 = pts
|
|
804
|
+
# track limits [xmin,xmax,ymin,ymax]
|
|
805
|
+
pl = [list(x) for x in pts2.values()]
|
|
806
|
+
lims = tracklims([None, None, None, None], [pnt[0] for pnt in pl],
|
|
807
|
+
[pnt[1] for pnt in pl])
|
|
808
|
+
elif M.rank() == 2:
|
|
809
|
+
nB1 = set(M.groundset()) - set(B1)
|
|
810
|
+
bline = [j for j in nB1 if M.is_dependent([j, B1[0], B1[1]])]
|
|
811
|
+
interval = len(bline)+1
|
|
812
|
+
if M._cached_info is not None and \
|
|
813
|
+
'plot_positions' in M._cached_info.keys() and \
|
|
814
|
+
M._cached_info['plot_positions'] is not None:
|
|
815
|
+
pts2 = M._cached_info['plot_positions']
|
|
816
|
+
else:
|
|
817
|
+
pts2 = {}
|
|
818
|
+
pts2[B1[0]] = (0, 0)
|
|
819
|
+
pts2[B1[1]] = (2, 0)
|
|
820
|
+
lpt = list(pts2[B1[0]])
|
|
821
|
+
rpt = list(pts2[B1[1]])
|
|
822
|
+
for k in range(len(bline)):
|
|
823
|
+
cc = (float(1)/interval)*(k+1)
|
|
824
|
+
pts2[bline[k]] = (cc*lpt[0]+(1-cc)*rpt[0],
|
|
825
|
+
cc*lpt[1]+(1-cc)*rpt[1])
|
|
826
|
+
if sp:
|
|
827
|
+
M._cached_info['plot_positions'] = pts2
|
|
828
|
+
# track limits [xmin,xmax,ymin,ymax]
|
|
829
|
+
pl = [list(x) for x in pts2.values()]
|
|
830
|
+
lims = tracklims([None, None, None, None], [pt[0] for pt in pl],
|
|
831
|
+
[pt[1] for pt in pl])
|
|
832
|
+
bline.extend(B1)
|
|
833
|
+
ptsx, ptsy, x_i, y_i = createline(pts2, bline, lineorders1)
|
|
834
|
+
lims = tracklims(lims, x_i, y_i)
|
|
835
|
+
G += line(zip(x_i, y_i), color='black', thickness=3, zorder=1)
|
|
836
|
+
pels = [p for p in pts2
|
|
837
|
+
if any(M1.rank([p, q]) == 1 for q in P)]
|
|
838
|
+
allpts = [list(pts2[i]) for i in M.groundset()]
|
|
839
|
+
xpts = [float(k[0]) for k in allpts]
|
|
840
|
+
ypts = [float(k[1]) for k in allpts]
|
|
841
|
+
G += points(zip(xpts, ypts), color=Color('#BDBDBD'), size=300,
|
|
842
|
+
zorder=2)
|
|
843
|
+
for i in pts2:
|
|
844
|
+
if i not in pels:
|
|
845
|
+
pt = list(pts2[i])
|
|
846
|
+
G += text(i, (float(pt[0]), float(pt[1])), color='black',
|
|
847
|
+
fontsize=13)
|
|
848
|
+
else:
|
|
849
|
+
if M._cached_info is None or \
|
|
850
|
+
'plot_positions' not in M._cached_info.keys() or \
|
|
851
|
+
M._cached_info['plot_positions'] is None:
|
|
852
|
+
(pts, trilines,
|
|
853
|
+
nontripts, curvedlines) = it(M1, B1,
|
|
854
|
+
list(set(M.groundset())-set(B1)),
|
|
855
|
+
list(set(L) | set(P)))
|
|
856
|
+
pts2 = addnontripts([B1[0], B1[1], B1[2]], nontripts, pts)
|
|
857
|
+
trilines.extend(curvedlines)
|
|
858
|
+
else:
|
|
859
|
+
pts2 = M._cached_info['plot_positions']
|
|
860
|
+
trilines = [list(set(x).difference(L | P))
|
|
861
|
+
for x in M1.flats(2) if len(list(x)) >= 3]
|
|
862
|
+
pl = [list(x) for x in pts2.values()]
|
|
863
|
+
lims = tracklims([None, None, None, None], [pt[0] for pt in pl],
|
|
864
|
+
[pt[1] for pt in pl])
|
|
865
|
+
for ll in trilines:
|
|
866
|
+
if len(ll) >= 3:
|
|
867
|
+
ptsx, ptsy, x_i, y_i = createline(pts2, ll, lineorders1)
|
|
868
|
+
lims = tracklims(lims, x_i, y_i)
|
|
869
|
+
G += line(zip(x_i, y_i), color='black', thickness=3, zorder=1)
|
|
870
|
+
pels = [p for p in pts2
|
|
871
|
+
if any(M1.rank([p, q]) == 1 for q in P)]
|
|
872
|
+
allpts = [list(pts2[i]) for i in M.groundset()]
|
|
873
|
+
xpts = [float(k[0]) for k in allpts]
|
|
874
|
+
ypts = [float(k[1]) for k in allpts]
|
|
875
|
+
G += points(zip(xpts, ypts), color=Color('#BDBDBD'), size=300,
|
|
876
|
+
zorder=2)
|
|
877
|
+
for i in pts2:
|
|
878
|
+
if i not in pels:
|
|
879
|
+
pt = list(pts2[i])
|
|
880
|
+
G += text(i, (float(pt[0]), float(pt[1])), color='black',
|
|
881
|
+
fontsize=13)
|
|
882
|
+
if sp:
|
|
883
|
+
M1._cached_info['plot_positions'] = pts2
|
|
884
|
+
M1._cached_info['plot_lineorders'] = lineorders1
|
|
885
|
+
# deal with loops and parallel elements
|
|
886
|
+
G, lims = addlp(M1, M, L, P, pts2, G, lims)
|
|
887
|
+
G.axes(False)
|
|
888
|
+
G.axes_range(xmin=lims[0]-0.5, xmax=lims[1]+0.5, ymin=lims[2]-0.5,
|
|
889
|
+
ymax=lims[3]+0.5)
|
|
890
|
+
return G
|