              in the frame
          """
          if not self._hashes_to_frame:
              logger.debug("Generating hashes to frame")
              for frame_name, faces in self.data.items():
                  for idx, face in enumerate(faces):
                      self._hashes_to_frame.setdefault(face["hash"], dict())[frame_name] = idx
          return self._hashes_to_frame
  
      # << INIT FUNCTIONS >> #
  
 
</s> remove         """ Return :attr:`_hashes_to_frame`. Generate it if it does not exist.
            The dict is of each face_hash with their parent frame name(s) and their index
            in the frame
 </s> add         """ dict: The SHA1 hash of the face mapped to the frame(s) and face index within the frame
        that the hash corresponds to. The structure of the dictionary is:

        {**SHA1_hash** (`str`): {**filename** (`str`): **face_index** (`int`)}}.

        Notes
        -----
        The first time this property is referenced, the dictionary will be created and cached.
        Subsequent references will be made to this cached dictionary. </s> remove             yield frame_name, alignments, face_count, frame_fullname

    @staticmethod
    def yield_original_index_reverse(image_alignments, number_alignments):
        """ Return the correct original index for
            alignment in reverse order """
        for idx, _ in enumerate(reversed(image_alignments)):
            original_idx = number_alignments - 1 - idx
            logger.trace("Yielding: face index %s", original_idx)
            yield original_idx
 </s> add             yield frame_name, val["faces"], face_count, frame_fullname </s> remove         hashset = set(hashlist)
        for filename, frame in self.data.items():
            for idx, face in reversed(list(enumerate(frame))):
 </s> add         hashset = set(hash_list)
        for filename, val in self._data.items():
            for idx, face in reversed(list(enumerate(val["faces"]))): </s> remove         """ Yield face alignments for one image """
        for frame_fullname, alignments in self.data.items():
 </s> add         """ Generator to obtain all faces with meta information from :attr:`data`. The results
        are yielded by frame.

        Notes
        -----
        The yielded order is non-deterministic.

        Yields
        ------
        frame_name: str
            The frame name that the face belongs to. This is the base name of the frame, as it
            appears in :attr:`data`, not the full path
        faces: list
            The list of face `dict` objects that exist for this frame
        face_count: int
            The number of faces that exist within :attr:`data` for this frame
        frame_fullname: str
            The full path (folder and filename) for the yielded frame
        """
        for frame_fullname, val in self._data.items():
            for frame_name, val in self._data.items():
                for idx, face in enumerate(val["faces"]):
              in the frame
          """
          if not self._hashes_to_frame:
              logger.debug("Generating hashes to frame")
            for frame_name, val in self._data.items():
                for idx, face in enumerate(val["faces"]):
            for frame_name, val in self._data.items():
                for idx, face in enumerate(val["faces"]):
                      self._hashes_to_frame.setdefault(face["hash"], dict())[frame_name] = idx
          return self._hashes_to_frame
  
      # << INIT FUNCTIONS >> #
  
keep keep keep keep replace replace keep keep keep keep keep
 lib.alignments - Slight update (#978)

* lib.alignments update:
  - Minor structure change (faces to nested dictionary)
  - Refactor internal and external methods
  - Documentation 
lib/alignments.py