docs: def get_symmetric_image(self):
          """Creates a new DirectedHypergraph object that is the symmetric
          image of this hypergraph (i.e., identical hypergraph with all
          edge directions reversed).
          Copies of each of the nodes' and hyperedges' attributes are stored
          and used in the new hypergraph.
  
          :returns: DirectedHypergraph -- a new hypergraph that is the symmetric
                  image of the current hypergraph.
  
          """
          new_H = self.copy()
  
          # No change to _node_attributes necessary, as nodes remain the same
  
          # Reverse the tail and head (and __frozen_tail and __frozen_head) for
          # every hyperedge
          for hyperedge_id in self.get_hyperedge_id_set():
              attr_dict = new_H._hyperedge_attributes[hyperedge_id]
              attr_dict["tail"], attr_dict["head"] = \
                  attr_dict["head"], attr_dict["tail"]
              attr_dict["__frozen_tail"], attr_dict["__frozen_head"] = \
                  attr_dict["__frozen_head"], attr_dict["__frozen_tail"]
  
          # Reverse the definition of forward star and backward star
          new_H._forward_star, new_H._backward_star = \
              new_H._backward_star, new_H._forward_star
  
          # Reverse the definition of successor and predecessor
          new_H._successors, new_H._predecessors = \
              new_H._predecessors, new_H._successors
  
          return new_H