Skip to content

Commit 23dd178

Browse files
author
Release Manager
committed
gh-40705: use the finer new categories for some lattice posets in library namely declare some known properties as categories, as allowed by #39554 ### 📝 Checklist - [x] The title is concise and informative. - [x] The description explains in detail what this PR is about. URL: #40705 Reported by: Frédéric Chapoton Reviewer(s): Frédéric Chapoton, Martin Rubey
2 parents 12e53a7 + c27cba6 commit 23dd178

File tree

6 files changed

+41
-21
lines changed

6 files changed

+41
-21
lines changed

src/sage/categories/finite_coxeter_groups.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ def m_cambrian_lattice(self, c, m=1, on_roots=False):
570570
sage: CoxeterGroup(["A",2]).m_cambrian_lattice((1,2),2)
571571
Finite lattice containing 12 elements
572572
"""
573+
from sage.categories.finite_lattice_posets import FiniteLatticePosets
573574
from sage.combinat.posets.lattices import LatticePoset
574575
if hasattr(c, "reduced_word"):
575576
c = c.reduced_word()
@@ -627,7 +628,11 @@ def m_cambrian_lattice(self, c, m=1, on_roots=False):
627628
if cov_element not in elements:
628629
new.add(cov_element)
629630
covers.append((new_element, cov_element))
630-
return LatticePoset([elements, covers], cover_relations=True)
631+
cat = FiniteLatticePosets()
632+
if m == 1:
633+
cat = cat.CongruenceUniform().Trim()
634+
return LatticePoset([elements, covers], cover_relations=True,
635+
category=cat)
631636

632637
def cambrian_lattice(self, c, on_roots=False):
633638
"""

src/sage/combinat/nu_tamari_lattice.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
#
6767
# https://www.gnu.org/licenses/
6868
# ****************************************************************************
69+
from sage.categories.finite_lattice_posets import FiniteLatticePosets
6970
from sage.combinat.nu_dyck_word import NuDyckWords, NuDyckWord
7071
from sage.combinat.posets.lattices import LatticePoset
7172

@@ -111,7 +112,8 @@ def NuTamariLattice(nu):
111112
new_ndw = ndw.mutate(i)
112113
if new_ndw is not None:
113114
covers.append([ndw, new_ndw])
114-
return LatticePoset([elements, covers])
115+
cat = FiniteLatticePosets().Trim().CongruenceUniform()
116+
return LatticePoset([elements, covers], cover_relations=True, category=cat)
115117

116118

117119
def delta_swap(p, k, delta):
@@ -220,7 +222,7 @@ def AltNuTamariLattice(nu, delta=None):
220222
Finite lattice containing 7 elements
221223
sage: AltNuTamariLattice('01001') == AltNuTamariLattice('01001', [2, 0])
222224
True
223-
sage: nu = '00100100101'; P = AltNuTamariLattice(nu); Q = NuTamariLattice(nu); P == Q
225+
sage: nu = '00100100101'; P = AltNuTamariLattice(nu); Q = NuTamariLattice(nu); P.is_isomorphic(Q)
224226
True
225227
226228
TESTS::

src/sage/combinat/posets/bubble_shuffle.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"""
1717
from typing import Iterator
1818

19+
from sage.categories.finite_lattice_posets import FiniteLatticePosets
1920
from sage.combinat.posets.lattices import LatticePoset
2021
from sage.combinat.subset import subsets
2122
from sage.combinat.shuffle import ShuffleProduct
@@ -169,7 +170,8 @@ def BubblePoset(m, n) -> LatticePoset:
169170

170171
dg = DiGraph([(x, y) for x in bubbles for y in bubble_coverings(m, n, x)])
171172
# here we have more than just the cover relations
172-
return LatticePoset(dg)
173+
cat = FiniteLatticePosets().CongruenceUniform().Extremal()
174+
return LatticePoset(dg, category=cat)
173175

174176

175177
def ShufflePoset(m, n) -> LatticePoset:

src/sage/combinat/posets/hochschild_lattice.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"""
1919
from typing import Iterator
2020

21+
from sage.categories.finite_lattice_posets import FiniteLatticePosets
2122
from sage.combinat.posets.lattices import LatticePoset
2223
from sage.graphs.digraph import DiGraph
2324
from sage.topology.simplicial_complex import SimplicialComplex
@@ -101,7 +102,8 @@ def cover_relations(a):
101102

102103
dg = DiGraph({a: list(cover_relations(a)) for a in verts},
103104
format="dict_of_lists")
104-
return LatticePoset(dg.reverse(), cover_relations=True, check=False)
105+
return LatticePoset(dg.reverse(), cover_relations=True, check=False,
106+
category=FiniteLatticePosets().CongruenceUniform())
105107

106108

107109
def hochschild_fan(n):

src/sage/combinat/posets/lattices.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def atoms(self):
337337
return []
338338
return self.upper_covers(self.bottom())
339339

340-
def submeetsemilattice(self, elms):
340+
def submeetsemilattice(self, elms, **kwds):
341341
r"""
342342
Return the smallest meet-subsemilattice containing elements on the given list.
343343
@@ -377,9 +377,9 @@ def submeetsemilattice(self, elms):
377377
gens_remaining.add(self.meet(x, g))
378378
current_set.add(g)
379379

380-
return MeetSemilattice(self.subposet(current_set))
380+
return MeetSemilattice(self.subposet(current_set), **kwds)
381381

382-
def subjoinsemilattice(self, elms):
382+
def subjoinsemilattice(self, elms, **kwds):
383383
r"""
384384
Return the smallest join-subsemilattice containing elements on the given list.
385385
@@ -419,7 +419,7 @@ def subjoinsemilattice(self, elms):
419419
gens_remaining.add(self.join(x, g))
420420
current_set.add(g)
421421

422-
return JoinSemilattice(self.subposet(current_set))
422+
return JoinSemilattice(self.subposet(current_set), **kwds)
423423

424424
def pseudocomplement(self, element):
425425
r"""
@@ -1125,6 +1125,9 @@ def is_stone(self, certificate=False) -> bool | tuple:
11251125
``(False, e)`` such that `e^* \vee e^{**} \neq \top`.
11261126
If ``certificate=False`` return ``True`` or ``False``.
11271127
1128+
If the lattice is not distributive, the result is either
1129+
``(False, None)`` or ``False``.
1130+
11281131
EXAMPLES:
11291132
11301133
Divisor lattices are canonical example::
@@ -1156,7 +1159,7 @@ def is_stone(self, certificate=False) -> bool | tuple:
11561159
# is extended to directed, use that; see comment below.
11571160

11581161
if not self.is_distributive():
1159-
raise ValueError("the lattice is not distributive")
1162+
return (False, None) if certificate else False
11601163

11611164
from sage.arith.misc import factor
11621165
ok = (True, None) if certificate else True
@@ -2346,7 +2349,8 @@ def skeleton(self):
23462349
return self
23472350
elms = [self._vertex_to_element(v) for v in
23482351
self._hasse_diagram.skeleton()]
2349-
return LatticePoset(self.subposet(elms))
2352+
return LatticePoset(self.subposet(elms),
2353+
category=FiniteLatticePosets().Stone())
23502354

23512355
def is_orthocomplemented(self, unique=False) -> bool:
23522356
"""
@@ -3234,7 +3238,7 @@ def is_vertically_decomposable(self, certificate=False) -> bool | tuple:
32343238
return (True, self._vertex_to_element(e))
32353239
return True
32363240

3237-
def sublattice(self, elms):
3241+
def sublattice(self, elms, **kwds):
32383242
r"""
32393243
Return the smallest sublattice containing elements on the given list.
32403244
@@ -3268,7 +3272,7 @@ def sublattice(self, elms):
32683272
gens_remaining.add(self.meet(x, g))
32693273
current_set.add(g)
32703274

3271-
return LatticePoset(self.subposet(current_set))
3275+
return LatticePoset(self.subposet(current_set), **kwds)
32723276

32733277
def is_sublattice(self, other) -> bool:
32743278
"""
@@ -3766,7 +3770,8 @@ def center(self):
37663770
"""
37673771
neutrals = self.neutral_elements()
37683772
comps = self.complements()
3769-
return self.sublattice([e for e in neutrals if e in comps])
3773+
return self.sublattice([e for e in neutrals if e in comps],
3774+
category=FiniteLatticePosets().Stone())
37703775

37713776
def is_dismantlable(self, certificate=False) -> bool | tuple:
37723777
r"""

src/sage/combinat/posets/poset_examples.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ def BooleanLattice(n, facade=None, use_subsets=False):
281281
for y in range(n) if v & (1 << y) == 0]
282282
for v in range(2**n)})
283283
return FiniteLatticePoset(hasse_diagram=D,
284-
category=FiniteLatticePosets(),
284+
category=FiniteLatticePosets().Stone(),
285285
facade=facade)
286286

287287
BubblePoset = staticmethod(bubble_shuffle.BubblePoset)
@@ -332,7 +332,7 @@ def ChainPoset(n, facade=None):
332332
D = DiGraph([range(n), [[x, x + 1] for x in range(n - 1)]],
333333
format='vertices_and_edges')
334334
return FiniteLatticePoset(hasse_diagram=D,
335-
category=FiniteLatticePosets(),
335+
category=FiniteLatticePosets().Stone(),
336336
facade=facade)
337337

338338
@staticmethod
@@ -413,7 +413,8 @@ def PentagonPoset(facade=None):
413413
sage: posets.DiamondPoset(5).is_distributive()
414414
False
415415
"""
416-
return LatticePoset([[1, 2], [4], [3], [4], []], facade=facade)
416+
return LatticePoset([[1, 2], [4], [3], [4], []], facade=facade,
417+
category=FiniteLatticePosets().CongruenceUniform())
417418

418419
@staticmethod
419420
def DiamondPoset(n, facade=None):
@@ -439,8 +440,10 @@ def DiamondPoset(n, facade=None):
439440
c[0] = list(range(1, n - 1))
440441
c[n - 1] = []
441442
D = DiGraph({v: c[v] for v in range(n)}, format='dict_of_lists')
442-
return FiniteLatticePoset(hasse_diagram=D,
443-
category=FiniteLatticePosets(),
443+
cat = FiniteLatticePosets()
444+
if n <= 4:
445+
cat = cat.Stone()
446+
return FiniteLatticePoset(hasse_diagram=D, category=cat,
444447
facade=facade)
445448

446449
@staticmethod
@@ -777,7 +780,8 @@ def ProductOfChains(chain_lengths, facade=None):
777780

778781
def compare(a, b):
779782
return all(x <= y for x, y in zip(a, b))
780-
return LatticePoset([elements, compare], facade=facade)
783+
return LatticePoset([elements, compare], facade=facade,
784+
category=FiniteLatticePosets().Distributive())
781785

782786
@staticmethod
783787
def RandomPoset(n, p):
@@ -1639,7 +1643,7 @@ def DoubleTailedDiamond(n):
16391643
edges.extend([(n, n + 1), (n, n + 2), (n + 1, n + 3), (n + 2, n + 3)])
16401644
edges.extend((i, i + 1) for i in range(n + 3, 2 * n + 2))
16411645
p = DiGraph([list(range(1, 2 * n + 3)), edges])
1642-
return DCompletePoset(p)
1646+
return DCompletePoset(p, category=FiniteLatticePosets().Distributive())
16431647

16441648
@staticmethod
16451649
def PermutationPattern(n):

0 commit comments

Comments
 (0)