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.

Files changed (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. 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