Exemplo n.º 1
0
    def _is_valid_ribbon(self, ribbon):
        r"""
        Return ``True`` if a ribbon has at most one anchor, no vertex has two
        or more anchors, and every hanging poset is d-complete.

        INPUT:

        - ``ribbon`` -- a list of elements that form a ribbon in your poset

        TESTS::

            sage: P = posets.RibbonPoset(5, [2])
            sage: P._is_valid_ribbon([0,1,2,3,4])
            True
            sage: P._is_valid_ribbon([2])
            False
            sage: P._is_valid_ribbon([2,3,4])
            True
            sage: P._is_valid_ribbon([2,3])
            True
        """
        ribbon = [self._element_to_vertex(x) for x in ribbon]
        G = self._hasse_diagram
        G_un = G.to_undirected().copy(immutable=False)
        R = G.subgraph(ribbon)
        num_anchors = 0

        for r in ribbon:
            anchor_neighbors = set(G.neighbors_out(r)).difference(
                set(R.neighbors_out(r)))
            if len(anchor_neighbors) == 1:
                num_anchors += 1
            elif len(anchor_neighbors) > 1:
                return False

            for lc in G.neighbors_in(r):
                if lc in ribbon:
                    continue

                G_un.delete_edge(lc, r)
                P = Poset(
                    G.subgraph(G_un.connected_component_containing_vertex(lc)))
                if P.top() != lc or not P.is_d_complete():
                    return False
                G_un.add_edge(lc, r)

        return True