              self._is_querying.clear()
  
          return retval
  
      def _wait_for_thread(self):
          """ If a thread is querying the log files for live data, then block until task clears. """
          while True:
              if self._is_training and self._is_querying.is_set():
                  logger.debug("Waiting for available thread")
                  time.sleep(1)
 
</s> remove     def _get_time_stats(self):
 </s> add     def _get_time_stats(self) -> None: </s> remove     def _get_per_session_stats(self):
 </s> add     def _get_per_session_stats(self) -> None: </s> remove     def set_iterations_limit(self, limit):
 </s> add     def set_iterations_limit(self, limit: int) -> None: </s> remove     def get_timestamps(self, session_id):
 </s> add     def get_timestamps(self, session_id: Optional[int]) -> Union[dict, np.ndarray]: </s> remove     def is_training(self):
 </s> add     def is_training(self) -> bool:
    def _wait_for_thread(self) -> None:
              self._is_querying.clear()
  
          return retval
  
    def _wait_for_thread(self) -> None:
          """ If a thread is querying the log files for live data, then block until task clears. """
          while True:
              if self._is_training and self._is_querying.is_set():
                  logger.debug("Waiting for available thread")
                  time.sleep(1)
keep keep keep keep replace keep keep keep keep keep
 Bugfixes:
  - Stats graph - Handle NaNs in data
  - logger - de-elevate matplotlib font messages 
lib/gui/analysis/stats.py