docs: def deep_eq(fst_obj, snd_obj):
      """Compares whether fst_obj and snd_obj are deeply equal.
  
      In case when both fst_obj and snd_obj are of type np.ndarray or either np.memmap, they are compared using
      np.array_equal(fst_obj, snd_obj). Otherwise, when they are lists or tuples, they are compared for length and then
      deep_eq is applied component-wise. When they are dict, they are compared for key set equality, and then deep_eq is
      applied value-wise. For all other data types that are not list, tuple, dict, or np.ndarray, the method falls back
      to the __eq__ method.
  
      Because np.ndarray is not a hashable object, it is impossible to form a set of numpy arrays, hence deep_eq works
      correctly.
  
      :param fst_obj: First object compared
      :param snd_obj: Second object compared
      :return: `True` if objects are deeply equal, `False` otherwise
      """
      # pylint: disable=too-many-return-statements
      if isinstance(fst_obj, (np.ndarray, np.memmap)):
          if not isinstance(snd_obj, (np.ndarray, np.memmap)):
              return False
  
          if fst_obj.dtype != snd_obj.dtype:
              return False
  
          fst_nan_mask = np.isnan(fst_obj)
          snd_nan_mask = np.isnan(snd_obj)
  
          return np.array_equal(fst_obj[~fst_nan_mask], snd_obj[~snd_nan_mask]) and \
              np.array_equal(fst_nan_mask, snd_nan_mask)
  
      if not isinstance(fst_obj, type(snd_obj)):
          return False
  
      if isinstance(fst_obj, np.ndarray):
          if fst_obj.dtype != snd_obj.dtype:
              return False
          fst_nan_mask = np.isnan(fst_obj)
          snd_nan_mask = np.isnan(snd_obj)
          return np.array_equal(fst_obj[~fst_nan_mask], snd_obj[~snd_nan_mask]) and \
              np.array_equal(fst_nan_mask, snd_nan_mask)
  
      if isinstance(fst_obj, (list, tuple)):
          if len(fst_obj) != len(snd_obj):
              return False
  
          for element_fst, element_snd in zip(fst_obj, snd_obj):
              if not deep_eq(element_fst, element_snd):
                  return False
          return True
  
      if isinstance(fst_obj, dict):
          if fst_obj.keys() != snd_obj.keys():
              return False
  
          for key in fst_obj:
              if not deep_eq(fst_obj[key], snd_obj[key]):
                  return False
          return True
  
      return fst_obj == snd_obj