                  continue
              carry_over = self._carry_over.pop(key)
              update = data[key]
              logger.debug("Merging carry over data: %s in to %s", carry_over, update)
              timestamp = update.get("timestamp")
              update["timestamp"] = carry_over["timestamp"] if timestamp is None else timestamp
              update.setdefault("loss", []).extend(carry_over.get("loss", []))
              logger.debug("Merged carry over data: %s", update)
  
      def _process_data(self, data, timestamps, loss, is_live):
          """ Process live update data.
  
 
</s> remove     def _process_data(self, data, timestamps, loss, is_live):
 </s> add     def _process_data(self,
                      data: Dict[int, EventData],
                      is_live: bool) -> Tuple[List[float], List[List[float]]]: </s> remove                          timestamps[-1], loss[-1])
            del loss[-1]
            del timestamps[-1]
 </s> add                          l_timestamps[-1], loss[-1])
            del l_loss[-1]
            del l_timestamps[-1] </s> remove     def _collect_carry_over(self, data):
 </s> add     def _collect_carry_over(self, data: Dict[int, EventData]) -> None: </s> remove         if len(loss[-1]) != len(self._loss_labels):
            logger.debug("Truncated loss found. loss count: %s", len(loss))
 </s> add         l_loss: List[List[float]] = list(loss)
        l_timestamps: List[float] = list(timestamps)

        if len(l_loss[-1]) != len(self._loss_labels):
            logger.debug("Truncated loss found. loss count: %s", len(l_loss)) </s> remove                      len(data), times.shape, loss.shape)
 </s> add                      len(data), n_times.shape, n_loss.shape)
            timestamp = update.timestamp
            update.timestamp = carry_over.timestamp if not timestamp else timestamp
            update.loss = carry_over.loss + update.loss
                  continue
              carry_over = self._carry_over.pop(key)
              update = data[key]
              logger.debug("Merging carry over data: %s in to %s", carry_over, update)
            timestamp = update.timestamp
            update.timestamp = carry_over.timestamp if not timestamp else timestamp
            update.loss = carry_over.loss + update.loss
            timestamp = update.timestamp
            update.timestamp = carry_over.timestamp if not timestamp else timestamp
            update.loss = carry_over.loss + update.loss
            timestamp = update.timestamp
            update.timestamp = carry_over.timestamp if not timestamp else timestamp
            update.loss = carry_over.loss + update.loss
              logger.debug("Merged carry over data: %s", update)
  
      def _process_data(self, data, timestamps, loss, is_live):
          """ Process live update data.
  
keep keep keep keep replace replace 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