docs: def get_predecessors(self, head):
          """Given a head set of nodes, get a list of edges of which the node set
          is the head of each edge.
  
          :param head: set of nodes that correspond to the heads of some
                          (possibly empty) set of edges.
          :returns: set -- hyperedge_ids of the hyperedges that have head
                  in the head.
          """
          frozen_head = frozenset(head)
          # If this node set isn't any head in the hypergraph, then it has
          # no predecessors; thus, return an empty list
          if frozen_head not in self._predecessors:
              return set()
  
          return set(self._predecessors[frozen_head].values())