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.
- passagemath_graphs-10.6.1rc1.dist-info/METADATA +292 -0
- passagemath_graphs-10.6.1rc1.dist-info/RECORD +260 -0
- passagemath_graphs-10.6.1rc1.dist-info/WHEEL +5 -0
- passagemath_graphs-10.6.1rc1.dist-info/top_level.txt +2 -0
- passagemath_graphs.libs/libgcc_s-69c45f16.so.1 +0 -0
- passagemath_graphs.libs/libgmp-8e78bd9b.so.10.5.0 +0 -0
- passagemath_graphs.libs/libstdc++-1f1a71be.so.6.0.33 +0 -0
- sage/all__sagemath_graphs.py +39 -0
- sage/combinat/abstract_tree.py +2723 -0
- sage/combinat/all__sagemath_graphs.py +34 -0
- sage/combinat/binary_tree.py +5306 -0
- sage/combinat/cluster_algebra_quiver/all.py +22 -0
- sage/combinat/cluster_algebra_quiver/cluster_seed.py +5208 -0
- sage/combinat/cluster_algebra_quiver/interact.py +124 -0
- sage/combinat/cluster_algebra_quiver/mutation_class.py +625 -0
- sage/combinat/cluster_algebra_quiver/mutation_type.py +1555 -0
- sage/combinat/cluster_algebra_quiver/quiver.py +2290 -0
- sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py +2468 -0
- sage/combinat/designs/MOLS_handbook_data.py +570 -0
- sage/combinat/designs/all.py +58 -0
- sage/combinat/designs/bibd.py +1655 -0
- sage/combinat/designs/block_design.py +1071 -0
- sage/combinat/designs/covering_array.py +269 -0
- sage/combinat/designs/covering_design.py +530 -0
- sage/combinat/designs/database.py +5615 -0
- sage/combinat/designs/design_catalog.py +122 -0
- sage/combinat/designs/designs_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/designs_pyx.pxd +21 -0
- sage/combinat/designs/designs_pyx.pyx +993 -0
- sage/combinat/designs/difference_family.py +3951 -0
- sage/combinat/designs/difference_matrices.py +279 -0
- sage/combinat/designs/evenly_distributed_sets.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/evenly_distributed_sets.pyx +661 -0
- sage/combinat/designs/ext_rep.py +1064 -0
- sage/combinat/designs/gen_quadrangles_with_spread.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/gen_quadrangles_with_spread.pyx +339 -0
- sage/combinat/designs/group_divisible_designs.py +361 -0
- sage/combinat/designs/incidence_structures.py +2357 -0
- sage/combinat/designs/latin_squares.py +581 -0
- sage/combinat/designs/orthogonal_arrays.py +2244 -0
- sage/combinat/designs/orthogonal_arrays_build_recursive.py +1780 -0
- sage/combinat/designs/orthogonal_arrays_find_recursive.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/orthogonal_arrays_find_recursive.pyx +967 -0
- sage/combinat/designs/resolvable_bibd.py +815 -0
- sage/combinat/designs/steiner_quadruple_systems.py +1306 -0
- sage/combinat/designs/subhypergraph_search.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/subhypergraph_search.pyx +530 -0
- sage/combinat/designs/twographs.py +306 -0
- sage/combinat/finite_state_machine.py +14874 -0
- sage/combinat/finite_state_machine_generators.py +2006 -0
- sage/combinat/graph_path.py +448 -0
- sage/combinat/interval_posets.py +3908 -0
- sage/combinat/nu_tamari_lattice.py +269 -0
- sage/combinat/ordered_tree.py +1446 -0
- sage/combinat/posets/all.py +46 -0
- sage/combinat/posets/bubble_shuffle.py +247 -0
- sage/combinat/posets/cartesian_product.py +493 -0
- sage/combinat/posets/d_complete.py +182 -0
- sage/combinat/posets/elements.py +273 -0
- sage/combinat/posets/forest.py +30 -0
- sage/combinat/posets/hasse_cython.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/posets/hasse_cython.pyx +174 -0
- sage/combinat/posets/hasse_diagram.py +3672 -0
- sage/combinat/posets/hochschild_lattice.py +158 -0
- sage/combinat/posets/incidence_algebras.py +794 -0
- sage/combinat/posets/lattices.py +5117 -0
- sage/combinat/posets/linear_extension_iterator.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/posets/linear_extension_iterator.pyx +292 -0
- sage/combinat/posets/linear_extensions.py +1037 -0
- sage/combinat/posets/mobile.py +275 -0
- sage/combinat/posets/moebius_algebra.py +776 -0
- sage/combinat/posets/poset_examples.py +2178 -0
- sage/combinat/posets/posets.py +9360 -0
- sage/combinat/rooted_tree.py +1070 -0
- sage/combinat/shard_order.py +239 -0
- sage/combinat/tamari_lattices.py +384 -0
- sage/combinat/yang_baxter_graph.py +923 -0
- sage/databases/all__sagemath_graphs.py +1 -0
- sage/databases/knotinfo_db.py +1231 -0
- sage/ext_data/all__sagemath_graphs.py +1 -0
- sage/ext_data/graphs/graph_plot_js.html +330 -0
- sage/ext_data/kenzo/CP2.txt +45 -0
- sage/ext_data/kenzo/CP3.txt +349 -0
- sage/ext_data/kenzo/CP4.txt +4774 -0
- sage/ext_data/kenzo/README.txt +49 -0
- sage/ext_data/kenzo/S4.txt +20 -0
- sage/graphs/all.py +42 -0
- sage/graphs/asteroidal_triples.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/asteroidal_triples.pyx +320 -0
- sage/graphs/base/all.py +1 -0
- sage/graphs/base/boost_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/boost_graph.pxd +106 -0
- sage/graphs/base/boost_graph.pyx +3045 -0
- sage/graphs/base/c_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/c_graph.pxd +106 -0
- sage/graphs/base/c_graph.pyx +5096 -0
- sage/graphs/base/dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/dense_graph.pxd +28 -0
- sage/graphs/base/dense_graph.pyx +801 -0
- sage/graphs/base/graph_backends.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/graph_backends.pxd +5 -0
- sage/graphs/base/graph_backends.pyx +797 -0
- sage/graphs/base/overview.py +85 -0
- sage/graphs/base/sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/sparse_graph.pxd +90 -0
- sage/graphs/base/sparse_graph.pyx +1653 -0
- sage/graphs/base/static_dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_dense_graph.pxd +5 -0
- sage/graphs/base/static_dense_graph.pyx +1032 -0
- sage/graphs/base/static_sparse_backend.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_sparse_backend.pxd +27 -0
- sage/graphs/base/static_sparse_backend.pyx +1583 -0
- sage/graphs/base/static_sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_sparse_graph.pxd +37 -0
- sage/graphs/base/static_sparse_graph.pyx +1375 -0
- sage/graphs/bipartite_graph.py +2732 -0
- sage/graphs/centrality.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/centrality.pyx +1038 -0
- sage/graphs/cographs.py +519 -0
- sage/graphs/comparability.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/comparability.pyx +851 -0
- sage/graphs/connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/connectivity.pxd +157 -0
- sage/graphs/connectivity.pyx +4813 -0
- sage/graphs/convexity_properties.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/convexity_properties.pxd +16 -0
- sage/graphs/convexity_properties.pyx +870 -0
- sage/graphs/digraph.py +4754 -0
- sage/graphs/digraph_generators.py +1993 -0
- sage/graphs/distances_all_pairs.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/distances_all_pairs.pxd +12 -0
- sage/graphs/distances_all_pairs.pyx +2938 -0
- sage/graphs/domination.py +1363 -0
- sage/graphs/dot2tex_utils.py +100 -0
- sage/graphs/edge_connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/edge_connectivity.pyx +1215 -0
- sage/graphs/generators/all.py +1 -0
- sage/graphs/generators/basic.py +1769 -0
- sage/graphs/generators/chessboard.py +538 -0
- sage/graphs/generators/classical_geometries.py +1611 -0
- sage/graphs/generators/degree_sequence.py +235 -0
- sage/graphs/generators/distance_regular.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/generators/distance_regular.pyx +2846 -0
- sage/graphs/generators/families.py +4759 -0
- sage/graphs/generators/intersection.py +565 -0
- sage/graphs/generators/platonic_solids.py +262 -0
- sage/graphs/generators/random.py +2623 -0
- sage/graphs/generators/smallgraphs.py +5741 -0
- sage/graphs/generators/world_map.py +724 -0
- sage/graphs/generic_graph.py +26867 -0
- sage/graphs/generic_graph_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/generic_graph_pyx.pxd +34 -0
- sage/graphs/generic_graph_pyx.pyx +1673 -0
- sage/graphs/genus.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/genus.pyx +622 -0
- sage/graphs/graph.py +9645 -0
- sage/graphs/graph_coloring.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_coloring.pyx +2284 -0
- sage/graphs/graph_database.py +1177 -0
- sage/graphs/graph_decompositions/all.py +1 -0
- sage/graphs/graph_decompositions/bandwidth.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/bandwidth.pyx +428 -0
- sage/graphs/graph_decompositions/clique_separators.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/clique_separators.pyx +616 -0
- sage/graphs/graph_decompositions/cutwidth.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/cutwidth.pyx +753 -0
- sage/graphs/graph_decompositions/fast_digraph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/fast_digraph.pxd +13 -0
- sage/graphs/graph_decompositions/fast_digraph.pyx +212 -0
- sage/graphs/graph_decompositions/graph_products.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/graph_products.pyx +508 -0
- sage/graphs/graph_decompositions/modular_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/modular_decomposition.pxd +27 -0
- sage/graphs/graph_decompositions/modular_decomposition.pyx +1536 -0
- sage/graphs/graph_decompositions/slice_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/slice_decomposition.pxd +18 -0
- sage/graphs/graph_decompositions/slice_decomposition.pyx +1106 -0
- sage/graphs/graph_decompositions/tree_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/tree_decomposition.pxd +17 -0
- sage/graphs/graph_decompositions/tree_decomposition.pyx +1996 -0
- sage/graphs/graph_decompositions/vertex_separation.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/vertex_separation.pxd +5 -0
- sage/graphs/graph_decompositions/vertex_separation.pyx +1963 -0
- sage/graphs/graph_editor.py +82 -0
- sage/graphs/graph_generators.py +3314 -0
- sage/graphs/graph_generators_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_generators_pyx.pyx +95 -0
- sage/graphs/graph_input.py +812 -0
- sage/graphs/graph_latex.py +2064 -0
- sage/graphs/graph_list.py +410 -0
- sage/graphs/graph_plot.py +1756 -0
- sage/graphs/graph_plot_js.py +338 -0
- sage/graphs/hyperbolicity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/hyperbolicity.pyx +1704 -0
- sage/graphs/hypergraph_generators.py +364 -0
- sage/graphs/independent_sets.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/independent_sets.pxd +13 -0
- sage/graphs/independent_sets.pyx +402 -0
- sage/graphs/isgci.py +1033 -0
- sage/graphs/isoperimetric_inequalities.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/isoperimetric_inequalities.pyx +489 -0
- sage/graphs/line_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/line_graph.pyx +743 -0
- sage/graphs/lovasz_theta.py +77 -0
- sage/graphs/matching.py +1633 -0
- sage/graphs/matching_covered_graph.py +3590 -0
- sage/graphs/orientations.py +1489 -0
- sage/graphs/partial_cube.py +459 -0
- sage/graphs/path_enumeration.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/path_enumeration.pyx +2040 -0
- sage/graphs/pq_trees.py +1129 -0
- sage/graphs/print_graphs.py +201 -0
- sage/graphs/schnyder.py +865 -0
- sage/graphs/spanning_tree.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/spanning_tree.pyx +1457 -0
- sage/graphs/strongly_regular_db.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/strongly_regular_db.pyx +3340 -0
- sage/graphs/traversals.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/traversals.pxd +9 -0
- sage/graphs/traversals.pyx +1872 -0
- sage/graphs/trees.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/trees.pxd +15 -0
- sage/graphs/trees.pyx +310 -0
- sage/graphs/tutte_polynomial.py +713 -0
- sage/graphs/views.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/views.pyx +794 -0
- sage/graphs/weakly_chordal.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/weakly_chordal.pyx +604 -0
- sage/groups/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.pxd +38 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.pyx +1666 -0
- sage/knots/all.py +6 -0
- sage/knots/free_knotinfo_monoid.py +507 -0
- sage/knots/gauss_code.py +291 -0
- sage/knots/knot.py +682 -0
- sage/knots/knot_table.py +284 -0
- sage/knots/knotinfo.py +2900 -0
- sage/knots/link.py +4715 -0
- sage/sandpiles/all.py +13 -0
- sage/sandpiles/examples.py +225 -0
- sage/sandpiles/sandpile.py +6365 -0
- sage/topology/all.py +22 -0
- sage/topology/cell_complex.py +1214 -0
- sage/topology/cubical_complex.py +1976 -0
- sage/topology/delta_complex.py +1806 -0
- sage/topology/filtered_simplicial_complex.py +744 -0
- sage/topology/moment_angle_complex.py +823 -0
- sage/topology/simplicial_complex.py +5160 -0
- sage/topology/simplicial_complex_catalog.py +92 -0
- sage/topology/simplicial_complex_examples.py +1680 -0
- sage/topology/simplicial_complex_homset.py +205 -0
- sage/topology/simplicial_complex_morphism.py +836 -0
- sage/topology/simplicial_set.py +4102 -0
- sage/topology/simplicial_set_catalog.py +55 -0
- sage/topology/simplicial_set_constructions.py +2954 -0
- sage/topology/simplicial_set_examples.py +865 -0
- 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
|