              The session id(s) as key, with a further dictionary as value containing the loss name
              and list of loss values for each step
          """
          logger.debug("Getting loss: (session_id: %s)", session_id)
          retval = {}
          for idx in [session_id] if session_id else self.session_ids:
              self._check_cache(idx)
              data = self._cache.get_data(idx, "loss")
              if not data:
                  continue
 
</s> remove             data = self._cache.get_data(idx, "loss")
            if not data:
 </s> add             full_data = self._cache.get_data(idx, "loss")
            if not full_data: </s> remove         dict
            The `session_id` (s) as key, the values are a dictionary containing the requested
            metric information for each session returned
 </s> add         dict or ``None``
            The `session_id`(s) as key, the values are a dictionary containing the requested
            metric information for each session returned. ``None`` if no data is stored for the
            given session_id </s> remove             data = data[idx]
            retval[idx] = {title: data["loss"][:, idx] for idx, title in enumerate(data["labels"])}
 </s> add             data = full_data[idx]
            loss = data["loss"]
            assert isinstance(loss, np.ndarray)
            retval[idx] = {title: loss[:, idx] for idx, title in enumerate(data["labels"])}
 </s> remove     session_ids: list
        List of `ints` pertaining to the session ids that exist in the Tensorflow events folder
 </s> add     labels: list[str]
        The labels for the loss values
    timestamps: :class:`np.ndarray`
        The timestamp of the event step (iteration)
    loss: :class:`np.ndarray`
        The loss values collected for A and B sides for the session </s> remove         retval = {}
 </s> add         retval: Dict[int, str] = {}
        retval: Dict[int, Dict[str, np.ndarray]] = {}
              The session id(s) as key, with a further dictionary as value containing the loss name
              and list of loss values for each step
          """
          logger.debug("Getting loss: (session_id: %s)", session_id)
        retval: Dict[int, Dict[str, np.ndarray]] = {}
          for idx in [session_id] if session_id else self.session_ids:
              self._check_cache(idx)
              data = self._cache.get_data(idx, "loss")
              if not data:
                  continue
keep keep keep keep replace keep keep keep keep keep
 Bugfixes
  - plugin.train.unbalanced - decoder b
  - gui.stats - crash when log folder deleted
  - setup.py - install gcc=12.1.0 on linux (scipy dep)
  - setup.py - don't test ROCm unless valid
  - typofix - cli_args extract singleprocess help
typing
  - lib.gui.analysis.event_reader
  - lib.gpu_stats.directml - make platform specific
unit tests
  - lib.gui.analysis.event_reader 
lib/gui/analysis/event_reader.py