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