#19659: Poset: inverse function of ordinal_sum()
-----------------------------+----------------------------------
Reporter: jmantysalo | Owner:
Type: enhancement | Status: new
Priority: major | Milestone: sage-6.10
Component: combinatorics | Keywords: poset
Merged in: | Authors: Jori Mäntysalo
Reviewers: | Report Upstream: N/A
Work issues: | Branch:
Commit: | Dependencies:
Stopgaps: |
-----------------------------+----------------------------------
I suggest adding a function that decomposes a poset "vertically", i.e. has
same relationship to `ordinal_sum()` as `connected_components()` has to
`disjoint_union()`.
I am not sure about the name. Work name is `ordinal_decomposition`. Maybe
it could be `ordinal_components` or `vertical_components`.
Here is the code to add to `hasse_diagram.py`. I suppose not to have time
to make this a patch file for few days. Feel free to comment.
{{{
def ordinal_decomposition(self):
r"""
Return the ordinal decomposition of the poset.
This function is kind of inverse to ordinal_sum(). Ordinal
decomposition of a poset `P` is the list of posets
`P_1, \ldots, P_n` so that `P` is ordinal decomposition of them.
OUTPUT:
List of numbers `e_1, \ldots, e_n`
so that `P_1` is subposet containing `0, \ldots, e_1`,
`P_2` is subposet containing `e_1+1, \ldots, e_2` and so on.
ALGORITHM::
Suppose that poset `P` is the ordinal sum of posets `L` and
`U`. Then `P` contains maximal antichains `l` and `u` such that
every element of `u` covers exactly every element of `l` and
every element of `l` is covered by exactly every element of `u`;
they
correspond to maximal elements of `L` and minimal elements
of `U`.
We know that the Hasse diagram is a topologically sorted DAG,
starting numbering from zero. Hence, if `L` has `n` elements,
then `l` contains element `n-1` and `u` contains element
`n`.
We keep track of the maximal elements of subposet induced
by elements 0..e and minimal elements of subposet induced
by elements e+1..n, incrementing e one by one. Then we just
check if they can be `l` and `u` in previous description.
EXAMPLES::
sage: from sage.combinat.posets.hasse_diagram import HasseDiagram
sage: H = HasseDiagram({0:[2], 1:[2, 3], 2:[4, 5, 6], 3:[4, 5, 6],
....: 4:[7], 5:[7], 6:[7], 7:[8]})
sage: H.ordinal_decomposition()
[3, 6, 7, 8]
TESTS::
sage: from sage.misc.prandom import randint
sage: n = randint(1, 10)
sage: P = Posets.RandomPoset(n, 0.1)
sage: H = P.ordinal_sum(P)._hasse_diagram
sage: m = H.ordinal_decomposition()
sage: n in m
True
"""
cut_points = []
n = self.order()
in_degrees = [len(self.neighbors_in(e)) for e in range(n)]
lower = set([])
upper = set(self.sources())
for e in range(n):
lower.add(e)
for lc in self.neighbors_in(e):
lower.discard(lc)
upper.discard(e)
up_covers = self.neighbors_out(e)
for uc in up_covers:
in_degrees[uc] -= 1
if in_degrees[uc] == 0:
upper.add(uc)
if e+1 in up_covers:
for l in lower:
if set(self.neighbors_out(l)) != upper:
break
else:
cut_points.append(e)
cut_points.append(n-1)
return cut_points
}}}
--
Ticket URL: <http://trac.sagemath.org/ticket/19659>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.