Skip to content

Commit df198d0

Browse files
author
Release Manager
committed
gh-35969: Improve method reverse for digraphs We improve method ``reverse`` to ensure that the returned digraph has the same attributes than the original digraph (mutability, multiple edges, loops, vertex positions, etc.). We also add parameter `immutable` to decide if the return graph should have the same setting as the original digraph or forced it to be (im)mutable. On the way, we do minor corrections in method `feedback_edge_set`. ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> <!-- If your change requires a documentation PR, please link it appropriately --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> <!-- Feel free to remove irrelevant items. --> - [x] The title is concise, informative, and self-explanatory. - [x] The description explains in detail what this PR is about. - [ ] I have linked a relevant issue or discussion. - [x] I have created tests covering the changes. - [ ] I have updated the documentation accordingly. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on - #12345: short description why this is a dependency - #34567: ... --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> URL: #35969 Reported by: David Coudert Reviewer(s): David Coudert, Matthias Köppe
2 parents de15e88 + 05e3ba6 commit df198d0

File tree

2 files changed

+157
-88
lines changed

2 files changed

+157
-88
lines changed

src/sage/combinat/posets/hasse_diagram.py

Lines changed: 72 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ def dual(self):
574574
sage: H.is_isomorphic( H.dual() ) # optional - sage.combinat
575575
False
576576
"""
577-
H = self.reverse()
577+
H = self.reverse(immutable=False)
578578
H.relabel(perm=list(range(H.num_verts() - 1, -1, -1)), inplace=True)
579579
return HasseDiagram(H)
580580

@@ -1068,28 +1068,27 @@ def moebius_function_matrix(self, algorithm='cython'):
10681068
10691069
TESTS::
10701070
1071-
sage: H.moebius_function_matrix().is_immutable() # optional - sage.libs.flint sage.modules
1071+
sage: # needs sage.modules sage.libs.flint
1072+
sage: H.moebius_function_matrix().is_immutable()
10721073
True
1073-
sage: hasattr(H,'_moebius_function_matrix') # optional - sage.libs.flint sage.modules
1074+
sage: hasattr(H,'_moebius_function_matrix')
10741075
True
1075-
1076-
sage: H.moebius_function == H._moebius_function_from_matrix # optional - sage.libs.flint sage.modules
1076+
sage: H.moebius_function == H._moebius_function_from_matrix
10771077
True
1078-
10791078
sage: H = posets.TamariLattice(3)._hasse_diagram
1080-
sage: M = H.moebius_function_matrix('matrix'); M # optional - sage.modules
1079+
sage: M = H.moebius_function_matrix('matrix'); M
10811080
[ 1 -1 -1 0 1]
10821081
[ 0 1 0 0 -1]
10831082
[ 0 0 1 -1 0]
10841083
[ 0 0 0 1 -1]
10851084
[ 0 0 0 0 1]
1086-
sage: _ = H.__dict__.pop('_moebius_function_matrix') # optional - sage.modules
1087-
sage: H.moebius_function_matrix('cython') == M # optional - sage.libs.flint sage.modules
1085+
sage: _ = H.__dict__.pop('_moebius_function_matrix')
1086+
sage: H.moebius_function_matrix('cython') == M
10881087
True
1089-
sage: _ = H.__dict__.pop('_moebius_function_matrix') # optional - sage.libs.flint sage.modules
1090-
sage: H.moebius_function_matrix('recursive') == M # optional - sage.modules
1088+
sage: _ = H.__dict__.pop('_moebius_function_matrix')
1089+
sage: H.moebius_function_matrix('recursive') == M
10911090
True
1092-
sage: _ = H.__dict__.pop('_moebius_function_matrix') # optional - sage.modules
1091+
sage: _ = H.__dict__.pop('_moebius_function_matrix')
10931092
sage: H.moebius_function_matrix('banana')
10941093
Traceback (most recent call last):
10951094
...
@@ -1160,25 +1159,27 @@ def coxeter_transformation(self, algorithm='cython'):
11601159
11611160
EXAMPLES::
11621161
1163-
sage: P = posets.PentagonPoset()._hasse_diagram # optional - sage.modules
1164-
sage: M = P.coxeter_transformation(); M # optional - sage.libs.flint sage.modules
1162+
sage: # needs sage.libs.flint sage.modules
1163+
sage: P = posets.PentagonPoset()._hasse_diagram
1164+
sage: M = P.coxeter_transformation(); M
11651165
[ 0 0 0 0 -1]
11661166
[ 0 0 0 1 -1]
11671167
[ 0 1 0 0 -1]
11681168
[-1 1 1 0 -1]
11691169
[-1 1 0 1 -1]
1170-
sage: P.__dict__['coxeter_transformation'].clear_cache() # optional - sage.libs.flint sage.modules
1171-
sage: P.coxeter_transformation(algorithm="matrix") == M # optional - sage.libs.flint sage.modules
1170+
sage: P.__dict__['coxeter_transformation'].clear_cache()
1171+
sage: P.coxeter_transformation(algorithm="matrix") == M
11721172
True
11731173
11741174
TESTS::
11751175
1176-
sage: P = posets.PentagonPoset()._hasse_diagram # optional - sage.modules
1177-
sage: M = P.coxeter_transformation() # optional - sage.libs.flint sage.modules
1178-
sage: M**8 == 1 # optional - sage.libs.flint sage.modules
1176+
sage: # needs sage.libs.flint sage.modules
1177+
sage: P = posets.PentagonPoset()._hasse_diagram
1178+
sage: M = P.coxeter_transformation()
1179+
sage: M**8 == 1
11791180
True
1180-
sage: P.__dict__['coxeter_transformation'].clear_cache() # optional - sage.libs.flint sage.modules
1181-
sage: P.coxeter_transformation(algorithm="banana") # optional - sage.libs.flint sage.modules
1181+
sage: P.__dict__['coxeter_transformation'].clear_cache()
1182+
sage: P.coxeter_transformation(algorithm="banana")
11821183
Traceback (most recent call last):
11831184
...
11841185
ValueError: unknown algorithm
@@ -2222,24 +2223,22 @@ def antichains_iterator(self):
22222223
22232224
EXAMPLES::
22242225
2225-
sage: P = posets.PentagonPoset() # optional - sage.modules
2226-
sage: H = P._hasse_diagram # optional - sage.modules
2227-
sage: H.antichains_iterator() # optional - sage.modules
2226+
sage: # needs sage.modules
2227+
sage: P = posets.PentagonPoset()
2228+
sage: H = P._hasse_diagram
2229+
sage: H.antichains_iterator()
22282230
<generator object ...antichains_iterator at ...>
2229-
sage: list(H.antichains_iterator()) # optional - sage.modules
2231+
sage: list(H.antichains_iterator())
22302232
[[], [4], [3], [2], [1], [1, 3], [1, 2], [0]]
2231-
22322233
sage: from sage.combinat.posets.hasse_diagram import HasseDiagram
22332234
sage: H = HasseDiagram({0:[1,2],1:[4],2:[3],3:[4]})
2234-
sage: list(H.antichains_iterator()) # optional - sage.modules
2235+
sage: list(H.antichains_iterator())
22352236
[[], [4], [3], [2], [1], [1, 3], [1, 2], [0]]
2236-
22372237
sage: H = HasseDiagram({0:[],1:[],2:[]})
2238-
sage: list(H.antichains_iterator()) # optional - sage.modules
2238+
sage: list(H.antichains_iterator())
22392239
[[], [2], [1], [1, 2], [0], [0, 2], [0, 1], [0, 1, 2]]
2240-
22412240
sage: H = HasseDiagram({0:[1],1:[2],2:[3],3:[4]})
2242-
sage: list(H.antichains_iterator()) # optional - sage.modules
2241+
sage: list(H.antichains_iterator())
22432242
[[], [4], [3], [2], [1], [0]]
22442243
22452244
TESTS::
@@ -2279,12 +2278,13 @@ def are_incomparable(self, i, j):
22792278
22802279
EXAMPLES::
22812280
2282-
sage: P = posets.PentagonPoset() # optional - sage.modules
2283-
sage: H = P._hasse_diagram # optional - sage.modules
2284-
sage: H.are_incomparable(1,2) # optional - sage.modules
2281+
sage: # needs sage.modules
2282+
sage: P = posets.PentagonPoset()
2283+
sage: H = P._hasse_diagram
2284+
sage: H.are_incomparable(1,2)
22852285
True
2286-
sage: V = H.vertices(sort=True) # optional - sage.modules
2287-
sage: [ (i,j) for i in V for j in V if H.are_incomparable(i,j)] # optional - sage.modules
2286+
sage: V = H.vertices(sort=True)
2287+
sage: [ (i,j) for i in V for j in V if H.are_incomparable(i,j)]
22882288
[(1, 2), (1, 3), (2, 1), (3, 1)]
22892289
"""
22902290
if i == j:
@@ -2304,12 +2304,13 @@ def are_comparable(self, i, j):
23042304
23052305
EXAMPLES::
23062306
2307-
sage: P = posets.PentagonPoset() # optional - sage.modules
2308-
sage: H = P._hasse_diagram # optional - sage.modules
2309-
sage: H.are_comparable(1,2) # optional - sage.modules
2307+
sage: # needs sage.modules
2308+
sage: P = posets.PentagonPoset()
2309+
sage: H = P._hasse_diagram
2310+
sage: H.are_comparable(1,2)
23102311
False
2311-
sage: V = H.vertices(sort=True) # optional - sage.modules
2312-
sage: [ (i,j) for i in V for j in V if H.are_comparable(i,j)] # optional - sage.modules
2312+
sage: V = H.vertices(sort=True)
2313+
sage: [ (i,j) for i in V for j in V if H.are_comparable(i,j)]
23132314
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 4),
23142315
(2, 0), (2, 2), (2, 3), (2, 4), (3, 0), (3, 2), (3, 3), (3, 4),
23152316
(4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]
@@ -2331,26 +2332,27 @@ def antichains(self, element_class=list):
23312332
23322333
EXAMPLES::
23332334
2334-
sage: P = posets.PentagonPoset() # optional - sage.modules
2335-
sage: H = P._hasse_diagram # optional - sage.modules
2336-
sage: A = H.antichains() # optional - sage.modules
2337-
sage: list(A) # optional - sage.modules
2335+
sage: # needs sage.modules
2336+
sage: P = posets.PentagonPoset()
2337+
sage: H = P._hasse_diagram
2338+
sage: A = H.antichains()
2339+
sage: list(A)
23382340
[[], [0], [1], [1, 2], [1, 3], [2], [3], [4]]
2339-
sage: A.cardinality() # optional - sage.modules
2341+
sage: A.cardinality()
23402342
8
2341-
sage: [1,3] in A # optional - sage.modules
2343+
sage: [1,3] in A
23422344
True
2343-
sage: [1,4] in A # optional - sage.modules
2345+
sage: [1,4] in A
23442346
False
23452347
23462348
TESTS::
23472349
2348-
sage: TestSuite(A).run() # optional - sage.modules
2349-
2350-
sage: A = Poset()._hasse_diagram.antichains() # optional - sage.modules
2351-
sage: list(A) # optional - sage.modules
2350+
sage: # needs sage.modules
2351+
sage: TestSuite(A).run()
2352+
sage: A = Poset()._hasse_diagram.antichains()
2353+
sage: list(A)
23522354
[[]]
2353-
sage: TestSuite(A).run() # optional - sage.modules
2355+
sage: TestSuite(A).run()
23542356
"""
23552357
from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
23562358
return PairwiseCompatibleSubsets(self.vertices(sort=True),
@@ -2382,23 +2384,25 @@ def chains(self, element_class=list, exclude=None, conversion=None):
23822384
23832385
EXAMPLES::
23842386
2385-
sage: P = posets.PentagonPoset() # optional - sage.modules
2386-
sage: H = P._hasse_diagram # optional - sage.modules
2387-
sage: A = H.chains() # optional - sage.modules
2388-
sage: list(A) # optional - sage.modules
2387+
sage: # needs sage.modules
2388+
sage: P = posets.PentagonPoset()
2389+
sage: H = P._hasse_diagram
2390+
sage: A = H.chains()
2391+
sage: list(A)
23892392
[[], [0], [0, 1], [0, 1, 4], [0, 2], [0, 2, 3], [0, 2, 3, 4], [0, 2, 4],
23902393
[0, 3], [0, 3, 4], [0, 4], [1], [1, 4], [2], [2, 3], [2, 3, 4], [2, 4],
23912394
[3], [3, 4], [4]]
2392-
sage: A.cardinality() # optional - sage.modules
2395+
sage: A.cardinality()
23932396
20
2394-
sage: [1,3] in A # optional - sage.modules
2397+
sage: [1,3] in A
23952398
False
2396-
sage: [1,4] in A # optional - sage.modules
2399+
sage: [1,4] in A
23972400
True
23982401
23992402
One can exclude some vertices::
24002403
2401-
sage: list(H.chains(exclude=[4, 3])) # optional - sage.modules
2404+
sage: # needs sage.modules
2405+
sage: list(H.chains(exclude=[4, 3]))
24022406
[[], [0], [0, 1], [0, 2], [1], [2]]
24032407
24042408
The ``element_class`` keyword determines how the chains are
@@ -2426,16 +2430,16 @@ def is_linear_interval(self, t_min, t_max) -> bool:
24262430
This means that this interval is a total order.
24272431
24282432
EXAMPLES::
2429-
2430-
sage: P = posets.PentagonPoset() # optional - sage.modules
2431-
sage: H = P._hasse_diagram # optional - sage.modules
2432-
sage: H.is_linear_interval(0, 4) # optional - sage.modules
2433+
sage: # needs sage.modules
2434+
sage: P = posets.PentagonPoset()
2435+
sage: H = P._hasse_diagram
2436+
sage: H.is_linear_interval(0, 4)
24332437
False
2434-
sage: H.is_linear_interval(0, 3) # optional - sage.modules
2438+
sage: H.is_linear_interval(0, 3)
24352439
True
2436-
sage: H.is_linear_interval(1, 3) # optional - sage.modules
2440+
sage: H.is_linear_interval(1, 3)
24372441
False
2438-
sage: H.is_linear_interval(1, 1) # optional - sage.modules
2442+
sage: H.is_linear_interval(1, 1)
24392443
True
24402444
24412445
TESTS::

0 commit comments

Comments
 (0)