passagemath-graphs 10.6.1rc1__cp310-cp310-musllinux_1_2_aarch64.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.
Files changed (260) hide show
  1. passagemath_graphs-10.6.1rc1.dist-info/METADATA +292 -0
  2. passagemath_graphs-10.6.1rc1.dist-info/RECORD +260 -0
  3. passagemath_graphs-10.6.1rc1.dist-info/WHEEL +5 -0
  4. passagemath_graphs-10.6.1rc1.dist-info/top_level.txt +2 -0
  5. passagemath_graphs.libs/libgcc_s-69c45f16.so.1 +0 -0
  6. passagemath_graphs.libs/libgmp-8e78bd9b.so.10.5.0 +0 -0
  7. passagemath_graphs.libs/libstdc++-1f1a71be.so.6.0.33 +0 -0
  8. sage/all__sagemath_graphs.py +39 -0
  9. sage/combinat/abstract_tree.py +2723 -0
  10. sage/combinat/all__sagemath_graphs.py +34 -0
  11. sage/combinat/binary_tree.py +5306 -0
  12. sage/combinat/cluster_algebra_quiver/all.py +22 -0
  13. sage/combinat/cluster_algebra_quiver/cluster_seed.py +5208 -0
  14. sage/combinat/cluster_algebra_quiver/interact.py +124 -0
  15. sage/combinat/cluster_algebra_quiver/mutation_class.py +625 -0
  16. sage/combinat/cluster_algebra_quiver/mutation_type.py +1555 -0
  17. sage/combinat/cluster_algebra_quiver/quiver.py +2290 -0
  18. sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py +2468 -0
  19. sage/combinat/designs/MOLS_handbook_data.py +570 -0
  20. sage/combinat/designs/all.py +58 -0
  21. sage/combinat/designs/bibd.py +1655 -0
  22. sage/combinat/designs/block_design.py +1071 -0
  23. sage/combinat/designs/covering_array.py +269 -0
  24. sage/combinat/designs/covering_design.py +530 -0
  25. sage/combinat/designs/database.py +5615 -0
  26. sage/combinat/designs/design_catalog.py +122 -0
  27. sage/combinat/designs/designs_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  28. sage/combinat/designs/designs_pyx.pxd +21 -0
  29. sage/combinat/designs/designs_pyx.pyx +993 -0
  30. sage/combinat/designs/difference_family.py +3951 -0
  31. sage/combinat/designs/difference_matrices.py +279 -0
  32. sage/combinat/designs/evenly_distributed_sets.cpython-310-aarch64-linux-gnu.so +0 -0
  33. sage/combinat/designs/evenly_distributed_sets.pyx +661 -0
  34. sage/combinat/designs/ext_rep.py +1064 -0
  35. sage/combinat/designs/gen_quadrangles_with_spread.cpython-310-aarch64-linux-gnu.so +0 -0
  36. sage/combinat/designs/gen_quadrangles_with_spread.pyx +339 -0
  37. sage/combinat/designs/group_divisible_designs.py +361 -0
  38. sage/combinat/designs/incidence_structures.py +2357 -0
  39. sage/combinat/designs/latin_squares.py +581 -0
  40. sage/combinat/designs/orthogonal_arrays.py +2244 -0
  41. sage/combinat/designs/orthogonal_arrays_build_recursive.py +1780 -0
  42. sage/combinat/designs/orthogonal_arrays_find_recursive.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sage/combinat/designs/orthogonal_arrays_find_recursive.pyx +967 -0
  44. sage/combinat/designs/resolvable_bibd.py +815 -0
  45. sage/combinat/designs/steiner_quadruple_systems.py +1306 -0
  46. sage/combinat/designs/subhypergraph_search.cpython-310-aarch64-linux-gnu.so +0 -0
  47. sage/combinat/designs/subhypergraph_search.pyx +530 -0
  48. sage/combinat/designs/twographs.py +306 -0
  49. sage/combinat/finite_state_machine.py +14874 -0
  50. sage/combinat/finite_state_machine_generators.py +2006 -0
  51. sage/combinat/graph_path.py +448 -0
  52. sage/combinat/interval_posets.py +3908 -0
  53. sage/combinat/nu_tamari_lattice.py +269 -0
  54. sage/combinat/ordered_tree.py +1446 -0
  55. sage/combinat/posets/all.py +46 -0
  56. sage/combinat/posets/bubble_shuffle.py +247 -0
  57. sage/combinat/posets/cartesian_product.py +493 -0
  58. sage/combinat/posets/d_complete.py +182 -0
  59. sage/combinat/posets/elements.py +273 -0
  60. sage/combinat/posets/forest.py +30 -0
  61. sage/combinat/posets/hasse_cython.cpython-310-aarch64-linux-gnu.so +0 -0
  62. sage/combinat/posets/hasse_cython.pyx +174 -0
  63. sage/combinat/posets/hasse_diagram.py +3672 -0
  64. sage/combinat/posets/hochschild_lattice.py +158 -0
  65. sage/combinat/posets/incidence_algebras.py +794 -0
  66. sage/combinat/posets/lattices.py +5117 -0
  67. sage/combinat/posets/linear_extension_iterator.cpython-310-aarch64-linux-gnu.so +0 -0
  68. sage/combinat/posets/linear_extension_iterator.pyx +292 -0
  69. sage/combinat/posets/linear_extensions.py +1037 -0
  70. sage/combinat/posets/mobile.py +275 -0
  71. sage/combinat/posets/moebius_algebra.py +776 -0
  72. sage/combinat/posets/poset_examples.py +2178 -0
  73. sage/combinat/posets/posets.py +9360 -0
  74. sage/combinat/rooted_tree.py +1070 -0
  75. sage/combinat/shard_order.py +239 -0
  76. sage/combinat/tamari_lattices.py +384 -0
  77. sage/combinat/yang_baxter_graph.py +923 -0
  78. sage/databases/all__sagemath_graphs.py +1 -0
  79. sage/databases/knotinfo_db.py +1231 -0
  80. sage/ext_data/all__sagemath_graphs.py +1 -0
  81. sage/ext_data/graphs/graph_plot_js.html +330 -0
  82. sage/ext_data/kenzo/CP2.txt +45 -0
  83. sage/ext_data/kenzo/CP3.txt +349 -0
  84. sage/ext_data/kenzo/CP4.txt +4774 -0
  85. sage/ext_data/kenzo/README.txt +49 -0
  86. sage/ext_data/kenzo/S4.txt +20 -0
  87. sage/graphs/all.py +42 -0
  88. sage/graphs/asteroidal_triples.cpython-310-aarch64-linux-gnu.so +0 -0
  89. sage/graphs/asteroidal_triples.pyx +320 -0
  90. sage/graphs/base/all.py +1 -0
  91. sage/graphs/base/boost_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  92. sage/graphs/base/boost_graph.pxd +106 -0
  93. sage/graphs/base/boost_graph.pyx +3045 -0
  94. sage/graphs/base/c_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  95. sage/graphs/base/c_graph.pxd +106 -0
  96. sage/graphs/base/c_graph.pyx +5096 -0
  97. sage/graphs/base/dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sage/graphs/base/dense_graph.pxd +28 -0
  99. sage/graphs/base/dense_graph.pyx +801 -0
  100. sage/graphs/base/graph_backends.cpython-310-aarch64-linux-gnu.so +0 -0
  101. sage/graphs/base/graph_backends.pxd +5 -0
  102. sage/graphs/base/graph_backends.pyx +797 -0
  103. sage/graphs/base/overview.py +85 -0
  104. sage/graphs/base/sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  105. sage/graphs/base/sparse_graph.pxd +90 -0
  106. sage/graphs/base/sparse_graph.pyx +1653 -0
  107. sage/graphs/base/static_dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  108. sage/graphs/base/static_dense_graph.pxd +5 -0
  109. sage/graphs/base/static_dense_graph.pyx +1032 -0
  110. sage/graphs/base/static_sparse_backend.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sage/graphs/base/static_sparse_backend.pxd +27 -0
  112. sage/graphs/base/static_sparse_backend.pyx +1583 -0
  113. sage/graphs/base/static_sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  114. sage/graphs/base/static_sparse_graph.pxd +37 -0
  115. sage/graphs/base/static_sparse_graph.pyx +1375 -0
  116. sage/graphs/bipartite_graph.py +2732 -0
  117. sage/graphs/centrality.cpython-310-aarch64-linux-gnu.so +0 -0
  118. sage/graphs/centrality.pyx +1038 -0
  119. sage/graphs/cographs.py +519 -0
  120. sage/graphs/comparability.cpython-310-aarch64-linux-gnu.so +0 -0
  121. sage/graphs/comparability.pyx +851 -0
  122. sage/graphs/connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
  123. sage/graphs/connectivity.pxd +157 -0
  124. sage/graphs/connectivity.pyx +4813 -0
  125. sage/graphs/convexity_properties.cpython-310-aarch64-linux-gnu.so +0 -0
  126. sage/graphs/convexity_properties.pxd +16 -0
  127. sage/graphs/convexity_properties.pyx +870 -0
  128. sage/graphs/digraph.py +4754 -0
  129. sage/graphs/digraph_generators.py +1993 -0
  130. sage/graphs/distances_all_pairs.cpython-310-aarch64-linux-gnu.so +0 -0
  131. sage/graphs/distances_all_pairs.pxd +12 -0
  132. sage/graphs/distances_all_pairs.pyx +2938 -0
  133. sage/graphs/domination.py +1363 -0
  134. sage/graphs/dot2tex_utils.py +100 -0
  135. sage/graphs/edge_connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
  136. sage/graphs/edge_connectivity.pyx +1215 -0
  137. sage/graphs/generators/all.py +1 -0
  138. sage/graphs/generators/basic.py +1769 -0
  139. sage/graphs/generators/chessboard.py +538 -0
  140. sage/graphs/generators/classical_geometries.py +1611 -0
  141. sage/graphs/generators/degree_sequence.py +235 -0
  142. sage/graphs/generators/distance_regular.cpython-310-aarch64-linux-gnu.so +0 -0
  143. sage/graphs/generators/distance_regular.pyx +2846 -0
  144. sage/graphs/generators/families.py +4759 -0
  145. sage/graphs/generators/intersection.py +565 -0
  146. sage/graphs/generators/platonic_solids.py +262 -0
  147. sage/graphs/generators/random.py +2623 -0
  148. sage/graphs/generators/smallgraphs.py +5741 -0
  149. sage/graphs/generators/world_map.py +724 -0
  150. sage/graphs/generic_graph.py +26867 -0
  151. sage/graphs/generic_graph_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  152. sage/graphs/generic_graph_pyx.pxd +34 -0
  153. sage/graphs/generic_graph_pyx.pyx +1673 -0
  154. sage/graphs/genus.cpython-310-aarch64-linux-gnu.so +0 -0
  155. sage/graphs/genus.pyx +622 -0
  156. sage/graphs/graph.py +9645 -0
  157. sage/graphs/graph_coloring.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sage/graphs/graph_coloring.pyx +2284 -0
  159. sage/graphs/graph_database.py +1177 -0
  160. sage/graphs/graph_decompositions/all.py +1 -0
  161. sage/graphs/graph_decompositions/bandwidth.cpython-310-aarch64-linux-gnu.so +0 -0
  162. sage/graphs/graph_decompositions/bandwidth.pyx +428 -0
  163. sage/graphs/graph_decompositions/clique_separators.cpython-310-aarch64-linux-gnu.so +0 -0
  164. sage/graphs/graph_decompositions/clique_separators.pyx +616 -0
  165. sage/graphs/graph_decompositions/cutwidth.cpython-310-aarch64-linux-gnu.so +0 -0
  166. sage/graphs/graph_decompositions/cutwidth.pyx +753 -0
  167. sage/graphs/graph_decompositions/fast_digraph.cpython-310-aarch64-linux-gnu.so +0 -0
  168. sage/graphs/graph_decompositions/fast_digraph.pxd +13 -0
  169. sage/graphs/graph_decompositions/fast_digraph.pyx +212 -0
  170. sage/graphs/graph_decompositions/graph_products.cpython-310-aarch64-linux-gnu.so +0 -0
  171. sage/graphs/graph_decompositions/graph_products.pyx +508 -0
  172. sage/graphs/graph_decompositions/modular_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  173. sage/graphs/graph_decompositions/modular_decomposition.pxd +27 -0
  174. sage/graphs/graph_decompositions/modular_decomposition.pyx +1536 -0
  175. sage/graphs/graph_decompositions/slice_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  176. sage/graphs/graph_decompositions/slice_decomposition.pxd +18 -0
  177. sage/graphs/graph_decompositions/slice_decomposition.pyx +1106 -0
  178. sage/graphs/graph_decompositions/tree_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  179. sage/graphs/graph_decompositions/tree_decomposition.pxd +17 -0
  180. sage/graphs/graph_decompositions/tree_decomposition.pyx +1996 -0
  181. sage/graphs/graph_decompositions/vertex_separation.cpython-310-aarch64-linux-gnu.so +0 -0
  182. sage/graphs/graph_decompositions/vertex_separation.pxd +5 -0
  183. sage/graphs/graph_decompositions/vertex_separation.pyx +1963 -0
  184. sage/graphs/graph_editor.py +82 -0
  185. sage/graphs/graph_generators.py +3314 -0
  186. sage/graphs/graph_generators_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  187. sage/graphs/graph_generators_pyx.pyx +95 -0
  188. sage/graphs/graph_input.py +812 -0
  189. sage/graphs/graph_latex.py +2064 -0
  190. sage/graphs/graph_list.py +410 -0
  191. sage/graphs/graph_plot.py +1756 -0
  192. sage/graphs/graph_plot_js.py +338 -0
  193. sage/graphs/hyperbolicity.cpython-310-aarch64-linux-gnu.so +0 -0
  194. sage/graphs/hyperbolicity.pyx +1704 -0
  195. sage/graphs/hypergraph_generators.py +364 -0
  196. sage/graphs/independent_sets.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sage/graphs/independent_sets.pxd +13 -0
  198. sage/graphs/independent_sets.pyx +402 -0
  199. sage/graphs/isgci.py +1033 -0
  200. sage/graphs/isoperimetric_inequalities.cpython-310-aarch64-linux-gnu.so +0 -0
  201. sage/graphs/isoperimetric_inequalities.pyx +489 -0
  202. sage/graphs/line_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  203. sage/graphs/line_graph.pyx +743 -0
  204. sage/graphs/lovasz_theta.py +77 -0
  205. sage/graphs/matching.py +1633 -0
  206. sage/graphs/matching_covered_graph.py +3590 -0
  207. sage/graphs/orientations.py +1489 -0
  208. sage/graphs/partial_cube.py +459 -0
  209. sage/graphs/path_enumeration.cpython-310-aarch64-linux-gnu.so +0 -0
  210. sage/graphs/path_enumeration.pyx +2040 -0
  211. sage/graphs/pq_trees.py +1129 -0
  212. sage/graphs/print_graphs.py +201 -0
  213. sage/graphs/schnyder.py +865 -0
  214. sage/graphs/spanning_tree.cpython-310-aarch64-linux-gnu.so +0 -0
  215. sage/graphs/spanning_tree.pyx +1457 -0
  216. sage/graphs/strongly_regular_db.cpython-310-aarch64-linux-gnu.so +0 -0
  217. sage/graphs/strongly_regular_db.pyx +3340 -0
  218. sage/graphs/traversals.cpython-310-aarch64-linux-gnu.so +0 -0
  219. sage/graphs/traversals.pxd +9 -0
  220. sage/graphs/traversals.pyx +1872 -0
  221. sage/graphs/trees.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sage/graphs/trees.pxd +15 -0
  223. sage/graphs/trees.pyx +310 -0
  224. sage/graphs/tutte_polynomial.py +713 -0
  225. sage/graphs/views.cpython-310-aarch64-linux-gnu.so +0 -0
  226. sage/graphs/views.pyx +794 -0
  227. sage/graphs/weakly_chordal.cpython-310-aarch64-linux-gnu.so +0 -0
  228. sage/graphs/weakly_chordal.pyx +604 -0
  229. sage/groups/all__sagemath_graphs.py +1 -0
  230. sage/groups/perm_gps/all__sagemath_graphs.py +1 -0
  231. sage/groups/perm_gps/partn_ref/all__sagemath_graphs.py +1 -0
  232. sage/groups/perm_gps/partn_ref/refinement_graphs.cpython-310-aarch64-linux-gnu.so +0 -0
  233. sage/groups/perm_gps/partn_ref/refinement_graphs.pxd +38 -0
  234. sage/groups/perm_gps/partn_ref/refinement_graphs.pyx +1666 -0
  235. sage/knots/all.py +6 -0
  236. sage/knots/free_knotinfo_monoid.py +507 -0
  237. sage/knots/gauss_code.py +291 -0
  238. sage/knots/knot.py +682 -0
  239. sage/knots/knot_table.py +284 -0
  240. sage/knots/knotinfo.py +2900 -0
  241. sage/knots/link.py +4715 -0
  242. sage/sandpiles/all.py +13 -0
  243. sage/sandpiles/examples.py +225 -0
  244. sage/sandpiles/sandpile.py +6365 -0
  245. sage/topology/all.py +22 -0
  246. sage/topology/cell_complex.py +1214 -0
  247. sage/topology/cubical_complex.py +1976 -0
  248. sage/topology/delta_complex.py +1806 -0
  249. sage/topology/filtered_simplicial_complex.py +744 -0
  250. sage/topology/moment_angle_complex.py +823 -0
  251. sage/topology/simplicial_complex.py +5160 -0
  252. sage/topology/simplicial_complex_catalog.py +92 -0
  253. sage/topology/simplicial_complex_examples.py +1680 -0
  254. sage/topology/simplicial_complex_homset.py +205 -0
  255. sage/topology/simplicial_complex_morphism.py +836 -0
  256. sage/topology/simplicial_set.py +4102 -0
  257. sage/topology/simplicial_set_catalog.py +55 -0
  258. sage/topology/simplicial_set_constructions.py +2954 -0
  259. sage/topology/simplicial_set_examples.py +865 -0
  260. sage/topology/simplicial_set_morphism.py +1464 -0
@@ -0,0 +1,292 @@
1
+ # sage_setup: distribution = sagemath-graphs
2
+ # cython: binding=True
3
+ r"""
4
+ Fast linear extension iterator
5
+ """
6
+ cimport cython
7
+
8
+ from copy import copy
9
+
10
+
11
+ def _linear_extension_prepare(D):
12
+ r"""
13
+ The preprocessing routine in Figure 7 of "Generating Linear
14
+ Extensions Fast" by Preusse and Ruskey.
15
+
16
+ INPUT:
17
+
18
+ - ``D`` -- the Hasse diagram of a poset
19
+
20
+ OUTPUT:
21
+
22
+ - a triple ``(le, a, b)``, where ``le`` is the first linear
23
+ extension, and ``a`` and ``b`` are lists such that ``a[i]`` and
24
+ ``b[i]`` are minimal elements of ``D`` after removing ``a[:i]``
25
+ and ``b[:i]``.
26
+
27
+ TESTS::
28
+
29
+ sage: from sage.combinat.posets.linear_extension_iterator import _linear_extension_prepare
30
+ sage: D = Poset({ 0:[1,2], 1:[3], 2:[3,4] })._hasse_diagram
31
+ sage: _linear_extension_prepare(D)
32
+ ([0, 1, 2, 3, 4], [1, 3], [2, 4])
33
+ """
34
+ dag_copy = copy(D) # this copy is destroyed during preparation
35
+ le = []
36
+ a = []
37
+ b = []
38
+
39
+ # the preprocessing routine found in Figure 7 of
40
+ # "Generating Linear Extensions Fast" by
41
+ # Pruesse and Ruskey
42
+ while dag_copy.num_verts() != 0:
43
+ # find all the minimal elements of dag_copy
44
+ minimal_elements = dag_copy.sources()
45
+ if not minimal_elements:
46
+ raise ValueError("the digraph must be acyclic to have linear extensions")
47
+ elif len(minimal_elements) == 1:
48
+ le.append(minimal_elements[0])
49
+ dag_copy.delete_vertex(minimal_elements[0])
50
+ else:
51
+ ap = minimal_elements[0]
52
+ bp = minimal_elements[1]
53
+ a.append(ap)
54
+ b.append(bp)
55
+ le.append(ap)
56
+ le.append(bp)
57
+ dag_copy.delete_vertex(ap)
58
+ dag_copy.delete_vertex(bp)
59
+
60
+ return (le, a, b)
61
+
62
+
63
+ @cython.wraparound(False)
64
+ @cython.boundscheck(False)
65
+ cdef void _linear_extension_switch(list _le, list _a, list _b, list _is_plus, Py_ssize_t i) noexcept:
66
+ """
67
+ This implements the ``Switch`` procedure described on page 7
68
+ of "Generating Linear Extensions Fast" by Pruesse and Ruskey.
69
+
70
+ If ``i == -1``, then the sign is changed. Otherwise, then
71
+ ``_a[i]`` and ``_b[i]`` are transposed.
72
+ """
73
+ cdef Py_ssize_t a_index, b_index
74
+ if i == -1:
75
+ _is_plus[0] = not _is_plus[0]
76
+ else:
77
+ a = _a[i]
78
+ b = _b[i]
79
+ a_index = _le.index(a)
80
+ b_index = _le.index(b)
81
+ _le[a_index] = b
82
+ _le[b_index] = a
83
+ _b[i] = a
84
+ _a[i] = b
85
+
86
+
87
+ @cython.wraparound(False)
88
+ @cython.boundscheck(False)
89
+ cdef bint _linear_extension_right_a(_D, list _le, list _a, list _b, Py_ssize_t i) noexcept:
90
+ """
91
+ Return ``True`` if and only if ``_a[i]`` is incomparable with the
92
+ element to its right in ``_le`` and the element to the right is
93
+ not ``_b[i]``.
94
+
95
+ This is the ``Right`` function described on page 8 of
96
+ "Generating Linear Extensions Fast" by Pruesse and Ruskey.
97
+
98
+ ::
99
+
100
+ sage: D = Poset({ 0:[1,2], 1:[3], 2:[3,4] })._hasse_diagram # not tested
101
+ sage: _linear_extension_right_a(D, [0, 1, 2, 4, 3], [1, 4], [2, 3], 0) # not tested
102
+ False
103
+ sage: _linear_extension_right_a(D, [0, 1, 2, 4, 3], [1, 4], [2, 3], 1) # not tested
104
+ False
105
+ """
106
+ cdef Py_ssize_t yindex
107
+ x = _a[i]
108
+ yindex = _le.index(x) + 1
109
+ if yindex >= len(_le):
110
+ return False
111
+ y = _le[yindex]
112
+ return y != _b[i] and _D.are_incomparable(x, y)
113
+
114
+
115
+ @cython.wraparound(False)
116
+ @cython.boundscheck(False)
117
+ cdef bint _linear_extension_right_b(_D, list _le, list _a, list _b, Py_ssize_t i) noexcept:
118
+ """
119
+ Return ``True`` if and only if ``_b[i]`` is incomparable with the
120
+ elements to its right in ``_le``.
121
+
122
+ This is the ``Right`` function described on page 8 of
123
+ "Generating Linear Extensions Fast" by Pruesse and Ruskey.
124
+
125
+ ::
126
+
127
+ sage: D = Poset({ 0:[1,2], 1:[3], 2:[3,4] })._hasse_diagram # not tested
128
+ sage: _linear_extension_right_b(D, [0, 1, 2, 4, 3], [1, 4], [2, 3], 0) # not tested
129
+ False
130
+ sage: _linear_extension_right_b(D, [0, 1, 2, 4, 3], [1, 4], [2, 3], 1) # not tested
131
+ False
132
+ """
133
+ cdef Py_ssize_t yindex
134
+ x = _b[i]
135
+ yindex = _le.index(x) + 1
136
+ if yindex >= len(_le):
137
+ return False
138
+ y = _le[yindex]
139
+ return _D.are_incomparable(x, y)
140
+
141
+
142
+ @cython.wraparound(False)
143
+ @cython.boundscheck(False)
144
+ def _linear_extension_gen(_D, list _le, list _a, list _b, list _is_plus, Py_ssize_t i):
145
+ """
146
+ This a Python version of the GenLE routine found in Figure 8
147
+ of "Generating Linear Extensions Fast" by Pruesse and Ruskey.
148
+
149
+ TESTS::
150
+
151
+ sage: from sage.combinat.posets.linear_extension_iterator import _linear_extension_prepare, _linear_extension_gen
152
+ sage: D = Poset({ 0:[1,2], 1:[3], 2:[3,4] })._hasse_diagram
153
+ sage: le, a, b = _linear_extension_prepare(D)
154
+ sage: [e for e in _linear_extension_gen(D, le, a, b, [True], len(a)-1)] # needs sage.modules
155
+ [[0, 2, 1, 3, 4]]
156
+ """
157
+ cdef int mra, mrb, mla
158
+ cdef Py_ssize_t index, index1
159
+ cdef bint typical
160
+ if i == -1:
161
+ return
162
+
163
+ import sage.matrix # otherwise there will be a lot of "Exception ignored in: 'linear_extension_iterator._linear_extension_right_b'"
164
+
165
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
166
+ yield e
167
+ mrb = 0
168
+ typical = False
169
+ while _linear_extension_right_b(_D, _le, _a, _b, i):
170
+ mrb += 1
171
+ # move_right
172
+ index = _le.index(_b[i])
173
+ index1 = index + 1
174
+ _le[index] = _le[index1]
175
+ _le[index1] = _b[i]
176
+ if _is_plus[0]:
177
+ yield _le[:]
178
+
179
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
180
+ yield e
181
+ mra = 0
182
+ while _linear_extension_right_a(_D, _le, _a, _b, i):
183
+ typical = True
184
+ mra += 1
185
+ # move_right
186
+ index = _le.index(_a[i])
187
+ index1 = index+1
188
+ _le[index] = _le[index1]
189
+ _le[index1] = _a[i]
190
+ if _is_plus[0]:
191
+ yield _le[:]
192
+
193
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
194
+ yield e
195
+
196
+ if typical:
197
+ _linear_extension_switch(_le, _a, _b, _is_plus, i-1)
198
+ if _is_plus[0]:
199
+ yield _le[:]
200
+
201
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
202
+ yield e
203
+ if mrb % 2 == 1:
204
+ mla = mra - 1
205
+ else:
206
+ mla = mra + 1
207
+ for _ in range(mla):
208
+ # move_left
209
+ index = _le.index(_a[i])
210
+ index1 = index-1
211
+ _le[index] = _le[index1]
212
+ _le[index1] = _a[i]
213
+ if _is_plus[0]:
214
+ yield _le[:]
215
+
216
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
217
+ yield e
218
+
219
+ if typical and (mrb % 2 == 1):
220
+ # move_left
221
+ index = _le.index(_a[i])
222
+ index1 = index-1
223
+ _le[index] = _le[index1]
224
+ _le[index1] = _a[i]
225
+ if _is_plus[0]:
226
+ yield _le[:]
227
+ else:
228
+ _linear_extension_switch(_le, _a, _b, _is_plus, i-1)
229
+ if _is_plus[0]:
230
+ yield _le[:]
231
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
232
+ yield e
233
+ for _ in range(mrb):
234
+ # move_left
235
+ index = _le.index(_b[i])
236
+ index1 = index-1
237
+ _le[index] = _le[index1]
238
+ _le[index1] = _b[i]
239
+ if _is_plus[0]:
240
+ yield _le[:]
241
+
242
+ for e in _linear_extension_gen(_D, _le, _a, _b, _is_plus, i-1):
243
+ yield e
244
+
245
+
246
+ def linear_extension_iterator(D):
247
+ """
248
+ Iterate over the linear extensions of the poset.
249
+
250
+ The list ``_le`` keeps track of the current linear extensions. The
251
+ boolean variable ``is_plus`` keeps track of the "sign".
252
+
253
+ INPUT:
254
+
255
+ - ``D`` -- the Hasse diagram of a poset
256
+
257
+ .. WARNING::
258
+
259
+ It is assumed that ``D`` is not modified while the linear
260
+ extensions are generated.
261
+
262
+ EXAMPLES::
263
+
264
+ sage: from sage.combinat.posets.linear_extension_iterator import linear_extension_iterator
265
+ sage: D = Poset({ 0:[1,2], 1:[3], 2:[3,4] })._hasse_diagram
266
+ sage: list(linear_extension_iterator(D)) # needs sage.modules
267
+ [[0, 1, 2, 3, 4],
268
+ [0, 2, 1, 3, 4],
269
+ [0, 2, 1, 4, 3],
270
+ [0, 2, 4, 1, 3],
271
+ [0, 1, 2, 4, 3]]
272
+
273
+ sage: D = posets.BooleanLattice(3)._hasse_diagram
274
+ sage: len(list(linear_extension_iterator(D))) # needs sage.modules
275
+ 48
276
+
277
+ sage: D = posets.AntichainPoset(9)._hasse_diagram
278
+ sage: len(list(linear_extension_iterator(D))) == factorial(9) # long time, needs sage.modules
279
+ True
280
+ """
281
+ _le, _a, _b = _linear_extension_prepare(D)
282
+ _max_pair = len(_a) - 1
283
+ _is_plus = [True] # this is modified by _linear_extension_switch
284
+
285
+ yield _le[:]
286
+ for e in _linear_extension_gen(D, _le, _a, _b, _is_plus, _max_pair):
287
+ yield e
288
+ _linear_extension_switch(_le, _a, _b, _is_plus, _max_pair)
289
+ if _is_plus[0]:
290
+ yield _le[:]
291
+ for e in _linear_extension_gen(D, _le, _a, _b, _is_plus, _max_pair):
292
+ yield e