<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_hyperedge_id(self, nodes):
 """From a set of nodes, returns the ID of the hyperedge that this set comprises. :param nodes: iterable container of references to nodes in the the hyperedge to be added :returns: str -- ID of the hyperedge that has that the specified node set comprises. :raises: ValueError -- No such hyperedge exists. Examples: :: ("A", "D"), set(["B", "D"])) """

        frozen_nodes = frozenset(nodes)

        if not self.has_hyperedge(frozen_nodes):
            raise ValueError("No such hyperedge exists.")

        return self._node_set_to_hyperedge[frozen_nodes]